blob: 09eb4e3e8ab28eda9eea8c097aa42f7945653584 [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. Padovan710f9b02011-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
213 chan->scid = scid;
214
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200215 write_unlock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300216
217 return 0;
218}
219
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300220static u16 l2cap_alloc_cid(struct l2cap_conn *conn)
Marcel Holtmann01394182006-07-03 10:02:46 +0200221{
Johan Hedberge77af752013-10-08 10:31:00 +0200222 u16 cid, dyn_end;
Marcel Holtmann01394182006-07-03 10:02:46 +0200223
Johan Hedberge77af752013-10-08 10:31:00 +0200224 if (conn->hcon->type == LE_LINK)
225 dyn_end = L2CAP_CID_LE_DYN_END;
226 else
227 dyn_end = L2CAP_CID_DYN_END;
228
229 for (cid = L2CAP_CID_DYN_START; cid < dyn_end; cid++) {
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300230 if (!__l2cap_get_chan_by_scid(conn, cid))
Marcel Holtmann01394182006-07-03 10:02:46 +0200231 return cid;
232 }
233
234 return 0;
235}
236
Gustavo Padovanf93fa272013-10-21 14:21:40 -0200237static void l2cap_state_change(struct l2cap_chan *chan, int state)
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300238{
Andrei Emeltchenko42d2d872012-02-17 11:40:57 +0200239 BT_DBG("chan %p %s -> %s", chan, state_to_string(chan->state),
Gustavo Padovan2d792812012-10-06 10:07:01 +0100240 state_to_string(state));
Gustavo F. Padovanbadaaa02011-11-23 20:11:46 -0200241
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300242 chan->state = state;
Gustavo Padovan53f52122013-10-15 19:24:45 -0300243 chan->ops->state_change(chan, state, 0);
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300244}
245
Gustavo Padovanf8e73012013-10-15 19:24:46 -0300246static inline void l2cap_state_change_and_error(struct l2cap_chan *chan,
247 int state, int err)
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +0200248{
Gustavo Padovanf8e73012013-10-15 19:24:46 -0300249 chan->state = state;
Gustavo Padovan53f52122013-10-15 19:24:45 -0300250 chan->ops->state_change(chan, chan->state, err);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +0200251}
252
253static inline void l2cap_chan_set_err(struct l2cap_chan *chan, int err)
254{
Gustavo Padovanf8e73012013-10-15 19:24:46 -0300255 chan->ops->state_change(chan, chan->state, err);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +0200256}
257
Mat Martineau4239d162012-05-17 20:53:49 -0700258static void __set_retrans_timer(struct l2cap_chan *chan)
259{
260 if (!delayed_work_pending(&chan->monitor_timer) &&
261 chan->retrans_timeout) {
262 l2cap_set_timer(chan, &chan->retrans_timer,
263 msecs_to_jiffies(chan->retrans_timeout));
264 }
265}
266
267static void __set_monitor_timer(struct l2cap_chan *chan)
268{
269 __clear_retrans_timer(chan);
270 if (chan->monitor_timeout) {
271 l2cap_set_timer(chan, &chan->monitor_timer,
272 msecs_to_jiffies(chan->monitor_timeout));
273 }
274}
275
Mat Martineau608bcc62012-05-17 20:53:32 -0700276static struct sk_buff *l2cap_ertm_seq_in_queue(struct sk_buff_head *head,
277 u16 seq)
278{
279 struct sk_buff *skb;
280
281 skb_queue_walk(head, skb) {
282 if (bt_cb(skb)->control.txseq == seq)
283 return skb;
284 }
285
286 return NULL;
287}
288
Mat Martineau3c588192012-04-11 10:48:42 -0700289/* ---- L2CAP sequence number lists ---- */
290
291/* For ERTM, ordered lists of sequence numbers must be tracked for
292 * SREJ requests that are received and for frames that are to be
293 * retransmitted. These seq_list functions implement a singly-linked
294 * list in an array, where membership in the list can also be checked
295 * in constant time. Items can also be added to the tail of the list
296 * and removed from the head in constant time, without further memory
297 * allocs or frees.
298 */
299
300static int l2cap_seq_list_init(struct l2cap_seq_list *seq_list, u16 size)
301{
302 size_t alloc_size, i;
303
304 /* Allocated size is a power of 2 to map sequence numbers
305 * (which may be up to 14 bits) in to a smaller array that is
306 * sized for the negotiated ERTM transmit windows.
307 */
308 alloc_size = roundup_pow_of_two(size);
309
310 seq_list->list = kmalloc(sizeof(u16) * alloc_size, GFP_KERNEL);
311 if (!seq_list->list)
312 return -ENOMEM;
313
314 seq_list->mask = alloc_size - 1;
315 seq_list->head = L2CAP_SEQ_LIST_CLEAR;
316 seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
317 for (i = 0; i < alloc_size; i++)
318 seq_list->list[i] = L2CAP_SEQ_LIST_CLEAR;
319
320 return 0;
321}
322
323static inline void l2cap_seq_list_free(struct l2cap_seq_list *seq_list)
324{
325 kfree(seq_list->list);
326}
327
328static inline bool l2cap_seq_list_contains(struct l2cap_seq_list *seq_list,
329 u16 seq)
330{
331 /* Constant-time check for list membership */
332 return seq_list->list[seq & seq_list->mask] != L2CAP_SEQ_LIST_CLEAR;
333}
334
Mat Martineau3c588192012-04-11 10:48:42 -0700335static inline u16 l2cap_seq_list_pop(struct l2cap_seq_list *seq_list)
336{
Johan Hedberg03a0c5d2014-01-18 21:32:59 +0200337 u16 seq = seq_list->head;
338 u16 mask = seq_list->mask;
339
340 seq_list->head = seq_list->list[seq & mask];
341 seq_list->list[seq & mask] = L2CAP_SEQ_LIST_CLEAR;
342
343 if (seq_list->head == L2CAP_SEQ_LIST_TAIL) {
344 seq_list->head = L2CAP_SEQ_LIST_CLEAR;
345 seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
346 }
347
348 return seq;
Mat Martineau3c588192012-04-11 10:48:42 -0700349}
350
351static void l2cap_seq_list_clear(struct l2cap_seq_list *seq_list)
352{
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300353 u16 i;
Mat Martineau3c588192012-04-11 10:48:42 -0700354
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300355 if (seq_list->head == L2CAP_SEQ_LIST_CLEAR)
356 return;
357
358 for (i = 0; i <= seq_list->mask; i++)
359 seq_list->list[i] = L2CAP_SEQ_LIST_CLEAR;
360
361 seq_list->head = L2CAP_SEQ_LIST_CLEAR;
362 seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
Mat Martineau3c588192012-04-11 10:48:42 -0700363}
364
365static void l2cap_seq_list_append(struct l2cap_seq_list *seq_list, u16 seq)
366{
367 u16 mask = seq_list->mask;
368
369 /* All appends happen in constant time */
370
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300371 if (seq_list->list[seq & mask] != L2CAP_SEQ_LIST_CLEAR)
372 return;
Mat Martineau3c588192012-04-11 10:48:42 -0700373
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300374 if (seq_list->tail == L2CAP_SEQ_LIST_CLEAR)
375 seq_list->head = seq;
376 else
377 seq_list->list[seq_list->tail & mask] = seq;
378
379 seq_list->tail = seq;
380 seq_list->list[seq & mask] = L2CAP_SEQ_LIST_TAIL;
Mat Martineau3c588192012-04-11 10:48:42 -0700381}
382
Gustavo F. Padovan721c4182011-06-23 19:29:58 -0300383static void l2cap_chan_timeout(struct work_struct *work)
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300384{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -0300385 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100386 chan_timer.work);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200387 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300388 int reason;
389
Andrei Emeltchenkoe05dcc32012-02-17 11:40:56 +0200390 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300391
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200392 mutex_lock(&conn->chan_lock);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200393 l2cap_chan_lock(chan);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300394
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300395 if (chan->state == BT_CONNECTED || chan->state == BT_CONFIG)
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300396 reason = ECONNREFUSED;
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300397 else if (chan->state == BT_CONNECT &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100398 chan->sec_level != BT_SECURITY_SDP)
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300399 reason = ECONNREFUSED;
400 else
401 reason = ETIMEDOUT;
402
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300403 l2cap_chan_close(chan, reason);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300404
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200405 l2cap_chan_unlock(chan);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300406
Gustavo Padovan80b98022012-05-27 22:27:51 -0300407 chan->ops->close(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200408 mutex_unlock(&conn->chan_lock);
409
Ulisses Furquim371fd832011-12-21 20:02:36 -0200410 l2cap_chan_put(chan);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300411}
412
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -0300413struct l2cap_chan *l2cap_chan_create(void)
Marcel Holtmann01394182006-07-03 10:02:46 +0200414{
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300415 struct l2cap_chan *chan;
Marcel Holtmann01394182006-07-03 10:02:46 +0200416
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300417 chan = kzalloc(sizeof(*chan), GFP_ATOMIC);
418 if (!chan)
419 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200420
Andrei Emeltchenkoc03b3552012-02-21 12:54:56 +0200421 mutex_init(&chan->lock);
422
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200423 write_lock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300424 list_add(&chan->global_l, &chan_list);
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200425 write_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300426
Gustavo F. Padovan721c4182011-06-23 19:29:58 -0300427 INIT_DELAYED_WORK(&chan->chan_timer, l2cap_chan_timeout);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300428
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300429 chan->state = BT_OPEN;
430
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530431 kref_init(&chan->kref);
Gustavo F. Padovan71ba0e52011-05-17 14:34:52 -0300432
Mat Martineau28270112012-05-17 21:14:09 -0700433 /* This flag is cleared in l2cap_chan_ready() */
434 set_bit(CONF_NOT_COMPLETE, &chan->conf_state);
435
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -0300436 BT_DBG("chan %p", chan);
Szymon Jancabc545b2011-11-03 16:05:44 +0100437
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300438 return chan;
Marcel Holtmann01394182006-07-03 10:02:46 +0200439}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300440EXPORT_SYMBOL_GPL(l2cap_chan_create);
Marcel Holtmann01394182006-07-03 10:02:46 +0200441
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530442static void l2cap_chan_destroy(struct kref *kref)
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300443{
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530444 struct l2cap_chan *chan = container_of(kref, struct l2cap_chan, kref);
445
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +0530446 BT_DBG("chan %p", chan);
447
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200448 write_lock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300449 list_del(&chan->global_l);
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200450 write_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300451
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +0530452 kfree(chan);
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300453}
454
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530455void l2cap_chan_hold(struct l2cap_chan *c)
456{
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530457 BT_DBG("chan %p orig refcnt %d", c, atomic_read(&c->kref.refcount));
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530458
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530459 kref_get(&c->kref);
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530460}
461
462void l2cap_chan_put(struct l2cap_chan *c)
463{
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530464 BT_DBG("chan %p orig refcnt %d", c, atomic_read(&c->kref.refcount));
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530465
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530466 kref_put(&c->kref, l2cap_chan_destroy);
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530467}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300468EXPORT_SYMBOL_GPL(l2cap_chan_put);
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530469
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300470void l2cap_chan_set_defaults(struct l2cap_chan *chan)
471{
472 chan->fcs = L2CAP_FCS_CRC16;
473 chan->max_tx = L2CAP_DEFAULT_MAX_TX;
474 chan->tx_win = L2CAP_DEFAULT_TX_WINDOW;
475 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
Jukka Rissanen6a5e8162014-05-28 14:43:04 +0300476 chan->remote_max_tx = chan->max_tx;
477 chan->remote_tx_win = chan->tx_win;
Mat Martineauc20f8e32012-07-10 05:47:07 -0700478 chan->ack_win = L2CAP_DEFAULT_TX_WINDOW;
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300479 chan->sec_level = BT_SECURITY_LOW;
Jukka Rissanen6a5e8162014-05-28 14:43:04 +0300480 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
481 chan->retrans_timeout = L2CAP_DEFAULT_RETRANS_TO;
482 chan->monitor_timeout = L2CAP_DEFAULT_MONITOR_TO;
483 chan->conf_state = 0;
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300484
485 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
486}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300487EXPORT_SYMBOL_GPL(l2cap_chan_set_defaults);
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300488
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200489static void l2cap_le_flowctl_init(struct l2cap_chan *chan)
Johan Hedberg38319712013-05-17 12:49:23 +0300490{
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200491 chan->sdu = NULL;
492 chan->sdu_last_frag = NULL;
493 chan->sdu_len = 0;
Johan Hedberg0cd75f72013-05-17 13:09:05 +0300494 chan->tx_credits = 0;
Johan Hedbergf15b8ec2013-12-03 15:08:25 +0200495 chan->rx_credits = le_max_credits;
Johan Hedbergd1d79412014-01-27 15:11:33 -0800496 chan->mps = min_t(u16, chan->imtu, le_default_mps);
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200497
498 skb_queue_head_init(&chan->tx_q);
Johan Hedberg38319712013-05-17 12:49:23 +0300499}
500
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +0300501void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
Marcel Holtmann01394182006-07-03 10:02:46 +0200502{
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -0300503 BT_DBG("conn %p, psm 0x%2.2x, dcid 0x%4.4x", conn,
Andrei Emeltchenko097db762012-03-09 14:16:17 +0200504 __le16_to_cpu(chan->psm), chan->dcid);
Marcel Holtmann01394182006-07-03 10:02:46 +0200505
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +0200506 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
Marcel Holtmann2950f212009-02-12 14:02:50 +0100507
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300508 chan->conn = conn;
Marcel Holtmann01394182006-07-03 10:02:46 +0200509
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200510 switch (chan->chan_type) {
511 case L2CAP_CHAN_CONN_ORIENTED:
Johan Hedberg21626e62014-01-24 10:35:41 +0200512 /* Alloc CID for connection-oriented socket */
513 chan->scid = l2cap_alloc_cid(conn);
514 if (conn->hcon->type == ACL_LINK)
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300515 chan->omtu = L2CAP_DEFAULT_MTU;
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200516 break;
517
518 case L2CAP_CHAN_CONN_LESS:
Marcel Holtmann01394182006-07-03 10:02:46 +0200519 /* Connectionless socket */
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300520 chan->scid = L2CAP_CID_CONN_LESS;
521 chan->dcid = L2CAP_CID_CONN_LESS;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300522 chan->omtu = L2CAP_DEFAULT_MTU;
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200523 break;
524
Johan Hedberg2338a7e2014-01-24 10:35:40 +0200525 case L2CAP_CHAN_FIXED:
526 /* Caller will set CID and CID specific MTU values */
Andrei Emeltchenko416fa752012-05-29 13:59:16 +0300527 break;
528
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200529 default:
Marcel Holtmann01394182006-07-03 10:02:46 +0200530 /* Raw socket can send/recv signalling messages only */
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300531 chan->scid = L2CAP_CID_SIGNALING;
532 chan->dcid = L2CAP_CID_SIGNALING;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300533 chan->omtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann01394182006-07-03 10:02:46 +0200534 }
535
Andrei Emeltchenko8f7975b2011-10-13 16:18:54 +0300536 chan->local_id = L2CAP_BESTEFFORT_ID;
537 chan->local_stype = L2CAP_SERV_BESTEFFORT;
538 chan->local_msdu = L2CAP_DEFAULT_MAX_SDU_SIZE;
539 chan->local_sdu_itime = L2CAP_DEFAULT_SDU_ITIME;
540 chan->local_acc_lat = L2CAP_DEFAULT_ACC_LAT;
Andrei Emeltchenko8936fa62012-10-08 11:14:41 +0300541 chan->local_flush_to = L2CAP_EFS_DEFAULT_FLUSH_TO;
Andrei Emeltchenko8f7975b2011-10-13 16:18:54 +0300542
Ulisses Furquim371fd832011-12-21 20:02:36 -0200543 l2cap_chan_hold(chan);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300544
Johan Hedberg5ee98912013-04-29 19:35:43 +0300545 hci_conn_hold(conn->hcon);
546
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200547 list_add(&chan->list, &conn->chan_l);
Andrei Emeltchenko643162a2012-02-22 17:11:55 +0200548}
549
Andrei Emeltchenko466f8002012-05-29 13:59:01 +0300550void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
Andrei Emeltchenko643162a2012-02-22 17:11:55 +0200551{
552 mutex_lock(&conn->chan_lock);
553 __l2cap_chan_add(conn, chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200554 mutex_unlock(&conn->chan_lock);
Marcel Holtmann01394182006-07-03 10:02:46 +0200555}
556
Andrei Emeltchenko466f8002012-05-29 13:59:01 +0300557void l2cap_chan_del(struct l2cap_chan *chan, int err)
Marcel Holtmann01394182006-07-03 10:02:46 +0200558{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300559 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann01394182006-07-03 10:02:46 +0200560
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -0300561 __clear_chan_timer(chan);
Marcel Holtmann01394182006-07-03 10:02:46 +0200562
Gustavo F. Padovan49208c92011-04-04 15:59:54 -0300563 BT_DBG("chan %p, conn %p, err %d", chan, conn, err);
Marcel Holtmann01394182006-07-03 10:02:46 +0200564
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900565 if (conn) {
Andrei Emeltchenko56f60982012-10-15 11:58:44 +0300566 struct amp_mgr *mgr = conn->hcon->amp_mgr;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300567 /* Delete from channel list */
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200568 list_del(&chan->list);
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -0200569
Ulisses Furquim371fd832011-12-21 20:02:36 -0200570 l2cap_chan_put(chan);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300571
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300572 chan->conn = NULL;
Andrei Emeltchenko3cabbfd2012-05-31 11:01:37 +0300573
Johan Hedberg2338a7e2014-01-24 10:35:40 +0200574 if (chan->scid != L2CAP_CID_A2MP)
David Herrmann76a68ba2013-04-06 20:28:37 +0200575 hci_conn_drop(conn->hcon);
Andrei Emeltchenko56f60982012-10-15 11:58:44 +0300576
577 if (mgr && mgr->bredr_chan == chan)
578 mgr->bredr_chan = NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200579 }
580
Andrei Emeltchenko419e08c2012-10-31 15:46:34 +0200581 if (chan->hs_hchan) {
582 struct hci_chan *hs_hchan = chan->hs_hchan;
583
584 BT_DBG("chan %p disconnect hs_hchan %p", chan, hs_hchan);
585 amp_disconnect_logical_link(hs_hchan);
586 }
587
Gustavo Padovanb699ec02012-10-06 11:51:54 +0100588 chan->ops->teardown(chan, err);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200589
Mat Martineau28270112012-05-17 21:14:09 -0700590 if (test_bit(CONF_NOT_COMPLETE, &chan->conf_state))
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300591 return;
Gustavo F. Padovan2ead70b2011-04-01 15:13:36 -0300592
Gustavo Padovanee556f62012-05-18 20:22:38 -0300593 switch(chan->mode) {
594 case L2CAP_MODE_BASIC:
595 break;
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300596
Johan Hedberg38319712013-05-17 12:49:23 +0300597 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedberg177f8f22013-05-31 17:54:51 +0300598 skb_queue_purge(&chan->tx_q);
Johan Hedberg38319712013-05-17 12:49:23 +0300599 break;
600
Gustavo Padovanee556f62012-05-18 20:22:38 -0300601 case L2CAP_MODE_ERTM:
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -0300602 __clear_retrans_timer(chan);
603 __clear_monitor_timer(chan);
604 __clear_ack_timer(chan);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300605
Gustavo F. Padovanf1c67752011-03-25 20:36:10 -0300606 skb_queue_purge(&chan->srej_q);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300607
Mat Martineau3c588192012-04-11 10:48:42 -0700608 l2cap_seq_list_free(&chan->srej_list);
609 l2cap_seq_list_free(&chan->retrans_list);
Gustavo Padovanee556f62012-05-18 20:22:38 -0300610
611 /* fall through */
612
613 case L2CAP_MODE_STREAMING:
614 skb_queue_purge(&chan->tx_q);
615 break;
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300616 }
Gustavo Padovanee556f62012-05-18 20:22:38 -0300617
618 return;
Marcel Holtmann01394182006-07-03 10:02:46 +0200619}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300620EXPORT_SYMBOL_GPL(l2cap_chan_del);
Marcel Holtmann01394182006-07-03 10:02:46 +0200621
Johan Hedberg387a33e2014-02-18 21:41:33 +0200622void l2cap_conn_update_id_addr(struct hci_conn *hcon)
623{
624 struct l2cap_conn *conn = hcon->l2cap_data;
625 struct l2cap_chan *chan;
626
627 mutex_lock(&conn->chan_lock);
628
629 list_for_each_entry(chan, &conn->chan_l, list) {
630 l2cap_chan_lock(chan);
631 bacpy(&chan->dst, &hcon->dst);
632 chan->dst_type = bdaddr_type(hcon, hcon->dst_type);
633 l2cap_chan_unlock(chan);
634 }
635
636 mutex_unlock(&conn->chan_lock);
637}
638
Johan Hedberg27e2d4c2013-05-14 13:27:21 +0300639static void l2cap_chan_le_connect_reject(struct l2cap_chan *chan)
640{
641 struct l2cap_conn *conn = chan->conn;
642 struct l2cap_le_conn_rsp rsp;
643 u16 result;
644
645 if (test_bit(FLAG_DEFER_SETUP, &chan->flags))
646 result = L2CAP_CR_AUTHORIZATION;
647 else
648 result = L2CAP_CR_BAD_PSM;
649
650 l2cap_state_change(chan, BT_DISCONN);
651
652 rsp.dcid = cpu_to_le16(chan->scid);
653 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +0200654 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +0300655 rsp.credits = cpu_to_le16(chan->rx_credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +0300656 rsp.result = cpu_to_le16(result);
657
658 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp),
659 &rsp);
660}
661
Johan Hedberg791d60f2013-05-14 22:24:44 +0300662static void l2cap_chan_connect_reject(struct l2cap_chan *chan)
663{
664 struct l2cap_conn *conn = chan->conn;
665 struct l2cap_conn_rsp rsp;
666 u16 result;
667
668 if (test_bit(FLAG_DEFER_SETUP, &chan->flags))
669 result = L2CAP_CR_SEC_BLOCK;
670 else
671 result = L2CAP_CR_BAD_PSM;
672
673 l2cap_state_change(chan, BT_DISCONN);
674
675 rsp.scid = cpu_to_le16(chan->dcid);
676 rsp.dcid = cpu_to_le16(chan->scid);
677 rsp.result = cpu_to_le16(result);
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700678 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Johan Hedberg791d60f2013-05-14 22:24:44 +0300679
680 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, sizeof(rsp), &rsp);
681}
682
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300683void l2cap_chan_close(struct l2cap_chan *chan, int reason)
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300684{
685 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300686
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700687 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300688
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300689 switch (chan->state) {
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300690 case BT_LISTEN:
Gustavo Padovanb699ec02012-10-06 11:51:54 +0100691 chan->ops->teardown(chan, 0);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300692 break;
693
694 case BT_CONNECTED:
695 case BT_CONFIG:
Johan Hedberg7b25c9b2014-01-28 15:28:04 -0800696 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED) {
Gustavo Padovan8d836d72013-10-15 19:24:47 -0300697 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +0200698 l2cap_send_disconn_req(chan, reason);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300699 } else
700 l2cap_chan_del(chan, reason);
701 break;
702
703 case BT_CONNECT2:
Johan Hedberg791d60f2013-05-14 22:24:44 +0300704 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED) {
705 if (conn->hcon->type == ACL_LINK)
706 l2cap_chan_connect_reject(chan);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +0300707 else if (conn->hcon->type == LE_LINK)
708 l2cap_chan_le_connect_reject(chan);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300709 }
710
711 l2cap_chan_del(chan, reason);
712 break;
713
714 case BT_CONNECT:
715 case BT_DISCONN:
716 l2cap_chan_del(chan, reason);
717 break;
718
719 default:
Gustavo Padovanb699ec02012-10-06 11:51:54 +0100720 chan->ops->teardown(chan, 0);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300721 break;
722 }
723}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300724EXPORT_SYMBOL(l2cap_chan_close);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300725
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300726static inline u8 l2cap_get_auth_type(struct l2cap_chan *chan)
Johan Hedberg8556edd32011-01-19 12:06:50 +0530727{
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700728 switch (chan->chan_type) {
729 case L2CAP_CHAN_RAW:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300730 switch (chan->sec_level) {
Johan Hedberg8556edd32011-01-19 12:06:50 +0530731 case BT_SECURITY_HIGH:
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800732 case BT_SECURITY_FIPS:
Johan Hedberg8556edd32011-01-19 12:06:50 +0530733 return HCI_AT_DEDICATED_BONDING_MITM;
734 case BT_SECURITY_MEDIUM:
735 return HCI_AT_DEDICATED_BONDING;
736 default:
737 return HCI_AT_NO_BONDING;
738 }
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700739 break;
Marcel Holtmann3124b842013-10-12 07:19:32 -0700740 case L2CAP_CHAN_CONN_LESS:
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700741 if (chan->psm == cpu_to_le16(L2CAP_PSM_3DSP)) {
Marcel Holtmann3124b842013-10-12 07:19:32 -0700742 if (chan->sec_level == BT_SECURITY_LOW)
743 chan->sec_level = BT_SECURITY_SDP;
744 }
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800745 if (chan->sec_level == BT_SECURITY_HIGH ||
746 chan->sec_level == BT_SECURITY_FIPS)
Marcel Holtmann3124b842013-10-12 07:19:32 -0700747 return HCI_AT_NO_BONDING_MITM;
748 else
749 return HCI_AT_NO_BONDING;
750 break;
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700751 case L2CAP_CHAN_CONN_ORIENTED:
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700752 if (chan->psm == cpu_to_le16(L2CAP_PSM_SDP)) {
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700753 if (chan->sec_level == BT_SECURITY_LOW)
754 chan->sec_level = BT_SECURITY_SDP;
Johan Hedberg8556edd32011-01-19 12:06:50 +0530755
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800756 if (chan->sec_level == BT_SECURITY_HIGH ||
757 chan->sec_level == BT_SECURITY_FIPS)
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700758 return HCI_AT_NO_BONDING_MITM;
759 else
760 return HCI_AT_NO_BONDING;
761 }
762 /* fall through */
763 default:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300764 switch (chan->sec_level) {
Johan Hedberg8556edd32011-01-19 12:06:50 +0530765 case BT_SECURITY_HIGH:
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800766 case BT_SECURITY_FIPS:
Johan Hedberg8556edd32011-01-19 12:06:50 +0530767 return HCI_AT_GENERAL_BONDING_MITM;
768 case BT_SECURITY_MEDIUM:
769 return HCI_AT_GENERAL_BONDING;
770 default:
771 return HCI_AT_NO_BONDING;
772 }
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700773 break;
Johan Hedberg8556edd32011-01-19 12:06:50 +0530774 }
775}
776
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200777/* Service level security */
Johan Hedberge7cafc42014-07-17 15:35:38 +0300778int l2cap_chan_check_security(struct l2cap_chan *chan, bool initiator)
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200779{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300780 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100781 __u8 auth_type;
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200782
Johan Hedberga17de2f2013-05-14 13:25:37 +0300783 if (conn->hcon->type == LE_LINK)
784 return smp_conn_security(conn->hcon, chan->sec_level);
785
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300786 auth_type = l2cap_get_auth_type(chan);
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100787
Johan Hedberge7cafc42014-07-17 15:35:38 +0300788 return hci_conn_security(conn->hcon, chan->sec_level, auth_type,
789 initiator);
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200790}
791
Johannes Bergb5ad8b72011-06-01 08:54:45 +0200792static u8 l2cap_get_ident(struct l2cap_conn *conn)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200793{
794 u8 id;
795
796 /* Get next available identificator.
797 * 1 - 128 are used by kernel.
798 * 129 - 199 are reserved.
799 * 200 - 254 are used by utilities like l2ping, etc.
800 */
801
Marcel Holtmann5a54e7c2014-07-13 20:50:15 +0200802 mutex_lock(&conn->ident_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200803
804 if (++conn->tx_ident > 128)
805 conn->tx_ident = 1;
806
807 id = conn->tx_ident;
808
Marcel Holtmann5a54e7c2014-07-13 20:50:15 +0200809 mutex_unlock(&conn->ident_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200810
811 return id;
812}
813
Gustavo Padovan2d792812012-10-06 10:07:01 +0100814static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len,
815 void *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200816{
817 struct sk_buff *skb = l2cap_build_cmd(conn, code, ident, len, data);
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +0200818 u8 flags;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200819
820 BT_DBG("code 0x%2.2x", code);
821
822 if (!skb)
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -0300823 return;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200824
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +0200825 if (lmp_no_flush_capable(conn->hcon->hdev))
826 flags = ACL_START_NO_FLUSH;
827 else
828 flags = ACL_START;
829
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700830 bt_cb(skb)->force_active = BT_POWER_FORCE_ACTIVE_ON;
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +0200831 skb->priority = HCI_PRIO_MAX;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700832
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200833 hci_send_acl(conn->hchan, skb, flags);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200834}
835
Mat Martineau02b0fbb2012-10-23 15:24:10 -0700836static bool __chan_is_moving(struct l2cap_chan *chan)
837{
838 return chan->move_state != L2CAP_MOVE_STABLE &&
839 chan->move_state != L2CAP_MOVE_WAIT_PREPARE;
840}
841
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200842static void l2cap_do_send(struct l2cap_chan *chan, struct sk_buff *skb)
843{
844 struct hci_conn *hcon = chan->conn->hcon;
845 u16 flags;
846
847 BT_DBG("chan %p, skb %p len %d priority %u", chan, skb, skb->len,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100848 skb->priority);
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200849
Mat Martineaud5f8a752012-10-23 15:24:18 -0700850 if (chan->hs_hcon && !__chan_is_moving(chan)) {
851 if (chan->hs_hchan)
852 hci_send_acl(chan->hs_hchan, skb, ACL_COMPLETE);
853 else
854 kfree_skb(skb);
855
856 return;
857 }
858
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200859 if (!test_bit(FLAG_FLUSHABLE, &chan->flags) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100860 lmp_no_flush_capable(hcon->hdev))
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200861 flags = ACL_START_NO_FLUSH;
862 else
863 flags = ACL_START;
864
865 bt_cb(skb)->force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
866 hci_send_acl(chan->conn->hchan, skb, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700867}
868
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700869static void __unpack_enhanced_control(u16 enh, struct l2cap_ctrl *control)
870{
871 control->reqseq = (enh & L2CAP_CTRL_REQSEQ) >> L2CAP_CTRL_REQSEQ_SHIFT;
872 control->final = (enh & L2CAP_CTRL_FINAL) >> L2CAP_CTRL_FINAL_SHIFT;
873
874 if (enh & L2CAP_CTRL_FRAME_TYPE) {
875 /* S-Frame */
876 control->sframe = 1;
877 control->poll = (enh & L2CAP_CTRL_POLL) >> L2CAP_CTRL_POLL_SHIFT;
878 control->super = (enh & L2CAP_CTRL_SUPERVISE) >> L2CAP_CTRL_SUPER_SHIFT;
879
880 control->sar = 0;
881 control->txseq = 0;
882 } else {
883 /* I-Frame */
884 control->sframe = 0;
885 control->sar = (enh & L2CAP_CTRL_SAR) >> L2CAP_CTRL_SAR_SHIFT;
886 control->txseq = (enh & L2CAP_CTRL_TXSEQ) >> L2CAP_CTRL_TXSEQ_SHIFT;
887
888 control->poll = 0;
889 control->super = 0;
890 }
891}
892
893static void __unpack_extended_control(u32 ext, struct l2cap_ctrl *control)
894{
895 control->reqseq = (ext & L2CAP_EXT_CTRL_REQSEQ) >> L2CAP_EXT_CTRL_REQSEQ_SHIFT;
896 control->final = (ext & L2CAP_EXT_CTRL_FINAL) >> L2CAP_EXT_CTRL_FINAL_SHIFT;
897
898 if (ext & L2CAP_EXT_CTRL_FRAME_TYPE) {
899 /* S-Frame */
900 control->sframe = 1;
901 control->poll = (ext & L2CAP_EXT_CTRL_POLL) >> L2CAP_EXT_CTRL_POLL_SHIFT;
902 control->super = (ext & L2CAP_EXT_CTRL_SUPERVISE) >> L2CAP_EXT_CTRL_SUPER_SHIFT;
903
904 control->sar = 0;
905 control->txseq = 0;
906 } else {
907 /* I-Frame */
908 control->sframe = 0;
909 control->sar = (ext & L2CAP_EXT_CTRL_SAR) >> L2CAP_EXT_CTRL_SAR_SHIFT;
910 control->txseq = (ext & L2CAP_EXT_CTRL_TXSEQ) >> L2CAP_EXT_CTRL_TXSEQ_SHIFT;
911
912 control->poll = 0;
913 control->super = 0;
914 }
915}
916
917static inline void __unpack_control(struct l2cap_chan *chan,
918 struct sk_buff *skb)
919{
920 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
921 __unpack_extended_control(get_unaligned_le32(skb->data),
922 &bt_cb(skb)->control);
Mat Martineaucec8ab6e2012-05-17 20:53:36 -0700923 skb_pull(skb, L2CAP_EXT_CTRL_SIZE);
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700924 } else {
925 __unpack_enhanced_control(get_unaligned_le16(skb->data),
926 &bt_cb(skb)->control);
Mat Martineaucec8ab6e2012-05-17 20:53:36 -0700927 skb_pull(skb, L2CAP_ENH_CTRL_SIZE);
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700928 }
929}
930
931static u32 __pack_extended_control(struct l2cap_ctrl *control)
932{
933 u32 packed;
934
935 packed = control->reqseq << L2CAP_EXT_CTRL_REQSEQ_SHIFT;
936 packed |= control->final << L2CAP_EXT_CTRL_FINAL_SHIFT;
937
938 if (control->sframe) {
939 packed |= control->poll << L2CAP_EXT_CTRL_POLL_SHIFT;
940 packed |= control->super << L2CAP_EXT_CTRL_SUPER_SHIFT;
941 packed |= L2CAP_EXT_CTRL_FRAME_TYPE;
942 } else {
943 packed |= control->sar << L2CAP_EXT_CTRL_SAR_SHIFT;
944 packed |= control->txseq << L2CAP_EXT_CTRL_TXSEQ_SHIFT;
945 }
946
947 return packed;
948}
949
950static u16 __pack_enhanced_control(struct l2cap_ctrl *control)
951{
952 u16 packed;
953
954 packed = control->reqseq << L2CAP_CTRL_REQSEQ_SHIFT;
955 packed |= control->final << L2CAP_CTRL_FINAL_SHIFT;
956
957 if (control->sframe) {
958 packed |= control->poll << L2CAP_CTRL_POLL_SHIFT;
959 packed |= control->super << L2CAP_CTRL_SUPER_SHIFT;
960 packed |= L2CAP_CTRL_FRAME_TYPE;
961 } else {
962 packed |= control->sar << L2CAP_CTRL_SAR_SHIFT;
963 packed |= control->txseq << L2CAP_CTRL_TXSEQ_SHIFT;
964 }
965
966 return packed;
967}
968
969static inline void __pack_control(struct l2cap_chan *chan,
970 struct l2cap_ctrl *control,
971 struct sk_buff *skb)
972{
973 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
974 put_unaligned_le32(__pack_extended_control(control),
975 skb->data + L2CAP_HDR_SIZE);
976 } else {
977 put_unaligned_le16(__pack_enhanced_control(control),
978 skb->data + L2CAP_HDR_SIZE);
979 }
980}
981
Gustavo Padovanba7aa642012-05-29 13:29:16 -0300982static inline unsigned int __ertm_hdr_size(struct l2cap_chan *chan)
983{
984 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
985 return L2CAP_EXT_HDR_SIZE;
986 else
987 return L2CAP_ENH_HDR_SIZE;
988}
989
Mat Martineaua67d7f62012-05-17 20:53:35 -0700990static struct sk_buff *l2cap_create_sframe_pdu(struct l2cap_chan *chan,
991 u32 control)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300992{
993 struct sk_buff *skb;
994 struct l2cap_hdr *lh;
Gustavo Padovanba7aa642012-05-29 13:29:16 -0300995 int hlen = __ertm_hdr_size(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300996
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300997 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +0300998 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300999
Mat Martineaua67d7f62012-05-17 20:53:35 -07001000 skb = bt_skb_alloc(hlen, GFP_KERNEL);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001001
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001002 if (!skb)
Mat Martineaua67d7f62012-05-17 20:53:35 -07001003 return ERR_PTR(-ENOMEM);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001004
1005 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001006 lh->len = cpu_to_le16(hlen - L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001007 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03001008
Mat Martineaua67d7f62012-05-17 20:53:35 -07001009 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
1010 put_unaligned_le32(control, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
1011 else
1012 put_unaligned_le16(control, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001013
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001014 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineaua67d7f62012-05-17 20:53:35 -07001015 u16 fcs = crc16(0, (u8 *)skb->data, skb->len);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03001016 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001017 }
1018
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001019 skb->priority = HCI_PRIO_MAX;
Mat Martineaua67d7f62012-05-17 20:53:35 -07001020 return skb;
1021}
1022
1023static void l2cap_send_sframe(struct l2cap_chan *chan,
1024 struct l2cap_ctrl *control)
1025{
1026 struct sk_buff *skb;
1027 u32 control_field;
1028
1029 BT_DBG("chan %p, control %p", chan, control);
1030
1031 if (!control->sframe)
1032 return;
1033
Mat Martineaub99e13a2012-10-23 15:24:19 -07001034 if (__chan_is_moving(chan))
1035 return;
1036
Mat Martineaua67d7f62012-05-17 20:53:35 -07001037 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state) &&
1038 !control->poll)
1039 control->final = 1;
1040
1041 if (control->super == L2CAP_SUPER_RR)
1042 clear_bit(CONN_RNR_SENT, &chan->conn_state);
1043 else if (control->super == L2CAP_SUPER_RNR)
1044 set_bit(CONN_RNR_SENT, &chan->conn_state);
1045
1046 if (control->super != L2CAP_SUPER_SREJ) {
1047 chan->last_acked_seq = control->reqseq;
1048 __clear_ack_timer(chan);
1049 }
1050
1051 BT_DBG("reqseq %d, final %d, poll %d, super %d", control->reqseq,
1052 control->final, control->poll, control->super);
1053
1054 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
1055 control_field = __pack_extended_control(control);
1056 else
1057 control_field = __pack_enhanced_control(control);
1058
1059 skb = l2cap_create_sframe_pdu(chan, control_field);
1060 if (!IS_ERR(skb))
1061 l2cap_do_send(chan, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001062}
1063
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001064static void l2cap_send_rr_or_rnr(struct l2cap_chan *chan, bool poll)
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001065{
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001066 struct l2cap_ctrl control;
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001067
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001068 BT_DBG("chan %p, poll %d", chan, poll);
1069
1070 memset(&control, 0, sizeof(control));
1071 control.sframe = 1;
1072 control.poll = poll;
1073
1074 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
1075 control.super = L2CAP_SUPER_RNR;
1076 else
1077 control.super = L2CAP_SUPER_RR;
1078
1079 control.reqseq = chan->buffer_seq;
1080 l2cap_send_sframe(chan, &control);
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001081}
1082
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001083static inline int __l2cap_no_conn_pending(struct l2cap_chan *chan)
Andrei Emeltchenkoe501d052010-07-08 12:14:41 +03001084{
Johan Hedberg5ff6f342014-08-07 22:56:43 +03001085 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED)
1086 return true;
1087
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001088 return !test_bit(CONF_CONNECT_PEND, &chan->conf_state);
Andrei Emeltchenkoe501d052010-07-08 12:14:41 +03001089}
1090
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001091static bool __amp_capable(struct l2cap_chan *chan)
1092{
1093 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann1df7b172013-10-05 11:47:49 -07001094 struct hci_dev *hdev;
1095 bool amp_available = false;
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001096
Marcel Holtmann1df7b172013-10-05 11:47:49 -07001097 if (!conn->hs_enabled)
1098 return false;
1099
1100 if (!(conn->fixed_chan_mask & L2CAP_FC_A2MP))
1101 return false;
1102
1103 read_lock(&hci_dev_list_lock);
1104 list_for_each_entry(hdev, &hci_dev_list, list) {
1105 if (hdev->amp_type != AMP_TYPE_BREDR &&
1106 test_bit(HCI_UP, &hdev->flags)) {
1107 amp_available = true;
1108 break;
1109 }
1110 }
1111 read_unlock(&hci_dev_list_lock);
1112
1113 if (chan->chan_policy == BT_CHANNEL_POLICY_AMP_PREFERRED)
1114 return amp_available;
Marcel Holtmann848566b2013-10-01 22:59:22 -07001115
1116 return false;
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001117}
1118
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02001119static bool l2cap_check_efs(struct l2cap_chan *chan)
1120{
1121 /* Check EFS parameters */
1122 return true;
1123}
1124
Andrei Emeltchenko2766be42012-09-27 17:26:21 +03001125void l2cap_send_conn_req(struct l2cap_chan *chan)
Andrei Emeltchenko9b27f352012-02-24 16:00:00 +02001126{
1127 struct l2cap_conn *conn = chan->conn;
1128 struct l2cap_conn_req req;
1129
1130 req.scid = cpu_to_le16(chan->scid);
1131 req.psm = chan->psm;
1132
1133 chan->ident = l2cap_get_ident(conn);
1134
1135 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
1136
1137 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_REQ, sizeof(req), &req);
1138}
1139
Mat Martineau8eb200b2012-10-23 15:24:17 -07001140static void l2cap_send_create_chan_req(struct l2cap_chan *chan, u8 amp_id)
1141{
1142 struct l2cap_create_chan_req req;
1143 req.scid = cpu_to_le16(chan->scid);
1144 req.psm = chan->psm;
1145 req.amp_id = amp_id;
1146
1147 chan->ident = l2cap_get_ident(chan->conn);
1148
1149 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_REQ,
1150 sizeof(req), &req);
1151}
1152
Mat Martineau02b0fbb2012-10-23 15:24:10 -07001153static void l2cap_move_setup(struct l2cap_chan *chan)
1154{
1155 struct sk_buff *skb;
1156
1157 BT_DBG("chan %p", chan);
1158
1159 if (chan->mode != L2CAP_MODE_ERTM)
1160 return;
1161
1162 __clear_retrans_timer(chan);
1163 __clear_monitor_timer(chan);
1164 __clear_ack_timer(chan);
1165
1166 chan->retry_count = 0;
1167 skb_queue_walk(&chan->tx_q, skb) {
1168 if (bt_cb(skb)->control.retries)
1169 bt_cb(skb)->control.retries = 1;
1170 else
1171 break;
1172 }
1173
1174 chan->expected_tx_seq = chan->buffer_seq;
1175
1176 clear_bit(CONN_REJ_ACT, &chan->conn_state);
1177 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
1178 l2cap_seq_list_clear(&chan->retrans_list);
1179 l2cap_seq_list_clear(&chan->srej_list);
1180 skb_queue_purge(&chan->srej_q);
1181
1182 chan->tx_state = L2CAP_TX_STATE_XMIT;
1183 chan->rx_state = L2CAP_RX_STATE_MOVE;
1184
1185 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
1186}
1187
Mat Martineau5f3847a2012-10-23 15:24:12 -07001188static void l2cap_move_done(struct l2cap_chan *chan)
1189{
1190 u8 move_role = chan->move_role;
1191 BT_DBG("chan %p", chan);
1192
1193 chan->move_state = L2CAP_MOVE_STABLE;
1194 chan->move_role = L2CAP_MOVE_ROLE_NONE;
1195
1196 if (chan->mode != L2CAP_MODE_ERTM)
1197 return;
1198
1199 switch (move_role) {
1200 case L2CAP_MOVE_ROLE_INITIATOR:
1201 l2cap_tx(chan, NULL, NULL, L2CAP_EV_EXPLICIT_POLL);
1202 chan->rx_state = L2CAP_RX_STATE_WAIT_F;
1203 break;
1204 case L2CAP_MOVE_ROLE_RESPONDER:
1205 chan->rx_state = L2CAP_RX_STATE_WAIT_P;
1206 break;
1207 }
1208}
1209
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001210static void l2cap_chan_ready(struct l2cap_chan *chan)
1211{
Mat Martineau28270112012-05-17 21:14:09 -07001212 /* This clears all conf flags, including CONF_NOT_COMPLETE */
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001213 chan->conf_state = 0;
1214 __clear_chan_timer(chan);
1215
Johan Hedberg0ce43ce2013-12-05 14:55:33 +02001216 if (chan->mode == L2CAP_MODE_LE_FLOWCTL && !chan->tx_credits)
1217 chan->ops->suspend(chan);
Johan Hedberg177f8f22013-05-31 17:54:51 +03001218
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001219 chan->state = BT_CONNECTED;
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001220
Andrei Emeltchenkofd83e2c2012-05-30 09:55:32 +03001221 chan->ops->ready(chan);
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001222}
1223
Johan Hedbergf1496de2013-05-13 14:15:56 +03001224static void l2cap_le_connect(struct l2cap_chan *chan)
1225{
1226 struct l2cap_conn *conn = chan->conn;
1227 struct l2cap_le_conn_req req;
1228
Johan Hedberg595177f2013-12-02 22:12:22 +02001229 if (test_and_set_bit(FLAG_LE_CONN_REQ_SENT, &chan->flags))
1230 return;
1231
Johan Hedbergf1496de2013-05-13 14:15:56 +03001232 req.psm = chan->psm;
1233 req.scid = cpu_to_le16(chan->scid);
1234 req.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02001235 req.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03001236 req.credits = cpu_to_le16(chan->rx_credits);
Johan Hedbergf1496de2013-05-13 14:15:56 +03001237
1238 chan->ident = l2cap_get_ident(conn);
1239
1240 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_REQ,
1241 sizeof(req), &req);
1242}
1243
1244static void l2cap_le_start(struct l2cap_chan *chan)
1245{
1246 struct l2cap_conn *conn = chan->conn;
1247
1248 if (!smp_conn_security(conn->hcon, chan->sec_level))
1249 return;
1250
1251 if (!chan->psm) {
1252 l2cap_chan_ready(chan);
1253 return;
1254 }
1255
1256 if (chan->state == BT_CONNECT)
1257 l2cap_le_connect(chan);
1258}
1259
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001260static void l2cap_start_connection(struct l2cap_chan *chan)
1261{
1262 if (__amp_capable(chan)) {
1263 BT_DBG("chan %p AMP capable: discover AMPs", chan);
1264 a2mp_discover_amp(chan);
Johan Hedbergf1496de2013-05-13 14:15:56 +03001265 } else if (chan->conn->hcon->type == LE_LINK) {
1266 l2cap_le_start(chan);
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001267 } else {
1268 l2cap_send_conn_req(chan);
1269 }
1270}
1271
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001272static void l2cap_do_start(struct l2cap_chan *chan)
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001273{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03001274 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001275
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001276 if (conn->hcon->type == LE_LINK) {
Johan Hedberg96ac34f2013-05-13 11:15:07 +03001277 l2cap_le_start(chan);
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001278 return;
1279 }
1280
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001281 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) {
Marcel Holtmann984947d2009-02-06 23:35:19 +01001282 if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE))
1283 return;
1284
Johan Hedberge7cafc42014-07-17 15:35:38 +03001285 if (l2cap_chan_check_security(chan, true) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01001286 __l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001287 l2cap_start_connection(chan);
1288 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001289 } else {
1290 struct l2cap_info_req req;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001291 req.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001292
1293 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
1294 conn->info_ident = l2cap_get_ident(conn);
1295
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08001296 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001297
Gustavo Padovan2d792812012-10-06 10:07:01 +01001298 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
1299 sizeof(req), &req);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001300 }
1301}
1302
Gustavo F. Padovancf6c2c02010-06-07 20:54:45 -03001303static inline int l2cap_mode_supported(__u8 mode, __u32 feat_mask)
1304{
1305 u32 local_feat_mask = l2cap_feat_mask;
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03001306 if (!disable_ertm)
Gustavo F. Padovancf6c2c02010-06-07 20:54:45 -03001307 local_feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING;
1308
1309 switch (mode) {
1310 case L2CAP_MODE_ERTM:
1311 return L2CAP_FEAT_ERTM & feat_mask & local_feat_mask;
1312 case L2CAP_MODE_STREAMING:
1313 return L2CAP_FEAT_STREAMING & feat_mask & local_feat_mask;
1314 default:
1315 return 0x00;
1316 }
1317}
1318
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001319static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err)
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001320{
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001321 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001322 struct l2cap_disconn_req req;
1323
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001324 if (!conn)
1325 return;
1326
Andrei Emeltchenkoaad3d0e2012-09-06 15:05:42 +03001327 if (chan->mode == L2CAP_MODE_ERTM && chan->state == BT_CONNECTED) {
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03001328 __clear_retrans_timer(chan);
1329 __clear_monitor_timer(chan);
1330 __clear_ack_timer(chan);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001331 }
1332
Johan Hedberg2338a7e2014-01-24 10:35:40 +02001333 if (chan->scid == L2CAP_CID_A2MP) {
Gustavo Padovand1177732012-10-06 11:47:38 +01001334 l2cap_state_change(chan, BT_DISCONN);
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001335 return;
1336 }
1337
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001338 req.dcid = cpu_to_le16(chan->dcid);
1339 req.scid = cpu_to_le16(chan->scid);
Gustavo Padovan2d792812012-10-06 10:07:01 +01001340 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_DISCONN_REQ,
1341 sizeof(req), &req);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001342
Gustavo Padovanf8e73012013-10-15 19:24:46 -03001343 l2cap_state_change_and_error(chan, BT_DISCONN, err);
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001344}
1345
Linus Torvalds1da177e2005-04-16 15:20:36 -07001346/* ---- L2CAP connections ---- */
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001347static void l2cap_conn_start(struct l2cap_conn *conn)
1348{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001349 struct l2cap_chan *chan, *tmp;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001350
1351 BT_DBG("conn %p", conn);
1352
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001353 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001354
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001355 list_for_each_entry_safe(chan, tmp, &conn->chan_l, list) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001356 l2cap_chan_lock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001357
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001358 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001359 l2cap_chan_unlock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001360 continue;
1361 }
1362
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001363 if (chan->state == BT_CONNECT) {
Johan Hedberge7cafc42014-07-17 15:35:38 +03001364 if (!l2cap_chan_check_security(chan, true) ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01001365 !__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001366 l2cap_chan_unlock(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001367 continue;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02001368 }
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001369
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001370 if (!l2cap_mode_supported(chan->mode, conn->feat_mask)
Gustavo Padovan2d792812012-10-06 10:07:01 +01001371 && test_bit(CONF_STATE2_DEVICE,
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001372 &chan->conf_state)) {
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001373 l2cap_chan_close(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001374 l2cap_chan_unlock(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001375 continue;
1376 }
1377
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001378 l2cap_start_connection(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001379
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001380 } else if (chan->state == BT_CONNECT2) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001381 struct l2cap_conn_rsp rsp;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001382 char buf[128];
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001383 rsp.scid = cpu_to_le16(chan->dcid);
1384 rsp.dcid = cpu_to_le16(chan->scid);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001385
Johan Hedberge7cafc42014-07-17 15:35:38 +03001386 if (l2cap_chan_check_security(chan, false)) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07001387 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001388 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
1389 rsp.status = cpu_to_le16(L2CAP_CS_AUTHOR_PEND);
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001390 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001391
1392 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001393 l2cap_state_change(chan, BT_CONFIG);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001394 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
1395 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001396 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001397 } else {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001398 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
1399 rsp.status = cpu_to_le16(L2CAP_CS_AUTHEN_PEND);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001400 }
1401
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001402 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001403 sizeof(rsp), &rsp);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001404
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001405 if (test_bit(CONF_REQ_SENT, &chan->conf_state) ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01001406 rsp.result != L2CAP_CR_SUCCESS) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001407 l2cap_chan_unlock(chan);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001408 continue;
1409 }
1410
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001411 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001412 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001413 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03001414 chan->num_conf_req++;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001415 }
1416
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001417 l2cap_chan_unlock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001418 }
1419
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001420 mutex_unlock(&conn->chan_lock);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001421}
1422
Ville Tervob62f3282011-02-10 22:38:50 -03001423static void l2cap_le_conn_ready(struct l2cap_conn *conn)
1424{
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001425 struct hci_conn *hcon = conn->hcon;
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001426 struct hci_dev *hdev = hcon->hdev;
Ville Tervob62f3282011-02-10 22:38:50 -03001427
Johan Hedberge760ec12014-08-07 22:56:47 +03001428 BT_DBG("%s conn %p", hdev->name, conn);
Ville Tervob62f3282011-02-10 22:38:50 -03001429
Johan Hedberge760ec12014-08-07 22:56:47 +03001430 /* For outgoing pairing which doesn't necessarily have an
1431 * associated socket (e.g. mgmt_pair_device).
1432 */
1433 if (hcon->out)
1434 smp_conn_security(hcon, hcon->pending_sec_level);
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001435
Marcel Holtmann80afeb62014-06-23 12:18:51 +02001436 /* For LE slave connections, make sure the connection interval
1437 * is in the range of the minium and maximum interval that has
1438 * been configured for this connection. If not, then trigger
1439 * the connection update procedure.
1440 */
Johan Hedberg40bef302014-07-16 11:42:27 +03001441 if (hcon->role == HCI_ROLE_SLAVE &&
Marcel Holtmann80afeb62014-06-23 12:18:51 +02001442 (hcon->le_conn_interval < hcon->le_conn_min_interval ||
1443 hcon->le_conn_interval > hcon->le_conn_max_interval)) {
1444 struct l2cap_conn_param_update_req req;
1445
1446 req.min = cpu_to_le16(hcon->le_conn_min_interval);
1447 req.max = cpu_to_le16(hcon->le_conn_max_interval);
1448 req.latency = cpu_to_le16(hcon->le_conn_latency);
1449 req.to_multiplier = cpu_to_le16(hcon->le_supv_timeout);
1450
1451 l2cap_send_cmd(conn, l2cap_get_ident(conn),
1452 L2CAP_CONN_PARAM_UPDATE_REQ, sizeof(req), &req);
1453 }
Ville Tervob62f3282011-02-10 22:38:50 -03001454}
1455
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001456static void l2cap_conn_ready(struct l2cap_conn *conn)
1457{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001458 struct l2cap_chan *chan;
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001459 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001460
1461 BT_DBG("conn %p", conn);
1462
Johan Hedberg44f3b0f2013-04-29 19:35:45 +03001463 if (hcon->type == LE_LINK)
1464 l2cap_le_conn_ready(conn);
1465
Johan Hedberge760ec12014-08-07 22:56:47 +03001466 mutex_lock(&conn->chan_lock);
1467
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001468 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03001469
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001470 l2cap_chan_lock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001471
Johan Hedberg2338a7e2014-01-24 10:35:40 +02001472 if (chan->scid == L2CAP_CID_A2MP) {
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001473 l2cap_chan_unlock(chan);
1474 continue;
1475 }
1476
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001477 if (hcon->type == LE_LINK) {
Johan Hedbergf1496de2013-05-13 14:15:56 +03001478 l2cap_le_start(chan);
Vinicius Costa Gomes63128452011-06-17 22:46:26 -03001479 } else if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Gustavo Padovan74e75742013-10-15 19:24:51 -03001480 l2cap_chan_ready(chan);
Anderson Brigliab501d6a2011-06-07 18:46:31 -03001481
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001482 } else if (chan->state == BT_CONNECT) {
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001483 l2cap_do_start(chan);
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001484 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001485
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001486 l2cap_chan_unlock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001487 }
1488
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001489 mutex_unlock(&conn->chan_lock);
Johan Hedberg61a939c2014-01-17 20:45:11 +02001490
1491 queue_work(hcon->hdev->workqueue, &conn->pending_rx_work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001492}
1493
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001494/* Notify sockets that we cannot guaranty reliability anymore */
1495static void l2cap_conn_unreliable(struct l2cap_conn *conn, int err)
1496{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001497 struct l2cap_chan *chan;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001498
1499 BT_DBG("conn %p", conn);
1500
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001501 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001502
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001503 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +03001504 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo Padovan1d8b1fd2012-10-06 11:34:52 +01001505 l2cap_chan_set_err(chan, err);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001506 }
1507
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001508 mutex_unlock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001509}
1510
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001511static void l2cap_info_timeout(struct work_struct *work)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001512{
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001513 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001514 info_timer.work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001515
Marcel Holtmann984947d2009-02-06 23:35:19 +01001516 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01001517 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01001518
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001519 l2cap_conn_start(conn);
1520}
1521
David Herrmann2c8e1412013-04-06 20:28:45 +02001522/*
1523 * l2cap_user
1524 * External modules can register l2cap_user objects on l2cap_conn. The ->probe
1525 * callback is called during registration. The ->remove callback is called
1526 * during unregistration.
1527 * An l2cap_user object can either be explicitly unregistered or when the
1528 * underlying l2cap_conn object is deleted. This guarantees that l2cap->hcon,
1529 * l2cap->hchan, .. are valid as long as the remove callback hasn't been called.
1530 * External modules must own a reference to the l2cap_conn object if they intend
1531 * to call l2cap_unregister_user(). The l2cap_conn object might get destroyed at
1532 * any time if they don't.
1533 */
1534
1535int l2cap_register_user(struct l2cap_conn *conn, struct l2cap_user *user)
1536{
1537 struct hci_dev *hdev = conn->hcon->hdev;
1538 int ret;
1539
1540 /* We need to check whether l2cap_conn is registered. If it is not, we
1541 * must not register the l2cap_user. l2cap_conn_del() is unregisters
1542 * l2cap_conn objects, but doesn't provide its own locking. Instead, it
1543 * relies on the parent hci_conn object to be locked. This itself relies
1544 * on the hci_dev object to be locked. So we must lock the hci device
1545 * here, too. */
1546
1547 hci_dev_lock(hdev);
1548
1549 if (user->list.next || user->list.prev) {
1550 ret = -EINVAL;
1551 goto out_unlock;
1552 }
1553
1554 /* conn->hchan is NULL after l2cap_conn_del() was called */
1555 if (!conn->hchan) {
1556 ret = -ENODEV;
1557 goto out_unlock;
1558 }
1559
1560 ret = user->probe(conn, user);
1561 if (ret)
1562 goto out_unlock;
1563
1564 list_add(&user->list, &conn->users);
1565 ret = 0;
1566
1567out_unlock:
1568 hci_dev_unlock(hdev);
1569 return ret;
1570}
1571EXPORT_SYMBOL(l2cap_register_user);
1572
1573void l2cap_unregister_user(struct l2cap_conn *conn, struct l2cap_user *user)
1574{
1575 struct hci_dev *hdev = conn->hcon->hdev;
1576
1577 hci_dev_lock(hdev);
1578
1579 if (!user->list.next || !user->list.prev)
1580 goto out_unlock;
1581
1582 list_del(&user->list);
1583 user->list.next = NULL;
1584 user->list.prev = NULL;
1585 user->remove(conn, user);
1586
1587out_unlock:
1588 hci_dev_unlock(hdev);
1589}
1590EXPORT_SYMBOL(l2cap_unregister_user);
1591
1592static void l2cap_unregister_all_users(struct l2cap_conn *conn)
1593{
1594 struct l2cap_user *user;
1595
1596 while (!list_empty(&conn->users)) {
1597 user = list_first_entry(&conn->users, struct l2cap_user, list);
1598 list_del(&user->list);
1599 user->list.next = NULL;
1600 user->list.prev = NULL;
1601 user->remove(conn, user);
1602 }
1603}
1604
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001605static void l2cap_conn_del(struct hci_conn *hcon, int err)
1606{
1607 struct l2cap_conn *conn = hcon->l2cap_data;
1608 struct l2cap_chan *chan, *l;
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001609
1610 if (!conn)
1611 return;
1612
1613 BT_DBG("hcon %p conn %p, err %d", hcon, conn, err);
1614
1615 kfree_skb(conn->rx_skb);
1616
Johan Hedberg61a939c2014-01-17 20:45:11 +02001617 skb_queue_purge(&conn->pending_rx);
Jukka Taimisto7ab56c32014-06-12 10:15:13 +00001618
1619 /* We can not call flush_work(&conn->pending_rx_work) here since we
1620 * might block if we are running on a worker from the same workqueue
1621 * pending_rx_work is waiting on.
1622 */
1623 if (work_pending(&conn->pending_rx_work))
1624 cancel_work_sync(&conn->pending_rx_work);
Johan Hedberg61a939c2014-01-17 20:45:11 +02001625
David Herrmann2c8e1412013-04-06 20:28:45 +02001626 l2cap_unregister_all_users(conn);
1627
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001628 mutex_lock(&conn->chan_lock);
1629
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001630 /* Kill channels */
1631 list_for_each_entry_safe(chan, l, &conn->chan_l, list) {
Mat Martineau61d6ef32012-04-27 16:50:50 -07001632 l2cap_chan_hold(chan);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001633 l2cap_chan_lock(chan);
1634
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001635 l2cap_chan_del(chan, err);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001636
1637 l2cap_chan_unlock(chan);
1638
Gustavo Padovan80b98022012-05-27 22:27:51 -03001639 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07001640 l2cap_chan_put(chan);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001641 }
1642
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001643 mutex_unlock(&conn->chan_lock);
1644
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001645 hci_chan_del(conn->hchan);
1646
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001647 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT)
Ulisses Furquim127074b2012-01-30 18:26:29 -02001648 cancel_delayed_work_sync(&conn->info_timer);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001649
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001650 if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags)) {
Ulisses Furquim127074b2012-01-30 18:26:29 -02001651 cancel_delayed_work_sync(&conn->security_timer);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001652 smp_chan_destroy(conn);
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001653 }
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001654
1655 hcon->l2cap_data = NULL;
David Herrmann9c903e32013-04-06 20:28:44 +02001656 conn->hchan = NULL;
1657 l2cap_conn_put(conn);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001658}
1659
Gustavo F. Padovan6c9d42a2011-12-20 10:57:27 -02001660static void security_timeout(struct work_struct *work)
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001661{
Gustavo F. Padovan6c9d42a2011-12-20 10:57:27 -02001662 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001663 security_timer.work);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001664
Johan Hedbergd06cc412012-06-06 18:44:11 +08001665 BT_DBG("conn %p", conn);
1666
1667 if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags)) {
1668 smp_chan_destroy(conn);
1669 l2cap_conn_del(conn->hcon, ETIMEDOUT);
1670 }
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001671}
1672
David Herrmann9c903e32013-04-06 20:28:44 +02001673static void l2cap_conn_free(struct kref *ref)
1674{
1675 struct l2cap_conn *conn = container_of(ref, struct l2cap_conn, ref);
1676
1677 hci_conn_put(conn->hcon);
1678 kfree(conn);
1679}
1680
1681void l2cap_conn_get(struct l2cap_conn *conn)
1682{
1683 kref_get(&conn->ref);
1684}
1685EXPORT_SYMBOL(l2cap_conn_get);
1686
1687void l2cap_conn_put(struct l2cap_conn *conn)
1688{
1689 kref_put(&conn->ref, l2cap_conn_free);
1690}
1691EXPORT_SYMBOL(l2cap_conn_put);
1692
Linus Torvalds1da177e2005-04-16 15:20:36 -07001693/* ---- Socket interface ---- */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001694
Ido Yarivc2287682012-04-20 15:46:07 -03001695/* Find socket with psm and source / destination bdaddr.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001696 * Returns closest match.
1697 */
Ido Yarivc2287682012-04-20 15:46:07 -03001698static struct l2cap_chan *l2cap_global_chan_by_psm(int state, __le16 psm,
1699 bdaddr_t *src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001700 bdaddr_t *dst,
1701 u8 link_type)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001702{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001703 struct l2cap_chan *c, *c1 = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001704
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001705 read_lock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001706
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001707 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001708 if (state && c->state != state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001709 continue;
1710
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001711 if (link_type == ACL_LINK && c->src_type != BDADDR_BREDR)
1712 continue;
1713
1714 if (link_type == LE_LINK && c->src_type == BDADDR_BREDR)
1715 continue;
1716
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001717 if (c->psm == psm) {
Ido Yarivc2287682012-04-20 15:46:07 -03001718 int src_match, dst_match;
1719 int src_any, dst_any;
1720
Linus Torvalds1da177e2005-04-16 15:20:36 -07001721 /* Exact match. */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001722 src_match = !bacmp(&c->src, src);
1723 dst_match = !bacmp(&c->dst, dst);
Ido Yarivc2287682012-04-20 15:46:07 -03001724 if (src_match && dst_match) {
Johan Hedberga24cce12014-08-07 22:56:42 +03001725 l2cap_chan_hold(c);
Johannes Berga7567b22011-06-01 08:29:54 +02001726 read_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001727 return c;
1728 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001729
1730 /* Closest match */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001731 src_any = !bacmp(&c->src, BDADDR_ANY);
1732 dst_any = !bacmp(&c->dst, BDADDR_ANY);
Ido Yarivc2287682012-04-20 15:46:07 -03001733 if ((src_match && dst_any) || (src_any && dst_match) ||
1734 (src_any && dst_any))
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001735 c1 = c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001736 }
1737 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001738
Johan Hedberga24cce12014-08-07 22:56:42 +03001739 if (c1)
1740 l2cap_chan_hold(c1);
1741
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001742 read_unlock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001743
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001744 return c1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001745}
1746
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001747static void l2cap_monitor_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001748{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001749 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001750 monitor_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001751
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03001752 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001753
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001754 l2cap_chan_lock(chan);
1755
Mat Martineau80909e02012-05-17 20:53:50 -07001756 if (!chan->conn) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001757 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001758 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001759 return;
1760 }
1761
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001762 l2cap_tx(chan, NULL, NULL, L2CAP_EV_MONITOR_TO);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001763
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001764 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001765 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001766}
1767
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001768static void l2cap_retrans_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001769{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001770 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001771 retrans_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001772
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03001773 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001774
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001775 l2cap_chan_lock(chan);
1776
Mat Martineau80909e02012-05-17 20:53:50 -07001777 if (!chan->conn) {
1778 l2cap_chan_unlock(chan);
1779 l2cap_chan_put(chan);
1780 return;
1781 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001782
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001783 l2cap_tx(chan, NULL, NULL, L2CAP_EV_RETRANS_TO);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001784 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001785 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001786}
1787
Gustavo Padovand6603662012-05-21 13:58:22 -03001788static void l2cap_streaming_send(struct l2cap_chan *chan,
1789 struct sk_buff_head *skbs)
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001790{
Gustavo F. Padovanccbb84a2010-08-30 18:44:44 -03001791 struct sk_buff *skb;
Mat Martineau37339372012-05-17 20:53:33 -07001792 struct l2cap_ctrl *control;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001793
Mat Martineau37339372012-05-17 20:53:33 -07001794 BT_DBG("chan %p, skbs %p", chan, skbs);
1795
Mat Martineaub99e13a2012-10-23 15:24:19 -07001796 if (__chan_is_moving(chan))
1797 return;
1798
Mat Martineau37339372012-05-17 20:53:33 -07001799 skb_queue_splice_tail_init(skbs, &chan->tx_q);
1800
1801 while (!skb_queue_empty(&chan->tx_q)) {
1802
1803 skb = skb_dequeue(&chan->tx_q);
1804
1805 bt_cb(skb)->control.retries = 1;
1806 control = &bt_cb(skb)->control;
1807
1808 control->reqseq = 0;
1809 control->txseq = chan->next_tx_seq;
1810
1811 __pack_control(chan, control, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001812
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001813 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau37339372012-05-17 20:53:33 -07001814 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1815 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001816 }
1817
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001818 l2cap_do_send(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001819
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001820 BT_DBG("Sent txseq %u", control->txseq);
Mat Martineau37339372012-05-17 20:53:33 -07001821
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001822 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau37339372012-05-17 20:53:33 -07001823 chan->frames_sent++;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001824 }
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001825}
1826
Szymon Janc67c9e842011-07-28 16:24:33 +02001827static int l2cap_ertm_send(struct l2cap_chan *chan)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001828{
1829 struct sk_buff *skb, *tx_skb;
Mat Martineau18a48e72012-05-17 20:53:34 -07001830 struct l2cap_ctrl *control;
1831 int sent = 0;
1832
1833 BT_DBG("chan %p", chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001834
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001835 if (chan->state != BT_CONNECTED)
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001836 return -ENOTCONN;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001837
Mat Martineau94122bb2012-05-02 09:42:02 -07001838 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1839 return 0;
1840
Mat Martineaub99e13a2012-10-23 15:24:19 -07001841 if (__chan_is_moving(chan))
1842 return 0;
1843
Mat Martineau18a48e72012-05-17 20:53:34 -07001844 while (chan->tx_send_head &&
1845 chan->unacked_frames < chan->remote_tx_win &&
1846 chan->tx_state == L2CAP_TX_STATE_XMIT) {
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001847
Mat Martineau18a48e72012-05-17 20:53:34 -07001848 skb = chan->tx_send_head;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001849
Mat Martineau18a48e72012-05-17 20:53:34 -07001850 bt_cb(skb)->control.retries = 1;
1851 control = &bt_cb(skb)->control;
Gustavo F. Padovan95ffa972010-06-18 20:37:33 -03001852
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001853 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
Mat Martineau18a48e72012-05-17 20:53:34 -07001854 control->final = 1;
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001855
Mat Martineau18a48e72012-05-17 20:53:34 -07001856 control->reqseq = chan->buffer_seq;
1857 chan->last_acked_seq = chan->buffer_seq;
1858 control->txseq = chan->next_tx_seq;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001859
Mat Martineau18a48e72012-05-17 20:53:34 -07001860 __pack_control(chan, control, skb);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001861
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001862 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau18a48e72012-05-17 20:53:34 -07001863 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1864 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001865 }
1866
Mat Martineau18a48e72012-05-17 20:53:34 -07001867 /* Clone after data has been modified. Data is assumed to be
1868 read-only (for locking purposes) on cloned sk_buffs.
1869 */
1870 tx_skb = skb_clone(skb, GFP_KERNEL);
1871
1872 if (!tx_skb)
1873 break;
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -03001874
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03001875 __set_retrans_timer(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001876
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001877 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau18a48e72012-05-17 20:53:34 -07001878 chan->unacked_frames++;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03001879 chan->frames_sent++;
Mat Martineau18a48e72012-05-17 20:53:34 -07001880 sent++;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001881
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001882 if (skb_queue_is_last(&chan->tx_q, skb))
1883 chan->tx_send_head = NULL;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001884 else
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001885 chan->tx_send_head = skb_queue_next(&chan->tx_q, skb);
Mat Martineau18a48e72012-05-17 20:53:34 -07001886
1887 l2cap_do_send(chan, tx_skb);
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001888 BT_DBG("Sent txseq %u", control->txseq);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001889 }
1890
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001891 BT_DBG("Sent %d, %u unacked, %u in ERTM queue", sent,
1892 chan->unacked_frames, skb_queue_len(&chan->tx_q));
Mat Martineau18a48e72012-05-17 20:53:34 -07001893
1894 return sent;
Gustavo F. Padovan9e917af2010-05-01 16:15:37 -03001895}
1896
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001897static void l2cap_ertm_resend(struct l2cap_chan *chan)
1898{
1899 struct l2cap_ctrl control;
1900 struct sk_buff *skb;
1901 struct sk_buff *tx_skb;
1902 u16 seq;
1903
1904 BT_DBG("chan %p", chan);
1905
1906 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1907 return;
1908
Mat Martineaub99e13a2012-10-23 15:24:19 -07001909 if (__chan_is_moving(chan))
1910 return;
1911
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001912 while (chan->retrans_list.head != L2CAP_SEQ_LIST_CLEAR) {
1913 seq = l2cap_seq_list_pop(&chan->retrans_list);
1914
1915 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, seq);
1916 if (!skb) {
1917 BT_DBG("Error: Can't retransmit seq %d, frame missing",
Gustavo Padovan2d792812012-10-06 10:07:01 +01001918 seq);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001919 continue;
1920 }
1921
1922 bt_cb(skb)->control.retries++;
1923 control = bt_cb(skb)->control;
1924
1925 if (chan->max_tx != 0 &&
1926 bt_cb(skb)->control.retries > chan->max_tx) {
1927 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001928 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001929 l2cap_seq_list_clear(&chan->retrans_list);
1930 break;
1931 }
1932
1933 control.reqseq = chan->buffer_seq;
1934 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
1935 control.final = 1;
1936 else
1937 control.final = 0;
1938
1939 if (skb_cloned(skb)) {
1940 /* Cloned sk_buffs are read-only, so we need a
1941 * writeable copy
1942 */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03001943 tx_skb = skb_copy(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001944 } else {
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03001945 tx_skb = skb_clone(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001946 }
1947
1948 if (!tx_skb) {
1949 l2cap_seq_list_clear(&chan->retrans_list);
1950 break;
1951 }
1952
1953 /* Update skb contents */
1954 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
1955 put_unaligned_le32(__pack_extended_control(&control),
1956 tx_skb->data + L2CAP_HDR_SIZE);
1957 } else {
1958 put_unaligned_le16(__pack_enhanced_control(&control),
1959 tx_skb->data + L2CAP_HDR_SIZE);
1960 }
1961
1962 if (chan->fcs == L2CAP_FCS_CRC16) {
1963 u16 fcs = crc16(0, (u8 *) tx_skb->data, tx_skb->len);
1964 put_unaligned_le16(fcs, skb_put(tx_skb,
1965 L2CAP_FCS_SIZE));
1966 }
1967
1968 l2cap_do_send(chan, tx_skb);
1969
1970 BT_DBG("Resent txseq %d", control.txseq);
1971
1972 chan->last_acked_seq = chan->buffer_seq;
1973 }
1974}
1975
Mat Martineauf80842a2012-05-17 20:53:46 -07001976static void l2cap_retransmit(struct l2cap_chan *chan,
1977 struct l2cap_ctrl *control)
1978{
1979 BT_DBG("chan %p, control %p", chan, control);
1980
1981 l2cap_seq_list_append(&chan->retrans_list, control->reqseq);
1982 l2cap_ertm_resend(chan);
1983}
1984
Mat Martineaud2a7ac52012-05-17 20:53:42 -07001985static void l2cap_retransmit_all(struct l2cap_chan *chan,
1986 struct l2cap_ctrl *control)
1987{
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001988 struct sk_buff *skb;
1989
1990 BT_DBG("chan %p, control %p", chan, control);
1991
1992 if (control->poll)
1993 set_bit(CONN_SEND_FBIT, &chan->conn_state);
1994
1995 l2cap_seq_list_clear(&chan->retrans_list);
1996
1997 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1998 return;
1999
2000 if (chan->unacked_frames) {
2001 skb_queue_walk(&chan->tx_q, skb) {
2002 if (bt_cb(skb)->control.txseq == control->reqseq ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01002003 skb == chan->tx_send_head)
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002004 break;
2005 }
2006
2007 skb_queue_walk_from(&chan->tx_q, skb) {
2008 if (skb == chan->tx_send_head)
2009 break;
2010
2011 l2cap_seq_list_append(&chan->retrans_list,
2012 bt_cb(skb)->control.txseq);
2013 }
2014
2015 l2cap_ertm_resend(chan);
2016 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002017}
2018
Szymon Jancb17e73b2012-01-11 10:59:47 +01002019static void l2cap_send_ack(struct l2cap_chan *chan)
2020{
Mat Martineau0a0aba42012-05-17 20:53:39 -07002021 struct l2cap_ctrl control;
2022 u16 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
2023 chan->last_acked_seq);
2024 int threshold;
2025
2026 BT_DBG("chan %p last_acked_seq %d buffer_seq %d",
2027 chan, chan->last_acked_seq, chan->buffer_seq);
2028
2029 memset(&control, 0, sizeof(control));
2030 control.sframe = 1;
2031
2032 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
2033 chan->rx_state == L2CAP_RX_STATE_RECV) {
2034 __clear_ack_timer(chan);
2035 control.super = L2CAP_SUPER_RNR;
2036 control.reqseq = chan->buffer_seq;
2037 l2cap_send_sframe(chan, &control);
2038 } else {
2039 if (!test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) {
2040 l2cap_ertm_send(chan);
2041 /* If any i-frames were sent, they included an ack */
2042 if (chan->buffer_seq == chan->last_acked_seq)
2043 frames_to_ack = 0;
2044 }
2045
Mat Martineauc20f8e32012-07-10 05:47:07 -07002046 /* Ack now if the window is 3/4ths full.
Mat Martineau0a0aba42012-05-17 20:53:39 -07002047 * Calculate without mul or div
2048 */
Mat Martineauc20f8e32012-07-10 05:47:07 -07002049 threshold = chan->ack_win;
Mat Martineau0a0aba42012-05-17 20:53:39 -07002050 threshold += threshold << 1;
2051 threshold >>= 2;
2052
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002053 BT_DBG("frames_to_ack %u, threshold %d", frames_to_ack,
Mat Martineau0a0aba42012-05-17 20:53:39 -07002054 threshold);
2055
2056 if (frames_to_ack >= threshold) {
2057 __clear_ack_timer(chan);
2058 control.super = L2CAP_SUPER_RR;
2059 control.reqseq = chan->buffer_seq;
2060 l2cap_send_sframe(chan, &control);
2061 frames_to_ack = 0;
2062 }
2063
2064 if (frames_to_ack)
2065 __set_ack_timer(chan);
2066 }
Szymon Jancb17e73b2012-01-11 10:59:47 +01002067}
2068
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002069static inline int l2cap_skbuff_fromiovec(struct l2cap_chan *chan,
2070 struct msghdr *msg, int len,
2071 int count, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002072{
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002073 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002074 struct sk_buff **frag;
Gustavo Padovan90338942012-04-06 20:15:47 -03002075 int sent = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002076
Jukka Rissanen04988782014-06-18 16:37:07 +03002077 if (chan->ops->memcpy_fromiovec(chan, skb_put(skb, count),
2078 msg->msg_iov, count))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002079 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002080
2081 sent += count;
2082 len -= count;
2083
2084 /* Continuation fragments (no L2CAP header) */
2085 frag = &skb_shinfo(skb)->frag_list;
2086 while (len) {
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002087 struct sk_buff *tmp;
2088
Linus Torvalds1da177e2005-04-16 15:20:36 -07002089 count = min_t(unsigned int, conn->mtu, len);
2090
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002091 tmp = chan->ops->alloc_skb(chan, 0, count,
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002092 msg->msg_flags & MSG_DONTWAIT);
2093 if (IS_ERR(tmp))
2094 return PTR_ERR(tmp);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002095
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002096 *frag = tmp;
2097
Jukka Rissanen04988782014-06-18 16:37:07 +03002098 if (chan->ops->memcpy_fromiovec(chan, skb_put(*frag, count),
2099 msg->msg_iov, count))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002100 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002101
2102 sent += count;
2103 len -= count;
2104
Gustavo Padovan2d0ed3d2012-05-11 13:16:12 -03002105 skb->len += (*frag)->len;
2106 skb->data_len += (*frag)->len;
2107
Linus Torvalds1da177e2005-04-16 15:20:36 -07002108 frag = &(*frag)->next;
2109 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002110
2111 return sent;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002112}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002113
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002114static struct sk_buff *l2cap_create_connless_pdu(struct l2cap_chan *chan,
Marcel Holtmann8d463212014-06-05 15:22:51 +02002115 struct msghdr *msg, size_t len)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002116{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002117 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002118 struct sk_buff *skb;
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002119 int err, count, hlen = L2CAP_HDR_SIZE + L2CAP_PSMLEN_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002120 struct l2cap_hdr *lh;
2121
Marcel Holtmann8d463212014-06-05 15:22:51 +02002122 BT_DBG("chan %p psm 0x%2.2x len %zu", chan,
2123 __le16_to_cpu(chan->psm), len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002124
2125 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002126
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002127 skb = chan->ops->alloc_skb(chan, hlen, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002128 msg->msg_flags & MSG_DONTWAIT);
2129 if (IS_ERR(skb))
2130 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002131
2132 /* Create L2CAP header */
2133 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002134 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenkodaf6a78c2012-05-03 10:55:52 +03002135 lh->len = cpu_to_le16(len + L2CAP_PSMLEN_SIZE);
Marcel Holtmann43b1b8d2013-10-12 06:01:26 -07002136 put_unaligned(chan->psm, (__le16 *) skb_put(skb, L2CAP_PSMLEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002137
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002138 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002139 if (unlikely(err < 0)) {
2140 kfree_skb(skb);
2141 return ERR_PTR(err);
2142 }
2143 return skb;
2144}
2145
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002146static struct sk_buff *l2cap_create_basic_pdu(struct l2cap_chan *chan,
Marcel Holtmann8d463212014-06-05 15:22:51 +02002147 struct msghdr *msg, size_t len)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002148{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002149 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002150 struct sk_buff *skb;
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002151 int err, count;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002152 struct l2cap_hdr *lh;
2153
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002154 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002155
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002156 count = min_t(unsigned int, (conn->mtu - L2CAP_HDR_SIZE), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002157
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002158 skb = chan->ops->alloc_skb(chan, L2CAP_HDR_SIZE, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002159 msg->msg_flags & MSG_DONTWAIT);
2160 if (IS_ERR(skb))
2161 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002162
2163 /* Create L2CAP header */
2164 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002165 lh->cid = cpu_to_le16(chan->dcid);
Gustavo Padovan6ff9b5e2012-05-02 11:56:17 -03002166 lh->len = cpu_to_le16(len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002167
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002168 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002169 if (unlikely(err < 0)) {
2170 kfree_skb(skb);
2171 return ERR_PTR(err);
2172 }
2173 return skb;
2174}
2175
Luiz Augusto von Dentzab0ff762011-09-12 20:00:50 +03002176static struct sk_buff *l2cap_create_iframe_pdu(struct l2cap_chan *chan,
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002177 struct msghdr *msg, size_t len,
2178 u16 sdulen)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002179{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002180 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002181 struct sk_buff *skb;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002182 int err, count, hlen;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002183 struct l2cap_hdr *lh;
2184
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002185 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002186
Gustavo F. Padovan0ee0d202010-05-01 16:15:41 -03002187 if (!conn)
2188 return ERR_PTR(-ENOTCONN);
2189
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002190 hlen = __ertm_hdr_size(chan);
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002191
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002192 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002193 hlen += L2CAP_SDULEN_SIZE;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002194
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03002195 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002196 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03002197
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002198 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002199
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002200 skb = chan->ops->alloc_skb(chan, hlen, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002201 msg->msg_flags & MSG_DONTWAIT);
2202 if (IS_ERR(skb))
2203 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002204
2205 /* Create L2CAP header */
2206 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002207 lh->cid = cpu_to_le16(chan->dcid);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002208 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002209
Mat Martineau18a48e72012-05-17 20:53:34 -07002210 /* Control header is populated later */
2211 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
2212 put_unaligned_le32(0, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
2213 else
2214 put_unaligned_le16(0, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002215
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002216 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002217 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002218
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002219 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002220 if (unlikely(err < 0)) {
2221 kfree_skb(skb);
2222 return ERR_PTR(err);
2223 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03002224
Mat Martineau18a48e72012-05-17 20:53:34 -07002225 bt_cb(skb)->control.fcs = chan->fcs;
Mat Martineau3ce35142012-04-25 16:36:14 -07002226 bt_cb(skb)->control.retries = 0;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002227 return skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002228}
2229
Mat Martineau94122bb2012-05-02 09:42:02 -07002230static int l2cap_segment_sdu(struct l2cap_chan *chan,
2231 struct sk_buff_head *seg_queue,
2232 struct msghdr *msg, size_t len)
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002233{
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002234 struct sk_buff *skb;
Mat Martineau94122bb2012-05-02 09:42:02 -07002235 u16 sdu_len;
2236 size_t pdu_len;
Mat Martineau94122bb2012-05-02 09:42:02 -07002237 u8 sar;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002238
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002239 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002240
Mat Martineau94122bb2012-05-02 09:42:02 -07002241 /* It is critical that ERTM PDUs fit in a single HCI fragment,
2242 * so fragmented skbs are not used. The HCI layer's handling
2243 * of fragmented skbs is not compatible with ERTM's queueing.
2244 */
2245
2246 /* PDU size is derived from the HCI MTU */
2247 pdu_len = chan->conn->mtu;
2248
Mat Martineaua5495742012-10-23 15:24:21 -07002249 /* Constrain PDU size for BR/EDR connections */
2250 if (!chan->hs_hcon)
2251 pdu_len = min_t(size_t, pdu_len, L2CAP_BREDR_MAX_PAYLOAD);
Mat Martineau94122bb2012-05-02 09:42:02 -07002252
2253 /* Adjust for largest possible L2CAP overhead. */
Gustavo Padovan35d401d2012-05-25 18:57:05 -03002254 if (chan->fcs)
2255 pdu_len -= L2CAP_FCS_SIZE;
2256
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002257 pdu_len -= __ertm_hdr_size(chan);
Mat Martineau94122bb2012-05-02 09:42:02 -07002258
2259 /* Remote device may have requested smaller PDUs */
2260 pdu_len = min_t(size_t, pdu_len, chan->remote_mps);
2261
2262 if (len <= pdu_len) {
2263 sar = L2CAP_SAR_UNSEGMENTED;
2264 sdu_len = 0;
2265 pdu_len = len;
2266 } else {
2267 sar = L2CAP_SAR_START;
2268 sdu_len = len;
2269 pdu_len -= L2CAP_SDULEN_SIZE;
2270 }
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002271
2272 while (len > 0) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002273 skb = l2cap_create_iframe_pdu(chan, msg, pdu_len, sdu_len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002274
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002275 if (IS_ERR(skb)) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002276 __skb_queue_purge(seg_queue);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002277 return PTR_ERR(skb);
2278 }
2279
Mat Martineau94122bb2012-05-02 09:42:02 -07002280 bt_cb(skb)->control.sar = sar;
2281 __skb_queue_tail(seg_queue, skb);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002282
Mat Martineau94122bb2012-05-02 09:42:02 -07002283 len -= pdu_len;
2284 if (sdu_len) {
2285 sdu_len = 0;
2286 pdu_len += L2CAP_SDULEN_SIZE;
2287 }
2288
2289 if (len <= pdu_len) {
2290 sar = L2CAP_SAR_END;
2291 pdu_len = len;
2292 } else {
2293 sar = L2CAP_SAR_CONTINUE;
2294 }
2295 }
2296
Gustavo Padovanf0f62792012-05-29 13:29:17 -03002297 return 0;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002298}
2299
Johan Hedberg177f8f22013-05-31 17:54:51 +03002300static struct sk_buff *l2cap_create_le_flowctl_pdu(struct l2cap_chan *chan,
2301 struct msghdr *msg,
2302 size_t len, u16 sdulen)
2303{
2304 struct l2cap_conn *conn = chan->conn;
2305 struct sk_buff *skb;
2306 int err, count, hlen;
2307 struct l2cap_hdr *lh;
2308
2309 BT_DBG("chan %p len %zu", chan, len);
2310
2311 if (!conn)
2312 return ERR_PTR(-ENOTCONN);
2313
2314 hlen = L2CAP_HDR_SIZE;
2315
2316 if (sdulen)
2317 hlen += L2CAP_SDULEN_SIZE;
2318
2319 count = min_t(unsigned int, (conn->mtu - hlen), len);
2320
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002321 skb = chan->ops->alloc_skb(chan, hlen, count,
Johan Hedberg177f8f22013-05-31 17:54:51 +03002322 msg->msg_flags & MSG_DONTWAIT);
2323 if (IS_ERR(skb))
2324 return skb;
2325
2326 /* Create L2CAP header */
2327 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
2328 lh->cid = cpu_to_le16(chan->dcid);
2329 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
2330
2331 if (sdulen)
2332 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
2333
2334 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
2335 if (unlikely(err < 0)) {
2336 kfree_skb(skb);
2337 return ERR_PTR(err);
2338 }
2339
2340 return skb;
2341}
2342
2343static int l2cap_segment_le_sdu(struct l2cap_chan *chan,
2344 struct sk_buff_head *seg_queue,
2345 struct msghdr *msg, size_t len)
2346{
2347 struct sk_buff *skb;
2348 size_t pdu_len;
2349 u16 sdu_len;
2350
2351 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
2352
2353 pdu_len = chan->conn->mtu - L2CAP_HDR_SIZE;
2354
2355 pdu_len = min_t(size_t, pdu_len, chan->remote_mps);
2356
2357 sdu_len = len;
2358 pdu_len -= L2CAP_SDULEN_SIZE;
2359
2360 while (len > 0) {
2361 if (len <= pdu_len)
2362 pdu_len = len;
2363
2364 skb = l2cap_create_le_flowctl_pdu(chan, msg, pdu_len, sdu_len);
2365 if (IS_ERR(skb)) {
2366 __skb_queue_purge(seg_queue);
2367 return PTR_ERR(skb);
2368 }
2369
2370 __skb_queue_tail(seg_queue, skb);
2371
2372 len -= pdu_len;
2373
2374 if (sdu_len) {
2375 sdu_len = 0;
2376 pdu_len += L2CAP_SDULEN_SIZE;
2377 }
2378 }
2379
2380 return 0;
2381}
2382
Marcel Holtmann8d463212014-06-05 15:22:51 +02002383int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002384{
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002385 struct sk_buff *skb;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002386 int err;
Mat Martineau94122bb2012-05-02 09:42:02 -07002387 struct sk_buff_head seg_queue;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002388
Seung-Woo Kim31e8ce82013-11-05 18:46:33 +09002389 if (!chan->conn)
2390 return -ENOTCONN;
2391
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002392 /* Connectionless channel */
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002393 if (chan->chan_type == L2CAP_CHAN_CONN_LESS) {
Marcel Holtmann8d463212014-06-05 15:22:51 +02002394 skb = l2cap_create_connless_pdu(chan, msg, len);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002395 if (IS_ERR(skb))
2396 return PTR_ERR(skb);
2397
Andrzej Kaczmarekede81a22014-02-25 17:16:22 +01002398 /* Channel lock is released before requesting new skb and then
2399 * reacquired thus we need to recheck channel state.
2400 */
2401 if (chan->state != BT_CONNECTED) {
2402 kfree_skb(skb);
2403 return -ENOTCONN;
2404 }
2405
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002406 l2cap_do_send(chan, skb);
2407 return len;
2408 }
2409
2410 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03002411 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedberg177f8f22013-05-31 17:54:51 +03002412 /* Check outgoing MTU */
2413 if (len > chan->omtu)
2414 return -EMSGSIZE;
2415
Johan Hedbergfad5fc82013-12-05 09:45:01 +02002416 if (!chan->tx_credits)
2417 return -EAGAIN;
2418
Johan Hedberg177f8f22013-05-31 17:54:51 +03002419 __skb_queue_head_init(&seg_queue);
2420
2421 err = l2cap_segment_le_sdu(chan, &seg_queue, msg, len);
2422
2423 if (chan->state != BT_CONNECTED) {
2424 __skb_queue_purge(&seg_queue);
2425 err = -ENOTCONN;
2426 }
2427
2428 if (err)
2429 return err;
2430
2431 skb_queue_splice_tail_init(&seg_queue, &chan->tx_q);
2432
2433 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
2434 l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
2435 chan->tx_credits--;
2436 }
2437
2438 if (!chan->tx_credits)
2439 chan->ops->suspend(chan);
2440
2441 err = len;
2442
2443 break;
2444
Johan Hedbergfad5fc82013-12-05 09:45:01 +02002445 case L2CAP_MODE_BASIC:
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002446 /* Check outgoing MTU */
2447 if (len > chan->omtu)
2448 return -EMSGSIZE;
2449
2450 /* Create a basic PDU */
Marcel Holtmann8d463212014-06-05 15:22:51 +02002451 skb = l2cap_create_basic_pdu(chan, msg, len);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002452 if (IS_ERR(skb))
2453 return PTR_ERR(skb);
2454
Andrzej Kaczmarekede81a22014-02-25 17:16:22 +01002455 /* Channel lock is released before requesting new skb and then
2456 * reacquired thus we need to recheck channel state.
2457 */
2458 if (chan->state != BT_CONNECTED) {
2459 kfree_skb(skb);
2460 return -ENOTCONN;
2461 }
2462
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002463 l2cap_do_send(chan, skb);
2464 err = len;
2465 break;
2466
2467 case L2CAP_MODE_ERTM:
2468 case L2CAP_MODE_STREAMING:
Mat Martineau94122bb2012-05-02 09:42:02 -07002469 /* Check outgoing MTU */
2470 if (len > chan->omtu) {
2471 err = -EMSGSIZE;
2472 break;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002473 }
2474
Mat Martineau94122bb2012-05-02 09:42:02 -07002475 __skb_queue_head_init(&seg_queue);
2476
2477 /* Do segmentation before calling in to the state machine,
2478 * since it's possible to block while waiting for memory
2479 * allocation.
2480 */
2481 err = l2cap_segment_sdu(chan, &seg_queue, msg, len);
2482
2483 /* The channel could have been closed while segmenting,
2484 * check that it is still connected.
2485 */
2486 if (chan->state != BT_CONNECTED) {
2487 __skb_queue_purge(&seg_queue);
2488 err = -ENOTCONN;
2489 }
2490
2491 if (err)
2492 break;
2493
Mat Martineau37339372012-05-17 20:53:33 -07002494 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo Padovand6603662012-05-21 13:58:22 -03002495 l2cap_tx(chan, NULL, &seg_queue, L2CAP_EV_DATA_REQUEST);
Mat Martineau37339372012-05-17 20:53:33 -07002496 else
Gustavo Padovand6603662012-05-21 13:58:22 -03002497 l2cap_streaming_send(chan, &seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002498
Gustavo Padovand6603662012-05-21 13:58:22 -03002499 err = len;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002500
Mat Martineau94122bb2012-05-02 09:42:02 -07002501 /* If the skbs were not queued for sending, they'll still be in
2502 * seg_queue and need to be purged.
2503 */
2504 __skb_queue_purge(&seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002505 break;
2506
2507 default:
2508 BT_DBG("bad state %1.1x", chan->mode);
2509 err = -EBADFD;
2510 }
2511
2512 return err;
2513}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +03002514EXPORT_SYMBOL_GPL(l2cap_chan_send);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002515
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002516static void l2cap_send_srej(struct l2cap_chan *chan, u16 txseq)
2517{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002518 struct l2cap_ctrl control;
2519 u16 seq;
2520
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002521 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002522
2523 memset(&control, 0, sizeof(control));
2524 control.sframe = 1;
2525 control.super = L2CAP_SUPER_SREJ;
2526
2527 for (seq = chan->expected_tx_seq; seq != txseq;
2528 seq = __next_seq(chan, seq)) {
2529 if (!l2cap_ertm_seq_in_queue(&chan->srej_q, seq)) {
2530 control.reqseq = seq;
2531 l2cap_send_sframe(chan, &control);
2532 l2cap_seq_list_append(&chan->srej_list, seq);
2533 }
2534 }
2535
2536 chan->expected_tx_seq = __next_seq(chan, txseq);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002537}
2538
2539static void l2cap_send_srej_tail(struct l2cap_chan *chan)
2540{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002541 struct l2cap_ctrl control;
2542
2543 BT_DBG("chan %p", chan);
2544
2545 if (chan->srej_list.tail == L2CAP_SEQ_LIST_CLEAR)
2546 return;
2547
2548 memset(&control, 0, sizeof(control));
2549 control.sframe = 1;
2550 control.super = L2CAP_SUPER_SREJ;
2551 control.reqseq = chan->srej_list.tail;
2552 l2cap_send_sframe(chan, &control);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002553}
2554
2555static void l2cap_send_srej_list(struct l2cap_chan *chan, u16 txseq)
2556{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002557 struct l2cap_ctrl control;
2558 u16 initial_head;
2559 u16 seq;
2560
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002561 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002562
2563 memset(&control, 0, sizeof(control));
2564 control.sframe = 1;
2565 control.super = L2CAP_SUPER_SREJ;
2566
2567 /* Capture initial list head to allow only one pass through the list. */
2568 initial_head = chan->srej_list.head;
2569
2570 do {
2571 seq = l2cap_seq_list_pop(&chan->srej_list);
2572 if (seq == txseq || seq == L2CAP_SEQ_LIST_CLEAR)
2573 break;
2574
2575 control.reqseq = seq;
2576 l2cap_send_sframe(chan, &control);
2577 l2cap_seq_list_append(&chan->srej_list, seq);
2578 } while (chan->srej_list.head != initial_head);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002579}
2580
Mat Martineau608bcc62012-05-17 20:53:32 -07002581static void l2cap_process_reqseq(struct l2cap_chan *chan, u16 reqseq)
2582{
2583 struct sk_buff *acked_skb;
2584 u16 ackseq;
2585
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002586 BT_DBG("chan %p, reqseq %u", chan, reqseq);
Mat Martineau608bcc62012-05-17 20:53:32 -07002587
2588 if (chan->unacked_frames == 0 || reqseq == chan->expected_ack_seq)
2589 return;
2590
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002591 BT_DBG("expected_ack_seq %u, unacked_frames %u",
Mat Martineau608bcc62012-05-17 20:53:32 -07002592 chan->expected_ack_seq, chan->unacked_frames);
2593
2594 for (ackseq = chan->expected_ack_seq; ackseq != reqseq;
2595 ackseq = __next_seq(chan, ackseq)) {
2596
2597 acked_skb = l2cap_ertm_seq_in_queue(&chan->tx_q, ackseq);
2598 if (acked_skb) {
2599 skb_unlink(acked_skb, &chan->tx_q);
2600 kfree_skb(acked_skb);
2601 chan->unacked_frames--;
2602 }
2603 }
2604
2605 chan->expected_ack_seq = reqseq;
2606
2607 if (chan->unacked_frames == 0)
2608 __clear_retrans_timer(chan);
2609
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002610 BT_DBG("unacked_frames %u", chan->unacked_frames);
Mat Martineau608bcc62012-05-17 20:53:32 -07002611}
2612
2613static void l2cap_abort_rx_srej_sent(struct l2cap_chan *chan)
2614{
2615 BT_DBG("chan %p", chan);
2616
2617 chan->expected_tx_seq = chan->buffer_seq;
2618 l2cap_seq_list_clear(&chan->srej_list);
2619 skb_queue_purge(&chan->srej_q);
2620 chan->rx_state = L2CAP_RX_STATE_RECV;
2621}
2622
Gustavo Padovand6603662012-05-21 13:58:22 -03002623static void l2cap_tx_state_xmit(struct l2cap_chan *chan,
2624 struct l2cap_ctrl *control,
2625 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002626{
Mat Martineau608bcc62012-05-17 20:53:32 -07002627 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2628 event);
2629
2630 switch (event) {
2631 case L2CAP_EV_DATA_REQUEST:
2632 if (chan->tx_send_head == NULL)
2633 chan->tx_send_head = skb_peek(skbs);
2634
2635 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2636 l2cap_ertm_send(chan);
2637 break;
2638 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2639 BT_DBG("Enter LOCAL_BUSY");
2640 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2641
2642 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2643 /* The SREJ_SENT state must be aborted if we are to
2644 * enter the LOCAL_BUSY state.
2645 */
2646 l2cap_abort_rx_srej_sent(chan);
2647 }
2648
2649 l2cap_send_ack(chan);
2650
2651 break;
2652 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2653 BT_DBG("Exit LOCAL_BUSY");
2654 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2655
2656 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2657 struct l2cap_ctrl local_control;
2658
2659 memset(&local_control, 0, sizeof(local_control));
2660 local_control.sframe = 1;
2661 local_control.super = L2CAP_SUPER_RR;
2662 local_control.poll = 1;
2663 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002664 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002665
2666 chan->retry_count = 1;
2667 __set_monitor_timer(chan);
2668 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2669 }
2670 break;
2671 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2672 l2cap_process_reqseq(chan, control->reqseq);
2673 break;
2674 case L2CAP_EV_EXPLICIT_POLL:
2675 l2cap_send_rr_or_rnr(chan, 1);
2676 chan->retry_count = 1;
2677 __set_monitor_timer(chan);
2678 __clear_ack_timer(chan);
2679 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2680 break;
2681 case L2CAP_EV_RETRANS_TO:
2682 l2cap_send_rr_or_rnr(chan, 1);
2683 chan->retry_count = 1;
2684 __set_monitor_timer(chan);
2685 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2686 break;
2687 case L2CAP_EV_RECV_FBIT:
2688 /* Nothing to process */
2689 break;
2690 default:
2691 break;
2692 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002693}
2694
Gustavo Padovand6603662012-05-21 13:58:22 -03002695static void l2cap_tx_state_wait_f(struct l2cap_chan *chan,
2696 struct l2cap_ctrl *control,
2697 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002698{
Mat Martineau608bcc62012-05-17 20:53:32 -07002699 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2700 event);
2701
2702 switch (event) {
2703 case L2CAP_EV_DATA_REQUEST:
2704 if (chan->tx_send_head == NULL)
2705 chan->tx_send_head = skb_peek(skbs);
2706 /* Queue data, but don't send. */
2707 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2708 break;
2709 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2710 BT_DBG("Enter LOCAL_BUSY");
2711 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2712
2713 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2714 /* The SREJ_SENT state must be aborted if we are to
2715 * enter the LOCAL_BUSY state.
2716 */
2717 l2cap_abort_rx_srej_sent(chan);
2718 }
2719
2720 l2cap_send_ack(chan);
2721
2722 break;
2723 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2724 BT_DBG("Exit LOCAL_BUSY");
2725 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2726
2727 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2728 struct l2cap_ctrl local_control;
2729 memset(&local_control, 0, sizeof(local_control));
2730 local_control.sframe = 1;
2731 local_control.super = L2CAP_SUPER_RR;
2732 local_control.poll = 1;
2733 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002734 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002735
2736 chan->retry_count = 1;
2737 __set_monitor_timer(chan);
2738 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2739 }
2740 break;
2741 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2742 l2cap_process_reqseq(chan, control->reqseq);
2743
2744 /* Fall through */
2745
2746 case L2CAP_EV_RECV_FBIT:
2747 if (control && control->final) {
2748 __clear_monitor_timer(chan);
2749 if (chan->unacked_frames > 0)
2750 __set_retrans_timer(chan);
2751 chan->retry_count = 0;
2752 chan->tx_state = L2CAP_TX_STATE_XMIT;
2753 BT_DBG("recv fbit tx_state 0x2.2%x", chan->tx_state);
2754 }
2755 break;
2756 case L2CAP_EV_EXPLICIT_POLL:
2757 /* Ignore */
2758 break;
2759 case L2CAP_EV_MONITOR_TO:
2760 if (chan->max_tx == 0 || chan->retry_count < chan->max_tx) {
2761 l2cap_send_rr_or_rnr(chan, 1);
2762 __set_monitor_timer(chan);
2763 chan->retry_count++;
2764 } else {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02002765 l2cap_send_disconn_req(chan, ECONNABORTED);
Mat Martineau608bcc62012-05-17 20:53:32 -07002766 }
2767 break;
2768 default:
2769 break;
2770 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002771}
2772
Gustavo Padovand6603662012-05-21 13:58:22 -03002773static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
2774 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002775{
Mat Martineau608bcc62012-05-17 20:53:32 -07002776 BT_DBG("chan %p, control %p, skbs %p, event %d, state %d",
2777 chan, control, skbs, event, chan->tx_state);
2778
2779 switch (chan->tx_state) {
2780 case L2CAP_TX_STATE_XMIT:
Gustavo Padovand6603662012-05-21 13:58:22 -03002781 l2cap_tx_state_xmit(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002782 break;
2783 case L2CAP_TX_STATE_WAIT_F:
Gustavo Padovand6603662012-05-21 13:58:22 -03002784 l2cap_tx_state_wait_f(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002785 break;
2786 default:
2787 /* Ignore event */
2788 break;
2789 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002790}
2791
Mat Martineau4b51dae92012-05-17 20:53:37 -07002792static void l2cap_pass_to_tx(struct l2cap_chan *chan,
2793 struct l2cap_ctrl *control)
2794{
2795 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002796 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_REQSEQ_AND_FBIT);
Mat Martineau4b51dae92012-05-17 20:53:37 -07002797}
2798
Mat Martineauf80842a2012-05-17 20:53:46 -07002799static void l2cap_pass_to_tx_fbit(struct l2cap_chan *chan,
2800 struct l2cap_ctrl *control)
2801{
2802 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002803 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_FBIT);
Mat Martineauf80842a2012-05-17 20:53:46 -07002804}
2805
Linus Torvalds1da177e2005-04-16 15:20:36 -07002806/* Copy frame to all raw sockets on that connection */
2807static void l2cap_raw_recv(struct l2cap_conn *conn, struct sk_buff *skb)
2808{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002809 struct sk_buff *nskb;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03002810 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002811
2812 BT_DBG("conn %p", conn);
2813
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002814 mutex_lock(&conn->chan_lock);
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002815
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002816 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002817 if (chan->chan_type != L2CAP_CHAN_RAW)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002818 continue;
2819
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002820 /* Don't send frame to the channel it came from */
2821 if (bt_cb(skb)->chan == chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002822 continue;
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002823
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002824 nskb = skb_clone(skb, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03002825 if (!nskb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002826 continue;
Gustavo Padovan80b98022012-05-27 22:27:51 -03002827 if (chan->ops->recv(chan, nskb))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002828 kfree_skb(nskb);
2829 }
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002830
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002831 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002832}
2833
2834/* ---- L2CAP signalling commands ---- */
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002835static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn, u8 code,
2836 u8 ident, u16 dlen, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002837{
2838 struct sk_buff *skb, **frag;
2839 struct l2cap_cmd_hdr *cmd;
2840 struct l2cap_hdr *lh;
2841 int len, count;
2842
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002843 BT_DBG("conn %p, code 0x%2.2x, ident 0x%2.2x, len %u",
2844 conn, code, ident, dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002845
Anderson Lizardo300b9622013-06-02 16:30:40 -04002846 if (conn->mtu < L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE)
2847 return NULL;
2848
Linus Torvalds1da177e2005-04-16 15:20:36 -07002849 len = L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE + dlen;
2850 count = min_t(unsigned int, conn->mtu, len);
2851
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002852 skb = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002853 if (!skb)
2854 return NULL;
2855
2856 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002857 lh->len = cpu_to_le16(L2CAP_CMD_HDR_SIZE + dlen);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002858
2859 if (conn->hcon->type == LE_LINK)
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002860 lh->cid = cpu_to_le16(L2CAP_CID_LE_SIGNALING);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002861 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002862 lh->cid = cpu_to_le16(L2CAP_CID_SIGNALING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002863
2864 cmd = (struct l2cap_cmd_hdr *) skb_put(skb, L2CAP_CMD_HDR_SIZE);
2865 cmd->code = code;
2866 cmd->ident = ident;
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002867 cmd->len = cpu_to_le16(dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002868
2869 if (dlen) {
2870 count -= L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE;
2871 memcpy(skb_put(skb, count), data, count);
2872 data += count;
2873 }
2874
2875 len -= skb->len;
2876
2877 /* Continuation fragments (no L2CAP header) */
2878 frag = &skb_shinfo(skb)->frag_list;
2879 while (len) {
2880 count = min_t(unsigned int, conn->mtu, len);
2881
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002882 *frag = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002883 if (!*frag)
2884 goto fail;
2885
2886 memcpy(skb_put(*frag, count), data, count);
2887
2888 len -= count;
2889 data += count;
2890
2891 frag = &(*frag)->next;
2892 }
2893
2894 return skb;
2895
2896fail:
2897 kfree_skb(skb);
2898 return NULL;
2899}
2900
Gustavo Padovan2d792812012-10-06 10:07:01 +01002901static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen,
2902 unsigned long *val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002903{
2904 struct l2cap_conf_opt *opt = *ptr;
2905 int len;
2906
2907 len = L2CAP_CONF_OPT_SIZE + opt->len;
2908 *ptr += len;
2909
2910 *type = opt->type;
2911 *olen = opt->len;
2912
2913 switch (opt->len) {
2914 case 1:
2915 *val = *((u8 *) opt->val);
2916 break;
2917
2918 case 2:
steven miaobfaaeb32010-10-16 18:29:47 -04002919 *val = get_unaligned_le16(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002920 break;
2921
2922 case 4:
steven miaobfaaeb32010-10-16 18:29:47 -04002923 *val = get_unaligned_le32(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002924 break;
2925
2926 default:
2927 *val = (unsigned long) opt->val;
2928 break;
2929 }
2930
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002931 BT_DBG("type 0x%2.2x len %u val 0x%lx", *type, opt->len, *val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002932 return len;
2933}
2934
Linus Torvalds1da177e2005-04-16 15:20:36 -07002935static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val)
2936{
2937 struct l2cap_conf_opt *opt = *ptr;
2938
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002939 BT_DBG("type 0x%2.2x len %u val 0x%lx", type, len, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002940
2941 opt->type = type;
2942 opt->len = len;
2943
2944 switch (len) {
2945 case 1:
2946 *((u8 *) opt->val) = val;
2947 break;
2948
2949 case 2:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02002950 put_unaligned_le16(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002951 break;
2952
2953 case 4:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02002954 put_unaligned_le32(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002955 break;
2956
2957 default:
2958 memcpy(opt->val, (void *) val, len);
2959 break;
2960 }
2961
2962 *ptr += L2CAP_CONF_OPT_SIZE + len;
2963}
2964
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03002965static void l2cap_add_opt_efs(void **ptr, struct l2cap_chan *chan)
2966{
2967 struct l2cap_conf_efs efs;
2968
Szymon Janc1ec918c2011-11-16 09:32:21 +01002969 switch (chan->mode) {
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03002970 case L2CAP_MODE_ERTM:
2971 efs.id = chan->local_id;
2972 efs.stype = chan->local_stype;
2973 efs.msdu = cpu_to_le16(chan->local_msdu);
2974 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002975 efs.acc_lat = cpu_to_le32(L2CAP_DEFAULT_ACC_LAT);
2976 efs.flush_to = cpu_to_le32(L2CAP_EFS_DEFAULT_FLUSH_TO);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03002977 break;
2978
2979 case L2CAP_MODE_STREAMING:
2980 efs.id = 1;
2981 efs.stype = L2CAP_SERV_BESTEFFORT;
2982 efs.msdu = cpu_to_le16(chan->local_msdu);
2983 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
2984 efs.acc_lat = 0;
2985 efs.flush_to = 0;
2986 break;
2987
2988 default:
2989 return;
2990 }
2991
2992 l2cap_add_conf_opt(ptr, L2CAP_CONF_EFS, sizeof(efs),
Andrei Emeltchenko8936fa62012-10-08 11:14:41 +03002993 (unsigned long) &efs);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03002994}
2995
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03002996static void l2cap_ack_timeout(struct work_struct *work)
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03002997{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03002998 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau03625202012-05-17 20:53:51 -07002999 ack_timer.work);
3000 u16 frames_to_ack;
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003001
Gustavo F. Padovan2fb9b3d2011-12-22 16:56:05 -02003002 BT_DBG("chan %p", chan);
3003
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003004 l2cap_chan_lock(chan);
3005
Mat Martineau03625202012-05-17 20:53:51 -07003006 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
3007 chan->last_acked_seq);
3008
3009 if (frames_to_ack)
3010 l2cap_send_rr_or_rnr(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003011
3012 l2cap_chan_unlock(chan);
Szymon Janc09bfb2e2012-01-11 10:59:49 +01003013 l2cap_chan_put(chan);
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003014}
3015
Andrei Emeltchenko466f8002012-05-29 13:59:01 +03003016int l2cap_ertm_init(struct l2cap_chan *chan)
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003017{
Mat Martineau3c588192012-04-11 10:48:42 -07003018 int err;
3019
Mat Martineau105bdf92012-04-27 16:50:48 -07003020 chan->next_tx_seq = 0;
3021 chan->expected_tx_seq = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003022 chan->expected_ack_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003023 chan->unacked_frames = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003024 chan->buffer_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003025 chan->frames_sent = 0;
Mat Martineau105bdf92012-04-27 16:50:48 -07003026 chan->last_acked_seq = 0;
3027 chan->sdu = NULL;
3028 chan->sdu_last_frag = NULL;
3029 chan->sdu_len = 0;
3030
Mat Martineaud34c34f2012-05-14 14:49:27 -07003031 skb_queue_head_init(&chan->tx_q);
3032
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003033 chan->local_amp_id = AMP_ID_BREDR;
3034 chan->move_id = AMP_ID_BREDR;
Mat Martineau08333282012-10-23 15:24:06 -07003035 chan->move_state = L2CAP_MOVE_STABLE;
3036 chan->move_role = L2CAP_MOVE_ROLE_NONE;
3037
Mat Martineau105bdf92012-04-27 16:50:48 -07003038 if (chan->mode != L2CAP_MODE_ERTM)
3039 return 0;
3040
3041 chan->rx_state = L2CAP_RX_STATE_RECV;
3042 chan->tx_state = L2CAP_TX_STATE_XMIT;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003043
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003044 INIT_DELAYED_WORK(&chan->retrans_timer, l2cap_retrans_timeout);
3045 INIT_DELAYED_WORK(&chan->monitor_timer, l2cap_monitor_timeout);
3046 INIT_DELAYED_WORK(&chan->ack_timer, l2cap_ack_timeout);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003047
Gustavo F. Padovanf1c67752011-03-25 20:36:10 -03003048 skb_queue_head_init(&chan->srej_q);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03003049
Mat Martineau3c588192012-04-11 10:48:42 -07003050 err = l2cap_seq_list_init(&chan->srej_list, chan->tx_win);
3051 if (err < 0)
3052 return err;
3053
Mat Martineau9dc9aff2012-05-17 16:20:14 -07003054 err = l2cap_seq_list_init(&chan->retrans_list, chan->remote_tx_win);
3055 if (err < 0)
3056 l2cap_seq_list_free(&chan->srej_list);
3057
3058 return err;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003059}
3060
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003061static inline __u8 l2cap_select_mode(__u8 mode, __u16 remote_feat_mask)
3062{
3063 switch (mode) {
3064 case L2CAP_MODE_STREAMING:
3065 case L2CAP_MODE_ERTM:
3066 if (l2cap_mode_supported(mode, remote_feat_mask))
3067 return mode;
3068 /* fall through */
3069 default:
3070 return L2CAP_MODE_BASIC;
3071 }
3072}
3073
Marcel Holtmann848566b2013-10-01 22:59:22 -07003074static inline bool __l2cap_ews_supported(struct l2cap_conn *conn)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003075{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003076 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003077}
3078
Marcel Holtmann848566b2013-10-01 22:59:22 -07003079static inline bool __l2cap_efs_supported(struct l2cap_conn *conn)
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003080{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003081 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_FLOW;
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003082}
3083
Mat Martineau36c86c82012-10-23 15:24:20 -07003084static void __l2cap_set_ertm_timeouts(struct l2cap_chan *chan,
3085 struct l2cap_conf_rfc *rfc)
3086{
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003087 if (chan->local_amp_id != AMP_ID_BREDR && chan->hs_hcon) {
Mat Martineau36c86c82012-10-23 15:24:20 -07003088 u64 ertm_to = chan->hs_hcon->hdev->amp_be_flush_to;
3089
3090 /* Class 1 devices have must have ERTM timeouts
3091 * exceeding the Link Supervision Timeout. The
3092 * default Link Supervision Timeout for AMP
3093 * controllers is 10 seconds.
3094 *
3095 * Class 1 devices use 0xffffffff for their
3096 * best-effort flush timeout, so the clamping logic
3097 * will result in a timeout that meets the above
3098 * requirement. ERTM timeouts are 16-bit values, so
3099 * the maximum timeout is 65.535 seconds.
3100 */
3101
3102 /* Convert timeout to milliseconds and round */
3103 ertm_to = DIV_ROUND_UP_ULL(ertm_to, 1000);
3104
3105 /* This is the recommended formula for class 2 devices
3106 * that start ERTM timers when packets are sent to the
3107 * controller.
3108 */
3109 ertm_to = 3 * ertm_to + 500;
3110
3111 if (ertm_to > 0xffff)
3112 ertm_to = 0xffff;
3113
3114 rfc->retrans_timeout = cpu_to_le16((u16) ertm_to);
3115 rfc->monitor_timeout = rfc->retrans_timeout;
3116 } else {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003117 rfc->retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO);
3118 rfc->monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO);
Mat Martineau36c86c82012-10-23 15:24:20 -07003119 }
3120}
3121
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003122static inline void l2cap_txwin_setup(struct l2cap_chan *chan)
3123{
3124 if (chan->tx_win > L2CAP_DEFAULT_TX_WINDOW &&
Marcel Holtmann848566b2013-10-01 22:59:22 -07003125 __l2cap_ews_supported(chan->conn)) {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003126 /* use extended control field */
3127 set_bit(FLAG_EXT_CTRL, &chan->flags);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003128 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
3129 } else {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003130 chan->tx_win = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003131 L2CAP_DEFAULT_TX_WINDOW);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003132 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
3133 }
Mat Martineauc20f8e32012-07-10 05:47:07 -07003134 chan->ack_win = chan->tx_win;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003135}
3136
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003137static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003138{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003139 struct l2cap_conf_req *req = data;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003140 struct l2cap_conf_rfc rfc = { .mode = chan->mode };
Linus Torvalds1da177e2005-04-16 15:20:36 -07003141 void *ptr = req->data;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003142 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003143
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03003144 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003145
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003146 if (chan->num_conf_req || chan->num_conf_rsp)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003147 goto done;
3148
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003149 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003150 case L2CAP_MODE_STREAMING:
3151 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003152 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state))
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003153 break;
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003154
Marcel Holtmann848566b2013-10-01 22:59:22 -07003155 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003156 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3157
Gustavo F. Padovan2ba13ed2010-06-09 16:39:05 -03003158 /* fall through */
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003159 default:
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003160 chan->mode = l2cap_select_mode(rfc.mode, chan->conn->feat_mask);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003161 break;
3162 }
3163
3164done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003165 if (chan->imtu != L2CAP_DEFAULT_MTU)
3166 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovan7990681c2011-01-24 16:01:43 -02003167
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003168 switch (chan->mode) {
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003169 case L2CAP_MODE_BASIC:
Marcel Holtmann6fea7ad2014-07-09 11:53:35 +02003170 if (disable_ertm)
3171 break;
3172
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003173 if (!(chan->conn->feat_mask & L2CAP_FEAT_ERTM) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003174 !(chan->conn->feat_mask & L2CAP_FEAT_STREAMING))
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003175 break;
3176
Gustavo F. Padovan62547752010-06-08 20:05:31 -03003177 rfc.mode = L2CAP_MODE_BASIC;
3178 rfc.txwin_size = 0;
3179 rfc.max_transmit = 0;
3180 rfc.retrans_timeout = 0;
3181 rfc.monitor_timeout = 0;
3182 rfc.max_pdu_size = 0;
3183
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003184 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003185 (unsigned long) &rfc);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003186 break;
3187
3188 case L2CAP_MODE_ERTM:
3189 rfc.mode = L2CAP_MODE_ERTM;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003190 rfc.max_transmit = chan->max_tx;
Mat Martineau36c86c82012-10-23 15:24:20 -07003191
3192 __l2cap_set_ertm_timeouts(chan, &rfc);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003193
3194 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003195 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3196 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003197 rfc.max_pdu_size = cpu_to_le16(size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003198
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003199 l2cap_txwin_setup(chan);
3200
3201 rfc.txwin_size = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003202 L2CAP_DEFAULT_TX_WINDOW);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003203
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003204 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003205 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003206
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003207 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3208 l2cap_add_opt_efs(&ptr, chan);
3209
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003210 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3211 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003212 chan->tx_win);
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003213
3214 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3215 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003216 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003217 chan->fcs = L2CAP_FCS_NONE;
3218 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3219 chan->fcs);
3220 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003221 break;
3222
3223 case L2CAP_MODE_STREAMING:
Mat Martineau273759e2012-05-17 20:53:53 -07003224 l2cap_txwin_setup(chan);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003225 rfc.mode = L2CAP_MODE_STREAMING;
3226 rfc.txwin_size = 0;
3227 rfc.max_transmit = 0;
3228 rfc.retrans_timeout = 0;
3229 rfc.monitor_timeout = 0;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003230
3231 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003232 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3233 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003234 rfc.max_pdu_size = cpu_to_le16(size);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003235
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003236 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003237 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003238
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003239 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3240 l2cap_add_opt_efs(&ptr, chan);
3241
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003242 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3243 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003244 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003245 chan->fcs = L2CAP_FCS_NONE;
3246 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3247 chan->fcs);
3248 }
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003249 break;
3250 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003251
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003252 req->dcid = cpu_to_le16(chan->dcid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003253 req->flags = cpu_to_le16(0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003254
3255 return ptr - data;
3256}
3257
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003258static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003259{
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003260 struct l2cap_conf_rsp *rsp = data;
3261 void *ptr = rsp->data;
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003262 void *req = chan->conf_req;
3263 int len = chan->conf_len;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003264 int type, hint, olen;
3265 unsigned long val;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003266 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003267 struct l2cap_conf_efs efs;
3268 u8 remote_efs = 0;
Marcel Holtmann861d6882007-10-20 13:37:06 +02003269 u16 mtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003270 u16 result = L2CAP_CONF_SUCCESS;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003271 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003272
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003273 BT_DBG("chan %p", chan);
Marcel Holtmann820ae1b2006-11-18 22:15:00 +01003274
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003275 while (len >= L2CAP_CONF_OPT_SIZE) {
3276 len -= l2cap_get_conf_opt(&req, &type, &olen, &val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003277
Gustavo F. Padovan589d2742009-04-20 01:31:07 -03003278 hint = type & L2CAP_CONF_HINT;
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07003279 type &= L2CAP_CONF_MASK;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003280
3281 switch (type) {
3282 case L2CAP_CONF_MTU:
Marcel Holtmann861d6882007-10-20 13:37:06 +02003283 mtu = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003284 break;
3285
3286 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003287 chan->flush_to = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003288 break;
3289
3290 case L2CAP_CONF_QOS:
3291 break;
3292
Marcel Holtmann6464f352007-10-20 13:39:51 +02003293 case L2CAP_CONF_RFC:
3294 if (olen == sizeof(rfc))
3295 memcpy(&rfc, (void *) val, olen);
3296 break;
3297
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003298 case L2CAP_CONF_FCS:
3299 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003300 set_bit(CONF_RECV_NO_FCS, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003301 break;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003302
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003303 case L2CAP_CONF_EFS:
3304 remote_efs = 1;
3305 if (olen == sizeof(efs))
3306 memcpy(&efs, (void *) val, olen);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003307 break;
3308
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003309 case L2CAP_CONF_EWS:
Marcel Holtmann848566b2013-10-01 22:59:22 -07003310 if (!chan->conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003311 return -ECONNREFUSED;
3312
3313 set_bit(FLAG_EXT_CTRL, &chan->flags);
3314 set_bit(CONF_EWS_RECV, &chan->conf_state);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003315 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003316 chan->remote_tx_win = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003317 break;
3318
3319 default:
3320 if (hint)
3321 break;
3322
3323 result = L2CAP_CONF_UNKNOWN;
3324 *((u8 *) ptr++) = type;
3325 break;
3326 }
3327 }
3328
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003329 if (chan->num_conf_rsp || chan->num_conf_req > 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003330 goto done;
3331
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003332 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003333 case L2CAP_MODE_STREAMING:
3334 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003335 if (!test_bit(CONF_STATE2_DEVICE, &chan->conf_state)) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003336 chan->mode = l2cap_select_mode(rfc.mode,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003337 chan->conn->feat_mask);
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003338 break;
3339 }
3340
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003341 if (remote_efs) {
Marcel Holtmann848566b2013-10-01 22:59:22 -07003342 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003343 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3344 else
3345 return -ECONNREFUSED;
3346 }
3347
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003348 if (chan->mode != rfc.mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003349 return -ECONNREFUSED;
Gustavo F. Padovan742e5192010-06-08 19:09:48 -03003350
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003351 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003352 }
3353
3354done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003355 if (chan->mode != rfc.mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003356 result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003357 rfc.mode = chan->mode;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003358
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003359 if (chan->num_conf_rsp == 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003360 return -ECONNREFUSED;
3361
Gustavo Padovan2d792812012-10-06 10:07:01 +01003362 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3363 (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003364 }
3365
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003366 if (result == L2CAP_CONF_SUCCESS) {
3367 /* Configure output options and let the other side know
3368 * which ones we don't like. */
3369
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003370 if (mtu < L2CAP_DEFAULT_MIN_MTU)
3371 result = L2CAP_CONF_UNACCEPT;
3372 else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003373 chan->omtu = mtu;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003374 set_bit(CONF_MTU_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003375 }
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003376 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->omtu);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003377
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003378 if (remote_efs) {
3379 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003380 efs.stype != L2CAP_SERV_NOTRAFIC &&
3381 efs.stype != chan->local_stype) {
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003382
3383 result = L2CAP_CONF_UNACCEPT;
3384
3385 if (chan->num_conf_req >= 1)
3386 return -ECONNREFUSED;
3387
3388 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003389 sizeof(efs),
3390 (unsigned long) &efs);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003391 } else {
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003392 /* Send PENDING Conf Rsp */
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003393 result = L2CAP_CONF_PENDING;
3394 set_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003395 }
3396 }
3397
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003398 switch (rfc.mode) {
3399 case L2CAP_MODE_BASIC:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003400 chan->fcs = L2CAP_FCS_NONE;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003401 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003402 break;
3403
3404 case L2CAP_MODE_ERTM:
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003405 if (!test_bit(CONF_EWS_RECV, &chan->conf_state))
3406 chan->remote_tx_win = rfc.txwin_size;
3407 else
3408 rfc.txwin_size = L2CAP_DEFAULT_TX_WINDOW;
3409
Gustavo F. Padovan2c03a7a2011-03-25 20:15:28 -03003410 chan->remote_max_tx = rfc.max_transmit;
Mat Martineau86b1b262010-08-05 15:54:22 -07003411
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003412 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003413 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3414 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003415 rfc.max_pdu_size = cpu_to_le16(size);
3416 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003417
Mat Martineau36c86c82012-10-23 15:24:20 -07003418 __l2cap_set_ertm_timeouts(chan, &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003419
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003420 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003421
3422 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003423 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003424
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003425 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3426 chan->remote_id = efs.id;
3427 chan->remote_stype = efs.stype;
3428 chan->remote_msdu = le16_to_cpu(efs.msdu);
3429 chan->remote_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003430 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003431 chan->remote_acc_lat =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003432 le32_to_cpu(efs.acc_lat);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003433 chan->remote_sdu_itime =
3434 le32_to_cpu(efs.sdu_itime);
3435 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003436 sizeof(efs),
3437 (unsigned long) &efs);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003438 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003439 break;
3440
3441 case L2CAP_MODE_STREAMING:
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003442 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003443 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3444 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003445 rfc.max_pdu_size = cpu_to_le16(size);
3446 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003447
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003448 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003449
Gustavo Padovan2d792812012-10-06 10:07:01 +01003450 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3451 (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003452
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003453 break;
3454
3455 default:
Marcel Holtmann6464f352007-10-20 13:39:51 +02003456 result = L2CAP_CONF_UNACCEPT;
3457
3458 memset(&rfc, 0, sizeof(rfc));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003459 rfc.mode = chan->mode;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003460 }
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003461
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003462 if (result == L2CAP_CONF_SUCCESS)
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003463 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003464 }
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003465 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003466 rsp->result = cpu_to_le16(result);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003467 rsp->flags = cpu_to_le16(0);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003468
3469 return ptr - data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003470}
3471
Gustavo Padovan2d792812012-10-06 10:07:01 +01003472static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len,
3473 void *data, u16 *result)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003474{
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003475 struct l2cap_conf_req *req = data;
3476 void *ptr = req->data;
3477 int type, olen;
3478 unsigned long val;
Mat Martineau36e999a2011-12-08 17:23:21 -08003479 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003480 struct l2cap_conf_efs efs;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003481
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003482 BT_DBG("chan %p, rsp %p, len %d, req %p", chan, rsp, len, data);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003483
3484 while (len >= L2CAP_CONF_OPT_SIZE) {
3485 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3486
3487 switch (type) {
3488 case L2CAP_CONF_MTU:
3489 if (val < L2CAP_DEFAULT_MIN_MTU) {
3490 *result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003491 chan->imtu = L2CAP_DEFAULT_MIN_MTU;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003492 } else
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003493 chan->imtu = val;
3494 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003495 break;
3496
3497 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003498 chan->flush_to = val;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003499 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003500 2, chan->flush_to);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003501 break;
3502
3503 case L2CAP_CONF_RFC:
3504 if (olen == sizeof(rfc))
3505 memcpy(&rfc, (void *)val, olen);
3506
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003507 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003508 rfc.mode != chan->mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003509 return -ECONNREFUSED;
3510
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003511 chan->fcs = 0;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003512
3513 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003514 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003515 break;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003516
3517 case L2CAP_CONF_EWS:
Mat Martineauc20f8e32012-07-10 05:47:07 -07003518 chan->ack_win = min_t(u16, val, chan->ack_win);
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003519 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Mat Martineauc20f8e32012-07-10 05:47:07 -07003520 chan->tx_win);
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003521 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003522
3523 case L2CAP_CONF_EFS:
3524 if (olen == sizeof(efs))
3525 memcpy(&efs, (void *)val, olen);
3526
3527 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003528 efs.stype != L2CAP_SERV_NOTRAFIC &&
3529 efs.stype != chan->local_stype)
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003530 return -ECONNREFUSED;
3531
Gustavo Padovan2d792812012-10-06 10:07:01 +01003532 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS, sizeof(efs),
3533 (unsigned long) &efs);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003534 break;
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003535
3536 case L2CAP_CONF_FCS:
3537 if (*result == L2CAP_CONF_PENDING)
3538 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003539 set_bit(CONF_RECV_NO_FCS,
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003540 &chan->conf_state);
3541 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003542 }
3543 }
3544
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003545 if (chan->mode == L2CAP_MODE_BASIC && chan->mode != rfc.mode)
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003546 return -ECONNREFUSED;
3547
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003548 chan->mode = rfc.mode;
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003549
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003550 if (*result == L2CAP_CONF_SUCCESS || *result == L2CAP_CONF_PENDING) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003551 switch (rfc.mode) {
3552 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003553 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3554 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
3555 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003556 if (!test_bit(FLAG_EXT_CTRL, &chan->flags))
3557 chan->ack_win = min_t(u16, chan->ack_win,
3558 rfc.txwin_size);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003559
3560 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3561 chan->local_msdu = le16_to_cpu(efs.msdu);
3562 chan->local_sdu_itime =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003563 le32_to_cpu(efs.sdu_itime);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003564 chan->local_acc_lat = le32_to_cpu(efs.acc_lat);
3565 chan->local_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003566 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003567 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003568 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003569
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003570 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003571 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003572 }
3573 }
3574
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003575 req->dcid = cpu_to_le16(chan->dcid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003576 req->flags = cpu_to_le16(0);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003577
3578 return ptr - data;
3579}
3580
Gustavo Padovan2d792812012-10-06 10:07:01 +01003581static int l2cap_build_conf_rsp(struct l2cap_chan *chan, void *data,
3582 u16 result, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003583{
3584 struct l2cap_conf_rsp *rsp = data;
3585 void *ptr = rsp->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003586
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003587 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003588
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003589 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003590 rsp->result = cpu_to_le16(result);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003591 rsp->flags = cpu_to_le16(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003592
3593 return ptr - data;
3594}
3595
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003596void __l2cap_le_connect_rsp_defer(struct l2cap_chan *chan)
3597{
3598 struct l2cap_le_conn_rsp rsp;
3599 struct l2cap_conn *conn = chan->conn;
3600
3601 BT_DBG("chan %p", chan);
3602
3603 rsp.dcid = cpu_to_le16(chan->scid);
3604 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02003605 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03003606 rsp.credits = cpu_to_le16(chan->rx_credits);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003607 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003608
3609 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp),
3610 &rsp);
3611}
3612
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003613void __l2cap_connect_rsp_defer(struct l2cap_chan *chan)
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003614{
3615 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003616 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003617 u8 buf[128];
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003618 u8 rsp_code;
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003619
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003620 rsp.scid = cpu_to_le16(chan->dcid);
3621 rsp.dcid = cpu_to_le16(chan->scid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003622 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
3623 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003624
3625 if (chan->hs_hcon)
3626 rsp_code = L2CAP_CREATE_CHAN_RSP;
3627 else
3628 rsp_code = L2CAP_CONN_RSP;
3629
3630 BT_DBG("chan %p rsp_code %u", chan, rsp_code);
3631
3632 l2cap_send_cmd(conn, chan->ident, rsp_code, sizeof(rsp), &rsp);
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003633
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003634 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003635 return;
3636
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003637 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003638 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003639 chan->num_conf_req++;
3640}
3641
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003642static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len)
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003643{
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003644 int type, olen;
3645 unsigned long val;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003646 /* Use sane default values in case a misbehaving remote device
3647 * did not send an RFC or extended window size option.
3648 */
3649 u16 txwin_ext = chan->ack_win;
3650 struct l2cap_conf_rfc rfc = {
3651 .mode = chan->mode,
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003652 .retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO),
3653 .monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO),
Mat Martineauc20f8e32012-07-10 05:47:07 -07003654 .max_pdu_size = cpu_to_le16(chan->imtu),
3655 .txwin_size = min_t(u16, chan->ack_win, L2CAP_DEFAULT_TX_WINDOW),
3656 };
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003657
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003658 BT_DBG("chan %p, rsp %p, len %d", chan, rsp, len);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003659
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003660 if ((chan->mode != L2CAP_MODE_ERTM) && (chan->mode != L2CAP_MODE_STREAMING))
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003661 return;
3662
3663 while (len >= L2CAP_CONF_OPT_SIZE) {
3664 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3665
Mat Martineauc20f8e32012-07-10 05:47:07 -07003666 switch (type) {
3667 case L2CAP_CONF_RFC:
3668 if (olen == sizeof(rfc))
3669 memcpy(&rfc, (void *)val, olen);
Szymon Janc8f321f82012-06-08 11:33:33 +02003670 break;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003671 case L2CAP_CONF_EWS:
3672 txwin_ext = val;
3673 break;
3674 }
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003675 }
3676
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003677 switch (rfc.mode) {
3678 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003679 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3680 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003681 chan->mps = le16_to_cpu(rfc.max_pdu_size);
3682 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3683 chan->ack_win = min_t(u16, chan->ack_win, txwin_ext);
3684 else
3685 chan->ack_win = min_t(u16, chan->ack_win,
3686 rfc.txwin_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003687 break;
3688 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003689 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003690 }
3691}
3692
Gustavo Padovan2d792812012-10-06 10:07:01 +01003693static inline int l2cap_command_rej(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003694 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3695 u8 *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003696{
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003697 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003698
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003699 if (cmd_len < sizeof(*rej))
3700 return -EPROTO;
3701
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003702 if (rej->reason != L2CAP_REJ_NOT_UNDERSTOOD)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003703 return 0;
3704
3705 if ((conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003706 cmd->ident == conn->info_ident) {
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02003707 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann984947d2009-02-06 23:35:19 +01003708
3709 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01003710 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01003711
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003712 l2cap_conn_start(conn);
3713 }
3714
3715 return 0;
3716}
3717
Mat Martineau17009152012-10-23 15:24:07 -07003718static struct l2cap_chan *l2cap_connect(struct l2cap_conn *conn,
3719 struct l2cap_cmd_hdr *cmd,
3720 u8 *data, u8 rsp_code, u8 amp_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003721{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003722 struct l2cap_conn_req *req = (struct l2cap_conn_req *) data;
3723 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003724 struct l2cap_chan *chan = NULL, *pchan;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003725 int result, status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003726
3727 u16 dcid = 0, scid = __le16_to_cpu(req->scid);
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003728 __le16 psm = req->psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003729
Andrei Emeltchenko097db762012-03-09 14:16:17 +02003730 BT_DBG("psm 0x%2.2x scid 0x%4.4x", __le16_to_cpu(psm), scid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003731
3732 /* Check if we have socket listening on psm */
Marcel Holtmann6f59b902013-10-13 05:24:01 -07003733 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03003734 &conn->hcon->dst, ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003735 if (!pchan) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003736 result = L2CAP_CR_BAD_PSM;
3737 goto sendresp;
3738 }
3739
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003740 mutex_lock(&conn->chan_lock);
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003741 l2cap_chan_lock(pchan);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00003742
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003743 /* Check if the ACL is secure enough (if not SDP) */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003744 if (psm != cpu_to_le16(L2CAP_PSM_SDP) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003745 !hci_conn_check_link_mode(conn->hcon)) {
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02003746 conn->disc_reason = HCI_ERROR_AUTH_FAILURE;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003747 result = L2CAP_CR_SEC_BLOCK;
3748 goto response;
3749 }
3750
Linus Torvalds1da177e2005-04-16 15:20:36 -07003751 result = L2CAP_CR_NO_MEM;
3752
Gustavo Padovan2dfa1002012-05-27 22:27:58 -03003753 /* Check if we already have channel with that dcid */
3754 if (__l2cap_get_chan_by_dcid(conn, scid))
3755 goto response;
3756
Gustavo Padovan80b98022012-05-27 22:27:51 -03003757 chan = pchan->ops->new_connection(pchan);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03003758 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003759 goto response;
3760
Syam Sidhardhan330b6c12013-08-06 01:59:12 +09003761 /* For certain devices (ex: HID mouse), support for authentication,
3762 * pairing and bonding is optional. For such devices, inorder to avoid
3763 * the ACL alive for too long after L2CAP disconnection, reset the ACL
3764 * disc_timeout back to HCI_DISCONN_TIMEOUT during L2CAP connect.
3765 */
3766 conn->hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
3767
Marcel Holtmann7eafc592013-10-13 08:12:47 -07003768 bacpy(&chan->src, &conn->hcon->src);
3769 bacpy(&chan->dst, &conn->hcon->dst);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -07003770 chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type);
3771 chan->dst_type = bdaddr_type(conn->hcon, conn->hcon->dst_type);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003772 chan->psm = psm;
3773 chan->dcid = scid;
Mat Martineau17009152012-10-23 15:24:07 -07003774 chan->local_amp_id = amp_id;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003775
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003776 __l2cap_chan_add(conn, chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003777
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003778 dcid = chan->scid;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003779
Gustavo Padovan8d836d72013-10-15 19:24:47 -03003780 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003781
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003782 chan->ident = cmd->ident;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003783
Marcel Holtmann984947d2009-02-06 23:35:19 +01003784 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) {
Johan Hedberge7cafc42014-07-17 15:35:38 +03003785 if (l2cap_chan_check_security(chan, false)) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07003786 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003787 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003788 result = L2CAP_CR_PEND;
3789 status = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08003790 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003791 } else {
Mat Martineau17009152012-10-23 15:24:07 -07003792 /* Force pending result for AMP controllers.
3793 * The connection will succeed after the
3794 * physical link is up.
3795 */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003796 if (amp_id == AMP_ID_BREDR) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003797 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau17009152012-10-23 15:24:07 -07003798 result = L2CAP_CR_SUCCESS;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003799 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003800 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003801 result = L2CAP_CR_PEND;
Mat Martineau17009152012-10-23 15:24:07 -07003802 }
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003803 status = L2CAP_CS_NO_INFO;
3804 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003805 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003806 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003807 result = L2CAP_CR_PEND;
3808 status = L2CAP_CS_AUTHEN_PEND;
3809 }
3810 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003811 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003812 result = L2CAP_CR_PEND;
3813 status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003814 }
3815
Linus Torvalds1da177e2005-04-16 15:20:36 -07003816response:
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003817 l2cap_chan_unlock(pchan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003818 mutex_unlock(&conn->chan_lock);
Johan Hedberga24cce12014-08-07 22:56:42 +03003819 l2cap_chan_put(pchan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003820
3821sendresp:
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003822 rsp.scid = cpu_to_le16(scid);
3823 rsp.dcid = cpu_to_le16(dcid);
3824 rsp.result = cpu_to_le16(result);
3825 rsp.status = cpu_to_le16(status);
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003826 l2cap_send_cmd(conn, cmd->ident, rsp_code, sizeof(rsp), &rsp);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003827
3828 if (result == L2CAP_CR_PEND && status == L2CAP_CS_NO_INFO) {
3829 struct l2cap_info_req info;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003830 info.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003831
3832 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
3833 conn->info_ident = l2cap_get_ident(conn);
3834
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08003835 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003836
Gustavo Padovan2d792812012-10-06 10:07:01 +01003837 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
3838 sizeof(info), &info);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003839 }
3840
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003841 if (chan && !test_bit(CONF_REQ_SENT, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003842 result == L2CAP_CR_SUCCESS) {
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003843 u8 buf[128];
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003844 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003845 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003846 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003847 chan->num_conf_req++;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003848 }
Mat Martineau17009152012-10-23 15:24:07 -07003849
3850 return chan;
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003851}
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003852
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003853static int l2cap_connect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003854 struct l2cap_cmd_hdr *cmd, u16 cmd_len, u8 *data)
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003855{
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303856 struct hci_dev *hdev = conn->hcon->hdev;
3857 struct hci_conn *hcon = conn->hcon;
3858
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003859 if (cmd_len < sizeof(struct l2cap_conn_req))
3860 return -EPROTO;
3861
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303862 hci_dev_lock(hdev);
3863 if (test_bit(HCI_MGMT, &hdev->dev_flags) &&
3864 !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &hcon->flags))
3865 mgmt_device_connected(hdev, &hcon->dst, hcon->type,
3866 hcon->dst_type, 0, NULL, 0,
3867 hcon->dev_class);
3868 hci_dev_unlock(hdev);
3869
Gustavo Padovan300229f2012-10-12 19:40:40 +08003870 l2cap_connect(conn, cmd, data, L2CAP_CONN_RSP, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003871 return 0;
3872}
3873
Mat Martineau5909cf32012-10-23 15:24:08 -07003874static int l2cap_connect_create_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003875 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3876 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003877{
3878 struct l2cap_conn_rsp *rsp = (struct l2cap_conn_rsp *) data;
3879 u16 scid, dcid, result, status;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003880 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003881 u8 req[128];
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003882 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003883
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003884 if (cmd_len < sizeof(*rsp))
3885 return -EPROTO;
3886
Linus Torvalds1da177e2005-04-16 15:20:36 -07003887 scid = __le16_to_cpu(rsp->scid);
3888 dcid = __le16_to_cpu(rsp->dcid);
3889 result = __le16_to_cpu(rsp->result);
3890 status = __le16_to_cpu(rsp->status);
3891
Andrei Emeltchenko1b009c92012-02-21 12:54:54 +02003892 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 +01003893 dcid, scid, result, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003894
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003895 mutex_lock(&conn->chan_lock);
3896
Linus Torvalds1da177e2005-04-16 15:20:36 -07003897 if (scid) {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003898 chan = __l2cap_get_chan_by_scid(conn, scid);
3899 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003900 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003901 goto unlock;
3902 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003903 } else {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003904 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
3905 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003906 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003907 goto unlock;
3908 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003909 }
3910
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003911 err = 0;
3912
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003913 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003914
Linus Torvalds1da177e2005-04-16 15:20:36 -07003915 switch (result) {
3916 case L2CAP_CR_SUCCESS:
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03003917 l2cap_state_change(chan, BT_CONFIG);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003918 chan->ident = 0;
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003919 chan->dcid = dcid;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003920 clear_bit(CONF_CONNECT_PEND, &chan->conf_state);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01003921
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003922 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003923 break;
3924
Linus Torvalds1da177e2005-04-16 15:20:36 -07003925 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003926 l2cap_build_conf_req(chan, req), req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003927 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003928 break;
3929
3930 case L2CAP_CR_PEND:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003931 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003932 break;
3933
3934 default:
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003935 l2cap_chan_del(chan, ECONNREFUSED);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003936 break;
3937 }
3938
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003939 l2cap_chan_unlock(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003940
3941unlock:
3942 mutex_unlock(&conn->chan_lock);
3943
3944 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003945}
3946
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003947static inline void set_default_fcs(struct l2cap_chan *chan)
Mat Martineau8c462b62010-08-24 15:35:42 -07003948{
3949 /* FCS is enabled only in ERTM or streaming mode, if one or both
3950 * sides request it.
3951 */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003952 if (chan->mode != L2CAP_MODE_ERTM && chan->mode != L2CAP_MODE_STREAMING)
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003953 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003954 else if (!test_bit(CONF_RECV_NO_FCS, &chan->conf_state))
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003955 chan->fcs = L2CAP_FCS_CRC16;
Mat Martineau8c462b62010-08-24 15:35:42 -07003956}
3957
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03003958static void l2cap_send_efs_conf_rsp(struct l2cap_chan *chan, void *data,
3959 u8 ident, u16 flags)
3960{
3961 struct l2cap_conn *conn = chan->conn;
3962
3963 BT_DBG("conn %p chan %p ident %d flags 0x%4.4x", conn, chan, ident,
3964 flags);
3965
3966 clear_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
3967 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
3968
3969 l2cap_send_cmd(conn, ident, L2CAP_CONF_RSP,
3970 l2cap_build_conf_rsp(chan, data,
3971 L2CAP_CONF_SUCCESS, flags), data);
3972}
3973
Johan Hedberg662d6522013-10-16 11:20:47 +03003974static void cmd_reject_invalid_cid(struct l2cap_conn *conn, u8 ident,
3975 u16 scid, u16 dcid)
3976{
3977 struct l2cap_cmd_rej_cid rej;
3978
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003979 rej.reason = cpu_to_le16(L2CAP_REJ_INVALID_CID);
Johan Hedberg662d6522013-10-16 11:20:47 +03003980 rej.scid = __cpu_to_le16(scid);
3981 rej.dcid = __cpu_to_le16(dcid);
3982
3983 l2cap_send_cmd(conn, ident, L2CAP_COMMAND_REJ, sizeof(rej), &rej);
3984}
3985
Gustavo Padovan2d792812012-10-06 10:07:01 +01003986static inline int l2cap_config_req(struct l2cap_conn *conn,
3987 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3988 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003989{
3990 struct l2cap_conf_req *req = (struct l2cap_conf_req *) data;
3991 u16 dcid, flags;
3992 u8 rsp[64];
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003993 struct l2cap_chan *chan;
Mat Martineau3c588192012-04-11 10:48:42 -07003994 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003995
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003996 if (cmd_len < sizeof(*req))
3997 return -EPROTO;
3998
Linus Torvalds1da177e2005-04-16 15:20:36 -07003999 dcid = __le16_to_cpu(req->dcid);
4000 flags = __le16_to_cpu(req->flags);
4001
4002 BT_DBG("dcid 0x%4.4x flags 0x%2.2x", dcid, flags);
4003
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004004 chan = l2cap_get_chan_by_scid(conn, dcid);
Johan Hedberg662d6522013-10-16 11:20:47 +03004005 if (!chan) {
4006 cmd_reject_invalid_cid(conn, cmd->ident, dcid, 0);
4007 return 0;
4008 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004009
David S. Miller033b1142011-07-21 13:38:42 -07004010 if (chan->state != BT_CONFIG && chan->state != BT_CONNECT2) {
Johan Hedberg662d6522013-10-16 11:20:47 +03004011 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4012 chan->dcid);
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004013 goto unlock;
Gustavo F. Padovandf6bd742010-06-14 02:26:15 -03004014 }
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004015
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004016 /* Reject if config buffer is too small. */
Al Viro88219a02007-07-29 00:17:25 -07004017 len = cmd_len - sizeof(*req);
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004018 if (chan->conf_len + len > sizeof(chan->conf_req)) {
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004019 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004020 l2cap_build_conf_rsp(chan, rsp,
4021 L2CAP_CONF_REJECT, flags), rsp);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004022 goto unlock;
4023 }
4024
4025 /* Store config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004026 memcpy(chan->conf_req + chan->conf_len, req->data, len);
4027 chan->conf_len += len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004028
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004029 if (flags & L2CAP_CONF_FLAG_CONTINUATION) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004030 /* Incomplete config. Send empty response. */
4031 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004032 l2cap_build_conf_rsp(chan, rsp,
4033 L2CAP_CONF_SUCCESS, flags), rsp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004034 goto unlock;
4035 }
4036
4037 /* Complete config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004038 len = l2cap_parse_conf_req(chan, rsp);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004039 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004040 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004041 goto unlock;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004042 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004043
Mat Martineau1500109b2012-10-23 15:24:15 -07004044 chan->ident = cmd->ident;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004045 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004046 chan->num_conf_rsp++;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004047
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004048 /* Reset config buffer. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004049 chan->conf_len = 0;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004050
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004051 if (!test_bit(CONF_OUTPUT_DONE, &chan->conf_state))
Marcel Holtmann876d9482007-10-20 13:35:42 +02004052 goto unlock;
4053
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004054 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004055 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004056
Mat Martineau105bdf92012-04-27 16:50:48 -07004057 if (chan->mode == L2CAP_MODE_ERTM ||
4058 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004059 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004060
Mat Martineau3c588192012-04-11 10:48:42 -07004061 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004062 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004063 else
4064 l2cap_chan_ready(chan);
4065
Marcel Holtmann876d9482007-10-20 13:35:42 +02004066 goto unlock;
4067 }
4068
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004069 if (!test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02004070 u8 buf[64];
Linus Torvalds1da177e2005-04-16 15:20:36 -07004071 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004072 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004073 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004074 }
4075
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004076 /* Got Conf Rsp PENDING from remote side and asume we sent
4077 Conf Rsp PENDING in the code above */
4078 if (test_bit(CONF_REM_CONF_PEND, &chan->conf_state) &&
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03004079 test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004080
4081 /* check compatibility */
4082
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004083 /* Send rsp for BR/EDR channel */
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004084 if (!chan->hs_hcon)
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004085 l2cap_send_efs_conf_rsp(chan, rsp, cmd->ident, flags);
4086 else
4087 chan->ident = cmd->ident;
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004088 }
4089
Linus Torvalds1da177e2005-04-16 15:20:36 -07004090unlock:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004091 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004092 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004093}
4094
Gustavo Padovan2d792812012-10-06 10:07:01 +01004095static inline int l2cap_config_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004096 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4097 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004098{
4099 struct l2cap_conf_rsp *rsp = (struct l2cap_conf_rsp *)data;
4100 u16 scid, flags, result;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004101 struct l2cap_chan *chan;
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004102 int len = cmd_len - sizeof(*rsp);
Mat Martineau3c588192012-04-11 10:48:42 -07004103 int err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004104
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004105 if (cmd_len < sizeof(*rsp))
4106 return -EPROTO;
4107
Linus Torvalds1da177e2005-04-16 15:20:36 -07004108 scid = __le16_to_cpu(rsp->scid);
4109 flags = __le16_to_cpu(rsp->flags);
4110 result = __le16_to_cpu(rsp->result);
4111
Andrei Emeltchenko61386cb2012-03-12 12:13:07 +02004112 BT_DBG("scid 0x%4.4x flags 0x%2.2x result 0x%2.2x len %d", scid, flags,
4113 result, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004114
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004115 chan = l2cap_get_chan_by_scid(conn, scid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004116 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004117 return 0;
4118
4119 switch (result) {
4120 case L2CAP_CONF_SUCCESS:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004121 l2cap_conf_rfc_get(chan, rsp->data, len);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004122 clear_bit(CONF_REM_CONF_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004123 break;
4124
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004125 case L2CAP_CONF_PENDING:
4126 set_bit(CONF_REM_CONF_PEND, &chan->conf_state);
4127
4128 if (test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
4129 char buf[64];
4130
4131 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004132 buf, &result);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004133 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004134 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004135 goto done;
4136 }
4137
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004138 if (!chan->hs_hcon) {
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004139 l2cap_send_efs_conf_rsp(chan, buf, cmd->ident,
4140 0);
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02004141 } else {
4142 if (l2cap_check_efs(chan)) {
4143 amp_create_logical_link(chan);
4144 chan->ident = cmd->ident;
4145 }
4146 }
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004147 }
4148 goto done;
4149
Linus Torvalds1da177e2005-04-16 15:20:36 -07004150 case L2CAP_CONF_UNACCEPT:
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004151 if (chan->num_conf_rsp <= L2CAP_CONF_MAX_CONF_RSP) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004152 char req[64];
4153
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004154 if (len > sizeof(req) - sizeof(struct l2cap_conf_req)) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004155 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004156 goto done;
4157 }
4158
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004159 /* throw out any old stored conf requests */
4160 result = L2CAP_CONF_SUCCESS;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03004161 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004162 req, &result);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004163 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004164 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004165 goto done;
4166 }
4167
4168 l2cap_send_cmd(conn, l2cap_get_ident(conn),
Gustavo Padovan2d792812012-10-06 10:07:01 +01004169 L2CAP_CONF_REQ, len, req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004170 chan->num_conf_req++;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004171 if (result != L2CAP_CONF_SUCCESS)
4172 goto done;
4173 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004174 }
4175
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09004176 default:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004177 l2cap_chan_set_err(chan, ECONNRESET);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +02004178
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08004179 __set_chan_timer(chan, L2CAP_DISC_REJ_TIMEOUT);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004180 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004181 goto done;
4182 }
4183
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004184 if (flags & L2CAP_CONF_FLAG_CONTINUATION)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004185 goto done;
4186
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004187 set_bit(CONF_INPUT_DONE, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004188
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004189 if (test_bit(CONF_OUTPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004190 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004191
Mat Martineau105bdf92012-04-27 16:50:48 -07004192 if (chan->mode == L2CAP_MODE_ERTM ||
4193 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004194 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004195
Mat Martineau3c588192012-04-11 10:48:42 -07004196 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004197 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004198 else
4199 l2cap_chan_ready(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004200 }
4201
4202done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004203 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004204 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004205}
4206
Gustavo Padovan2d792812012-10-06 10:07:01 +01004207static inline int l2cap_disconnect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004208 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4209 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004210{
4211 struct l2cap_disconn_req *req = (struct l2cap_disconn_req *) data;
4212 struct l2cap_disconn_rsp rsp;
4213 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004214 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004215
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004216 if (cmd_len != sizeof(*req))
4217 return -EPROTO;
4218
Linus Torvalds1da177e2005-04-16 15:20:36 -07004219 scid = __le16_to_cpu(req->scid);
4220 dcid = __le16_to_cpu(req->dcid);
4221
4222 BT_DBG("scid 0x%4.4x dcid 0x%4.4x", scid, dcid);
4223
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004224 mutex_lock(&conn->chan_lock);
4225
4226 chan = __l2cap_get_chan_by_scid(conn, dcid);
4227 if (!chan) {
4228 mutex_unlock(&conn->chan_lock);
Johan Hedberg662d6522013-10-16 11:20:47 +03004229 cmd_reject_invalid_cid(conn, cmd->ident, dcid, scid);
4230 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004231 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004232
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004233 l2cap_chan_lock(chan);
4234
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03004235 rsp.dcid = cpu_to_le16(chan->scid);
4236 rsp.scid = cpu_to_le16(chan->dcid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004237 l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp);
4238
Gustavo Padovan5ec1bbe2013-10-15 19:24:48 -03004239 chan->ops->set_shutdown(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004240
Mat Martineau61d6ef32012-04-27 16:50:50 -07004241 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004242 l2cap_chan_del(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004243
4244 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004245
Gustavo Padovan80b98022012-05-27 22:27:51 -03004246 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004247 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004248
4249 mutex_unlock(&conn->chan_lock);
4250
Linus Torvalds1da177e2005-04-16 15:20:36 -07004251 return 0;
4252}
4253
Gustavo Padovan2d792812012-10-06 10:07:01 +01004254static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004255 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4256 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004257{
4258 struct l2cap_disconn_rsp *rsp = (struct l2cap_disconn_rsp *) data;
4259 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004260 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004261
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004262 if (cmd_len != sizeof(*rsp))
4263 return -EPROTO;
4264
Linus Torvalds1da177e2005-04-16 15:20:36 -07004265 scid = __le16_to_cpu(rsp->scid);
4266 dcid = __le16_to_cpu(rsp->dcid);
4267
4268 BT_DBG("dcid 0x%4.4x scid 0x%4.4x", dcid, scid);
4269
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004270 mutex_lock(&conn->chan_lock);
4271
4272 chan = __l2cap_get_chan_by_scid(conn, scid);
4273 if (!chan) {
4274 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004275 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004276 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004277
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004278 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004279
Mat Martineau61d6ef32012-04-27 16:50:50 -07004280 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004281 l2cap_chan_del(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004282
4283 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004284
Gustavo Padovan80b98022012-05-27 22:27:51 -03004285 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004286 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004287
4288 mutex_unlock(&conn->chan_lock);
4289
Linus Torvalds1da177e2005-04-16 15:20:36 -07004290 return 0;
4291}
4292
Gustavo Padovan2d792812012-10-06 10:07:01 +01004293static inline int l2cap_information_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004294 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4295 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004296{
4297 struct l2cap_info_req *req = (struct l2cap_info_req *) data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004298 u16 type;
4299
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004300 if (cmd_len != sizeof(*req))
4301 return -EPROTO;
4302
Linus Torvalds1da177e2005-04-16 15:20:36 -07004303 type = __le16_to_cpu(req->type);
4304
4305 BT_DBG("type 0x%4.4x", type);
4306
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004307 if (type == L2CAP_IT_FEAT_MASK) {
4308 u8 buf[8];
Marcel Holtmann44dd46d2009-05-02 19:09:01 -07004309 u32 feat_mask = l2cap_feat_mask;
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004310 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004311 rsp->type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
4312 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03004313 if (!disable_ertm)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004314 feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING
Gustavo Padovan2d792812012-10-06 10:07:01 +01004315 | L2CAP_FEAT_FCS;
Marcel Holtmann848566b2013-10-01 22:59:22 -07004316 if (conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03004317 feat_mask |= L2CAP_FEAT_EXT_FLOW
Gustavo Padovan2d792812012-10-06 10:07:01 +01004318 | L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenkoa5fd6f32011-09-16 16:26:32 +03004319
Gustavo F. Padovan1b7bf4e2009-08-24 00:45:20 -03004320 put_unaligned_le32(feat_mask, rsp->data);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004321 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4322 buf);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004323 } else if (type == L2CAP_IT_FIXED_CHAN) {
4324 u8 buf[12];
4325 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Mat Martineau50a147c2011-11-02 16:18:34 -07004326
Marcel Holtmann848566b2013-10-01 22:59:22 -07004327 if (conn->hs_enabled)
Mat Martineau50a147c2011-11-02 16:18:34 -07004328 l2cap_fixed_chan[0] |= L2CAP_FC_A2MP;
4329 else
4330 l2cap_fixed_chan[0] &= ~L2CAP_FC_A2MP;
4331
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004332 rsp->type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
4333 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Andrei Emeltchenkoc6337ea2011-10-20 17:02:44 +03004334 memcpy(rsp->data, l2cap_fixed_chan, sizeof(l2cap_fixed_chan));
Gustavo Padovan2d792812012-10-06 10:07:01 +01004335 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4336 buf);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004337 } else {
4338 struct l2cap_info_rsp rsp;
4339 rsp.type = cpu_to_le16(type);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004340 rsp.result = cpu_to_le16(L2CAP_IR_NOTSUPP);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004341 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(rsp),
4342 &rsp);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004343 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004344
4345 return 0;
4346}
4347
Gustavo Padovan2d792812012-10-06 10:07:01 +01004348static inline int l2cap_information_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004349 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4350 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004351{
4352 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) data;
4353 u16 type, result;
4354
Jaganath Kanakkassery3f6fa3d2013-06-21 19:55:11 +05304355 if (cmd_len < sizeof(*rsp))
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004356 return -EPROTO;
4357
Linus Torvalds1da177e2005-04-16 15:20:36 -07004358 type = __le16_to_cpu(rsp->type);
4359 result = __le16_to_cpu(rsp->result);
4360
4361 BT_DBG("type 0x%4.4x result 0x%2.2x", type, result);
4362
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004363 /* L2CAP Info req/rsp are unbound to channels, add extra checks */
4364 if (cmd->ident != conn->info_ident ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01004365 conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004366 return 0;
4367
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02004368 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004369
Ville Tervoadb08ed2010-08-04 09:43:33 +03004370 if (result != L2CAP_IR_SUCCESS) {
4371 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4372 conn->info_ident = 0;
4373
4374 l2cap_conn_start(conn);
4375
4376 return 0;
4377 }
4378
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004379 switch (type) {
4380 case L2CAP_IT_FEAT_MASK:
Harvey Harrison83985312008-05-02 16:25:46 -07004381 conn->feat_mask = get_unaligned_le32(rsp->data);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004382
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07004383 if (conn->feat_mask & L2CAP_FEAT_FIXED_CHAN) {
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004384 struct l2cap_info_req req;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004385 req.type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004386
4387 conn->info_ident = l2cap_get_ident(conn);
4388
4389 l2cap_send_cmd(conn, conn->info_ident,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004390 L2CAP_INFO_REQ, sizeof(req), &req);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004391 } else {
4392 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4393 conn->info_ident = 0;
4394
4395 l2cap_conn_start(conn);
4396 }
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004397 break;
4398
4399 case L2CAP_IT_FIXED_CHAN:
4400 conn->fixed_chan_mask = rsp->data[0];
Marcel Holtmann984947d2009-02-06 23:35:19 +01004401 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004402 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004403
4404 l2cap_conn_start(conn);
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004405 break;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004406 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004407
Linus Torvalds1da177e2005-04-16 15:20:36 -07004408 return 0;
4409}
4410
Mat Martineau17009152012-10-23 15:24:07 -07004411static int l2cap_create_channel_req(struct l2cap_conn *conn,
4412 struct l2cap_cmd_hdr *cmd,
4413 u16 cmd_len, void *data)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004414{
4415 struct l2cap_create_chan_req *req = data;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004416 struct l2cap_create_chan_rsp rsp;
Mat Martineau17009152012-10-23 15:24:07 -07004417 struct l2cap_chan *chan;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004418 struct hci_dev *hdev;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004419 u16 psm, scid;
4420
4421 if (cmd_len != sizeof(*req))
4422 return -EPROTO;
4423
Marcel Holtmann848566b2013-10-01 22:59:22 -07004424 if (!conn->hs_enabled)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004425 return -EINVAL;
4426
4427 psm = le16_to_cpu(req->psm);
4428 scid = le16_to_cpu(req->scid);
4429
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004430 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 -07004431
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004432 /* For controller id 0 make BR/EDR connection */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004433 if (req->amp_id == AMP_ID_BREDR) {
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004434 l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4435 req->amp_id);
4436 return 0;
4437 }
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004438
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004439 /* Validate AMP controller id */
4440 hdev = hci_dev_get(req->amp_id);
4441 if (!hdev)
4442 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004443
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004444 if (hdev->dev_type != HCI_AMP || !test_bit(HCI_UP, &hdev->flags)) {
Mat Martineau17009152012-10-23 15:24:07 -07004445 hci_dev_put(hdev);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004446 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004447 }
4448
4449 chan = l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4450 req->amp_id);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004451 if (chan) {
4452 struct amp_mgr *mgr = conn->hcon->amp_mgr;
4453 struct hci_conn *hs_hcon;
4454
Marcel Holtmann98e0f7e2013-10-13 02:23:40 -07004455 hs_hcon = hci_conn_hash_lookup_ba(hdev, AMP_LINK,
4456 &conn->hcon->dst);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004457 if (!hs_hcon) {
4458 hci_dev_put(hdev);
Johan Hedberg662d6522013-10-16 11:20:47 +03004459 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4460 chan->dcid);
4461 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004462 }
4463
4464 BT_DBG("mgr %p bredr_chan %p hs_hcon %p", mgr, chan, hs_hcon);
4465
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004466 mgr->bredr_chan = chan;
4467 chan->hs_hcon = hs_hcon;
Andrei Emeltchenkofd45bf42012-11-20 17:16:22 +02004468 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004469 conn->mtu = hdev->block_mtu;
4470 }
4471
4472 hci_dev_put(hdev);
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004473
4474 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004475
4476error:
4477 rsp.dcid = 0;
4478 rsp.scid = cpu_to_le16(scid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004479 rsp.result = cpu_to_le16(L2CAP_CR_BAD_AMP);
4480 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004481
4482 l2cap_send_cmd(conn, cmd->ident, L2CAP_CREATE_CHAN_RSP,
4483 sizeof(rsp), &rsp);
4484
Johan Hedbergdc280802013-09-16 13:05:13 +03004485 return 0;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004486}
4487
Mat Martineau8eb200b2012-10-23 15:24:17 -07004488static void l2cap_send_move_chan_req(struct l2cap_chan *chan, u8 dest_amp_id)
4489{
4490 struct l2cap_move_chan_req req;
4491 u8 ident;
4492
4493 BT_DBG("chan %p, dest_amp_id %d", chan, dest_amp_id);
4494
4495 ident = l2cap_get_ident(chan->conn);
4496 chan->ident = ident;
4497
4498 req.icid = cpu_to_le16(chan->scid);
4499 req.dest_amp_id = dest_amp_id;
4500
4501 l2cap_send_cmd(chan->conn, ident, L2CAP_MOVE_CHAN_REQ, sizeof(req),
4502 &req);
4503
4504 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4505}
4506
Mat Martineau1500109b2012-10-23 15:24:15 -07004507static void l2cap_send_move_chan_rsp(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004508{
4509 struct l2cap_move_chan_rsp rsp;
4510
Mat Martineau1500109b2012-10-23 15:24:15 -07004511 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004512
Mat Martineau1500109b2012-10-23 15:24:15 -07004513 rsp.icid = cpu_to_le16(chan->dcid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004514 rsp.result = cpu_to_le16(result);
4515
Mat Martineau1500109b2012-10-23 15:24:15 -07004516 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_RSP,
4517 sizeof(rsp), &rsp);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004518}
4519
Mat Martineau5b155ef2012-10-23 15:24:14 -07004520static void l2cap_send_move_chan_cfm(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004521{
4522 struct l2cap_move_chan_cfm cfm;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004523
Mat Martineau5b155ef2012-10-23 15:24:14 -07004524 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004525
Mat Martineau5b155ef2012-10-23 15:24:14 -07004526 chan->ident = l2cap_get_ident(chan->conn);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004527
Mat Martineau5b155ef2012-10-23 15:24:14 -07004528 cfm.icid = cpu_to_le16(chan->scid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004529 cfm.result = cpu_to_le16(result);
4530
Mat Martineau5b155ef2012-10-23 15:24:14 -07004531 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_CFM,
4532 sizeof(cfm), &cfm);
4533
4534 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4535}
4536
4537static void l2cap_send_move_chan_cfm_icid(struct l2cap_conn *conn, u16 icid)
4538{
4539 struct l2cap_move_chan_cfm cfm;
4540
4541 BT_DBG("conn %p, icid 0x%4.4x", conn, icid);
4542
4543 cfm.icid = cpu_to_le16(icid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004544 cfm.result = cpu_to_le16(L2CAP_MC_UNCONFIRMED);
Mat Martineau5b155ef2012-10-23 15:24:14 -07004545
4546 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_MOVE_CHAN_CFM,
4547 sizeof(cfm), &cfm);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004548}
4549
4550static void l2cap_send_move_chan_cfm_rsp(struct l2cap_conn *conn, u8 ident,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004551 u16 icid)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004552{
4553 struct l2cap_move_chan_cfm_rsp rsp;
4554
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004555 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004556
4557 rsp.icid = cpu_to_le16(icid);
4558 l2cap_send_cmd(conn, ident, L2CAP_MOVE_CHAN_CFM_RSP, sizeof(rsp), &rsp);
4559}
4560
Mat Martineau5f3847a2012-10-23 15:24:12 -07004561static void __release_logical_link(struct l2cap_chan *chan)
4562{
4563 chan->hs_hchan = NULL;
4564 chan->hs_hcon = NULL;
4565
4566 /* Placeholder - release the logical link */
4567}
4568
Mat Martineau1500109b2012-10-23 15:24:15 -07004569static void l2cap_logical_fail(struct l2cap_chan *chan)
4570{
4571 /* Logical link setup failed */
4572 if (chan->state != BT_CONNECTED) {
4573 /* Create channel failure, disconnect */
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004574 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineau1500109b2012-10-23 15:24:15 -07004575 return;
4576 }
4577
4578 switch (chan->move_role) {
4579 case L2CAP_MOVE_ROLE_RESPONDER:
4580 l2cap_move_done(chan);
4581 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_SUPP);
4582 break;
4583 case L2CAP_MOVE_ROLE_INITIATOR:
4584 if (chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_COMP ||
4585 chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_CFM) {
4586 /* Remote has only sent pending or
4587 * success responses, clean up
4588 */
4589 l2cap_move_done(chan);
4590 }
4591
4592 /* Other amp move states imply that the move
4593 * has already aborted
4594 */
4595 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
4596 break;
4597 }
4598}
4599
4600static void l2cap_logical_finish_create(struct l2cap_chan *chan,
4601 struct hci_chan *hchan)
4602{
4603 struct l2cap_conf_rsp rsp;
Mat Martineau1500109b2012-10-23 15:24:15 -07004604
Andrei Emeltchenko336178a2012-10-31 15:46:27 +02004605 chan->hs_hchan = hchan;
Mat Martineau1500109b2012-10-23 15:24:15 -07004606 chan->hs_hcon->l2cap_data = chan->conn;
4607
Andrei Emeltchenko35ba9562012-10-25 15:20:43 +03004608 l2cap_send_efs_conf_rsp(chan, &rsp, chan->ident, 0);
Mat Martineau1500109b2012-10-23 15:24:15 -07004609
4610 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Andrei Emeltchenkofe79c6f2012-10-25 15:20:42 +03004611 int err;
Mat Martineau1500109b2012-10-23 15:24:15 -07004612
4613 set_default_fcs(chan);
4614
4615 err = l2cap_ertm_init(chan);
4616 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004617 l2cap_send_disconn_req(chan, -err);
Mat Martineau1500109b2012-10-23 15:24:15 -07004618 else
4619 l2cap_chan_ready(chan);
4620 }
4621}
4622
4623static void l2cap_logical_finish_move(struct l2cap_chan *chan,
4624 struct hci_chan *hchan)
4625{
4626 chan->hs_hcon = hchan->conn;
4627 chan->hs_hcon->l2cap_data = chan->conn;
4628
4629 BT_DBG("move_state %d", chan->move_state);
4630
4631 switch (chan->move_state) {
4632 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
4633 /* Move confirm will be sent after a success
4634 * response is received
4635 */
4636 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4637 break;
4638 case L2CAP_MOVE_WAIT_LOGICAL_CFM:
4639 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4640 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4641 } else if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
4642 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
4643 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
4644 } else if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4645 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4646 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4647 }
4648 break;
4649 default:
4650 /* Move was not in expected state, free the channel */
4651 __release_logical_link(chan);
4652
4653 chan->move_state = L2CAP_MOVE_STABLE;
4654 }
4655}
4656
4657/* Call with chan locked */
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004658void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan,
4659 u8 status)
Mat Martineau5b155ef2012-10-23 15:24:14 -07004660{
Mat Martineau1500109b2012-10-23 15:24:15 -07004661 BT_DBG("chan %p, hchan %p, status %d", chan, hchan, status);
4662
4663 if (status) {
4664 l2cap_logical_fail(chan);
4665 __release_logical_link(chan);
4666 return;
4667 }
4668
4669 if (chan->state != BT_CONNECTED) {
4670 /* Ignore logical link if channel is on BR/EDR */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004671 if (chan->local_amp_id != AMP_ID_BREDR)
Mat Martineau1500109b2012-10-23 15:24:15 -07004672 l2cap_logical_finish_create(chan, hchan);
4673 } else {
4674 l2cap_logical_finish_move(chan, hchan);
4675 }
Mat Martineau5b155ef2012-10-23 15:24:14 -07004676}
4677
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004678void l2cap_move_start(struct l2cap_chan *chan)
4679{
4680 BT_DBG("chan %p", chan);
4681
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004682 if (chan->local_amp_id == AMP_ID_BREDR) {
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004683 if (chan->chan_policy != BT_CHANNEL_POLICY_AMP_PREFERRED)
4684 return;
4685 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4686 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4687 /* Placeholder - start physical link setup */
4688 } else {
4689 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4690 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4691 chan->move_id = 0;
4692 l2cap_move_setup(chan);
4693 l2cap_send_move_chan_req(chan, 0);
4694 }
4695}
4696
Mat Martineau8eb200b2012-10-23 15:24:17 -07004697static void l2cap_do_create(struct l2cap_chan *chan, int result,
4698 u8 local_amp_id, u8 remote_amp_id)
4699{
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004700 BT_DBG("chan %p state %s %u -> %u", chan, state_to_string(chan->state),
4701 local_amp_id, remote_amp_id);
4702
Andrei Emeltchenko12d6cc62012-11-14 17:39:31 +02004703 chan->fcs = L2CAP_FCS_NONE;
4704
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004705 /* Outgoing channel on AMP */
4706 if (chan->state == BT_CONNECT) {
4707 if (result == L2CAP_CR_SUCCESS) {
4708 chan->local_amp_id = local_amp_id;
4709 l2cap_send_create_chan_req(chan, remote_amp_id);
4710 } else {
4711 /* Revert to BR/EDR connect */
4712 l2cap_send_conn_req(chan);
4713 }
4714
4715 return;
4716 }
4717
4718 /* Incoming channel on AMP */
4719 if (__l2cap_no_conn_pending(chan)) {
Mat Martineau8eb200b2012-10-23 15:24:17 -07004720 struct l2cap_conn_rsp rsp;
4721 char buf[128];
4722 rsp.scid = cpu_to_le16(chan->dcid);
4723 rsp.dcid = cpu_to_le16(chan->scid);
4724
Mat Martineau8eb200b2012-10-23 15:24:17 -07004725 if (result == L2CAP_CR_SUCCESS) {
4726 /* Send successful response */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004727 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
4728 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004729 } else {
4730 /* Send negative response */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004731 rsp.result = cpu_to_le16(L2CAP_CR_NO_MEM);
4732 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004733 }
4734
4735 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_RSP,
4736 sizeof(rsp), &rsp);
4737
4738 if (result == L2CAP_CR_SUCCESS) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02004739 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004740 set_bit(CONF_REQ_SENT, &chan->conf_state);
4741 l2cap_send_cmd(chan->conn, l2cap_get_ident(chan->conn),
4742 L2CAP_CONF_REQ,
4743 l2cap_build_conf_req(chan, buf), buf);
4744 chan->num_conf_req++;
4745 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004746 }
4747}
4748
4749static void l2cap_do_move_initiate(struct l2cap_chan *chan, u8 local_amp_id,
4750 u8 remote_amp_id)
4751{
4752 l2cap_move_setup(chan);
4753 chan->move_id = local_amp_id;
4754 chan->move_state = L2CAP_MOVE_WAIT_RSP;
4755
4756 l2cap_send_move_chan_req(chan, remote_amp_id);
4757}
4758
4759static void l2cap_do_move_respond(struct l2cap_chan *chan, int result)
4760{
4761 struct hci_chan *hchan = NULL;
4762
4763 /* Placeholder - get hci_chan for logical link */
4764
4765 if (hchan) {
4766 if (hchan->state == BT_CONNECTED) {
4767 /* Logical link is ready to go */
4768 chan->hs_hcon = hchan->conn;
4769 chan->hs_hcon->l2cap_data = chan->conn;
4770 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4771 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4772
4773 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
4774 } else {
4775 /* Wait for logical link to be ready */
4776 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4777 }
4778 } else {
4779 /* Logical link not available */
4780 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_ALLOWED);
4781 }
4782}
4783
4784static void l2cap_do_move_cancel(struct l2cap_chan *chan, int result)
4785{
4786 if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4787 u8 rsp_result;
4788 if (result == -EINVAL)
4789 rsp_result = L2CAP_MR_BAD_ID;
4790 else
4791 rsp_result = L2CAP_MR_NOT_ALLOWED;
4792
4793 l2cap_send_move_chan_rsp(chan, rsp_result);
4794 }
4795
4796 chan->move_role = L2CAP_MOVE_ROLE_NONE;
4797 chan->move_state = L2CAP_MOVE_STABLE;
4798
4799 /* Restart data transmission */
4800 l2cap_ertm_send(chan);
4801}
4802
Andrei Emeltchenkoa514b172012-11-14 17:39:30 +02004803/* Invoke with locked chan */
4804void __l2cap_physical_cfm(struct l2cap_chan *chan, int result)
Mat Martineau8eb200b2012-10-23 15:24:17 -07004805{
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004806 u8 local_amp_id = chan->local_amp_id;
Andrei Emeltchenkofffadc02012-11-01 15:37:03 +02004807 u8 remote_amp_id = chan->remote_amp_id;
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004808
Mat Martineau8eb200b2012-10-23 15:24:17 -07004809 BT_DBG("chan %p, result %d, local_amp_id %d, remote_amp_id %d",
4810 chan, result, local_amp_id, remote_amp_id);
4811
Mat Martineau8eb200b2012-10-23 15:24:17 -07004812 if (chan->state == BT_DISCONN || chan->state == BT_CLOSED) {
4813 l2cap_chan_unlock(chan);
4814 return;
4815 }
4816
4817 if (chan->state != BT_CONNECTED) {
4818 l2cap_do_create(chan, result, local_amp_id, remote_amp_id);
4819 } else if (result != L2CAP_MR_SUCCESS) {
4820 l2cap_do_move_cancel(chan, result);
4821 } else {
4822 switch (chan->move_role) {
4823 case L2CAP_MOVE_ROLE_INITIATOR:
4824 l2cap_do_move_initiate(chan, local_amp_id,
4825 remote_amp_id);
4826 break;
4827 case L2CAP_MOVE_ROLE_RESPONDER:
4828 l2cap_do_move_respond(chan, result);
4829 break;
4830 default:
4831 l2cap_do_move_cancel(chan, result);
4832 break;
4833 }
4834 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004835}
4836
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004837static inline int l2cap_move_channel_req(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004838 struct l2cap_cmd_hdr *cmd,
4839 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004840{
4841 struct l2cap_move_chan_req *req = data;
Mat Martineau1500109b2012-10-23 15:24:15 -07004842 struct l2cap_move_chan_rsp rsp;
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004843 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004844 u16 icid = 0;
4845 u16 result = L2CAP_MR_NOT_ALLOWED;
4846
4847 if (cmd_len != sizeof(*req))
4848 return -EPROTO;
4849
4850 icid = le16_to_cpu(req->icid);
4851
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004852 BT_DBG("icid 0x%4.4x, dest_amp_id %d", icid, req->dest_amp_id);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004853
Marcel Holtmann848566b2013-10-01 22:59:22 -07004854 if (!conn->hs_enabled)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004855 return -EINVAL;
4856
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004857 chan = l2cap_get_chan_by_dcid(conn, icid);
4858 if (!chan) {
Mat Martineau1500109b2012-10-23 15:24:15 -07004859 rsp.icid = cpu_to_le16(icid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004860 rsp.result = cpu_to_le16(L2CAP_MR_NOT_ALLOWED);
Mat Martineau1500109b2012-10-23 15:24:15 -07004861 l2cap_send_cmd(conn, cmd->ident, L2CAP_MOVE_CHAN_RSP,
4862 sizeof(rsp), &rsp);
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004863 return 0;
4864 }
4865
Mat Martineau1500109b2012-10-23 15:24:15 -07004866 chan->ident = cmd->ident;
4867
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004868 if (chan->scid < L2CAP_CID_DYN_START ||
4869 chan->chan_policy == BT_CHANNEL_POLICY_BREDR_ONLY ||
4870 (chan->mode != L2CAP_MODE_ERTM &&
4871 chan->mode != L2CAP_MODE_STREAMING)) {
4872 result = L2CAP_MR_NOT_ALLOWED;
4873 goto send_move_response;
4874 }
4875
4876 if (chan->local_amp_id == req->dest_amp_id) {
4877 result = L2CAP_MR_SAME_ID;
4878 goto send_move_response;
4879 }
4880
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004881 if (req->dest_amp_id != AMP_ID_BREDR) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004882 struct hci_dev *hdev;
4883 hdev = hci_dev_get(req->dest_amp_id);
4884 if (!hdev || hdev->dev_type != HCI_AMP ||
4885 !test_bit(HCI_UP, &hdev->flags)) {
4886 if (hdev)
4887 hci_dev_put(hdev);
4888
4889 result = L2CAP_MR_BAD_ID;
4890 goto send_move_response;
4891 }
4892 hci_dev_put(hdev);
4893 }
4894
4895 /* Detect a move collision. Only send a collision response
4896 * if this side has "lost", otherwise proceed with the move.
4897 * The winner has the larger bd_addr.
4898 */
4899 if ((__chan_is_moving(chan) ||
4900 chan->move_role != L2CAP_MOVE_ROLE_NONE) &&
Marcel Holtmann6f59b902013-10-13 05:24:01 -07004901 bacmp(&conn->hcon->src, &conn->hcon->dst) > 0) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004902 result = L2CAP_MR_COLLISION;
4903 goto send_move_response;
4904 }
4905
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004906 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
4907 l2cap_move_setup(chan);
4908 chan->move_id = req->dest_amp_id;
4909 icid = chan->dcid;
4910
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004911 if (req->dest_amp_id == AMP_ID_BREDR) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004912 /* Moving to BR/EDR */
4913 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4914 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4915 result = L2CAP_MR_PEND;
4916 } else {
4917 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4918 result = L2CAP_MR_SUCCESS;
4919 }
4920 } else {
4921 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4922 /* Placeholder - uncomment when amp functions are available */
4923 /*amp_accept_physical(chan, req->dest_amp_id);*/
4924 result = L2CAP_MR_PEND;
4925 }
4926
4927send_move_response:
Mat Martineau1500109b2012-10-23 15:24:15 -07004928 l2cap_send_move_chan_rsp(chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004929
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004930 l2cap_chan_unlock(chan);
4931
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004932 return 0;
4933}
4934
Mat Martineau5b155ef2012-10-23 15:24:14 -07004935static void l2cap_move_continue(struct l2cap_conn *conn, u16 icid, u16 result)
4936{
4937 struct l2cap_chan *chan;
4938 struct hci_chan *hchan = NULL;
4939
4940 chan = l2cap_get_chan_by_scid(conn, icid);
4941 if (!chan) {
4942 l2cap_send_move_chan_cfm_icid(conn, icid);
4943 return;
4944 }
4945
4946 __clear_chan_timer(chan);
4947 if (result == L2CAP_MR_PEND)
4948 __set_chan_timer(chan, L2CAP_MOVE_ERTX_TIMEOUT);
4949
4950 switch (chan->move_state) {
4951 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
4952 /* Move confirm will be sent when logical link
4953 * is complete.
4954 */
4955 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4956 break;
4957 case L2CAP_MOVE_WAIT_RSP_SUCCESS:
4958 if (result == L2CAP_MR_PEND) {
4959 break;
4960 } else if (test_bit(CONN_LOCAL_BUSY,
4961 &chan->conn_state)) {
4962 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4963 } else {
4964 /* Logical link is up or moving to BR/EDR,
4965 * proceed with move
4966 */
4967 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
4968 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
4969 }
4970 break;
4971 case L2CAP_MOVE_WAIT_RSP:
4972 /* Moving to AMP */
4973 if (result == L2CAP_MR_SUCCESS) {
4974 /* Remote is ready, send confirm immediately
4975 * after logical link is ready
4976 */
4977 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4978 } else {
4979 /* Both logical link and move success
4980 * are required to confirm
4981 */
4982 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_COMP;
4983 }
4984
4985 /* Placeholder - get hci_chan for logical link */
4986 if (!hchan) {
4987 /* Logical link not available */
4988 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
4989 break;
4990 }
4991
4992 /* If the logical link is not yet connected, do not
4993 * send confirmation.
4994 */
4995 if (hchan->state != BT_CONNECTED)
4996 break;
4997
4998 /* Logical link is already ready to go */
4999
5000 chan->hs_hcon = hchan->conn;
5001 chan->hs_hcon->l2cap_data = chan->conn;
5002
5003 if (result == L2CAP_MR_SUCCESS) {
5004 /* Can confirm now */
5005 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
5006 } else {
5007 /* Now only need move success
5008 * to confirm
5009 */
5010 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
5011 }
5012
5013 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
5014 break;
5015 default:
5016 /* Any other amp move state means the move failed. */
5017 chan->move_id = chan->local_amp_id;
5018 l2cap_move_done(chan);
5019 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5020 }
5021
5022 l2cap_chan_unlock(chan);
5023}
5024
5025static void l2cap_move_fail(struct l2cap_conn *conn, u8 ident, u16 icid,
5026 u16 result)
5027{
5028 struct l2cap_chan *chan;
5029
5030 chan = l2cap_get_chan_by_ident(conn, ident);
5031 if (!chan) {
5032 /* Could not locate channel, icid is best guess */
5033 l2cap_send_move_chan_cfm_icid(conn, icid);
5034 return;
5035 }
5036
5037 __clear_chan_timer(chan);
5038
5039 if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
5040 if (result == L2CAP_MR_COLLISION) {
5041 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
5042 } else {
5043 /* Cleanup - cancel move */
5044 chan->move_id = chan->local_amp_id;
5045 l2cap_move_done(chan);
5046 }
5047 }
5048
5049 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5050
5051 l2cap_chan_unlock(chan);
5052}
5053
5054static int l2cap_move_channel_rsp(struct l2cap_conn *conn,
5055 struct l2cap_cmd_hdr *cmd,
5056 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005057{
5058 struct l2cap_move_chan_rsp *rsp = data;
5059 u16 icid, result;
5060
5061 if (cmd_len != sizeof(*rsp))
5062 return -EPROTO;
5063
5064 icid = le16_to_cpu(rsp->icid);
5065 result = le16_to_cpu(rsp->result);
5066
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005067 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005068
Mat Martineau5b155ef2012-10-23 15:24:14 -07005069 if (result == L2CAP_MR_SUCCESS || result == L2CAP_MR_PEND)
5070 l2cap_move_continue(conn, icid, result);
5071 else
5072 l2cap_move_fail(conn, cmd->ident, icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005073
5074 return 0;
5075}
5076
Mat Martineau5f3847a2012-10-23 15:24:12 -07005077static int l2cap_move_channel_confirm(struct l2cap_conn *conn,
5078 struct l2cap_cmd_hdr *cmd,
5079 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005080{
5081 struct l2cap_move_chan_cfm *cfm = data;
Mat Martineau5f3847a2012-10-23 15:24:12 -07005082 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005083 u16 icid, result;
5084
5085 if (cmd_len != sizeof(*cfm))
5086 return -EPROTO;
5087
5088 icid = le16_to_cpu(cfm->icid);
5089 result = le16_to_cpu(cfm->result);
5090
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005091 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005092
Mat Martineau5f3847a2012-10-23 15:24:12 -07005093 chan = l2cap_get_chan_by_dcid(conn, icid);
5094 if (!chan) {
5095 /* Spec requires a response even if the icid was not found */
5096 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5097 return 0;
5098 }
5099
5100 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM) {
5101 if (result == L2CAP_MC_CONFIRMED) {
5102 chan->local_amp_id = chan->move_id;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005103 if (chan->local_amp_id == AMP_ID_BREDR)
Mat Martineau5f3847a2012-10-23 15:24:12 -07005104 __release_logical_link(chan);
5105 } else {
5106 chan->move_id = chan->local_amp_id;
5107 }
5108
5109 l2cap_move_done(chan);
5110 }
5111
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005112 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5113
Mat Martineau5f3847a2012-10-23 15:24:12 -07005114 l2cap_chan_unlock(chan);
5115
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005116 return 0;
5117}
5118
5119static inline int l2cap_move_channel_confirm_rsp(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005120 struct l2cap_cmd_hdr *cmd,
5121 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005122{
5123 struct l2cap_move_chan_cfm_rsp *rsp = data;
Mat Martineau3fd71a02012-10-23 15:24:16 -07005124 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005125 u16 icid;
5126
5127 if (cmd_len != sizeof(*rsp))
5128 return -EPROTO;
5129
5130 icid = le16_to_cpu(rsp->icid);
5131
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005132 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005133
Mat Martineau3fd71a02012-10-23 15:24:16 -07005134 chan = l2cap_get_chan_by_scid(conn, icid);
5135 if (!chan)
5136 return 0;
5137
5138 __clear_chan_timer(chan);
5139
5140 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM_RSP) {
5141 chan->local_amp_id = chan->move_id;
5142
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005143 if (chan->local_amp_id == AMP_ID_BREDR && chan->hs_hchan)
Mat Martineau3fd71a02012-10-23 15:24:16 -07005144 __release_logical_link(chan);
5145
5146 l2cap_move_done(chan);
5147 }
5148
5149 l2cap_chan_unlock(chan);
5150
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005151 return 0;
5152}
5153
Claudio Takahaside731152011-02-11 19:28:55 -02005154static inline int l2cap_conn_param_update_req(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005155 struct l2cap_cmd_hdr *cmd,
Johan Hedberg203e6392013-05-15 10:07:15 +03005156 u16 cmd_len, u8 *data)
Claudio Takahaside731152011-02-11 19:28:55 -02005157{
5158 struct hci_conn *hcon = conn->hcon;
5159 struct l2cap_conn_param_update_req *req;
5160 struct l2cap_conn_param_update_rsp rsp;
Johan Hedberg203e6392013-05-15 10:07:15 +03005161 u16 min, max, latency, to_multiplier;
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005162 int err;
Claudio Takahaside731152011-02-11 19:28:55 -02005163
Johan Hedberg40bef302014-07-16 11:42:27 +03005164 if (hcon->role != HCI_ROLE_MASTER)
Claudio Takahaside731152011-02-11 19:28:55 -02005165 return -EINVAL;
5166
Claudio Takahaside731152011-02-11 19:28:55 -02005167 if (cmd_len != sizeof(struct l2cap_conn_param_update_req))
5168 return -EPROTO;
5169
5170 req = (struct l2cap_conn_param_update_req *) data;
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03005171 min = __le16_to_cpu(req->min);
5172 max = __le16_to_cpu(req->max);
Claudio Takahaside731152011-02-11 19:28:55 -02005173 latency = __le16_to_cpu(req->latency);
5174 to_multiplier = __le16_to_cpu(req->to_multiplier);
5175
5176 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 +01005177 min, max, latency, to_multiplier);
Claudio Takahaside731152011-02-11 19:28:55 -02005178
5179 memset(&rsp, 0, sizeof(rsp));
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005180
Andre Guedesd4905f22014-06-25 21:52:52 -03005181 err = hci_check_conn_params(min, max, latency, to_multiplier);
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005182 if (err)
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005183 rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_REJECTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005184 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005185 rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_ACCEPTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005186
5187 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONN_PARAM_UPDATE_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005188 sizeof(rsp), &rsp);
Claudio Takahaside731152011-02-11 19:28:55 -02005189
Andre Guedesffb5a8272014-07-01 18:10:11 -03005190 if (!err) {
Johan Hedbergf4869e22014-07-02 17:37:32 +03005191 u8 store_hint;
Andre Guedesffb5a8272014-07-01 18:10:11 -03005192
Johan Hedbergf4869e22014-07-02 17:37:32 +03005193 store_hint = hci_le_conn_update(hcon, min, max, latency,
5194 to_multiplier);
5195 mgmt_new_conn_param(hcon->hdev, &hcon->dst, hcon->dst_type,
5196 store_hint, min, max, latency,
5197 to_multiplier);
5198
Andre Guedesffb5a8272014-07-01 18:10:11 -03005199 }
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005200
Claudio Takahaside731152011-02-11 19:28:55 -02005201 return 0;
5202}
5203
Johan Hedbergf1496de2013-05-13 14:15:56 +03005204static int l2cap_le_connect_rsp(struct l2cap_conn *conn,
5205 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5206 u8 *data)
5207{
5208 struct l2cap_le_conn_rsp *rsp = (struct l2cap_le_conn_rsp *) data;
5209 u16 dcid, mtu, mps, credits, result;
5210 struct l2cap_chan *chan;
5211 int err;
5212
5213 if (cmd_len < sizeof(*rsp))
5214 return -EPROTO;
5215
5216 dcid = __le16_to_cpu(rsp->dcid);
5217 mtu = __le16_to_cpu(rsp->mtu);
5218 mps = __le16_to_cpu(rsp->mps);
5219 credits = __le16_to_cpu(rsp->credits);
5220 result = __le16_to_cpu(rsp->result);
5221
5222 if (result == L2CAP_CR_SUCCESS && (mtu < 23 || mps < 23))
5223 return -EPROTO;
5224
5225 BT_DBG("dcid 0x%4.4x mtu %u mps %u credits %u result 0x%2.2x",
5226 dcid, mtu, mps, credits, result);
5227
5228 mutex_lock(&conn->chan_lock);
5229
5230 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5231 if (!chan) {
5232 err = -EBADSLT;
5233 goto unlock;
5234 }
5235
5236 err = 0;
5237
5238 l2cap_chan_lock(chan);
5239
5240 switch (result) {
5241 case L2CAP_CR_SUCCESS:
5242 chan->ident = 0;
5243 chan->dcid = dcid;
5244 chan->omtu = mtu;
5245 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005246 chan->tx_credits = credits;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005247 l2cap_chan_ready(chan);
5248 break;
5249
5250 default:
5251 l2cap_chan_del(chan, ECONNREFUSED);
5252 break;
5253 }
5254
5255 l2cap_chan_unlock(chan);
5256
5257unlock:
5258 mutex_unlock(&conn->chan_lock);
5259
5260 return err;
5261}
5262
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005263static inline int l2cap_bredr_sig_cmd(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005264 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5265 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005266{
5267 int err = 0;
5268
5269 switch (cmd->code) {
5270 case L2CAP_COMMAND_REJ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005271 l2cap_command_rej(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005272 break;
5273
5274 case L2CAP_CONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005275 err = l2cap_connect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005276 break;
5277
5278 case L2CAP_CONN_RSP:
Mat Martineauf5a25982012-10-11 17:48:21 +03005279 case L2CAP_CREATE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005280 l2cap_connect_create_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005281 break;
5282
5283 case L2CAP_CONF_REQ:
5284 err = l2cap_config_req(conn, cmd, cmd_len, data);
5285 break;
5286
5287 case L2CAP_CONF_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005288 l2cap_config_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005289 break;
5290
5291 case L2CAP_DISCONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005292 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005293 break;
5294
5295 case L2CAP_DISCONN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005296 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005297 break;
5298
5299 case L2CAP_ECHO_REQ:
5300 l2cap_send_cmd(conn, cmd->ident, L2CAP_ECHO_RSP, cmd_len, data);
5301 break;
5302
5303 case L2CAP_ECHO_RSP:
5304 break;
5305
5306 case L2CAP_INFO_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005307 err = l2cap_information_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005308 break;
5309
5310 case L2CAP_INFO_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005311 l2cap_information_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005312 break;
5313
Mat Martineauf94ff6f2011-11-02 16:18:32 -07005314 case L2CAP_CREATE_CHAN_REQ:
5315 err = l2cap_create_channel_req(conn, cmd, cmd_len, data);
5316 break;
5317
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005318 case L2CAP_MOVE_CHAN_REQ:
5319 err = l2cap_move_channel_req(conn, cmd, cmd_len, data);
5320 break;
5321
5322 case L2CAP_MOVE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005323 l2cap_move_channel_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005324 break;
5325
5326 case L2CAP_MOVE_CHAN_CFM:
5327 err = l2cap_move_channel_confirm(conn, cmd, cmd_len, data);
5328 break;
5329
5330 case L2CAP_MOVE_CHAN_CFM_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005331 l2cap_move_channel_confirm_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005332 break;
5333
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005334 default:
5335 BT_ERR("Unknown BR/EDR signaling command 0x%2.2x", cmd->code);
5336 err = -EINVAL;
5337 break;
5338 }
5339
5340 return err;
5341}
5342
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005343static int l2cap_le_connect_req(struct l2cap_conn *conn,
5344 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5345 u8 *data)
5346{
5347 struct l2cap_le_conn_req *req = (struct l2cap_le_conn_req *) data;
5348 struct l2cap_le_conn_rsp rsp;
5349 struct l2cap_chan *chan, *pchan;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005350 u16 dcid, scid, credits, mtu, mps;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005351 __le16 psm;
5352 u8 result;
5353
5354 if (cmd_len != sizeof(*req))
5355 return -EPROTO;
5356
5357 scid = __le16_to_cpu(req->scid);
5358 mtu = __le16_to_cpu(req->mtu);
5359 mps = __le16_to_cpu(req->mps);
5360 psm = req->psm;
5361 dcid = 0;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005362 credits = 0;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005363
5364 if (mtu < 23 || mps < 23)
5365 return -EPROTO;
5366
5367 BT_DBG("psm 0x%2.2x scid 0x%4.4x mtu %u mps %u", __le16_to_cpu(psm),
5368 scid, mtu, mps);
5369
5370 /* Check if we have socket listening on psm */
5371 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
5372 &conn->hcon->dst, LE_LINK);
5373 if (!pchan) {
5374 result = L2CAP_CR_BAD_PSM;
5375 chan = NULL;
5376 goto response;
5377 }
5378
5379 mutex_lock(&conn->chan_lock);
5380 l2cap_chan_lock(pchan);
5381
5382 if (!smp_sufficient_security(conn->hcon, pchan->sec_level)) {
5383 result = L2CAP_CR_AUTHENTICATION;
5384 chan = NULL;
5385 goto response_unlock;
5386 }
5387
5388 /* Check if we already have channel with that dcid */
5389 if (__l2cap_get_chan_by_dcid(conn, scid)) {
5390 result = L2CAP_CR_NO_MEM;
5391 chan = NULL;
5392 goto response_unlock;
5393 }
5394
5395 chan = pchan->ops->new_connection(pchan);
5396 if (!chan) {
5397 result = L2CAP_CR_NO_MEM;
5398 goto response_unlock;
5399 }
5400
Johan Hedberg0ce43ce2013-12-05 14:55:33 +02005401 l2cap_le_flowctl_init(chan);
5402
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005403 bacpy(&chan->src, &conn->hcon->src);
5404 bacpy(&chan->dst, &conn->hcon->dst);
5405 chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type);
5406 chan->dst_type = bdaddr_type(conn->hcon, conn->hcon->dst_type);
5407 chan->psm = psm;
5408 chan->dcid = scid;
5409 chan->omtu = mtu;
5410 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005411 chan->tx_credits = __le16_to_cpu(req->credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005412
5413 __l2cap_chan_add(conn, chan);
5414 dcid = chan->scid;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005415 credits = chan->rx_credits;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005416
5417 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
5418
5419 chan->ident = cmd->ident;
5420
5421 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
5422 l2cap_state_change(chan, BT_CONNECT2);
5423 result = L2CAP_CR_PEND;
5424 chan->ops->defer(chan);
5425 } else {
5426 l2cap_chan_ready(chan);
5427 result = L2CAP_CR_SUCCESS;
5428 }
5429
5430response_unlock:
5431 l2cap_chan_unlock(pchan);
5432 mutex_unlock(&conn->chan_lock);
Johan Hedberga24cce12014-08-07 22:56:42 +03005433 l2cap_chan_put(pchan);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005434
5435 if (result == L2CAP_CR_PEND)
5436 return 0;
5437
5438response:
5439 if (chan) {
5440 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02005441 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005442 } else {
5443 rsp.mtu = 0;
5444 rsp.mps = 0;
5445 }
5446
5447 rsp.dcid = cpu_to_le16(dcid);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005448 rsp.credits = cpu_to_le16(credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005449 rsp.result = cpu_to_le16(result);
5450
5451 l2cap_send_cmd(conn, cmd->ident, L2CAP_LE_CONN_RSP, sizeof(rsp), &rsp);
5452
5453 return 0;
5454}
5455
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005456static inline int l2cap_le_credits(struct l2cap_conn *conn,
5457 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5458 u8 *data)
5459{
5460 struct l2cap_le_credits *pkt;
5461 struct l2cap_chan *chan;
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005462 u16 cid, credits, max_credits;
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005463
5464 if (cmd_len != sizeof(*pkt))
5465 return -EPROTO;
5466
5467 pkt = (struct l2cap_le_credits *) data;
5468 cid = __le16_to_cpu(pkt->cid);
5469 credits = __le16_to_cpu(pkt->credits);
5470
5471 BT_DBG("cid 0x%4.4x credits 0x%4.4x", cid, credits);
5472
5473 chan = l2cap_get_chan_by_dcid(conn, cid);
5474 if (!chan)
5475 return -EBADSLT;
5476
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005477 max_credits = LE_FLOWCTL_MAX_CREDITS - chan->tx_credits;
5478 if (credits > max_credits) {
5479 BT_ERR("LE credits overflow");
5480 l2cap_send_disconn_req(chan, ECONNRESET);
5481
5482 /* Return 0 so that we don't trigger an unnecessary
5483 * command reject packet.
5484 */
5485 return 0;
5486 }
5487
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005488 chan->tx_credits += credits;
5489
5490 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
5491 l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
5492 chan->tx_credits--;
5493 }
5494
5495 if (chan->tx_credits)
5496 chan->ops->resume(chan);
5497
5498 l2cap_chan_unlock(chan);
5499
5500 return 0;
5501}
5502
Johan Hedberg71fb4192013-12-10 10:52:48 +02005503static inline int l2cap_le_command_rej(struct l2cap_conn *conn,
5504 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5505 u8 *data)
5506{
5507 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
5508 struct l2cap_chan *chan;
5509
5510 if (cmd_len < sizeof(*rej))
5511 return -EPROTO;
5512
5513 mutex_lock(&conn->chan_lock);
5514
5515 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5516 if (!chan)
5517 goto done;
5518
5519 l2cap_chan_lock(chan);
5520 l2cap_chan_del(chan, ECONNREFUSED);
5521 l2cap_chan_unlock(chan);
5522
5523done:
5524 mutex_unlock(&conn->chan_lock);
5525 return 0;
5526}
5527
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005528static inline int l2cap_le_sig_cmd(struct l2cap_conn *conn,
Johan Hedberg203e6392013-05-15 10:07:15 +03005529 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5530 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005531{
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005532 int err = 0;
5533
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005534 switch (cmd->code) {
5535 case L2CAP_COMMAND_REJ:
Johan Hedberg71fb4192013-12-10 10:52:48 +02005536 l2cap_le_command_rej(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005537 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005538
5539 case L2CAP_CONN_PARAM_UPDATE_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005540 err = l2cap_conn_param_update_req(conn, cmd, cmd_len, data);
5541 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005542
5543 case L2CAP_CONN_PARAM_UPDATE_RSP:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005544 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005545
Johan Hedbergf1496de2013-05-13 14:15:56 +03005546 case L2CAP_LE_CONN_RSP:
5547 l2cap_le_connect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005548 break;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005549
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005550 case L2CAP_LE_CONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005551 err = l2cap_le_connect_req(conn, cmd, cmd_len, data);
5552 break;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005553
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005554 case L2CAP_LE_CREDITS:
5555 err = l2cap_le_credits(conn, cmd, cmd_len, data);
5556 break;
5557
Johan Hedberg3defe012013-05-15 10:16:06 +03005558 case L2CAP_DISCONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005559 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
5560 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005561
5562 case L2CAP_DISCONN_RSP:
5563 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005564 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005565
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005566 default:
5567 BT_ERR("Unknown LE signaling command 0x%2.2x", cmd->code);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005568 err = -EINVAL;
5569 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005570 }
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005571
5572 return err;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005573}
5574
Johan Hedbergc5623552013-04-29 19:35:33 +03005575static inline void l2cap_le_sig_channel(struct l2cap_conn *conn,
5576 struct sk_buff *skb)
5577{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005578 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005579 struct l2cap_cmd_hdr *cmd;
5580 u16 len;
Johan Hedbergc5623552013-04-29 19:35:33 +03005581 int err;
5582
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005583 if (hcon->type != LE_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005584 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005585
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005586 if (skb->len < L2CAP_CMD_HDR_SIZE)
5587 goto drop;
Johan Hedbergc5623552013-04-29 19:35:33 +03005588
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005589 cmd = (void *) skb->data;
5590 skb_pull(skb, L2CAP_CMD_HDR_SIZE);
Johan Hedbergc5623552013-04-29 19:35:33 +03005591
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005592 len = le16_to_cpu(cmd->len);
Johan Hedbergc5623552013-04-29 19:35:33 +03005593
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005594 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd->code, len, cmd->ident);
Johan Hedbergc5623552013-04-29 19:35:33 +03005595
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005596 if (len != skb->len || !cmd->ident) {
5597 BT_DBG("corrupted command");
5598 goto drop;
5599 }
Johan Hedbergc5623552013-04-29 19:35:33 +03005600
Johan Hedberg203e6392013-05-15 10:07:15 +03005601 err = l2cap_le_sig_cmd(conn, cmd, len, skb->data);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005602 if (err) {
5603 struct l2cap_cmd_rej_unk rej;
Johan Hedbergc5623552013-04-29 19:35:33 +03005604
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005605 BT_ERR("Wrong link type (%d)", err);
Johan Hedbergc5623552013-04-29 19:35:33 +03005606
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005607 rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005608 l2cap_send_cmd(conn, cmd->ident, L2CAP_COMMAND_REJ,
5609 sizeof(rej), &rej);
Johan Hedbergc5623552013-04-29 19:35:33 +03005610 }
5611
Marcel Holtmann3b166292013-10-02 08:28:21 -07005612drop:
Johan Hedbergc5623552013-04-29 19:35:33 +03005613 kfree_skb(skb);
5614}
5615
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005616static inline void l2cap_sig_channel(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005617 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005618{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005619 struct hci_conn *hcon = conn->hcon;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005620 u8 *data = skb->data;
5621 int len = skb->len;
5622 struct l2cap_cmd_hdr cmd;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005623 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005624
5625 l2cap_raw_recv(conn, skb);
5626
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005627 if (hcon->type != ACL_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005628 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005629
Linus Torvalds1da177e2005-04-16 15:20:36 -07005630 while (len >= L2CAP_CMD_HDR_SIZE) {
Al Viro88219a02007-07-29 00:17:25 -07005631 u16 cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005632 memcpy(&cmd, data, L2CAP_CMD_HDR_SIZE);
5633 data += L2CAP_CMD_HDR_SIZE;
5634 len -= L2CAP_CMD_HDR_SIZE;
5635
Al Viro88219a02007-07-29 00:17:25 -07005636 cmd_len = le16_to_cpu(cmd.len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005637
Gustavo Padovan2d792812012-10-06 10:07:01 +01005638 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd.code, cmd_len,
5639 cmd.ident);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005640
Al Viro88219a02007-07-29 00:17:25 -07005641 if (cmd_len > len || !cmd.ident) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005642 BT_DBG("corrupted command");
5643 break;
5644 }
5645
Johan Hedbergc5623552013-04-29 19:35:33 +03005646 err = l2cap_bredr_sig_cmd(conn, &cmd, cmd_len, data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005647 if (err) {
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03005648 struct l2cap_cmd_rej_unk rej;
Gustavo F. Padovan2c6d1a22011-03-23 14:38:32 -03005649
5650 BT_ERR("Wrong link type (%d)", err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005651
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005652 rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Gustavo Padovan2d792812012-10-06 10:07:01 +01005653 l2cap_send_cmd(conn, cmd.ident, L2CAP_COMMAND_REJ,
5654 sizeof(rej), &rej);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005655 }
5656
Al Viro88219a02007-07-29 00:17:25 -07005657 data += cmd_len;
5658 len -= cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005659 }
5660
Marcel Holtmann3b166292013-10-02 08:28:21 -07005661drop:
Linus Torvalds1da177e2005-04-16 15:20:36 -07005662 kfree_skb(skb);
5663}
5664
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005665static int l2cap_check_fcs(struct l2cap_chan *chan, struct sk_buff *skb)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005666{
5667 u16 our_fcs, rcv_fcs;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03005668 int hdr_size;
5669
5670 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
5671 hdr_size = L2CAP_EXT_HDR_SIZE;
5672 else
5673 hdr_size = L2CAP_ENH_HDR_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005674
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005675 if (chan->fcs == L2CAP_FCS_CRC16) {
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005676 skb_trim(skb, skb->len - L2CAP_FCS_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005677 rcv_fcs = get_unaligned_le16(skb->data + skb->len);
5678 our_fcs = crc16(0, skb->data - hdr_size, skb->len + hdr_size);
5679
5680 if (our_fcs != rcv_fcs)
João Paulo Rechi Vita7a560e52010-06-22 13:56:27 -03005681 return -EBADMSG;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005682 }
5683 return 0;
5684}
5685
Mat Martineau6ea00482012-05-17 20:53:52 -07005686static void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan)
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005687{
Mat Martineaue31f7632012-05-17 20:53:41 -07005688 struct l2cap_ctrl control;
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005689
Mat Martineaue31f7632012-05-17 20:53:41 -07005690 BT_DBG("chan %p", chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005691
Mat Martineaue31f7632012-05-17 20:53:41 -07005692 memset(&control, 0, sizeof(control));
5693 control.sframe = 1;
5694 control.final = 1;
5695 control.reqseq = chan->buffer_seq;
5696 set_bit(CONN_SEND_FBIT, &chan->conn_state);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005697
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005698 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
Mat Martineaue31f7632012-05-17 20:53:41 -07005699 control.super = L2CAP_SUPER_RNR;
5700 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005701 }
5702
Mat Martineaue31f7632012-05-17 20:53:41 -07005703 if (test_and_clear_bit(CONN_REMOTE_BUSY, &chan->conn_state) &&
5704 chan->unacked_frames > 0)
5705 __set_retrans_timer(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005706
Mat Martineaue31f7632012-05-17 20:53:41 -07005707 /* Send pending iframes */
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03005708 l2cap_ertm_send(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005709
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005710 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
Mat Martineaue31f7632012-05-17 20:53:41 -07005711 test_bit(CONN_SEND_FBIT, &chan->conn_state)) {
5712 /* F-bit wasn't sent in an s-frame or i-frame yet, so
5713 * send it now.
5714 */
5715 control.super = L2CAP_SUPER_RR;
5716 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005717 }
5718}
5719
Gustavo Padovan2d792812012-10-06 10:07:01 +01005720static void append_skb_frag(struct sk_buff *skb, struct sk_buff *new_frag,
5721 struct sk_buff **last_frag)
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005722{
Mat Martineau84084a32011-07-22 14:54:00 -07005723 /* skb->len reflects data in skb as well as all fragments
5724 * skb->data_len reflects only data in fragments
5725 */
5726 if (!skb_has_frag_list(skb))
5727 skb_shinfo(skb)->frag_list = new_frag;
5728
5729 new_frag->next = NULL;
5730
5731 (*last_frag)->next = new_frag;
5732 *last_frag = new_frag;
5733
5734 skb->len += new_frag->len;
5735 skb->data_len += new_frag->len;
5736 skb->truesize += new_frag->truesize;
5737}
5738
Mat Martineau4b51dae92012-05-17 20:53:37 -07005739static int l2cap_reassemble_sdu(struct l2cap_chan *chan, struct sk_buff *skb,
5740 struct l2cap_ctrl *control)
Mat Martineau84084a32011-07-22 14:54:00 -07005741{
5742 int err = -EINVAL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005743
Mat Martineau4b51dae92012-05-17 20:53:37 -07005744 switch (control->sar) {
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005745 case L2CAP_SAR_UNSEGMENTED:
Mat Martineau84084a32011-07-22 14:54:00 -07005746 if (chan->sdu)
5747 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005748
Gustavo Padovan80b98022012-05-27 22:27:51 -03005749 err = chan->ops->recv(chan, skb);
Mat Martineau84084a32011-07-22 14:54:00 -07005750 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005751
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005752 case L2CAP_SAR_START:
Mat Martineau84084a32011-07-22 14:54:00 -07005753 if (chan->sdu)
5754 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005755
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005756 chan->sdu_len = get_unaligned_le16(skb->data);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005757 skb_pull(skb, L2CAP_SDULEN_SIZE);
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005758
Mat Martineau84084a32011-07-22 14:54:00 -07005759 if (chan->sdu_len > chan->imtu) {
5760 err = -EMSGSIZE;
5761 break;
5762 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005763
Mat Martineau84084a32011-07-22 14:54:00 -07005764 if (skb->len >= chan->sdu_len)
5765 break;
5766
5767 chan->sdu = skb;
5768 chan->sdu_last_frag = skb;
5769
5770 skb = NULL;
5771 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005772 break;
5773
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005774 case L2CAP_SAR_CONTINUE:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005775 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005776 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005777
Mat Martineau84084a32011-07-22 14:54:00 -07005778 append_skb_frag(chan->sdu, skb,
5779 &chan->sdu_last_frag);
5780 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005781
Mat Martineau84084a32011-07-22 14:54:00 -07005782 if (chan->sdu->len >= chan->sdu_len)
5783 break;
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005784
Mat Martineau84084a32011-07-22 14:54:00 -07005785 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005786 break;
5787
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005788 case L2CAP_SAR_END:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005789 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005790 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005791
Mat Martineau84084a32011-07-22 14:54:00 -07005792 append_skb_frag(chan->sdu, skb,
5793 &chan->sdu_last_frag);
5794 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005795
Mat Martineau84084a32011-07-22 14:54:00 -07005796 if (chan->sdu->len != chan->sdu_len)
5797 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005798
Gustavo Padovan80b98022012-05-27 22:27:51 -03005799 err = chan->ops->recv(chan, chan->sdu);
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005800
Mat Martineau84084a32011-07-22 14:54:00 -07005801 if (!err) {
5802 /* Reassembly complete */
5803 chan->sdu = NULL;
5804 chan->sdu_last_frag = NULL;
5805 chan->sdu_len = 0;
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005806 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005807 break;
5808 }
5809
Mat Martineau84084a32011-07-22 14:54:00 -07005810 if (err) {
5811 kfree_skb(skb);
5812 kfree_skb(chan->sdu);
5813 chan->sdu = NULL;
5814 chan->sdu_last_frag = NULL;
5815 chan->sdu_len = 0;
5816 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005817
Mat Martineau84084a32011-07-22 14:54:00 -07005818 return err;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005819}
5820
Mat Martineau32b32732012-10-23 15:24:11 -07005821static int l2cap_resegment(struct l2cap_chan *chan)
5822{
5823 /* Placeholder */
5824 return 0;
5825}
5826
Mat Martineaue3281402011-07-07 09:39:02 -07005827void l2cap_chan_busy(struct l2cap_chan *chan, int busy)
Gustavo F. Padovan712132eb2010-06-21 19:39:50 -03005828{
Mat Martineau61aa4f52012-05-17 20:53:40 -07005829 u8 event;
5830
5831 if (chan->mode != L2CAP_MODE_ERTM)
5832 return;
5833
5834 event = busy ? L2CAP_EV_LOCAL_BUSY_DETECTED : L2CAP_EV_LOCAL_BUSY_CLEAR;
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03005835 l2cap_tx(chan, NULL, NULL, event);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005836}
5837
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005838static int l2cap_rx_queued_iframes(struct l2cap_chan *chan)
5839{
Mat Martineau63838722012-05-17 20:53:45 -07005840 int err = 0;
5841 /* Pass sequential frames to l2cap_reassemble_sdu()
5842 * until a gap is encountered.
5843 */
5844
5845 BT_DBG("chan %p", chan);
5846
5847 while (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
5848 struct sk_buff *skb;
5849 BT_DBG("Searching for skb with txseq %d (queue len %d)",
5850 chan->buffer_seq, skb_queue_len(&chan->srej_q));
5851
5852 skb = l2cap_ertm_seq_in_queue(&chan->srej_q, chan->buffer_seq);
5853
5854 if (!skb)
5855 break;
5856
5857 skb_unlink(skb, &chan->srej_q);
5858 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
5859 err = l2cap_reassemble_sdu(chan, skb, &bt_cb(skb)->control);
5860 if (err)
5861 break;
5862 }
5863
5864 if (skb_queue_empty(&chan->srej_q)) {
5865 chan->rx_state = L2CAP_RX_STATE_RECV;
5866 l2cap_send_ack(chan);
5867 }
5868
5869 return err;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005870}
5871
5872static void l2cap_handle_srej(struct l2cap_chan *chan,
5873 struct l2cap_ctrl *control)
5874{
Mat Martineauf80842a2012-05-17 20:53:46 -07005875 struct sk_buff *skb;
5876
5877 BT_DBG("chan %p, control %p", chan, control);
5878
5879 if (control->reqseq == chan->next_tx_seq) {
5880 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005881 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005882 return;
5883 }
5884
5885 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
5886
5887 if (skb == NULL) {
5888 BT_DBG("Seq %d not available for retransmission",
5889 control->reqseq);
5890 return;
5891 }
5892
5893 if (chan->max_tx != 0 && bt_cb(skb)->control.retries >= chan->max_tx) {
5894 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005895 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005896 return;
5897 }
5898
5899 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
5900
5901 if (control->poll) {
5902 l2cap_pass_to_tx(chan, control);
5903
5904 set_bit(CONN_SEND_FBIT, &chan->conn_state);
5905 l2cap_retransmit(chan, control);
5906 l2cap_ertm_send(chan);
5907
5908 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5909 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5910 chan->srej_save_reqseq = control->reqseq;
5911 }
5912 } else {
5913 l2cap_pass_to_tx_fbit(chan, control);
5914
5915 if (control->final) {
5916 if (chan->srej_save_reqseq != control->reqseq ||
5917 !test_and_clear_bit(CONN_SREJ_ACT,
5918 &chan->conn_state))
5919 l2cap_retransmit(chan, control);
5920 } else {
5921 l2cap_retransmit(chan, control);
5922 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5923 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5924 chan->srej_save_reqseq = control->reqseq;
5925 }
5926 }
5927 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005928}
5929
5930static void l2cap_handle_rej(struct l2cap_chan *chan,
5931 struct l2cap_ctrl *control)
5932{
Mat Martineaufcd289d2012-05-17 20:53:47 -07005933 struct sk_buff *skb;
5934
5935 BT_DBG("chan %p, control %p", chan, control);
5936
5937 if (control->reqseq == chan->next_tx_seq) {
5938 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005939 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07005940 return;
5941 }
5942
5943 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
5944
5945 if (chan->max_tx && skb &&
5946 bt_cb(skb)->control.retries >= chan->max_tx) {
5947 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005948 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07005949 return;
5950 }
5951
5952 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
5953
5954 l2cap_pass_to_tx(chan, control);
5955
5956 if (control->final) {
5957 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state))
5958 l2cap_retransmit_all(chan, control);
5959 } else {
5960 l2cap_retransmit_all(chan, control);
5961 l2cap_ertm_send(chan);
5962 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F)
5963 set_bit(CONN_REJ_ACT, &chan->conn_state);
5964 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005965}
5966
Mat Martineau4b51dae92012-05-17 20:53:37 -07005967static u8 l2cap_classify_txseq(struct l2cap_chan *chan, u16 txseq)
5968{
5969 BT_DBG("chan %p, txseq %d", chan, txseq);
5970
5971 BT_DBG("last_acked_seq %d, expected_tx_seq %d", chan->last_acked_seq,
5972 chan->expected_tx_seq);
5973
5974 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
5975 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
Gustavo Padovan2d792812012-10-06 10:07:01 +01005976 chan->tx_win) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07005977 /* See notes below regarding "double poll" and
5978 * invalid packets.
5979 */
5980 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
5981 BT_DBG("Invalid/Ignore - after SREJ");
5982 return L2CAP_TXSEQ_INVALID_IGNORE;
5983 } else {
5984 BT_DBG("Invalid - in window after SREJ sent");
5985 return L2CAP_TXSEQ_INVALID;
5986 }
5987 }
5988
5989 if (chan->srej_list.head == txseq) {
5990 BT_DBG("Expected SREJ");
5991 return L2CAP_TXSEQ_EXPECTED_SREJ;
5992 }
5993
5994 if (l2cap_ertm_seq_in_queue(&chan->srej_q, txseq)) {
5995 BT_DBG("Duplicate SREJ - txseq already stored");
5996 return L2CAP_TXSEQ_DUPLICATE_SREJ;
5997 }
5998
5999 if (l2cap_seq_list_contains(&chan->srej_list, txseq)) {
6000 BT_DBG("Unexpected SREJ - not requested");
6001 return L2CAP_TXSEQ_UNEXPECTED_SREJ;
6002 }
6003 }
6004
6005 if (chan->expected_tx_seq == txseq) {
6006 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
6007 chan->tx_win) {
6008 BT_DBG("Invalid - txseq outside tx window");
6009 return L2CAP_TXSEQ_INVALID;
6010 } else {
6011 BT_DBG("Expected");
6012 return L2CAP_TXSEQ_EXPECTED;
6013 }
6014 }
6015
6016 if (__seq_offset(chan, txseq, chan->last_acked_seq) <
Gustavo Padovan2d792812012-10-06 10:07:01 +01006017 __seq_offset(chan, chan->expected_tx_seq, chan->last_acked_seq)) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07006018 BT_DBG("Duplicate - expected_tx_seq later than txseq");
6019 return L2CAP_TXSEQ_DUPLICATE;
6020 }
6021
6022 if (__seq_offset(chan, txseq, chan->last_acked_seq) >= chan->tx_win) {
6023 /* A source of invalid packets is a "double poll" condition,
6024 * where delays cause us to send multiple poll packets. If
6025 * the remote stack receives and processes both polls,
6026 * sequence numbers can wrap around in such a way that a
6027 * resent frame has a sequence number that looks like new data
6028 * with a sequence gap. This would trigger an erroneous SREJ
6029 * request.
6030 *
6031 * Fortunately, this is impossible with a tx window that's
6032 * less than half of the maximum sequence number, which allows
6033 * invalid frames to be safely ignored.
6034 *
6035 * With tx window sizes greater than half of the tx window
6036 * maximum, the frame is invalid and cannot be ignored. This
6037 * causes a disconnect.
6038 */
6039
6040 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
6041 BT_DBG("Invalid/Ignore - txseq outside tx window");
6042 return L2CAP_TXSEQ_INVALID_IGNORE;
6043 } else {
6044 BT_DBG("Invalid - txseq outside tx window");
6045 return L2CAP_TXSEQ_INVALID;
6046 }
6047 } else {
6048 BT_DBG("Unexpected - txseq indicates missing frames");
6049 return L2CAP_TXSEQ_UNEXPECTED;
6050 }
6051}
6052
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006053static int l2cap_rx_state_recv(struct l2cap_chan *chan,
6054 struct l2cap_ctrl *control,
6055 struct sk_buff *skb, u8 event)
6056{
6057 int err = 0;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006058 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006059
6060 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6061 event);
6062
6063 switch (event) {
6064 case L2CAP_EV_RECV_IFRAME:
6065 switch (l2cap_classify_txseq(chan, control->txseq)) {
6066 case L2CAP_TXSEQ_EXPECTED:
6067 l2cap_pass_to_tx(chan, control);
6068
6069 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6070 BT_DBG("Busy, discarding expected seq %d",
6071 control->txseq);
6072 break;
6073 }
6074
6075 chan->expected_tx_seq = __next_seq(chan,
6076 control->txseq);
6077
6078 chan->buffer_seq = chan->expected_tx_seq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006079 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006080
6081 err = l2cap_reassemble_sdu(chan, skb, control);
6082 if (err)
6083 break;
6084
6085 if (control->final) {
6086 if (!test_and_clear_bit(CONN_REJ_ACT,
6087 &chan->conn_state)) {
6088 control->final = 0;
6089 l2cap_retransmit_all(chan, control);
6090 l2cap_ertm_send(chan);
6091 }
6092 }
6093
6094 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
6095 l2cap_send_ack(chan);
6096 break;
6097 case L2CAP_TXSEQ_UNEXPECTED:
6098 l2cap_pass_to_tx(chan, control);
6099
6100 /* Can't issue SREJ frames in the local busy state.
6101 * Drop this frame, it will be seen as missing
6102 * when local busy is exited.
6103 */
6104 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6105 BT_DBG("Busy, discarding unexpected seq %d",
6106 control->txseq);
6107 break;
6108 }
6109
6110 /* There was a gap in the sequence, so an SREJ
6111 * must be sent for each missing frame. The
6112 * current frame is stored for later use.
6113 */
6114 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006115 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006116 BT_DBG("Queued %p (queue len %d)", skb,
6117 skb_queue_len(&chan->srej_q));
6118
6119 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
6120 l2cap_seq_list_clear(&chan->srej_list);
6121 l2cap_send_srej(chan, control->txseq);
6122
6123 chan->rx_state = L2CAP_RX_STATE_SREJ_SENT;
6124 break;
6125 case L2CAP_TXSEQ_DUPLICATE:
6126 l2cap_pass_to_tx(chan, control);
6127 break;
6128 case L2CAP_TXSEQ_INVALID_IGNORE:
6129 break;
6130 case L2CAP_TXSEQ_INVALID:
6131 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006132 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006133 break;
6134 }
6135 break;
6136 case L2CAP_EV_RECV_RR:
6137 l2cap_pass_to_tx(chan, control);
6138 if (control->final) {
6139 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6140
Mat Martineaue6a3ee62012-10-23 15:24:22 -07006141 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state) &&
6142 !__chan_is_moving(chan)) {
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006143 control->final = 0;
6144 l2cap_retransmit_all(chan, control);
6145 }
6146
6147 l2cap_ertm_send(chan);
6148 } else if (control->poll) {
6149 l2cap_send_i_or_rr_or_rnr(chan);
6150 } else {
6151 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6152 &chan->conn_state) &&
6153 chan->unacked_frames)
6154 __set_retrans_timer(chan);
6155
6156 l2cap_ertm_send(chan);
6157 }
6158 break;
6159 case L2CAP_EV_RECV_RNR:
6160 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6161 l2cap_pass_to_tx(chan, control);
6162 if (control && control->poll) {
6163 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6164 l2cap_send_rr_or_rnr(chan, 0);
6165 }
6166 __clear_retrans_timer(chan);
6167 l2cap_seq_list_clear(&chan->retrans_list);
6168 break;
6169 case L2CAP_EV_RECV_REJ:
6170 l2cap_handle_rej(chan, control);
6171 break;
6172 case L2CAP_EV_RECV_SREJ:
6173 l2cap_handle_srej(chan, control);
6174 break;
6175 default:
6176 break;
6177 }
6178
6179 if (skb && !skb_in_use) {
6180 BT_DBG("Freeing %p", skb);
6181 kfree_skb(skb);
6182 }
6183
6184 return err;
6185}
6186
6187static int l2cap_rx_state_srej_sent(struct l2cap_chan *chan,
6188 struct l2cap_ctrl *control,
6189 struct sk_buff *skb, u8 event)
6190{
6191 int err = 0;
6192 u16 txseq = control->txseq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006193 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006194
6195 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6196 event);
6197
6198 switch (event) {
6199 case L2CAP_EV_RECV_IFRAME:
6200 switch (l2cap_classify_txseq(chan, txseq)) {
6201 case L2CAP_TXSEQ_EXPECTED:
6202 /* Keep frame for reassembly later */
6203 l2cap_pass_to_tx(chan, control);
6204 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006205 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006206 BT_DBG("Queued %p (queue len %d)", skb,
6207 skb_queue_len(&chan->srej_q));
6208
6209 chan->expected_tx_seq = __next_seq(chan, txseq);
6210 break;
6211 case L2CAP_TXSEQ_EXPECTED_SREJ:
6212 l2cap_seq_list_pop(&chan->srej_list);
6213
6214 l2cap_pass_to_tx(chan, control);
6215 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006216 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006217 BT_DBG("Queued %p (queue len %d)", skb,
6218 skb_queue_len(&chan->srej_q));
6219
6220 err = l2cap_rx_queued_iframes(chan);
6221 if (err)
6222 break;
6223
6224 break;
6225 case L2CAP_TXSEQ_UNEXPECTED:
6226 /* Got a frame that can't be reassembled yet.
6227 * Save it for later, and send SREJs to cover
6228 * the missing frames.
6229 */
6230 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006231 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006232 BT_DBG("Queued %p (queue len %d)", skb,
6233 skb_queue_len(&chan->srej_q));
6234
6235 l2cap_pass_to_tx(chan, control);
6236 l2cap_send_srej(chan, control->txseq);
6237 break;
6238 case L2CAP_TXSEQ_UNEXPECTED_SREJ:
6239 /* This frame was requested with an SREJ, but
6240 * some expected retransmitted frames are
6241 * missing. Request retransmission of missing
6242 * SREJ'd frames.
6243 */
6244 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006245 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006246 BT_DBG("Queued %p (queue len %d)", skb,
6247 skb_queue_len(&chan->srej_q));
6248
6249 l2cap_pass_to_tx(chan, control);
6250 l2cap_send_srej_list(chan, control->txseq);
6251 break;
6252 case L2CAP_TXSEQ_DUPLICATE_SREJ:
6253 /* We've already queued this frame. Drop this copy. */
6254 l2cap_pass_to_tx(chan, control);
6255 break;
6256 case L2CAP_TXSEQ_DUPLICATE:
6257 /* Expecting a later sequence number, so this frame
6258 * was already received. Ignore it completely.
6259 */
6260 break;
6261 case L2CAP_TXSEQ_INVALID_IGNORE:
6262 break;
6263 case L2CAP_TXSEQ_INVALID:
6264 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006265 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006266 break;
6267 }
6268 break;
6269 case L2CAP_EV_RECV_RR:
6270 l2cap_pass_to_tx(chan, control);
6271 if (control->final) {
6272 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6273
6274 if (!test_and_clear_bit(CONN_REJ_ACT,
6275 &chan->conn_state)) {
6276 control->final = 0;
6277 l2cap_retransmit_all(chan, control);
6278 }
6279
6280 l2cap_ertm_send(chan);
6281 } else if (control->poll) {
6282 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6283 &chan->conn_state) &&
6284 chan->unacked_frames) {
6285 __set_retrans_timer(chan);
6286 }
6287
6288 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6289 l2cap_send_srej_tail(chan);
6290 } else {
6291 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6292 &chan->conn_state) &&
6293 chan->unacked_frames)
6294 __set_retrans_timer(chan);
6295
6296 l2cap_send_ack(chan);
6297 }
6298 break;
6299 case L2CAP_EV_RECV_RNR:
6300 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6301 l2cap_pass_to_tx(chan, control);
6302 if (control->poll) {
6303 l2cap_send_srej_tail(chan);
6304 } else {
6305 struct l2cap_ctrl rr_control;
6306 memset(&rr_control, 0, sizeof(rr_control));
6307 rr_control.sframe = 1;
6308 rr_control.super = L2CAP_SUPER_RR;
6309 rr_control.reqseq = chan->buffer_seq;
6310 l2cap_send_sframe(chan, &rr_control);
6311 }
6312
6313 break;
6314 case L2CAP_EV_RECV_REJ:
6315 l2cap_handle_rej(chan, control);
6316 break;
6317 case L2CAP_EV_RECV_SREJ:
6318 l2cap_handle_srej(chan, control);
6319 break;
6320 }
6321
6322 if (skb && !skb_in_use) {
6323 BT_DBG("Freeing %p", skb);
6324 kfree_skb(skb);
6325 }
6326
6327 return err;
6328}
6329
Mat Martineau32b32732012-10-23 15:24:11 -07006330static int l2cap_finish_move(struct l2cap_chan *chan)
6331{
6332 BT_DBG("chan %p", chan);
6333
6334 chan->rx_state = L2CAP_RX_STATE_RECV;
6335
6336 if (chan->hs_hcon)
6337 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6338 else
6339 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6340
6341 return l2cap_resegment(chan);
6342}
6343
6344static int l2cap_rx_state_wait_p(struct l2cap_chan *chan,
6345 struct l2cap_ctrl *control,
6346 struct sk_buff *skb, u8 event)
6347{
6348 int err;
6349
6350 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6351 event);
6352
6353 if (!control->poll)
6354 return -EPROTO;
6355
6356 l2cap_process_reqseq(chan, control->reqseq);
6357
6358 if (!skb_queue_empty(&chan->tx_q))
6359 chan->tx_send_head = skb_peek(&chan->tx_q);
6360 else
6361 chan->tx_send_head = NULL;
6362
6363 /* Rewind next_tx_seq to the point expected
6364 * by the receiver.
6365 */
6366 chan->next_tx_seq = control->reqseq;
6367 chan->unacked_frames = 0;
6368
6369 err = l2cap_finish_move(chan);
6370 if (err)
6371 return err;
6372
6373 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6374 l2cap_send_i_or_rr_or_rnr(chan);
6375
6376 if (event == L2CAP_EV_RECV_IFRAME)
6377 return -EPROTO;
6378
6379 return l2cap_rx_state_recv(chan, control, NULL, event);
6380}
6381
6382static int l2cap_rx_state_wait_f(struct l2cap_chan *chan,
6383 struct l2cap_ctrl *control,
6384 struct sk_buff *skb, u8 event)
6385{
6386 int err;
6387
6388 if (!control->final)
6389 return -EPROTO;
6390
6391 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6392
6393 chan->rx_state = L2CAP_RX_STATE_RECV;
6394 l2cap_process_reqseq(chan, control->reqseq);
6395
6396 if (!skb_queue_empty(&chan->tx_q))
6397 chan->tx_send_head = skb_peek(&chan->tx_q);
6398 else
6399 chan->tx_send_head = NULL;
6400
6401 /* Rewind next_tx_seq to the point expected
6402 * by the receiver.
6403 */
6404 chan->next_tx_seq = control->reqseq;
6405 chan->unacked_frames = 0;
6406
6407 if (chan->hs_hcon)
6408 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6409 else
6410 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6411
6412 err = l2cap_resegment(chan);
6413
6414 if (!err)
6415 err = l2cap_rx_state_recv(chan, control, skb, event);
6416
6417 return err;
6418}
6419
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006420static bool __valid_reqseq(struct l2cap_chan *chan, u16 reqseq)
6421{
6422 /* Make sure reqseq is for a packet that has been sent but not acked */
6423 u16 unacked;
6424
6425 unacked = __seq_offset(chan, chan->next_tx_seq, chan->expected_ack_seq);
6426 return __seq_offset(chan, chan->next_tx_seq, reqseq) <= unacked;
6427}
6428
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006429static int l2cap_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6430 struct sk_buff *skb, u8 event)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006431{
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006432 int err = 0;
6433
6434 BT_DBG("chan %p, control %p, skb %p, event %d, state %d", chan,
6435 control, skb, event, chan->rx_state);
6436
6437 if (__valid_reqseq(chan, control->reqseq)) {
6438 switch (chan->rx_state) {
6439 case L2CAP_RX_STATE_RECV:
6440 err = l2cap_rx_state_recv(chan, control, skb, event);
6441 break;
6442 case L2CAP_RX_STATE_SREJ_SENT:
6443 err = l2cap_rx_state_srej_sent(chan, control, skb,
6444 event);
6445 break;
Mat Martineau32b32732012-10-23 15:24:11 -07006446 case L2CAP_RX_STATE_WAIT_P:
6447 err = l2cap_rx_state_wait_p(chan, control, skb, event);
6448 break;
6449 case L2CAP_RX_STATE_WAIT_F:
6450 err = l2cap_rx_state_wait_f(chan, control, skb, event);
6451 break;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006452 default:
6453 /* shut it down */
6454 break;
6455 }
6456 } else {
6457 BT_DBG("Invalid reqseq %d (next_tx_seq %d, expected_ack_seq %d",
6458 control->reqseq, chan->next_tx_seq,
6459 chan->expected_ack_seq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006460 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006461 }
6462
6463 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006464}
6465
6466static int l2cap_stream_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6467 struct sk_buff *skb)
6468{
Mat Martineau4b51dae92012-05-17 20:53:37 -07006469 int err = 0;
6470
6471 BT_DBG("chan %p, control %p, skb %p, state %d", chan, control, skb,
6472 chan->rx_state);
6473
6474 if (l2cap_classify_txseq(chan, control->txseq) ==
6475 L2CAP_TXSEQ_EXPECTED) {
6476 l2cap_pass_to_tx(chan, control);
6477
6478 BT_DBG("buffer_seq %d->%d", chan->buffer_seq,
6479 __next_seq(chan, chan->buffer_seq));
6480
6481 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
6482
6483 l2cap_reassemble_sdu(chan, skb, control);
6484 } else {
6485 if (chan->sdu) {
6486 kfree_skb(chan->sdu);
6487 chan->sdu = NULL;
6488 }
6489 chan->sdu_last_frag = NULL;
6490 chan->sdu_len = 0;
6491
6492 if (skb) {
6493 BT_DBG("Freeing %p", skb);
6494 kfree_skb(skb);
6495 }
6496 }
6497
6498 chan->last_acked_seq = control->txseq;
6499 chan->expected_tx_seq = __next_seq(chan, control->txseq);
6500
6501 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006502}
6503
6504static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6505{
6506 struct l2cap_ctrl *control = &bt_cb(skb)->control;
6507 u16 len;
6508 u8 event;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006509
Mat Martineaub76bbd62012-04-11 10:48:43 -07006510 __unpack_control(chan, skb);
6511
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006512 len = skb->len;
6513
6514 /*
6515 * We can just drop the corrupted I-frame here.
6516 * Receiver will miss it and start proper recovery
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006517 * procedures and ask for retransmission.
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006518 */
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006519 if (l2cap_check_fcs(chan, skb))
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006520 goto drop;
6521
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006522 if (!control->sframe && control->sar == L2CAP_SAR_START)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006523 len -= L2CAP_SDULEN_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006524
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006525 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006526 len -= L2CAP_FCS_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006527
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006528 if (len > chan->mps) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006529 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006530 goto drop;
6531 }
6532
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006533 if (!control->sframe) {
6534 int err;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006535
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006536 BT_DBG("iframe sar %d, reqseq %d, final %d, txseq %d",
6537 control->sar, control->reqseq, control->final,
6538 control->txseq);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03006539
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006540 /* Validate F-bit - F=0 always valid, F=1 only
6541 * valid in TX WAIT_F
6542 */
6543 if (control->final && chan->tx_state != L2CAP_TX_STATE_WAIT_F)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006544 goto drop;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006545
6546 if (chan->mode != L2CAP_MODE_STREAMING) {
6547 event = L2CAP_EV_RECV_IFRAME;
6548 err = l2cap_rx(chan, control, skb, event);
6549 } else {
6550 err = l2cap_stream_rx(chan, control, skb);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006551 }
6552
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006553 if (err)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006554 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006555 } else {
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006556 const u8 rx_func_to_event[4] = {
6557 L2CAP_EV_RECV_RR, L2CAP_EV_RECV_REJ,
6558 L2CAP_EV_RECV_RNR, L2CAP_EV_RECV_SREJ
6559 };
6560
6561 /* Only I-frames are expected in streaming mode */
6562 if (chan->mode == L2CAP_MODE_STREAMING)
6563 goto drop;
6564
6565 BT_DBG("sframe reqseq %d, final %d, poll %d, super %d",
6566 control->reqseq, control->final, control->poll,
6567 control->super);
6568
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006569 if (len != 0) {
Andrei Emeltchenko1bb166e2012-11-20 17:16:21 +02006570 BT_ERR("Trailing bytes: %d in sframe", len);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006571 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006572 goto drop;
6573 }
6574
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006575 /* Validate F and P bits */
6576 if (control->final && (control->poll ||
6577 chan->tx_state != L2CAP_TX_STATE_WAIT_F))
6578 goto drop;
6579
6580 event = rx_func_to_event[control->super];
6581 if (l2cap_rx(chan, control, skb, event))
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006582 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006583 }
6584
6585 return 0;
6586
6587drop:
6588 kfree_skb(skb);
6589 return 0;
6590}
6591
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006592static void l2cap_chan_le_send_credits(struct l2cap_chan *chan)
6593{
6594 struct l2cap_conn *conn = chan->conn;
6595 struct l2cap_le_credits pkt;
6596 u16 return_credits;
6597
6598 /* We return more credits to the sender only after the amount of
6599 * credits falls below half of the initial amount.
6600 */
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02006601 if (chan->rx_credits >= (le_max_credits + 1) / 2)
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006602 return;
6603
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02006604 return_credits = le_max_credits - chan->rx_credits;
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006605
6606 BT_DBG("chan %p returning %u credits to sender", chan, return_credits);
6607
6608 chan->rx_credits += return_credits;
6609
6610 pkt.cid = cpu_to_le16(chan->scid);
6611 pkt.credits = cpu_to_le16(return_credits);
6612
6613 chan->ident = l2cap_get_ident(conn);
6614
6615 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CREDITS, sizeof(pkt), &pkt);
6616}
6617
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006618static int l2cap_le_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6619{
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006620 int err;
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006621
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006622 if (!chan->rx_credits) {
6623 BT_ERR("No credits to receive LE L2CAP data");
Johan Hedbergdfd97742014-01-27 15:11:34 -08006624 l2cap_send_disconn_req(chan, ECONNRESET);
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006625 return -ENOBUFS;
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006626 }
6627
6628 if (chan->imtu < skb->len) {
6629 BT_ERR("Too big LE L2CAP PDU");
6630 return -ENOBUFS;
6631 }
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006632
6633 chan->rx_credits--;
6634 BT_DBG("rx_credits %u -> %u", chan->rx_credits + 1, chan->rx_credits);
6635
6636 l2cap_chan_le_send_credits(chan);
6637
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006638 err = 0;
6639
6640 if (!chan->sdu) {
6641 u16 sdu_len;
6642
6643 sdu_len = get_unaligned_le16(skb->data);
6644 skb_pull(skb, L2CAP_SDULEN_SIZE);
6645
6646 BT_DBG("Start of new SDU. sdu_len %u skb->len %u imtu %u",
6647 sdu_len, skb->len, chan->imtu);
6648
6649 if (sdu_len > chan->imtu) {
6650 BT_ERR("Too big LE L2CAP SDU length received");
6651 err = -EMSGSIZE;
6652 goto failed;
6653 }
6654
6655 if (skb->len > sdu_len) {
6656 BT_ERR("Too much LE L2CAP data received");
6657 err = -EINVAL;
6658 goto failed;
6659 }
6660
6661 if (skb->len == sdu_len)
6662 return chan->ops->recv(chan, skb);
6663
6664 chan->sdu = skb;
6665 chan->sdu_len = sdu_len;
6666 chan->sdu_last_frag = skb;
6667
6668 return 0;
6669 }
6670
6671 BT_DBG("SDU fragment. chan->sdu->len %u skb->len %u chan->sdu_len %u",
6672 chan->sdu->len, skb->len, chan->sdu_len);
6673
6674 if (chan->sdu->len + skb->len > chan->sdu_len) {
6675 BT_ERR("Too much LE L2CAP data received");
6676 err = -EINVAL;
6677 goto failed;
6678 }
6679
6680 append_skb_frag(chan->sdu, skb, &chan->sdu_last_frag);
6681 skb = NULL;
6682
6683 if (chan->sdu->len == chan->sdu_len) {
6684 err = chan->ops->recv(chan, chan->sdu);
6685 if (!err) {
6686 chan->sdu = NULL;
6687 chan->sdu_last_frag = NULL;
6688 chan->sdu_len = 0;
6689 }
6690 }
6691
6692failed:
6693 if (err) {
6694 kfree_skb(skb);
6695 kfree_skb(chan->sdu);
6696 chan->sdu = NULL;
6697 chan->sdu_last_frag = NULL;
6698 chan->sdu_len = 0;
6699 }
6700
6701 /* We can't return an error here since we took care of the skb
6702 * freeing internally. An error return would cause the caller to
6703 * do a double-free of the skb.
6704 */
6705 return 0;
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006706}
6707
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006708static void l2cap_data_channel(struct l2cap_conn *conn, u16 cid,
6709 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006710{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006711 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006712
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03006713 chan = l2cap_get_chan_by_scid(conn, cid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006714 if (!chan) {
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006715 if (cid == L2CAP_CID_A2MP) {
6716 chan = a2mp_channel_create(conn, skb);
6717 if (!chan) {
6718 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006719 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006720 }
6721
6722 l2cap_chan_lock(chan);
6723 } else {
6724 BT_DBG("unknown cid 0x%4.4x", cid);
6725 /* Drop packet and return */
6726 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006727 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006728 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006729 }
6730
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03006731 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006732
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03006733 if (chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006734 goto drop;
6735
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006736 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03006737 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006738 if (l2cap_le_data_rcv(chan, skb) < 0)
6739 goto drop;
6740
6741 goto done;
6742
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006743 case L2CAP_MODE_BASIC:
6744 /* If socket recv buffers overflows we drop data here
6745 * which is *bad* because L2CAP has to be reliable.
6746 * But we don't have any other choice. L2CAP doesn't
6747 * provide flow control mechanism. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07006748
Szymon Janc2c96e032014-02-18 20:48:34 +01006749 if (chan->imtu < skb->len) {
6750 BT_ERR("Dropping L2CAP data: receive buffer overflow");
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006751 goto drop;
Szymon Janc2c96e032014-02-18 20:48:34 +01006752 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006753
Gustavo Padovan80b98022012-05-27 22:27:51 -03006754 if (!chan->ops->recv(chan, skb))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006755 goto done;
6756 break;
6757
6758 case L2CAP_MODE_ERTM:
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006759 case L2CAP_MODE_STREAMING:
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006760 l2cap_data_rcv(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006761 goto done;
6762
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006763 default:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006764 BT_DBG("chan %p: bad mode 0x%2.2x", chan, chan->mode);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006765 break;
6766 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006767
6768drop:
6769 kfree_skb(skb);
6770
6771done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006772 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006773}
6774
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006775static void l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm,
6776 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006777{
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006778 struct hci_conn *hcon = conn->hcon;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006779 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006780
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006781 if (hcon->type != ACL_LINK)
Johan Hedberga24cce12014-08-07 22:56:42 +03006782 goto free_skb;
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006783
Johan Hedbergbf20fd42013-05-14 13:23:13 +03006784 chan = l2cap_global_chan_by_psm(0, psm, &hcon->src, &hcon->dst,
6785 ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006786 if (!chan)
Johan Hedberga24cce12014-08-07 22:56:42 +03006787 goto free_skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006788
Andrei Emeltchenko5b4ceda2012-02-24 16:35:32 +02006789 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006790
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03006791 if (chan->state != BT_BOUND && chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006792 goto drop;
6793
Vinicius Costa Gomese13e21d2011-06-17 22:46:27 -03006794 if (chan->imtu < skb->len)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006795 goto drop;
6796
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006797 /* Store remote BD_ADDR and PSM for msg_name */
Marcel Holtmann06ae3312013-10-18 03:43:00 -07006798 bacpy(&bt_cb(skb)->bdaddr, &hcon->dst);
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006799 bt_cb(skb)->psm = psm;
6800
Johan Hedberga24cce12014-08-07 22:56:42 +03006801 if (!chan->ops->recv(chan, skb)) {
6802 l2cap_chan_put(chan);
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006803 return;
Johan Hedberga24cce12014-08-07 22:56:42 +03006804 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006805
6806drop:
Johan Hedberga24cce12014-08-07 22:56:42 +03006807 l2cap_chan_put(chan);
6808free_skb:
Linus Torvalds1da177e2005-04-16 15:20:36 -07006809 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006810}
6811
6812static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb)
6813{
6814 struct l2cap_hdr *lh = (void *) skb->data;
Johan Hedberg61a939c2014-01-17 20:45:11 +02006815 struct hci_conn *hcon = conn->hcon;
Al Viro8e036fc2007-07-29 00:16:36 -07006816 u16 cid, len;
6817 __le16 psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006818
Johan Hedberg61a939c2014-01-17 20:45:11 +02006819 if (hcon->state != BT_CONNECTED) {
6820 BT_DBG("queueing pending rx skb");
6821 skb_queue_tail(&conn->pending_rx, skb);
6822 return;
6823 }
6824
Linus Torvalds1da177e2005-04-16 15:20:36 -07006825 skb_pull(skb, L2CAP_HDR_SIZE);
6826 cid = __le16_to_cpu(lh->cid);
6827 len = __le16_to_cpu(lh->len);
6828
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006829 if (len != skb->len) {
6830 kfree_skb(skb);
6831 return;
6832 }
6833
Johan Hedberg9e1d7e12014-07-06 11:03:36 +03006834 /* Since we can't actively block incoming LE connections we must
6835 * at least ensure that we ignore incoming data from them.
6836 */
6837 if (hcon->type == LE_LINK &&
Johan Hedbergdcc36c12014-07-09 12:59:13 +03006838 hci_bdaddr_list_lookup(&hcon->hdev->blacklist, &hcon->dst,
6839 bdaddr_type(hcon, hcon->dst_type))) {
Johan Hedberge4931502014-07-02 09:36:21 +03006840 kfree_skb(skb);
6841 return;
6842 }
6843
Linus Torvalds1da177e2005-04-16 15:20:36 -07006844 BT_DBG("len %d, cid 0x%4.4x", len, cid);
6845
6846 switch (cid) {
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006847 case L2CAP_CID_SIGNALING:
Linus Torvalds1da177e2005-04-16 15:20:36 -07006848 l2cap_sig_channel(conn, skb);
6849 break;
6850
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006851 case L2CAP_CID_CONN_LESS:
Andrei Emeltchenko097db762012-03-09 14:16:17 +02006852 psm = get_unaligned((__le16 *) skb->data);
Andrei Emeltchenko0181a702012-05-29 10:04:05 +03006853 skb_pull(skb, L2CAP_PSMLEN_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006854 l2cap_conless_channel(conn, psm, skb);
6855 break;
6856
Marcel Holtmanna2877622013-10-02 23:46:54 -07006857 case L2CAP_CID_LE_SIGNALING:
6858 l2cap_le_sig_channel(conn, skb);
6859 break;
6860
Anderson Brigliab501d6a2011-06-07 18:46:31 -03006861 case L2CAP_CID_SMP:
6862 if (smp_sig_channel(conn, skb))
6863 l2cap_conn_del(conn->hcon, EACCES);
6864 break;
6865
Linus Torvalds1da177e2005-04-16 15:20:36 -07006866 default:
6867 l2cap_data_channel(conn, cid, skb);
6868 break;
6869 }
6870}
6871
Johan Hedberg61a939c2014-01-17 20:45:11 +02006872static void process_pending_rx(struct work_struct *work)
6873{
6874 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
6875 pending_rx_work);
6876 struct sk_buff *skb;
6877
6878 BT_DBG("");
6879
6880 while ((skb = skb_dequeue(&conn->pending_rx)))
6881 l2cap_recv_frame(conn, skb);
6882}
6883
Johan Hedberg162b49e2014-01-17 20:45:10 +02006884static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon)
6885{
6886 struct l2cap_conn *conn = hcon->l2cap_data;
6887 struct hci_chan *hchan;
6888
6889 if (conn)
6890 return conn;
6891
6892 hchan = hci_chan_create(hcon);
6893 if (!hchan)
6894 return NULL;
6895
Johan Hedberg27f70f32014-07-21 10:50:06 +03006896 conn = kzalloc(sizeof(*conn), GFP_KERNEL);
Johan Hedberg162b49e2014-01-17 20:45:10 +02006897 if (!conn) {
6898 hci_chan_del(hchan);
6899 return NULL;
6900 }
6901
6902 kref_init(&conn->ref);
6903 hcon->l2cap_data = conn;
6904 conn->hcon = hcon;
6905 hci_conn_get(conn->hcon);
6906 conn->hchan = hchan;
6907
6908 BT_DBG("hcon %p conn %p hchan %p", hcon, conn, hchan);
6909
6910 switch (hcon->type) {
6911 case LE_LINK:
6912 if (hcon->hdev->le_mtu) {
6913 conn->mtu = hcon->hdev->le_mtu;
6914 break;
6915 }
6916 /* fall through */
6917 default:
6918 conn->mtu = hcon->hdev->acl_mtu;
6919 break;
6920 }
6921
6922 conn->feat_mask = 0;
6923
6924 if (hcon->type == ACL_LINK)
6925 conn->hs_enabled = test_bit(HCI_HS_ENABLED,
6926 &hcon->hdev->dev_flags);
6927
Marcel Holtmann5a54e7c2014-07-13 20:50:15 +02006928 mutex_init(&conn->ident_lock);
Johan Hedberg162b49e2014-01-17 20:45:10 +02006929 mutex_init(&conn->chan_lock);
6930
6931 INIT_LIST_HEAD(&conn->chan_l);
6932 INIT_LIST_HEAD(&conn->users);
6933
6934 if (hcon->type == LE_LINK)
6935 INIT_DELAYED_WORK(&conn->security_timer, security_timeout);
6936 else
6937 INIT_DELAYED_WORK(&conn->info_timer, l2cap_info_timeout);
6938
Johan Hedberg61a939c2014-01-17 20:45:11 +02006939 skb_queue_head_init(&conn->pending_rx);
6940 INIT_WORK(&conn->pending_rx_work, process_pending_rx);
6941
Johan Hedberg162b49e2014-01-17 20:45:10 +02006942 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
6943
6944 return conn;
6945}
6946
6947static bool is_valid_psm(u16 psm, u8 dst_type) {
6948 if (!psm)
6949 return false;
6950
6951 if (bdaddr_type_is_le(dst_type))
6952 return (psm <= 0x00ff);
6953
6954 /* PSM must be odd and lsb of upper byte must be 0 */
6955 return ((psm & 0x0101) == 0x0001);
6956}
6957
6958int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
6959 bdaddr_t *dst, u8 dst_type)
6960{
6961 struct l2cap_conn *conn;
6962 struct hci_conn *hcon;
6963 struct hci_dev *hdev;
Johan Hedberg162b49e2014-01-17 20:45:10 +02006964 int err;
6965
6966 BT_DBG("%pMR -> %pMR (type %u) psm 0x%2.2x", &chan->src, dst,
6967 dst_type, __le16_to_cpu(psm));
6968
6969 hdev = hci_get_route(dst, &chan->src);
6970 if (!hdev)
6971 return -EHOSTUNREACH;
6972
6973 hci_dev_lock(hdev);
6974
6975 l2cap_chan_lock(chan);
6976
6977 if (!is_valid_psm(__le16_to_cpu(psm), dst_type) && !cid &&
6978 chan->chan_type != L2CAP_CHAN_RAW) {
6979 err = -EINVAL;
6980 goto done;
6981 }
6982
Johan Hedberg21626e62014-01-24 10:35:41 +02006983 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED && !psm) {
6984 err = -EINVAL;
6985 goto done;
6986 }
6987
6988 if (chan->chan_type == L2CAP_CHAN_FIXED && !cid) {
Johan Hedberg162b49e2014-01-17 20:45:10 +02006989 err = -EINVAL;
6990 goto done;
6991 }
6992
6993 switch (chan->mode) {
6994 case L2CAP_MODE_BASIC:
6995 break;
6996 case L2CAP_MODE_LE_FLOWCTL:
6997 l2cap_le_flowctl_init(chan);
6998 break;
6999 case L2CAP_MODE_ERTM:
7000 case L2CAP_MODE_STREAMING:
7001 if (!disable_ertm)
7002 break;
7003 /* fall through */
7004 default:
Johan Hedbergbeb19e42014-07-18 11:15:26 +03007005 err = -EOPNOTSUPP;
Johan Hedberg162b49e2014-01-17 20:45:10 +02007006 goto done;
7007 }
7008
7009 switch (chan->state) {
7010 case BT_CONNECT:
7011 case BT_CONNECT2:
7012 case BT_CONFIG:
7013 /* Already connecting */
7014 err = 0;
7015 goto done;
7016
7017 case BT_CONNECTED:
7018 /* Already connected */
7019 err = -EISCONN;
7020 goto done;
7021
7022 case BT_OPEN:
7023 case BT_BOUND:
7024 /* Can connect */
7025 break;
7026
7027 default:
7028 err = -EBADFD;
7029 goto done;
7030 }
7031
7032 /* Set destination address and psm */
7033 bacpy(&chan->dst, dst);
7034 chan->dst_type = dst_type;
7035
7036 chan->psm = psm;
7037 chan->dcid = cid;
7038
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007039 if (bdaddr_type_is_le(dst_type)) {
Johan Hedberge804d252014-07-16 11:42:28 +03007040 u8 role;
Johan Hedbergcdd62752014-07-07 15:02:28 +03007041
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007042 /* Convert from L2CAP channel address type to HCI address type
7043 */
7044 if (dst_type == BDADDR_LE_PUBLIC)
7045 dst_type = ADDR_LE_DEV_PUBLIC;
7046 else
7047 dst_type = ADDR_LE_DEV_RANDOM;
7048
Johan Hedberge804d252014-07-16 11:42:28 +03007049 if (test_bit(HCI_ADVERTISING, &hdev->dev_flags))
7050 role = HCI_ROLE_SLAVE;
7051 else
7052 role = HCI_ROLE_MASTER;
Johan Hedbergcdd62752014-07-07 15:02:28 +03007053
Andre Guedes04a6c582014-02-26 20:21:44 -03007054 hcon = hci_connect_le(hdev, dst, dst_type, chan->sec_level,
Johan Hedberge804d252014-07-16 11:42:28 +03007055 HCI_LE_CONN_TIMEOUT, role);
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007056 } else {
Johan Hedbergd93375a2014-07-07 15:02:27 +03007057 u8 auth_type = l2cap_get_auth_type(chan);
Andre Guedes04a6c582014-02-26 20:21:44 -03007058 hcon = hci_connect_acl(hdev, dst, chan->sec_level, auth_type);
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007059 }
Johan Hedberg162b49e2014-01-17 20:45:10 +02007060
7061 if (IS_ERR(hcon)) {
7062 err = PTR_ERR(hcon);
7063 goto done;
7064 }
7065
7066 conn = l2cap_conn_add(hcon);
7067 if (!conn) {
7068 hci_conn_drop(hcon);
7069 err = -ENOMEM;
7070 goto done;
7071 }
7072
7073 if (cid && __l2cap_get_chan_by_dcid(conn, cid)) {
7074 hci_conn_drop(hcon);
7075 err = -EBUSY;
7076 goto done;
7077 }
7078
7079 /* Update source addr of the socket */
7080 bacpy(&chan->src, &hcon->src);
7081 chan->src_type = bdaddr_type(hcon, hcon->src_type);
7082
7083 l2cap_chan_unlock(chan);
7084 l2cap_chan_add(conn, chan);
7085 l2cap_chan_lock(chan);
7086
7087 /* l2cap_chan_add takes its own ref so we can drop this one */
7088 hci_conn_drop(hcon);
7089
7090 l2cap_state_change(chan, BT_CONNECT);
7091 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
7092
Johan Hedberg61202e42014-01-28 15:16:48 -08007093 /* Release chan->sport so that it can be reused by other
7094 * sockets (as it's only used for listening sockets).
7095 */
7096 write_lock(&chan_list_lock);
7097 chan->sport = 0;
7098 write_unlock(&chan_list_lock);
7099
Johan Hedberg162b49e2014-01-17 20:45:10 +02007100 if (hcon->state == BT_CONNECTED) {
7101 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
7102 __clear_chan_timer(chan);
Johan Hedberge7cafc42014-07-17 15:35:38 +03007103 if (l2cap_chan_check_security(chan, true))
Johan Hedberg162b49e2014-01-17 20:45:10 +02007104 l2cap_state_change(chan, BT_CONNECTED);
7105 } else
7106 l2cap_do_start(chan);
7107 }
7108
7109 err = 0;
7110
7111done:
7112 l2cap_chan_unlock(chan);
7113 hci_dev_unlock(hdev);
7114 hci_dev_put(hdev);
7115 return err;
7116}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +03007117EXPORT_SYMBOL_GPL(l2cap_chan_connect);
Johan Hedberg162b49e2014-01-17 20:45:10 +02007118
Linus Torvalds1da177e2005-04-16 15:20:36 -07007119/* ---- L2CAP interface with lower layer (HCI) ---- */
7120
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007121int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007122{
7123 int exact = 0, lm1 = 0, lm2 = 0;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007124 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007125
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03007126 BT_DBG("hdev %s, bdaddr %pMR", hdev->name, bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007127
7128 /* Find listening sockets and check their link_mode */
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007129 read_lock(&chan_list_lock);
7130 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007131 if (c->state != BT_LISTEN)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007132 continue;
7133
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007134 if (!bacmp(&c->src, &hdev->bdaddr)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007135 lm1 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03007136 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007137 lm1 |= HCI_LM_MASTER;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007138 exact++;
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007139 } else if (!bacmp(&c->src, BDADDR_ANY)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007140 lm2 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03007141 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007142 lm2 |= HCI_LM_MASTER;
7143 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007144 }
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007145 read_unlock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007146
7147 return exact ? lm1 : lm2;
7148}
7149
Johan Hedberge760ec12014-08-07 22:56:47 +03007150/* Find the next fixed channel in BT_LISTEN state, continue iteration
7151 * from an existing channel in the list or from the beginning of the
7152 * global list (by passing NULL as first parameter).
7153 */
7154static struct l2cap_chan *l2cap_global_fixed_chan(struct l2cap_chan *c,
Johan Hedberg54a1b622014-08-07 22:56:48 +03007155 bdaddr_t *src, u8 link_type)
Johan Hedberge760ec12014-08-07 22:56:47 +03007156{
7157 read_lock(&chan_list_lock);
7158
7159 if (c)
7160 c = list_next_entry(c, global_l);
7161 else
7162 c = list_entry(chan_list.next, typeof(*c), global_l);
7163
7164 list_for_each_entry_from(c, &chan_list, global_l) {
7165 if (c->chan_type != L2CAP_CHAN_FIXED)
7166 continue;
7167 if (c->state != BT_LISTEN)
7168 continue;
7169 if (bacmp(&c->src, src) && bacmp(&c->src, BDADDR_ANY))
7170 continue;
Johan Hedberg54a1b622014-08-07 22:56:48 +03007171 if (link_type == ACL_LINK && c->src_type != BDADDR_BREDR)
7172 continue;
7173 if (link_type == LE_LINK && c->src_type == BDADDR_BREDR)
7174 continue;
Johan Hedberge760ec12014-08-07 22:56:47 +03007175
7176 l2cap_chan_hold(c);
7177 read_unlock(&chan_list_lock);
7178 return c;
7179 }
7180
7181 read_unlock(&chan_list_lock);
7182
7183 return NULL;
7184}
7185
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03007186void l2cap_connect_cfm(struct hci_conn *hcon, u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007187{
Johan Hedberge760ec12014-08-07 22:56:47 +03007188 struct hci_dev *hdev = hcon->hdev;
Marcel Holtmann01394182006-07-03 10:02:46 +02007189 struct l2cap_conn *conn;
Johan Hedberge760ec12014-08-07 22:56:47 +03007190 struct l2cap_chan *pchan;
7191 u8 dst_type;
Marcel Holtmann01394182006-07-03 10:02:46 +02007192
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03007193 BT_DBG("hcon %p bdaddr %pMR status %d", hcon, &hcon->dst, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007194
Johan Hedbergdc0f5082014-08-07 22:56:46 +03007195 if (status) {
Joe Perchese1750722011-06-29 18:18:29 -07007196 l2cap_conn_del(hcon, bt_to_errno(status));
Johan Hedbergdc0f5082014-08-07 22:56:46 +03007197 return;
Andrei Emeltchenkoba6fc312012-10-31 15:46:26 +02007198 }
Johan Hedbergdc0f5082014-08-07 22:56:46 +03007199
7200 conn = l2cap_conn_add(hcon);
7201 if (!conn)
7202 return;
7203
Johan Hedberge760ec12014-08-07 22:56:47 +03007204 dst_type = bdaddr_type(hcon, hcon->dst_type);
7205
7206 /* If device is blocked, do not create channels for it */
7207 if (hci_bdaddr_list_lookup(&hdev->blacklist, &hcon->dst, dst_type))
7208 return;
7209
7210 /* Find fixed channels and notify them of the new connection. We
7211 * use multiple individual lookups, continuing each time where
7212 * we left off, because the list lock would prevent calling the
7213 * potentially sleeping l2cap_chan_lock() function.
7214 */
Johan Hedberg54a1b622014-08-07 22:56:48 +03007215 pchan = l2cap_global_fixed_chan(NULL, &hdev->bdaddr, hcon->type);
Johan Hedberge760ec12014-08-07 22:56:47 +03007216 while (pchan) {
7217 struct l2cap_chan *chan, *next;
7218
7219 /* Client fixed channels should override server ones */
7220 if (__l2cap_get_chan_by_dcid(conn, pchan->scid))
7221 goto next;
7222
7223 l2cap_chan_lock(pchan);
7224 chan = pchan->ops->new_connection(pchan);
7225 if (chan) {
7226 bacpy(&chan->src, &hcon->src);
7227 bacpy(&chan->dst, &hcon->dst);
7228 chan->src_type = bdaddr_type(hcon, hcon->src_type);
7229 chan->dst_type = dst_type;
7230
7231 __l2cap_chan_add(conn, chan);
7232 }
7233
7234 l2cap_chan_unlock(pchan);
7235next:
Johan Hedberg54a1b622014-08-07 22:56:48 +03007236 next = l2cap_global_fixed_chan(pchan, &hdev->bdaddr,
7237 hcon->type);
Johan Hedberge760ec12014-08-07 22:56:47 +03007238 l2cap_chan_put(pchan);
7239 pchan = next;
7240 }
7241
Johan Hedbergdc0f5082014-08-07 22:56:46 +03007242 l2cap_conn_ready(conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007243}
7244
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007245int l2cap_disconn_ind(struct hci_conn *hcon)
Marcel Holtmann2950f212009-02-12 14:02:50 +01007246{
7247 struct l2cap_conn *conn = hcon->l2cap_data;
7248
7249 BT_DBG("hcon %p", hcon);
7250
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007251 if (!conn)
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02007252 return HCI_ERROR_REMOTE_USER_TERM;
Marcel Holtmann2950f212009-02-12 14:02:50 +01007253 return conn->disc_reason;
7254}
7255
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03007256void l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007257{
7258 BT_DBG("hcon %p reason %d", hcon, reason);
7259
Joe Perchese1750722011-06-29 18:18:29 -07007260 l2cap_conn_del(hcon, bt_to_errno(reason));
Linus Torvalds1da177e2005-04-16 15:20:36 -07007261}
7262
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007263static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt)
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007264{
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03007265 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED)
Marcel Holtmann255c7602009-02-04 21:07:19 +01007266 return;
7267
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007268 if (encrypt == 0x00) {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007269 if (chan->sec_level == BT_SECURITY_MEDIUM) {
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007270 __set_chan_timer(chan, L2CAP_ENC_TIMEOUT);
Marcel Holtmann7d513e92014-01-15 22:37:40 -08007271 } else if (chan->sec_level == BT_SECURITY_HIGH ||
7272 chan->sec_level == BT_SECURITY_FIPS)
Gustavo F. Padovan0f852722011-05-04 19:42:50 -03007273 l2cap_chan_close(chan, ECONNREFUSED);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007274 } else {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007275 if (chan->sec_level == BT_SECURITY_MEDIUM)
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -03007276 __clear_chan_timer(chan);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007277 }
7278}
7279
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007280int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007281{
Marcel Holtmann40be4922008-07-14 20:13:50 +02007282 struct l2cap_conn *conn = hcon->l2cap_data;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03007283 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007284
Marcel Holtmann01394182006-07-03 10:02:46 +02007285 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007286 return 0;
Marcel Holtmann01394182006-07-03 10:02:46 +02007287
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03007288 BT_DBG("conn %p status 0x%2.2x encrypt %u", conn, status, encrypt);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007289
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03007290 if (hcon->type == LE_LINK) {
Hemant Gupta35d4adcc2012-04-18 14:46:26 +05307291 if (!status && encrypt)
Johan Hedberg4bd6d382014-02-26 23:33:45 +02007292 smp_distribute_keys(conn);
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02007293 cancel_delayed_work(&conn->security_timer);
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03007294 }
7295
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007296 mutex_lock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007297
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007298 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007299 l2cap_chan_lock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007300
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03007301 BT_DBG("chan %p scid 0x%4.4x state %s", chan, chan->scid,
7302 state_to_string(chan->state));
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007303
Johan Hedberg2338a7e2014-01-24 10:35:40 +02007304 if (chan->scid == L2CAP_CID_A2MP) {
Andrei Emeltchenko78eb2f92012-07-19 17:03:47 +03007305 l2cap_chan_unlock(chan);
7306 continue;
7307 }
7308
Johan Hedberg191eb392014-08-07 22:56:45 +03007309 if (!status && encrypt)
7310 chan->sec_level = hcon->sec_level;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007311
Andrei Emeltchenko96eff462012-11-15 18:14:53 +02007312 if (!__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007313 l2cap_chan_unlock(chan);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01007314 continue;
7315 }
7316
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007317 if (!status && (chan->state == BT_CONNECTED ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01007318 chan->state == BT_CONFIG)) {
Marcel Holtmannd97c8992013-10-14 02:53:54 -07007319 chan->ops->resume(chan);
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007320 l2cap_check_encryption(chan, encrypt);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007321 l2cap_chan_unlock(chan);
Marcel Holtmann9719f8a2008-07-14 20:13:45 +02007322 continue;
7323 }
7324
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007325 if (chan->state == BT_CONNECT) {
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007326 if (!status)
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03007327 l2cap_start_connection(chan);
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007328 else
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007329 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007330 } else if (chan->state == BT_CONNECT2) {
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007331 struct l2cap_conn_rsp rsp;
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007332 __u16 res, stat;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007333
7334 if (!status) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07007335 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007336 res = L2CAP_CR_PEND;
7337 stat = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08007338 chan->ops->defer(chan);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007339 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007340 l2cap_state_change(chan, BT_CONFIG);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007341 res = L2CAP_CR_SUCCESS;
7342 stat = L2CAP_CS_NO_INFO;
7343 }
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007344 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007345 l2cap_state_change(chan, BT_DISCONN);
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007346 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007347 res = L2CAP_CR_SEC_BLOCK;
7348 stat = L2CAP_CS_NO_INFO;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007349 }
7350
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03007351 rsp.scid = cpu_to_le16(chan->dcid);
7352 rsp.dcid = cpu_to_le16(chan->scid);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007353 rsp.result = cpu_to_le16(res);
7354 rsp.status = cpu_to_le16(stat);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03007355 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01007356 sizeof(rsp), &rsp);
Mat Martineau2d369352012-05-23 14:59:30 -07007357
7358 if (!test_bit(CONF_REQ_SENT, &chan->conf_state) &&
7359 res == L2CAP_CR_SUCCESS) {
7360 char buf[128];
7361 set_bit(CONF_REQ_SENT, &chan->conf_state);
7362 l2cap_send_cmd(conn, l2cap_get_ident(conn),
7363 L2CAP_CONF_REQ,
7364 l2cap_build_conf_req(chan, buf),
7365 buf);
7366 chan->num_conf_req++;
7367 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007368 }
7369
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007370 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007371 }
7372
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007373 mutex_unlock(&conn->chan_lock);
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007374
Linus Torvalds1da177e2005-04-16 15:20:36 -07007375 return 0;
7376}
7377
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007378int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007379{
7380 struct l2cap_conn *conn = hcon->l2cap_data;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007381 struct l2cap_hdr *hdr;
7382 int len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007383
Andrei Emeltchenko1d13a252012-10-15 11:58:41 +03007384 /* For AMP controller do not create l2cap conn */
7385 if (!conn && hcon->hdev->dev_type != HCI_BREDR)
7386 goto drop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007387
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007388 if (!conn)
Claudio Takahasibaf43252013-04-11 13:55:50 -03007389 conn = l2cap_conn_add(hcon);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007390
7391 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007392 goto drop;
7393
7394 BT_DBG("conn %p len %d flags 0x%x", conn, skb->len, flags);
7395
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007396 switch (flags) {
7397 case ACL_START:
7398 case ACL_START_NO_FLUSH:
7399 case ACL_COMPLETE:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007400 if (conn->rx_len) {
7401 BT_ERR("Unexpected start frame (len %d)", skb->len);
7402 kfree_skb(conn->rx_skb);
7403 conn->rx_skb = NULL;
7404 conn->rx_len = 0;
7405 l2cap_conn_unreliable(conn, ECOMM);
7406 }
7407
Andrei Emeltchenkoaae7fe22010-09-15 14:28:43 +03007408 /* Start fragment always begin with Basic L2CAP header */
7409 if (skb->len < L2CAP_HDR_SIZE) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07007410 BT_ERR("Frame is too short (len %d)", skb->len);
7411 l2cap_conn_unreliable(conn, ECOMM);
7412 goto drop;
7413 }
7414
7415 hdr = (struct l2cap_hdr *) skb->data;
7416 len = __le16_to_cpu(hdr->len) + L2CAP_HDR_SIZE;
7417
7418 if (len == skb->len) {
7419 /* Complete frame received */
7420 l2cap_recv_frame(conn, skb);
7421 return 0;
7422 }
7423
7424 BT_DBG("Start: total len %d, frag len %d", len, skb->len);
7425
7426 if (skb->len > len) {
7427 BT_ERR("Frame is too long (len %d, expected len %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007428 skb->len, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007429 l2cap_conn_unreliable(conn, ECOMM);
7430 goto drop;
7431 }
7432
7433 /* Allocate skb for the complete frame (with header) */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03007434 conn->rx_skb = bt_skb_alloc(len, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03007435 if (!conn->rx_skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007436 goto drop;
7437
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007438 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007439 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007440 conn->rx_len = len - skb->len;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007441 break;
7442
7443 case ACL_CONT:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007444 BT_DBG("Cont: frag len %d (expecting %d)", skb->len, conn->rx_len);
7445
7446 if (!conn->rx_len) {
7447 BT_ERR("Unexpected continuation frame (len %d)", skb->len);
7448 l2cap_conn_unreliable(conn, ECOMM);
7449 goto drop;
7450 }
7451
7452 if (skb->len > conn->rx_len) {
7453 BT_ERR("Fragment is too long (len %d, expected %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007454 skb->len, conn->rx_len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007455 kfree_skb(conn->rx_skb);
7456 conn->rx_skb = NULL;
7457 conn->rx_len = 0;
7458 l2cap_conn_unreliable(conn, ECOMM);
7459 goto drop;
7460 }
7461
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007462 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007463 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007464 conn->rx_len -= skb->len;
7465
7466 if (!conn->rx_len) {
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007467 /* Complete frame received. l2cap_recv_frame
7468 * takes ownership of the skb so set the global
7469 * rx_skb pointer to NULL first.
7470 */
7471 struct sk_buff *rx_skb = conn->rx_skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007472 conn->rx_skb = NULL;
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007473 l2cap_recv_frame(conn, rx_skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007474 }
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007475 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007476 }
7477
7478drop:
7479 kfree_skb(skb);
7480 return 0;
7481}
7482
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007483static int l2cap_debugfs_show(struct seq_file *f, void *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007484{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007485 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007486
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007487 read_lock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007488
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007489 list_for_each_entry(c, &chan_list, global_l) {
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03007490 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 -07007491 &c->src, &c->dst,
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03007492 c->state, __le16_to_cpu(c->psm),
7493 c->scid, c->dcid, c->imtu, c->omtu,
7494 c->sec_level, c->mode);
Andrei Emeltchenko61e1b4b2012-01-19 11:19:50 +02007495 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007496
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007497 read_unlock(&chan_list_lock);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007498
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007499 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007500}
7501
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007502static int l2cap_debugfs_open(struct inode *inode, struct file *file)
7503{
7504 return single_open(file, l2cap_debugfs_show, inode->i_private);
7505}
7506
7507static const struct file_operations l2cap_debugfs_fops = {
7508 .open = l2cap_debugfs_open,
7509 .read = seq_read,
7510 .llseek = seq_lseek,
7511 .release = single_release,
7512};
7513
7514static struct dentry *l2cap_debugfs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007515
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007516int __init l2cap_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007517{
7518 int err;
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007519
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007520 err = l2cap_init_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007521 if (err < 0)
7522 return err;
7523
Marcel Holtmann1120e4b2013-10-17 17:24:16 -07007524 if (IS_ERR_OR_NULL(bt_debugfs))
7525 return 0;
7526
7527 l2cap_debugfs = debugfs_create_file("l2cap", 0444, bt_debugfs,
7528 NULL, &l2cap_debugfs_fops);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007529
Samuel Ortiz40b93972014-05-14 17:53:35 +02007530 debugfs_create_u16("l2cap_le_max_credits", 0644, bt_debugfs,
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02007531 &le_max_credits);
Samuel Ortiz40b93972014-05-14 17:53:35 +02007532 debugfs_create_u16("l2cap_le_default_mps", 0644, bt_debugfs,
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02007533 &le_default_mps);
7534
Linus Torvalds1da177e2005-04-16 15:20:36 -07007535 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007536}
7537
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007538void l2cap_exit(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007539{
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007540 debugfs_remove(l2cap_debugfs);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007541 l2cap_cleanup_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007542}
7543
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03007544module_param(disable_ertm, bool, 0644);
7545MODULE_PARM_DESC(disable_ertm, "Disable enhanced retransmission mode");