blob: 8538cb07b0c03d7be00398c08b3011d8ac94ad9a [file] [log] [blame]
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2000-2001 Qualcomm Incorporated
Gustavo F. Padovance5706b2010-07-13 11:57:11 -03004 Copyright (C) 2009-2010 Gustavo F. Padovan <gustavo@padovan.org>
Gustavo F. Padovan5d8868f2010-07-16 16:18:39 -03005 Copyright (C) 2010 Google Inc.
Gustavo F. Padovan590051d2011-12-18 13:39:33 -02006 Copyright (C) 2011 ProFUSION Embedded Systems
Mat Martineau422e9252012-04-27 16:50:55 -07007 Copyright (c) 2012 Code Aurora Forum. All rights reserved.
Linus Torvalds1da177e2005-04-16 15:20:36 -07008
9 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
10
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License version 2 as
13 published by the Free Software Foundation;
14
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
18 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090019 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
20 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
21 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
Linus Torvalds1da177e2005-04-16 15:20:36 -070022 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090024 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
25 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
Linus Torvalds1da177e2005-04-16 15:20:36 -070026 SOFTWARE IS DISCLAIMED.
27*/
28
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020029/* Bluetooth L2CAP core. */
Linus Torvalds1da177e2005-04-16 15:20:36 -070030
Linus Torvalds1da177e2005-04-16 15:20:36 -070031#include <linux/module.h>
32
Marcel Holtmannaef7d972010-03-21 05:27:45 +010033#include <linux/debugfs.h>
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -030034#include <linux/crc16.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070035
36#include <net/bluetooth/bluetooth.h>
37#include <net/bluetooth/hci_core.h>
38#include <net/bluetooth/l2cap.h>
Marcel Holtmann7ef9fbf2013-10-10 14:54:14 -070039
Marcel Holtmannac4b7232013-10-10 14:54:16 -070040#include "smp.h"
Marcel Holtmann70247282013-10-10 14:54:15 -070041#include "a2mp.h"
Marcel Holtmann7ef9fbf2013-10-10 14:54:14 -070042#include "amp.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070043
Johan Hedberg0f1bfe42014-01-27 15:11:35 -080044#define LE_FLOWCTL_MAX_CREDITS 65535
45
Mat Martineaud1de6d42012-05-17 20:53:55 -070046bool disable_ertm;
Marcel Holtmannf0709e02007-10-20 13:38:51 +020047
Marcel Holtmann547d1032013-10-12 08:18:19 -070048static u32 l2cap_feat_mask = L2CAP_FEAT_FIXED_CHAN | L2CAP_FEAT_UCD;
Marcel Holtmanna6801ca2014-07-11 06:03:08 +020049static u8 l2cap_fixed_chan[8] = { L2CAP_FC_SIG_BREDR | L2CAP_FC_CONNLESS, };
Linus Torvalds1da177e2005-04-16 15:20:36 -070050
Johannes Bergb5ad8b72011-06-01 08:54:45 +020051static LIST_HEAD(chan_list);
52static DEFINE_RWLOCK(chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -070053
Johan Hedbergf15b8ec2013-12-03 15:08:25 +020054static u16 le_max_credits = L2CAP_LE_MAX_CREDITS;
55static u16 le_default_mps = L2CAP_LE_DEFAULT_MPS;
56
Linus Torvalds1da177e2005-04-16 15:20:36 -070057static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +010058 u8 code, u8 ident, u16 dlen, void *data);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -030059static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len,
Gustavo Padovan2d792812012-10-06 10:07:01 +010060 void *data);
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -030061static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +020062static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err);
Linus Torvalds1da177e2005-04-16 15:20:36 -070063
Gustavo Padovand6603662012-05-21 13:58:22 -030064static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
Gustavo Padovan2d792812012-10-06 10:07:01 +010065 struct sk_buff_head *skbs, u8 event);
Mat Martineau608bcc62012-05-17 20:53:32 -070066
Marcel Holtmann4f1654e2013-10-13 08:50:41 -070067static inline __u8 bdaddr_type(struct hci_conn *hcon, __u8 type)
68{
69 if (hcon->type == LE_LINK) {
70 if (type == ADDR_LE_DEV_PUBLIC)
71 return BDADDR_LE_PUBLIC;
72 else
73 return BDADDR_LE_RANDOM;
74 }
75
76 return BDADDR_BREDR;
77}
78
Marcel Holtmann01394182006-07-03 10:02:46 +020079/* ---- L2CAP channels ---- */
Gustavo F. Padovan71ba0e52011-05-17 14:34:52 -030080
Gustavo Padovan2d792812012-10-06 10:07:01 +010081static struct l2cap_chan *__l2cap_get_chan_by_dcid(struct l2cap_conn *conn,
82 u16 cid)
Marcel Holtmann01394182006-07-03 10:02:46 +020083{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020084 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -030085
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020086 list_for_each_entry(c, &conn->chan_l, list) {
87 if (c->dcid == cid)
88 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +020089 }
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020090 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +020091}
92
Gustavo Padovan2d792812012-10-06 10:07:01 +010093static struct l2cap_chan *__l2cap_get_chan_by_scid(struct l2cap_conn *conn,
94 u16 cid)
Marcel Holtmann01394182006-07-03 10:02:46 +020095{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020096 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -030097
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020098 list_for_each_entry(c, &conn->chan_l, list) {
99 if (c->scid == cid)
100 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +0200101 }
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200102 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200103}
104
105/* Find channel with given SCID.
Mat Martineauef191ad2012-05-02 09:42:00 -0700106 * Returns locked channel. */
Gustavo Padovan2d792812012-10-06 10:07:01 +0100107static struct l2cap_chan *l2cap_get_chan_by_scid(struct l2cap_conn *conn,
108 u16 cid)
Marcel Holtmann01394182006-07-03 10:02:46 +0200109{
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300110 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300111
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200112 mutex_lock(&conn->chan_lock);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300113 c = __l2cap_get_chan_by_scid(conn, cid);
Mat Martineauef191ad2012-05-02 09:42:00 -0700114 if (c)
115 l2cap_chan_lock(c);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200116 mutex_unlock(&conn->chan_lock);
117
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300118 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +0200119}
120
Mat Martineaub1a130b2012-10-23 15:24:09 -0700121/* Find channel with given DCID.
122 * Returns locked channel.
123 */
124static struct l2cap_chan *l2cap_get_chan_by_dcid(struct l2cap_conn *conn,
125 u16 cid)
126{
127 struct l2cap_chan *c;
128
129 mutex_lock(&conn->chan_lock);
130 c = __l2cap_get_chan_by_dcid(conn, cid);
131 if (c)
132 l2cap_chan_lock(c);
133 mutex_unlock(&conn->chan_lock);
134
135 return c;
136}
137
Gustavo Padovan2d792812012-10-06 10:07:01 +0100138static struct l2cap_chan *__l2cap_get_chan_by_ident(struct l2cap_conn *conn,
139 u8 ident)
Marcel Holtmann01394182006-07-03 10:02:46 +0200140{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200141 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300142
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200143 list_for_each_entry(c, &conn->chan_l, list) {
144 if (c->ident == ident)
145 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +0200146 }
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200147 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200148}
149
Mat Martineau5b155ef2012-10-23 15:24:14 -0700150static struct l2cap_chan *l2cap_get_chan_by_ident(struct l2cap_conn *conn,
151 u8 ident)
152{
153 struct l2cap_chan *c;
154
155 mutex_lock(&conn->chan_lock);
156 c = __l2cap_get_chan_by_ident(conn, ident);
157 if (c)
158 l2cap_chan_lock(c);
159 mutex_unlock(&conn->chan_lock);
160
161 return c;
162}
163
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300164static struct l2cap_chan *__l2cap_global_chan_by_addr(__le16 psm, bdaddr_t *src)
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300165{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300166 struct l2cap_chan *c;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300167
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300168 list_for_each_entry(c, &chan_list, global_l) {
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700169 if (c->sport == psm && !bacmp(&c->src, src))
Szymon Janc250938c2011-11-16 09:32:22 +0100170 return c;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300171 }
Szymon Janc250938c2011-11-16 09:32:22 +0100172 return NULL;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300173}
174
175int l2cap_add_psm(struct l2cap_chan *chan, bdaddr_t *src, __le16 psm)
176{
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300177 int err;
178
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200179 write_lock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300180
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300181 if (psm && __l2cap_global_chan_by_addr(psm, src)) {
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300182 err = -EADDRINUSE;
183 goto done;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300184 }
185
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300186 if (psm) {
187 chan->psm = psm;
188 chan->sport = psm;
189 err = 0;
190 } else {
191 u16 p;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300192
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300193 err = -EINVAL;
194 for (p = 0x1001; p < 0x1100; p += 2)
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300195 if (!__l2cap_global_chan_by_addr(cpu_to_le16(p), src)) {
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300196 chan->psm = cpu_to_le16(p);
197 chan->sport = cpu_to_le16(p);
198 err = 0;
199 break;
200 }
201 }
202
203done:
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200204 write_unlock(&chan_list_lock);
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300205 return err;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300206}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300207EXPORT_SYMBOL_GPL(l2cap_add_psm);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300208
209int l2cap_add_scid(struct l2cap_chan *chan, __u16 scid)
210{
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200211 write_lock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300212
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. Padovan89bc5002011-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. Padovan89bc5002011-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. Padovan89bc5002011-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. Padovan89bc5002011-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. Padovan89bc5002011-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. Padovan89bc5002011-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. Padovan89bc5002011-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 */
Gustavo F. Padovand45fc422011-11-05 19:54:24 -0200778int l2cap_chan_check_security(struct l2cap_chan *chan)
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
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300788 return hci_conn_security(conn->hcon, chan->sec_level, auth_type);
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200789}
790
Johannes Bergb5ad8b72011-06-01 08:54:45 +0200791static u8 l2cap_get_ident(struct l2cap_conn *conn)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200792{
793 u8 id;
794
795 /* Get next available identificator.
796 * 1 - 128 are used by kernel.
797 * 129 - 199 are reserved.
798 * 200 - 254 are used by utilities like l2ping, etc.
799 */
800
Marcel Holtmann5a54e7c2014-07-13 20:50:15 +0200801 mutex_lock(&conn->ident_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200802
803 if (++conn->tx_ident > 128)
804 conn->tx_ident = 1;
805
806 id = conn->tx_ident;
807
Marcel Holtmann5a54e7c2014-07-13 20:50:15 +0200808 mutex_unlock(&conn->ident_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200809
810 return id;
811}
812
Gustavo Padovan2d792812012-10-06 10:07:01 +0100813static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len,
814 void *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200815{
816 struct sk_buff *skb = l2cap_build_cmd(conn, code, ident, len, data);
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +0200817 u8 flags;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200818
819 BT_DBG("code 0x%2.2x", code);
820
821 if (!skb)
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -0300822 return;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200823
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +0200824 if (lmp_no_flush_capable(conn->hcon->hdev))
825 flags = ACL_START_NO_FLUSH;
826 else
827 flags = ACL_START;
828
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700829 bt_cb(skb)->force_active = BT_POWER_FORCE_ACTIVE_ON;
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +0200830 skb->priority = HCI_PRIO_MAX;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700831
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200832 hci_send_acl(conn->hchan, skb, flags);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200833}
834
Mat Martineau02b0fbb2012-10-23 15:24:10 -0700835static bool __chan_is_moving(struct l2cap_chan *chan)
836{
837 return chan->move_state != L2CAP_MOVE_STABLE &&
838 chan->move_state != L2CAP_MOVE_WAIT_PREPARE;
839}
840
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200841static void l2cap_do_send(struct l2cap_chan *chan, struct sk_buff *skb)
842{
843 struct hci_conn *hcon = chan->conn->hcon;
844 u16 flags;
845
846 BT_DBG("chan %p, skb %p len %d priority %u", chan, skb, skb->len,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100847 skb->priority);
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200848
Mat Martineaud5f8a752012-10-23 15:24:18 -0700849 if (chan->hs_hcon && !__chan_is_moving(chan)) {
850 if (chan->hs_hchan)
851 hci_send_acl(chan->hs_hchan, skb, ACL_COMPLETE);
852 else
853 kfree_skb(skb);
854
855 return;
856 }
857
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200858 if (!test_bit(FLAG_FLUSHABLE, &chan->flags) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100859 lmp_no_flush_capable(hcon->hdev))
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200860 flags = ACL_START_NO_FLUSH;
861 else
862 flags = ACL_START;
863
864 bt_cb(skb)->force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
865 hci_send_acl(chan->conn->hchan, skb, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700866}
867
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700868static void __unpack_enhanced_control(u16 enh, struct l2cap_ctrl *control)
869{
870 control->reqseq = (enh & L2CAP_CTRL_REQSEQ) >> L2CAP_CTRL_REQSEQ_SHIFT;
871 control->final = (enh & L2CAP_CTRL_FINAL) >> L2CAP_CTRL_FINAL_SHIFT;
872
873 if (enh & L2CAP_CTRL_FRAME_TYPE) {
874 /* S-Frame */
875 control->sframe = 1;
876 control->poll = (enh & L2CAP_CTRL_POLL) >> L2CAP_CTRL_POLL_SHIFT;
877 control->super = (enh & L2CAP_CTRL_SUPERVISE) >> L2CAP_CTRL_SUPER_SHIFT;
878
879 control->sar = 0;
880 control->txseq = 0;
881 } else {
882 /* I-Frame */
883 control->sframe = 0;
884 control->sar = (enh & L2CAP_CTRL_SAR) >> L2CAP_CTRL_SAR_SHIFT;
885 control->txseq = (enh & L2CAP_CTRL_TXSEQ) >> L2CAP_CTRL_TXSEQ_SHIFT;
886
887 control->poll = 0;
888 control->super = 0;
889 }
890}
891
892static void __unpack_extended_control(u32 ext, struct l2cap_ctrl *control)
893{
894 control->reqseq = (ext & L2CAP_EXT_CTRL_REQSEQ) >> L2CAP_EXT_CTRL_REQSEQ_SHIFT;
895 control->final = (ext & L2CAP_EXT_CTRL_FINAL) >> L2CAP_EXT_CTRL_FINAL_SHIFT;
896
897 if (ext & L2CAP_EXT_CTRL_FRAME_TYPE) {
898 /* S-Frame */
899 control->sframe = 1;
900 control->poll = (ext & L2CAP_EXT_CTRL_POLL) >> L2CAP_EXT_CTRL_POLL_SHIFT;
901 control->super = (ext & L2CAP_EXT_CTRL_SUPERVISE) >> L2CAP_EXT_CTRL_SUPER_SHIFT;
902
903 control->sar = 0;
904 control->txseq = 0;
905 } else {
906 /* I-Frame */
907 control->sframe = 0;
908 control->sar = (ext & L2CAP_EXT_CTRL_SAR) >> L2CAP_EXT_CTRL_SAR_SHIFT;
909 control->txseq = (ext & L2CAP_EXT_CTRL_TXSEQ) >> L2CAP_EXT_CTRL_TXSEQ_SHIFT;
910
911 control->poll = 0;
912 control->super = 0;
913 }
914}
915
916static inline void __unpack_control(struct l2cap_chan *chan,
917 struct sk_buff *skb)
918{
919 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
920 __unpack_extended_control(get_unaligned_le32(skb->data),
921 &bt_cb(skb)->control);
Mat Martineaucec8ab6e2012-05-17 20:53:36 -0700922 skb_pull(skb, L2CAP_EXT_CTRL_SIZE);
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700923 } else {
924 __unpack_enhanced_control(get_unaligned_le16(skb->data),
925 &bt_cb(skb)->control);
Mat Martineaucec8ab6e2012-05-17 20:53:36 -0700926 skb_pull(skb, L2CAP_ENH_CTRL_SIZE);
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700927 }
928}
929
930static u32 __pack_extended_control(struct l2cap_ctrl *control)
931{
932 u32 packed;
933
934 packed = control->reqseq << L2CAP_EXT_CTRL_REQSEQ_SHIFT;
935 packed |= control->final << L2CAP_EXT_CTRL_FINAL_SHIFT;
936
937 if (control->sframe) {
938 packed |= control->poll << L2CAP_EXT_CTRL_POLL_SHIFT;
939 packed |= control->super << L2CAP_EXT_CTRL_SUPER_SHIFT;
940 packed |= L2CAP_EXT_CTRL_FRAME_TYPE;
941 } else {
942 packed |= control->sar << L2CAP_EXT_CTRL_SAR_SHIFT;
943 packed |= control->txseq << L2CAP_EXT_CTRL_TXSEQ_SHIFT;
944 }
945
946 return packed;
947}
948
949static u16 __pack_enhanced_control(struct l2cap_ctrl *control)
950{
951 u16 packed;
952
953 packed = control->reqseq << L2CAP_CTRL_REQSEQ_SHIFT;
954 packed |= control->final << L2CAP_CTRL_FINAL_SHIFT;
955
956 if (control->sframe) {
957 packed |= control->poll << L2CAP_CTRL_POLL_SHIFT;
958 packed |= control->super << L2CAP_CTRL_SUPER_SHIFT;
959 packed |= L2CAP_CTRL_FRAME_TYPE;
960 } else {
961 packed |= control->sar << L2CAP_CTRL_SAR_SHIFT;
962 packed |= control->txseq << L2CAP_CTRL_TXSEQ_SHIFT;
963 }
964
965 return packed;
966}
967
968static inline void __pack_control(struct l2cap_chan *chan,
969 struct l2cap_ctrl *control,
970 struct sk_buff *skb)
971{
972 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
973 put_unaligned_le32(__pack_extended_control(control),
974 skb->data + L2CAP_HDR_SIZE);
975 } else {
976 put_unaligned_le16(__pack_enhanced_control(control),
977 skb->data + L2CAP_HDR_SIZE);
978 }
979}
980
Gustavo Padovanba7aa642012-05-29 13:29:16 -0300981static inline unsigned int __ertm_hdr_size(struct l2cap_chan *chan)
982{
983 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
984 return L2CAP_EXT_HDR_SIZE;
985 else
986 return L2CAP_ENH_HDR_SIZE;
987}
988
Mat Martineaua67d7f62012-05-17 20:53:35 -0700989static struct sk_buff *l2cap_create_sframe_pdu(struct l2cap_chan *chan,
990 u32 control)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300991{
992 struct sk_buff *skb;
993 struct l2cap_hdr *lh;
Gustavo Padovanba7aa642012-05-29 13:29:16 -0300994 int hlen = __ertm_hdr_size(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300995
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300996 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +0300997 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300998
Mat Martineaua67d7f62012-05-17 20:53:35 -0700999 skb = bt_skb_alloc(hlen, GFP_KERNEL);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001000
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001001 if (!skb)
Mat Martineaua67d7f62012-05-17 20:53:35 -07001002 return ERR_PTR(-ENOMEM);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001003
1004 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001005 lh->len = cpu_to_le16(hlen - L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001006 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03001007
Mat Martineaua67d7f62012-05-17 20:53:35 -07001008 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
1009 put_unaligned_le32(control, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
1010 else
1011 put_unaligned_le16(control, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001012
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001013 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineaua67d7f62012-05-17 20:53:35 -07001014 u16 fcs = crc16(0, (u8 *)skb->data, skb->len);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03001015 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001016 }
1017
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001018 skb->priority = HCI_PRIO_MAX;
Mat Martineaua67d7f62012-05-17 20:53:35 -07001019 return skb;
1020}
1021
1022static void l2cap_send_sframe(struct l2cap_chan *chan,
1023 struct l2cap_ctrl *control)
1024{
1025 struct sk_buff *skb;
1026 u32 control_field;
1027
1028 BT_DBG("chan %p, control %p", chan, control);
1029
1030 if (!control->sframe)
1031 return;
1032
Mat Martineaub99e13a2012-10-23 15:24:19 -07001033 if (__chan_is_moving(chan))
1034 return;
1035
Mat Martineaua67d7f62012-05-17 20:53:35 -07001036 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state) &&
1037 !control->poll)
1038 control->final = 1;
1039
1040 if (control->super == L2CAP_SUPER_RR)
1041 clear_bit(CONN_RNR_SENT, &chan->conn_state);
1042 else if (control->super == L2CAP_SUPER_RNR)
1043 set_bit(CONN_RNR_SENT, &chan->conn_state);
1044
1045 if (control->super != L2CAP_SUPER_SREJ) {
1046 chan->last_acked_seq = control->reqseq;
1047 __clear_ack_timer(chan);
1048 }
1049
1050 BT_DBG("reqseq %d, final %d, poll %d, super %d", control->reqseq,
1051 control->final, control->poll, control->super);
1052
1053 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
1054 control_field = __pack_extended_control(control);
1055 else
1056 control_field = __pack_enhanced_control(control);
1057
1058 skb = l2cap_create_sframe_pdu(chan, control_field);
1059 if (!IS_ERR(skb))
1060 l2cap_do_send(chan, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001061}
1062
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001063static void l2cap_send_rr_or_rnr(struct l2cap_chan *chan, bool poll)
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001064{
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001065 struct l2cap_ctrl control;
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001066
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001067 BT_DBG("chan %p, poll %d", chan, poll);
1068
1069 memset(&control, 0, sizeof(control));
1070 control.sframe = 1;
1071 control.poll = poll;
1072
1073 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
1074 control.super = L2CAP_SUPER_RNR;
1075 else
1076 control.super = L2CAP_SUPER_RR;
1077
1078 control.reqseq = chan->buffer_seq;
1079 l2cap_send_sframe(chan, &control);
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001080}
1081
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001082static inline int __l2cap_no_conn_pending(struct l2cap_chan *chan)
Andrei Emeltchenkoe501d052010-07-08 12:14:41 +03001083{
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001084 return !test_bit(CONF_CONNECT_PEND, &chan->conf_state);
Andrei Emeltchenkoe501d052010-07-08 12:14:41 +03001085}
1086
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001087static bool __amp_capable(struct l2cap_chan *chan)
1088{
1089 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann1df7b172013-10-05 11:47:49 -07001090 struct hci_dev *hdev;
1091 bool amp_available = false;
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001092
Marcel Holtmann1df7b172013-10-05 11:47:49 -07001093 if (!conn->hs_enabled)
1094 return false;
1095
1096 if (!(conn->fixed_chan_mask & L2CAP_FC_A2MP))
1097 return false;
1098
1099 read_lock(&hci_dev_list_lock);
1100 list_for_each_entry(hdev, &hci_dev_list, list) {
1101 if (hdev->amp_type != AMP_TYPE_BREDR &&
1102 test_bit(HCI_UP, &hdev->flags)) {
1103 amp_available = true;
1104 break;
1105 }
1106 }
1107 read_unlock(&hci_dev_list_lock);
1108
1109 if (chan->chan_policy == BT_CHANNEL_POLICY_AMP_PREFERRED)
1110 return amp_available;
Marcel Holtmann848566b2013-10-01 22:59:22 -07001111
1112 return false;
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001113}
1114
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02001115static bool l2cap_check_efs(struct l2cap_chan *chan)
1116{
1117 /* Check EFS parameters */
1118 return true;
1119}
1120
Andrei Emeltchenko2766be42012-09-27 17:26:21 +03001121void l2cap_send_conn_req(struct l2cap_chan *chan)
Andrei Emeltchenko9b27f352012-02-24 16:00:00 +02001122{
1123 struct l2cap_conn *conn = chan->conn;
1124 struct l2cap_conn_req req;
1125
1126 req.scid = cpu_to_le16(chan->scid);
1127 req.psm = chan->psm;
1128
1129 chan->ident = l2cap_get_ident(conn);
1130
1131 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
1132
1133 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_REQ, sizeof(req), &req);
1134}
1135
Mat Martineau8eb200b2012-10-23 15:24:17 -07001136static void l2cap_send_create_chan_req(struct l2cap_chan *chan, u8 amp_id)
1137{
1138 struct l2cap_create_chan_req req;
1139 req.scid = cpu_to_le16(chan->scid);
1140 req.psm = chan->psm;
1141 req.amp_id = amp_id;
1142
1143 chan->ident = l2cap_get_ident(chan->conn);
1144
1145 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_REQ,
1146 sizeof(req), &req);
1147}
1148
Mat Martineau02b0fbb2012-10-23 15:24:10 -07001149static void l2cap_move_setup(struct l2cap_chan *chan)
1150{
1151 struct sk_buff *skb;
1152
1153 BT_DBG("chan %p", chan);
1154
1155 if (chan->mode != L2CAP_MODE_ERTM)
1156 return;
1157
1158 __clear_retrans_timer(chan);
1159 __clear_monitor_timer(chan);
1160 __clear_ack_timer(chan);
1161
1162 chan->retry_count = 0;
1163 skb_queue_walk(&chan->tx_q, skb) {
1164 if (bt_cb(skb)->control.retries)
1165 bt_cb(skb)->control.retries = 1;
1166 else
1167 break;
1168 }
1169
1170 chan->expected_tx_seq = chan->buffer_seq;
1171
1172 clear_bit(CONN_REJ_ACT, &chan->conn_state);
1173 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
1174 l2cap_seq_list_clear(&chan->retrans_list);
1175 l2cap_seq_list_clear(&chan->srej_list);
1176 skb_queue_purge(&chan->srej_q);
1177
1178 chan->tx_state = L2CAP_TX_STATE_XMIT;
1179 chan->rx_state = L2CAP_RX_STATE_MOVE;
1180
1181 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
1182}
1183
Mat Martineau5f3847a2012-10-23 15:24:12 -07001184static void l2cap_move_done(struct l2cap_chan *chan)
1185{
1186 u8 move_role = chan->move_role;
1187 BT_DBG("chan %p", chan);
1188
1189 chan->move_state = L2CAP_MOVE_STABLE;
1190 chan->move_role = L2CAP_MOVE_ROLE_NONE;
1191
1192 if (chan->mode != L2CAP_MODE_ERTM)
1193 return;
1194
1195 switch (move_role) {
1196 case L2CAP_MOVE_ROLE_INITIATOR:
1197 l2cap_tx(chan, NULL, NULL, L2CAP_EV_EXPLICIT_POLL);
1198 chan->rx_state = L2CAP_RX_STATE_WAIT_F;
1199 break;
1200 case L2CAP_MOVE_ROLE_RESPONDER:
1201 chan->rx_state = L2CAP_RX_STATE_WAIT_P;
1202 break;
1203 }
1204}
1205
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001206static void l2cap_chan_ready(struct l2cap_chan *chan)
1207{
Mat Martineau28270112012-05-17 21:14:09 -07001208 /* This clears all conf flags, including CONF_NOT_COMPLETE */
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001209 chan->conf_state = 0;
1210 __clear_chan_timer(chan);
1211
Johan Hedberg0ce43ce2013-12-05 14:55:33 +02001212 if (chan->mode == L2CAP_MODE_LE_FLOWCTL && !chan->tx_credits)
1213 chan->ops->suspend(chan);
Johan Hedberg177f8f22013-05-31 17:54:51 +03001214
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001215 chan->state = BT_CONNECTED;
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001216
Andrei Emeltchenkofd83e2c2012-05-30 09:55:32 +03001217 chan->ops->ready(chan);
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001218}
1219
Johan Hedbergf1496de2013-05-13 14:15:56 +03001220static void l2cap_le_connect(struct l2cap_chan *chan)
1221{
1222 struct l2cap_conn *conn = chan->conn;
1223 struct l2cap_le_conn_req req;
1224
Johan Hedberg595177f2013-12-02 22:12:22 +02001225 if (test_and_set_bit(FLAG_LE_CONN_REQ_SENT, &chan->flags))
1226 return;
1227
Johan Hedbergf1496de2013-05-13 14:15:56 +03001228 req.psm = chan->psm;
1229 req.scid = cpu_to_le16(chan->scid);
1230 req.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02001231 req.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03001232 req.credits = cpu_to_le16(chan->rx_credits);
Johan Hedbergf1496de2013-05-13 14:15:56 +03001233
1234 chan->ident = l2cap_get_ident(conn);
1235
1236 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_REQ,
1237 sizeof(req), &req);
1238}
1239
1240static void l2cap_le_start(struct l2cap_chan *chan)
1241{
1242 struct l2cap_conn *conn = chan->conn;
1243
1244 if (!smp_conn_security(conn->hcon, chan->sec_level))
1245 return;
1246
1247 if (!chan->psm) {
1248 l2cap_chan_ready(chan);
1249 return;
1250 }
1251
1252 if (chan->state == BT_CONNECT)
1253 l2cap_le_connect(chan);
1254}
1255
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001256static void l2cap_start_connection(struct l2cap_chan *chan)
1257{
1258 if (__amp_capable(chan)) {
1259 BT_DBG("chan %p AMP capable: discover AMPs", chan);
1260 a2mp_discover_amp(chan);
Johan Hedbergf1496de2013-05-13 14:15:56 +03001261 } else if (chan->conn->hcon->type == LE_LINK) {
1262 l2cap_le_start(chan);
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001263 } else {
1264 l2cap_send_conn_req(chan);
1265 }
1266}
1267
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001268static void l2cap_do_start(struct l2cap_chan *chan)
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001269{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03001270 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001271
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001272 if (conn->hcon->type == LE_LINK) {
Johan Hedberg96ac34f2013-05-13 11:15:07 +03001273 l2cap_le_start(chan);
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001274 return;
1275 }
1276
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001277 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) {
Marcel Holtmann984947d2009-02-06 23:35:19 +01001278 if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE))
1279 return;
1280
Gustavo F. Padovand45fc422011-11-05 19:54:24 -02001281 if (l2cap_chan_check_security(chan) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01001282 __l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001283 l2cap_start_connection(chan);
1284 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001285 } else {
1286 struct l2cap_info_req req;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001287 req.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001288
1289 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
1290 conn->info_ident = l2cap_get_ident(conn);
1291
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08001292 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001293
Gustavo Padovan2d792812012-10-06 10:07:01 +01001294 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
1295 sizeof(req), &req);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001296 }
1297}
1298
Gustavo F. Padovancf6c2c02010-06-07 20:54:45 -03001299static inline int l2cap_mode_supported(__u8 mode, __u32 feat_mask)
1300{
1301 u32 local_feat_mask = l2cap_feat_mask;
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03001302 if (!disable_ertm)
Gustavo F. Padovancf6c2c02010-06-07 20:54:45 -03001303 local_feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING;
1304
1305 switch (mode) {
1306 case L2CAP_MODE_ERTM:
1307 return L2CAP_FEAT_ERTM & feat_mask & local_feat_mask;
1308 case L2CAP_MODE_STREAMING:
1309 return L2CAP_FEAT_STREAMING & feat_mask & local_feat_mask;
1310 default:
1311 return 0x00;
1312 }
1313}
1314
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001315static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err)
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001316{
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001317 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001318 struct l2cap_disconn_req req;
1319
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001320 if (!conn)
1321 return;
1322
Andrei Emeltchenkoaad3d0e2012-09-06 15:05:42 +03001323 if (chan->mode == L2CAP_MODE_ERTM && chan->state == BT_CONNECTED) {
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03001324 __clear_retrans_timer(chan);
1325 __clear_monitor_timer(chan);
1326 __clear_ack_timer(chan);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001327 }
1328
Johan Hedberg2338a7e2014-01-24 10:35:40 +02001329 if (chan->scid == L2CAP_CID_A2MP) {
Gustavo Padovand1177732012-10-06 11:47:38 +01001330 l2cap_state_change(chan, BT_DISCONN);
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001331 return;
1332 }
1333
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001334 req.dcid = cpu_to_le16(chan->dcid);
1335 req.scid = cpu_to_le16(chan->scid);
Gustavo Padovan2d792812012-10-06 10:07:01 +01001336 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_DISCONN_REQ,
1337 sizeof(req), &req);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001338
Gustavo Padovanf8e73012013-10-15 19:24:46 -03001339 l2cap_state_change_and_error(chan, BT_DISCONN, err);
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001340}
1341
Linus Torvalds1da177e2005-04-16 15:20:36 -07001342/* ---- L2CAP connections ---- */
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001343static void l2cap_conn_start(struct l2cap_conn *conn)
1344{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001345 struct l2cap_chan *chan, *tmp;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001346
1347 BT_DBG("conn %p", conn);
1348
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001349 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001350
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001351 list_for_each_entry_safe(chan, tmp, &conn->chan_l, list) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001352 l2cap_chan_lock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001353
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001354 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001355 l2cap_chan_unlock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001356 continue;
1357 }
1358
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001359 if (chan->state == BT_CONNECT) {
Gustavo F. Padovand45fc422011-11-05 19:54:24 -02001360 if (!l2cap_chan_check_security(chan) ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01001361 !__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001362 l2cap_chan_unlock(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001363 continue;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02001364 }
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001365
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001366 if (!l2cap_mode_supported(chan->mode, conn->feat_mask)
Gustavo Padovan2d792812012-10-06 10:07:01 +01001367 && test_bit(CONF_STATE2_DEVICE,
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001368 &chan->conf_state)) {
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001369 l2cap_chan_close(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001370 l2cap_chan_unlock(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001371 continue;
1372 }
1373
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001374 l2cap_start_connection(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001375
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001376 } else if (chan->state == BT_CONNECT2) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001377 struct l2cap_conn_rsp rsp;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001378 char buf[128];
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001379 rsp.scid = cpu_to_le16(chan->dcid);
1380 rsp.dcid = cpu_to_le16(chan->scid);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001381
Gustavo F. Padovand45fc422011-11-05 19:54:24 -02001382 if (l2cap_chan_check_security(chan)) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07001383 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001384 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
1385 rsp.status = cpu_to_le16(L2CAP_CS_AUTHOR_PEND);
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001386 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001387
1388 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001389 l2cap_state_change(chan, BT_CONFIG);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001390 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
1391 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001392 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001393 } else {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001394 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
1395 rsp.status = cpu_to_le16(L2CAP_CS_AUTHEN_PEND);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001396 }
1397
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001398 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001399 sizeof(rsp), &rsp);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001400
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001401 if (test_bit(CONF_REQ_SENT, &chan->conf_state) ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01001402 rsp.result != L2CAP_CR_SUCCESS) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001403 l2cap_chan_unlock(chan);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001404 continue;
1405 }
1406
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001407 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001408 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001409 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03001410 chan->num_conf_req++;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001411 }
1412
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001413 l2cap_chan_unlock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001414 }
1415
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001416 mutex_unlock(&conn->chan_lock);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001417}
1418
Ido Yarivc2287682012-04-20 15:46:07 -03001419/* Find socket with cid and source/destination bdaddr.
Ville Tervob62f3282011-02-10 22:38:50 -03001420 * Returns closest match, locked.
1421 */
Andrei Emeltchenkod9b88702012-03-12 12:13:08 +02001422static struct l2cap_chan *l2cap_global_chan_by_scid(int state, u16 cid,
Ido Yarivc2287682012-04-20 15:46:07 -03001423 bdaddr_t *src,
1424 bdaddr_t *dst)
Ville Tervob62f3282011-02-10 22:38:50 -03001425{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001426 struct l2cap_chan *c, *c1 = NULL;
Ville Tervob62f3282011-02-10 22:38:50 -03001427
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001428 read_lock(&chan_list_lock);
Ville Tervob62f3282011-02-10 22:38:50 -03001429
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001430 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001431 if (state && c->state != state)
Ville Tervob62f3282011-02-10 22:38:50 -03001432 continue;
1433
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001434 if (c->scid == cid) {
Ido Yarivc2287682012-04-20 15:46:07 -03001435 int src_match, dst_match;
1436 int src_any, dst_any;
1437
Ville Tervob62f3282011-02-10 22:38:50 -03001438 /* Exact match. */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001439 src_match = !bacmp(&c->src, src);
1440 dst_match = !bacmp(&c->dst, dst);
Ido Yarivc2287682012-04-20 15:46:07 -03001441 if (src_match && dst_match) {
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001442 read_unlock(&chan_list_lock);
1443 return c;
1444 }
Ville Tervob62f3282011-02-10 22:38:50 -03001445
1446 /* Closest match */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001447 src_any = !bacmp(&c->src, BDADDR_ANY);
1448 dst_any = !bacmp(&c->dst, BDADDR_ANY);
Ido Yarivc2287682012-04-20 15:46:07 -03001449 if ((src_match && dst_any) || (src_any && dst_match) ||
1450 (src_any && dst_any))
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001451 c1 = c;
Ville Tervob62f3282011-02-10 22:38:50 -03001452 }
1453 }
Gustavo F. Padovan280f2942011-04-13 19:01:22 -03001454
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001455 read_unlock(&chan_list_lock);
Ville Tervob62f3282011-02-10 22:38:50 -03001456
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001457 return c1;
Ville Tervob62f3282011-02-10 22:38:50 -03001458}
1459
1460static void l2cap_le_conn_ready(struct l2cap_conn *conn)
1461{
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001462 struct hci_conn *hcon = conn->hcon;
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001463 struct hci_dev *hdev = hcon->hdev;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001464 struct l2cap_chan *chan, *pchan;
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001465 u8 dst_type;
Ville Tervob62f3282011-02-10 22:38:50 -03001466
1467 BT_DBG("");
1468
1469 /* Check if we have socket listening on cid */
Johan Hedberg073d1cf2013-04-29 19:35:35 +03001470 pchan = l2cap_global_chan_by_scid(BT_LISTEN, L2CAP_CID_ATT,
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001471 &hcon->src, &hcon->dst);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001472 if (!pchan)
Ville Tervob62f3282011-02-10 22:38:50 -03001473 return;
1474
Johan Hedberg44f3b0f2013-04-29 19:35:45 +03001475 /* Client ATT sockets should override the server one */
1476 if (__l2cap_get_chan_by_dcid(conn, L2CAP_CID_ATT))
1477 return;
1478
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001479 dst_type = bdaddr_type(hcon, hcon->dst_type);
1480
1481 /* If device is blocked, do not create a channel for it */
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001482 if (hci_bdaddr_list_lookup(&hdev->blacklist, &hcon->dst, dst_type))
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001483 return;
1484
Marcel Holtmann80afeb62014-06-23 12:18:51 +02001485 /* For LE slave connections, make sure the connection interval
1486 * is in the range of the minium and maximum interval that has
1487 * been configured for this connection. If not, then trigger
1488 * the connection update procedure.
1489 */
Johan Hedberg4dae2792014-06-24 17:03:50 +03001490 if (!test_bit(HCI_CONN_MASTER, &hcon->flags) &&
Marcel Holtmann80afeb62014-06-23 12:18:51 +02001491 (hcon->le_conn_interval < hcon->le_conn_min_interval ||
1492 hcon->le_conn_interval > hcon->le_conn_max_interval)) {
1493 struct l2cap_conn_param_update_req req;
1494
1495 req.min = cpu_to_le16(hcon->le_conn_min_interval);
1496 req.max = cpu_to_le16(hcon->le_conn_max_interval);
1497 req.latency = cpu_to_le16(hcon->le_conn_latency);
1498 req.to_multiplier = cpu_to_le16(hcon->le_supv_timeout);
1499
1500 l2cap_send_cmd(conn, l2cap_get_ident(conn),
1501 L2CAP_CONN_PARAM_UPDATE_REQ, sizeof(req), &req);
1502 }
1503
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001504 l2cap_chan_lock(pchan);
Gustavo F. Padovan62f3a2c2011-04-14 18:34:34 -03001505
Gustavo Padovan80b98022012-05-27 22:27:51 -03001506 chan = pchan->ops->new_connection(pchan);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001507 if (!chan)
Ville Tervob62f3282011-02-10 22:38:50 -03001508 goto clean;
1509
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001510 bacpy(&chan->src, &hcon->src);
1511 bacpy(&chan->dst, &hcon->dst);
1512 chan->src_type = bdaddr_type(hcon, hcon->src_type);
1513 chan->dst_type = dst_type;
Ville Tervob62f3282011-02-10 22:38:50 -03001514
Johan Hedberg44f3b0f2013-04-29 19:35:45 +03001515 __l2cap_chan_add(conn, chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001516
Ville Tervob62f3282011-02-10 22:38:50 -03001517clean:
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001518 l2cap_chan_unlock(pchan);
Ville Tervob62f3282011-02-10 22:38:50 -03001519}
1520
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001521static void l2cap_conn_ready(struct l2cap_conn *conn)
1522{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001523 struct l2cap_chan *chan;
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001524 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001525
1526 BT_DBG("conn %p", conn);
1527
Johan Hedbergd8729922013-04-29 19:35:39 +03001528 /* For outgoing pairing which doesn't necessarily have an
1529 * associated socket (e.g. mgmt_pair_device).
1530 */
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001531 if (hcon->out && hcon->type == LE_LINK)
1532 smp_conn_security(hcon, hcon->pending_sec_level);
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03001533
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001534 mutex_lock(&conn->chan_lock);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001535
Johan Hedberg44f3b0f2013-04-29 19:35:45 +03001536 if (hcon->type == LE_LINK)
1537 l2cap_le_conn_ready(conn);
1538
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001539 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03001540
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001541 l2cap_chan_lock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001542
Johan Hedberg2338a7e2014-01-24 10:35:40 +02001543 if (chan->scid == L2CAP_CID_A2MP) {
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001544 l2cap_chan_unlock(chan);
1545 continue;
1546 }
1547
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001548 if (hcon->type == LE_LINK) {
Johan Hedbergf1496de2013-05-13 14:15:56 +03001549 l2cap_le_start(chan);
Vinicius Costa Gomes63128452011-06-17 22:46:26 -03001550 } else if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Gustavo Padovan74e75742013-10-15 19:24:51 -03001551 l2cap_chan_ready(chan);
Anderson Brigliab501d6a2011-06-07 18:46:31 -03001552
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001553 } else if (chan->state == BT_CONNECT) {
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001554 l2cap_do_start(chan);
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001555 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001556
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001557 l2cap_chan_unlock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001558 }
1559
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001560 mutex_unlock(&conn->chan_lock);
Johan Hedberg61a939c2014-01-17 20:45:11 +02001561
1562 queue_work(hcon->hdev->workqueue, &conn->pending_rx_work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001563}
1564
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001565/* Notify sockets that we cannot guaranty reliability anymore */
1566static void l2cap_conn_unreliable(struct l2cap_conn *conn, int err)
1567{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001568 struct l2cap_chan *chan;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001569
1570 BT_DBG("conn %p", conn);
1571
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001572 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001573
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001574 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +03001575 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo Padovan1d8b1fd2012-10-06 11:34:52 +01001576 l2cap_chan_set_err(chan, err);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001577 }
1578
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001579 mutex_unlock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001580}
1581
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001582static void l2cap_info_timeout(struct work_struct *work)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001583{
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001584 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001585 info_timer.work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001586
Marcel Holtmann984947d2009-02-06 23:35:19 +01001587 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01001588 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01001589
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001590 l2cap_conn_start(conn);
1591}
1592
David Herrmann2c8e1412013-04-06 20:28:45 +02001593/*
1594 * l2cap_user
1595 * External modules can register l2cap_user objects on l2cap_conn. The ->probe
1596 * callback is called during registration. The ->remove callback is called
1597 * during unregistration.
1598 * An l2cap_user object can either be explicitly unregistered or when the
1599 * underlying l2cap_conn object is deleted. This guarantees that l2cap->hcon,
1600 * l2cap->hchan, .. are valid as long as the remove callback hasn't been called.
1601 * External modules must own a reference to the l2cap_conn object if they intend
1602 * to call l2cap_unregister_user(). The l2cap_conn object might get destroyed at
1603 * any time if they don't.
1604 */
1605
1606int l2cap_register_user(struct l2cap_conn *conn, struct l2cap_user *user)
1607{
1608 struct hci_dev *hdev = conn->hcon->hdev;
1609 int ret;
1610
1611 /* We need to check whether l2cap_conn is registered. If it is not, we
1612 * must not register the l2cap_user. l2cap_conn_del() is unregisters
1613 * l2cap_conn objects, but doesn't provide its own locking. Instead, it
1614 * relies on the parent hci_conn object to be locked. This itself relies
1615 * on the hci_dev object to be locked. So we must lock the hci device
1616 * here, too. */
1617
1618 hci_dev_lock(hdev);
1619
1620 if (user->list.next || user->list.prev) {
1621 ret = -EINVAL;
1622 goto out_unlock;
1623 }
1624
1625 /* conn->hchan is NULL after l2cap_conn_del() was called */
1626 if (!conn->hchan) {
1627 ret = -ENODEV;
1628 goto out_unlock;
1629 }
1630
1631 ret = user->probe(conn, user);
1632 if (ret)
1633 goto out_unlock;
1634
1635 list_add(&user->list, &conn->users);
1636 ret = 0;
1637
1638out_unlock:
1639 hci_dev_unlock(hdev);
1640 return ret;
1641}
1642EXPORT_SYMBOL(l2cap_register_user);
1643
1644void l2cap_unregister_user(struct l2cap_conn *conn, struct l2cap_user *user)
1645{
1646 struct hci_dev *hdev = conn->hcon->hdev;
1647
1648 hci_dev_lock(hdev);
1649
1650 if (!user->list.next || !user->list.prev)
1651 goto out_unlock;
1652
1653 list_del(&user->list);
1654 user->list.next = NULL;
1655 user->list.prev = NULL;
1656 user->remove(conn, user);
1657
1658out_unlock:
1659 hci_dev_unlock(hdev);
1660}
1661EXPORT_SYMBOL(l2cap_unregister_user);
1662
1663static void l2cap_unregister_all_users(struct l2cap_conn *conn)
1664{
1665 struct l2cap_user *user;
1666
1667 while (!list_empty(&conn->users)) {
1668 user = list_first_entry(&conn->users, struct l2cap_user, list);
1669 list_del(&user->list);
1670 user->list.next = NULL;
1671 user->list.prev = NULL;
1672 user->remove(conn, user);
1673 }
1674}
1675
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001676static void l2cap_conn_del(struct hci_conn *hcon, int err)
1677{
1678 struct l2cap_conn *conn = hcon->l2cap_data;
1679 struct l2cap_chan *chan, *l;
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001680
1681 if (!conn)
1682 return;
1683
1684 BT_DBG("hcon %p conn %p, err %d", hcon, conn, err);
1685
1686 kfree_skb(conn->rx_skb);
1687
Johan Hedberg61a939c2014-01-17 20:45:11 +02001688 skb_queue_purge(&conn->pending_rx);
Jukka Taimisto7ab56c32014-06-12 10:15:13 +00001689
1690 /* We can not call flush_work(&conn->pending_rx_work) here since we
1691 * might block if we are running on a worker from the same workqueue
1692 * pending_rx_work is waiting on.
1693 */
1694 if (work_pending(&conn->pending_rx_work))
1695 cancel_work_sync(&conn->pending_rx_work);
Johan Hedberg61a939c2014-01-17 20:45:11 +02001696
David Herrmann2c8e1412013-04-06 20:28:45 +02001697 l2cap_unregister_all_users(conn);
1698
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001699 mutex_lock(&conn->chan_lock);
1700
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001701 /* Kill channels */
1702 list_for_each_entry_safe(chan, l, &conn->chan_l, list) {
Mat Martineau61d6ef32012-04-27 16:50:50 -07001703 l2cap_chan_hold(chan);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001704 l2cap_chan_lock(chan);
1705
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001706 l2cap_chan_del(chan, err);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001707
1708 l2cap_chan_unlock(chan);
1709
Gustavo Padovan80b98022012-05-27 22:27:51 -03001710 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07001711 l2cap_chan_put(chan);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001712 }
1713
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001714 mutex_unlock(&conn->chan_lock);
1715
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001716 hci_chan_del(conn->hchan);
1717
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001718 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT)
Ulisses Furquim127074b2012-01-30 18:26:29 -02001719 cancel_delayed_work_sync(&conn->info_timer);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001720
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001721 if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags)) {
Ulisses Furquim127074b2012-01-30 18:26:29 -02001722 cancel_delayed_work_sync(&conn->security_timer);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001723 smp_chan_destroy(conn);
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001724 }
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001725
1726 hcon->l2cap_data = NULL;
David Herrmann9c903e32013-04-06 20:28:44 +02001727 conn->hchan = NULL;
1728 l2cap_conn_put(conn);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001729}
1730
Gustavo F. Padovan6c9d42a2011-12-20 10:57:27 -02001731static void security_timeout(struct work_struct *work)
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001732{
Gustavo F. Padovan6c9d42a2011-12-20 10:57:27 -02001733 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001734 security_timer.work);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001735
Johan Hedbergd06cc412012-06-06 18:44:11 +08001736 BT_DBG("conn %p", conn);
1737
1738 if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags)) {
1739 smp_chan_destroy(conn);
1740 l2cap_conn_del(conn->hcon, ETIMEDOUT);
1741 }
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001742}
1743
David Herrmann9c903e32013-04-06 20:28:44 +02001744static void l2cap_conn_free(struct kref *ref)
1745{
1746 struct l2cap_conn *conn = container_of(ref, struct l2cap_conn, ref);
1747
1748 hci_conn_put(conn->hcon);
1749 kfree(conn);
1750}
1751
1752void l2cap_conn_get(struct l2cap_conn *conn)
1753{
1754 kref_get(&conn->ref);
1755}
1756EXPORT_SYMBOL(l2cap_conn_get);
1757
1758void l2cap_conn_put(struct l2cap_conn *conn)
1759{
1760 kref_put(&conn->ref, l2cap_conn_free);
1761}
1762EXPORT_SYMBOL(l2cap_conn_put);
1763
Linus Torvalds1da177e2005-04-16 15:20:36 -07001764/* ---- Socket interface ---- */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001765
Ido Yarivc2287682012-04-20 15:46:07 -03001766/* Find socket with psm and source / destination bdaddr.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001767 * Returns closest match.
1768 */
Ido Yarivc2287682012-04-20 15:46:07 -03001769static struct l2cap_chan *l2cap_global_chan_by_psm(int state, __le16 psm,
1770 bdaddr_t *src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001771 bdaddr_t *dst,
1772 u8 link_type)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001773{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001774 struct l2cap_chan *c, *c1 = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001775
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001776 read_lock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001777
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001778 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001779 if (state && c->state != state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001780 continue;
1781
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001782 if (link_type == ACL_LINK && c->src_type != BDADDR_BREDR)
1783 continue;
1784
1785 if (link_type == LE_LINK && c->src_type == BDADDR_BREDR)
1786 continue;
1787
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001788 if (c->psm == psm) {
Ido Yarivc2287682012-04-20 15:46:07 -03001789 int src_match, dst_match;
1790 int src_any, dst_any;
1791
Linus Torvalds1da177e2005-04-16 15:20:36 -07001792 /* Exact match. */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001793 src_match = !bacmp(&c->src, src);
1794 dst_match = !bacmp(&c->dst, dst);
Ido Yarivc2287682012-04-20 15:46:07 -03001795 if (src_match && dst_match) {
Johannes Berga7567b22011-06-01 08:29:54 +02001796 read_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001797 return c;
1798 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001799
1800 /* Closest match */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001801 src_any = !bacmp(&c->src, BDADDR_ANY);
1802 dst_any = !bacmp(&c->dst, BDADDR_ANY);
Ido Yarivc2287682012-04-20 15:46:07 -03001803 if ((src_match && dst_any) || (src_any && dst_match) ||
1804 (src_any && dst_any))
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001805 c1 = c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001806 }
1807 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001808
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001809 read_unlock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001810
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001811 return c1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001812}
1813
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001814static void l2cap_monitor_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001815{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001816 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001817 monitor_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001818
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03001819 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001820
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001821 l2cap_chan_lock(chan);
1822
Mat Martineau80909e02012-05-17 20:53:50 -07001823 if (!chan->conn) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001824 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001825 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001826 return;
1827 }
1828
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001829 l2cap_tx(chan, NULL, NULL, L2CAP_EV_MONITOR_TO);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001830
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001831 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001832 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001833}
1834
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001835static void l2cap_retrans_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001836{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001837 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001838 retrans_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001839
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03001840 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001841
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001842 l2cap_chan_lock(chan);
1843
Mat Martineau80909e02012-05-17 20:53:50 -07001844 if (!chan->conn) {
1845 l2cap_chan_unlock(chan);
1846 l2cap_chan_put(chan);
1847 return;
1848 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001849
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001850 l2cap_tx(chan, NULL, NULL, L2CAP_EV_RETRANS_TO);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001851 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001852 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001853}
1854
Gustavo Padovand6603662012-05-21 13:58:22 -03001855static void l2cap_streaming_send(struct l2cap_chan *chan,
1856 struct sk_buff_head *skbs)
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001857{
Gustavo F. Padovanccbb84a2010-08-30 18:44:44 -03001858 struct sk_buff *skb;
Mat Martineau37339372012-05-17 20:53:33 -07001859 struct l2cap_ctrl *control;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001860
Mat Martineau37339372012-05-17 20:53:33 -07001861 BT_DBG("chan %p, skbs %p", chan, skbs);
1862
Mat Martineaub99e13a2012-10-23 15:24:19 -07001863 if (__chan_is_moving(chan))
1864 return;
1865
Mat Martineau37339372012-05-17 20:53:33 -07001866 skb_queue_splice_tail_init(skbs, &chan->tx_q);
1867
1868 while (!skb_queue_empty(&chan->tx_q)) {
1869
1870 skb = skb_dequeue(&chan->tx_q);
1871
1872 bt_cb(skb)->control.retries = 1;
1873 control = &bt_cb(skb)->control;
1874
1875 control->reqseq = 0;
1876 control->txseq = chan->next_tx_seq;
1877
1878 __pack_control(chan, control, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001879
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001880 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau37339372012-05-17 20:53:33 -07001881 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1882 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001883 }
1884
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001885 l2cap_do_send(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001886
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001887 BT_DBG("Sent txseq %u", control->txseq);
Mat Martineau37339372012-05-17 20:53:33 -07001888
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001889 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau37339372012-05-17 20:53:33 -07001890 chan->frames_sent++;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001891 }
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001892}
1893
Szymon Janc67c9e842011-07-28 16:24:33 +02001894static int l2cap_ertm_send(struct l2cap_chan *chan)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001895{
1896 struct sk_buff *skb, *tx_skb;
Mat Martineau18a48e72012-05-17 20:53:34 -07001897 struct l2cap_ctrl *control;
1898 int sent = 0;
1899
1900 BT_DBG("chan %p", chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001901
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001902 if (chan->state != BT_CONNECTED)
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001903 return -ENOTCONN;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001904
Mat Martineau94122bb2012-05-02 09:42:02 -07001905 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1906 return 0;
1907
Mat Martineaub99e13a2012-10-23 15:24:19 -07001908 if (__chan_is_moving(chan))
1909 return 0;
1910
Mat Martineau18a48e72012-05-17 20:53:34 -07001911 while (chan->tx_send_head &&
1912 chan->unacked_frames < chan->remote_tx_win &&
1913 chan->tx_state == L2CAP_TX_STATE_XMIT) {
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001914
Mat Martineau18a48e72012-05-17 20:53:34 -07001915 skb = chan->tx_send_head;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001916
Mat Martineau18a48e72012-05-17 20:53:34 -07001917 bt_cb(skb)->control.retries = 1;
1918 control = &bt_cb(skb)->control;
Gustavo F. Padovan95ffa972010-06-18 20:37:33 -03001919
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001920 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
Mat Martineau18a48e72012-05-17 20:53:34 -07001921 control->final = 1;
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001922
Mat Martineau18a48e72012-05-17 20:53:34 -07001923 control->reqseq = chan->buffer_seq;
1924 chan->last_acked_seq = chan->buffer_seq;
1925 control->txseq = chan->next_tx_seq;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001926
Mat Martineau18a48e72012-05-17 20:53:34 -07001927 __pack_control(chan, control, skb);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001928
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001929 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau18a48e72012-05-17 20:53:34 -07001930 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1931 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001932 }
1933
Mat Martineau18a48e72012-05-17 20:53:34 -07001934 /* Clone after data has been modified. Data is assumed to be
1935 read-only (for locking purposes) on cloned sk_buffs.
1936 */
1937 tx_skb = skb_clone(skb, GFP_KERNEL);
1938
1939 if (!tx_skb)
1940 break;
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -03001941
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03001942 __set_retrans_timer(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001943
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001944 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau18a48e72012-05-17 20:53:34 -07001945 chan->unacked_frames++;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03001946 chan->frames_sent++;
Mat Martineau18a48e72012-05-17 20:53:34 -07001947 sent++;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001948
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001949 if (skb_queue_is_last(&chan->tx_q, skb))
1950 chan->tx_send_head = NULL;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001951 else
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001952 chan->tx_send_head = skb_queue_next(&chan->tx_q, skb);
Mat Martineau18a48e72012-05-17 20:53:34 -07001953
1954 l2cap_do_send(chan, tx_skb);
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001955 BT_DBG("Sent txseq %u", control->txseq);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001956 }
1957
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001958 BT_DBG("Sent %d, %u unacked, %u in ERTM queue", sent,
1959 chan->unacked_frames, skb_queue_len(&chan->tx_q));
Mat Martineau18a48e72012-05-17 20:53:34 -07001960
1961 return sent;
Gustavo F. Padovan9e917af2010-05-01 16:15:37 -03001962}
1963
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001964static void l2cap_ertm_resend(struct l2cap_chan *chan)
1965{
1966 struct l2cap_ctrl control;
1967 struct sk_buff *skb;
1968 struct sk_buff *tx_skb;
1969 u16 seq;
1970
1971 BT_DBG("chan %p", chan);
1972
1973 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1974 return;
1975
Mat Martineaub99e13a2012-10-23 15:24:19 -07001976 if (__chan_is_moving(chan))
1977 return;
1978
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001979 while (chan->retrans_list.head != L2CAP_SEQ_LIST_CLEAR) {
1980 seq = l2cap_seq_list_pop(&chan->retrans_list);
1981
1982 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, seq);
1983 if (!skb) {
1984 BT_DBG("Error: Can't retransmit seq %d, frame missing",
Gustavo Padovan2d792812012-10-06 10:07:01 +01001985 seq);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001986 continue;
1987 }
1988
1989 bt_cb(skb)->control.retries++;
1990 control = bt_cb(skb)->control;
1991
1992 if (chan->max_tx != 0 &&
1993 bt_cb(skb)->control.retries > chan->max_tx) {
1994 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001995 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001996 l2cap_seq_list_clear(&chan->retrans_list);
1997 break;
1998 }
1999
2000 control.reqseq = chan->buffer_seq;
2001 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
2002 control.final = 1;
2003 else
2004 control.final = 0;
2005
2006 if (skb_cloned(skb)) {
2007 /* Cloned sk_buffs are read-only, so we need a
2008 * writeable copy
2009 */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002010 tx_skb = skb_copy(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002011 } else {
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002012 tx_skb = skb_clone(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002013 }
2014
2015 if (!tx_skb) {
2016 l2cap_seq_list_clear(&chan->retrans_list);
2017 break;
2018 }
2019
2020 /* Update skb contents */
2021 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
2022 put_unaligned_le32(__pack_extended_control(&control),
2023 tx_skb->data + L2CAP_HDR_SIZE);
2024 } else {
2025 put_unaligned_le16(__pack_enhanced_control(&control),
2026 tx_skb->data + L2CAP_HDR_SIZE);
2027 }
2028
2029 if (chan->fcs == L2CAP_FCS_CRC16) {
2030 u16 fcs = crc16(0, (u8 *) tx_skb->data, tx_skb->len);
2031 put_unaligned_le16(fcs, skb_put(tx_skb,
2032 L2CAP_FCS_SIZE));
2033 }
2034
2035 l2cap_do_send(chan, tx_skb);
2036
2037 BT_DBG("Resent txseq %d", control.txseq);
2038
2039 chan->last_acked_seq = chan->buffer_seq;
2040 }
2041}
2042
Mat Martineauf80842a2012-05-17 20:53:46 -07002043static void l2cap_retransmit(struct l2cap_chan *chan,
2044 struct l2cap_ctrl *control)
2045{
2046 BT_DBG("chan %p, control %p", chan, control);
2047
2048 l2cap_seq_list_append(&chan->retrans_list, control->reqseq);
2049 l2cap_ertm_resend(chan);
2050}
2051
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002052static void l2cap_retransmit_all(struct l2cap_chan *chan,
2053 struct l2cap_ctrl *control)
2054{
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002055 struct sk_buff *skb;
2056
2057 BT_DBG("chan %p, control %p", chan, control);
2058
2059 if (control->poll)
2060 set_bit(CONN_SEND_FBIT, &chan->conn_state);
2061
2062 l2cap_seq_list_clear(&chan->retrans_list);
2063
2064 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
2065 return;
2066
2067 if (chan->unacked_frames) {
2068 skb_queue_walk(&chan->tx_q, skb) {
2069 if (bt_cb(skb)->control.txseq == control->reqseq ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01002070 skb == chan->tx_send_head)
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002071 break;
2072 }
2073
2074 skb_queue_walk_from(&chan->tx_q, skb) {
2075 if (skb == chan->tx_send_head)
2076 break;
2077
2078 l2cap_seq_list_append(&chan->retrans_list,
2079 bt_cb(skb)->control.txseq);
2080 }
2081
2082 l2cap_ertm_resend(chan);
2083 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002084}
2085
Szymon Jancb17e73b2012-01-11 10:59:47 +01002086static void l2cap_send_ack(struct l2cap_chan *chan)
2087{
Mat Martineau0a0aba42012-05-17 20:53:39 -07002088 struct l2cap_ctrl control;
2089 u16 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
2090 chan->last_acked_seq);
2091 int threshold;
2092
2093 BT_DBG("chan %p last_acked_seq %d buffer_seq %d",
2094 chan, chan->last_acked_seq, chan->buffer_seq);
2095
2096 memset(&control, 0, sizeof(control));
2097 control.sframe = 1;
2098
2099 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
2100 chan->rx_state == L2CAP_RX_STATE_RECV) {
2101 __clear_ack_timer(chan);
2102 control.super = L2CAP_SUPER_RNR;
2103 control.reqseq = chan->buffer_seq;
2104 l2cap_send_sframe(chan, &control);
2105 } else {
2106 if (!test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) {
2107 l2cap_ertm_send(chan);
2108 /* If any i-frames were sent, they included an ack */
2109 if (chan->buffer_seq == chan->last_acked_seq)
2110 frames_to_ack = 0;
2111 }
2112
Mat Martineauc20f8e32012-07-10 05:47:07 -07002113 /* Ack now if the window is 3/4ths full.
Mat Martineau0a0aba42012-05-17 20:53:39 -07002114 * Calculate without mul or div
2115 */
Mat Martineauc20f8e32012-07-10 05:47:07 -07002116 threshold = chan->ack_win;
Mat Martineau0a0aba42012-05-17 20:53:39 -07002117 threshold += threshold << 1;
2118 threshold >>= 2;
2119
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002120 BT_DBG("frames_to_ack %u, threshold %d", frames_to_ack,
Mat Martineau0a0aba42012-05-17 20:53:39 -07002121 threshold);
2122
2123 if (frames_to_ack >= threshold) {
2124 __clear_ack_timer(chan);
2125 control.super = L2CAP_SUPER_RR;
2126 control.reqseq = chan->buffer_seq;
2127 l2cap_send_sframe(chan, &control);
2128 frames_to_ack = 0;
2129 }
2130
2131 if (frames_to_ack)
2132 __set_ack_timer(chan);
2133 }
Szymon Jancb17e73b2012-01-11 10:59:47 +01002134}
2135
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002136static inline int l2cap_skbuff_fromiovec(struct l2cap_chan *chan,
2137 struct msghdr *msg, int len,
2138 int count, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002139{
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002140 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002141 struct sk_buff **frag;
Gustavo Padovan90338942012-04-06 20:15:47 -03002142 int sent = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002143
Jukka Rissanen04988782014-06-18 16:37:07 +03002144 if (chan->ops->memcpy_fromiovec(chan, skb_put(skb, count),
2145 msg->msg_iov, count))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002146 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002147
2148 sent += count;
2149 len -= count;
2150
2151 /* Continuation fragments (no L2CAP header) */
2152 frag = &skb_shinfo(skb)->frag_list;
2153 while (len) {
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002154 struct sk_buff *tmp;
2155
Linus Torvalds1da177e2005-04-16 15:20:36 -07002156 count = min_t(unsigned int, conn->mtu, len);
2157
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002158 tmp = chan->ops->alloc_skb(chan, 0, count,
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002159 msg->msg_flags & MSG_DONTWAIT);
2160 if (IS_ERR(tmp))
2161 return PTR_ERR(tmp);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002162
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002163 *frag = tmp;
2164
Jukka Rissanen04988782014-06-18 16:37:07 +03002165 if (chan->ops->memcpy_fromiovec(chan, skb_put(*frag, count),
2166 msg->msg_iov, count))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002167 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002168
2169 sent += count;
2170 len -= count;
2171
Gustavo Padovan2d0ed3d2012-05-11 13:16:12 -03002172 skb->len += (*frag)->len;
2173 skb->data_len += (*frag)->len;
2174
Linus Torvalds1da177e2005-04-16 15:20:36 -07002175 frag = &(*frag)->next;
2176 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002177
2178 return sent;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002179}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002180
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002181static struct sk_buff *l2cap_create_connless_pdu(struct l2cap_chan *chan,
Marcel Holtmann8d463212014-06-05 15:22:51 +02002182 struct msghdr *msg, size_t len)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002183{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002184 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002185 struct sk_buff *skb;
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002186 int err, count, hlen = L2CAP_HDR_SIZE + L2CAP_PSMLEN_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002187 struct l2cap_hdr *lh;
2188
Marcel Holtmann8d463212014-06-05 15:22:51 +02002189 BT_DBG("chan %p psm 0x%2.2x len %zu", chan,
2190 __le16_to_cpu(chan->psm), len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002191
2192 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002193
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002194 skb = chan->ops->alloc_skb(chan, hlen, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002195 msg->msg_flags & MSG_DONTWAIT);
2196 if (IS_ERR(skb))
2197 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002198
2199 /* Create L2CAP header */
2200 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002201 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenkodaf6a78c2012-05-03 10:55:52 +03002202 lh->len = cpu_to_le16(len + L2CAP_PSMLEN_SIZE);
Marcel Holtmann43b1b8d2013-10-12 06:01:26 -07002203 put_unaligned(chan->psm, (__le16 *) skb_put(skb, L2CAP_PSMLEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002204
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002205 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002206 if (unlikely(err < 0)) {
2207 kfree_skb(skb);
2208 return ERR_PTR(err);
2209 }
2210 return skb;
2211}
2212
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002213static struct sk_buff *l2cap_create_basic_pdu(struct l2cap_chan *chan,
Marcel Holtmann8d463212014-06-05 15:22:51 +02002214 struct msghdr *msg, size_t len)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002215{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002216 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002217 struct sk_buff *skb;
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002218 int err, count;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002219 struct l2cap_hdr *lh;
2220
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002221 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002222
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002223 count = min_t(unsigned int, (conn->mtu - L2CAP_HDR_SIZE), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002224
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002225 skb = chan->ops->alloc_skb(chan, L2CAP_HDR_SIZE, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002226 msg->msg_flags & MSG_DONTWAIT);
2227 if (IS_ERR(skb))
2228 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002229
2230 /* Create L2CAP header */
2231 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002232 lh->cid = cpu_to_le16(chan->dcid);
Gustavo Padovan6ff9b5e2012-05-02 11:56:17 -03002233 lh->len = cpu_to_le16(len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002234
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002235 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002236 if (unlikely(err < 0)) {
2237 kfree_skb(skb);
2238 return ERR_PTR(err);
2239 }
2240 return skb;
2241}
2242
Luiz Augusto von Dentzab0ff762011-09-12 20:00:50 +03002243static struct sk_buff *l2cap_create_iframe_pdu(struct l2cap_chan *chan,
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002244 struct msghdr *msg, size_t len,
2245 u16 sdulen)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002246{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002247 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002248 struct sk_buff *skb;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002249 int err, count, hlen;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002250 struct l2cap_hdr *lh;
2251
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002252 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002253
Gustavo F. Padovan0ee0d202010-05-01 16:15:41 -03002254 if (!conn)
2255 return ERR_PTR(-ENOTCONN);
2256
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002257 hlen = __ertm_hdr_size(chan);
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002258
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002259 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002260 hlen += L2CAP_SDULEN_SIZE;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002261
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03002262 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002263 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03002264
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002265 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002266
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002267 skb = chan->ops->alloc_skb(chan, hlen, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002268 msg->msg_flags & MSG_DONTWAIT);
2269 if (IS_ERR(skb))
2270 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002271
2272 /* Create L2CAP header */
2273 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002274 lh->cid = cpu_to_le16(chan->dcid);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002275 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002276
Mat Martineau18a48e72012-05-17 20:53:34 -07002277 /* Control header is populated later */
2278 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
2279 put_unaligned_le32(0, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
2280 else
2281 put_unaligned_le16(0, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002282
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002283 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002284 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002285
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002286 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002287 if (unlikely(err < 0)) {
2288 kfree_skb(skb);
2289 return ERR_PTR(err);
2290 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03002291
Mat Martineau18a48e72012-05-17 20:53:34 -07002292 bt_cb(skb)->control.fcs = chan->fcs;
Mat Martineau3ce35142012-04-25 16:36:14 -07002293 bt_cb(skb)->control.retries = 0;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002294 return skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002295}
2296
Mat Martineau94122bb2012-05-02 09:42:02 -07002297static int l2cap_segment_sdu(struct l2cap_chan *chan,
2298 struct sk_buff_head *seg_queue,
2299 struct msghdr *msg, size_t len)
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002300{
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002301 struct sk_buff *skb;
Mat Martineau94122bb2012-05-02 09:42:02 -07002302 u16 sdu_len;
2303 size_t pdu_len;
Mat Martineau94122bb2012-05-02 09:42:02 -07002304 u8 sar;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002305
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002306 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002307
Mat Martineau94122bb2012-05-02 09:42:02 -07002308 /* It is critical that ERTM PDUs fit in a single HCI fragment,
2309 * so fragmented skbs are not used. The HCI layer's handling
2310 * of fragmented skbs is not compatible with ERTM's queueing.
2311 */
2312
2313 /* PDU size is derived from the HCI MTU */
2314 pdu_len = chan->conn->mtu;
2315
Mat Martineaua5495742012-10-23 15:24:21 -07002316 /* Constrain PDU size for BR/EDR connections */
2317 if (!chan->hs_hcon)
2318 pdu_len = min_t(size_t, pdu_len, L2CAP_BREDR_MAX_PAYLOAD);
Mat Martineau94122bb2012-05-02 09:42:02 -07002319
2320 /* Adjust for largest possible L2CAP overhead. */
Gustavo Padovan35d401d2012-05-25 18:57:05 -03002321 if (chan->fcs)
2322 pdu_len -= L2CAP_FCS_SIZE;
2323
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002324 pdu_len -= __ertm_hdr_size(chan);
Mat Martineau94122bb2012-05-02 09:42:02 -07002325
2326 /* Remote device may have requested smaller PDUs */
2327 pdu_len = min_t(size_t, pdu_len, chan->remote_mps);
2328
2329 if (len <= pdu_len) {
2330 sar = L2CAP_SAR_UNSEGMENTED;
2331 sdu_len = 0;
2332 pdu_len = len;
2333 } else {
2334 sar = L2CAP_SAR_START;
2335 sdu_len = len;
2336 pdu_len -= L2CAP_SDULEN_SIZE;
2337 }
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002338
2339 while (len > 0) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002340 skb = l2cap_create_iframe_pdu(chan, msg, pdu_len, sdu_len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002341
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002342 if (IS_ERR(skb)) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002343 __skb_queue_purge(seg_queue);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002344 return PTR_ERR(skb);
2345 }
2346
Mat Martineau94122bb2012-05-02 09:42:02 -07002347 bt_cb(skb)->control.sar = sar;
2348 __skb_queue_tail(seg_queue, skb);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002349
Mat Martineau94122bb2012-05-02 09:42:02 -07002350 len -= pdu_len;
2351 if (sdu_len) {
2352 sdu_len = 0;
2353 pdu_len += L2CAP_SDULEN_SIZE;
2354 }
2355
2356 if (len <= pdu_len) {
2357 sar = L2CAP_SAR_END;
2358 pdu_len = len;
2359 } else {
2360 sar = L2CAP_SAR_CONTINUE;
2361 }
2362 }
2363
Gustavo Padovanf0f62792012-05-29 13:29:17 -03002364 return 0;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002365}
2366
Johan Hedberg177f8f22013-05-31 17:54:51 +03002367static struct sk_buff *l2cap_create_le_flowctl_pdu(struct l2cap_chan *chan,
2368 struct msghdr *msg,
2369 size_t len, u16 sdulen)
2370{
2371 struct l2cap_conn *conn = chan->conn;
2372 struct sk_buff *skb;
2373 int err, count, hlen;
2374 struct l2cap_hdr *lh;
2375
2376 BT_DBG("chan %p len %zu", chan, len);
2377
2378 if (!conn)
2379 return ERR_PTR(-ENOTCONN);
2380
2381 hlen = L2CAP_HDR_SIZE;
2382
2383 if (sdulen)
2384 hlen += L2CAP_SDULEN_SIZE;
2385
2386 count = min_t(unsigned int, (conn->mtu - hlen), len);
2387
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002388 skb = chan->ops->alloc_skb(chan, hlen, count,
Johan Hedberg177f8f22013-05-31 17:54:51 +03002389 msg->msg_flags & MSG_DONTWAIT);
2390 if (IS_ERR(skb))
2391 return skb;
2392
2393 /* Create L2CAP header */
2394 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
2395 lh->cid = cpu_to_le16(chan->dcid);
2396 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
2397
2398 if (sdulen)
2399 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
2400
2401 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
2402 if (unlikely(err < 0)) {
2403 kfree_skb(skb);
2404 return ERR_PTR(err);
2405 }
2406
2407 return skb;
2408}
2409
2410static int l2cap_segment_le_sdu(struct l2cap_chan *chan,
2411 struct sk_buff_head *seg_queue,
2412 struct msghdr *msg, size_t len)
2413{
2414 struct sk_buff *skb;
2415 size_t pdu_len;
2416 u16 sdu_len;
2417
2418 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
2419
2420 pdu_len = chan->conn->mtu - L2CAP_HDR_SIZE;
2421
2422 pdu_len = min_t(size_t, pdu_len, chan->remote_mps);
2423
2424 sdu_len = len;
2425 pdu_len -= L2CAP_SDULEN_SIZE;
2426
2427 while (len > 0) {
2428 if (len <= pdu_len)
2429 pdu_len = len;
2430
2431 skb = l2cap_create_le_flowctl_pdu(chan, msg, pdu_len, sdu_len);
2432 if (IS_ERR(skb)) {
2433 __skb_queue_purge(seg_queue);
2434 return PTR_ERR(skb);
2435 }
2436
2437 __skb_queue_tail(seg_queue, skb);
2438
2439 len -= pdu_len;
2440
2441 if (sdu_len) {
2442 sdu_len = 0;
2443 pdu_len += L2CAP_SDULEN_SIZE;
2444 }
2445 }
2446
2447 return 0;
2448}
2449
Marcel Holtmann8d463212014-06-05 15:22:51 +02002450int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002451{
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002452 struct sk_buff *skb;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002453 int err;
Mat Martineau94122bb2012-05-02 09:42:02 -07002454 struct sk_buff_head seg_queue;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002455
Seung-Woo Kim31e8ce82013-11-05 18:46:33 +09002456 if (!chan->conn)
2457 return -ENOTCONN;
2458
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002459 /* Connectionless channel */
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002460 if (chan->chan_type == L2CAP_CHAN_CONN_LESS) {
Marcel Holtmann8d463212014-06-05 15:22:51 +02002461 skb = l2cap_create_connless_pdu(chan, msg, len);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002462 if (IS_ERR(skb))
2463 return PTR_ERR(skb);
2464
Andrzej Kaczmarekede81a22014-02-25 17:16:22 +01002465 /* Channel lock is released before requesting new skb and then
2466 * reacquired thus we need to recheck channel state.
2467 */
2468 if (chan->state != BT_CONNECTED) {
2469 kfree_skb(skb);
2470 return -ENOTCONN;
2471 }
2472
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002473 l2cap_do_send(chan, skb);
2474 return len;
2475 }
2476
2477 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03002478 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedberg177f8f22013-05-31 17:54:51 +03002479 /* Check outgoing MTU */
2480 if (len > chan->omtu)
2481 return -EMSGSIZE;
2482
Johan Hedbergfad5fc892013-12-05 09:45:01 +02002483 if (!chan->tx_credits)
2484 return -EAGAIN;
2485
Johan Hedberg177f8f22013-05-31 17:54:51 +03002486 __skb_queue_head_init(&seg_queue);
2487
2488 err = l2cap_segment_le_sdu(chan, &seg_queue, msg, len);
2489
2490 if (chan->state != BT_CONNECTED) {
2491 __skb_queue_purge(&seg_queue);
2492 err = -ENOTCONN;
2493 }
2494
2495 if (err)
2496 return err;
2497
2498 skb_queue_splice_tail_init(&seg_queue, &chan->tx_q);
2499
2500 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
2501 l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
2502 chan->tx_credits--;
2503 }
2504
2505 if (!chan->tx_credits)
2506 chan->ops->suspend(chan);
2507
2508 err = len;
2509
2510 break;
2511
Johan Hedbergfad5fc892013-12-05 09:45:01 +02002512 case L2CAP_MODE_BASIC:
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002513 /* Check outgoing MTU */
2514 if (len > chan->omtu)
2515 return -EMSGSIZE;
2516
2517 /* Create a basic PDU */
Marcel Holtmann8d463212014-06-05 15:22:51 +02002518 skb = l2cap_create_basic_pdu(chan, msg, len);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002519 if (IS_ERR(skb))
2520 return PTR_ERR(skb);
2521
Andrzej Kaczmarekede81a22014-02-25 17:16:22 +01002522 /* Channel lock is released before requesting new skb and then
2523 * reacquired thus we need to recheck channel state.
2524 */
2525 if (chan->state != BT_CONNECTED) {
2526 kfree_skb(skb);
2527 return -ENOTCONN;
2528 }
2529
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002530 l2cap_do_send(chan, skb);
2531 err = len;
2532 break;
2533
2534 case L2CAP_MODE_ERTM:
2535 case L2CAP_MODE_STREAMING:
Mat Martineau94122bb2012-05-02 09:42:02 -07002536 /* Check outgoing MTU */
2537 if (len > chan->omtu) {
2538 err = -EMSGSIZE;
2539 break;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002540 }
2541
Mat Martineau94122bb2012-05-02 09:42:02 -07002542 __skb_queue_head_init(&seg_queue);
2543
2544 /* Do segmentation before calling in to the state machine,
2545 * since it's possible to block while waiting for memory
2546 * allocation.
2547 */
2548 err = l2cap_segment_sdu(chan, &seg_queue, msg, len);
2549
2550 /* The channel could have been closed while segmenting,
2551 * check that it is still connected.
2552 */
2553 if (chan->state != BT_CONNECTED) {
2554 __skb_queue_purge(&seg_queue);
2555 err = -ENOTCONN;
2556 }
2557
2558 if (err)
2559 break;
2560
Mat Martineau37339372012-05-17 20:53:33 -07002561 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo Padovand6603662012-05-21 13:58:22 -03002562 l2cap_tx(chan, NULL, &seg_queue, L2CAP_EV_DATA_REQUEST);
Mat Martineau37339372012-05-17 20:53:33 -07002563 else
Gustavo Padovand6603662012-05-21 13:58:22 -03002564 l2cap_streaming_send(chan, &seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002565
Gustavo Padovand6603662012-05-21 13:58:22 -03002566 err = len;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002567
Mat Martineau94122bb2012-05-02 09:42:02 -07002568 /* If the skbs were not queued for sending, they'll still be in
2569 * seg_queue and need to be purged.
2570 */
2571 __skb_queue_purge(&seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002572 break;
2573
2574 default:
2575 BT_DBG("bad state %1.1x", chan->mode);
2576 err = -EBADFD;
2577 }
2578
2579 return err;
2580}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +03002581EXPORT_SYMBOL_GPL(l2cap_chan_send);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002582
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002583static void l2cap_send_srej(struct l2cap_chan *chan, u16 txseq)
2584{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002585 struct l2cap_ctrl control;
2586 u16 seq;
2587
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002588 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002589
2590 memset(&control, 0, sizeof(control));
2591 control.sframe = 1;
2592 control.super = L2CAP_SUPER_SREJ;
2593
2594 for (seq = chan->expected_tx_seq; seq != txseq;
2595 seq = __next_seq(chan, seq)) {
2596 if (!l2cap_ertm_seq_in_queue(&chan->srej_q, seq)) {
2597 control.reqseq = seq;
2598 l2cap_send_sframe(chan, &control);
2599 l2cap_seq_list_append(&chan->srej_list, seq);
2600 }
2601 }
2602
2603 chan->expected_tx_seq = __next_seq(chan, txseq);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002604}
2605
2606static void l2cap_send_srej_tail(struct l2cap_chan *chan)
2607{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002608 struct l2cap_ctrl control;
2609
2610 BT_DBG("chan %p", chan);
2611
2612 if (chan->srej_list.tail == L2CAP_SEQ_LIST_CLEAR)
2613 return;
2614
2615 memset(&control, 0, sizeof(control));
2616 control.sframe = 1;
2617 control.super = L2CAP_SUPER_SREJ;
2618 control.reqseq = chan->srej_list.tail;
2619 l2cap_send_sframe(chan, &control);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002620}
2621
2622static void l2cap_send_srej_list(struct l2cap_chan *chan, u16 txseq)
2623{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002624 struct l2cap_ctrl control;
2625 u16 initial_head;
2626 u16 seq;
2627
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002628 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002629
2630 memset(&control, 0, sizeof(control));
2631 control.sframe = 1;
2632 control.super = L2CAP_SUPER_SREJ;
2633
2634 /* Capture initial list head to allow only one pass through the list. */
2635 initial_head = chan->srej_list.head;
2636
2637 do {
2638 seq = l2cap_seq_list_pop(&chan->srej_list);
2639 if (seq == txseq || seq == L2CAP_SEQ_LIST_CLEAR)
2640 break;
2641
2642 control.reqseq = seq;
2643 l2cap_send_sframe(chan, &control);
2644 l2cap_seq_list_append(&chan->srej_list, seq);
2645 } while (chan->srej_list.head != initial_head);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002646}
2647
Mat Martineau608bcc62012-05-17 20:53:32 -07002648static void l2cap_process_reqseq(struct l2cap_chan *chan, u16 reqseq)
2649{
2650 struct sk_buff *acked_skb;
2651 u16 ackseq;
2652
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002653 BT_DBG("chan %p, reqseq %u", chan, reqseq);
Mat Martineau608bcc62012-05-17 20:53:32 -07002654
2655 if (chan->unacked_frames == 0 || reqseq == chan->expected_ack_seq)
2656 return;
2657
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002658 BT_DBG("expected_ack_seq %u, unacked_frames %u",
Mat Martineau608bcc62012-05-17 20:53:32 -07002659 chan->expected_ack_seq, chan->unacked_frames);
2660
2661 for (ackseq = chan->expected_ack_seq; ackseq != reqseq;
2662 ackseq = __next_seq(chan, ackseq)) {
2663
2664 acked_skb = l2cap_ertm_seq_in_queue(&chan->tx_q, ackseq);
2665 if (acked_skb) {
2666 skb_unlink(acked_skb, &chan->tx_q);
2667 kfree_skb(acked_skb);
2668 chan->unacked_frames--;
2669 }
2670 }
2671
2672 chan->expected_ack_seq = reqseq;
2673
2674 if (chan->unacked_frames == 0)
2675 __clear_retrans_timer(chan);
2676
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002677 BT_DBG("unacked_frames %u", chan->unacked_frames);
Mat Martineau608bcc62012-05-17 20:53:32 -07002678}
2679
2680static void l2cap_abort_rx_srej_sent(struct l2cap_chan *chan)
2681{
2682 BT_DBG("chan %p", chan);
2683
2684 chan->expected_tx_seq = chan->buffer_seq;
2685 l2cap_seq_list_clear(&chan->srej_list);
2686 skb_queue_purge(&chan->srej_q);
2687 chan->rx_state = L2CAP_RX_STATE_RECV;
2688}
2689
Gustavo Padovand6603662012-05-21 13:58:22 -03002690static void l2cap_tx_state_xmit(struct l2cap_chan *chan,
2691 struct l2cap_ctrl *control,
2692 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002693{
Mat Martineau608bcc62012-05-17 20:53:32 -07002694 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2695 event);
2696
2697 switch (event) {
2698 case L2CAP_EV_DATA_REQUEST:
2699 if (chan->tx_send_head == NULL)
2700 chan->tx_send_head = skb_peek(skbs);
2701
2702 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2703 l2cap_ertm_send(chan);
2704 break;
2705 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2706 BT_DBG("Enter LOCAL_BUSY");
2707 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2708
2709 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2710 /* The SREJ_SENT state must be aborted if we are to
2711 * enter the LOCAL_BUSY state.
2712 */
2713 l2cap_abort_rx_srej_sent(chan);
2714 }
2715
2716 l2cap_send_ack(chan);
2717
2718 break;
2719 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2720 BT_DBG("Exit LOCAL_BUSY");
2721 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2722
2723 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2724 struct l2cap_ctrl local_control;
2725
2726 memset(&local_control, 0, sizeof(local_control));
2727 local_control.sframe = 1;
2728 local_control.super = L2CAP_SUPER_RR;
2729 local_control.poll = 1;
2730 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002731 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002732
2733 chan->retry_count = 1;
2734 __set_monitor_timer(chan);
2735 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2736 }
2737 break;
2738 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2739 l2cap_process_reqseq(chan, control->reqseq);
2740 break;
2741 case L2CAP_EV_EXPLICIT_POLL:
2742 l2cap_send_rr_or_rnr(chan, 1);
2743 chan->retry_count = 1;
2744 __set_monitor_timer(chan);
2745 __clear_ack_timer(chan);
2746 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2747 break;
2748 case L2CAP_EV_RETRANS_TO:
2749 l2cap_send_rr_or_rnr(chan, 1);
2750 chan->retry_count = 1;
2751 __set_monitor_timer(chan);
2752 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2753 break;
2754 case L2CAP_EV_RECV_FBIT:
2755 /* Nothing to process */
2756 break;
2757 default:
2758 break;
2759 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002760}
2761
Gustavo Padovand6603662012-05-21 13:58:22 -03002762static void l2cap_tx_state_wait_f(struct l2cap_chan *chan,
2763 struct l2cap_ctrl *control,
2764 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002765{
Mat Martineau608bcc62012-05-17 20:53:32 -07002766 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2767 event);
2768
2769 switch (event) {
2770 case L2CAP_EV_DATA_REQUEST:
2771 if (chan->tx_send_head == NULL)
2772 chan->tx_send_head = skb_peek(skbs);
2773 /* Queue data, but don't send. */
2774 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2775 break;
2776 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2777 BT_DBG("Enter LOCAL_BUSY");
2778 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2779
2780 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2781 /* The SREJ_SENT state must be aborted if we are to
2782 * enter the LOCAL_BUSY state.
2783 */
2784 l2cap_abort_rx_srej_sent(chan);
2785 }
2786
2787 l2cap_send_ack(chan);
2788
2789 break;
2790 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2791 BT_DBG("Exit LOCAL_BUSY");
2792 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2793
2794 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2795 struct l2cap_ctrl local_control;
2796 memset(&local_control, 0, sizeof(local_control));
2797 local_control.sframe = 1;
2798 local_control.super = L2CAP_SUPER_RR;
2799 local_control.poll = 1;
2800 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002801 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002802
2803 chan->retry_count = 1;
2804 __set_monitor_timer(chan);
2805 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2806 }
2807 break;
2808 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2809 l2cap_process_reqseq(chan, control->reqseq);
2810
2811 /* Fall through */
2812
2813 case L2CAP_EV_RECV_FBIT:
2814 if (control && control->final) {
2815 __clear_monitor_timer(chan);
2816 if (chan->unacked_frames > 0)
2817 __set_retrans_timer(chan);
2818 chan->retry_count = 0;
2819 chan->tx_state = L2CAP_TX_STATE_XMIT;
2820 BT_DBG("recv fbit tx_state 0x2.2%x", chan->tx_state);
2821 }
2822 break;
2823 case L2CAP_EV_EXPLICIT_POLL:
2824 /* Ignore */
2825 break;
2826 case L2CAP_EV_MONITOR_TO:
2827 if (chan->max_tx == 0 || chan->retry_count < chan->max_tx) {
2828 l2cap_send_rr_or_rnr(chan, 1);
2829 __set_monitor_timer(chan);
2830 chan->retry_count++;
2831 } else {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02002832 l2cap_send_disconn_req(chan, ECONNABORTED);
Mat Martineau608bcc62012-05-17 20:53:32 -07002833 }
2834 break;
2835 default:
2836 break;
2837 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002838}
2839
Gustavo Padovand6603662012-05-21 13:58:22 -03002840static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
2841 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002842{
Mat Martineau608bcc62012-05-17 20:53:32 -07002843 BT_DBG("chan %p, control %p, skbs %p, event %d, state %d",
2844 chan, control, skbs, event, chan->tx_state);
2845
2846 switch (chan->tx_state) {
2847 case L2CAP_TX_STATE_XMIT:
Gustavo Padovand6603662012-05-21 13:58:22 -03002848 l2cap_tx_state_xmit(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002849 break;
2850 case L2CAP_TX_STATE_WAIT_F:
Gustavo Padovand6603662012-05-21 13:58:22 -03002851 l2cap_tx_state_wait_f(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002852 break;
2853 default:
2854 /* Ignore event */
2855 break;
2856 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002857}
2858
Mat Martineau4b51dae92012-05-17 20:53:37 -07002859static void l2cap_pass_to_tx(struct l2cap_chan *chan,
2860 struct l2cap_ctrl *control)
2861{
2862 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002863 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_REQSEQ_AND_FBIT);
Mat Martineau4b51dae92012-05-17 20:53:37 -07002864}
2865
Mat Martineauf80842a2012-05-17 20:53:46 -07002866static void l2cap_pass_to_tx_fbit(struct l2cap_chan *chan,
2867 struct l2cap_ctrl *control)
2868{
2869 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002870 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_FBIT);
Mat Martineauf80842a2012-05-17 20:53:46 -07002871}
2872
Linus Torvalds1da177e2005-04-16 15:20:36 -07002873/* Copy frame to all raw sockets on that connection */
2874static void l2cap_raw_recv(struct l2cap_conn *conn, struct sk_buff *skb)
2875{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002876 struct sk_buff *nskb;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03002877 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002878
2879 BT_DBG("conn %p", conn);
2880
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002881 mutex_lock(&conn->chan_lock);
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002882
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002883 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002884 if (chan->chan_type != L2CAP_CHAN_RAW)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002885 continue;
2886
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002887 /* Don't send frame to the channel it came from */
2888 if (bt_cb(skb)->chan == chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002889 continue;
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002890
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002891 nskb = skb_clone(skb, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03002892 if (!nskb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002893 continue;
Gustavo Padovan80b98022012-05-27 22:27:51 -03002894 if (chan->ops->recv(chan, nskb))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002895 kfree_skb(nskb);
2896 }
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002897
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002898 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002899}
2900
2901/* ---- L2CAP signalling commands ---- */
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002902static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn, u8 code,
2903 u8 ident, u16 dlen, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002904{
2905 struct sk_buff *skb, **frag;
2906 struct l2cap_cmd_hdr *cmd;
2907 struct l2cap_hdr *lh;
2908 int len, count;
2909
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002910 BT_DBG("conn %p, code 0x%2.2x, ident 0x%2.2x, len %u",
2911 conn, code, ident, dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002912
Anderson Lizardo300b9622013-06-02 16:30:40 -04002913 if (conn->mtu < L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE)
2914 return NULL;
2915
Linus Torvalds1da177e2005-04-16 15:20:36 -07002916 len = L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE + dlen;
2917 count = min_t(unsigned int, conn->mtu, len);
2918
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002919 skb = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002920 if (!skb)
2921 return NULL;
2922
2923 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002924 lh->len = cpu_to_le16(L2CAP_CMD_HDR_SIZE + dlen);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002925
2926 if (conn->hcon->type == LE_LINK)
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002927 lh->cid = cpu_to_le16(L2CAP_CID_LE_SIGNALING);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002928 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002929 lh->cid = cpu_to_le16(L2CAP_CID_SIGNALING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002930
2931 cmd = (struct l2cap_cmd_hdr *) skb_put(skb, L2CAP_CMD_HDR_SIZE);
2932 cmd->code = code;
2933 cmd->ident = ident;
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002934 cmd->len = cpu_to_le16(dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002935
2936 if (dlen) {
2937 count -= L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE;
2938 memcpy(skb_put(skb, count), data, count);
2939 data += count;
2940 }
2941
2942 len -= skb->len;
2943
2944 /* Continuation fragments (no L2CAP header) */
2945 frag = &skb_shinfo(skb)->frag_list;
2946 while (len) {
2947 count = min_t(unsigned int, conn->mtu, len);
2948
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002949 *frag = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002950 if (!*frag)
2951 goto fail;
2952
2953 memcpy(skb_put(*frag, count), data, count);
2954
2955 len -= count;
2956 data += count;
2957
2958 frag = &(*frag)->next;
2959 }
2960
2961 return skb;
2962
2963fail:
2964 kfree_skb(skb);
2965 return NULL;
2966}
2967
Gustavo Padovan2d792812012-10-06 10:07:01 +01002968static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen,
2969 unsigned long *val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002970{
2971 struct l2cap_conf_opt *opt = *ptr;
2972 int len;
2973
2974 len = L2CAP_CONF_OPT_SIZE + opt->len;
2975 *ptr += len;
2976
2977 *type = opt->type;
2978 *olen = opt->len;
2979
2980 switch (opt->len) {
2981 case 1:
2982 *val = *((u8 *) opt->val);
2983 break;
2984
2985 case 2:
steven miaobfaaeb32010-10-16 18:29:47 -04002986 *val = get_unaligned_le16(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002987 break;
2988
2989 case 4:
steven miaobfaaeb32010-10-16 18:29:47 -04002990 *val = get_unaligned_le32(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002991 break;
2992
2993 default:
2994 *val = (unsigned long) opt->val;
2995 break;
2996 }
2997
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002998 BT_DBG("type 0x%2.2x len %u val 0x%lx", *type, opt->len, *val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002999 return len;
3000}
3001
Linus Torvalds1da177e2005-04-16 15:20:36 -07003002static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val)
3003{
3004 struct l2cap_conf_opt *opt = *ptr;
3005
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03003006 BT_DBG("type 0x%2.2x len %u val 0x%lx", type, len, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003007
3008 opt->type = type;
3009 opt->len = len;
3010
3011 switch (len) {
3012 case 1:
3013 *((u8 *) opt->val) = val;
3014 break;
3015
3016 case 2:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02003017 put_unaligned_le16(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003018 break;
3019
3020 case 4:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02003021 put_unaligned_le32(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003022 break;
3023
3024 default:
3025 memcpy(opt->val, (void *) val, len);
3026 break;
3027 }
3028
3029 *ptr += L2CAP_CONF_OPT_SIZE + len;
3030}
3031
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003032static void l2cap_add_opt_efs(void **ptr, struct l2cap_chan *chan)
3033{
3034 struct l2cap_conf_efs efs;
3035
Szymon Janc1ec918c2011-11-16 09:32:21 +01003036 switch (chan->mode) {
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003037 case L2CAP_MODE_ERTM:
3038 efs.id = chan->local_id;
3039 efs.stype = chan->local_stype;
3040 efs.msdu = cpu_to_le16(chan->local_msdu);
3041 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003042 efs.acc_lat = cpu_to_le32(L2CAP_DEFAULT_ACC_LAT);
3043 efs.flush_to = cpu_to_le32(L2CAP_EFS_DEFAULT_FLUSH_TO);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003044 break;
3045
3046 case L2CAP_MODE_STREAMING:
3047 efs.id = 1;
3048 efs.stype = L2CAP_SERV_BESTEFFORT;
3049 efs.msdu = cpu_to_le16(chan->local_msdu);
3050 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
3051 efs.acc_lat = 0;
3052 efs.flush_to = 0;
3053 break;
3054
3055 default:
3056 return;
3057 }
3058
3059 l2cap_add_conf_opt(ptr, L2CAP_CONF_EFS, sizeof(efs),
Andrei Emeltchenko8936fa62012-10-08 11:14:41 +03003060 (unsigned long) &efs);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003061}
3062
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003063static void l2cap_ack_timeout(struct work_struct *work)
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003064{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003065 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau03625202012-05-17 20:53:51 -07003066 ack_timer.work);
3067 u16 frames_to_ack;
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003068
Gustavo F. Padovan2fb9b3d2011-12-22 16:56:05 -02003069 BT_DBG("chan %p", chan);
3070
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003071 l2cap_chan_lock(chan);
3072
Mat Martineau03625202012-05-17 20:53:51 -07003073 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
3074 chan->last_acked_seq);
3075
3076 if (frames_to_ack)
3077 l2cap_send_rr_or_rnr(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003078
3079 l2cap_chan_unlock(chan);
Szymon Janc09bfb2e2012-01-11 10:59:49 +01003080 l2cap_chan_put(chan);
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003081}
3082
Andrei Emeltchenko466f8002012-05-29 13:59:01 +03003083int l2cap_ertm_init(struct l2cap_chan *chan)
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003084{
Mat Martineau3c588192012-04-11 10:48:42 -07003085 int err;
3086
Mat Martineau105bdf92012-04-27 16:50:48 -07003087 chan->next_tx_seq = 0;
3088 chan->expected_tx_seq = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003089 chan->expected_ack_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003090 chan->unacked_frames = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003091 chan->buffer_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003092 chan->frames_sent = 0;
Mat Martineau105bdf92012-04-27 16:50:48 -07003093 chan->last_acked_seq = 0;
3094 chan->sdu = NULL;
3095 chan->sdu_last_frag = NULL;
3096 chan->sdu_len = 0;
3097
Mat Martineaud34c34f2012-05-14 14:49:27 -07003098 skb_queue_head_init(&chan->tx_q);
3099
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003100 chan->local_amp_id = AMP_ID_BREDR;
3101 chan->move_id = AMP_ID_BREDR;
Mat Martineau08333282012-10-23 15:24:06 -07003102 chan->move_state = L2CAP_MOVE_STABLE;
3103 chan->move_role = L2CAP_MOVE_ROLE_NONE;
3104
Mat Martineau105bdf92012-04-27 16:50:48 -07003105 if (chan->mode != L2CAP_MODE_ERTM)
3106 return 0;
3107
3108 chan->rx_state = L2CAP_RX_STATE_RECV;
3109 chan->tx_state = L2CAP_TX_STATE_XMIT;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003110
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003111 INIT_DELAYED_WORK(&chan->retrans_timer, l2cap_retrans_timeout);
3112 INIT_DELAYED_WORK(&chan->monitor_timer, l2cap_monitor_timeout);
3113 INIT_DELAYED_WORK(&chan->ack_timer, l2cap_ack_timeout);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003114
Gustavo F. Padovanf1c67752011-03-25 20:36:10 -03003115 skb_queue_head_init(&chan->srej_q);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03003116
Mat Martineau3c588192012-04-11 10:48:42 -07003117 err = l2cap_seq_list_init(&chan->srej_list, chan->tx_win);
3118 if (err < 0)
3119 return err;
3120
Mat Martineau9dc9aff2012-05-17 16:20:14 -07003121 err = l2cap_seq_list_init(&chan->retrans_list, chan->remote_tx_win);
3122 if (err < 0)
3123 l2cap_seq_list_free(&chan->srej_list);
3124
3125 return err;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003126}
3127
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003128static inline __u8 l2cap_select_mode(__u8 mode, __u16 remote_feat_mask)
3129{
3130 switch (mode) {
3131 case L2CAP_MODE_STREAMING:
3132 case L2CAP_MODE_ERTM:
3133 if (l2cap_mode_supported(mode, remote_feat_mask))
3134 return mode;
3135 /* fall through */
3136 default:
3137 return L2CAP_MODE_BASIC;
3138 }
3139}
3140
Marcel Holtmann848566b2013-10-01 22:59:22 -07003141static inline bool __l2cap_ews_supported(struct l2cap_conn *conn)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003142{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003143 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003144}
3145
Marcel Holtmann848566b2013-10-01 22:59:22 -07003146static inline bool __l2cap_efs_supported(struct l2cap_conn *conn)
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003147{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003148 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_FLOW;
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003149}
3150
Mat Martineau36c86c82012-10-23 15:24:20 -07003151static void __l2cap_set_ertm_timeouts(struct l2cap_chan *chan,
3152 struct l2cap_conf_rfc *rfc)
3153{
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003154 if (chan->local_amp_id != AMP_ID_BREDR && chan->hs_hcon) {
Mat Martineau36c86c82012-10-23 15:24:20 -07003155 u64 ertm_to = chan->hs_hcon->hdev->amp_be_flush_to;
3156
3157 /* Class 1 devices have must have ERTM timeouts
3158 * exceeding the Link Supervision Timeout. The
3159 * default Link Supervision Timeout for AMP
3160 * controllers is 10 seconds.
3161 *
3162 * Class 1 devices use 0xffffffff for their
3163 * best-effort flush timeout, so the clamping logic
3164 * will result in a timeout that meets the above
3165 * requirement. ERTM timeouts are 16-bit values, so
3166 * the maximum timeout is 65.535 seconds.
3167 */
3168
3169 /* Convert timeout to milliseconds and round */
3170 ertm_to = DIV_ROUND_UP_ULL(ertm_to, 1000);
3171
3172 /* This is the recommended formula for class 2 devices
3173 * that start ERTM timers when packets are sent to the
3174 * controller.
3175 */
3176 ertm_to = 3 * ertm_to + 500;
3177
3178 if (ertm_to > 0xffff)
3179 ertm_to = 0xffff;
3180
3181 rfc->retrans_timeout = cpu_to_le16((u16) ertm_to);
3182 rfc->monitor_timeout = rfc->retrans_timeout;
3183 } else {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003184 rfc->retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO);
3185 rfc->monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO);
Mat Martineau36c86c82012-10-23 15:24:20 -07003186 }
3187}
3188
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003189static inline void l2cap_txwin_setup(struct l2cap_chan *chan)
3190{
3191 if (chan->tx_win > L2CAP_DEFAULT_TX_WINDOW &&
Marcel Holtmann848566b2013-10-01 22:59:22 -07003192 __l2cap_ews_supported(chan->conn)) {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003193 /* use extended control field */
3194 set_bit(FLAG_EXT_CTRL, &chan->flags);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003195 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
3196 } else {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003197 chan->tx_win = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003198 L2CAP_DEFAULT_TX_WINDOW);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003199 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
3200 }
Mat Martineauc20f8e32012-07-10 05:47:07 -07003201 chan->ack_win = chan->tx_win;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003202}
3203
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003204static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003205{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003206 struct l2cap_conf_req *req = data;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003207 struct l2cap_conf_rfc rfc = { .mode = chan->mode };
Linus Torvalds1da177e2005-04-16 15:20:36 -07003208 void *ptr = req->data;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003209 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003210
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03003211 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003212
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003213 if (chan->num_conf_req || chan->num_conf_rsp)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003214 goto done;
3215
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003216 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003217 case L2CAP_MODE_STREAMING:
3218 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003219 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state))
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003220 break;
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003221
Marcel Holtmann848566b2013-10-01 22:59:22 -07003222 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003223 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3224
Gustavo F. Padovan2ba13ed2010-06-09 16:39:05 -03003225 /* fall through */
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003226 default:
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003227 chan->mode = l2cap_select_mode(rfc.mode, chan->conn->feat_mask);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003228 break;
3229 }
3230
3231done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003232 if (chan->imtu != L2CAP_DEFAULT_MTU)
3233 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovan7990681c2011-01-24 16:01:43 -02003234
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003235 switch (chan->mode) {
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003236 case L2CAP_MODE_BASIC:
Marcel Holtmann6fea7ad2014-07-09 11:53:35 +02003237 if (disable_ertm)
3238 break;
3239
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003240 if (!(chan->conn->feat_mask & L2CAP_FEAT_ERTM) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003241 !(chan->conn->feat_mask & L2CAP_FEAT_STREAMING))
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003242 break;
3243
Gustavo F. Padovan62547752010-06-08 20:05:31 -03003244 rfc.mode = L2CAP_MODE_BASIC;
3245 rfc.txwin_size = 0;
3246 rfc.max_transmit = 0;
3247 rfc.retrans_timeout = 0;
3248 rfc.monitor_timeout = 0;
3249 rfc.max_pdu_size = 0;
3250
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003251 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003252 (unsigned long) &rfc);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003253 break;
3254
3255 case L2CAP_MODE_ERTM:
3256 rfc.mode = L2CAP_MODE_ERTM;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003257 rfc.max_transmit = chan->max_tx;
Mat Martineau36c86c82012-10-23 15:24:20 -07003258
3259 __l2cap_set_ertm_timeouts(chan, &rfc);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003260
3261 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003262 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3263 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003264 rfc.max_pdu_size = cpu_to_le16(size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003265
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003266 l2cap_txwin_setup(chan);
3267
3268 rfc.txwin_size = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003269 L2CAP_DEFAULT_TX_WINDOW);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003270
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003271 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003272 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003273
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003274 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3275 l2cap_add_opt_efs(&ptr, chan);
3276
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003277 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3278 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003279 chan->tx_win);
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003280
3281 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3282 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003283 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003284 chan->fcs = L2CAP_FCS_NONE;
3285 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3286 chan->fcs);
3287 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003288 break;
3289
3290 case L2CAP_MODE_STREAMING:
Mat Martineau273759e2012-05-17 20:53:53 -07003291 l2cap_txwin_setup(chan);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003292 rfc.mode = L2CAP_MODE_STREAMING;
3293 rfc.txwin_size = 0;
3294 rfc.max_transmit = 0;
3295 rfc.retrans_timeout = 0;
3296 rfc.monitor_timeout = 0;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003297
3298 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003299 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3300 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003301 rfc.max_pdu_size = cpu_to_le16(size);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003302
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003303 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003304 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003305
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003306 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3307 l2cap_add_opt_efs(&ptr, chan);
3308
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003309 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3310 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003311 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003312 chan->fcs = L2CAP_FCS_NONE;
3313 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3314 chan->fcs);
3315 }
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003316 break;
3317 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003318
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003319 req->dcid = cpu_to_le16(chan->dcid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003320 req->flags = cpu_to_le16(0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003321
3322 return ptr - data;
3323}
3324
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003325static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003326{
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003327 struct l2cap_conf_rsp *rsp = data;
3328 void *ptr = rsp->data;
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003329 void *req = chan->conf_req;
3330 int len = chan->conf_len;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003331 int type, hint, olen;
3332 unsigned long val;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003333 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003334 struct l2cap_conf_efs efs;
3335 u8 remote_efs = 0;
Marcel Holtmann861d6882007-10-20 13:37:06 +02003336 u16 mtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003337 u16 result = L2CAP_CONF_SUCCESS;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003338 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003339
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003340 BT_DBG("chan %p", chan);
Marcel Holtmann820ae1b2006-11-18 22:15:00 +01003341
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003342 while (len >= L2CAP_CONF_OPT_SIZE) {
3343 len -= l2cap_get_conf_opt(&req, &type, &olen, &val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003344
Gustavo F. Padovan589d2742009-04-20 01:31:07 -03003345 hint = type & L2CAP_CONF_HINT;
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07003346 type &= L2CAP_CONF_MASK;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003347
3348 switch (type) {
3349 case L2CAP_CONF_MTU:
Marcel Holtmann861d6882007-10-20 13:37:06 +02003350 mtu = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003351 break;
3352
3353 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003354 chan->flush_to = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003355 break;
3356
3357 case L2CAP_CONF_QOS:
3358 break;
3359
Marcel Holtmann6464f352007-10-20 13:39:51 +02003360 case L2CAP_CONF_RFC:
3361 if (olen == sizeof(rfc))
3362 memcpy(&rfc, (void *) val, olen);
3363 break;
3364
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003365 case L2CAP_CONF_FCS:
3366 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003367 set_bit(CONF_RECV_NO_FCS, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003368 break;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003369
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003370 case L2CAP_CONF_EFS:
3371 remote_efs = 1;
3372 if (olen == sizeof(efs))
3373 memcpy(&efs, (void *) val, olen);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003374 break;
3375
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003376 case L2CAP_CONF_EWS:
Marcel Holtmann848566b2013-10-01 22:59:22 -07003377 if (!chan->conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003378 return -ECONNREFUSED;
3379
3380 set_bit(FLAG_EXT_CTRL, &chan->flags);
3381 set_bit(CONF_EWS_RECV, &chan->conf_state);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003382 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003383 chan->remote_tx_win = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003384 break;
3385
3386 default:
3387 if (hint)
3388 break;
3389
3390 result = L2CAP_CONF_UNKNOWN;
3391 *((u8 *) ptr++) = type;
3392 break;
3393 }
3394 }
3395
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003396 if (chan->num_conf_rsp || chan->num_conf_req > 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003397 goto done;
3398
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003399 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003400 case L2CAP_MODE_STREAMING:
3401 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003402 if (!test_bit(CONF_STATE2_DEVICE, &chan->conf_state)) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003403 chan->mode = l2cap_select_mode(rfc.mode,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003404 chan->conn->feat_mask);
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003405 break;
3406 }
3407
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003408 if (remote_efs) {
Marcel Holtmann848566b2013-10-01 22:59:22 -07003409 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003410 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3411 else
3412 return -ECONNREFUSED;
3413 }
3414
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003415 if (chan->mode != rfc.mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003416 return -ECONNREFUSED;
Gustavo F. Padovan742e5192010-06-08 19:09:48 -03003417
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003418 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003419 }
3420
3421done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003422 if (chan->mode != rfc.mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003423 result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003424 rfc.mode = chan->mode;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003425
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003426 if (chan->num_conf_rsp == 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003427 return -ECONNREFUSED;
3428
Gustavo Padovan2d792812012-10-06 10:07:01 +01003429 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3430 (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003431 }
3432
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003433 if (result == L2CAP_CONF_SUCCESS) {
3434 /* Configure output options and let the other side know
3435 * which ones we don't like. */
3436
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003437 if (mtu < L2CAP_DEFAULT_MIN_MTU)
3438 result = L2CAP_CONF_UNACCEPT;
3439 else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003440 chan->omtu = mtu;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003441 set_bit(CONF_MTU_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003442 }
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003443 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->omtu);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003444
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003445 if (remote_efs) {
3446 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003447 efs.stype != L2CAP_SERV_NOTRAFIC &&
3448 efs.stype != chan->local_stype) {
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003449
3450 result = L2CAP_CONF_UNACCEPT;
3451
3452 if (chan->num_conf_req >= 1)
3453 return -ECONNREFUSED;
3454
3455 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003456 sizeof(efs),
3457 (unsigned long) &efs);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003458 } else {
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003459 /* Send PENDING Conf Rsp */
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003460 result = L2CAP_CONF_PENDING;
3461 set_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003462 }
3463 }
3464
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003465 switch (rfc.mode) {
3466 case L2CAP_MODE_BASIC:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003467 chan->fcs = L2CAP_FCS_NONE;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003468 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003469 break;
3470
3471 case L2CAP_MODE_ERTM:
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003472 if (!test_bit(CONF_EWS_RECV, &chan->conf_state))
3473 chan->remote_tx_win = rfc.txwin_size;
3474 else
3475 rfc.txwin_size = L2CAP_DEFAULT_TX_WINDOW;
3476
Gustavo F. Padovan2c03a7a2011-03-25 20:15:28 -03003477 chan->remote_max_tx = rfc.max_transmit;
Mat Martineau86b1b262010-08-05 15:54:22 -07003478
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003479 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003480 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3481 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003482 rfc.max_pdu_size = cpu_to_le16(size);
3483 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003484
Mat Martineau36c86c82012-10-23 15:24:20 -07003485 __l2cap_set_ertm_timeouts(chan, &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003486
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003487 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003488
3489 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003490 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003491
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003492 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3493 chan->remote_id = efs.id;
3494 chan->remote_stype = efs.stype;
3495 chan->remote_msdu = le16_to_cpu(efs.msdu);
3496 chan->remote_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003497 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003498 chan->remote_acc_lat =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003499 le32_to_cpu(efs.acc_lat);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003500 chan->remote_sdu_itime =
3501 le32_to_cpu(efs.sdu_itime);
3502 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003503 sizeof(efs),
3504 (unsigned long) &efs);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003505 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003506 break;
3507
3508 case L2CAP_MODE_STREAMING:
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003509 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003510 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3511 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003512 rfc.max_pdu_size = cpu_to_le16(size);
3513 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003514
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003515 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003516
Gustavo Padovan2d792812012-10-06 10:07:01 +01003517 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3518 (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003519
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003520 break;
3521
3522 default:
Marcel Holtmann6464f352007-10-20 13:39:51 +02003523 result = L2CAP_CONF_UNACCEPT;
3524
3525 memset(&rfc, 0, sizeof(rfc));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003526 rfc.mode = chan->mode;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003527 }
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003528
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003529 if (result == L2CAP_CONF_SUCCESS)
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003530 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003531 }
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003532 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003533 rsp->result = cpu_to_le16(result);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003534 rsp->flags = cpu_to_le16(0);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003535
3536 return ptr - data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003537}
3538
Gustavo Padovan2d792812012-10-06 10:07:01 +01003539static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len,
3540 void *data, u16 *result)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003541{
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003542 struct l2cap_conf_req *req = data;
3543 void *ptr = req->data;
3544 int type, olen;
3545 unsigned long val;
Mat Martineau36e999a2011-12-08 17:23:21 -08003546 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003547 struct l2cap_conf_efs efs;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003548
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003549 BT_DBG("chan %p, rsp %p, len %d, req %p", chan, rsp, len, data);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003550
3551 while (len >= L2CAP_CONF_OPT_SIZE) {
3552 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3553
3554 switch (type) {
3555 case L2CAP_CONF_MTU:
3556 if (val < L2CAP_DEFAULT_MIN_MTU) {
3557 *result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003558 chan->imtu = L2CAP_DEFAULT_MIN_MTU;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003559 } else
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003560 chan->imtu = val;
3561 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003562 break;
3563
3564 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003565 chan->flush_to = val;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003566 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003567 2, chan->flush_to);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003568 break;
3569
3570 case L2CAP_CONF_RFC:
3571 if (olen == sizeof(rfc))
3572 memcpy(&rfc, (void *)val, olen);
3573
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003574 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003575 rfc.mode != chan->mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003576 return -ECONNREFUSED;
3577
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003578 chan->fcs = 0;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003579
3580 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003581 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003582 break;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003583
3584 case L2CAP_CONF_EWS:
Mat Martineauc20f8e32012-07-10 05:47:07 -07003585 chan->ack_win = min_t(u16, val, chan->ack_win);
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003586 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Mat Martineauc20f8e32012-07-10 05:47:07 -07003587 chan->tx_win);
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003588 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003589
3590 case L2CAP_CONF_EFS:
3591 if (olen == sizeof(efs))
3592 memcpy(&efs, (void *)val, olen);
3593
3594 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003595 efs.stype != L2CAP_SERV_NOTRAFIC &&
3596 efs.stype != chan->local_stype)
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003597 return -ECONNREFUSED;
3598
Gustavo Padovan2d792812012-10-06 10:07:01 +01003599 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS, sizeof(efs),
3600 (unsigned long) &efs);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003601 break;
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003602
3603 case L2CAP_CONF_FCS:
3604 if (*result == L2CAP_CONF_PENDING)
3605 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003606 set_bit(CONF_RECV_NO_FCS,
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003607 &chan->conf_state);
3608 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003609 }
3610 }
3611
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003612 if (chan->mode == L2CAP_MODE_BASIC && chan->mode != rfc.mode)
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003613 return -ECONNREFUSED;
3614
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003615 chan->mode = rfc.mode;
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003616
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003617 if (*result == L2CAP_CONF_SUCCESS || *result == L2CAP_CONF_PENDING) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003618 switch (rfc.mode) {
3619 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003620 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3621 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
3622 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003623 if (!test_bit(FLAG_EXT_CTRL, &chan->flags))
3624 chan->ack_win = min_t(u16, chan->ack_win,
3625 rfc.txwin_size);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003626
3627 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3628 chan->local_msdu = le16_to_cpu(efs.msdu);
3629 chan->local_sdu_itime =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003630 le32_to_cpu(efs.sdu_itime);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003631 chan->local_acc_lat = le32_to_cpu(efs.acc_lat);
3632 chan->local_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003633 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003634 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003635 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003636
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003637 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003638 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003639 }
3640 }
3641
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003642 req->dcid = cpu_to_le16(chan->dcid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003643 req->flags = cpu_to_le16(0);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003644
3645 return ptr - data;
3646}
3647
Gustavo Padovan2d792812012-10-06 10:07:01 +01003648static int l2cap_build_conf_rsp(struct l2cap_chan *chan, void *data,
3649 u16 result, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003650{
3651 struct l2cap_conf_rsp *rsp = data;
3652 void *ptr = rsp->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003653
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003654 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003655
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003656 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003657 rsp->result = cpu_to_le16(result);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003658 rsp->flags = cpu_to_le16(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003659
3660 return ptr - data;
3661}
3662
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003663void __l2cap_le_connect_rsp_defer(struct l2cap_chan *chan)
3664{
3665 struct l2cap_le_conn_rsp rsp;
3666 struct l2cap_conn *conn = chan->conn;
3667
3668 BT_DBG("chan %p", chan);
3669
3670 rsp.dcid = cpu_to_le16(chan->scid);
3671 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02003672 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03003673 rsp.credits = cpu_to_le16(chan->rx_credits);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003674 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003675
3676 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp),
3677 &rsp);
3678}
3679
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003680void __l2cap_connect_rsp_defer(struct l2cap_chan *chan)
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003681{
3682 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003683 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003684 u8 buf[128];
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003685 u8 rsp_code;
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003686
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003687 rsp.scid = cpu_to_le16(chan->dcid);
3688 rsp.dcid = cpu_to_le16(chan->scid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003689 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
3690 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003691
3692 if (chan->hs_hcon)
3693 rsp_code = L2CAP_CREATE_CHAN_RSP;
3694 else
3695 rsp_code = L2CAP_CONN_RSP;
3696
3697 BT_DBG("chan %p rsp_code %u", chan, rsp_code);
3698
3699 l2cap_send_cmd(conn, chan->ident, rsp_code, sizeof(rsp), &rsp);
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003700
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003701 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003702 return;
3703
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003704 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003705 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003706 chan->num_conf_req++;
3707}
3708
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003709static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len)
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003710{
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003711 int type, olen;
3712 unsigned long val;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003713 /* Use sane default values in case a misbehaving remote device
3714 * did not send an RFC or extended window size option.
3715 */
3716 u16 txwin_ext = chan->ack_win;
3717 struct l2cap_conf_rfc rfc = {
3718 .mode = chan->mode,
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003719 .retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO),
3720 .monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO),
Mat Martineauc20f8e32012-07-10 05:47:07 -07003721 .max_pdu_size = cpu_to_le16(chan->imtu),
3722 .txwin_size = min_t(u16, chan->ack_win, L2CAP_DEFAULT_TX_WINDOW),
3723 };
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003724
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003725 BT_DBG("chan %p, rsp %p, len %d", chan, rsp, len);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003726
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003727 if ((chan->mode != L2CAP_MODE_ERTM) && (chan->mode != L2CAP_MODE_STREAMING))
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003728 return;
3729
3730 while (len >= L2CAP_CONF_OPT_SIZE) {
3731 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3732
Mat Martineauc20f8e32012-07-10 05:47:07 -07003733 switch (type) {
3734 case L2CAP_CONF_RFC:
3735 if (olen == sizeof(rfc))
3736 memcpy(&rfc, (void *)val, olen);
Szymon Janc8f321f82012-06-08 11:33:33 +02003737 break;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003738 case L2CAP_CONF_EWS:
3739 txwin_ext = val;
3740 break;
3741 }
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003742 }
3743
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003744 switch (rfc.mode) {
3745 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003746 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3747 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003748 chan->mps = le16_to_cpu(rfc.max_pdu_size);
3749 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3750 chan->ack_win = min_t(u16, chan->ack_win, txwin_ext);
3751 else
3752 chan->ack_win = min_t(u16, chan->ack_win,
3753 rfc.txwin_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003754 break;
3755 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003756 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003757 }
3758}
3759
Gustavo Padovan2d792812012-10-06 10:07:01 +01003760static inline int l2cap_command_rej(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003761 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3762 u8 *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003763{
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003764 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003765
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003766 if (cmd_len < sizeof(*rej))
3767 return -EPROTO;
3768
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003769 if (rej->reason != L2CAP_REJ_NOT_UNDERSTOOD)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003770 return 0;
3771
3772 if ((conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003773 cmd->ident == conn->info_ident) {
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02003774 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann984947d2009-02-06 23:35:19 +01003775
3776 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01003777 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01003778
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003779 l2cap_conn_start(conn);
3780 }
3781
3782 return 0;
3783}
3784
Mat Martineau17009152012-10-23 15:24:07 -07003785static struct l2cap_chan *l2cap_connect(struct l2cap_conn *conn,
3786 struct l2cap_cmd_hdr *cmd,
3787 u8 *data, u8 rsp_code, u8 amp_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003788{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003789 struct l2cap_conn_req *req = (struct l2cap_conn_req *) data;
3790 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003791 struct l2cap_chan *chan = NULL, *pchan;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003792 int result, status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003793
3794 u16 dcid = 0, scid = __le16_to_cpu(req->scid);
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003795 __le16 psm = req->psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003796
Andrei Emeltchenko097db762012-03-09 14:16:17 +02003797 BT_DBG("psm 0x%2.2x scid 0x%4.4x", __le16_to_cpu(psm), scid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003798
3799 /* Check if we have socket listening on psm */
Marcel Holtmann6f59b902013-10-13 05:24:01 -07003800 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03003801 &conn->hcon->dst, ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003802 if (!pchan) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003803 result = L2CAP_CR_BAD_PSM;
3804 goto sendresp;
3805 }
3806
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003807 mutex_lock(&conn->chan_lock);
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003808 l2cap_chan_lock(pchan);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00003809
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003810 /* Check if the ACL is secure enough (if not SDP) */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003811 if (psm != cpu_to_le16(L2CAP_PSM_SDP) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003812 !hci_conn_check_link_mode(conn->hcon)) {
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02003813 conn->disc_reason = HCI_ERROR_AUTH_FAILURE;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003814 result = L2CAP_CR_SEC_BLOCK;
3815 goto response;
3816 }
3817
Linus Torvalds1da177e2005-04-16 15:20:36 -07003818 result = L2CAP_CR_NO_MEM;
3819
Gustavo Padovan2dfa1002012-05-27 22:27:58 -03003820 /* Check if we already have channel with that dcid */
3821 if (__l2cap_get_chan_by_dcid(conn, scid))
3822 goto response;
3823
Gustavo Padovan80b98022012-05-27 22:27:51 -03003824 chan = pchan->ops->new_connection(pchan);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03003825 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003826 goto response;
3827
Syam Sidhardhan330b6c12013-08-06 01:59:12 +09003828 /* For certain devices (ex: HID mouse), support for authentication,
3829 * pairing and bonding is optional. For such devices, inorder to avoid
3830 * the ACL alive for too long after L2CAP disconnection, reset the ACL
3831 * disc_timeout back to HCI_DISCONN_TIMEOUT during L2CAP connect.
3832 */
3833 conn->hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
3834
Marcel Holtmann7eafc592013-10-13 08:12:47 -07003835 bacpy(&chan->src, &conn->hcon->src);
3836 bacpy(&chan->dst, &conn->hcon->dst);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -07003837 chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type);
3838 chan->dst_type = bdaddr_type(conn->hcon, conn->hcon->dst_type);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003839 chan->psm = psm;
3840 chan->dcid = scid;
Mat Martineau17009152012-10-23 15:24:07 -07003841 chan->local_amp_id = amp_id;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003842
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003843 __l2cap_chan_add(conn, chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003844
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003845 dcid = chan->scid;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003846
Gustavo Padovan8d836d72013-10-15 19:24:47 -03003847 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003848
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003849 chan->ident = cmd->ident;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003850
Marcel Holtmann984947d2009-02-06 23:35:19 +01003851 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) {
Gustavo F. Padovand45fc422011-11-05 19:54:24 -02003852 if (l2cap_chan_check_security(chan)) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07003853 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003854 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003855 result = L2CAP_CR_PEND;
3856 status = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08003857 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003858 } else {
Mat Martineau17009152012-10-23 15:24:07 -07003859 /* Force pending result for AMP controllers.
3860 * The connection will succeed after the
3861 * physical link is up.
3862 */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003863 if (amp_id == AMP_ID_BREDR) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003864 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau17009152012-10-23 15:24:07 -07003865 result = L2CAP_CR_SUCCESS;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003866 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003867 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003868 result = L2CAP_CR_PEND;
Mat Martineau17009152012-10-23 15:24:07 -07003869 }
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003870 status = L2CAP_CS_NO_INFO;
3871 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003872 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003873 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003874 result = L2CAP_CR_PEND;
3875 status = L2CAP_CS_AUTHEN_PEND;
3876 }
3877 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003878 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003879 result = L2CAP_CR_PEND;
3880 status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003881 }
3882
Linus Torvalds1da177e2005-04-16 15:20:36 -07003883response:
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003884 l2cap_chan_unlock(pchan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003885 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003886
3887sendresp:
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003888 rsp.scid = cpu_to_le16(scid);
3889 rsp.dcid = cpu_to_le16(dcid);
3890 rsp.result = cpu_to_le16(result);
3891 rsp.status = cpu_to_le16(status);
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003892 l2cap_send_cmd(conn, cmd->ident, rsp_code, sizeof(rsp), &rsp);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003893
3894 if (result == L2CAP_CR_PEND && status == L2CAP_CS_NO_INFO) {
3895 struct l2cap_info_req info;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003896 info.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003897
3898 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
3899 conn->info_ident = l2cap_get_ident(conn);
3900
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08003901 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003902
Gustavo Padovan2d792812012-10-06 10:07:01 +01003903 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
3904 sizeof(info), &info);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003905 }
3906
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003907 if (chan && !test_bit(CONF_REQ_SENT, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003908 result == L2CAP_CR_SUCCESS) {
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003909 u8 buf[128];
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003910 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003911 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003912 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003913 chan->num_conf_req++;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003914 }
Mat Martineau17009152012-10-23 15:24:07 -07003915
3916 return chan;
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003917}
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003918
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003919static int l2cap_connect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003920 struct l2cap_cmd_hdr *cmd, u16 cmd_len, u8 *data)
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003921{
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303922 struct hci_dev *hdev = conn->hcon->hdev;
3923 struct hci_conn *hcon = conn->hcon;
3924
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003925 if (cmd_len < sizeof(struct l2cap_conn_req))
3926 return -EPROTO;
3927
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303928 hci_dev_lock(hdev);
3929 if (test_bit(HCI_MGMT, &hdev->dev_flags) &&
3930 !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &hcon->flags))
3931 mgmt_device_connected(hdev, &hcon->dst, hcon->type,
3932 hcon->dst_type, 0, NULL, 0,
3933 hcon->dev_class);
3934 hci_dev_unlock(hdev);
3935
Gustavo Padovan300229f2012-10-12 19:40:40 +08003936 l2cap_connect(conn, cmd, data, L2CAP_CONN_RSP, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003937 return 0;
3938}
3939
Mat Martineau5909cf32012-10-23 15:24:08 -07003940static int l2cap_connect_create_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003941 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3942 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003943{
3944 struct l2cap_conn_rsp *rsp = (struct l2cap_conn_rsp *) data;
3945 u16 scid, dcid, result, status;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003946 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003947 u8 req[128];
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003948 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003949
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003950 if (cmd_len < sizeof(*rsp))
3951 return -EPROTO;
3952
Linus Torvalds1da177e2005-04-16 15:20:36 -07003953 scid = __le16_to_cpu(rsp->scid);
3954 dcid = __le16_to_cpu(rsp->dcid);
3955 result = __le16_to_cpu(rsp->result);
3956 status = __le16_to_cpu(rsp->status);
3957
Andrei Emeltchenko1b009c92012-02-21 12:54:54 +02003958 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 +01003959 dcid, scid, result, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003960
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003961 mutex_lock(&conn->chan_lock);
3962
Linus Torvalds1da177e2005-04-16 15:20:36 -07003963 if (scid) {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003964 chan = __l2cap_get_chan_by_scid(conn, scid);
3965 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003966 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003967 goto unlock;
3968 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003969 } else {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003970 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
3971 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003972 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003973 goto unlock;
3974 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003975 }
3976
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003977 err = 0;
3978
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003979 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003980
Linus Torvalds1da177e2005-04-16 15:20:36 -07003981 switch (result) {
3982 case L2CAP_CR_SUCCESS:
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03003983 l2cap_state_change(chan, BT_CONFIG);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003984 chan->ident = 0;
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003985 chan->dcid = dcid;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003986 clear_bit(CONF_CONNECT_PEND, &chan->conf_state);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01003987
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003988 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003989 break;
3990
Linus Torvalds1da177e2005-04-16 15:20:36 -07003991 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003992 l2cap_build_conf_req(chan, req), req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003993 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003994 break;
3995
3996 case L2CAP_CR_PEND:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003997 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003998 break;
3999
4000 default:
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004001 l2cap_chan_del(chan, ECONNREFUSED);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004002 break;
4003 }
4004
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004005 l2cap_chan_unlock(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004006
4007unlock:
4008 mutex_unlock(&conn->chan_lock);
4009
4010 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004011}
4012
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004013static inline void set_default_fcs(struct l2cap_chan *chan)
Mat Martineau8c462b62010-08-24 15:35:42 -07004014{
4015 /* FCS is enabled only in ERTM or streaming mode, if one or both
4016 * sides request it.
4017 */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03004018 if (chan->mode != L2CAP_MODE_ERTM && chan->mode != L2CAP_MODE_STREAMING)
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004019 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02004020 else if (!test_bit(CONF_RECV_NO_FCS, &chan->conf_state))
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004021 chan->fcs = L2CAP_FCS_CRC16;
Mat Martineau8c462b62010-08-24 15:35:42 -07004022}
4023
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03004024static void l2cap_send_efs_conf_rsp(struct l2cap_chan *chan, void *data,
4025 u8 ident, u16 flags)
4026{
4027 struct l2cap_conn *conn = chan->conn;
4028
4029 BT_DBG("conn %p chan %p ident %d flags 0x%4.4x", conn, chan, ident,
4030 flags);
4031
4032 clear_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
4033 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
4034
4035 l2cap_send_cmd(conn, ident, L2CAP_CONF_RSP,
4036 l2cap_build_conf_rsp(chan, data,
4037 L2CAP_CONF_SUCCESS, flags), data);
4038}
4039
Johan Hedberg662d6522013-10-16 11:20:47 +03004040static void cmd_reject_invalid_cid(struct l2cap_conn *conn, u8 ident,
4041 u16 scid, u16 dcid)
4042{
4043 struct l2cap_cmd_rej_cid rej;
4044
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004045 rej.reason = cpu_to_le16(L2CAP_REJ_INVALID_CID);
Johan Hedberg662d6522013-10-16 11:20:47 +03004046 rej.scid = __cpu_to_le16(scid);
4047 rej.dcid = __cpu_to_le16(dcid);
4048
4049 l2cap_send_cmd(conn, ident, L2CAP_COMMAND_REJ, sizeof(rej), &rej);
4050}
4051
Gustavo Padovan2d792812012-10-06 10:07:01 +01004052static inline int l2cap_config_req(struct l2cap_conn *conn,
4053 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4054 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004055{
4056 struct l2cap_conf_req *req = (struct l2cap_conf_req *) data;
4057 u16 dcid, flags;
4058 u8 rsp[64];
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004059 struct l2cap_chan *chan;
Mat Martineau3c588192012-04-11 10:48:42 -07004060 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004061
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004062 if (cmd_len < sizeof(*req))
4063 return -EPROTO;
4064
Linus Torvalds1da177e2005-04-16 15:20:36 -07004065 dcid = __le16_to_cpu(req->dcid);
4066 flags = __le16_to_cpu(req->flags);
4067
4068 BT_DBG("dcid 0x%4.4x flags 0x%2.2x", dcid, flags);
4069
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004070 chan = l2cap_get_chan_by_scid(conn, dcid);
Johan Hedberg662d6522013-10-16 11:20:47 +03004071 if (!chan) {
4072 cmd_reject_invalid_cid(conn, cmd->ident, dcid, 0);
4073 return 0;
4074 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004075
David S. Miller033b1142011-07-21 13:38:42 -07004076 if (chan->state != BT_CONFIG && chan->state != BT_CONNECT2) {
Johan Hedberg662d6522013-10-16 11:20:47 +03004077 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4078 chan->dcid);
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004079 goto unlock;
Gustavo F. Padovandf6bd742010-06-14 02:26:15 -03004080 }
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004081
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004082 /* Reject if config buffer is too small. */
Al Viro88219a02007-07-29 00:17:25 -07004083 len = cmd_len - sizeof(*req);
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004084 if (chan->conf_len + len > sizeof(chan->conf_req)) {
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004085 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004086 l2cap_build_conf_rsp(chan, rsp,
4087 L2CAP_CONF_REJECT, flags), rsp);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004088 goto unlock;
4089 }
4090
4091 /* Store config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004092 memcpy(chan->conf_req + chan->conf_len, req->data, len);
4093 chan->conf_len += len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004094
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004095 if (flags & L2CAP_CONF_FLAG_CONTINUATION) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004096 /* Incomplete config. Send empty response. */
4097 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004098 l2cap_build_conf_rsp(chan, rsp,
4099 L2CAP_CONF_SUCCESS, flags), rsp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004100 goto unlock;
4101 }
4102
4103 /* Complete config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004104 len = l2cap_parse_conf_req(chan, rsp);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004105 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004106 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004107 goto unlock;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004108 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004109
Mat Martineau1500109b2012-10-23 15:24:15 -07004110 chan->ident = cmd->ident;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004111 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004112 chan->num_conf_rsp++;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004113
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004114 /* Reset config buffer. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004115 chan->conf_len = 0;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004116
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004117 if (!test_bit(CONF_OUTPUT_DONE, &chan->conf_state))
Marcel Holtmann876d9482007-10-20 13:35:42 +02004118 goto unlock;
4119
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004120 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004121 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004122
Mat Martineau105bdf92012-04-27 16:50:48 -07004123 if (chan->mode == L2CAP_MODE_ERTM ||
4124 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004125 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004126
Mat Martineau3c588192012-04-11 10:48:42 -07004127 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004128 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004129 else
4130 l2cap_chan_ready(chan);
4131
Marcel Holtmann876d9482007-10-20 13:35:42 +02004132 goto unlock;
4133 }
4134
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004135 if (!test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02004136 u8 buf[64];
Linus Torvalds1da177e2005-04-16 15:20:36 -07004137 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004138 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004139 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004140 }
4141
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004142 /* Got Conf Rsp PENDING from remote side and asume we sent
4143 Conf Rsp PENDING in the code above */
4144 if (test_bit(CONF_REM_CONF_PEND, &chan->conf_state) &&
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03004145 test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004146
4147 /* check compatibility */
4148
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004149 /* Send rsp for BR/EDR channel */
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004150 if (!chan->hs_hcon)
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004151 l2cap_send_efs_conf_rsp(chan, rsp, cmd->ident, flags);
4152 else
4153 chan->ident = cmd->ident;
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004154 }
4155
Linus Torvalds1da177e2005-04-16 15:20:36 -07004156unlock:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004157 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004158 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004159}
4160
Gustavo Padovan2d792812012-10-06 10:07:01 +01004161static inline int l2cap_config_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004162 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4163 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004164{
4165 struct l2cap_conf_rsp *rsp = (struct l2cap_conf_rsp *)data;
4166 u16 scid, flags, result;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004167 struct l2cap_chan *chan;
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004168 int len = cmd_len - sizeof(*rsp);
Mat Martineau3c588192012-04-11 10:48:42 -07004169 int err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004170
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004171 if (cmd_len < sizeof(*rsp))
4172 return -EPROTO;
4173
Linus Torvalds1da177e2005-04-16 15:20:36 -07004174 scid = __le16_to_cpu(rsp->scid);
4175 flags = __le16_to_cpu(rsp->flags);
4176 result = __le16_to_cpu(rsp->result);
4177
Andrei Emeltchenko61386cb2012-03-12 12:13:07 +02004178 BT_DBG("scid 0x%4.4x flags 0x%2.2x result 0x%2.2x len %d", scid, flags,
4179 result, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004180
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004181 chan = l2cap_get_chan_by_scid(conn, scid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004182 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004183 return 0;
4184
4185 switch (result) {
4186 case L2CAP_CONF_SUCCESS:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004187 l2cap_conf_rfc_get(chan, rsp->data, len);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004188 clear_bit(CONF_REM_CONF_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004189 break;
4190
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004191 case L2CAP_CONF_PENDING:
4192 set_bit(CONF_REM_CONF_PEND, &chan->conf_state);
4193
4194 if (test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
4195 char buf[64];
4196
4197 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004198 buf, &result);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004199 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004200 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004201 goto done;
4202 }
4203
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004204 if (!chan->hs_hcon) {
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004205 l2cap_send_efs_conf_rsp(chan, buf, cmd->ident,
4206 0);
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02004207 } else {
4208 if (l2cap_check_efs(chan)) {
4209 amp_create_logical_link(chan);
4210 chan->ident = cmd->ident;
4211 }
4212 }
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004213 }
4214 goto done;
4215
Linus Torvalds1da177e2005-04-16 15:20:36 -07004216 case L2CAP_CONF_UNACCEPT:
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004217 if (chan->num_conf_rsp <= L2CAP_CONF_MAX_CONF_RSP) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004218 char req[64];
4219
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004220 if (len > sizeof(req) - sizeof(struct l2cap_conf_req)) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004221 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004222 goto done;
4223 }
4224
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004225 /* throw out any old stored conf requests */
4226 result = L2CAP_CONF_SUCCESS;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03004227 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004228 req, &result);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004229 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004230 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004231 goto done;
4232 }
4233
4234 l2cap_send_cmd(conn, l2cap_get_ident(conn),
Gustavo Padovan2d792812012-10-06 10:07:01 +01004235 L2CAP_CONF_REQ, len, req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004236 chan->num_conf_req++;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004237 if (result != L2CAP_CONF_SUCCESS)
4238 goto done;
4239 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004240 }
4241
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09004242 default:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004243 l2cap_chan_set_err(chan, ECONNRESET);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +02004244
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08004245 __set_chan_timer(chan, L2CAP_DISC_REJ_TIMEOUT);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004246 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004247 goto done;
4248 }
4249
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004250 if (flags & L2CAP_CONF_FLAG_CONTINUATION)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004251 goto done;
4252
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004253 set_bit(CONF_INPUT_DONE, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004254
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004255 if (test_bit(CONF_OUTPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004256 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004257
Mat Martineau105bdf92012-04-27 16:50:48 -07004258 if (chan->mode == L2CAP_MODE_ERTM ||
4259 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004260 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004261
Mat Martineau3c588192012-04-11 10:48:42 -07004262 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004263 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004264 else
4265 l2cap_chan_ready(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004266 }
4267
4268done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004269 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004270 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004271}
4272
Gustavo Padovan2d792812012-10-06 10:07:01 +01004273static inline int l2cap_disconnect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004274 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4275 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004276{
4277 struct l2cap_disconn_req *req = (struct l2cap_disconn_req *) data;
4278 struct l2cap_disconn_rsp rsp;
4279 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004280 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004281
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004282 if (cmd_len != sizeof(*req))
4283 return -EPROTO;
4284
Linus Torvalds1da177e2005-04-16 15:20:36 -07004285 scid = __le16_to_cpu(req->scid);
4286 dcid = __le16_to_cpu(req->dcid);
4287
4288 BT_DBG("scid 0x%4.4x dcid 0x%4.4x", scid, dcid);
4289
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004290 mutex_lock(&conn->chan_lock);
4291
4292 chan = __l2cap_get_chan_by_scid(conn, dcid);
4293 if (!chan) {
4294 mutex_unlock(&conn->chan_lock);
Johan Hedberg662d6522013-10-16 11:20:47 +03004295 cmd_reject_invalid_cid(conn, cmd->ident, dcid, scid);
4296 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004297 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004298
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004299 l2cap_chan_lock(chan);
4300
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03004301 rsp.dcid = cpu_to_le16(chan->scid);
4302 rsp.scid = cpu_to_le16(chan->dcid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004303 l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp);
4304
Gustavo Padovan5ec1bbe2013-10-15 19:24:48 -03004305 chan->ops->set_shutdown(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004306
Mat Martineau61d6ef32012-04-27 16:50:50 -07004307 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004308 l2cap_chan_del(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004309
4310 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004311
Gustavo Padovan80b98022012-05-27 22:27:51 -03004312 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004313 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004314
4315 mutex_unlock(&conn->chan_lock);
4316
Linus Torvalds1da177e2005-04-16 15:20:36 -07004317 return 0;
4318}
4319
Gustavo Padovan2d792812012-10-06 10:07:01 +01004320static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004321 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4322 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004323{
4324 struct l2cap_disconn_rsp *rsp = (struct l2cap_disconn_rsp *) data;
4325 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004326 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004327
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004328 if (cmd_len != sizeof(*rsp))
4329 return -EPROTO;
4330
Linus Torvalds1da177e2005-04-16 15:20:36 -07004331 scid = __le16_to_cpu(rsp->scid);
4332 dcid = __le16_to_cpu(rsp->dcid);
4333
4334 BT_DBG("dcid 0x%4.4x scid 0x%4.4x", dcid, scid);
4335
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004336 mutex_lock(&conn->chan_lock);
4337
4338 chan = __l2cap_get_chan_by_scid(conn, scid);
4339 if (!chan) {
4340 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004341 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004342 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004343
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004344 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004345
Mat Martineau61d6ef32012-04-27 16:50:50 -07004346 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004347 l2cap_chan_del(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004348
4349 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004350
Gustavo Padovan80b98022012-05-27 22:27:51 -03004351 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004352 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004353
4354 mutex_unlock(&conn->chan_lock);
4355
Linus Torvalds1da177e2005-04-16 15:20:36 -07004356 return 0;
4357}
4358
Gustavo Padovan2d792812012-10-06 10:07:01 +01004359static inline int l2cap_information_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004360 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4361 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004362{
4363 struct l2cap_info_req *req = (struct l2cap_info_req *) data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004364 u16 type;
4365
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004366 if (cmd_len != sizeof(*req))
4367 return -EPROTO;
4368
Linus Torvalds1da177e2005-04-16 15:20:36 -07004369 type = __le16_to_cpu(req->type);
4370
4371 BT_DBG("type 0x%4.4x", type);
4372
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004373 if (type == L2CAP_IT_FEAT_MASK) {
4374 u8 buf[8];
Marcel Holtmann44dd46d2009-05-02 19:09:01 -07004375 u32 feat_mask = l2cap_feat_mask;
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004376 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004377 rsp->type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
4378 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03004379 if (!disable_ertm)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004380 feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING
Gustavo Padovan2d792812012-10-06 10:07:01 +01004381 | L2CAP_FEAT_FCS;
Marcel Holtmann848566b2013-10-01 22:59:22 -07004382 if (conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03004383 feat_mask |= L2CAP_FEAT_EXT_FLOW
Gustavo Padovan2d792812012-10-06 10:07:01 +01004384 | L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenkoa5fd6f32011-09-16 16:26:32 +03004385
Gustavo F. Padovan1b7bf4e2009-08-24 00:45:20 -03004386 put_unaligned_le32(feat_mask, rsp->data);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004387 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4388 buf);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004389 } else if (type == L2CAP_IT_FIXED_CHAN) {
4390 u8 buf[12];
4391 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Mat Martineau50a147c2011-11-02 16:18:34 -07004392
Marcel Holtmann848566b2013-10-01 22:59:22 -07004393 if (conn->hs_enabled)
Mat Martineau50a147c2011-11-02 16:18:34 -07004394 l2cap_fixed_chan[0] |= L2CAP_FC_A2MP;
4395 else
4396 l2cap_fixed_chan[0] &= ~L2CAP_FC_A2MP;
4397
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004398 rsp->type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
4399 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Andrei Emeltchenkoc6337ea2011-10-20 17:02:44 +03004400 memcpy(rsp->data, l2cap_fixed_chan, sizeof(l2cap_fixed_chan));
Gustavo Padovan2d792812012-10-06 10:07:01 +01004401 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4402 buf);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004403 } else {
4404 struct l2cap_info_rsp rsp;
4405 rsp.type = cpu_to_le16(type);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004406 rsp.result = cpu_to_le16(L2CAP_IR_NOTSUPP);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004407 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(rsp),
4408 &rsp);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004409 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004410
4411 return 0;
4412}
4413
Gustavo Padovan2d792812012-10-06 10:07:01 +01004414static inline int l2cap_information_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004415 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4416 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004417{
4418 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) data;
4419 u16 type, result;
4420
Jaganath Kanakkassery3f6fa3d2013-06-21 19:55:11 +05304421 if (cmd_len < sizeof(*rsp))
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004422 return -EPROTO;
4423
Linus Torvalds1da177e2005-04-16 15:20:36 -07004424 type = __le16_to_cpu(rsp->type);
4425 result = __le16_to_cpu(rsp->result);
4426
4427 BT_DBG("type 0x%4.4x result 0x%2.2x", type, result);
4428
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004429 /* L2CAP Info req/rsp are unbound to channels, add extra checks */
4430 if (cmd->ident != conn->info_ident ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01004431 conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004432 return 0;
4433
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02004434 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004435
Ville Tervoadb08ed2010-08-04 09:43:33 +03004436 if (result != L2CAP_IR_SUCCESS) {
4437 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4438 conn->info_ident = 0;
4439
4440 l2cap_conn_start(conn);
4441
4442 return 0;
4443 }
4444
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004445 switch (type) {
4446 case L2CAP_IT_FEAT_MASK:
Harvey Harrison83985312008-05-02 16:25:46 -07004447 conn->feat_mask = get_unaligned_le32(rsp->data);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004448
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07004449 if (conn->feat_mask & L2CAP_FEAT_FIXED_CHAN) {
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004450 struct l2cap_info_req req;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004451 req.type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004452
4453 conn->info_ident = l2cap_get_ident(conn);
4454
4455 l2cap_send_cmd(conn, conn->info_ident,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004456 L2CAP_INFO_REQ, sizeof(req), &req);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004457 } else {
4458 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4459 conn->info_ident = 0;
4460
4461 l2cap_conn_start(conn);
4462 }
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004463 break;
4464
4465 case L2CAP_IT_FIXED_CHAN:
4466 conn->fixed_chan_mask = rsp->data[0];
Marcel Holtmann984947d2009-02-06 23:35:19 +01004467 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004468 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004469
4470 l2cap_conn_start(conn);
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004471 break;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004472 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004473
Linus Torvalds1da177e2005-04-16 15:20:36 -07004474 return 0;
4475}
4476
Mat Martineau17009152012-10-23 15:24:07 -07004477static int l2cap_create_channel_req(struct l2cap_conn *conn,
4478 struct l2cap_cmd_hdr *cmd,
4479 u16 cmd_len, void *data)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004480{
4481 struct l2cap_create_chan_req *req = data;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004482 struct l2cap_create_chan_rsp rsp;
Mat Martineau17009152012-10-23 15:24:07 -07004483 struct l2cap_chan *chan;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004484 struct hci_dev *hdev;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004485 u16 psm, scid;
4486
4487 if (cmd_len != sizeof(*req))
4488 return -EPROTO;
4489
Marcel Holtmann848566b2013-10-01 22:59:22 -07004490 if (!conn->hs_enabled)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004491 return -EINVAL;
4492
4493 psm = le16_to_cpu(req->psm);
4494 scid = le16_to_cpu(req->scid);
4495
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004496 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 -07004497
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004498 /* For controller id 0 make BR/EDR connection */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004499 if (req->amp_id == AMP_ID_BREDR) {
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004500 l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4501 req->amp_id);
4502 return 0;
4503 }
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004504
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004505 /* Validate AMP controller id */
4506 hdev = hci_dev_get(req->amp_id);
4507 if (!hdev)
4508 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004509
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004510 if (hdev->dev_type != HCI_AMP || !test_bit(HCI_UP, &hdev->flags)) {
Mat Martineau17009152012-10-23 15:24:07 -07004511 hci_dev_put(hdev);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004512 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004513 }
4514
4515 chan = l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4516 req->amp_id);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004517 if (chan) {
4518 struct amp_mgr *mgr = conn->hcon->amp_mgr;
4519 struct hci_conn *hs_hcon;
4520
Marcel Holtmann98e0f7e2013-10-13 02:23:40 -07004521 hs_hcon = hci_conn_hash_lookup_ba(hdev, AMP_LINK,
4522 &conn->hcon->dst);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004523 if (!hs_hcon) {
4524 hci_dev_put(hdev);
Johan Hedberg662d6522013-10-16 11:20:47 +03004525 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4526 chan->dcid);
4527 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004528 }
4529
4530 BT_DBG("mgr %p bredr_chan %p hs_hcon %p", mgr, chan, hs_hcon);
4531
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004532 mgr->bredr_chan = chan;
4533 chan->hs_hcon = hs_hcon;
Andrei Emeltchenkofd45bf42012-11-20 17:16:22 +02004534 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004535 conn->mtu = hdev->block_mtu;
4536 }
4537
4538 hci_dev_put(hdev);
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004539
4540 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004541
4542error:
4543 rsp.dcid = 0;
4544 rsp.scid = cpu_to_le16(scid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004545 rsp.result = cpu_to_le16(L2CAP_CR_BAD_AMP);
4546 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004547
4548 l2cap_send_cmd(conn, cmd->ident, L2CAP_CREATE_CHAN_RSP,
4549 sizeof(rsp), &rsp);
4550
Johan Hedbergdc280802013-09-16 13:05:13 +03004551 return 0;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004552}
4553
Mat Martineau8eb200b2012-10-23 15:24:17 -07004554static void l2cap_send_move_chan_req(struct l2cap_chan *chan, u8 dest_amp_id)
4555{
4556 struct l2cap_move_chan_req req;
4557 u8 ident;
4558
4559 BT_DBG("chan %p, dest_amp_id %d", chan, dest_amp_id);
4560
4561 ident = l2cap_get_ident(chan->conn);
4562 chan->ident = ident;
4563
4564 req.icid = cpu_to_le16(chan->scid);
4565 req.dest_amp_id = dest_amp_id;
4566
4567 l2cap_send_cmd(chan->conn, ident, L2CAP_MOVE_CHAN_REQ, sizeof(req),
4568 &req);
4569
4570 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4571}
4572
Mat Martineau1500109b2012-10-23 15:24:15 -07004573static void l2cap_send_move_chan_rsp(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004574{
4575 struct l2cap_move_chan_rsp rsp;
4576
Mat Martineau1500109b2012-10-23 15:24:15 -07004577 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004578
Mat Martineau1500109b2012-10-23 15:24:15 -07004579 rsp.icid = cpu_to_le16(chan->dcid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004580 rsp.result = cpu_to_le16(result);
4581
Mat Martineau1500109b2012-10-23 15:24:15 -07004582 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_RSP,
4583 sizeof(rsp), &rsp);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004584}
4585
Mat Martineau5b155ef2012-10-23 15:24:14 -07004586static void l2cap_send_move_chan_cfm(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004587{
4588 struct l2cap_move_chan_cfm cfm;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004589
Mat Martineau5b155ef2012-10-23 15:24:14 -07004590 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004591
Mat Martineau5b155ef2012-10-23 15:24:14 -07004592 chan->ident = l2cap_get_ident(chan->conn);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004593
Mat Martineau5b155ef2012-10-23 15:24:14 -07004594 cfm.icid = cpu_to_le16(chan->scid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004595 cfm.result = cpu_to_le16(result);
4596
Mat Martineau5b155ef2012-10-23 15:24:14 -07004597 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_CFM,
4598 sizeof(cfm), &cfm);
4599
4600 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4601}
4602
4603static void l2cap_send_move_chan_cfm_icid(struct l2cap_conn *conn, u16 icid)
4604{
4605 struct l2cap_move_chan_cfm cfm;
4606
4607 BT_DBG("conn %p, icid 0x%4.4x", conn, icid);
4608
4609 cfm.icid = cpu_to_le16(icid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004610 cfm.result = cpu_to_le16(L2CAP_MC_UNCONFIRMED);
Mat Martineau5b155ef2012-10-23 15:24:14 -07004611
4612 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_MOVE_CHAN_CFM,
4613 sizeof(cfm), &cfm);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004614}
4615
4616static void l2cap_send_move_chan_cfm_rsp(struct l2cap_conn *conn, u8 ident,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004617 u16 icid)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004618{
4619 struct l2cap_move_chan_cfm_rsp rsp;
4620
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004621 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004622
4623 rsp.icid = cpu_to_le16(icid);
4624 l2cap_send_cmd(conn, ident, L2CAP_MOVE_CHAN_CFM_RSP, sizeof(rsp), &rsp);
4625}
4626
Mat Martineau5f3847a2012-10-23 15:24:12 -07004627static void __release_logical_link(struct l2cap_chan *chan)
4628{
4629 chan->hs_hchan = NULL;
4630 chan->hs_hcon = NULL;
4631
4632 /* Placeholder - release the logical link */
4633}
4634
Mat Martineau1500109b2012-10-23 15:24:15 -07004635static void l2cap_logical_fail(struct l2cap_chan *chan)
4636{
4637 /* Logical link setup failed */
4638 if (chan->state != BT_CONNECTED) {
4639 /* Create channel failure, disconnect */
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004640 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineau1500109b2012-10-23 15:24:15 -07004641 return;
4642 }
4643
4644 switch (chan->move_role) {
4645 case L2CAP_MOVE_ROLE_RESPONDER:
4646 l2cap_move_done(chan);
4647 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_SUPP);
4648 break;
4649 case L2CAP_MOVE_ROLE_INITIATOR:
4650 if (chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_COMP ||
4651 chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_CFM) {
4652 /* Remote has only sent pending or
4653 * success responses, clean up
4654 */
4655 l2cap_move_done(chan);
4656 }
4657
4658 /* Other amp move states imply that the move
4659 * has already aborted
4660 */
4661 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
4662 break;
4663 }
4664}
4665
4666static void l2cap_logical_finish_create(struct l2cap_chan *chan,
4667 struct hci_chan *hchan)
4668{
4669 struct l2cap_conf_rsp rsp;
Mat Martineau1500109b2012-10-23 15:24:15 -07004670
Andrei Emeltchenko336178a2012-10-31 15:46:27 +02004671 chan->hs_hchan = hchan;
Mat Martineau1500109b2012-10-23 15:24:15 -07004672 chan->hs_hcon->l2cap_data = chan->conn;
4673
Andrei Emeltchenko35ba9562012-10-25 15:20:43 +03004674 l2cap_send_efs_conf_rsp(chan, &rsp, chan->ident, 0);
Mat Martineau1500109b2012-10-23 15:24:15 -07004675
4676 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Andrei Emeltchenkofe79c6f2012-10-25 15:20:42 +03004677 int err;
Mat Martineau1500109b2012-10-23 15:24:15 -07004678
4679 set_default_fcs(chan);
4680
4681 err = l2cap_ertm_init(chan);
4682 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004683 l2cap_send_disconn_req(chan, -err);
Mat Martineau1500109b2012-10-23 15:24:15 -07004684 else
4685 l2cap_chan_ready(chan);
4686 }
4687}
4688
4689static void l2cap_logical_finish_move(struct l2cap_chan *chan,
4690 struct hci_chan *hchan)
4691{
4692 chan->hs_hcon = hchan->conn;
4693 chan->hs_hcon->l2cap_data = chan->conn;
4694
4695 BT_DBG("move_state %d", chan->move_state);
4696
4697 switch (chan->move_state) {
4698 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
4699 /* Move confirm will be sent after a success
4700 * response is received
4701 */
4702 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4703 break;
4704 case L2CAP_MOVE_WAIT_LOGICAL_CFM:
4705 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4706 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4707 } else if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
4708 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
4709 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
4710 } else if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4711 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4712 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4713 }
4714 break;
4715 default:
4716 /* Move was not in expected state, free the channel */
4717 __release_logical_link(chan);
4718
4719 chan->move_state = L2CAP_MOVE_STABLE;
4720 }
4721}
4722
4723/* Call with chan locked */
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004724void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan,
4725 u8 status)
Mat Martineau5b155ef2012-10-23 15:24:14 -07004726{
Mat Martineau1500109b2012-10-23 15:24:15 -07004727 BT_DBG("chan %p, hchan %p, status %d", chan, hchan, status);
4728
4729 if (status) {
4730 l2cap_logical_fail(chan);
4731 __release_logical_link(chan);
4732 return;
4733 }
4734
4735 if (chan->state != BT_CONNECTED) {
4736 /* Ignore logical link if channel is on BR/EDR */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004737 if (chan->local_amp_id != AMP_ID_BREDR)
Mat Martineau1500109b2012-10-23 15:24:15 -07004738 l2cap_logical_finish_create(chan, hchan);
4739 } else {
4740 l2cap_logical_finish_move(chan, hchan);
4741 }
Mat Martineau5b155ef2012-10-23 15:24:14 -07004742}
4743
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004744void l2cap_move_start(struct l2cap_chan *chan)
4745{
4746 BT_DBG("chan %p", chan);
4747
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004748 if (chan->local_amp_id == AMP_ID_BREDR) {
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004749 if (chan->chan_policy != BT_CHANNEL_POLICY_AMP_PREFERRED)
4750 return;
4751 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4752 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4753 /* Placeholder - start physical link setup */
4754 } else {
4755 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4756 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4757 chan->move_id = 0;
4758 l2cap_move_setup(chan);
4759 l2cap_send_move_chan_req(chan, 0);
4760 }
4761}
4762
Mat Martineau8eb200b2012-10-23 15:24:17 -07004763static void l2cap_do_create(struct l2cap_chan *chan, int result,
4764 u8 local_amp_id, u8 remote_amp_id)
4765{
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004766 BT_DBG("chan %p state %s %u -> %u", chan, state_to_string(chan->state),
4767 local_amp_id, remote_amp_id);
4768
Andrei Emeltchenko12d6cc62012-11-14 17:39:31 +02004769 chan->fcs = L2CAP_FCS_NONE;
4770
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004771 /* Outgoing channel on AMP */
4772 if (chan->state == BT_CONNECT) {
4773 if (result == L2CAP_CR_SUCCESS) {
4774 chan->local_amp_id = local_amp_id;
4775 l2cap_send_create_chan_req(chan, remote_amp_id);
4776 } else {
4777 /* Revert to BR/EDR connect */
4778 l2cap_send_conn_req(chan);
4779 }
4780
4781 return;
4782 }
4783
4784 /* Incoming channel on AMP */
4785 if (__l2cap_no_conn_pending(chan)) {
Mat Martineau8eb200b2012-10-23 15:24:17 -07004786 struct l2cap_conn_rsp rsp;
4787 char buf[128];
4788 rsp.scid = cpu_to_le16(chan->dcid);
4789 rsp.dcid = cpu_to_le16(chan->scid);
4790
Mat Martineau8eb200b2012-10-23 15:24:17 -07004791 if (result == L2CAP_CR_SUCCESS) {
4792 /* Send successful response */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004793 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
4794 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004795 } else {
4796 /* Send negative response */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004797 rsp.result = cpu_to_le16(L2CAP_CR_NO_MEM);
4798 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004799 }
4800
4801 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_RSP,
4802 sizeof(rsp), &rsp);
4803
4804 if (result == L2CAP_CR_SUCCESS) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02004805 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004806 set_bit(CONF_REQ_SENT, &chan->conf_state);
4807 l2cap_send_cmd(chan->conn, l2cap_get_ident(chan->conn),
4808 L2CAP_CONF_REQ,
4809 l2cap_build_conf_req(chan, buf), buf);
4810 chan->num_conf_req++;
4811 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004812 }
4813}
4814
4815static void l2cap_do_move_initiate(struct l2cap_chan *chan, u8 local_amp_id,
4816 u8 remote_amp_id)
4817{
4818 l2cap_move_setup(chan);
4819 chan->move_id = local_amp_id;
4820 chan->move_state = L2CAP_MOVE_WAIT_RSP;
4821
4822 l2cap_send_move_chan_req(chan, remote_amp_id);
4823}
4824
4825static void l2cap_do_move_respond(struct l2cap_chan *chan, int result)
4826{
4827 struct hci_chan *hchan = NULL;
4828
4829 /* Placeholder - get hci_chan for logical link */
4830
4831 if (hchan) {
4832 if (hchan->state == BT_CONNECTED) {
4833 /* Logical link is ready to go */
4834 chan->hs_hcon = hchan->conn;
4835 chan->hs_hcon->l2cap_data = chan->conn;
4836 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4837 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4838
4839 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
4840 } else {
4841 /* Wait for logical link to be ready */
4842 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4843 }
4844 } else {
4845 /* Logical link not available */
4846 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_ALLOWED);
4847 }
4848}
4849
4850static void l2cap_do_move_cancel(struct l2cap_chan *chan, int result)
4851{
4852 if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4853 u8 rsp_result;
4854 if (result == -EINVAL)
4855 rsp_result = L2CAP_MR_BAD_ID;
4856 else
4857 rsp_result = L2CAP_MR_NOT_ALLOWED;
4858
4859 l2cap_send_move_chan_rsp(chan, rsp_result);
4860 }
4861
4862 chan->move_role = L2CAP_MOVE_ROLE_NONE;
4863 chan->move_state = L2CAP_MOVE_STABLE;
4864
4865 /* Restart data transmission */
4866 l2cap_ertm_send(chan);
4867}
4868
Andrei Emeltchenkoa514b172012-11-14 17:39:30 +02004869/* Invoke with locked chan */
4870void __l2cap_physical_cfm(struct l2cap_chan *chan, int result)
Mat Martineau8eb200b2012-10-23 15:24:17 -07004871{
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004872 u8 local_amp_id = chan->local_amp_id;
Andrei Emeltchenkofffadc02012-11-01 15:37:03 +02004873 u8 remote_amp_id = chan->remote_amp_id;
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004874
Mat Martineau8eb200b2012-10-23 15:24:17 -07004875 BT_DBG("chan %p, result %d, local_amp_id %d, remote_amp_id %d",
4876 chan, result, local_amp_id, remote_amp_id);
4877
Mat Martineau8eb200b2012-10-23 15:24:17 -07004878 if (chan->state == BT_DISCONN || chan->state == BT_CLOSED) {
4879 l2cap_chan_unlock(chan);
4880 return;
4881 }
4882
4883 if (chan->state != BT_CONNECTED) {
4884 l2cap_do_create(chan, result, local_amp_id, remote_amp_id);
4885 } else if (result != L2CAP_MR_SUCCESS) {
4886 l2cap_do_move_cancel(chan, result);
4887 } else {
4888 switch (chan->move_role) {
4889 case L2CAP_MOVE_ROLE_INITIATOR:
4890 l2cap_do_move_initiate(chan, local_amp_id,
4891 remote_amp_id);
4892 break;
4893 case L2CAP_MOVE_ROLE_RESPONDER:
4894 l2cap_do_move_respond(chan, result);
4895 break;
4896 default:
4897 l2cap_do_move_cancel(chan, result);
4898 break;
4899 }
4900 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004901}
4902
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004903static inline int l2cap_move_channel_req(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004904 struct l2cap_cmd_hdr *cmd,
4905 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004906{
4907 struct l2cap_move_chan_req *req = data;
Mat Martineau1500109b2012-10-23 15:24:15 -07004908 struct l2cap_move_chan_rsp rsp;
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004909 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004910 u16 icid = 0;
4911 u16 result = L2CAP_MR_NOT_ALLOWED;
4912
4913 if (cmd_len != sizeof(*req))
4914 return -EPROTO;
4915
4916 icid = le16_to_cpu(req->icid);
4917
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004918 BT_DBG("icid 0x%4.4x, dest_amp_id %d", icid, req->dest_amp_id);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004919
Marcel Holtmann848566b2013-10-01 22:59:22 -07004920 if (!conn->hs_enabled)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004921 return -EINVAL;
4922
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004923 chan = l2cap_get_chan_by_dcid(conn, icid);
4924 if (!chan) {
Mat Martineau1500109b2012-10-23 15:24:15 -07004925 rsp.icid = cpu_to_le16(icid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004926 rsp.result = cpu_to_le16(L2CAP_MR_NOT_ALLOWED);
Mat Martineau1500109b2012-10-23 15:24:15 -07004927 l2cap_send_cmd(conn, cmd->ident, L2CAP_MOVE_CHAN_RSP,
4928 sizeof(rsp), &rsp);
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004929 return 0;
4930 }
4931
Mat Martineau1500109b2012-10-23 15:24:15 -07004932 chan->ident = cmd->ident;
4933
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004934 if (chan->scid < L2CAP_CID_DYN_START ||
4935 chan->chan_policy == BT_CHANNEL_POLICY_BREDR_ONLY ||
4936 (chan->mode != L2CAP_MODE_ERTM &&
4937 chan->mode != L2CAP_MODE_STREAMING)) {
4938 result = L2CAP_MR_NOT_ALLOWED;
4939 goto send_move_response;
4940 }
4941
4942 if (chan->local_amp_id == req->dest_amp_id) {
4943 result = L2CAP_MR_SAME_ID;
4944 goto send_move_response;
4945 }
4946
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004947 if (req->dest_amp_id != AMP_ID_BREDR) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004948 struct hci_dev *hdev;
4949 hdev = hci_dev_get(req->dest_amp_id);
4950 if (!hdev || hdev->dev_type != HCI_AMP ||
4951 !test_bit(HCI_UP, &hdev->flags)) {
4952 if (hdev)
4953 hci_dev_put(hdev);
4954
4955 result = L2CAP_MR_BAD_ID;
4956 goto send_move_response;
4957 }
4958 hci_dev_put(hdev);
4959 }
4960
4961 /* Detect a move collision. Only send a collision response
4962 * if this side has "lost", otherwise proceed with the move.
4963 * The winner has the larger bd_addr.
4964 */
4965 if ((__chan_is_moving(chan) ||
4966 chan->move_role != L2CAP_MOVE_ROLE_NONE) &&
Marcel Holtmann6f59b902013-10-13 05:24:01 -07004967 bacmp(&conn->hcon->src, &conn->hcon->dst) > 0) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004968 result = L2CAP_MR_COLLISION;
4969 goto send_move_response;
4970 }
4971
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004972 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
4973 l2cap_move_setup(chan);
4974 chan->move_id = req->dest_amp_id;
4975 icid = chan->dcid;
4976
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004977 if (req->dest_amp_id == AMP_ID_BREDR) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004978 /* Moving to BR/EDR */
4979 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4980 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4981 result = L2CAP_MR_PEND;
4982 } else {
4983 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4984 result = L2CAP_MR_SUCCESS;
4985 }
4986 } else {
4987 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4988 /* Placeholder - uncomment when amp functions are available */
4989 /*amp_accept_physical(chan, req->dest_amp_id);*/
4990 result = L2CAP_MR_PEND;
4991 }
4992
4993send_move_response:
Mat Martineau1500109b2012-10-23 15:24:15 -07004994 l2cap_send_move_chan_rsp(chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004995
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004996 l2cap_chan_unlock(chan);
4997
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004998 return 0;
4999}
5000
Mat Martineau5b155ef2012-10-23 15:24:14 -07005001static void l2cap_move_continue(struct l2cap_conn *conn, u16 icid, u16 result)
5002{
5003 struct l2cap_chan *chan;
5004 struct hci_chan *hchan = NULL;
5005
5006 chan = l2cap_get_chan_by_scid(conn, icid);
5007 if (!chan) {
5008 l2cap_send_move_chan_cfm_icid(conn, icid);
5009 return;
5010 }
5011
5012 __clear_chan_timer(chan);
5013 if (result == L2CAP_MR_PEND)
5014 __set_chan_timer(chan, L2CAP_MOVE_ERTX_TIMEOUT);
5015
5016 switch (chan->move_state) {
5017 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
5018 /* Move confirm will be sent when logical link
5019 * is complete.
5020 */
5021 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
5022 break;
5023 case L2CAP_MOVE_WAIT_RSP_SUCCESS:
5024 if (result == L2CAP_MR_PEND) {
5025 break;
5026 } else if (test_bit(CONN_LOCAL_BUSY,
5027 &chan->conn_state)) {
5028 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
5029 } else {
5030 /* Logical link is up or moving to BR/EDR,
5031 * proceed with move
5032 */
5033 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
5034 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
5035 }
5036 break;
5037 case L2CAP_MOVE_WAIT_RSP:
5038 /* Moving to AMP */
5039 if (result == L2CAP_MR_SUCCESS) {
5040 /* Remote is ready, send confirm immediately
5041 * after logical link is ready
5042 */
5043 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
5044 } else {
5045 /* Both logical link and move success
5046 * are required to confirm
5047 */
5048 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_COMP;
5049 }
5050
5051 /* Placeholder - get hci_chan for logical link */
5052 if (!hchan) {
5053 /* Logical link not available */
5054 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5055 break;
5056 }
5057
5058 /* If the logical link is not yet connected, do not
5059 * send confirmation.
5060 */
5061 if (hchan->state != BT_CONNECTED)
5062 break;
5063
5064 /* Logical link is already ready to go */
5065
5066 chan->hs_hcon = hchan->conn;
5067 chan->hs_hcon->l2cap_data = chan->conn;
5068
5069 if (result == L2CAP_MR_SUCCESS) {
5070 /* Can confirm now */
5071 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
5072 } else {
5073 /* Now only need move success
5074 * to confirm
5075 */
5076 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
5077 }
5078
5079 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
5080 break;
5081 default:
5082 /* Any other amp move state means the move failed. */
5083 chan->move_id = chan->local_amp_id;
5084 l2cap_move_done(chan);
5085 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5086 }
5087
5088 l2cap_chan_unlock(chan);
5089}
5090
5091static void l2cap_move_fail(struct l2cap_conn *conn, u8 ident, u16 icid,
5092 u16 result)
5093{
5094 struct l2cap_chan *chan;
5095
5096 chan = l2cap_get_chan_by_ident(conn, ident);
5097 if (!chan) {
5098 /* Could not locate channel, icid is best guess */
5099 l2cap_send_move_chan_cfm_icid(conn, icid);
5100 return;
5101 }
5102
5103 __clear_chan_timer(chan);
5104
5105 if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
5106 if (result == L2CAP_MR_COLLISION) {
5107 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
5108 } else {
5109 /* Cleanup - cancel move */
5110 chan->move_id = chan->local_amp_id;
5111 l2cap_move_done(chan);
5112 }
5113 }
5114
5115 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5116
5117 l2cap_chan_unlock(chan);
5118}
5119
5120static int l2cap_move_channel_rsp(struct l2cap_conn *conn,
5121 struct l2cap_cmd_hdr *cmd,
5122 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005123{
5124 struct l2cap_move_chan_rsp *rsp = data;
5125 u16 icid, result;
5126
5127 if (cmd_len != sizeof(*rsp))
5128 return -EPROTO;
5129
5130 icid = le16_to_cpu(rsp->icid);
5131 result = le16_to_cpu(rsp->result);
5132
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005133 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005134
Mat Martineau5b155ef2012-10-23 15:24:14 -07005135 if (result == L2CAP_MR_SUCCESS || result == L2CAP_MR_PEND)
5136 l2cap_move_continue(conn, icid, result);
5137 else
5138 l2cap_move_fail(conn, cmd->ident, icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005139
5140 return 0;
5141}
5142
Mat Martineau5f3847a2012-10-23 15:24:12 -07005143static int l2cap_move_channel_confirm(struct l2cap_conn *conn,
5144 struct l2cap_cmd_hdr *cmd,
5145 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005146{
5147 struct l2cap_move_chan_cfm *cfm = data;
Mat Martineau5f3847a2012-10-23 15:24:12 -07005148 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005149 u16 icid, result;
5150
5151 if (cmd_len != sizeof(*cfm))
5152 return -EPROTO;
5153
5154 icid = le16_to_cpu(cfm->icid);
5155 result = le16_to_cpu(cfm->result);
5156
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005157 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005158
Mat Martineau5f3847a2012-10-23 15:24:12 -07005159 chan = l2cap_get_chan_by_dcid(conn, icid);
5160 if (!chan) {
5161 /* Spec requires a response even if the icid was not found */
5162 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5163 return 0;
5164 }
5165
5166 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM) {
5167 if (result == L2CAP_MC_CONFIRMED) {
5168 chan->local_amp_id = chan->move_id;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005169 if (chan->local_amp_id == AMP_ID_BREDR)
Mat Martineau5f3847a2012-10-23 15:24:12 -07005170 __release_logical_link(chan);
5171 } else {
5172 chan->move_id = chan->local_amp_id;
5173 }
5174
5175 l2cap_move_done(chan);
5176 }
5177
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005178 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5179
Mat Martineau5f3847a2012-10-23 15:24:12 -07005180 l2cap_chan_unlock(chan);
5181
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005182 return 0;
5183}
5184
5185static inline int l2cap_move_channel_confirm_rsp(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005186 struct l2cap_cmd_hdr *cmd,
5187 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005188{
5189 struct l2cap_move_chan_cfm_rsp *rsp = data;
Mat Martineau3fd71a02012-10-23 15:24:16 -07005190 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005191 u16 icid;
5192
5193 if (cmd_len != sizeof(*rsp))
5194 return -EPROTO;
5195
5196 icid = le16_to_cpu(rsp->icid);
5197
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005198 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005199
Mat Martineau3fd71a02012-10-23 15:24:16 -07005200 chan = l2cap_get_chan_by_scid(conn, icid);
5201 if (!chan)
5202 return 0;
5203
5204 __clear_chan_timer(chan);
5205
5206 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM_RSP) {
5207 chan->local_amp_id = chan->move_id;
5208
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005209 if (chan->local_amp_id == AMP_ID_BREDR && chan->hs_hchan)
Mat Martineau3fd71a02012-10-23 15:24:16 -07005210 __release_logical_link(chan);
5211
5212 l2cap_move_done(chan);
5213 }
5214
5215 l2cap_chan_unlock(chan);
5216
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005217 return 0;
5218}
5219
Claudio Takahaside731152011-02-11 19:28:55 -02005220static inline int l2cap_conn_param_update_req(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005221 struct l2cap_cmd_hdr *cmd,
Johan Hedberg203e6392013-05-15 10:07:15 +03005222 u16 cmd_len, u8 *data)
Claudio Takahaside731152011-02-11 19:28:55 -02005223{
5224 struct hci_conn *hcon = conn->hcon;
5225 struct l2cap_conn_param_update_req *req;
5226 struct l2cap_conn_param_update_rsp rsp;
Johan Hedberg203e6392013-05-15 10:07:15 +03005227 u16 min, max, latency, to_multiplier;
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005228 int err;
Claudio Takahaside731152011-02-11 19:28:55 -02005229
Johan Hedberg4dae2792014-06-24 17:03:50 +03005230 if (!test_bit(HCI_CONN_MASTER, &hcon->flags))
Claudio Takahaside731152011-02-11 19:28:55 -02005231 return -EINVAL;
5232
Claudio Takahaside731152011-02-11 19:28:55 -02005233 if (cmd_len != sizeof(struct l2cap_conn_param_update_req))
5234 return -EPROTO;
5235
5236 req = (struct l2cap_conn_param_update_req *) data;
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03005237 min = __le16_to_cpu(req->min);
5238 max = __le16_to_cpu(req->max);
Claudio Takahaside731152011-02-11 19:28:55 -02005239 latency = __le16_to_cpu(req->latency);
5240 to_multiplier = __le16_to_cpu(req->to_multiplier);
5241
5242 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 +01005243 min, max, latency, to_multiplier);
Claudio Takahaside731152011-02-11 19:28:55 -02005244
5245 memset(&rsp, 0, sizeof(rsp));
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005246
Andre Guedesd4905f22014-06-25 21:52:52 -03005247 err = hci_check_conn_params(min, max, latency, to_multiplier);
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005248 if (err)
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005249 rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_REJECTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005250 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005251 rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_ACCEPTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005252
5253 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONN_PARAM_UPDATE_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005254 sizeof(rsp), &rsp);
Claudio Takahaside731152011-02-11 19:28:55 -02005255
Andre Guedesffb5a8272014-07-01 18:10:11 -03005256 if (!err) {
Johan Hedbergf4869e22014-07-02 17:37:32 +03005257 u8 store_hint;
Andre Guedesffb5a8272014-07-01 18:10:11 -03005258
Johan Hedbergf4869e22014-07-02 17:37:32 +03005259 store_hint = hci_le_conn_update(hcon, min, max, latency,
5260 to_multiplier);
5261 mgmt_new_conn_param(hcon->hdev, &hcon->dst, hcon->dst_type,
5262 store_hint, min, max, latency,
5263 to_multiplier);
5264
Andre Guedesffb5a8272014-07-01 18:10:11 -03005265 }
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005266
Claudio Takahaside731152011-02-11 19:28:55 -02005267 return 0;
5268}
5269
Johan Hedbergf1496de2013-05-13 14:15:56 +03005270static int l2cap_le_connect_rsp(struct l2cap_conn *conn,
5271 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5272 u8 *data)
5273{
5274 struct l2cap_le_conn_rsp *rsp = (struct l2cap_le_conn_rsp *) data;
5275 u16 dcid, mtu, mps, credits, result;
5276 struct l2cap_chan *chan;
5277 int err;
5278
5279 if (cmd_len < sizeof(*rsp))
5280 return -EPROTO;
5281
5282 dcid = __le16_to_cpu(rsp->dcid);
5283 mtu = __le16_to_cpu(rsp->mtu);
5284 mps = __le16_to_cpu(rsp->mps);
5285 credits = __le16_to_cpu(rsp->credits);
5286 result = __le16_to_cpu(rsp->result);
5287
5288 if (result == L2CAP_CR_SUCCESS && (mtu < 23 || mps < 23))
5289 return -EPROTO;
5290
5291 BT_DBG("dcid 0x%4.4x mtu %u mps %u credits %u result 0x%2.2x",
5292 dcid, mtu, mps, credits, result);
5293
5294 mutex_lock(&conn->chan_lock);
5295
5296 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5297 if (!chan) {
5298 err = -EBADSLT;
5299 goto unlock;
5300 }
5301
5302 err = 0;
5303
5304 l2cap_chan_lock(chan);
5305
5306 switch (result) {
5307 case L2CAP_CR_SUCCESS:
5308 chan->ident = 0;
5309 chan->dcid = dcid;
5310 chan->omtu = mtu;
5311 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005312 chan->tx_credits = credits;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005313 l2cap_chan_ready(chan);
5314 break;
5315
5316 default:
5317 l2cap_chan_del(chan, ECONNREFUSED);
5318 break;
5319 }
5320
5321 l2cap_chan_unlock(chan);
5322
5323unlock:
5324 mutex_unlock(&conn->chan_lock);
5325
5326 return err;
5327}
5328
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005329static inline int l2cap_bredr_sig_cmd(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005330 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5331 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005332{
5333 int err = 0;
5334
5335 switch (cmd->code) {
5336 case L2CAP_COMMAND_REJ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005337 l2cap_command_rej(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005338 break;
5339
5340 case L2CAP_CONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005341 err = l2cap_connect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005342 break;
5343
5344 case L2CAP_CONN_RSP:
Mat Martineauf5a25982012-10-11 17:48:21 +03005345 case L2CAP_CREATE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005346 l2cap_connect_create_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005347 break;
5348
5349 case L2CAP_CONF_REQ:
5350 err = l2cap_config_req(conn, cmd, cmd_len, data);
5351 break;
5352
5353 case L2CAP_CONF_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005354 l2cap_config_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005355 break;
5356
5357 case L2CAP_DISCONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005358 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005359 break;
5360
5361 case L2CAP_DISCONN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005362 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005363 break;
5364
5365 case L2CAP_ECHO_REQ:
5366 l2cap_send_cmd(conn, cmd->ident, L2CAP_ECHO_RSP, cmd_len, data);
5367 break;
5368
5369 case L2CAP_ECHO_RSP:
5370 break;
5371
5372 case L2CAP_INFO_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005373 err = l2cap_information_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005374 break;
5375
5376 case L2CAP_INFO_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005377 l2cap_information_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005378 break;
5379
Mat Martineauf94ff6f2011-11-02 16:18:32 -07005380 case L2CAP_CREATE_CHAN_REQ:
5381 err = l2cap_create_channel_req(conn, cmd, cmd_len, data);
5382 break;
5383
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005384 case L2CAP_MOVE_CHAN_REQ:
5385 err = l2cap_move_channel_req(conn, cmd, cmd_len, data);
5386 break;
5387
5388 case L2CAP_MOVE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005389 l2cap_move_channel_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005390 break;
5391
5392 case L2CAP_MOVE_CHAN_CFM:
5393 err = l2cap_move_channel_confirm(conn, cmd, cmd_len, data);
5394 break;
5395
5396 case L2CAP_MOVE_CHAN_CFM_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005397 l2cap_move_channel_confirm_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005398 break;
5399
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005400 default:
5401 BT_ERR("Unknown BR/EDR signaling command 0x%2.2x", cmd->code);
5402 err = -EINVAL;
5403 break;
5404 }
5405
5406 return err;
5407}
5408
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005409static int l2cap_le_connect_req(struct l2cap_conn *conn,
5410 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5411 u8 *data)
5412{
5413 struct l2cap_le_conn_req *req = (struct l2cap_le_conn_req *) data;
5414 struct l2cap_le_conn_rsp rsp;
5415 struct l2cap_chan *chan, *pchan;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005416 u16 dcid, scid, credits, mtu, mps;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005417 __le16 psm;
5418 u8 result;
5419
5420 if (cmd_len != sizeof(*req))
5421 return -EPROTO;
5422
5423 scid = __le16_to_cpu(req->scid);
5424 mtu = __le16_to_cpu(req->mtu);
5425 mps = __le16_to_cpu(req->mps);
5426 psm = req->psm;
5427 dcid = 0;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005428 credits = 0;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005429
5430 if (mtu < 23 || mps < 23)
5431 return -EPROTO;
5432
5433 BT_DBG("psm 0x%2.2x scid 0x%4.4x mtu %u mps %u", __le16_to_cpu(psm),
5434 scid, mtu, mps);
5435
5436 /* Check if we have socket listening on psm */
5437 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
5438 &conn->hcon->dst, LE_LINK);
5439 if (!pchan) {
5440 result = L2CAP_CR_BAD_PSM;
5441 chan = NULL;
5442 goto response;
5443 }
5444
5445 mutex_lock(&conn->chan_lock);
5446 l2cap_chan_lock(pchan);
5447
5448 if (!smp_sufficient_security(conn->hcon, pchan->sec_level)) {
5449 result = L2CAP_CR_AUTHENTICATION;
5450 chan = NULL;
5451 goto response_unlock;
5452 }
5453
5454 /* Check if we already have channel with that dcid */
5455 if (__l2cap_get_chan_by_dcid(conn, scid)) {
5456 result = L2CAP_CR_NO_MEM;
5457 chan = NULL;
5458 goto response_unlock;
5459 }
5460
5461 chan = pchan->ops->new_connection(pchan);
5462 if (!chan) {
5463 result = L2CAP_CR_NO_MEM;
5464 goto response_unlock;
5465 }
5466
Johan Hedberg0ce43ce2013-12-05 14:55:33 +02005467 l2cap_le_flowctl_init(chan);
5468
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005469 bacpy(&chan->src, &conn->hcon->src);
5470 bacpy(&chan->dst, &conn->hcon->dst);
5471 chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type);
5472 chan->dst_type = bdaddr_type(conn->hcon, conn->hcon->dst_type);
5473 chan->psm = psm;
5474 chan->dcid = scid;
5475 chan->omtu = mtu;
5476 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005477 chan->tx_credits = __le16_to_cpu(req->credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005478
5479 __l2cap_chan_add(conn, chan);
5480 dcid = chan->scid;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005481 credits = chan->rx_credits;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005482
5483 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
5484
5485 chan->ident = cmd->ident;
5486
5487 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
5488 l2cap_state_change(chan, BT_CONNECT2);
5489 result = L2CAP_CR_PEND;
5490 chan->ops->defer(chan);
5491 } else {
5492 l2cap_chan_ready(chan);
5493 result = L2CAP_CR_SUCCESS;
5494 }
5495
5496response_unlock:
5497 l2cap_chan_unlock(pchan);
5498 mutex_unlock(&conn->chan_lock);
5499
5500 if (result == L2CAP_CR_PEND)
5501 return 0;
5502
5503response:
5504 if (chan) {
5505 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02005506 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005507 } else {
5508 rsp.mtu = 0;
5509 rsp.mps = 0;
5510 }
5511
5512 rsp.dcid = cpu_to_le16(dcid);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005513 rsp.credits = cpu_to_le16(credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005514 rsp.result = cpu_to_le16(result);
5515
5516 l2cap_send_cmd(conn, cmd->ident, L2CAP_LE_CONN_RSP, sizeof(rsp), &rsp);
5517
5518 return 0;
5519}
5520
Johan Hedbergfad5fc892013-12-05 09:45:01 +02005521static inline int l2cap_le_credits(struct l2cap_conn *conn,
5522 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5523 u8 *data)
5524{
5525 struct l2cap_le_credits *pkt;
5526 struct l2cap_chan *chan;
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005527 u16 cid, credits, max_credits;
Johan Hedbergfad5fc892013-12-05 09:45:01 +02005528
5529 if (cmd_len != sizeof(*pkt))
5530 return -EPROTO;
5531
5532 pkt = (struct l2cap_le_credits *) data;
5533 cid = __le16_to_cpu(pkt->cid);
5534 credits = __le16_to_cpu(pkt->credits);
5535
5536 BT_DBG("cid 0x%4.4x credits 0x%4.4x", cid, credits);
5537
5538 chan = l2cap_get_chan_by_dcid(conn, cid);
5539 if (!chan)
5540 return -EBADSLT;
5541
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005542 max_credits = LE_FLOWCTL_MAX_CREDITS - chan->tx_credits;
5543 if (credits > max_credits) {
5544 BT_ERR("LE credits overflow");
5545 l2cap_send_disconn_req(chan, ECONNRESET);
5546
5547 /* Return 0 so that we don't trigger an unnecessary
5548 * command reject packet.
5549 */
5550 return 0;
5551 }
5552
Johan Hedbergfad5fc892013-12-05 09:45:01 +02005553 chan->tx_credits += credits;
5554
5555 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
5556 l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
5557 chan->tx_credits--;
5558 }
5559
5560 if (chan->tx_credits)
5561 chan->ops->resume(chan);
5562
5563 l2cap_chan_unlock(chan);
5564
5565 return 0;
5566}
5567
Johan Hedberg71fb4192013-12-10 10:52:48 +02005568static inline int l2cap_le_command_rej(struct l2cap_conn *conn,
5569 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5570 u8 *data)
5571{
5572 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
5573 struct l2cap_chan *chan;
5574
5575 if (cmd_len < sizeof(*rej))
5576 return -EPROTO;
5577
5578 mutex_lock(&conn->chan_lock);
5579
5580 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5581 if (!chan)
5582 goto done;
5583
5584 l2cap_chan_lock(chan);
5585 l2cap_chan_del(chan, ECONNREFUSED);
5586 l2cap_chan_unlock(chan);
5587
5588done:
5589 mutex_unlock(&conn->chan_lock);
5590 return 0;
5591}
5592
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005593static inline int l2cap_le_sig_cmd(struct l2cap_conn *conn,
Johan Hedberg203e6392013-05-15 10:07:15 +03005594 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5595 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005596{
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005597 int err = 0;
5598
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005599 switch (cmd->code) {
5600 case L2CAP_COMMAND_REJ:
Johan Hedberg71fb4192013-12-10 10:52:48 +02005601 l2cap_le_command_rej(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005602 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005603
5604 case L2CAP_CONN_PARAM_UPDATE_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005605 err = l2cap_conn_param_update_req(conn, cmd, cmd_len, data);
5606 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005607
5608 case L2CAP_CONN_PARAM_UPDATE_RSP:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005609 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005610
Johan Hedbergf1496de2013-05-13 14:15:56 +03005611 case L2CAP_LE_CONN_RSP:
5612 l2cap_le_connect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005613 break;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005614
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005615 case L2CAP_LE_CONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005616 err = l2cap_le_connect_req(conn, cmd, cmd_len, data);
5617 break;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005618
Johan Hedbergfad5fc892013-12-05 09:45:01 +02005619 case L2CAP_LE_CREDITS:
5620 err = l2cap_le_credits(conn, cmd, cmd_len, data);
5621 break;
5622
Johan Hedberg3defe012013-05-15 10:16:06 +03005623 case L2CAP_DISCONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005624 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
5625 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005626
5627 case L2CAP_DISCONN_RSP:
5628 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005629 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005630
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005631 default:
5632 BT_ERR("Unknown LE signaling command 0x%2.2x", cmd->code);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005633 err = -EINVAL;
5634 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005635 }
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005636
5637 return err;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005638}
5639
Johan Hedbergc5623552013-04-29 19:35:33 +03005640static inline void l2cap_le_sig_channel(struct l2cap_conn *conn,
5641 struct sk_buff *skb)
5642{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005643 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005644 struct l2cap_cmd_hdr *cmd;
5645 u16 len;
Johan Hedbergc5623552013-04-29 19:35:33 +03005646 int err;
5647
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005648 if (hcon->type != LE_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005649 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005650
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005651 if (skb->len < L2CAP_CMD_HDR_SIZE)
5652 goto drop;
Johan Hedbergc5623552013-04-29 19:35:33 +03005653
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005654 cmd = (void *) skb->data;
5655 skb_pull(skb, L2CAP_CMD_HDR_SIZE);
Johan Hedbergc5623552013-04-29 19:35:33 +03005656
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005657 len = le16_to_cpu(cmd->len);
Johan Hedbergc5623552013-04-29 19:35:33 +03005658
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005659 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd->code, len, cmd->ident);
Johan Hedbergc5623552013-04-29 19:35:33 +03005660
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005661 if (len != skb->len || !cmd->ident) {
5662 BT_DBG("corrupted command");
5663 goto drop;
5664 }
Johan Hedbergc5623552013-04-29 19:35:33 +03005665
Johan Hedberg203e6392013-05-15 10:07:15 +03005666 err = l2cap_le_sig_cmd(conn, cmd, len, skb->data);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005667 if (err) {
5668 struct l2cap_cmd_rej_unk rej;
Johan Hedbergc5623552013-04-29 19:35:33 +03005669
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005670 BT_ERR("Wrong link type (%d)", err);
Johan Hedbergc5623552013-04-29 19:35:33 +03005671
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005672 rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005673 l2cap_send_cmd(conn, cmd->ident, L2CAP_COMMAND_REJ,
5674 sizeof(rej), &rej);
Johan Hedbergc5623552013-04-29 19:35:33 +03005675 }
5676
Marcel Holtmann3b166292013-10-02 08:28:21 -07005677drop:
Johan Hedbergc5623552013-04-29 19:35:33 +03005678 kfree_skb(skb);
5679}
5680
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005681static inline void l2cap_sig_channel(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005682 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005683{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005684 struct hci_conn *hcon = conn->hcon;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005685 u8 *data = skb->data;
5686 int len = skb->len;
5687 struct l2cap_cmd_hdr cmd;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005688 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005689
5690 l2cap_raw_recv(conn, skb);
5691
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005692 if (hcon->type != ACL_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005693 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005694
Linus Torvalds1da177e2005-04-16 15:20:36 -07005695 while (len >= L2CAP_CMD_HDR_SIZE) {
Al Viro88219a02007-07-29 00:17:25 -07005696 u16 cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005697 memcpy(&cmd, data, L2CAP_CMD_HDR_SIZE);
5698 data += L2CAP_CMD_HDR_SIZE;
5699 len -= L2CAP_CMD_HDR_SIZE;
5700
Al Viro88219a02007-07-29 00:17:25 -07005701 cmd_len = le16_to_cpu(cmd.len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005702
Gustavo Padovan2d792812012-10-06 10:07:01 +01005703 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd.code, cmd_len,
5704 cmd.ident);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005705
Al Viro88219a02007-07-29 00:17:25 -07005706 if (cmd_len > len || !cmd.ident) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005707 BT_DBG("corrupted command");
5708 break;
5709 }
5710
Johan Hedbergc5623552013-04-29 19:35:33 +03005711 err = l2cap_bredr_sig_cmd(conn, &cmd, cmd_len, data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005712 if (err) {
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03005713 struct l2cap_cmd_rej_unk rej;
Gustavo F. Padovan2c6d1a22011-03-23 14:38:32 -03005714
5715 BT_ERR("Wrong link type (%d)", err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005716
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005717 rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Gustavo Padovan2d792812012-10-06 10:07:01 +01005718 l2cap_send_cmd(conn, cmd.ident, L2CAP_COMMAND_REJ,
5719 sizeof(rej), &rej);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005720 }
5721
Al Viro88219a02007-07-29 00:17:25 -07005722 data += cmd_len;
5723 len -= cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005724 }
5725
Marcel Holtmann3b166292013-10-02 08:28:21 -07005726drop:
Linus Torvalds1da177e2005-04-16 15:20:36 -07005727 kfree_skb(skb);
5728}
5729
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005730static int l2cap_check_fcs(struct l2cap_chan *chan, struct sk_buff *skb)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005731{
5732 u16 our_fcs, rcv_fcs;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03005733 int hdr_size;
5734
5735 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
5736 hdr_size = L2CAP_EXT_HDR_SIZE;
5737 else
5738 hdr_size = L2CAP_ENH_HDR_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005739
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005740 if (chan->fcs == L2CAP_FCS_CRC16) {
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005741 skb_trim(skb, skb->len - L2CAP_FCS_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005742 rcv_fcs = get_unaligned_le16(skb->data + skb->len);
5743 our_fcs = crc16(0, skb->data - hdr_size, skb->len + hdr_size);
5744
5745 if (our_fcs != rcv_fcs)
João Paulo Rechi Vita7a560e52010-06-22 13:56:27 -03005746 return -EBADMSG;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005747 }
5748 return 0;
5749}
5750
Mat Martineau6ea00482012-05-17 20:53:52 -07005751static void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan)
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005752{
Mat Martineaue31f7632012-05-17 20:53:41 -07005753 struct l2cap_ctrl control;
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005754
Mat Martineaue31f7632012-05-17 20:53:41 -07005755 BT_DBG("chan %p", chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005756
Mat Martineaue31f7632012-05-17 20:53:41 -07005757 memset(&control, 0, sizeof(control));
5758 control.sframe = 1;
5759 control.final = 1;
5760 control.reqseq = chan->buffer_seq;
5761 set_bit(CONN_SEND_FBIT, &chan->conn_state);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005762
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005763 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
Mat Martineaue31f7632012-05-17 20:53:41 -07005764 control.super = L2CAP_SUPER_RNR;
5765 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005766 }
5767
Mat Martineaue31f7632012-05-17 20:53:41 -07005768 if (test_and_clear_bit(CONN_REMOTE_BUSY, &chan->conn_state) &&
5769 chan->unacked_frames > 0)
5770 __set_retrans_timer(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005771
Mat Martineaue31f7632012-05-17 20:53:41 -07005772 /* Send pending iframes */
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03005773 l2cap_ertm_send(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005774
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005775 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
Mat Martineaue31f7632012-05-17 20:53:41 -07005776 test_bit(CONN_SEND_FBIT, &chan->conn_state)) {
5777 /* F-bit wasn't sent in an s-frame or i-frame yet, so
5778 * send it now.
5779 */
5780 control.super = L2CAP_SUPER_RR;
5781 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005782 }
5783}
5784
Gustavo Padovan2d792812012-10-06 10:07:01 +01005785static void append_skb_frag(struct sk_buff *skb, struct sk_buff *new_frag,
5786 struct sk_buff **last_frag)
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005787{
Mat Martineau84084a32011-07-22 14:54:00 -07005788 /* skb->len reflects data in skb as well as all fragments
5789 * skb->data_len reflects only data in fragments
5790 */
5791 if (!skb_has_frag_list(skb))
5792 skb_shinfo(skb)->frag_list = new_frag;
5793
5794 new_frag->next = NULL;
5795
5796 (*last_frag)->next = new_frag;
5797 *last_frag = new_frag;
5798
5799 skb->len += new_frag->len;
5800 skb->data_len += new_frag->len;
5801 skb->truesize += new_frag->truesize;
5802}
5803
Mat Martineau4b51dae92012-05-17 20:53:37 -07005804static int l2cap_reassemble_sdu(struct l2cap_chan *chan, struct sk_buff *skb,
5805 struct l2cap_ctrl *control)
Mat Martineau84084a32011-07-22 14:54:00 -07005806{
5807 int err = -EINVAL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005808
Mat Martineau4b51dae92012-05-17 20:53:37 -07005809 switch (control->sar) {
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005810 case L2CAP_SAR_UNSEGMENTED:
Mat Martineau84084a32011-07-22 14:54:00 -07005811 if (chan->sdu)
5812 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005813
Gustavo Padovan80b98022012-05-27 22:27:51 -03005814 err = chan->ops->recv(chan, skb);
Mat Martineau84084a32011-07-22 14:54:00 -07005815 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005816
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005817 case L2CAP_SAR_START:
Mat Martineau84084a32011-07-22 14:54:00 -07005818 if (chan->sdu)
5819 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005820
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005821 chan->sdu_len = get_unaligned_le16(skb->data);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005822 skb_pull(skb, L2CAP_SDULEN_SIZE);
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005823
Mat Martineau84084a32011-07-22 14:54:00 -07005824 if (chan->sdu_len > chan->imtu) {
5825 err = -EMSGSIZE;
5826 break;
5827 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005828
Mat Martineau84084a32011-07-22 14:54:00 -07005829 if (skb->len >= chan->sdu_len)
5830 break;
5831
5832 chan->sdu = skb;
5833 chan->sdu_last_frag = skb;
5834
5835 skb = NULL;
5836 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005837 break;
5838
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005839 case L2CAP_SAR_CONTINUE:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005840 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005841 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005842
Mat Martineau84084a32011-07-22 14:54:00 -07005843 append_skb_frag(chan->sdu, skb,
5844 &chan->sdu_last_frag);
5845 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005846
Mat Martineau84084a32011-07-22 14:54:00 -07005847 if (chan->sdu->len >= chan->sdu_len)
5848 break;
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005849
Mat Martineau84084a32011-07-22 14:54:00 -07005850 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005851 break;
5852
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005853 case L2CAP_SAR_END:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005854 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005855 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005856
Mat Martineau84084a32011-07-22 14:54:00 -07005857 append_skb_frag(chan->sdu, skb,
5858 &chan->sdu_last_frag);
5859 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005860
Mat Martineau84084a32011-07-22 14:54:00 -07005861 if (chan->sdu->len != chan->sdu_len)
5862 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005863
Gustavo Padovan80b98022012-05-27 22:27:51 -03005864 err = chan->ops->recv(chan, chan->sdu);
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005865
Mat Martineau84084a32011-07-22 14:54:00 -07005866 if (!err) {
5867 /* Reassembly complete */
5868 chan->sdu = NULL;
5869 chan->sdu_last_frag = NULL;
5870 chan->sdu_len = 0;
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005871 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005872 break;
5873 }
5874
Mat Martineau84084a32011-07-22 14:54:00 -07005875 if (err) {
5876 kfree_skb(skb);
5877 kfree_skb(chan->sdu);
5878 chan->sdu = NULL;
5879 chan->sdu_last_frag = NULL;
5880 chan->sdu_len = 0;
5881 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005882
Mat Martineau84084a32011-07-22 14:54:00 -07005883 return err;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005884}
5885
Mat Martineau32b32732012-10-23 15:24:11 -07005886static int l2cap_resegment(struct l2cap_chan *chan)
5887{
5888 /* Placeholder */
5889 return 0;
5890}
5891
Mat Martineaue3281402011-07-07 09:39:02 -07005892void l2cap_chan_busy(struct l2cap_chan *chan, int busy)
Gustavo F. Padovan712132e2010-06-21 19:39:50 -03005893{
Mat Martineau61aa4f52012-05-17 20:53:40 -07005894 u8 event;
5895
5896 if (chan->mode != L2CAP_MODE_ERTM)
5897 return;
5898
5899 event = busy ? L2CAP_EV_LOCAL_BUSY_DETECTED : L2CAP_EV_LOCAL_BUSY_CLEAR;
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03005900 l2cap_tx(chan, NULL, NULL, event);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005901}
5902
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005903static int l2cap_rx_queued_iframes(struct l2cap_chan *chan)
5904{
Mat Martineau63838722012-05-17 20:53:45 -07005905 int err = 0;
5906 /* Pass sequential frames to l2cap_reassemble_sdu()
5907 * until a gap is encountered.
5908 */
5909
5910 BT_DBG("chan %p", chan);
5911
5912 while (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
5913 struct sk_buff *skb;
5914 BT_DBG("Searching for skb with txseq %d (queue len %d)",
5915 chan->buffer_seq, skb_queue_len(&chan->srej_q));
5916
5917 skb = l2cap_ertm_seq_in_queue(&chan->srej_q, chan->buffer_seq);
5918
5919 if (!skb)
5920 break;
5921
5922 skb_unlink(skb, &chan->srej_q);
5923 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
5924 err = l2cap_reassemble_sdu(chan, skb, &bt_cb(skb)->control);
5925 if (err)
5926 break;
5927 }
5928
5929 if (skb_queue_empty(&chan->srej_q)) {
5930 chan->rx_state = L2CAP_RX_STATE_RECV;
5931 l2cap_send_ack(chan);
5932 }
5933
5934 return err;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005935}
5936
5937static void l2cap_handle_srej(struct l2cap_chan *chan,
5938 struct l2cap_ctrl *control)
5939{
Mat Martineauf80842a2012-05-17 20:53:46 -07005940 struct sk_buff *skb;
5941
5942 BT_DBG("chan %p, control %p", chan, control);
5943
5944 if (control->reqseq == chan->next_tx_seq) {
5945 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005946 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005947 return;
5948 }
5949
5950 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
5951
5952 if (skb == NULL) {
5953 BT_DBG("Seq %d not available for retransmission",
5954 control->reqseq);
5955 return;
5956 }
5957
5958 if (chan->max_tx != 0 && bt_cb(skb)->control.retries >= chan->max_tx) {
5959 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005960 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005961 return;
5962 }
5963
5964 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
5965
5966 if (control->poll) {
5967 l2cap_pass_to_tx(chan, control);
5968
5969 set_bit(CONN_SEND_FBIT, &chan->conn_state);
5970 l2cap_retransmit(chan, control);
5971 l2cap_ertm_send(chan);
5972
5973 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5974 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5975 chan->srej_save_reqseq = control->reqseq;
5976 }
5977 } else {
5978 l2cap_pass_to_tx_fbit(chan, control);
5979
5980 if (control->final) {
5981 if (chan->srej_save_reqseq != control->reqseq ||
5982 !test_and_clear_bit(CONN_SREJ_ACT,
5983 &chan->conn_state))
5984 l2cap_retransmit(chan, control);
5985 } else {
5986 l2cap_retransmit(chan, control);
5987 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5988 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5989 chan->srej_save_reqseq = control->reqseq;
5990 }
5991 }
5992 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005993}
5994
5995static void l2cap_handle_rej(struct l2cap_chan *chan,
5996 struct l2cap_ctrl *control)
5997{
Mat Martineaufcd289d2012-05-17 20:53:47 -07005998 struct sk_buff *skb;
5999
6000 BT_DBG("chan %p, control %p", chan, control);
6001
6002 if (control->reqseq == chan->next_tx_seq) {
6003 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006004 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07006005 return;
6006 }
6007
6008 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
6009
6010 if (chan->max_tx && skb &&
6011 bt_cb(skb)->control.retries >= chan->max_tx) {
6012 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006013 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07006014 return;
6015 }
6016
6017 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6018
6019 l2cap_pass_to_tx(chan, control);
6020
6021 if (control->final) {
6022 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state))
6023 l2cap_retransmit_all(chan, control);
6024 } else {
6025 l2cap_retransmit_all(chan, control);
6026 l2cap_ertm_send(chan);
6027 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F)
6028 set_bit(CONN_REJ_ACT, &chan->conn_state);
6029 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006030}
6031
Mat Martineau4b51dae92012-05-17 20:53:37 -07006032static u8 l2cap_classify_txseq(struct l2cap_chan *chan, u16 txseq)
6033{
6034 BT_DBG("chan %p, txseq %d", chan, txseq);
6035
6036 BT_DBG("last_acked_seq %d, expected_tx_seq %d", chan->last_acked_seq,
6037 chan->expected_tx_seq);
6038
6039 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
6040 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
Gustavo Padovan2d792812012-10-06 10:07:01 +01006041 chan->tx_win) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07006042 /* See notes below regarding "double poll" and
6043 * invalid packets.
6044 */
6045 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
6046 BT_DBG("Invalid/Ignore - after SREJ");
6047 return L2CAP_TXSEQ_INVALID_IGNORE;
6048 } else {
6049 BT_DBG("Invalid - in window after SREJ sent");
6050 return L2CAP_TXSEQ_INVALID;
6051 }
6052 }
6053
6054 if (chan->srej_list.head == txseq) {
6055 BT_DBG("Expected SREJ");
6056 return L2CAP_TXSEQ_EXPECTED_SREJ;
6057 }
6058
6059 if (l2cap_ertm_seq_in_queue(&chan->srej_q, txseq)) {
6060 BT_DBG("Duplicate SREJ - txseq already stored");
6061 return L2CAP_TXSEQ_DUPLICATE_SREJ;
6062 }
6063
6064 if (l2cap_seq_list_contains(&chan->srej_list, txseq)) {
6065 BT_DBG("Unexpected SREJ - not requested");
6066 return L2CAP_TXSEQ_UNEXPECTED_SREJ;
6067 }
6068 }
6069
6070 if (chan->expected_tx_seq == txseq) {
6071 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
6072 chan->tx_win) {
6073 BT_DBG("Invalid - txseq outside tx window");
6074 return L2CAP_TXSEQ_INVALID;
6075 } else {
6076 BT_DBG("Expected");
6077 return L2CAP_TXSEQ_EXPECTED;
6078 }
6079 }
6080
6081 if (__seq_offset(chan, txseq, chan->last_acked_seq) <
Gustavo Padovan2d792812012-10-06 10:07:01 +01006082 __seq_offset(chan, chan->expected_tx_seq, chan->last_acked_seq)) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07006083 BT_DBG("Duplicate - expected_tx_seq later than txseq");
6084 return L2CAP_TXSEQ_DUPLICATE;
6085 }
6086
6087 if (__seq_offset(chan, txseq, chan->last_acked_seq) >= chan->tx_win) {
6088 /* A source of invalid packets is a "double poll" condition,
6089 * where delays cause us to send multiple poll packets. If
6090 * the remote stack receives and processes both polls,
6091 * sequence numbers can wrap around in such a way that a
6092 * resent frame has a sequence number that looks like new data
6093 * with a sequence gap. This would trigger an erroneous SREJ
6094 * request.
6095 *
6096 * Fortunately, this is impossible with a tx window that's
6097 * less than half of the maximum sequence number, which allows
6098 * invalid frames to be safely ignored.
6099 *
6100 * With tx window sizes greater than half of the tx window
6101 * maximum, the frame is invalid and cannot be ignored. This
6102 * causes a disconnect.
6103 */
6104
6105 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
6106 BT_DBG("Invalid/Ignore - txseq outside tx window");
6107 return L2CAP_TXSEQ_INVALID_IGNORE;
6108 } else {
6109 BT_DBG("Invalid - txseq outside tx window");
6110 return L2CAP_TXSEQ_INVALID;
6111 }
6112 } else {
6113 BT_DBG("Unexpected - txseq indicates missing frames");
6114 return L2CAP_TXSEQ_UNEXPECTED;
6115 }
6116}
6117
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006118static int l2cap_rx_state_recv(struct l2cap_chan *chan,
6119 struct l2cap_ctrl *control,
6120 struct sk_buff *skb, u8 event)
6121{
6122 int err = 0;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006123 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006124
6125 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6126 event);
6127
6128 switch (event) {
6129 case L2CAP_EV_RECV_IFRAME:
6130 switch (l2cap_classify_txseq(chan, control->txseq)) {
6131 case L2CAP_TXSEQ_EXPECTED:
6132 l2cap_pass_to_tx(chan, control);
6133
6134 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6135 BT_DBG("Busy, discarding expected seq %d",
6136 control->txseq);
6137 break;
6138 }
6139
6140 chan->expected_tx_seq = __next_seq(chan,
6141 control->txseq);
6142
6143 chan->buffer_seq = chan->expected_tx_seq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006144 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006145
6146 err = l2cap_reassemble_sdu(chan, skb, control);
6147 if (err)
6148 break;
6149
6150 if (control->final) {
6151 if (!test_and_clear_bit(CONN_REJ_ACT,
6152 &chan->conn_state)) {
6153 control->final = 0;
6154 l2cap_retransmit_all(chan, control);
6155 l2cap_ertm_send(chan);
6156 }
6157 }
6158
6159 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
6160 l2cap_send_ack(chan);
6161 break;
6162 case L2CAP_TXSEQ_UNEXPECTED:
6163 l2cap_pass_to_tx(chan, control);
6164
6165 /* Can't issue SREJ frames in the local busy state.
6166 * Drop this frame, it will be seen as missing
6167 * when local busy is exited.
6168 */
6169 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6170 BT_DBG("Busy, discarding unexpected seq %d",
6171 control->txseq);
6172 break;
6173 }
6174
6175 /* There was a gap in the sequence, so an SREJ
6176 * must be sent for each missing frame. The
6177 * current frame is stored for later use.
6178 */
6179 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006180 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006181 BT_DBG("Queued %p (queue len %d)", skb,
6182 skb_queue_len(&chan->srej_q));
6183
6184 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
6185 l2cap_seq_list_clear(&chan->srej_list);
6186 l2cap_send_srej(chan, control->txseq);
6187
6188 chan->rx_state = L2CAP_RX_STATE_SREJ_SENT;
6189 break;
6190 case L2CAP_TXSEQ_DUPLICATE:
6191 l2cap_pass_to_tx(chan, control);
6192 break;
6193 case L2CAP_TXSEQ_INVALID_IGNORE:
6194 break;
6195 case L2CAP_TXSEQ_INVALID:
6196 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006197 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006198 break;
6199 }
6200 break;
6201 case L2CAP_EV_RECV_RR:
6202 l2cap_pass_to_tx(chan, control);
6203 if (control->final) {
6204 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6205
Mat Martineaue6a3ee62012-10-23 15:24:22 -07006206 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state) &&
6207 !__chan_is_moving(chan)) {
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006208 control->final = 0;
6209 l2cap_retransmit_all(chan, control);
6210 }
6211
6212 l2cap_ertm_send(chan);
6213 } else if (control->poll) {
6214 l2cap_send_i_or_rr_or_rnr(chan);
6215 } else {
6216 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6217 &chan->conn_state) &&
6218 chan->unacked_frames)
6219 __set_retrans_timer(chan);
6220
6221 l2cap_ertm_send(chan);
6222 }
6223 break;
6224 case L2CAP_EV_RECV_RNR:
6225 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6226 l2cap_pass_to_tx(chan, control);
6227 if (control && control->poll) {
6228 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6229 l2cap_send_rr_or_rnr(chan, 0);
6230 }
6231 __clear_retrans_timer(chan);
6232 l2cap_seq_list_clear(&chan->retrans_list);
6233 break;
6234 case L2CAP_EV_RECV_REJ:
6235 l2cap_handle_rej(chan, control);
6236 break;
6237 case L2CAP_EV_RECV_SREJ:
6238 l2cap_handle_srej(chan, control);
6239 break;
6240 default:
6241 break;
6242 }
6243
6244 if (skb && !skb_in_use) {
6245 BT_DBG("Freeing %p", skb);
6246 kfree_skb(skb);
6247 }
6248
6249 return err;
6250}
6251
6252static int l2cap_rx_state_srej_sent(struct l2cap_chan *chan,
6253 struct l2cap_ctrl *control,
6254 struct sk_buff *skb, u8 event)
6255{
6256 int err = 0;
6257 u16 txseq = control->txseq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006258 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006259
6260 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6261 event);
6262
6263 switch (event) {
6264 case L2CAP_EV_RECV_IFRAME:
6265 switch (l2cap_classify_txseq(chan, txseq)) {
6266 case L2CAP_TXSEQ_EXPECTED:
6267 /* Keep frame for reassembly later */
6268 l2cap_pass_to_tx(chan, control);
6269 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006270 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006271 BT_DBG("Queued %p (queue len %d)", skb,
6272 skb_queue_len(&chan->srej_q));
6273
6274 chan->expected_tx_seq = __next_seq(chan, txseq);
6275 break;
6276 case L2CAP_TXSEQ_EXPECTED_SREJ:
6277 l2cap_seq_list_pop(&chan->srej_list);
6278
6279 l2cap_pass_to_tx(chan, control);
6280 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006281 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006282 BT_DBG("Queued %p (queue len %d)", skb,
6283 skb_queue_len(&chan->srej_q));
6284
6285 err = l2cap_rx_queued_iframes(chan);
6286 if (err)
6287 break;
6288
6289 break;
6290 case L2CAP_TXSEQ_UNEXPECTED:
6291 /* Got a frame that can't be reassembled yet.
6292 * Save it for later, and send SREJs to cover
6293 * the missing frames.
6294 */
6295 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006296 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006297 BT_DBG("Queued %p (queue len %d)", skb,
6298 skb_queue_len(&chan->srej_q));
6299
6300 l2cap_pass_to_tx(chan, control);
6301 l2cap_send_srej(chan, control->txseq);
6302 break;
6303 case L2CAP_TXSEQ_UNEXPECTED_SREJ:
6304 /* This frame was requested with an SREJ, but
6305 * some expected retransmitted frames are
6306 * missing. Request retransmission of missing
6307 * SREJ'd frames.
6308 */
6309 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006310 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006311 BT_DBG("Queued %p (queue len %d)", skb,
6312 skb_queue_len(&chan->srej_q));
6313
6314 l2cap_pass_to_tx(chan, control);
6315 l2cap_send_srej_list(chan, control->txseq);
6316 break;
6317 case L2CAP_TXSEQ_DUPLICATE_SREJ:
6318 /* We've already queued this frame. Drop this copy. */
6319 l2cap_pass_to_tx(chan, control);
6320 break;
6321 case L2CAP_TXSEQ_DUPLICATE:
6322 /* Expecting a later sequence number, so this frame
6323 * was already received. Ignore it completely.
6324 */
6325 break;
6326 case L2CAP_TXSEQ_INVALID_IGNORE:
6327 break;
6328 case L2CAP_TXSEQ_INVALID:
6329 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006330 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006331 break;
6332 }
6333 break;
6334 case L2CAP_EV_RECV_RR:
6335 l2cap_pass_to_tx(chan, control);
6336 if (control->final) {
6337 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6338
6339 if (!test_and_clear_bit(CONN_REJ_ACT,
6340 &chan->conn_state)) {
6341 control->final = 0;
6342 l2cap_retransmit_all(chan, control);
6343 }
6344
6345 l2cap_ertm_send(chan);
6346 } else if (control->poll) {
6347 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6348 &chan->conn_state) &&
6349 chan->unacked_frames) {
6350 __set_retrans_timer(chan);
6351 }
6352
6353 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6354 l2cap_send_srej_tail(chan);
6355 } else {
6356 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6357 &chan->conn_state) &&
6358 chan->unacked_frames)
6359 __set_retrans_timer(chan);
6360
6361 l2cap_send_ack(chan);
6362 }
6363 break;
6364 case L2CAP_EV_RECV_RNR:
6365 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6366 l2cap_pass_to_tx(chan, control);
6367 if (control->poll) {
6368 l2cap_send_srej_tail(chan);
6369 } else {
6370 struct l2cap_ctrl rr_control;
6371 memset(&rr_control, 0, sizeof(rr_control));
6372 rr_control.sframe = 1;
6373 rr_control.super = L2CAP_SUPER_RR;
6374 rr_control.reqseq = chan->buffer_seq;
6375 l2cap_send_sframe(chan, &rr_control);
6376 }
6377
6378 break;
6379 case L2CAP_EV_RECV_REJ:
6380 l2cap_handle_rej(chan, control);
6381 break;
6382 case L2CAP_EV_RECV_SREJ:
6383 l2cap_handle_srej(chan, control);
6384 break;
6385 }
6386
6387 if (skb && !skb_in_use) {
6388 BT_DBG("Freeing %p", skb);
6389 kfree_skb(skb);
6390 }
6391
6392 return err;
6393}
6394
Mat Martineau32b32732012-10-23 15:24:11 -07006395static int l2cap_finish_move(struct l2cap_chan *chan)
6396{
6397 BT_DBG("chan %p", chan);
6398
6399 chan->rx_state = L2CAP_RX_STATE_RECV;
6400
6401 if (chan->hs_hcon)
6402 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6403 else
6404 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6405
6406 return l2cap_resegment(chan);
6407}
6408
6409static int l2cap_rx_state_wait_p(struct l2cap_chan *chan,
6410 struct l2cap_ctrl *control,
6411 struct sk_buff *skb, u8 event)
6412{
6413 int err;
6414
6415 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6416 event);
6417
6418 if (!control->poll)
6419 return -EPROTO;
6420
6421 l2cap_process_reqseq(chan, control->reqseq);
6422
6423 if (!skb_queue_empty(&chan->tx_q))
6424 chan->tx_send_head = skb_peek(&chan->tx_q);
6425 else
6426 chan->tx_send_head = NULL;
6427
6428 /* Rewind next_tx_seq to the point expected
6429 * by the receiver.
6430 */
6431 chan->next_tx_seq = control->reqseq;
6432 chan->unacked_frames = 0;
6433
6434 err = l2cap_finish_move(chan);
6435 if (err)
6436 return err;
6437
6438 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6439 l2cap_send_i_or_rr_or_rnr(chan);
6440
6441 if (event == L2CAP_EV_RECV_IFRAME)
6442 return -EPROTO;
6443
6444 return l2cap_rx_state_recv(chan, control, NULL, event);
6445}
6446
6447static int l2cap_rx_state_wait_f(struct l2cap_chan *chan,
6448 struct l2cap_ctrl *control,
6449 struct sk_buff *skb, u8 event)
6450{
6451 int err;
6452
6453 if (!control->final)
6454 return -EPROTO;
6455
6456 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6457
6458 chan->rx_state = L2CAP_RX_STATE_RECV;
6459 l2cap_process_reqseq(chan, control->reqseq);
6460
6461 if (!skb_queue_empty(&chan->tx_q))
6462 chan->tx_send_head = skb_peek(&chan->tx_q);
6463 else
6464 chan->tx_send_head = NULL;
6465
6466 /* Rewind next_tx_seq to the point expected
6467 * by the receiver.
6468 */
6469 chan->next_tx_seq = control->reqseq;
6470 chan->unacked_frames = 0;
6471
6472 if (chan->hs_hcon)
6473 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6474 else
6475 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6476
6477 err = l2cap_resegment(chan);
6478
6479 if (!err)
6480 err = l2cap_rx_state_recv(chan, control, skb, event);
6481
6482 return err;
6483}
6484
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006485static bool __valid_reqseq(struct l2cap_chan *chan, u16 reqseq)
6486{
6487 /* Make sure reqseq is for a packet that has been sent but not acked */
6488 u16 unacked;
6489
6490 unacked = __seq_offset(chan, chan->next_tx_seq, chan->expected_ack_seq);
6491 return __seq_offset(chan, chan->next_tx_seq, reqseq) <= unacked;
6492}
6493
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006494static int l2cap_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6495 struct sk_buff *skb, u8 event)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006496{
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006497 int err = 0;
6498
6499 BT_DBG("chan %p, control %p, skb %p, event %d, state %d", chan,
6500 control, skb, event, chan->rx_state);
6501
6502 if (__valid_reqseq(chan, control->reqseq)) {
6503 switch (chan->rx_state) {
6504 case L2CAP_RX_STATE_RECV:
6505 err = l2cap_rx_state_recv(chan, control, skb, event);
6506 break;
6507 case L2CAP_RX_STATE_SREJ_SENT:
6508 err = l2cap_rx_state_srej_sent(chan, control, skb,
6509 event);
6510 break;
Mat Martineau32b32732012-10-23 15:24:11 -07006511 case L2CAP_RX_STATE_WAIT_P:
6512 err = l2cap_rx_state_wait_p(chan, control, skb, event);
6513 break;
6514 case L2CAP_RX_STATE_WAIT_F:
6515 err = l2cap_rx_state_wait_f(chan, control, skb, event);
6516 break;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006517 default:
6518 /* shut it down */
6519 break;
6520 }
6521 } else {
6522 BT_DBG("Invalid reqseq %d (next_tx_seq %d, expected_ack_seq %d",
6523 control->reqseq, chan->next_tx_seq,
6524 chan->expected_ack_seq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006525 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006526 }
6527
6528 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006529}
6530
6531static int l2cap_stream_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6532 struct sk_buff *skb)
6533{
Mat Martineau4b51dae92012-05-17 20:53:37 -07006534 int err = 0;
6535
6536 BT_DBG("chan %p, control %p, skb %p, state %d", chan, control, skb,
6537 chan->rx_state);
6538
6539 if (l2cap_classify_txseq(chan, control->txseq) ==
6540 L2CAP_TXSEQ_EXPECTED) {
6541 l2cap_pass_to_tx(chan, control);
6542
6543 BT_DBG("buffer_seq %d->%d", chan->buffer_seq,
6544 __next_seq(chan, chan->buffer_seq));
6545
6546 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
6547
6548 l2cap_reassemble_sdu(chan, skb, control);
6549 } else {
6550 if (chan->sdu) {
6551 kfree_skb(chan->sdu);
6552 chan->sdu = NULL;
6553 }
6554 chan->sdu_last_frag = NULL;
6555 chan->sdu_len = 0;
6556
6557 if (skb) {
6558 BT_DBG("Freeing %p", skb);
6559 kfree_skb(skb);
6560 }
6561 }
6562
6563 chan->last_acked_seq = control->txseq;
6564 chan->expected_tx_seq = __next_seq(chan, control->txseq);
6565
6566 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006567}
6568
6569static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6570{
6571 struct l2cap_ctrl *control = &bt_cb(skb)->control;
6572 u16 len;
6573 u8 event;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006574
Mat Martineaub76bbd62012-04-11 10:48:43 -07006575 __unpack_control(chan, skb);
6576
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006577 len = skb->len;
6578
6579 /*
6580 * We can just drop the corrupted I-frame here.
6581 * Receiver will miss it and start proper recovery
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006582 * procedures and ask for retransmission.
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006583 */
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006584 if (l2cap_check_fcs(chan, skb))
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006585 goto drop;
6586
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006587 if (!control->sframe && control->sar == L2CAP_SAR_START)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006588 len -= L2CAP_SDULEN_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006589
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006590 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006591 len -= L2CAP_FCS_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006592
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006593 if (len > chan->mps) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006594 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006595 goto drop;
6596 }
6597
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006598 if (!control->sframe) {
6599 int err;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006600
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006601 BT_DBG("iframe sar %d, reqseq %d, final %d, txseq %d",
6602 control->sar, control->reqseq, control->final,
6603 control->txseq);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03006604
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006605 /* Validate F-bit - F=0 always valid, F=1 only
6606 * valid in TX WAIT_F
6607 */
6608 if (control->final && chan->tx_state != L2CAP_TX_STATE_WAIT_F)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006609 goto drop;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006610
6611 if (chan->mode != L2CAP_MODE_STREAMING) {
6612 event = L2CAP_EV_RECV_IFRAME;
6613 err = l2cap_rx(chan, control, skb, event);
6614 } else {
6615 err = l2cap_stream_rx(chan, control, skb);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006616 }
6617
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006618 if (err)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006619 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006620 } else {
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006621 const u8 rx_func_to_event[4] = {
6622 L2CAP_EV_RECV_RR, L2CAP_EV_RECV_REJ,
6623 L2CAP_EV_RECV_RNR, L2CAP_EV_RECV_SREJ
6624 };
6625
6626 /* Only I-frames are expected in streaming mode */
6627 if (chan->mode == L2CAP_MODE_STREAMING)
6628 goto drop;
6629
6630 BT_DBG("sframe reqseq %d, final %d, poll %d, super %d",
6631 control->reqseq, control->final, control->poll,
6632 control->super);
6633
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006634 if (len != 0) {
Andrei Emeltchenko1bb166e2012-11-20 17:16:21 +02006635 BT_ERR("Trailing bytes: %d in sframe", len);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006636 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006637 goto drop;
6638 }
6639
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006640 /* Validate F and P bits */
6641 if (control->final && (control->poll ||
6642 chan->tx_state != L2CAP_TX_STATE_WAIT_F))
6643 goto drop;
6644
6645 event = rx_func_to_event[control->super];
6646 if (l2cap_rx(chan, control, skb, event))
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006647 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006648 }
6649
6650 return 0;
6651
6652drop:
6653 kfree_skb(skb);
6654 return 0;
6655}
6656
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006657static void l2cap_chan_le_send_credits(struct l2cap_chan *chan)
6658{
6659 struct l2cap_conn *conn = chan->conn;
6660 struct l2cap_le_credits pkt;
6661 u16 return_credits;
6662
6663 /* We return more credits to the sender only after the amount of
6664 * credits falls below half of the initial amount.
6665 */
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02006666 if (chan->rx_credits >= (le_max_credits + 1) / 2)
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006667 return;
6668
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02006669 return_credits = le_max_credits - chan->rx_credits;
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006670
6671 BT_DBG("chan %p returning %u credits to sender", chan, return_credits);
6672
6673 chan->rx_credits += return_credits;
6674
6675 pkt.cid = cpu_to_le16(chan->scid);
6676 pkt.credits = cpu_to_le16(return_credits);
6677
6678 chan->ident = l2cap_get_ident(conn);
6679
6680 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CREDITS, sizeof(pkt), &pkt);
6681}
6682
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006683static int l2cap_le_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6684{
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006685 int err;
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006686
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006687 if (!chan->rx_credits) {
6688 BT_ERR("No credits to receive LE L2CAP data");
Johan Hedbergdfd97742014-01-27 15:11:34 -08006689 l2cap_send_disconn_req(chan, ECONNRESET);
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006690 return -ENOBUFS;
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006691 }
6692
6693 if (chan->imtu < skb->len) {
6694 BT_ERR("Too big LE L2CAP PDU");
6695 return -ENOBUFS;
6696 }
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006697
6698 chan->rx_credits--;
6699 BT_DBG("rx_credits %u -> %u", chan->rx_credits + 1, chan->rx_credits);
6700
6701 l2cap_chan_le_send_credits(chan);
6702
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006703 err = 0;
6704
6705 if (!chan->sdu) {
6706 u16 sdu_len;
6707
6708 sdu_len = get_unaligned_le16(skb->data);
6709 skb_pull(skb, L2CAP_SDULEN_SIZE);
6710
6711 BT_DBG("Start of new SDU. sdu_len %u skb->len %u imtu %u",
6712 sdu_len, skb->len, chan->imtu);
6713
6714 if (sdu_len > chan->imtu) {
6715 BT_ERR("Too big LE L2CAP SDU length received");
6716 err = -EMSGSIZE;
6717 goto failed;
6718 }
6719
6720 if (skb->len > sdu_len) {
6721 BT_ERR("Too much LE L2CAP data received");
6722 err = -EINVAL;
6723 goto failed;
6724 }
6725
6726 if (skb->len == sdu_len)
6727 return chan->ops->recv(chan, skb);
6728
6729 chan->sdu = skb;
6730 chan->sdu_len = sdu_len;
6731 chan->sdu_last_frag = skb;
6732
6733 return 0;
6734 }
6735
6736 BT_DBG("SDU fragment. chan->sdu->len %u skb->len %u chan->sdu_len %u",
6737 chan->sdu->len, skb->len, chan->sdu_len);
6738
6739 if (chan->sdu->len + skb->len > chan->sdu_len) {
6740 BT_ERR("Too much LE L2CAP data received");
6741 err = -EINVAL;
6742 goto failed;
6743 }
6744
6745 append_skb_frag(chan->sdu, skb, &chan->sdu_last_frag);
6746 skb = NULL;
6747
6748 if (chan->sdu->len == chan->sdu_len) {
6749 err = chan->ops->recv(chan, chan->sdu);
6750 if (!err) {
6751 chan->sdu = NULL;
6752 chan->sdu_last_frag = NULL;
6753 chan->sdu_len = 0;
6754 }
6755 }
6756
6757failed:
6758 if (err) {
6759 kfree_skb(skb);
6760 kfree_skb(chan->sdu);
6761 chan->sdu = NULL;
6762 chan->sdu_last_frag = NULL;
6763 chan->sdu_len = 0;
6764 }
6765
6766 /* We can't return an error here since we took care of the skb
6767 * freeing internally. An error return would cause the caller to
6768 * do a double-free of the skb.
6769 */
6770 return 0;
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006771}
6772
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006773static void l2cap_data_channel(struct l2cap_conn *conn, u16 cid,
6774 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006775{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006776 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006777
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03006778 chan = l2cap_get_chan_by_scid(conn, cid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006779 if (!chan) {
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006780 if (cid == L2CAP_CID_A2MP) {
6781 chan = a2mp_channel_create(conn, skb);
6782 if (!chan) {
6783 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006784 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006785 }
6786
6787 l2cap_chan_lock(chan);
6788 } else {
6789 BT_DBG("unknown cid 0x%4.4x", cid);
6790 /* Drop packet and return */
6791 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006792 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006793 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006794 }
6795
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03006796 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006797
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03006798 if (chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006799 goto drop;
6800
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006801 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03006802 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006803 if (l2cap_le_data_rcv(chan, skb) < 0)
6804 goto drop;
6805
6806 goto done;
6807
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006808 case L2CAP_MODE_BASIC:
6809 /* If socket recv buffers overflows we drop data here
6810 * which is *bad* because L2CAP has to be reliable.
6811 * But we don't have any other choice. L2CAP doesn't
6812 * provide flow control mechanism. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07006813
Szymon Janc2c96e032014-02-18 20:48:34 +01006814 if (chan->imtu < skb->len) {
6815 BT_ERR("Dropping L2CAP data: receive buffer overflow");
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006816 goto drop;
Szymon Janc2c96e032014-02-18 20:48:34 +01006817 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006818
Gustavo Padovan80b98022012-05-27 22:27:51 -03006819 if (!chan->ops->recv(chan, skb))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006820 goto done;
6821 break;
6822
6823 case L2CAP_MODE_ERTM:
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006824 case L2CAP_MODE_STREAMING:
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006825 l2cap_data_rcv(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006826 goto done;
6827
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006828 default:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006829 BT_DBG("chan %p: bad mode 0x%2.2x", chan, chan->mode);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006830 break;
6831 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006832
6833drop:
6834 kfree_skb(skb);
6835
6836done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006837 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006838}
6839
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006840static void l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm,
6841 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006842{
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006843 struct hci_conn *hcon = conn->hcon;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006844 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006845
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006846 if (hcon->type != ACL_LINK)
6847 goto drop;
6848
Johan Hedbergbf20fd42013-05-14 13:23:13 +03006849 chan = l2cap_global_chan_by_psm(0, psm, &hcon->src, &hcon->dst,
6850 ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006851 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006852 goto drop;
6853
Andrei Emeltchenko5b4ceda2012-02-24 16:35:32 +02006854 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006855
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03006856 if (chan->state != BT_BOUND && chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006857 goto drop;
6858
Vinicius Costa Gomese13e21d2011-06-17 22:46:27 -03006859 if (chan->imtu < skb->len)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006860 goto drop;
6861
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006862 /* Store remote BD_ADDR and PSM for msg_name */
Marcel Holtmann06ae3312013-10-18 03:43:00 -07006863 bacpy(&bt_cb(skb)->bdaddr, &hcon->dst);
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006864 bt_cb(skb)->psm = psm;
6865
Gustavo Padovan80b98022012-05-27 22:27:51 -03006866 if (!chan->ops->recv(chan, skb))
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006867 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006868
6869drop:
6870 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006871}
6872
Marcel Holtmann72f78352013-04-23 00:59:00 -07006873static void l2cap_att_channel(struct l2cap_conn *conn,
Andrei Emeltchenko6810fca2012-05-31 11:18:57 +03006874 struct sk_buff *skb)
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006875{
Marcel Holtmannb99707d2013-10-03 02:54:11 -07006876 struct hci_conn *hcon = conn->hcon;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006877 struct l2cap_chan *chan;
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006878
Marcel Holtmannb99707d2013-10-03 02:54:11 -07006879 if (hcon->type != LE_LINK)
6880 goto drop;
6881
Johan Hedbergaf1c0132013-04-29 19:35:42 +03006882 chan = l2cap_global_chan_by_scid(BT_CONNECTED, L2CAP_CID_ATT,
Marcel Holtmann06ae3312013-10-18 03:43:00 -07006883 &hcon->src, &hcon->dst);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006884 if (!chan)
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006885 goto drop;
6886
Andrei Emeltchenko5b4ceda2012-02-24 16:35:32 +02006887 BT_DBG("chan %p, len %d", chan, skb->len);
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006888
Vinicius Costa Gomese13e21d2011-06-17 22:46:27 -03006889 if (chan->imtu < skb->len)
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006890 goto drop;
6891
Gustavo Padovan80b98022012-05-27 22:27:51 -03006892 if (!chan->ops->recv(chan, skb))
Andrei Emeltchenko6810fca2012-05-31 11:18:57 +03006893 return;
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006894
6895drop:
6896 kfree_skb(skb);
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006897}
6898
Linus Torvalds1da177e2005-04-16 15:20:36 -07006899static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb)
6900{
6901 struct l2cap_hdr *lh = (void *) skb->data;
Johan Hedberg61a939c2014-01-17 20:45:11 +02006902 struct hci_conn *hcon = conn->hcon;
Al Viro8e036fc2007-07-29 00:16:36 -07006903 u16 cid, len;
6904 __le16 psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006905
Johan Hedberg61a939c2014-01-17 20:45:11 +02006906 if (hcon->state != BT_CONNECTED) {
6907 BT_DBG("queueing pending rx skb");
6908 skb_queue_tail(&conn->pending_rx, skb);
6909 return;
6910 }
6911
Linus Torvalds1da177e2005-04-16 15:20:36 -07006912 skb_pull(skb, L2CAP_HDR_SIZE);
6913 cid = __le16_to_cpu(lh->cid);
6914 len = __le16_to_cpu(lh->len);
6915
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006916 if (len != skb->len) {
6917 kfree_skb(skb);
6918 return;
6919 }
6920
Johan Hedberg9e1d7e12014-07-06 11:03:36 +03006921 /* Since we can't actively block incoming LE connections we must
6922 * at least ensure that we ignore incoming data from them.
6923 */
6924 if (hcon->type == LE_LINK &&
Johan Hedbergdcc36c12014-07-09 12:59:13 +03006925 hci_bdaddr_list_lookup(&hcon->hdev->blacklist, &hcon->dst,
6926 bdaddr_type(hcon, hcon->dst_type))) {
Johan Hedberge4931502014-07-02 09:36:21 +03006927 kfree_skb(skb);
6928 return;
6929 }
6930
Linus Torvalds1da177e2005-04-16 15:20:36 -07006931 BT_DBG("len %d, cid 0x%4.4x", len, cid);
6932
6933 switch (cid) {
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006934 case L2CAP_CID_SIGNALING:
Linus Torvalds1da177e2005-04-16 15:20:36 -07006935 l2cap_sig_channel(conn, skb);
6936 break;
6937
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006938 case L2CAP_CID_CONN_LESS:
Andrei Emeltchenko097db762012-03-09 14:16:17 +02006939 psm = get_unaligned((__le16 *) skb->data);
Andrei Emeltchenko0181a702012-05-29 10:04:05 +03006940 skb_pull(skb, L2CAP_PSMLEN_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006941 l2cap_conless_channel(conn, psm, skb);
6942 break;
6943
Johan Hedberg073d1cf2013-04-29 19:35:35 +03006944 case L2CAP_CID_ATT:
Marcel Holtmann72f78352013-04-23 00:59:00 -07006945 l2cap_att_channel(conn, skb);
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006946 break;
6947
Marcel Holtmanna2877622013-10-02 23:46:54 -07006948 case L2CAP_CID_LE_SIGNALING:
6949 l2cap_le_sig_channel(conn, skb);
6950 break;
6951
Anderson Brigliab501d6a2011-06-07 18:46:31 -03006952 case L2CAP_CID_SMP:
6953 if (smp_sig_channel(conn, skb))
6954 l2cap_conn_del(conn->hcon, EACCES);
6955 break;
6956
Linus Torvalds1da177e2005-04-16 15:20:36 -07006957 default:
6958 l2cap_data_channel(conn, cid, skb);
6959 break;
6960 }
6961}
6962
Johan Hedberg61a939c2014-01-17 20:45:11 +02006963static void process_pending_rx(struct work_struct *work)
6964{
6965 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
6966 pending_rx_work);
6967 struct sk_buff *skb;
6968
6969 BT_DBG("");
6970
6971 while ((skb = skb_dequeue(&conn->pending_rx)))
6972 l2cap_recv_frame(conn, skb);
6973}
6974
Johan Hedberg162b49e2014-01-17 20:45:10 +02006975static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon)
6976{
6977 struct l2cap_conn *conn = hcon->l2cap_data;
6978 struct hci_chan *hchan;
6979
6980 if (conn)
6981 return conn;
6982
6983 hchan = hci_chan_create(hcon);
6984 if (!hchan)
6985 return NULL;
6986
6987 conn = kzalloc(sizeof(struct l2cap_conn), GFP_KERNEL);
6988 if (!conn) {
6989 hci_chan_del(hchan);
6990 return NULL;
6991 }
6992
6993 kref_init(&conn->ref);
6994 hcon->l2cap_data = conn;
6995 conn->hcon = hcon;
6996 hci_conn_get(conn->hcon);
6997 conn->hchan = hchan;
6998
6999 BT_DBG("hcon %p conn %p hchan %p", hcon, conn, hchan);
7000
7001 switch (hcon->type) {
7002 case LE_LINK:
7003 if (hcon->hdev->le_mtu) {
7004 conn->mtu = hcon->hdev->le_mtu;
7005 break;
7006 }
7007 /* fall through */
7008 default:
7009 conn->mtu = hcon->hdev->acl_mtu;
7010 break;
7011 }
7012
7013 conn->feat_mask = 0;
7014
7015 if (hcon->type == ACL_LINK)
7016 conn->hs_enabled = test_bit(HCI_HS_ENABLED,
7017 &hcon->hdev->dev_flags);
7018
Marcel Holtmann5a54e7c2014-07-13 20:50:15 +02007019 mutex_init(&conn->ident_lock);
Johan Hedberg162b49e2014-01-17 20:45:10 +02007020 mutex_init(&conn->chan_lock);
7021
7022 INIT_LIST_HEAD(&conn->chan_l);
7023 INIT_LIST_HEAD(&conn->users);
7024
7025 if (hcon->type == LE_LINK)
7026 INIT_DELAYED_WORK(&conn->security_timer, security_timeout);
7027 else
7028 INIT_DELAYED_WORK(&conn->info_timer, l2cap_info_timeout);
7029
Johan Hedberg61a939c2014-01-17 20:45:11 +02007030 skb_queue_head_init(&conn->pending_rx);
7031 INIT_WORK(&conn->pending_rx_work, process_pending_rx);
7032
Johan Hedberg162b49e2014-01-17 20:45:10 +02007033 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
7034
7035 return conn;
7036}
7037
7038static bool is_valid_psm(u16 psm, u8 dst_type) {
7039 if (!psm)
7040 return false;
7041
7042 if (bdaddr_type_is_le(dst_type))
7043 return (psm <= 0x00ff);
7044
7045 /* PSM must be odd and lsb of upper byte must be 0 */
7046 return ((psm & 0x0101) == 0x0001);
7047}
7048
7049int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
7050 bdaddr_t *dst, u8 dst_type)
7051{
7052 struct l2cap_conn *conn;
7053 struct hci_conn *hcon;
7054 struct hci_dev *hdev;
Johan Hedberg162b49e2014-01-17 20:45:10 +02007055 int err;
7056
7057 BT_DBG("%pMR -> %pMR (type %u) psm 0x%2.2x", &chan->src, dst,
7058 dst_type, __le16_to_cpu(psm));
7059
7060 hdev = hci_get_route(dst, &chan->src);
7061 if (!hdev)
7062 return -EHOSTUNREACH;
7063
7064 hci_dev_lock(hdev);
7065
7066 l2cap_chan_lock(chan);
7067
7068 if (!is_valid_psm(__le16_to_cpu(psm), dst_type) && !cid &&
7069 chan->chan_type != L2CAP_CHAN_RAW) {
7070 err = -EINVAL;
7071 goto done;
7072 }
7073
Johan Hedberg21626e62014-01-24 10:35:41 +02007074 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED && !psm) {
7075 err = -EINVAL;
7076 goto done;
7077 }
7078
7079 if (chan->chan_type == L2CAP_CHAN_FIXED && !cid) {
Johan Hedberg162b49e2014-01-17 20:45:10 +02007080 err = -EINVAL;
7081 goto done;
7082 }
7083
7084 switch (chan->mode) {
7085 case L2CAP_MODE_BASIC:
7086 break;
7087 case L2CAP_MODE_LE_FLOWCTL:
7088 l2cap_le_flowctl_init(chan);
7089 break;
7090 case L2CAP_MODE_ERTM:
7091 case L2CAP_MODE_STREAMING:
7092 if (!disable_ertm)
7093 break;
7094 /* fall through */
7095 default:
7096 err = -ENOTSUPP;
7097 goto done;
7098 }
7099
7100 switch (chan->state) {
7101 case BT_CONNECT:
7102 case BT_CONNECT2:
7103 case BT_CONFIG:
7104 /* Already connecting */
7105 err = 0;
7106 goto done;
7107
7108 case BT_CONNECTED:
7109 /* Already connected */
7110 err = -EISCONN;
7111 goto done;
7112
7113 case BT_OPEN:
7114 case BT_BOUND:
7115 /* Can connect */
7116 break;
7117
7118 default:
7119 err = -EBADFD;
7120 goto done;
7121 }
7122
7123 /* Set destination address and psm */
7124 bacpy(&chan->dst, dst);
7125 chan->dst_type = dst_type;
7126
7127 chan->psm = psm;
7128 chan->dcid = cid;
7129
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007130 if (bdaddr_type_is_le(dst_type)) {
Johan Hedbergcdd62752014-07-07 15:02:28 +03007131 bool master;
7132
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007133 /* Convert from L2CAP channel address type to HCI address type
7134 */
7135 if (dst_type == BDADDR_LE_PUBLIC)
7136 dst_type = ADDR_LE_DEV_PUBLIC;
7137 else
7138 dst_type = ADDR_LE_DEV_RANDOM;
7139
Johan Hedbergcdd62752014-07-07 15:02:28 +03007140 master = !test_bit(HCI_ADVERTISING, &hdev->dev_flags);
7141
Andre Guedes04a6c582014-02-26 20:21:44 -03007142 hcon = hci_connect_le(hdev, dst, dst_type, chan->sec_level,
Johan Hedbergcdd62752014-07-07 15:02:28 +03007143 HCI_LE_CONN_TIMEOUT, master);
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007144 } else {
Johan Hedbergd93375a2014-07-07 15:02:27 +03007145 u8 auth_type = l2cap_get_auth_type(chan);
Andre Guedes04a6c582014-02-26 20:21:44 -03007146 hcon = hci_connect_acl(hdev, dst, chan->sec_level, auth_type);
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007147 }
Johan Hedberg162b49e2014-01-17 20:45:10 +02007148
7149 if (IS_ERR(hcon)) {
7150 err = PTR_ERR(hcon);
7151 goto done;
7152 }
7153
7154 conn = l2cap_conn_add(hcon);
7155 if (!conn) {
7156 hci_conn_drop(hcon);
7157 err = -ENOMEM;
7158 goto done;
7159 }
7160
7161 if (cid && __l2cap_get_chan_by_dcid(conn, cid)) {
7162 hci_conn_drop(hcon);
7163 err = -EBUSY;
7164 goto done;
7165 }
7166
7167 /* Update source addr of the socket */
7168 bacpy(&chan->src, &hcon->src);
7169 chan->src_type = bdaddr_type(hcon, hcon->src_type);
7170
7171 l2cap_chan_unlock(chan);
7172 l2cap_chan_add(conn, chan);
7173 l2cap_chan_lock(chan);
7174
7175 /* l2cap_chan_add takes its own ref so we can drop this one */
7176 hci_conn_drop(hcon);
7177
7178 l2cap_state_change(chan, BT_CONNECT);
7179 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
7180
Johan Hedberg61202e42014-01-28 15:16:48 -08007181 /* Release chan->sport so that it can be reused by other
7182 * sockets (as it's only used for listening sockets).
7183 */
7184 write_lock(&chan_list_lock);
7185 chan->sport = 0;
7186 write_unlock(&chan_list_lock);
7187
Johan Hedberg162b49e2014-01-17 20:45:10 +02007188 if (hcon->state == BT_CONNECTED) {
7189 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
7190 __clear_chan_timer(chan);
7191 if (l2cap_chan_check_security(chan))
7192 l2cap_state_change(chan, BT_CONNECTED);
7193 } else
7194 l2cap_do_start(chan);
7195 }
7196
7197 err = 0;
7198
7199done:
7200 l2cap_chan_unlock(chan);
7201 hci_dev_unlock(hdev);
7202 hci_dev_put(hdev);
7203 return err;
7204}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +03007205EXPORT_SYMBOL_GPL(l2cap_chan_connect);
Johan Hedberg162b49e2014-01-17 20:45:10 +02007206
Linus Torvalds1da177e2005-04-16 15:20:36 -07007207/* ---- L2CAP interface with lower layer (HCI) ---- */
7208
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007209int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007210{
7211 int exact = 0, lm1 = 0, lm2 = 0;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007212 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007213
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03007214 BT_DBG("hdev %s, bdaddr %pMR", hdev->name, bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007215
7216 /* Find listening sockets and check their link_mode */
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007217 read_lock(&chan_list_lock);
7218 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03007219 if (c->state != BT_LISTEN)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007220 continue;
7221
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007222 if (!bacmp(&c->src, &hdev->bdaddr)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007223 lm1 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03007224 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007225 lm1 |= HCI_LM_MASTER;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007226 exact++;
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007227 } else if (!bacmp(&c->src, BDADDR_ANY)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007228 lm2 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03007229 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007230 lm2 |= HCI_LM_MASTER;
7231 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007232 }
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007233 read_unlock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007234
7235 return exact ? lm1 : lm2;
7236}
7237
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03007238void l2cap_connect_cfm(struct hci_conn *hcon, u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007239{
Marcel Holtmann01394182006-07-03 10:02:46 +02007240 struct l2cap_conn *conn;
7241
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03007242 BT_DBG("hcon %p bdaddr %pMR status %d", hcon, &hcon->dst, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007243
Linus Torvalds1da177e2005-04-16 15:20:36 -07007244 if (!status) {
Claudio Takahasibaf43252013-04-11 13:55:50 -03007245 conn = l2cap_conn_add(hcon);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007246 if (conn)
7247 l2cap_conn_ready(conn);
Andrei Emeltchenkoba6fc312012-10-31 15:46:26 +02007248 } else {
Joe Perchese1750722011-06-29 18:18:29 -07007249 l2cap_conn_del(hcon, bt_to_errno(status));
Andrei Emeltchenkoba6fc312012-10-31 15:46:26 +02007250 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007251}
7252
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007253int l2cap_disconn_ind(struct hci_conn *hcon)
Marcel Holtmann2950f212009-02-12 14:02:50 +01007254{
7255 struct l2cap_conn *conn = hcon->l2cap_data;
7256
7257 BT_DBG("hcon %p", hcon);
7258
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007259 if (!conn)
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02007260 return HCI_ERROR_REMOTE_USER_TERM;
Marcel Holtmann2950f212009-02-12 14:02:50 +01007261 return conn->disc_reason;
7262}
7263
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03007264void l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007265{
7266 BT_DBG("hcon %p reason %d", hcon, reason);
7267
Joe Perchese1750722011-06-29 18:18:29 -07007268 l2cap_conn_del(hcon, bt_to_errno(reason));
Linus Torvalds1da177e2005-04-16 15:20:36 -07007269}
7270
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007271static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt)
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007272{
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03007273 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED)
Marcel Holtmann255c7602009-02-04 21:07:19 +01007274 return;
7275
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007276 if (encrypt == 0x00) {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007277 if (chan->sec_level == BT_SECURITY_MEDIUM) {
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007278 __set_chan_timer(chan, L2CAP_ENC_TIMEOUT);
Marcel Holtmann7d513e92014-01-15 22:37:40 -08007279 } else if (chan->sec_level == BT_SECURITY_HIGH ||
7280 chan->sec_level == BT_SECURITY_FIPS)
Gustavo F. Padovan0f852722011-05-04 19:42:50 -03007281 l2cap_chan_close(chan, ECONNREFUSED);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007282 } else {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007283 if (chan->sec_level == BT_SECURITY_MEDIUM)
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -03007284 __clear_chan_timer(chan);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007285 }
7286}
7287
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007288int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007289{
Marcel Holtmann40be4922008-07-14 20:13:50 +02007290 struct l2cap_conn *conn = hcon->l2cap_data;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03007291 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007292
Marcel Holtmann01394182006-07-03 10:02:46 +02007293 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007294 return 0;
Marcel Holtmann01394182006-07-03 10:02:46 +02007295
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03007296 BT_DBG("conn %p status 0x%2.2x encrypt %u", conn, status, encrypt);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007297
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03007298 if (hcon->type == LE_LINK) {
Hemant Gupta35d4adcc2012-04-18 14:46:26 +05307299 if (!status && encrypt)
Johan Hedberg4bd6d382014-02-26 23:33:45 +02007300 smp_distribute_keys(conn);
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02007301 cancel_delayed_work(&conn->security_timer);
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03007302 }
7303
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007304 mutex_lock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007305
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007306 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007307 l2cap_chan_lock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007308
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03007309 BT_DBG("chan %p scid 0x%4.4x state %s", chan, chan->scid,
7310 state_to_string(chan->state));
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007311
Johan Hedberg2338a7e2014-01-24 10:35:40 +02007312 if (chan->scid == L2CAP_CID_A2MP) {
Andrei Emeltchenko78eb2f92012-07-19 17:03:47 +03007313 l2cap_chan_unlock(chan);
7314 continue;
7315 }
7316
Johan Hedberg073d1cf2013-04-29 19:35:35 +03007317 if (chan->scid == L2CAP_CID_ATT) {
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007318 if (!status && encrypt) {
7319 chan->sec_level = hcon->sec_level;
Andrei Emeltchenkocf4cd002012-02-06 15:03:59 +02007320 l2cap_chan_ready(chan);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007321 }
7322
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007323 l2cap_chan_unlock(chan);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007324 continue;
7325 }
7326
Andrei Emeltchenko96eff462012-11-15 18:14:53 +02007327 if (!__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007328 l2cap_chan_unlock(chan);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01007329 continue;
7330 }
7331
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03007332 if (!status && (chan->state == BT_CONNECTED ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01007333 chan->state == BT_CONFIG)) {
Marcel Holtmannd97c8992013-10-14 02:53:54 -07007334 chan->ops->resume(chan);
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007335 l2cap_check_encryption(chan, encrypt);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007336 l2cap_chan_unlock(chan);
Marcel Holtmann9719f8a2008-07-14 20:13:45 +02007337 continue;
7338 }
7339
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03007340 if (chan->state == BT_CONNECT) {
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007341 if (!status)
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03007342 l2cap_start_connection(chan);
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007343 else
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007344 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03007345 } else if (chan->state == BT_CONNECT2) {
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007346 struct l2cap_conn_rsp rsp;
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007347 __u16 res, stat;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007348
7349 if (!status) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07007350 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007351 res = L2CAP_CR_PEND;
7352 stat = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08007353 chan->ops->defer(chan);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007354 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007355 l2cap_state_change(chan, BT_CONFIG);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007356 res = L2CAP_CR_SUCCESS;
7357 stat = L2CAP_CS_NO_INFO;
7358 }
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007359 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007360 l2cap_state_change(chan, BT_DISCONN);
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007361 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007362 res = L2CAP_CR_SEC_BLOCK;
7363 stat = L2CAP_CS_NO_INFO;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007364 }
7365
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03007366 rsp.scid = cpu_to_le16(chan->dcid);
7367 rsp.dcid = cpu_to_le16(chan->scid);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007368 rsp.result = cpu_to_le16(res);
7369 rsp.status = cpu_to_le16(stat);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03007370 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01007371 sizeof(rsp), &rsp);
Mat Martineau2d369352012-05-23 14:59:30 -07007372
7373 if (!test_bit(CONF_REQ_SENT, &chan->conf_state) &&
7374 res == L2CAP_CR_SUCCESS) {
7375 char buf[128];
7376 set_bit(CONF_REQ_SENT, &chan->conf_state);
7377 l2cap_send_cmd(conn, l2cap_get_ident(conn),
7378 L2CAP_CONF_REQ,
7379 l2cap_build_conf_req(chan, buf),
7380 buf);
7381 chan->num_conf_req++;
7382 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007383 }
7384
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007385 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007386 }
7387
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007388 mutex_unlock(&conn->chan_lock);
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007389
Linus Torvalds1da177e2005-04-16 15:20:36 -07007390 return 0;
7391}
7392
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007393int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007394{
7395 struct l2cap_conn *conn = hcon->l2cap_data;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007396 struct l2cap_hdr *hdr;
7397 int len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007398
Andrei Emeltchenko1d13a252012-10-15 11:58:41 +03007399 /* For AMP controller do not create l2cap conn */
7400 if (!conn && hcon->hdev->dev_type != HCI_BREDR)
7401 goto drop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007402
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007403 if (!conn)
Claudio Takahasibaf43252013-04-11 13:55:50 -03007404 conn = l2cap_conn_add(hcon);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007405
7406 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007407 goto drop;
7408
7409 BT_DBG("conn %p len %d flags 0x%x", conn, skb->len, flags);
7410
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007411 switch (flags) {
7412 case ACL_START:
7413 case ACL_START_NO_FLUSH:
7414 case ACL_COMPLETE:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007415 if (conn->rx_len) {
7416 BT_ERR("Unexpected start frame (len %d)", skb->len);
7417 kfree_skb(conn->rx_skb);
7418 conn->rx_skb = NULL;
7419 conn->rx_len = 0;
7420 l2cap_conn_unreliable(conn, ECOMM);
7421 }
7422
Andrei Emeltchenkoaae7fe22010-09-15 14:28:43 +03007423 /* Start fragment always begin with Basic L2CAP header */
7424 if (skb->len < L2CAP_HDR_SIZE) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07007425 BT_ERR("Frame is too short (len %d)", skb->len);
7426 l2cap_conn_unreliable(conn, ECOMM);
7427 goto drop;
7428 }
7429
7430 hdr = (struct l2cap_hdr *) skb->data;
7431 len = __le16_to_cpu(hdr->len) + L2CAP_HDR_SIZE;
7432
7433 if (len == skb->len) {
7434 /* Complete frame received */
7435 l2cap_recv_frame(conn, skb);
7436 return 0;
7437 }
7438
7439 BT_DBG("Start: total len %d, frag len %d", len, skb->len);
7440
7441 if (skb->len > len) {
7442 BT_ERR("Frame is too long (len %d, expected len %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007443 skb->len, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007444 l2cap_conn_unreliable(conn, ECOMM);
7445 goto drop;
7446 }
7447
7448 /* Allocate skb for the complete frame (with header) */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03007449 conn->rx_skb = bt_skb_alloc(len, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03007450 if (!conn->rx_skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007451 goto drop;
7452
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007453 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007454 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007455 conn->rx_len = len - skb->len;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007456 break;
7457
7458 case ACL_CONT:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007459 BT_DBG("Cont: frag len %d (expecting %d)", skb->len, conn->rx_len);
7460
7461 if (!conn->rx_len) {
7462 BT_ERR("Unexpected continuation frame (len %d)", skb->len);
7463 l2cap_conn_unreliable(conn, ECOMM);
7464 goto drop;
7465 }
7466
7467 if (skb->len > conn->rx_len) {
7468 BT_ERR("Fragment is too long (len %d, expected %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007469 skb->len, conn->rx_len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007470 kfree_skb(conn->rx_skb);
7471 conn->rx_skb = NULL;
7472 conn->rx_len = 0;
7473 l2cap_conn_unreliable(conn, ECOMM);
7474 goto drop;
7475 }
7476
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007477 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007478 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007479 conn->rx_len -= skb->len;
7480
7481 if (!conn->rx_len) {
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007482 /* Complete frame received. l2cap_recv_frame
7483 * takes ownership of the skb so set the global
7484 * rx_skb pointer to NULL first.
7485 */
7486 struct sk_buff *rx_skb = conn->rx_skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007487 conn->rx_skb = NULL;
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007488 l2cap_recv_frame(conn, rx_skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007489 }
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007490 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007491 }
7492
7493drop:
7494 kfree_skb(skb);
7495 return 0;
7496}
7497
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007498static int l2cap_debugfs_show(struct seq_file *f, void *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007499{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007500 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007501
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007502 read_lock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007503
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007504 list_for_each_entry(c, &chan_list, global_l) {
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03007505 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 -07007506 &c->src, &c->dst,
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03007507 c->state, __le16_to_cpu(c->psm),
7508 c->scid, c->dcid, c->imtu, c->omtu,
7509 c->sec_level, c->mode);
Andrei Emeltchenko61e1b4b2012-01-19 11:19:50 +02007510 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007511
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007512 read_unlock(&chan_list_lock);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007513
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007514 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007515}
7516
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007517static int l2cap_debugfs_open(struct inode *inode, struct file *file)
7518{
7519 return single_open(file, l2cap_debugfs_show, inode->i_private);
7520}
7521
7522static const struct file_operations l2cap_debugfs_fops = {
7523 .open = l2cap_debugfs_open,
7524 .read = seq_read,
7525 .llseek = seq_lseek,
7526 .release = single_release,
7527};
7528
7529static struct dentry *l2cap_debugfs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007530
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007531int __init l2cap_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007532{
7533 int err;
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007534
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007535 err = l2cap_init_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007536 if (err < 0)
7537 return err;
7538
Marcel Holtmann1120e4b2013-10-17 17:24:16 -07007539 if (IS_ERR_OR_NULL(bt_debugfs))
7540 return 0;
7541
7542 l2cap_debugfs = debugfs_create_file("l2cap", 0444, bt_debugfs,
7543 NULL, &l2cap_debugfs_fops);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007544
Samuel Ortiz40b93972014-05-14 17:53:35 +02007545 debugfs_create_u16("l2cap_le_max_credits", 0644, bt_debugfs,
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02007546 &le_max_credits);
Samuel Ortiz40b93972014-05-14 17:53:35 +02007547 debugfs_create_u16("l2cap_le_default_mps", 0644, bt_debugfs,
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02007548 &le_default_mps);
7549
Linus Torvalds1da177e2005-04-16 15:20:36 -07007550 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007551}
7552
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007553void l2cap_exit(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007554{
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007555 debugfs_remove(l2cap_debugfs);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007556 l2cap_cleanup_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007557}
7558
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03007559module_param(disable_ertm, bool, 0644);
7560MODULE_PARM_DESC(disable_ertm, "Disable enhanced retransmission mode");