blob: 46547b920f88edf7e6df5b6c5d10ae30daa47d67 [file] [log] [blame]
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2000-2001 Qualcomm Incorporated
Gustavo F. Padovance5706b2010-07-13 11:57:11 -03004 Copyright (C) 2009-2010 Gustavo F. Padovan <gustavo@padovan.org>
Gustavo F. Padovan5d8868f2010-07-16 16:18:39 -03005 Copyright (C) 2010 Google Inc.
Gustavo F. Padovan590051d2011-12-18 13:39:33 -02006 Copyright (C) 2011 ProFUSION Embedded Systems
Mat Martineau422e9252012-04-27 16:50:55 -07007 Copyright (c) 2012 Code Aurora Forum. All rights reserved.
Linus Torvalds1da177e2005-04-16 15:20:36 -07008
9 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
10
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License version 2 as
13 published by the Free Software Foundation;
14
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
18 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090019 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
20 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
21 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
Linus Torvalds1da177e2005-04-16 15:20:36 -070022 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090024 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
25 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
Linus Torvalds1da177e2005-04-16 15:20:36 -070026 SOFTWARE IS DISCLAIMED.
27*/
28
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020029/* Bluetooth L2CAP core. */
Linus Torvalds1da177e2005-04-16 15:20:36 -070030
Linus Torvalds1da177e2005-04-16 15:20:36 -070031#include <linux/module.h>
32
Marcel Holtmannaef7d972010-03-21 05:27:45 +010033#include <linux/debugfs.h>
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -030034#include <linux/crc16.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070035
36#include <net/bluetooth/bluetooth.h>
37#include <net/bluetooth/hci_core.h>
38#include <net/bluetooth/l2cap.h>
Marcel Holtmann7ef9fbf2013-10-10 14:54:14 -070039
Marcel Holtmannac4b7232013-10-10 14:54:16 -070040#include "smp.h"
Marcel Holtmann70247282013-10-10 14:54:15 -070041#include "a2mp.h"
Marcel Holtmann7ef9fbf2013-10-10 14:54:14 -070042#include "amp.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070043
Johan Hedberg0f1bfe42014-01-27 15:11:35 -080044#define LE_FLOWCTL_MAX_CREDITS 65535
45
Mat Martineaud1de6d42012-05-17 20:53:55 -070046bool disable_ertm;
Marcel Holtmannf0709e02007-10-20 13:38:51 +020047
Marcel Holtmann547d1032013-10-12 08:18:19 -070048static u32 l2cap_feat_mask = L2CAP_FEAT_FIXED_CHAN | L2CAP_FEAT_UCD;
Marcel Holtmanna6801ca2014-07-11 06:03:08 +020049static u8 l2cap_fixed_chan[8] = { L2CAP_FC_SIG_BREDR | L2CAP_FC_CONNLESS, };
Linus Torvalds1da177e2005-04-16 15:20:36 -070050
Johannes Bergb5ad8b72011-06-01 08:54:45 +020051static LIST_HEAD(chan_list);
52static DEFINE_RWLOCK(chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -070053
Johan Hedbergf15b8ec2013-12-03 15:08:25 +020054static u16 le_max_credits = L2CAP_LE_MAX_CREDITS;
55static u16 le_default_mps = L2CAP_LE_DEFAULT_MPS;
56
Linus Torvalds1da177e2005-04-16 15:20:36 -070057static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +010058 u8 code, u8 ident, u16 dlen, void *data);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -030059static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len,
Gustavo Padovan2d792812012-10-06 10:07:01 +010060 void *data);
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -030061static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +020062static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err);
Linus Torvalds1da177e2005-04-16 15:20:36 -070063
Gustavo Padovand6603662012-05-21 13:58:22 -030064static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
Gustavo Padovan2d792812012-10-06 10:07:01 +010065 struct sk_buff_head *skbs, u8 event);
Mat Martineau608bcc62012-05-17 20:53:32 -070066
Marcel Holtmann4f1654e2013-10-13 08:50:41 -070067static inline __u8 bdaddr_type(struct hci_conn *hcon, __u8 type)
68{
69 if (hcon->type == LE_LINK) {
70 if (type == ADDR_LE_DEV_PUBLIC)
71 return BDADDR_LE_PUBLIC;
72 else
73 return BDADDR_LE_RANDOM;
74 }
75
76 return BDADDR_BREDR;
77}
78
Marcel Holtmann01394182006-07-03 10:02:46 +020079/* ---- L2CAP channels ---- */
Gustavo F. Padovan71ba0e52011-05-17 14:34:52 -030080
Gustavo Padovan2d792812012-10-06 10:07:01 +010081static struct l2cap_chan *__l2cap_get_chan_by_dcid(struct l2cap_conn *conn,
82 u16 cid)
Marcel Holtmann01394182006-07-03 10:02:46 +020083{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020084 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -030085
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020086 list_for_each_entry(c, &conn->chan_l, list) {
87 if (c->dcid == cid)
88 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +020089 }
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020090 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +020091}
92
Gustavo Padovan2d792812012-10-06 10:07:01 +010093static struct l2cap_chan *__l2cap_get_chan_by_scid(struct l2cap_conn *conn,
94 u16 cid)
Marcel Holtmann01394182006-07-03 10:02:46 +020095{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020096 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -030097
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020098 list_for_each_entry(c, &conn->chan_l, list) {
99 if (c->scid == cid)
100 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +0200101 }
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200102 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200103}
104
105/* Find channel with given SCID.
Mat Martineauef191ad2012-05-02 09:42:00 -0700106 * Returns locked channel. */
Gustavo Padovan2d792812012-10-06 10:07:01 +0100107static struct l2cap_chan *l2cap_get_chan_by_scid(struct l2cap_conn *conn,
108 u16 cid)
Marcel Holtmann01394182006-07-03 10:02:46 +0200109{
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300110 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300111
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200112 mutex_lock(&conn->chan_lock);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300113 c = __l2cap_get_chan_by_scid(conn, cid);
Mat Martineauef191ad2012-05-02 09:42:00 -0700114 if (c)
115 l2cap_chan_lock(c);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200116 mutex_unlock(&conn->chan_lock);
117
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300118 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +0200119}
120
Mat Martineaub1a130b2012-10-23 15:24:09 -0700121/* Find channel with given DCID.
122 * Returns locked channel.
123 */
124static struct l2cap_chan *l2cap_get_chan_by_dcid(struct l2cap_conn *conn,
125 u16 cid)
126{
127 struct l2cap_chan *c;
128
129 mutex_lock(&conn->chan_lock);
130 c = __l2cap_get_chan_by_dcid(conn, cid);
131 if (c)
132 l2cap_chan_lock(c);
133 mutex_unlock(&conn->chan_lock);
134
135 return c;
136}
137
Gustavo Padovan2d792812012-10-06 10:07:01 +0100138static struct l2cap_chan *__l2cap_get_chan_by_ident(struct l2cap_conn *conn,
139 u8 ident)
Marcel Holtmann01394182006-07-03 10:02:46 +0200140{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200141 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300142
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200143 list_for_each_entry(c, &conn->chan_l, list) {
144 if (c->ident == ident)
145 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +0200146 }
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200147 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200148}
149
Mat Martineau5b155ef2012-10-23 15:24:14 -0700150static struct l2cap_chan *l2cap_get_chan_by_ident(struct l2cap_conn *conn,
151 u8 ident)
152{
153 struct l2cap_chan *c;
154
155 mutex_lock(&conn->chan_lock);
156 c = __l2cap_get_chan_by_ident(conn, ident);
157 if (c)
158 l2cap_chan_lock(c);
159 mutex_unlock(&conn->chan_lock);
160
161 return c;
162}
163
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300164static struct l2cap_chan *__l2cap_global_chan_by_addr(__le16 psm, bdaddr_t *src)
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300165{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300166 struct l2cap_chan *c;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300167
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300168 list_for_each_entry(c, &chan_list, global_l) {
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700169 if (c->sport == psm && !bacmp(&c->src, src))
Szymon Janc250938c2011-11-16 09:32:22 +0100170 return c;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300171 }
Szymon Janc250938c2011-11-16 09:32:22 +0100172 return NULL;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300173}
174
175int l2cap_add_psm(struct l2cap_chan *chan, bdaddr_t *src, __le16 psm)
176{
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300177 int err;
178
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200179 write_lock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300180
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300181 if (psm && __l2cap_global_chan_by_addr(psm, src)) {
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300182 err = -EADDRINUSE;
183 goto done;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300184 }
185
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300186 if (psm) {
187 chan->psm = psm;
188 chan->sport = psm;
189 err = 0;
190 } else {
191 u16 p;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300192
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300193 err = -EINVAL;
194 for (p = 0x1001; p < 0x1100; p += 2)
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300195 if (!__l2cap_global_chan_by_addr(cpu_to_le16(p), src)) {
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300196 chan->psm = cpu_to_le16(p);
197 chan->sport = cpu_to_le16(p);
198 err = 0;
199 break;
200 }
201 }
202
203done:
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200204 write_unlock(&chan_list_lock);
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300205 return err;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300206}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300207EXPORT_SYMBOL_GPL(l2cap_add_psm);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300208
209int l2cap_add_scid(struct l2cap_chan *chan, __u16 scid)
210{
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200211 write_lock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300212
213 chan->scid = scid;
214
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200215 write_unlock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300216
217 return 0;
218}
219
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300220static u16 l2cap_alloc_cid(struct l2cap_conn *conn)
Marcel Holtmann01394182006-07-03 10:02:46 +0200221{
Johan Hedberge77af752013-10-08 10:31:00 +0200222 u16 cid, dyn_end;
Marcel Holtmann01394182006-07-03 10:02:46 +0200223
Johan Hedberge77af752013-10-08 10:31:00 +0200224 if (conn->hcon->type == LE_LINK)
225 dyn_end = L2CAP_CID_LE_DYN_END;
226 else
227 dyn_end = L2CAP_CID_DYN_END;
228
229 for (cid = L2CAP_CID_DYN_START; cid < dyn_end; cid++) {
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300230 if (!__l2cap_get_chan_by_scid(conn, cid))
Marcel Holtmann01394182006-07-03 10:02:46 +0200231 return cid;
232 }
233
234 return 0;
235}
236
Gustavo Padovanf93fa272013-10-21 14:21:40 -0200237static void l2cap_state_change(struct l2cap_chan *chan, int state)
Gustavo F. 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 */
Johan Hedberge7cafc42014-07-17 15:35:38 +0300778int l2cap_chan_check_security(struct l2cap_chan *chan, bool initiator)
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200779{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300780 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100781 __u8 auth_type;
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200782
Johan Hedberga17de2f2013-05-14 13:25:37 +0300783 if (conn->hcon->type == LE_LINK)
784 return smp_conn_security(conn->hcon, chan->sec_level);
785
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300786 auth_type = l2cap_get_auth_type(chan);
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100787
Johan Hedberge7cafc42014-07-17 15:35:38 +0300788 return hci_conn_security(conn->hcon, chan->sec_level, auth_type,
789 initiator);
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200790}
791
Johannes Bergb5ad8b72011-06-01 08:54:45 +0200792static u8 l2cap_get_ident(struct l2cap_conn *conn)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200793{
794 u8 id;
795
796 /* Get next available identificator.
797 * 1 - 128 are used by kernel.
798 * 129 - 199 are reserved.
799 * 200 - 254 are used by utilities like l2ping, etc.
800 */
801
Marcel Holtmann5a54e7c2014-07-13 20:50:15 +0200802 mutex_lock(&conn->ident_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200803
804 if (++conn->tx_ident > 128)
805 conn->tx_ident = 1;
806
807 id = conn->tx_ident;
808
Marcel Holtmann5a54e7c2014-07-13 20:50:15 +0200809 mutex_unlock(&conn->ident_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200810
811 return id;
812}
813
Gustavo Padovan2d792812012-10-06 10:07:01 +0100814static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len,
815 void *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200816{
817 struct sk_buff *skb = l2cap_build_cmd(conn, code, ident, len, data);
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +0200818 u8 flags;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200819
820 BT_DBG("code 0x%2.2x", code);
821
822 if (!skb)
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -0300823 return;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200824
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +0200825 if (lmp_no_flush_capable(conn->hcon->hdev))
826 flags = ACL_START_NO_FLUSH;
827 else
828 flags = ACL_START;
829
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700830 bt_cb(skb)->force_active = BT_POWER_FORCE_ACTIVE_ON;
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +0200831 skb->priority = HCI_PRIO_MAX;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700832
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200833 hci_send_acl(conn->hchan, skb, flags);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200834}
835
Mat Martineau02b0fbb2012-10-23 15:24:10 -0700836static bool __chan_is_moving(struct l2cap_chan *chan)
837{
838 return chan->move_state != L2CAP_MOVE_STABLE &&
839 chan->move_state != L2CAP_MOVE_WAIT_PREPARE;
840}
841
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200842static void l2cap_do_send(struct l2cap_chan *chan, struct sk_buff *skb)
843{
844 struct hci_conn *hcon = chan->conn->hcon;
845 u16 flags;
846
847 BT_DBG("chan %p, skb %p len %d priority %u", chan, skb, skb->len,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100848 skb->priority);
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200849
Mat Martineaud5f8a752012-10-23 15:24:18 -0700850 if (chan->hs_hcon && !__chan_is_moving(chan)) {
851 if (chan->hs_hchan)
852 hci_send_acl(chan->hs_hchan, skb, ACL_COMPLETE);
853 else
854 kfree_skb(skb);
855
856 return;
857 }
858
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200859 if (!test_bit(FLAG_FLUSHABLE, &chan->flags) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100860 lmp_no_flush_capable(hcon->hdev))
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200861 flags = ACL_START_NO_FLUSH;
862 else
863 flags = ACL_START;
864
865 bt_cb(skb)->force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
866 hci_send_acl(chan->conn->hchan, skb, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700867}
868
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700869static void __unpack_enhanced_control(u16 enh, struct l2cap_ctrl *control)
870{
871 control->reqseq = (enh & L2CAP_CTRL_REQSEQ) >> L2CAP_CTRL_REQSEQ_SHIFT;
872 control->final = (enh & L2CAP_CTRL_FINAL) >> L2CAP_CTRL_FINAL_SHIFT;
873
874 if (enh & L2CAP_CTRL_FRAME_TYPE) {
875 /* S-Frame */
876 control->sframe = 1;
877 control->poll = (enh & L2CAP_CTRL_POLL) >> L2CAP_CTRL_POLL_SHIFT;
878 control->super = (enh & L2CAP_CTRL_SUPERVISE) >> L2CAP_CTRL_SUPER_SHIFT;
879
880 control->sar = 0;
881 control->txseq = 0;
882 } else {
883 /* I-Frame */
884 control->sframe = 0;
885 control->sar = (enh & L2CAP_CTRL_SAR) >> L2CAP_CTRL_SAR_SHIFT;
886 control->txseq = (enh & L2CAP_CTRL_TXSEQ) >> L2CAP_CTRL_TXSEQ_SHIFT;
887
888 control->poll = 0;
889 control->super = 0;
890 }
891}
892
893static void __unpack_extended_control(u32 ext, struct l2cap_ctrl *control)
894{
895 control->reqseq = (ext & L2CAP_EXT_CTRL_REQSEQ) >> L2CAP_EXT_CTRL_REQSEQ_SHIFT;
896 control->final = (ext & L2CAP_EXT_CTRL_FINAL) >> L2CAP_EXT_CTRL_FINAL_SHIFT;
897
898 if (ext & L2CAP_EXT_CTRL_FRAME_TYPE) {
899 /* S-Frame */
900 control->sframe = 1;
901 control->poll = (ext & L2CAP_EXT_CTRL_POLL) >> L2CAP_EXT_CTRL_POLL_SHIFT;
902 control->super = (ext & L2CAP_EXT_CTRL_SUPERVISE) >> L2CAP_EXT_CTRL_SUPER_SHIFT;
903
904 control->sar = 0;
905 control->txseq = 0;
906 } else {
907 /* I-Frame */
908 control->sframe = 0;
909 control->sar = (ext & L2CAP_EXT_CTRL_SAR) >> L2CAP_EXT_CTRL_SAR_SHIFT;
910 control->txseq = (ext & L2CAP_EXT_CTRL_TXSEQ) >> L2CAP_EXT_CTRL_TXSEQ_SHIFT;
911
912 control->poll = 0;
913 control->super = 0;
914 }
915}
916
917static inline void __unpack_control(struct l2cap_chan *chan,
918 struct sk_buff *skb)
919{
920 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
921 __unpack_extended_control(get_unaligned_le32(skb->data),
922 &bt_cb(skb)->control);
Mat Martineaucec8ab6e2012-05-17 20:53:36 -0700923 skb_pull(skb, L2CAP_EXT_CTRL_SIZE);
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700924 } else {
925 __unpack_enhanced_control(get_unaligned_le16(skb->data),
926 &bt_cb(skb)->control);
Mat Martineaucec8ab6e2012-05-17 20:53:36 -0700927 skb_pull(skb, L2CAP_ENH_CTRL_SIZE);
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700928 }
929}
930
931static u32 __pack_extended_control(struct l2cap_ctrl *control)
932{
933 u32 packed;
934
935 packed = control->reqseq << L2CAP_EXT_CTRL_REQSEQ_SHIFT;
936 packed |= control->final << L2CAP_EXT_CTRL_FINAL_SHIFT;
937
938 if (control->sframe) {
939 packed |= control->poll << L2CAP_EXT_CTRL_POLL_SHIFT;
940 packed |= control->super << L2CAP_EXT_CTRL_SUPER_SHIFT;
941 packed |= L2CAP_EXT_CTRL_FRAME_TYPE;
942 } else {
943 packed |= control->sar << L2CAP_EXT_CTRL_SAR_SHIFT;
944 packed |= control->txseq << L2CAP_EXT_CTRL_TXSEQ_SHIFT;
945 }
946
947 return packed;
948}
949
950static u16 __pack_enhanced_control(struct l2cap_ctrl *control)
951{
952 u16 packed;
953
954 packed = control->reqseq << L2CAP_CTRL_REQSEQ_SHIFT;
955 packed |= control->final << L2CAP_CTRL_FINAL_SHIFT;
956
957 if (control->sframe) {
958 packed |= control->poll << L2CAP_CTRL_POLL_SHIFT;
959 packed |= control->super << L2CAP_CTRL_SUPER_SHIFT;
960 packed |= L2CAP_CTRL_FRAME_TYPE;
961 } else {
962 packed |= control->sar << L2CAP_CTRL_SAR_SHIFT;
963 packed |= control->txseq << L2CAP_CTRL_TXSEQ_SHIFT;
964 }
965
966 return packed;
967}
968
969static inline void __pack_control(struct l2cap_chan *chan,
970 struct l2cap_ctrl *control,
971 struct sk_buff *skb)
972{
973 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
974 put_unaligned_le32(__pack_extended_control(control),
975 skb->data + L2CAP_HDR_SIZE);
976 } else {
977 put_unaligned_le16(__pack_enhanced_control(control),
978 skb->data + L2CAP_HDR_SIZE);
979 }
980}
981
Gustavo Padovanba7aa642012-05-29 13:29:16 -0300982static inline unsigned int __ertm_hdr_size(struct l2cap_chan *chan)
983{
984 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
985 return L2CAP_EXT_HDR_SIZE;
986 else
987 return L2CAP_ENH_HDR_SIZE;
988}
989
Mat Martineaua67d7f62012-05-17 20:53:35 -0700990static struct sk_buff *l2cap_create_sframe_pdu(struct l2cap_chan *chan,
991 u32 control)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300992{
993 struct sk_buff *skb;
994 struct l2cap_hdr *lh;
Gustavo Padovanba7aa642012-05-29 13:29:16 -0300995 int hlen = __ertm_hdr_size(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300996
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300997 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +0300998 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300999
Mat Martineaua67d7f62012-05-17 20:53:35 -07001000 skb = bt_skb_alloc(hlen, GFP_KERNEL);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001001
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001002 if (!skb)
Mat Martineaua67d7f62012-05-17 20:53:35 -07001003 return ERR_PTR(-ENOMEM);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001004
1005 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001006 lh->len = cpu_to_le16(hlen - L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001007 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03001008
Mat Martineaua67d7f62012-05-17 20:53:35 -07001009 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
1010 put_unaligned_le32(control, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
1011 else
1012 put_unaligned_le16(control, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001013
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001014 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineaua67d7f62012-05-17 20:53:35 -07001015 u16 fcs = crc16(0, (u8 *)skb->data, skb->len);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03001016 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001017 }
1018
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001019 skb->priority = HCI_PRIO_MAX;
Mat Martineaua67d7f62012-05-17 20:53:35 -07001020 return skb;
1021}
1022
1023static void l2cap_send_sframe(struct l2cap_chan *chan,
1024 struct l2cap_ctrl *control)
1025{
1026 struct sk_buff *skb;
1027 u32 control_field;
1028
1029 BT_DBG("chan %p, control %p", chan, control);
1030
1031 if (!control->sframe)
1032 return;
1033
Mat Martineaub99e13a2012-10-23 15:24:19 -07001034 if (__chan_is_moving(chan))
1035 return;
1036
Mat Martineaua67d7f62012-05-17 20:53:35 -07001037 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state) &&
1038 !control->poll)
1039 control->final = 1;
1040
1041 if (control->super == L2CAP_SUPER_RR)
1042 clear_bit(CONN_RNR_SENT, &chan->conn_state);
1043 else if (control->super == L2CAP_SUPER_RNR)
1044 set_bit(CONN_RNR_SENT, &chan->conn_state);
1045
1046 if (control->super != L2CAP_SUPER_SREJ) {
1047 chan->last_acked_seq = control->reqseq;
1048 __clear_ack_timer(chan);
1049 }
1050
1051 BT_DBG("reqseq %d, final %d, poll %d, super %d", control->reqseq,
1052 control->final, control->poll, control->super);
1053
1054 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
1055 control_field = __pack_extended_control(control);
1056 else
1057 control_field = __pack_enhanced_control(control);
1058
1059 skb = l2cap_create_sframe_pdu(chan, control_field);
1060 if (!IS_ERR(skb))
1061 l2cap_do_send(chan, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001062}
1063
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001064static void l2cap_send_rr_or_rnr(struct l2cap_chan *chan, bool poll)
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001065{
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001066 struct l2cap_ctrl control;
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001067
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001068 BT_DBG("chan %p, poll %d", chan, poll);
1069
1070 memset(&control, 0, sizeof(control));
1071 control.sframe = 1;
1072 control.poll = poll;
1073
1074 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
1075 control.super = L2CAP_SUPER_RNR;
1076 else
1077 control.super = L2CAP_SUPER_RR;
1078
1079 control.reqseq = chan->buffer_seq;
1080 l2cap_send_sframe(chan, &control);
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001081}
1082
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001083static inline int __l2cap_no_conn_pending(struct l2cap_chan *chan)
Andrei Emeltchenkoe501d052010-07-08 12:14:41 +03001084{
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001085 return !test_bit(CONF_CONNECT_PEND, &chan->conf_state);
Andrei Emeltchenkoe501d052010-07-08 12:14:41 +03001086}
1087
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001088static bool __amp_capable(struct l2cap_chan *chan)
1089{
1090 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann1df7b172013-10-05 11:47:49 -07001091 struct hci_dev *hdev;
1092 bool amp_available = false;
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001093
Marcel Holtmann1df7b172013-10-05 11:47:49 -07001094 if (!conn->hs_enabled)
1095 return false;
1096
1097 if (!(conn->fixed_chan_mask & L2CAP_FC_A2MP))
1098 return false;
1099
1100 read_lock(&hci_dev_list_lock);
1101 list_for_each_entry(hdev, &hci_dev_list, list) {
1102 if (hdev->amp_type != AMP_TYPE_BREDR &&
1103 test_bit(HCI_UP, &hdev->flags)) {
1104 amp_available = true;
1105 break;
1106 }
1107 }
1108 read_unlock(&hci_dev_list_lock);
1109
1110 if (chan->chan_policy == BT_CHANNEL_POLICY_AMP_PREFERRED)
1111 return amp_available;
Marcel Holtmann848566b2013-10-01 22:59:22 -07001112
1113 return false;
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001114}
1115
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02001116static bool l2cap_check_efs(struct l2cap_chan *chan)
1117{
1118 /* Check EFS parameters */
1119 return true;
1120}
1121
Andrei Emeltchenko2766be42012-09-27 17:26:21 +03001122void l2cap_send_conn_req(struct l2cap_chan *chan)
Andrei Emeltchenko9b27f352012-02-24 16:00:00 +02001123{
1124 struct l2cap_conn *conn = chan->conn;
1125 struct l2cap_conn_req req;
1126
1127 req.scid = cpu_to_le16(chan->scid);
1128 req.psm = chan->psm;
1129
1130 chan->ident = l2cap_get_ident(conn);
1131
1132 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
1133
1134 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_REQ, sizeof(req), &req);
1135}
1136
Mat Martineau8eb200b2012-10-23 15:24:17 -07001137static void l2cap_send_create_chan_req(struct l2cap_chan *chan, u8 amp_id)
1138{
1139 struct l2cap_create_chan_req req;
1140 req.scid = cpu_to_le16(chan->scid);
1141 req.psm = chan->psm;
1142 req.amp_id = amp_id;
1143
1144 chan->ident = l2cap_get_ident(chan->conn);
1145
1146 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_REQ,
1147 sizeof(req), &req);
1148}
1149
Mat Martineau02b0fbb2012-10-23 15:24:10 -07001150static void l2cap_move_setup(struct l2cap_chan *chan)
1151{
1152 struct sk_buff *skb;
1153
1154 BT_DBG("chan %p", chan);
1155
1156 if (chan->mode != L2CAP_MODE_ERTM)
1157 return;
1158
1159 __clear_retrans_timer(chan);
1160 __clear_monitor_timer(chan);
1161 __clear_ack_timer(chan);
1162
1163 chan->retry_count = 0;
1164 skb_queue_walk(&chan->tx_q, skb) {
1165 if (bt_cb(skb)->control.retries)
1166 bt_cb(skb)->control.retries = 1;
1167 else
1168 break;
1169 }
1170
1171 chan->expected_tx_seq = chan->buffer_seq;
1172
1173 clear_bit(CONN_REJ_ACT, &chan->conn_state);
1174 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
1175 l2cap_seq_list_clear(&chan->retrans_list);
1176 l2cap_seq_list_clear(&chan->srej_list);
1177 skb_queue_purge(&chan->srej_q);
1178
1179 chan->tx_state = L2CAP_TX_STATE_XMIT;
1180 chan->rx_state = L2CAP_RX_STATE_MOVE;
1181
1182 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
1183}
1184
Mat Martineau5f3847a2012-10-23 15:24:12 -07001185static void l2cap_move_done(struct l2cap_chan *chan)
1186{
1187 u8 move_role = chan->move_role;
1188 BT_DBG("chan %p", chan);
1189
1190 chan->move_state = L2CAP_MOVE_STABLE;
1191 chan->move_role = L2CAP_MOVE_ROLE_NONE;
1192
1193 if (chan->mode != L2CAP_MODE_ERTM)
1194 return;
1195
1196 switch (move_role) {
1197 case L2CAP_MOVE_ROLE_INITIATOR:
1198 l2cap_tx(chan, NULL, NULL, L2CAP_EV_EXPLICIT_POLL);
1199 chan->rx_state = L2CAP_RX_STATE_WAIT_F;
1200 break;
1201 case L2CAP_MOVE_ROLE_RESPONDER:
1202 chan->rx_state = L2CAP_RX_STATE_WAIT_P;
1203 break;
1204 }
1205}
1206
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001207static void l2cap_chan_ready(struct l2cap_chan *chan)
1208{
Mat Martineau28270112012-05-17 21:14:09 -07001209 /* This clears all conf flags, including CONF_NOT_COMPLETE */
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001210 chan->conf_state = 0;
1211 __clear_chan_timer(chan);
1212
Johan Hedberg0ce43ce2013-12-05 14:55:33 +02001213 if (chan->mode == L2CAP_MODE_LE_FLOWCTL && !chan->tx_credits)
1214 chan->ops->suspend(chan);
Johan Hedberg177f8f22013-05-31 17:54:51 +03001215
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001216 chan->state = BT_CONNECTED;
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001217
Andrei Emeltchenkofd83e2c2012-05-30 09:55:32 +03001218 chan->ops->ready(chan);
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001219}
1220
Johan Hedbergf1496de2013-05-13 14:15:56 +03001221static void l2cap_le_connect(struct l2cap_chan *chan)
1222{
1223 struct l2cap_conn *conn = chan->conn;
1224 struct l2cap_le_conn_req req;
1225
Johan Hedberg595177f2013-12-02 22:12:22 +02001226 if (test_and_set_bit(FLAG_LE_CONN_REQ_SENT, &chan->flags))
1227 return;
1228
Johan Hedbergf1496de2013-05-13 14:15:56 +03001229 req.psm = chan->psm;
1230 req.scid = cpu_to_le16(chan->scid);
1231 req.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02001232 req.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03001233 req.credits = cpu_to_le16(chan->rx_credits);
Johan Hedbergf1496de2013-05-13 14:15:56 +03001234
1235 chan->ident = l2cap_get_ident(conn);
1236
1237 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_REQ,
1238 sizeof(req), &req);
1239}
1240
1241static void l2cap_le_start(struct l2cap_chan *chan)
1242{
1243 struct l2cap_conn *conn = chan->conn;
1244
1245 if (!smp_conn_security(conn->hcon, chan->sec_level))
1246 return;
1247
1248 if (!chan->psm) {
1249 l2cap_chan_ready(chan);
1250 return;
1251 }
1252
1253 if (chan->state == BT_CONNECT)
1254 l2cap_le_connect(chan);
1255}
1256
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001257static void l2cap_start_connection(struct l2cap_chan *chan)
1258{
1259 if (__amp_capable(chan)) {
1260 BT_DBG("chan %p AMP capable: discover AMPs", chan);
1261 a2mp_discover_amp(chan);
Johan Hedbergf1496de2013-05-13 14:15:56 +03001262 } else if (chan->conn->hcon->type == LE_LINK) {
1263 l2cap_le_start(chan);
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001264 } else {
1265 l2cap_send_conn_req(chan);
1266 }
1267}
1268
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001269static void l2cap_do_start(struct l2cap_chan *chan)
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001270{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03001271 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001272
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001273 if (conn->hcon->type == LE_LINK) {
Johan Hedberg96ac34f2013-05-13 11:15:07 +03001274 l2cap_le_start(chan);
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001275 return;
1276 }
1277
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001278 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) {
Marcel Holtmann984947d2009-02-06 23:35:19 +01001279 if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE))
1280 return;
1281
Johan Hedberge7cafc42014-07-17 15:35:38 +03001282 if (l2cap_chan_check_security(chan, true) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01001283 __l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001284 l2cap_start_connection(chan);
1285 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001286 } else {
1287 struct l2cap_info_req req;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001288 req.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001289
1290 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
1291 conn->info_ident = l2cap_get_ident(conn);
1292
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08001293 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001294
Gustavo Padovan2d792812012-10-06 10:07:01 +01001295 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
1296 sizeof(req), &req);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001297 }
1298}
1299
Gustavo F. Padovancf6c2c02010-06-07 20:54:45 -03001300static inline int l2cap_mode_supported(__u8 mode, __u32 feat_mask)
1301{
1302 u32 local_feat_mask = l2cap_feat_mask;
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03001303 if (!disable_ertm)
Gustavo F. Padovancf6c2c02010-06-07 20:54:45 -03001304 local_feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING;
1305
1306 switch (mode) {
1307 case L2CAP_MODE_ERTM:
1308 return L2CAP_FEAT_ERTM & feat_mask & local_feat_mask;
1309 case L2CAP_MODE_STREAMING:
1310 return L2CAP_FEAT_STREAMING & feat_mask & local_feat_mask;
1311 default:
1312 return 0x00;
1313 }
1314}
1315
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001316static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err)
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001317{
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001318 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001319 struct l2cap_disconn_req req;
1320
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001321 if (!conn)
1322 return;
1323
Andrei Emeltchenkoaad3d0e2012-09-06 15:05:42 +03001324 if (chan->mode == L2CAP_MODE_ERTM && chan->state == BT_CONNECTED) {
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03001325 __clear_retrans_timer(chan);
1326 __clear_monitor_timer(chan);
1327 __clear_ack_timer(chan);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001328 }
1329
Johan Hedberg2338a7e2014-01-24 10:35:40 +02001330 if (chan->scid == L2CAP_CID_A2MP) {
Gustavo Padovand1177732012-10-06 11:47:38 +01001331 l2cap_state_change(chan, BT_DISCONN);
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001332 return;
1333 }
1334
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001335 req.dcid = cpu_to_le16(chan->dcid);
1336 req.scid = cpu_to_le16(chan->scid);
Gustavo Padovan2d792812012-10-06 10:07:01 +01001337 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_DISCONN_REQ,
1338 sizeof(req), &req);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001339
Gustavo Padovanf8e73012013-10-15 19:24:46 -03001340 l2cap_state_change_and_error(chan, BT_DISCONN, err);
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001341}
1342
Linus Torvalds1da177e2005-04-16 15:20:36 -07001343/* ---- L2CAP connections ---- */
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001344static void l2cap_conn_start(struct l2cap_conn *conn)
1345{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001346 struct l2cap_chan *chan, *tmp;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001347
1348 BT_DBG("conn %p", conn);
1349
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001350 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001351
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001352 list_for_each_entry_safe(chan, tmp, &conn->chan_l, list) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001353 l2cap_chan_lock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001354
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001355 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001356 l2cap_chan_unlock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001357 continue;
1358 }
1359
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001360 if (chan->state == BT_CONNECT) {
Johan Hedberge7cafc42014-07-17 15:35:38 +03001361 if (!l2cap_chan_check_security(chan, true) ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01001362 !__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001363 l2cap_chan_unlock(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001364 continue;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02001365 }
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001366
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001367 if (!l2cap_mode_supported(chan->mode, conn->feat_mask)
Gustavo Padovan2d792812012-10-06 10:07:01 +01001368 && test_bit(CONF_STATE2_DEVICE,
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001369 &chan->conf_state)) {
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001370 l2cap_chan_close(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001371 l2cap_chan_unlock(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001372 continue;
1373 }
1374
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001375 l2cap_start_connection(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001376
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001377 } else if (chan->state == BT_CONNECT2) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001378 struct l2cap_conn_rsp rsp;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001379 char buf[128];
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001380 rsp.scid = cpu_to_le16(chan->dcid);
1381 rsp.dcid = cpu_to_le16(chan->scid);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001382
Johan Hedberge7cafc42014-07-17 15:35:38 +03001383 if (l2cap_chan_check_security(chan, false)) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07001384 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001385 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
1386 rsp.status = cpu_to_le16(L2CAP_CS_AUTHOR_PEND);
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001387 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001388
1389 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001390 l2cap_state_change(chan, BT_CONFIG);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001391 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
1392 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001393 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001394 } else {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001395 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
1396 rsp.status = cpu_to_le16(L2CAP_CS_AUTHEN_PEND);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001397 }
1398
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001399 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001400 sizeof(rsp), &rsp);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001401
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001402 if (test_bit(CONF_REQ_SENT, &chan->conf_state) ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01001403 rsp.result != L2CAP_CR_SUCCESS) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001404 l2cap_chan_unlock(chan);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001405 continue;
1406 }
1407
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001408 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001409 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001410 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03001411 chan->num_conf_req++;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001412 }
1413
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001414 l2cap_chan_unlock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001415 }
1416
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001417 mutex_unlock(&conn->chan_lock);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001418}
1419
Ido Yarivc2287682012-04-20 15:46:07 -03001420/* Find socket with cid and source/destination bdaddr.
Ville Tervob62f3282011-02-10 22:38:50 -03001421 * Returns closest match, locked.
1422 */
Andrei Emeltchenkod9b88702012-03-12 12:13:08 +02001423static struct l2cap_chan *l2cap_global_chan_by_scid(int state, u16 cid,
Ido Yarivc2287682012-04-20 15:46:07 -03001424 bdaddr_t *src,
1425 bdaddr_t *dst)
Ville Tervob62f3282011-02-10 22:38:50 -03001426{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001427 struct l2cap_chan *c, *c1 = NULL;
Ville Tervob62f3282011-02-10 22:38:50 -03001428
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001429 read_lock(&chan_list_lock);
Ville Tervob62f3282011-02-10 22:38:50 -03001430
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001431 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001432 if (state && c->state != state)
Ville Tervob62f3282011-02-10 22:38:50 -03001433 continue;
1434
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001435 if (c->scid == cid) {
Ido Yarivc2287682012-04-20 15:46:07 -03001436 int src_match, dst_match;
1437 int src_any, dst_any;
1438
Ville Tervob62f3282011-02-10 22:38:50 -03001439 /* Exact match. */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001440 src_match = !bacmp(&c->src, src);
1441 dst_match = !bacmp(&c->dst, dst);
Ido Yarivc2287682012-04-20 15:46:07 -03001442 if (src_match && dst_match) {
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001443 read_unlock(&chan_list_lock);
1444 return c;
1445 }
Ville Tervob62f3282011-02-10 22:38:50 -03001446
1447 /* Closest match */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001448 src_any = !bacmp(&c->src, BDADDR_ANY);
1449 dst_any = !bacmp(&c->dst, BDADDR_ANY);
Ido Yarivc2287682012-04-20 15:46:07 -03001450 if ((src_match && dst_any) || (src_any && dst_match) ||
1451 (src_any && dst_any))
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001452 c1 = c;
Ville Tervob62f3282011-02-10 22:38:50 -03001453 }
1454 }
Gustavo F. Padovan280f2942011-04-13 19:01:22 -03001455
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001456 read_unlock(&chan_list_lock);
Ville Tervob62f3282011-02-10 22:38:50 -03001457
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001458 return c1;
Ville Tervob62f3282011-02-10 22:38:50 -03001459}
1460
1461static void l2cap_le_conn_ready(struct l2cap_conn *conn)
1462{
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001463 struct hci_conn *hcon = conn->hcon;
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001464 struct hci_dev *hdev = hcon->hdev;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001465 struct l2cap_chan *chan, *pchan;
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001466 u8 dst_type;
Ville Tervob62f3282011-02-10 22:38:50 -03001467
1468 BT_DBG("");
1469
1470 /* Check if we have socket listening on cid */
Johan Hedberg073d1cf2013-04-29 19:35:35 +03001471 pchan = l2cap_global_chan_by_scid(BT_LISTEN, L2CAP_CID_ATT,
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001472 &hcon->src, &hcon->dst);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001473 if (!pchan)
Ville Tervob62f3282011-02-10 22:38:50 -03001474 return;
1475
Johan Hedberg44f3b0f2013-04-29 19:35:45 +03001476 /* Client ATT sockets should override the server one */
1477 if (__l2cap_get_chan_by_dcid(conn, L2CAP_CID_ATT))
1478 return;
1479
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001480 dst_type = bdaddr_type(hcon, hcon->dst_type);
1481
1482 /* If device is blocked, do not create a channel for it */
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001483 if (hci_bdaddr_list_lookup(&hdev->blacklist, &hcon->dst, dst_type))
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001484 return;
1485
Marcel Holtmann80afeb62014-06-23 12:18:51 +02001486 /* For LE slave connections, make sure the connection interval
1487 * is in the range of the minium and maximum interval that has
1488 * been configured for this connection. If not, then trigger
1489 * the connection update procedure.
1490 */
Johan Hedberg40bef302014-07-16 11:42:27 +03001491 if (hcon->role == HCI_ROLE_SLAVE &&
Marcel Holtmann80afeb62014-06-23 12:18:51 +02001492 (hcon->le_conn_interval < hcon->le_conn_min_interval ||
1493 hcon->le_conn_interval > hcon->le_conn_max_interval)) {
1494 struct l2cap_conn_param_update_req req;
1495
1496 req.min = cpu_to_le16(hcon->le_conn_min_interval);
1497 req.max = cpu_to_le16(hcon->le_conn_max_interval);
1498 req.latency = cpu_to_le16(hcon->le_conn_latency);
1499 req.to_multiplier = cpu_to_le16(hcon->le_supv_timeout);
1500
1501 l2cap_send_cmd(conn, l2cap_get_ident(conn),
1502 L2CAP_CONN_PARAM_UPDATE_REQ, sizeof(req), &req);
1503 }
1504
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001505 l2cap_chan_lock(pchan);
Gustavo F. Padovan62f3a2c2011-04-14 18:34:34 -03001506
Gustavo Padovan80b98022012-05-27 22:27:51 -03001507 chan = pchan->ops->new_connection(pchan);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001508 if (!chan)
Ville Tervob62f3282011-02-10 22:38:50 -03001509 goto clean;
1510
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001511 bacpy(&chan->src, &hcon->src);
1512 bacpy(&chan->dst, &hcon->dst);
1513 chan->src_type = bdaddr_type(hcon, hcon->src_type);
1514 chan->dst_type = dst_type;
Ville Tervob62f3282011-02-10 22:38:50 -03001515
Johan Hedberg44f3b0f2013-04-29 19:35:45 +03001516 __l2cap_chan_add(conn, chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001517
Ville Tervob62f3282011-02-10 22:38:50 -03001518clean:
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001519 l2cap_chan_unlock(pchan);
Ville Tervob62f3282011-02-10 22:38:50 -03001520}
1521
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001522static void l2cap_conn_ready(struct l2cap_conn *conn)
1523{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001524 struct l2cap_chan *chan;
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001525 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001526
1527 BT_DBG("conn %p", conn);
1528
Johan Hedbergd8729922013-04-29 19:35:39 +03001529 /* For outgoing pairing which doesn't necessarily have an
1530 * associated socket (e.g. mgmt_pair_device).
1531 */
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001532 if (hcon->out && hcon->type == LE_LINK)
1533 smp_conn_security(hcon, hcon->pending_sec_level);
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03001534
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001535 mutex_lock(&conn->chan_lock);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001536
Johan Hedberg44f3b0f2013-04-29 19:35:45 +03001537 if (hcon->type == LE_LINK)
1538 l2cap_le_conn_ready(conn);
1539
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001540 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03001541
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001542 l2cap_chan_lock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001543
Johan Hedberg2338a7e2014-01-24 10:35:40 +02001544 if (chan->scid == L2CAP_CID_A2MP) {
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001545 l2cap_chan_unlock(chan);
1546 continue;
1547 }
1548
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001549 if (hcon->type == LE_LINK) {
Johan Hedbergf1496de2013-05-13 14:15:56 +03001550 l2cap_le_start(chan);
Vinicius Costa Gomes63128452011-06-17 22:46:26 -03001551 } else if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Gustavo Padovan74e75742013-10-15 19:24:51 -03001552 l2cap_chan_ready(chan);
Anderson Brigliab501d6a2011-06-07 18:46:31 -03001553
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001554 } else if (chan->state == BT_CONNECT) {
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001555 l2cap_do_start(chan);
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001556 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001557
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001558 l2cap_chan_unlock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001559 }
1560
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001561 mutex_unlock(&conn->chan_lock);
Johan Hedberg61a939c2014-01-17 20:45:11 +02001562
1563 queue_work(hcon->hdev->workqueue, &conn->pending_rx_work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001564}
1565
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001566/* Notify sockets that we cannot guaranty reliability anymore */
1567static void l2cap_conn_unreliable(struct l2cap_conn *conn, int err)
1568{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001569 struct l2cap_chan *chan;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001570
1571 BT_DBG("conn %p", conn);
1572
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001573 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001574
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001575 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +03001576 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo Padovan1d8b1fd2012-10-06 11:34:52 +01001577 l2cap_chan_set_err(chan, err);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001578 }
1579
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001580 mutex_unlock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001581}
1582
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001583static void l2cap_info_timeout(struct work_struct *work)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001584{
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001585 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001586 info_timer.work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001587
Marcel Holtmann984947d2009-02-06 23:35:19 +01001588 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01001589 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01001590
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001591 l2cap_conn_start(conn);
1592}
1593
David Herrmann2c8e1412013-04-06 20:28:45 +02001594/*
1595 * l2cap_user
1596 * External modules can register l2cap_user objects on l2cap_conn. The ->probe
1597 * callback is called during registration. The ->remove callback is called
1598 * during unregistration.
1599 * An l2cap_user object can either be explicitly unregistered or when the
1600 * underlying l2cap_conn object is deleted. This guarantees that l2cap->hcon,
1601 * l2cap->hchan, .. are valid as long as the remove callback hasn't been called.
1602 * External modules must own a reference to the l2cap_conn object if they intend
1603 * to call l2cap_unregister_user(). The l2cap_conn object might get destroyed at
1604 * any time if they don't.
1605 */
1606
1607int l2cap_register_user(struct l2cap_conn *conn, struct l2cap_user *user)
1608{
1609 struct hci_dev *hdev = conn->hcon->hdev;
1610 int ret;
1611
1612 /* We need to check whether l2cap_conn is registered. If it is not, we
1613 * must not register the l2cap_user. l2cap_conn_del() is unregisters
1614 * l2cap_conn objects, but doesn't provide its own locking. Instead, it
1615 * relies on the parent hci_conn object to be locked. This itself relies
1616 * on the hci_dev object to be locked. So we must lock the hci device
1617 * here, too. */
1618
1619 hci_dev_lock(hdev);
1620
1621 if (user->list.next || user->list.prev) {
1622 ret = -EINVAL;
1623 goto out_unlock;
1624 }
1625
1626 /* conn->hchan is NULL after l2cap_conn_del() was called */
1627 if (!conn->hchan) {
1628 ret = -ENODEV;
1629 goto out_unlock;
1630 }
1631
1632 ret = user->probe(conn, user);
1633 if (ret)
1634 goto out_unlock;
1635
1636 list_add(&user->list, &conn->users);
1637 ret = 0;
1638
1639out_unlock:
1640 hci_dev_unlock(hdev);
1641 return ret;
1642}
1643EXPORT_SYMBOL(l2cap_register_user);
1644
1645void l2cap_unregister_user(struct l2cap_conn *conn, struct l2cap_user *user)
1646{
1647 struct hci_dev *hdev = conn->hcon->hdev;
1648
1649 hci_dev_lock(hdev);
1650
1651 if (!user->list.next || !user->list.prev)
1652 goto out_unlock;
1653
1654 list_del(&user->list);
1655 user->list.next = NULL;
1656 user->list.prev = NULL;
1657 user->remove(conn, user);
1658
1659out_unlock:
1660 hci_dev_unlock(hdev);
1661}
1662EXPORT_SYMBOL(l2cap_unregister_user);
1663
1664static void l2cap_unregister_all_users(struct l2cap_conn *conn)
1665{
1666 struct l2cap_user *user;
1667
1668 while (!list_empty(&conn->users)) {
1669 user = list_first_entry(&conn->users, struct l2cap_user, list);
1670 list_del(&user->list);
1671 user->list.next = NULL;
1672 user->list.prev = NULL;
1673 user->remove(conn, user);
1674 }
1675}
1676
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001677static void l2cap_conn_del(struct hci_conn *hcon, int err)
1678{
1679 struct l2cap_conn *conn = hcon->l2cap_data;
1680 struct l2cap_chan *chan, *l;
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001681
1682 if (!conn)
1683 return;
1684
1685 BT_DBG("hcon %p conn %p, err %d", hcon, conn, err);
1686
1687 kfree_skb(conn->rx_skb);
1688
Johan Hedberg61a939c2014-01-17 20:45:11 +02001689 skb_queue_purge(&conn->pending_rx);
Jukka Taimisto7ab56c32014-06-12 10:15:13 +00001690
1691 /* We can not call flush_work(&conn->pending_rx_work) here since we
1692 * might block if we are running on a worker from the same workqueue
1693 * pending_rx_work is waiting on.
1694 */
1695 if (work_pending(&conn->pending_rx_work))
1696 cancel_work_sync(&conn->pending_rx_work);
Johan Hedberg61a939c2014-01-17 20:45:11 +02001697
David Herrmann2c8e1412013-04-06 20:28:45 +02001698 l2cap_unregister_all_users(conn);
1699
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001700 mutex_lock(&conn->chan_lock);
1701
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001702 /* Kill channels */
1703 list_for_each_entry_safe(chan, l, &conn->chan_l, list) {
Mat Martineau61d6ef32012-04-27 16:50:50 -07001704 l2cap_chan_hold(chan);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001705 l2cap_chan_lock(chan);
1706
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001707 l2cap_chan_del(chan, err);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001708
1709 l2cap_chan_unlock(chan);
1710
Gustavo Padovan80b98022012-05-27 22:27:51 -03001711 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07001712 l2cap_chan_put(chan);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001713 }
1714
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001715 mutex_unlock(&conn->chan_lock);
1716
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001717 hci_chan_del(conn->hchan);
1718
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001719 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT)
Ulisses Furquim127074b2012-01-30 18:26:29 -02001720 cancel_delayed_work_sync(&conn->info_timer);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001721
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001722 if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags)) {
Ulisses Furquim127074b2012-01-30 18:26:29 -02001723 cancel_delayed_work_sync(&conn->security_timer);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001724 smp_chan_destroy(conn);
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001725 }
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001726
1727 hcon->l2cap_data = NULL;
David Herrmann9c903e32013-04-06 20:28:44 +02001728 conn->hchan = NULL;
1729 l2cap_conn_put(conn);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001730}
1731
Gustavo F. Padovan6c9d42a2011-12-20 10:57:27 -02001732static void security_timeout(struct work_struct *work)
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001733{
Gustavo F. Padovan6c9d42a2011-12-20 10:57:27 -02001734 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001735 security_timer.work);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001736
Johan Hedbergd06cc412012-06-06 18:44:11 +08001737 BT_DBG("conn %p", conn);
1738
1739 if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags)) {
1740 smp_chan_destroy(conn);
1741 l2cap_conn_del(conn->hcon, ETIMEDOUT);
1742 }
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001743}
1744
David Herrmann9c903e32013-04-06 20:28:44 +02001745static void l2cap_conn_free(struct kref *ref)
1746{
1747 struct l2cap_conn *conn = container_of(ref, struct l2cap_conn, ref);
1748
1749 hci_conn_put(conn->hcon);
1750 kfree(conn);
1751}
1752
1753void l2cap_conn_get(struct l2cap_conn *conn)
1754{
1755 kref_get(&conn->ref);
1756}
1757EXPORT_SYMBOL(l2cap_conn_get);
1758
1759void l2cap_conn_put(struct l2cap_conn *conn)
1760{
1761 kref_put(&conn->ref, l2cap_conn_free);
1762}
1763EXPORT_SYMBOL(l2cap_conn_put);
1764
Linus Torvalds1da177e2005-04-16 15:20:36 -07001765/* ---- Socket interface ---- */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001766
Ido Yarivc2287682012-04-20 15:46:07 -03001767/* Find socket with psm and source / destination bdaddr.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001768 * Returns closest match.
1769 */
Ido Yarivc2287682012-04-20 15:46:07 -03001770static struct l2cap_chan *l2cap_global_chan_by_psm(int state, __le16 psm,
1771 bdaddr_t *src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001772 bdaddr_t *dst,
1773 u8 link_type)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001774{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001775 struct l2cap_chan *c, *c1 = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001776
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001777 read_lock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001778
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001779 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001780 if (state && c->state != state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001781 continue;
1782
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001783 if (link_type == ACL_LINK && c->src_type != BDADDR_BREDR)
1784 continue;
1785
1786 if (link_type == LE_LINK && c->src_type == BDADDR_BREDR)
1787 continue;
1788
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001789 if (c->psm == psm) {
Ido Yarivc2287682012-04-20 15:46:07 -03001790 int src_match, dst_match;
1791 int src_any, dst_any;
1792
Linus Torvalds1da177e2005-04-16 15:20:36 -07001793 /* Exact match. */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001794 src_match = !bacmp(&c->src, src);
1795 dst_match = !bacmp(&c->dst, dst);
Ido Yarivc2287682012-04-20 15:46:07 -03001796 if (src_match && dst_match) {
Johannes Berga7567b22011-06-01 08:29:54 +02001797 read_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001798 return c;
1799 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001800
1801 /* Closest match */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001802 src_any = !bacmp(&c->src, BDADDR_ANY);
1803 dst_any = !bacmp(&c->dst, BDADDR_ANY);
Ido Yarivc2287682012-04-20 15:46:07 -03001804 if ((src_match && dst_any) || (src_any && dst_match) ||
1805 (src_any && dst_any))
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001806 c1 = c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001807 }
1808 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001809
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001810 read_unlock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001811
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001812 return c1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001813}
1814
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001815static void l2cap_monitor_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001816{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001817 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001818 monitor_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001819
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03001820 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001821
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001822 l2cap_chan_lock(chan);
1823
Mat Martineau80909e02012-05-17 20:53:50 -07001824 if (!chan->conn) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001825 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001826 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001827 return;
1828 }
1829
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001830 l2cap_tx(chan, NULL, NULL, L2CAP_EV_MONITOR_TO);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001831
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001832 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001833 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001834}
1835
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001836static void l2cap_retrans_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001837{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001838 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001839 retrans_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001840
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03001841 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001842
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001843 l2cap_chan_lock(chan);
1844
Mat Martineau80909e02012-05-17 20:53:50 -07001845 if (!chan->conn) {
1846 l2cap_chan_unlock(chan);
1847 l2cap_chan_put(chan);
1848 return;
1849 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001850
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001851 l2cap_tx(chan, NULL, NULL, L2CAP_EV_RETRANS_TO);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001852 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001853 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001854}
1855
Gustavo Padovand6603662012-05-21 13:58:22 -03001856static void l2cap_streaming_send(struct l2cap_chan *chan,
1857 struct sk_buff_head *skbs)
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001858{
Gustavo F. Padovanccbb84a2010-08-30 18:44:44 -03001859 struct sk_buff *skb;
Mat Martineau37339372012-05-17 20:53:33 -07001860 struct l2cap_ctrl *control;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001861
Mat Martineau37339372012-05-17 20:53:33 -07001862 BT_DBG("chan %p, skbs %p", chan, skbs);
1863
Mat Martineaub99e13a2012-10-23 15:24:19 -07001864 if (__chan_is_moving(chan))
1865 return;
1866
Mat Martineau37339372012-05-17 20:53:33 -07001867 skb_queue_splice_tail_init(skbs, &chan->tx_q);
1868
1869 while (!skb_queue_empty(&chan->tx_q)) {
1870
1871 skb = skb_dequeue(&chan->tx_q);
1872
1873 bt_cb(skb)->control.retries = 1;
1874 control = &bt_cb(skb)->control;
1875
1876 control->reqseq = 0;
1877 control->txseq = chan->next_tx_seq;
1878
1879 __pack_control(chan, control, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001880
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001881 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau37339372012-05-17 20:53:33 -07001882 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1883 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001884 }
1885
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001886 l2cap_do_send(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001887
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001888 BT_DBG("Sent txseq %u", control->txseq);
Mat Martineau37339372012-05-17 20:53:33 -07001889
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001890 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau37339372012-05-17 20:53:33 -07001891 chan->frames_sent++;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001892 }
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001893}
1894
Szymon Janc67c9e842011-07-28 16:24:33 +02001895static int l2cap_ertm_send(struct l2cap_chan *chan)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001896{
1897 struct sk_buff *skb, *tx_skb;
Mat Martineau18a48e72012-05-17 20:53:34 -07001898 struct l2cap_ctrl *control;
1899 int sent = 0;
1900
1901 BT_DBG("chan %p", chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001902
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001903 if (chan->state != BT_CONNECTED)
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001904 return -ENOTCONN;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001905
Mat Martineau94122bb2012-05-02 09:42:02 -07001906 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1907 return 0;
1908
Mat Martineaub99e13a2012-10-23 15:24:19 -07001909 if (__chan_is_moving(chan))
1910 return 0;
1911
Mat Martineau18a48e72012-05-17 20:53:34 -07001912 while (chan->tx_send_head &&
1913 chan->unacked_frames < chan->remote_tx_win &&
1914 chan->tx_state == L2CAP_TX_STATE_XMIT) {
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001915
Mat Martineau18a48e72012-05-17 20:53:34 -07001916 skb = chan->tx_send_head;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001917
Mat Martineau18a48e72012-05-17 20:53:34 -07001918 bt_cb(skb)->control.retries = 1;
1919 control = &bt_cb(skb)->control;
Gustavo F. Padovan95ffa972010-06-18 20:37:33 -03001920
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001921 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
Mat Martineau18a48e72012-05-17 20:53:34 -07001922 control->final = 1;
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001923
Mat Martineau18a48e72012-05-17 20:53:34 -07001924 control->reqseq = chan->buffer_seq;
1925 chan->last_acked_seq = chan->buffer_seq;
1926 control->txseq = chan->next_tx_seq;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001927
Mat Martineau18a48e72012-05-17 20:53:34 -07001928 __pack_control(chan, control, skb);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001929
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001930 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau18a48e72012-05-17 20:53:34 -07001931 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1932 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001933 }
1934
Mat Martineau18a48e72012-05-17 20:53:34 -07001935 /* Clone after data has been modified. Data is assumed to be
1936 read-only (for locking purposes) on cloned sk_buffs.
1937 */
1938 tx_skb = skb_clone(skb, GFP_KERNEL);
1939
1940 if (!tx_skb)
1941 break;
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -03001942
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03001943 __set_retrans_timer(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001944
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001945 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau18a48e72012-05-17 20:53:34 -07001946 chan->unacked_frames++;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03001947 chan->frames_sent++;
Mat Martineau18a48e72012-05-17 20:53:34 -07001948 sent++;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001949
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001950 if (skb_queue_is_last(&chan->tx_q, skb))
1951 chan->tx_send_head = NULL;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001952 else
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001953 chan->tx_send_head = skb_queue_next(&chan->tx_q, skb);
Mat Martineau18a48e72012-05-17 20:53:34 -07001954
1955 l2cap_do_send(chan, tx_skb);
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001956 BT_DBG("Sent txseq %u", control->txseq);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001957 }
1958
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001959 BT_DBG("Sent %d, %u unacked, %u in ERTM queue", sent,
1960 chan->unacked_frames, skb_queue_len(&chan->tx_q));
Mat Martineau18a48e72012-05-17 20:53:34 -07001961
1962 return sent;
Gustavo F. Padovan9e917af2010-05-01 16:15:37 -03001963}
1964
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001965static void l2cap_ertm_resend(struct l2cap_chan *chan)
1966{
1967 struct l2cap_ctrl control;
1968 struct sk_buff *skb;
1969 struct sk_buff *tx_skb;
1970 u16 seq;
1971
1972 BT_DBG("chan %p", chan);
1973
1974 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1975 return;
1976
Mat Martineaub99e13a2012-10-23 15:24:19 -07001977 if (__chan_is_moving(chan))
1978 return;
1979
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001980 while (chan->retrans_list.head != L2CAP_SEQ_LIST_CLEAR) {
1981 seq = l2cap_seq_list_pop(&chan->retrans_list);
1982
1983 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, seq);
1984 if (!skb) {
1985 BT_DBG("Error: Can't retransmit seq %d, frame missing",
Gustavo Padovan2d792812012-10-06 10:07:01 +01001986 seq);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001987 continue;
1988 }
1989
1990 bt_cb(skb)->control.retries++;
1991 control = bt_cb(skb)->control;
1992
1993 if (chan->max_tx != 0 &&
1994 bt_cb(skb)->control.retries > chan->max_tx) {
1995 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001996 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001997 l2cap_seq_list_clear(&chan->retrans_list);
1998 break;
1999 }
2000
2001 control.reqseq = chan->buffer_seq;
2002 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
2003 control.final = 1;
2004 else
2005 control.final = 0;
2006
2007 if (skb_cloned(skb)) {
2008 /* Cloned sk_buffs are read-only, so we need a
2009 * writeable copy
2010 */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002011 tx_skb = skb_copy(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002012 } else {
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002013 tx_skb = skb_clone(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002014 }
2015
2016 if (!tx_skb) {
2017 l2cap_seq_list_clear(&chan->retrans_list);
2018 break;
2019 }
2020
2021 /* Update skb contents */
2022 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
2023 put_unaligned_le32(__pack_extended_control(&control),
2024 tx_skb->data + L2CAP_HDR_SIZE);
2025 } else {
2026 put_unaligned_le16(__pack_enhanced_control(&control),
2027 tx_skb->data + L2CAP_HDR_SIZE);
2028 }
2029
2030 if (chan->fcs == L2CAP_FCS_CRC16) {
2031 u16 fcs = crc16(0, (u8 *) tx_skb->data, tx_skb->len);
2032 put_unaligned_le16(fcs, skb_put(tx_skb,
2033 L2CAP_FCS_SIZE));
2034 }
2035
2036 l2cap_do_send(chan, tx_skb);
2037
2038 BT_DBG("Resent txseq %d", control.txseq);
2039
2040 chan->last_acked_seq = chan->buffer_seq;
2041 }
2042}
2043
Mat Martineauf80842a2012-05-17 20:53:46 -07002044static void l2cap_retransmit(struct l2cap_chan *chan,
2045 struct l2cap_ctrl *control)
2046{
2047 BT_DBG("chan %p, control %p", chan, control);
2048
2049 l2cap_seq_list_append(&chan->retrans_list, control->reqseq);
2050 l2cap_ertm_resend(chan);
2051}
2052
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002053static void l2cap_retransmit_all(struct l2cap_chan *chan,
2054 struct l2cap_ctrl *control)
2055{
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002056 struct sk_buff *skb;
2057
2058 BT_DBG("chan %p, control %p", chan, control);
2059
2060 if (control->poll)
2061 set_bit(CONN_SEND_FBIT, &chan->conn_state);
2062
2063 l2cap_seq_list_clear(&chan->retrans_list);
2064
2065 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
2066 return;
2067
2068 if (chan->unacked_frames) {
2069 skb_queue_walk(&chan->tx_q, skb) {
2070 if (bt_cb(skb)->control.txseq == control->reqseq ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01002071 skb == chan->tx_send_head)
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002072 break;
2073 }
2074
2075 skb_queue_walk_from(&chan->tx_q, skb) {
2076 if (skb == chan->tx_send_head)
2077 break;
2078
2079 l2cap_seq_list_append(&chan->retrans_list,
2080 bt_cb(skb)->control.txseq);
2081 }
2082
2083 l2cap_ertm_resend(chan);
2084 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002085}
2086
Szymon Jancb17e73b2012-01-11 10:59:47 +01002087static void l2cap_send_ack(struct l2cap_chan *chan)
2088{
Mat Martineau0a0aba42012-05-17 20:53:39 -07002089 struct l2cap_ctrl control;
2090 u16 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
2091 chan->last_acked_seq);
2092 int threshold;
2093
2094 BT_DBG("chan %p last_acked_seq %d buffer_seq %d",
2095 chan, chan->last_acked_seq, chan->buffer_seq);
2096
2097 memset(&control, 0, sizeof(control));
2098 control.sframe = 1;
2099
2100 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
2101 chan->rx_state == L2CAP_RX_STATE_RECV) {
2102 __clear_ack_timer(chan);
2103 control.super = L2CAP_SUPER_RNR;
2104 control.reqseq = chan->buffer_seq;
2105 l2cap_send_sframe(chan, &control);
2106 } else {
2107 if (!test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) {
2108 l2cap_ertm_send(chan);
2109 /* If any i-frames were sent, they included an ack */
2110 if (chan->buffer_seq == chan->last_acked_seq)
2111 frames_to_ack = 0;
2112 }
2113
Mat Martineauc20f8e32012-07-10 05:47:07 -07002114 /* Ack now if the window is 3/4ths full.
Mat Martineau0a0aba42012-05-17 20:53:39 -07002115 * Calculate without mul or div
2116 */
Mat Martineauc20f8e32012-07-10 05:47:07 -07002117 threshold = chan->ack_win;
Mat Martineau0a0aba42012-05-17 20:53:39 -07002118 threshold += threshold << 1;
2119 threshold >>= 2;
2120
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002121 BT_DBG("frames_to_ack %u, threshold %d", frames_to_ack,
Mat Martineau0a0aba42012-05-17 20:53:39 -07002122 threshold);
2123
2124 if (frames_to_ack >= threshold) {
2125 __clear_ack_timer(chan);
2126 control.super = L2CAP_SUPER_RR;
2127 control.reqseq = chan->buffer_seq;
2128 l2cap_send_sframe(chan, &control);
2129 frames_to_ack = 0;
2130 }
2131
2132 if (frames_to_ack)
2133 __set_ack_timer(chan);
2134 }
Szymon Jancb17e73b2012-01-11 10:59:47 +01002135}
2136
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002137static inline int l2cap_skbuff_fromiovec(struct l2cap_chan *chan,
2138 struct msghdr *msg, int len,
2139 int count, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002140{
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002141 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002142 struct sk_buff **frag;
Gustavo Padovan90338942012-04-06 20:15:47 -03002143 int sent = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002144
Jukka Rissanen04988782014-06-18 16:37:07 +03002145 if (chan->ops->memcpy_fromiovec(chan, skb_put(skb, count),
2146 msg->msg_iov, count))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002147 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002148
2149 sent += count;
2150 len -= count;
2151
2152 /* Continuation fragments (no L2CAP header) */
2153 frag = &skb_shinfo(skb)->frag_list;
2154 while (len) {
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002155 struct sk_buff *tmp;
2156
Linus Torvalds1da177e2005-04-16 15:20:36 -07002157 count = min_t(unsigned int, conn->mtu, len);
2158
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002159 tmp = chan->ops->alloc_skb(chan, 0, count,
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002160 msg->msg_flags & MSG_DONTWAIT);
2161 if (IS_ERR(tmp))
2162 return PTR_ERR(tmp);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002163
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002164 *frag = tmp;
2165
Jukka Rissanen04988782014-06-18 16:37:07 +03002166 if (chan->ops->memcpy_fromiovec(chan, skb_put(*frag, count),
2167 msg->msg_iov, count))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002168 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002169
2170 sent += count;
2171 len -= count;
2172
Gustavo Padovan2d0ed3d2012-05-11 13:16:12 -03002173 skb->len += (*frag)->len;
2174 skb->data_len += (*frag)->len;
2175
Linus Torvalds1da177e2005-04-16 15:20:36 -07002176 frag = &(*frag)->next;
2177 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002178
2179 return sent;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002180}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002181
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002182static struct sk_buff *l2cap_create_connless_pdu(struct l2cap_chan *chan,
Marcel Holtmann8d463212014-06-05 15:22:51 +02002183 struct msghdr *msg, size_t len)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002184{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002185 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002186 struct sk_buff *skb;
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002187 int err, count, hlen = L2CAP_HDR_SIZE + L2CAP_PSMLEN_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002188 struct l2cap_hdr *lh;
2189
Marcel Holtmann8d463212014-06-05 15:22:51 +02002190 BT_DBG("chan %p psm 0x%2.2x len %zu", chan,
2191 __le16_to_cpu(chan->psm), len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002192
2193 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002194
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002195 skb = chan->ops->alloc_skb(chan, hlen, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002196 msg->msg_flags & MSG_DONTWAIT);
2197 if (IS_ERR(skb))
2198 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002199
2200 /* Create L2CAP header */
2201 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002202 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenkodaf6a78c2012-05-03 10:55:52 +03002203 lh->len = cpu_to_le16(len + L2CAP_PSMLEN_SIZE);
Marcel Holtmann43b1b8d2013-10-12 06:01:26 -07002204 put_unaligned(chan->psm, (__le16 *) skb_put(skb, L2CAP_PSMLEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002205
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002206 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002207 if (unlikely(err < 0)) {
2208 kfree_skb(skb);
2209 return ERR_PTR(err);
2210 }
2211 return skb;
2212}
2213
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002214static struct sk_buff *l2cap_create_basic_pdu(struct l2cap_chan *chan,
Marcel Holtmann8d463212014-06-05 15:22:51 +02002215 struct msghdr *msg, size_t len)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002216{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002217 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002218 struct sk_buff *skb;
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002219 int err, count;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002220 struct l2cap_hdr *lh;
2221
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002222 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002223
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002224 count = min_t(unsigned int, (conn->mtu - L2CAP_HDR_SIZE), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002225
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002226 skb = chan->ops->alloc_skb(chan, L2CAP_HDR_SIZE, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002227 msg->msg_flags & MSG_DONTWAIT);
2228 if (IS_ERR(skb))
2229 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002230
2231 /* Create L2CAP header */
2232 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002233 lh->cid = cpu_to_le16(chan->dcid);
Gustavo Padovan6ff9b5e2012-05-02 11:56:17 -03002234 lh->len = cpu_to_le16(len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002235
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002236 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002237 if (unlikely(err < 0)) {
2238 kfree_skb(skb);
2239 return ERR_PTR(err);
2240 }
2241 return skb;
2242}
2243
Luiz Augusto von Dentzab0ff762011-09-12 20:00:50 +03002244static struct sk_buff *l2cap_create_iframe_pdu(struct l2cap_chan *chan,
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002245 struct msghdr *msg, size_t len,
2246 u16 sdulen)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002247{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002248 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002249 struct sk_buff *skb;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002250 int err, count, hlen;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002251 struct l2cap_hdr *lh;
2252
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002253 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002254
Gustavo F. Padovan0ee0d202010-05-01 16:15:41 -03002255 if (!conn)
2256 return ERR_PTR(-ENOTCONN);
2257
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002258 hlen = __ertm_hdr_size(chan);
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002259
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002260 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002261 hlen += L2CAP_SDULEN_SIZE;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002262
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03002263 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002264 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03002265
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002266 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002267
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002268 skb = chan->ops->alloc_skb(chan, hlen, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002269 msg->msg_flags & MSG_DONTWAIT);
2270 if (IS_ERR(skb))
2271 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002272
2273 /* Create L2CAP header */
2274 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002275 lh->cid = cpu_to_le16(chan->dcid);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002276 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002277
Mat Martineau18a48e72012-05-17 20:53:34 -07002278 /* Control header is populated later */
2279 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
2280 put_unaligned_le32(0, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
2281 else
2282 put_unaligned_le16(0, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002283
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002284 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002285 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002286
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002287 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002288 if (unlikely(err < 0)) {
2289 kfree_skb(skb);
2290 return ERR_PTR(err);
2291 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03002292
Mat Martineau18a48e72012-05-17 20:53:34 -07002293 bt_cb(skb)->control.fcs = chan->fcs;
Mat Martineau3ce35142012-04-25 16:36:14 -07002294 bt_cb(skb)->control.retries = 0;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002295 return skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002296}
2297
Mat Martineau94122bb2012-05-02 09:42:02 -07002298static int l2cap_segment_sdu(struct l2cap_chan *chan,
2299 struct sk_buff_head *seg_queue,
2300 struct msghdr *msg, size_t len)
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002301{
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002302 struct sk_buff *skb;
Mat Martineau94122bb2012-05-02 09:42:02 -07002303 u16 sdu_len;
2304 size_t pdu_len;
Mat Martineau94122bb2012-05-02 09:42:02 -07002305 u8 sar;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002306
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002307 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002308
Mat Martineau94122bb2012-05-02 09:42:02 -07002309 /* It is critical that ERTM PDUs fit in a single HCI fragment,
2310 * so fragmented skbs are not used. The HCI layer's handling
2311 * of fragmented skbs is not compatible with ERTM's queueing.
2312 */
2313
2314 /* PDU size is derived from the HCI MTU */
2315 pdu_len = chan->conn->mtu;
2316
Mat Martineaua5495742012-10-23 15:24:21 -07002317 /* Constrain PDU size for BR/EDR connections */
2318 if (!chan->hs_hcon)
2319 pdu_len = min_t(size_t, pdu_len, L2CAP_BREDR_MAX_PAYLOAD);
Mat Martineau94122bb2012-05-02 09:42:02 -07002320
2321 /* Adjust for largest possible L2CAP overhead. */
Gustavo Padovan35d401d2012-05-25 18:57:05 -03002322 if (chan->fcs)
2323 pdu_len -= L2CAP_FCS_SIZE;
2324
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002325 pdu_len -= __ertm_hdr_size(chan);
Mat Martineau94122bb2012-05-02 09:42:02 -07002326
2327 /* Remote device may have requested smaller PDUs */
2328 pdu_len = min_t(size_t, pdu_len, chan->remote_mps);
2329
2330 if (len <= pdu_len) {
2331 sar = L2CAP_SAR_UNSEGMENTED;
2332 sdu_len = 0;
2333 pdu_len = len;
2334 } else {
2335 sar = L2CAP_SAR_START;
2336 sdu_len = len;
2337 pdu_len -= L2CAP_SDULEN_SIZE;
2338 }
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002339
2340 while (len > 0) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002341 skb = l2cap_create_iframe_pdu(chan, msg, pdu_len, sdu_len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002342
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002343 if (IS_ERR(skb)) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002344 __skb_queue_purge(seg_queue);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002345 return PTR_ERR(skb);
2346 }
2347
Mat Martineau94122bb2012-05-02 09:42:02 -07002348 bt_cb(skb)->control.sar = sar;
2349 __skb_queue_tail(seg_queue, skb);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002350
Mat Martineau94122bb2012-05-02 09:42:02 -07002351 len -= pdu_len;
2352 if (sdu_len) {
2353 sdu_len = 0;
2354 pdu_len += L2CAP_SDULEN_SIZE;
2355 }
2356
2357 if (len <= pdu_len) {
2358 sar = L2CAP_SAR_END;
2359 pdu_len = len;
2360 } else {
2361 sar = L2CAP_SAR_CONTINUE;
2362 }
2363 }
2364
Gustavo Padovanf0f62792012-05-29 13:29:17 -03002365 return 0;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002366}
2367
Johan Hedberg177f8f22013-05-31 17:54:51 +03002368static struct sk_buff *l2cap_create_le_flowctl_pdu(struct l2cap_chan *chan,
2369 struct msghdr *msg,
2370 size_t len, u16 sdulen)
2371{
2372 struct l2cap_conn *conn = chan->conn;
2373 struct sk_buff *skb;
2374 int err, count, hlen;
2375 struct l2cap_hdr *lh;
2376
2377 BT_DBG("chan %p len %zu", chan, len);
2378
2379 if (!conn)
2380 return ERR_PTR(-ENOTCONN);
2381
2382 hlen = L2CAP_HDR_SIZE;
2383
2384 if (sdulen)
2385 hlen += L2CAP_SDULEN_SIZE;
2386
2387 count = min_t(unsigned int, (conn->mtu - hlen), len);
2388
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002389 skb = chan->ops->alloc_skb(chan, hlen, count,
Johan Hedberg177f8f22013-05-31 17:54:51 +03002390 msg->msg_flags & MSG_DONTWAIT);
2391 if (IS_ERR(skb))
2392 return skb;
2393
2394 /* Create L2CAP header */
2395 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
2396 lh->cid = cpu_to_le16(chan->dcid);
2397 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
2398
2399 if (sdulen)
2400 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
2401
2402 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
2403 if (unlikely(err < 0)) {
2404 kfree_skb(skb);
2405 return ERR_PTR(err);
2406 }
2407
2408 return skb;
2409}
2410
2411static int l2cap_segment_le_sdu(struct l2cap_chan *chan,
2412 struct sk_buff_head *seg_queue,
2413 struct msghdr *msg, size_t len)
2414{
2415 struct sk_buff *skb;
2416 size_t pdu_len;
2417 u16 sdu_len;
2418
2419 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
2420
2421 pdu_len = chan->conn->mtu - L2CAP_HDR_SIZE;
2422
2423 pdu_len = min_t(size_t, pdu_len, chan->remote_mps);
2424
2425 sdu_len = len;
2426 pdu_len -= L2CAP_SDULEN_SIZE;
2427
2428 while (len > 0) {
2429 if (len <= pdu_len)
2430 pdu_len = len;
2431
2432 skb = l2cap_create_le_flowctl_pdu(chan, msg, pdu_len, sdu_len);
2433 if (IS_ERR(skb)) {
2434 __skb_queue_purge(seg_queue);
2435 return PTR_ERR(skb);
2436 }
2437
2438 __skb_queue_tail(seg_queue, skb);
2439
2440 len -= pdu_len;
2441
2442 if (sdu_len) {
2443 sdu_len = 0;
2444 pdu_len += L2CAP_SDULEN_SIZE;
2445 }
2446 }
2447
2448 return 0;
2449}
2450
Marcel Holtmann8d463212014-06-05 15:22:51 +02002451int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002452{
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002453 struct sk_buff *skb;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002454 int err;
Mat Martineau94122bb2012-05-02 09:42:02 -07002455 struct sk_buff_head seg_queue;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002456
Seung-Woo Kim31e8ce82013-11-05 18:46:33 +09002457 if (!chan->conn)
2458 return -ENOTCONN;
2459
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002460 /* Connectionless channel */
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002461 if (chan->chan_type == L2CAP_CHAN_CONN_LESS) {
Marcel Holtmann8d463212014-06-05 15:22:51 +02002462 skb = l2cap_create_connless_pdu(chan, msg, len);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002463 if (IS_ERR(skb))
2464 return PTR_ERR(skb);
2465
Andrzej Kaczmarekede81a22014-02-25 17:16:22 +01002466 /* Channel lock is released before requesting new skb and then
2467 * reacquired thus we need to recheck channel state.
2468 */
2469 if (chan->state != BT_CONNECTED) {
2470 kfree_skb(skb);
2471 return -ENOTCONN;
2472 }
2473
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002474 l2cap_do_send(chan, skb);
2475 return len;
2476 }
2477
2478 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03002479 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedberg177f8f22013-05-31 17:54:51 +03002480 /* Check outgoing MTU */
2481 if (len > chan->omtu)
2482 return -EMSGSIZE;
2483
Johan Hedbergfad5fc892013-12-05 09:45:01 +02002484 if (!chan->tx_credits)
2485 return -EAGAIN;
2486
Johan Hedberg177f8f22013-05-31 17:54:51 +03002487 __skb_queue_head_init(&seg_queue);
2488
2489 err = l2cap_segment_le_sdu(chan, &seg_queue, msg, len);
2490
2491 if (chan->state != BT_CONNECTED) {
2492 __skb_queue_purge(&seg_queue);
2493 err = -ENOTCONN;
2494 }
2495
2496 if (err)
2497 return err;
2498
2499 skb_queue_splice_tail_init(&seg_queue, &chan->tx_q);
2500
2501 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
2502 l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
2503 chan->tx_credits--;
2504 }
2505
2506 if (!chan->tx_credits)
2507 chan->ops->suspend(chan);
2508
2509 err = len;
2510
2511 break;
2512
Johan Hedbergfad5fc892013-12-05 09:45:01 +02002513 case L2CAP_MODE_BASIC:
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002514 /* Check outgoing MTU */
2515 if (len > chan->omtu)
2516 return -EMSGSIZE;
2517
2518 /* Create a basic PDU */
Marcel Holtmann8d463212014-06-05 15:22:51 +02002519 skb = l2cap_create_basic_pdu(chan, msg, len);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002520 if (IS_ERR(skb))
2521 return PTR_ERR(skb);
2522
Andrzej Kaczmarekede81a22014-02-25 17:16:22 +01002523 /* Channel lock is released before requesting new skb and then
2524 * reacquired thus we need to recheck channel state.
2525 */
2526 if (chan->state != BT_CONNECTED) {
2527 kfree_skb(skb);
2528 return -ENOTCONN;
2529 }
2530
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002531 l2cap_do_send(chan, skb);
2532 err = len;
2533 break;
2534
2535 case L2CAP_MODE_ERTM:
2536 case L2CAP_MODE_STREAMING:
Mat Martineau94122bb2012-05-02 09:42:02 -07002537 /* Check outgoing MTU */
2538 if (len > chan->omtu) {
2539 err = -EMSGSIZE;
2540 break;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002541 }
2542
Mat Martineau94122bb2012-05-02 09:42:02 -07002543 __skb_queue_head_init(&seg_queue);
2544
2545 /* Do segmentation before calling in to the state machine,
2546 * since it's possible to block while waiting for memory
2547 * allocation.
2548 */
2549 err = l2cap_segment_sdu(chan, &seg_queue, msg, len);
2550
2551 /* The channel could have been closed while segmenting,
2552 * check that it is still connected.
2553 */
2554 if (chan->state != BT_CONNECTED) {
2555 __skb_queue_purge(&seg_queue);
2556 err = -ENOTCONN;
2557 }
2558
2559 if (err)
2560 break;
2561
Mat Martineau37339372012-05-17 20:53:33 -07002562 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo Padovand6603662012-05-21 13:58:22 -03002563 l2cap_tx(chan, NULL, &seg_queue, L2CAP_EV_DATA_REQUEST);
Mat Martineau37339372012-05-17 20:53:33 -07002564 else
Gustavo Padovand6603662012-05-21 13:58:22 -03002565 l2cap_streaming_send(chan, &seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002566
Gustavo Padovand6603662012-05-21 13:58:22 -03002567 err = len;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002568
Mat Martineau94122bb2012-05-02 09:42:02 -07002569 /* If the skbs were not queued for sending, they'll still be in
2570 * seg_queue and need to be purged.
2571 */
2572 __skb_queue_purge(&seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002573 break;
2574
2575 default:
2576 BT_DBG("bad state %1.1x", chan->mode);
2577 err = -EBADFD;
2578 }
2579
2580 return err;
2581}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +03002582EXPORT_SYMBOL_GPL(l2cap_chan_send);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002583
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002584static void l2cap_send_srej(struct l2cap_chan *chan, u16 txseq)
2585{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002586 struct l2cap_ctrl control;
2587 u16 seq;
2588
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002589 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002590
2591 memset(&control, 0, sizeof(control));
2592 control.sframe = 1;
2593 control.super = L2CAP_SUPER_SREJ;
2594
2595 for (seq = chan->expected_tx_seq; seq != txseq;
2596 seq = __next_seq(chan, seq)) {
2597 if (!l2cap_ertm_seq_in_queue(&chan->srej_q, seq)) {
2598 control.reqseq = seq;
2599 l2cap_send_sframe(chan, &control);
2600 l2cap_seq_list_append(&chan->srej_list, seq);
2601 }
2602 }
2603
2604 chan->expected_tx_seq = __next_seq(chan, txseq);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002605}
2606
2607static void l2cap_send_srej_tail(struct l2cap_chan *chan)
2608{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002609 struct l2cap_ctrl control;
2610
2611 BT_DBG("chan %p", chan);
2612
2613 if (chan->srej_list.tail == L2CAP_SEQ_LIST_CLEAR)
2614 return;
2615
2616 memset(&control, 0, sizeof(control));
2617 control.sframe = 1;
2618 control.super = L2CAP_SUPER_SREJ;
2619 control.reqseq = chan->srej_list.tail;
2620 l2cap_send_sframe(chan, &control);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002621}
2622
2623static void l2cap_send_srej_list(struct l2cap_chan *chan, u16 txseq)
2624{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002625 struct l2cap_ctrl control;
2626 u16 initial_head;
2627 u16 seq;
2628
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002629 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002630
2631 memset(&control, 0, sizeof(control));
2632 control.sframe = 1;
2633 control.super = L2CAP_SUPER_SREJ;
2634
2635 /* Capture initial list head to allow only one pass through the list. */
2636 initial_head = chan->srej_list.head;
2637
2638 do {
2639 seq = l2cap_seq_list_pop(&chan->srej_list);
2640 if (seq == txseq || seq == L2CAP_SEQ_LIST_CLEAR)
2641 break;
2642
2643 control.reqseq = seq;
2644 l2cap_send_sframe(chan, &control);
2645 l2cap_seq_list_append(&chan->srej_list, seq);
2646 } while (chan->srej_list.head != initial_head);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002647}
2648
Mat Martineau608bcc62012-05-17 20:53:32 -07002649static void l2cap_process_reqseq(struct l2cap_chan *chan, u16 reqseq)
2650{
2651 struct sk_buff *acked_skb;
2652 u16 ackseq;
2653
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002654 BT_DBG("chan %p, reqseq %u", chan, reqseq);
Mat Martineau608bcc62012-05-17 20:53:32 -07002655
2656 if (chan->unacked_frames == 0 || reqseq == chan->expected_ack_seq)
2657 return;
2658
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002659 BT_DBG("expected_ack_seq %u, unacked_frames %u",
Mat Martineau608bcc62012-05-17 20:53:32 -07002660 chan->expected_ack_seq, chan->unacked_frames);
2661
2662 for (ackseq = chan->expected_ack_seq; ackseq != reqseq;
2663 ackseq = __next_seq(chan, ackseq)) {
2664
2665 acked_skb = l2cap_ertm_seq_in_queue(&chan->tx_q, ackseq);
2666 if (acked_skb) {
2667 skb_unlink(acked_skb, &chan->tx_q);
2668 kfree_skb(acked_skb);
2669 chan->unacked_frames--;
2670 }
2671 }
2672
2673 chan->expected_ack_seq = reqseq;
2674
2675 if (chan->unacked_frames == 0)
2676 __clear_retrans_timer(chan);
2677
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002678 BT_DBG("unacked_frames %u", chan->unacked_frames);
Mat Martineau608bcc62012-05-17 20:53:32 -07002679}
2680
2681static void l2cap_abort_rx_srej_sent(struct l2cap_chan *chan)
2682{
2683 BT_DBG("chan %p", chan);
2684
2685 chan->expected_tx_seq = chan->buffer_seq;
2686 l2cap_seq_list_clear(&chan->srej_list);
2687 skb_queue_purge(&chan->srej_q);
2688 chan->rx_state = L2CAP_RX_STATE_RECV;
2689}
2690
Gustavo Padovand6603662012-05-21 13:58:22 -03002691static void l2cap_tx_state_xmit(struct l2cap_chan *chan,
2692 struct l2cap_ctrl *control,
2693 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002694{
Mat Martineau608bcc62012-05-17 20:53:32 -07002695 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2696 event);
2697
2698 switch (event) {
2699 case L2CAP_EV_DATA_REQUEST:
2700 if (chan->tx_send_head == NULL)
2701 chan->tx_send_head = skb_peek(skbs);
2702
2703 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2704 l2cap_ertm_send(chan);
2705 break;
2706 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2707 BT_DBG("Enter LOCAL_BUSY");
2708 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2709
2710 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2711 /* The SREJ_SENT state must be aborted if we are to
2712 * enter the LOCAL_BUSY state.
2713 */
2714 l2cap_abort_rx_srej_sent(chan);
2715 }
2716
2717 l2cap_send_ack(chan);
2718
2719 break;
2720 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2721 BT_DBG("Exit LOCAL_BUSY");
2722 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2723
2724 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2725 struct l2cap_ctrl local_control;
2726
2727 memset(&local_control, 0, sizeof(local_control));
2728 local_control.sframe = 1;
2729 local_control.super = L2CAP_SUPER_RR;
2730 local_control.poll = 1;
2731 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002732 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002733
2734 chan->retry_count = 1;
2735 __set_monitor_timer(chan);
2736 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2737 }
2738 break;
2739 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2740 l2cap_process_reqseq(chan, control->reqseq);
2741 break;
2742 case L2CAP_EV_EXPLICIT_POLL:
2743 l2cap_send_rr_or_rnr(chan, 1);
2744 chan->retry_count = 1;
2745 __set_monitor_timer(chan);
2746 __clear_ack_timer(chan);
2747 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2748 break;
2749 case L2CAP_EV_RETRANS_TO:
2750 l2cap_send_rr_or_rnr(chan, 1);
2751 chan->retry_count = 1;
2752 __set_monitor_timer(chan);
2753 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2754 break;
2755 case L2CAP_EV_RECV_FBIT:
2756 /* Nothing to process */
2757 break;
2758 default:
2759 break;
2760 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002761}
2762
Gustavo Padovand6603662012-05-21 13:58:22 -03002763static void l2cap_tx_state_wait_f(struct l2cap_chan *chan,
2764 struct l2cap_ctrl *control,
2765 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002766{
Mat Martineau608bcc62012-05-17 20:53:32 -07002767 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2768 event);
2769
2770 switch (event) {
2771 case L2CAP_EV_DATA_REQUEST:
2772 if (chan->tx_send_head == NULL)
2773 chan->tx_send_head = skb_peek(skbs);
2774 /* Queue data, but don't send. */
2775 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2776 break;
2777 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2778 BT_DBG("Enter LOCAL_BUSY");
2779 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2780
2781 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2782 /* The SREJ_SENT state must be aborted if we are to
2783 * enter the LOCAL_BUSY state.
2784 */
2785 l2cap_abort_rx_srej_sent(chan);
2786 }
2787
2788 l2cap_send_ack(chan);
2789
2790 break;
2791 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2792 BT_DBG("Exit LOCAL_BUSY");
2793 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2794
2795 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2796 struct l2cap_ctrl local_control;
2797 memset(&local_control, 0, sizeof(local_control));
2798 local_control.sframe = 1;
2799 local_control.super = L2CAP_SUPER_RR;
2800 local_control.poll = 1;
2801 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002802 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002803
2804 chan->retry_count = 1;
2805 __set_monitor_timer(chan);
2806 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2807 }
2808 break;
2809 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2810 l2cap_process_reqseq(chan, control->reqseq);
2811
2812 /* Fall through */
2813
2814 case L2CAP_EV_RECV_FBIT:
2815 if (control && control->final) {
2816 __clear_monitor_timer(chan);
2817 if (chan->unacked_frames > 0)
2818 __set_retrans_timer(chan);
2819 chan->retry_count = 0;
2820 chan->tx_state = L2CAP_TX_STATE_XMIT;
2821 BT_DBG("recv fbit tx_state 0x2.2%x", chan->tx_state);
2822 }
2823 break;
2824 case L2CAP_EV_EXPLICIT_POLL:
2825 /* Ignore */
2826 break;
2827 case L2CAP_EV_MONITOR_TO:
2828 if (chan->max_tx == 0 || chan->retry_count < chan->max_tx) {
2829 l2cap_send_rr_or_rnr(chan, 1);
2830 __set_monitor_timer(chan);
2831 chan->retry_count++;
2832 } else {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02002833 l2cap_send_disconn_req(chan, ECONNABORTED);
Mat Martineau608bcc62012-05-17 20:53:32 -07002834 }
2835 break;
2836 default:
2837 break;
2838 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002839}
2840
Gustavo Padovand6603662012-05-21 13:58:22 -03002841static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
2842 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002843{
Mat Martineau608bcc62012-05-17 20:53:32 -07002844 BT_DBG("chan %p, control %p, skbs %p, event %d, state %d",
2845 chan, control, skbs, event, chan->tx_state);
2846
2847 switch (chan->tx_state) {
2848 case L2CAP_TX_STATE_XMIT:
Gustavo Padovand6603662012-05-21 13:58:22 -03002849 l2cap_tx_state_xmit(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002850 break;
2851 case L2CAP_TX_STATE_WAIT_F:
Gustavo Padovand6603662012-05-21 13:58:22 -03002852 l2cap_tx_state_wait_f(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002853 break;
2854 default:
2855 /* Ignore event */
2856 break;
2857 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002858}
2859
Mat Martineau4b51dae92012-05-17 20:53:37 -07002860static void l2cap_pass_to_tx(struct l2cap_chan *chan,
2861 struct l2cap_ctrl *control)
2862{
2863 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002864 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_REQSEQ_AND_FBIT);
Mat Martineau4b51dae92012-05-17 20:53:37 -07002865}
2866
Mat Martineauf80842a2012-05-17 20:53:46 -07002867static void l2cap_pass_to_tx_fbit(struct l2cap_chan *chan,
2868 struct l2cap_ctrl *control)
2869{
2870 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002871 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_FBIT);
Mat Martineauf80842a2012-05-17 20:53:46 -07002872}
2873
Linus Torvalds1da177e2005-04-16 15:20:36 -07002874/* Copy frame to all raw sockets on that connection */
2875static void l2cap_raw_recv(struct l2cap_conn *conn, struct sk_buff *skb)
2876{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002877 struct sk_buff *nskb;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03002878 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002879
2880 BT_DBG("conn %p", conn);
2881
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002882 mutex_lock(&conn->chan_lock);
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002883
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002884 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002885 if (chan->chan_type != L2CAP_CHAN_RAW)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002886 continue;
2887
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002888 /* Don't send frame to the channel it came from */
2889 if (bt_cb(skb)->chan == chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002890 continue;
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002891
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002892 nskb = skb_clone(skb, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03002893 if (!nskb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002894 continue;
Gustavo Padovan80b98022012-05-27 22:27:51 -03002895 if (chan->ops->recv(chan, nskb))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002896 kfree_skb(nskb);
2897 }
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002898
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002899 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002900}
2901
2902/* ---- L2CAP signalling commands ---- */
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002903static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn, u8 code,
2904 u8 ident, u16 dlen, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002905{
2906 struct sk_buff *skb, **frag;
2907 struct l2cap_cmd_hdr *cmd;
2908 struct l2cap_hdr *lh;
2909 int len, count;
2910
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002911 BT_DBG("conn %p, code 0x%2.2x, ident 0x%2.2x, len %u",
2912 conn, code, ident, dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002913
Anderson Lizardo300b9622013-06-02 16:30:40 -04002914 if (conn->mtu < L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE)
2915 return NULL;
2916
Linus Torvalds1da177e2005-04-16 15:20:36 -07002917 len = L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE + dlen;
2918 count = min_t(unsigned int, conn->mtu, len);
2919
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002920 skb = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002921 if (!skb)
2922 return NULL;
2923
2924 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002925 lh->len = cpu_to_le16(L2CAP_CMD_HDR_SIZE + dlen);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002926
2927 if (conn->hcon->type == LE_LINK)
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002928 lh->cid = cpu_to_le16(L2CAP_CID_LE_SIGNALING);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002929 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002930 lh->cid = cpu_to_le16(L2CAP_CID_SIGNALING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002931
2932 cmd = (struct l2cap_cmd_hdr *) skb_put(skb, L2CAP_CMD_HDR_SIZE);
2933 cmd->code = code;
2934 cmd->ident = ident;
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002935 cmd->len = cpu_to_le16(dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002936
2937 if (dlen) {
2938 count -= L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE;
2939 memcpy(skb_put(skb, count), data, count);
2940 data += count;
2941 }
2942
2943 len -= skb->len;
2944
2945 /* Continuation fragments (no L2CAP header) */
2946 frag = &skb_shinfo(skb)->frag_list;
2947 while (len) {
2948 count = min_t(unsigned int, conn->mtu, len);
2949
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002950 *frag = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002951 if (!*frag)
2952 goto fail;
2953
2954 memcpy(skb_put(*frag, count), data, count);
2955
2956 len -= count;
2957 data += count;
2958
2959 frag = &(*frag)->next;
2960 }
2961
2962 return skb;
2963
2964fail:
2965 kfree_skb(skb);
2966 return NULL;
2967}
2968
Gustavo Padovan2d792812012-10-06 10:07:01 +01002969static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen,
2970 unsigned long *val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002971{
2972 struct l2cap_conf_opt *opt = *ptr;
2973 int len;
2974
2975 len = L2CAP_CONF_OPT_SIZE + opt->len;
2976 *ptr += len;
2977
2978 *type = opt->type;
2979 *olen = opt->len;
2980
2981 switch (opt->len) {
2982 case 1:
2983 *val = *((u8 *) opt->val);
2984 break;
2985
2986 case 2:
steven miaobfaaeb32010-10-16 18:29:47 -04002987 *val = get_unaligned_le16(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002988 break;
2989
2990 case 4:
steven miaobfaaeb32010-10-16 18:29:47 -04002991 *val = get_unaligned_le32(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002992 break;
2993
2994 default:
2995 *val = (unsigned long) opt->val;
2996 break;
2997 }
2998
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002999 BT_DBG("type 0x%2.2x len %u val 0x%lx", *type, opt->len, *val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003000 return len;
3001}
3002
Linus Torvalds1da177e2005-04-16 15:20:36 -07003003static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val)
3004{
3005 struct l2cap_conf_opt *opt = *ptr;
3006
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03003007 BT_DBG("type 0x%2.2x len %u val 0x%lx", type, len, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003008
3009 opt->type = type;
3010 opt->len = len;
3011
3012 switch (len) {
3013 case 1:
3014 *((u8 *) opt->val) = val;
3015 break;
3016
3017 case 2:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02003018 put_unaligned_le16(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003019 break;
3020
3021 case 4:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02003022 put_unaligned_le32(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003023 break;
3024
3025 default:
3026 memcpy(opt->val, (void *) val, len);
3027 break;
3028 }
3029
3030 *ptr += L2CAP_CONF_OPT_SIZE + len;
3031}
3032
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003033static void l2cap_add_opt_efs(void **ptr, struct l2cap_chan *chan)
3034{
3035 struct l2cap_conf_efs efs;
3036
Szymon Janc1ec918c2011-11-16 09:32:21 +01003037 switch (chan->mode) {
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003038 case L2CAP_MODE_ERTM:
3039 efs.id = chan->local_id;
3040 efs.stype = chan->local_stype;
3041 efs.msdu = cpu_to_le16(chan->local_msdu);
3042 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003043 efs.acc_lat = cpu_to_le32(L2CAP_DEFAULT_ACC_LAT);
3044 efs.flush_to = cpu_to_le32(L2CAP_EFS_DEFAULT_FLUSH_TO);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003045 break;
3046
3047 case L2CAP_MODE_STREAMING:
3048 efs.id = 1;
3049 efs.stype = L2CAP_SERV_BESTEFFORT;
3050 efs.msdu = cpu_to_le16(chan->local_msdu);
3051 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
3052 efs.acc_lat = 0;
3053 efs.flush_to = 0;
3054 break;
3055
3056 default:
3057 return;
3058 }
3059
3060 l2cap_add_conf_opt(ptr, L2CAP_CONF_EFS, sizeof(efs),
Andrei Emeltchenko8936fa62012-10-08 11:14:41 +03003061 (unsigned long) &efs);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003062}
3063
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003064static void l2cap_ack_timeout(struct work_struct *work)
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003065{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003066 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau03625202012-05-17 20:53:51 -07003067 ack_timer.work);
3068 u16 frames_to_ack;
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003069
Gustavo F. Padovan2fb9b3d2011-12-22 16:56:05 -02003070 BT_DBG("chan %p", chan);
3071
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003072 l2cap_chan_lock(chan);
3073
Mat Martineau03625202012-05-17 20:53:51 -07003074 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
3075 chan->last_acked_seq);
3076
3077 if (frames_to_ack)
3078 l2cap_send_rr_or_rnr(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003079
3080 l2cap_chan_unlock(chan);
Szymon Janc09bfb2e2012-01-11 10:59:49 +01003081 l2cap_chan_put(chan);
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003082}
3083
Andrei Emeltchenko466f8002012-05-29 13:59:01 +03003084int l2cap_ertm_init(struct l2cap_chan *chan)
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003085{
Mat Martineau3c588192012-04-11 10:48:42 -07003086 int err;
3087
Mat Martineau105bdf92012-04-27 16:50:48 -07003088 chan->next_tx_seq = 0;
3089 chan->expected_tx_seq = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003090 chan->expected_ack_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003091 chan->unacked_frames = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003092 chan->buffer_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003093 chan->frames_sent = 0;
Mat Martineau105bdf92012-04-27 16:50:48 -07003094 chan->last_acked_seq = 0;
3095 chan->sdu = NULL;
3096 chan->sdu_last_frag = NULL;
3097 chan->sdu_len = 0;
3098
Mat Martineaud34c34f2012-05-14 14:49:27 -07003099 skb_queue_head_init(&chan->tx_q);
3100
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003101 chan->local_amp_id = AMP_ID_BREDR;
3102 chan->move_id = AMP_ID_BREDR;
Mat Martineau08333282012-10-23 15:24:06 -07003103 chan->move_state = L2CAP_MOVE_STABLE;
3104 chan->move_role = L2CAP_MOVE_ROLE_NONE;
3105
Mat Martineau105bdf92012-04-27 16:50:48 -07003106 if (chan->mode != L2CAP_MODE_ERTM)
3107 return 0;
3108
3109 chan->rx_state = L2CAP_RX_STATE_RECV;
3110 chan->tx_state = L2CAP_TX_STATE_XMIT;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003111
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003112 INIT_DELAYED_WORK(&chan->retrans_timer, l2cap_retrans_timeout);
3113 INIT_DELAYED_WORK(&chan->monitor_timer, l2cap_monitor_timeout);
3114 INIT_DELAYED_WORK(&chan->ack_timer, l2cap_ack_timeout);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003115
Gustavo F. Padovanf1c67752011-03-25 20:36:10 -03003116 skb_queue_head_init(&chan->srej_q);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03003117
Mat Martineau3c588192012-04-11 10:48:42 -07003118 err = l2cap_seq_list_init(&chan->srej_list, chan->tx_win);
3119 if (err < 0)
3120 return err;
3121
Mat Martineau9dc9aff2012-05-17 16:20:14 -07003122 err = l2cap_seq_list_init(&chan->retrans_list, chan->remote_tx_win);
3123 if (err < 0)
3124 l2cap_seq_list_free(&chan->srej_list);
3125
3126 return err;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003127}
3128
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003129static inline __u8 l2cap_select_mode(__u8 mode, __u16 remote_feat_mask)
3130{
3131 switch (mode) {
3132 case L2CAP_MODE_STREAMING:
3133 case L2CAP_MODE_ERTM:
3134 if (l2cap_mode_supported(mode, remote_feat_mask))
3135 return mode;
3136 /* fall through */
3137 default:
3138 return L2CAP_MODE_BASIC;
3139 }
3140}
3141
Marcel Holtmann848566b2013-10-01 22:59:22 -07003142static inline bool __l2cap_ews_supported(struct l2cap_conn *conn)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003143{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003144 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003145}
3146
Marcel Holtmann848566b2013-10-01 22:59:22 -07003147static inline bool __l2cap_efs_supported(struct l2cap_conn *conn)
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003148{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003149 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_FLOW;
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003150}
3151
Mat Martineau36c86c82012-10-23 15:24:20 -07003152static void __l2cap_set_ertm_timeouts(struct l2cap_chan *chan,
3153 struct l2cap_conf_rfc *rfc)
3154{
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003155 if (chan->local_amp_id != AMP_ID_BREDR && chan->hs_hcon) {
Mat Martineau36c86c82012-10-23 15:24:20 -07003156 u64 ertm_to = chan->hs_hcon->hdev->amp_be_flush_to;
3157
3158 /* Class 1 devices have must have ERTM timeouts
3159 * exceeding the Link Supervision Timeout. The
3160 * default Link Supervision Timeout for AMP
3161 * controllers is 10 seconds.
3162 *
3163 * Class 1 devices use 0xffffffff for their
3164 * best-effort flush timeout, so the clamping logic
3165 * will result in a timeout that meets the above
3166 * requirement. ERTM timeouts are 16-bit values, so
3167 * the maximum timeout is 65.535 seconds.
3168 */
3169
3170 /* Convert timeout to milliseconds and round */
3171 ertm_to = DIV_ROUND_UP_ULL(ertm_to, 1000);
3172
3173 /* This is the recommended formula for class 2 devices
3174 * that start ERTM timers when packets are sent to the
3175 * controller.
3176 */
3177 ertm_to = 3 * ertm_to + 500;
3178
3179 if (ertm_to > 0xffff)
3180 ertm_to = 0xffff;
3181
3182 rfc->retrans_timeout = cpu_to_le16((u16) ertm_to);
3183 rfc->monitor_timeout = rfc->retrans_timeout;
3184 } else {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003185 rfc->retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO);
3186 rfc->monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO);
Mat Martineau36c86c82012-10-23 15:24:20 -07003187 }
3188}
3189
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003190static inline void l2cap_txwin_setup(struct l2cap_chan *chan)
3191{
3192 if (chan->tx_win > L2CAP_DEFAULT_TX_WINDOW &&
Marcel Holtmann848566b2013-10-01 22:59:22 -07003193 __l2cap_ews_supported(chan->conn)) {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003194 /* use extended control field */
3195 set_bit(FLAG_EXT_CTRL, &chan->flags);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003196 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
3197 } else {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003198 chan->tx_win = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003199 L2CAP_DEFAULT_TX_WINDOW);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003200 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
3201 }
Mat Martineauc20f8e32012-07-10 05:47:07 -07003202 chan->ack_win = chan->tx_win;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003203}
3204
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003205static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003206{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003207 struct l2cap_conf_req *req = data;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003208 struct l2cap_conf_rfc rfc = { .mode = chan->mode };
Linus Torvalds1da177e2005-04-16 15:20:36 -07003209 void *ptr = req->data;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003210 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003211
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03003212 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003213
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003214 if (chan->num_conf_req || chan->num_conf_rsp)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003215 goto done;
3216
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003217 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003218 case L2CAP_MODE_STREAMING:
3219 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003220 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state))
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003221 break;
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003222
Marcel Holtmann848566b2013-10-01 22:59:22 -07003223 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003224 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3225
Gustavo F. Padovan2ba13ed2010-06-09 16:39:05 -03003226 /* fall through */
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003227 default:
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003228 chan->mode = l2cap_select_mode(rfc.mode, chan->conn->feat_mask);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003229 break;
3230 }
3231
3232done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003233 if (chan->imtu != L2CAP_DEFAULT_MTU)
3234 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovan7990681c2011-01-24 16:01:43 -02003235
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003236 switch (chan->mode) {
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003237 case L2CAP_MODE_BASIC:
Marcel Holtmann6fea7ad2014-07-09 11:53:35 +02003238 if (disable_ertm)
3239 break;
3240
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003241 if (!(chan->conn->feat_mask & L2CAP_FEAT_ERTM) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003242 !(chan->conn->feat_mask & L2CAP_FEAT_STREAMING))
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003243 break;
3244
Gustavo F. Padovan62547752010-06-08 20:05:31 -03003245 rfc.mode = L2CAP_MODE_BASIC;
3246 rfc.txwin_size = 0;
3247 rfc.max_transmit = 0;
3248 rfc.retrans_timeout = 0;
3249 rfc.monitor_timeout = 0;
3250 rfc.max_pdu_size = 0;
3251
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003252 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003253 (unsigned long) &rfc);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003254 break;
3255
3256 case L2CAP_MODE_ERTM:
3257 rfc.mode = L2CAP_MODE_ERTM;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003258 rfc.max_transmit = chan->max_tx;
Mat Martineau36c86c82012-10-23 15:24:20 -07003259
3260 __l2cap_set_ertm_timeouts(chan, &rfc);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003261
3262 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003263 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3264 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003265 rfc.max_pdu_size = cpu_to_le16(size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003266
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003267 l2cap_txwin_setup(chan);
3268
3269 rfc.txwin_size = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003270 L2CAP_DEFAULT_TX_WINDOW);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003271
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003272 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003273 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003274
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003275 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3276 l2cap_add_opt_efs(&ptr, chan);
3277
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003278 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3279 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003280 chan->tx_win);
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003281
3282 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3283 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003284 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003285 chan->fcs = L2CAP_FCS_NONE;
3286 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3287 chan->fcs);
3288 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003289 break;
3290
3291 case L2CAP_MODE_STREAMING:
Mat Martineau273759e2012-05-17 20:53:53 -07003292 l2cap_txwin_setup(chan);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003293 rfc.mode = L2CAP_MODE_STREAMING;
3294 rfc.txwin_size = 0;
3295 rfc.max_transmit = 0;
3296 rfc.retrans_timeout = 0;
3297 rfc.monitor_timeout = 0;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003298
3299 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003300 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3301 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003302 rfc.max_pdu_size = cpu_to_le16(size);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003303
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003304 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003305 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003306
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003307 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3308 l2cap_add_opt_efs(&ptr, chan);
3309
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003310 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3311 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003312 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003313 chan->fcs = L2CAP_FCS_NONE;
3314 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3315 chan->fcs);
3316 }
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003317 break;
3318 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003319
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003320 req->dcid = cpu_to_le16(chan->dcid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003321 req->flags = cpu_to_le16(0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003322
3323 return ptr - data;
3324}
3325
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003326static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003327{
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003328 struct l2cap_conf_rsp *rsp = data;
3329 void *ptr = rsp->data;
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003330 void *req = chan->conf_req;
3331 int len = chan->conf_len;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003332 int type, hint, olen;
3333 unsigned long val;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003334 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003335 struct l2cap_conf_efs efs;
3336 u8 remote_efs = 0;
Marcel Holtmann861d6882007-10-20 13:37:06 +02003337 u16 mtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003338 u16 result = L2CAP_CONF_SUCCESS;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003339 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003340
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003341 BT_DBG("chan %p", chan);
Marcel Holtmann820ae1b2006-11-18 22:15:00 +01003342
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003343 while (len >= L2CAP_CONF_OPT_SIZE) {
3344 len -= l2cap_get_conf_opt(&req, &type, &olen, &val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003345
Gustavo F. Padovan589d2742009-04-20 01:31:07 -03003346 hint = type & L2CAP_CONF_HINT;
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07003347 type &= L2CAP_CONF_MASK;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003348
3349 switch (type) {
3350 case L2CAP_CONF_MTU:
Marcel Holtmann861d6882007-10-20 13:37:06 +02003351 mtu = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003352 break;
3353
3354 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003355 chan->flush_to = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003356 break;
3357
3358 case L2CAP_CONF_QOS:
3359 break;
3360
Marcel Holtmann6464f352007-10-20 13:39:51 +02003361 case L2CAP_CONF_RFC:
3362 if (olen == sizeof(rfc))
3363 memcpy(&rfc, (void *) val, olen);
3364 break;
3365
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003366 case L2CAP_CONF_FCS:
3367 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003368 set_bit(CONF_RECV_NO_FCS, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003369 break;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003370
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003371 case L2CAP_CONF_EFS:
3372 remote_efs = 1;
3373 if (olen == sizeof(efs))
3374 memcpy(&efs, (void *) val, olen);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003375 break;
3376
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003377 case L2CAP_CONF_EWS:
Marcel Holtmann848566b2013-10-01 22:59:22 -07003378 if (!chan->conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003379 return -ECONNREFUSED;
3380
3381 set_bit(FLAG_EXT_CTRL, &chan->flags);
3382 set_bit(CONF_EWS_RECV, &chan->conf_state);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003383 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003384 chan->remote_tx_win = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003385 break;
3386
3387 default:
3388 if (hint)
3389 break;
3390
3391 result = L2CAP_CONF_UNKNOWN;
3392 *((u8 *) ptr++) = type;
3393 break;
3394 }
3395 }
3396
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003397 if (chan->num_conf_rsp || chan->num_conf_req > 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003398 goto done;
3399
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003400 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003401 case L2CAP_MODE_STREAMING:
3402 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003403 if (!test_bit(CONF_STATE2_DEVICE, &chan->conf_state)) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003404 chan->mode = l2cap_select_mode(rfc.mode,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003405 chan->conn->feat_mask);
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003406 break;
3407 }
3408
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003409 if (remote_efs) {
Marcel Holtmann848566b2013-10-01 22:59:22 -07003410 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003411 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3412 else
3413 return -ECONNREFUSED;
3414 }
3415
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003416 if (chan->mode != rfc.mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003417 return -ECONNREFUSED;
Gustavo F. Padovan742e5192010-06-08 19:09:48 -03003418
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003419 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003420 }
3421
3422done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003423 if (chan->mode != rfc.mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003424 result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003425 rfc.mode = chan->mode;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003426
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003427 if (chan->num_conf_rsp == 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003428 return -ECONNREFUSED;
3429
Gustavo Padovan2d792812012-10-06 10:07:01 +01003430 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3431 (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003432 }
3433
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003434 if (result == L2CAP_CONF_SUCCESS) {
3435 /* Configure output options and let the other side know
3436 * which ones we don't like. */
3437
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003438 if (mtu < L2CAP_DEFAULT_MIN_MTU)
3439 result = L2CAP_CONF_UNACCEPT;
3440 else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003441 chan->omtu = mtu;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003442 set_bit(CONF_MTU_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003443 }
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003444 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->omtu);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003445
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003446 if (remote_efs) {
3447 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003448 efs.stype != L2CAP_SERV_NOTRAFIC &&
3449 efs.stype != chan->local_stype) {
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003450
3451 result = L2CAP_CONF_UNACCEPT;
3452
3453 if (chan->num_conf_req >= 1)
3454 return -ECONNREFUSED;
3455
3456 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003457 sizeof(efs),
3458 (unsigned long) &efs);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003459 } else {
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003460 /* Send PENDING Conf Rsp */
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003461 result = L2CAP_CONF_PENDING;
3462 set_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003463 }
3464 }
3465
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003466 switch (rfc.mode) {
3467 case L2CAP_MODE_BASIC:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003468 chan->fcs = L2CAP_FCS_NONE;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003469 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003470 break;
3471
3472 case L2CAP_MODE_ERTM:
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003473 if (!test_bit(CONF_EWS_RECV, &chan->conf_state))
3474 chan->remote_tx_win = rfc.txwin_size;
3475 else
3476 rfc.txwin_size = L2CAP_DEFAULT_TX_WINDOW;
3477
Gustavo F. Padovan2c03a7a2011-03-25 20:15:28 -03003478 chan->remote_max_tx = rfc.max_transmit;
Mat Martineau86b1b262010-08-05 15:54:22 -07003479
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003480 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003481 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3482 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003483 rfc.max_pdu_size = cpu_to_le16(size);
3484 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003485
Mat Martineau36c86c82012-10-23 15:24:20 -07003486 __l2cap_set_ertm_timeouts(chan, &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003487
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003488 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003489
3490 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003491 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003492
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003493 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3494 chan->remote_id = efs.id;
3495 chan->remote_stype = efs.stype;
3496 chan->remote_msdu = le16_to_cpu(efs.msdu);
3497 chan->remote_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003498 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003499 chan->remote_acc_lat =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003500 le32_to_cpu(efs.acc_lat);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003501 chan->remote_sdu_itime =
3502 le32_to_cpu(efs.sdu_itime);
3503 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003504 sizeof(efs),
3505 (unsigned long) &efs);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003506 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003507 break;
3508
3509 case L2CAP_MODE_STREAMING:
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003510 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003511 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3512 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003513 rfc.max_pdu_size = cpu_to_le16(size);
3514 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003515
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003516 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003517
Gustavo Padovan2d792812012-10-06 10:07:01 +01003518 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3519 (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003520
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003521 break;
3522
3523 default:
Marcel Holtmann6464f352007-10-20 13:39:51 +02003524 result = L2CAP_CONF_UNACCEPT;
3525
3526 memset(&rfc, 0, sizeof(rfc));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003527 rfc.mode = chan->mode;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003528 }
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003529
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003530 if (result == L2CAP_CONF_SUCCESS)
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003531 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003532 }
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003533 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003534 rsp->result = cpu_to_le16(result);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003535 rsp->flags = cpu_to_le16(0);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003536
3537 return ptr - data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003538}
3539
Gustavo Padovan2d792812012-10-06 10:07:01 +01003540static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len,
3541 void *data, u16 *result)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003542{
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003543 struct l2cap_conf_req *req = data;
3544 void *ptr = req->data;
3545 int type, olen;
3546 unsigned long val;
Mat Martineau36e999a2011-12-08 17:23:21 -08003547 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003548 struct l2cap_conf_efs efs;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003549
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003550 BT_DBG("chan %p, rsp %p, len %d, req %p", chan, rsp, len, data);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003551
3552 while (len >= L2CAP_CONF_OPT_SIZE) {
3553 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3554
3555 switch (type) {
3556 case L2CAP_CONF_MTU:
3557 if (val < L2CAP_DEFAULT_MIN_MTU) {
3558 *result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003559 chan->imtu = L2CAP_DEFAULT_MIN_MTU;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003560 } else
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003561 chan->imtu = val;
3562 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003563 break;
3564
3565 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003566 chan->flush_to = val;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003567 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003568 2, chan->flush_to);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003569 break;
3570
3571 case L2CAP_CONF_RFC:
3572 if (olen == sizeof(rfc))
3573 memcpy(&rfc, (void *)val, olen);
3574
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003575 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003576 rfc.mode != chan->mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003577 return -ECONNREFUSED;
3578
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003579 chan->fcs = 0;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003580
3581 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003582 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003583 break;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003584
3585 case L2CAP_CONF_EWS:
Mat Martineauc20f8e32012-07-10 05:47:07 -07003586 chan->ack_win = min_t(u16, val, chan->ack_win);
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003587 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Mat Martineauc20f8e32012-07-10 05:47:07 -07003588 chan->tx_win);
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003589 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003590
3591 case L2CAP_CONF_EFS:
3592 if (olen == sizeof(efs))
3593 memcpy(&efs, (void *)val, olen);
3594
3595 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003596 efs.stype != L2CAP_SERV_NOTRAFIC &&
3597 efs.stype != chan->local_stype)
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003598 return -ECONNREFUSED;
3599
Gustavo Padovan2d792812012-10-06 10:07:01 +01003600 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS, sizeof(efs),
3601 (unsigned long) &efs);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003602 break;
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003603
3604 case L2CAP_CONF_FCS:
3605 if (*result == L2CAP_CONF_PENDING)
3606 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003607 set_bit(CONF_RECV_NO_FCS,
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003608 &chan->conf_state);
3609 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003610 }
3611 }
3612
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003613 if (chan->mode == L2CAP_MODE_BASIC && chan->mode != rfc.mode)
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003614 return -ECONNREFUSED;
3615
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003616 chan->mode = rfc.mode;
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003617
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003618 if (*result == L2CAP_CONF_SUCCESS || *result == L2CAP_CONF_PENDING) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003619 switch (rfc.mode) {
3620 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003621 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3622 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
3623 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003624 if (!test_bit(FLAG_EXT_CTRL, &chan->flags))
3625 chan->ack_win = min_t(u16, chan->ack_win,
3626 rfc.txwin_size);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003627
3628 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3629 chan->local_msdu = le16_to_cpu(efs.msdu);
3630 chan->local_sdu_itime =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003631 le32_to_cpu(efs.sdu_itime);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003632 chan->local_acc_lat = le32_to_cpu(efs.acc_lat);
3633 chan->local_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003634 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003635 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003636 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003637
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003638 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003639 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003640 }
3641 }
3642
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003643 req->dcid = cpu_to_le16(chan->dcid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003644 req->flags = cpu_to_le16(0);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003645
3646 return ptr - data;
3647}
3648
Gustavo Padovan2d792812012-10-06 10:07:01 +01003649static int l2cap_build_conf_rsp(struct l2cap_chan *chan, void *data,
3650 u16 result, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003651{
3652 struct l2cap_conf_rsp *rsp = data;
3653 void *ptr = rsp->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003654
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003655 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003656
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003657 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003658 rsp->result = cpu_to_le16(result);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003659 rsp->flags = cpu_to_le16(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003660
3661 return ptr - data;
3662}
3663
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003664void __l2cap_le_connect_rsp_defer(struct l2cap_chan *chan)
3665{
3666 struct l2cap_le_conn_rsp rsp;
3667 struct l2cap_conn *conn = chan->conn;
3668
3669 BT_DBG("chan %p", chan);
3670
3671 rsp.dcid = cpu_to_le16(chan->scid);
3672 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02003673 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03003674 rsp.credits = cpu_to_le16(chan->rx_credits);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003675 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003676
3677 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp),
3678 &rsp);
3679}
3680
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003681void __l2cap_connect_rsp_defer(struct l2cap_chan *chan)
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003682{
3683 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003684 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003685 u8 buf[128];
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003686 u8 rsp_code;
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003687
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003688 rsp.scid = cpu_to_le16(chan->dcid);
3689 rsp.dcid = cpu_to_le16(chan->scid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003690 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
3691 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003692
3693 if (chan->hs_hcon)
3694 rsp_code = L2CAP_CREATE_CHAN_RSP;
3695 else
3696 rsp_code = L2CAP_CONN_RSP;
3697
3698 BT_DBG("chan %p rsp_code %u", chan, rsp_code);
3699
3700 l2cap_send_cmd(conn, chan->ident, rsp_code, sizeof(rsp), &rsp);
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003701
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003702 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003703 return;
3704
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003705 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003706 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003707 chan->num_conf_req++;
3708}
3709
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003710static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len)
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003711{
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003712 int type, olen;
3713 unsigned long val;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003714 /* Use sane default values in case a misbehaving remote device
3715 * did not send an RFC or extended window size option.
3716 */
3717 u16 txwin_ext = chan->ack_win;
3718 struct l2cap_conf_rfc rfc = {
3719 .mode = chan->mode,
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003720 .retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO),
3721 .monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO),
Mat Martineauc20f8e32012-07-10 05:47:07 -07003722 .max_pdu_size = cpu_to_le16(chan->imtu),
3723 .txwin_size = min_t(u16, chan->ack_win, L2CAP_DEFAULT_TX_WINDOW),
3724 };
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003725
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003726 BT_DBG("chan %p, rsp %p, len %d", chan, rsp, len);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003727
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003728 if ((chan->mode != L2CAP_MODE_ERTM) && (chan->mode != L2CAP_MODE_STREAMING))
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003729 return;
3730
3731 while (len >= L2CAP_CONF_OPT_SIZE) {
3732 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3733
Mat Martineauc20f8e32012-07-10 05:47:07 -07003734 switch (type) {
3735 case L2CAP_CONF_RFC:
3736 if (olen == sizeof(rfc))
3737 memcpy(&rfc, (void *)val, olen);
Szymon Janc8f321f82012-06-08 11:33:33 +02003738 break;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003739 case L2CAP_CONF_EWS:
3740 txwin_ext = val;
3741 break;
3742 }
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003743 }
3744
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003745 switch (rfc.mode) {
3746 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003747 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3748 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003749 chan->mps = le16_to_cpu(rfc.max_pdu_size);
3750 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3751 chan->ack_win = min_t(u16, chan->ack_win, txwin_ext);
3752 else
3753 chan->ack_win = min_t(u16, chan->ack_win,
3754 rfc.txwin_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003755 break;
3756 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003757 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003758 }
3759}
3760
Gustavo Padovan2d792812012-10-06 10:07:01 +01003761static inline int l2cap_command_rej(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003762 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3763 u8 *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003764{
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003765 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003766
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003767 if (cmd_len < sizeof(*rej))
3768 return -EPROTO;
3769
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003770 if (rej->reason != L2CAP_REJ_NOT_UNDERSTOOD)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003771 return 0;
3772
3773 if ((conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003774 cmd->ident == conn->info_ident) {
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02003775 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann984947d2009-02-06 23:35:19 +01003776
3777 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01003778 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01003779
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003780 l2cap_conn_start(conn);
3781 }
3782
3783 return 0;
3784}
3785
Mat Martineau17009152012-10-23 15:24:07 -07003786static struct l2cap_chan *l2cap_connect(struct l2cap_conn *conn,
3787 struct l2cap_cmd_hdr *cmd,
3788 u8 *data, u8 rsp_code, u8 amp_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003789{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003790 struct l2cap_conn_req *req = (struct l2cap_conn_req *) data;
3791 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003792 struct l2cap_chan *chan = NULL, *pchan;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003793 int result, status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003794
3795 u16 dcid = 0, scid = __le16_to_cpu(req->scid);
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003796 __le16 psm = req->psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003797
Andrei Emeltchenko097db762012-03-09 14:16:17 +02003798 BT_DBG("psm 0x%2.2x scid 0x%4.4x", __le16_to_cpu(psm), scid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003799
3800 /* Check if we have socket listening on psm */
Marcel Holtmann6f59b902013-10-13 05:24:01 -07003801 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03003802 &conn->hcon->dst, ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003803 if (!pchan) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003804 result = L2CAP_CR_BAD_PSM;
3805 goto sendresp;
3806 }
3807
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003808 mutex_lock(&conn->chan_lock);
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003809 l2cap_chan_lock(pchan);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00003810
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003811 /* Check if the ACL is secure enough (if not SDP) */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003812 if (psm != cpu_to_le16(L2CAP_PSM_SDP) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003813 !hci_conn_check_link_mode(conn->hcon)) {
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02003814 conn->disc_reason = HCI_ERROR_AUTH_FAILURE;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003815 result = L2CAP_CR_SEC_BLOCK;
3816 goto response;
3817 }
3818
Linus Torvalds1da177e2005-04-16 15:20:36 -07003819 result = L2CAP_CR_NO_MEM;
3820
Gustavo Padovan2dfa1002012-05-27 22:27:58 -03003821 /* Check if we already have channel with that dcid */
3822 if (__l2cap_get_chan_by_dcid(conn, scid))
3823 goto response;
3824
Gustavo Padovan80b98022012-05-27 22:27:51 -03003825 chan = pchan->ops->new_connection(pchan);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03003826 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003827 goto response;
3828
Syam Sidhardhan330b6c12013-08-06 01:59:12 +09003829 /* For certain devices (ex: HID mouse), support for authentication,
3830 * pairing and bonding is optional. For such devices, inorder to avoid
3831 * the ACL alive for too long after L2CAP disconnection, reset the ACL
3832 * disc_timeout back to HCI_DISCONN_TIMEOUT during L2CAP connect.
3833 */
3834 conn->hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
3835
Marcel Holtmann7eafc592013-10-13 08:12:47 -07003836 bacpy(&chan->src, &conn->hcon->src);
3837 bacpy(&chan->dst, &conn->hcon->dst);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -07003838 chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type);
3839 chan->dst_type = bdaddr_type(conn->hcon, conn->hcon->dst_type);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003840 chan->psm = psm;
3841 chan->dcid = scid;
Mat Martineau17009152012-10-23 15:24:07 -07003842 chan->local_amp_id = amp_id;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003843
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003844 __l2cap_chan_add(conn, chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003845
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003846 dcid = chan->scid;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003847
Gustavo Padovan8d836d72013-10-15 19:24:47 -03003848 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003849
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003850 chan->ident = cmd->ident;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003851
Marcel Holtmann984947d2009-02-06 23:35:19 +01003852 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) {
Johan Hedberge7cafc42014-07-17 15:35:38 +03003853 if (l2cap_chan_check_security(chan, false)) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07003854 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003855 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003856 result = L2CAP_CR_PEND;
3857 status = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08003858 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003859 } else {
Mat Martineau17009152012-10-23 15:24:07 -07003860 /* Force pending result for AMP controllers.
3861 * The connection will succeed after the
3862 * physical link is up.
3863 */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003864 if (amp_id == AMP_ID_BREDR) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003865 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau17009152012-10-23 15:24:07 -07003866 result = L2CAP_CR_SUCCESS;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003867 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003868 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003869 result = L2CAP_CR_PEND;
Mat Martineau17009152012-10-23 15:24:07 -07003870 }
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003871 status = L2CAP_CS_NO_INFO;
3872 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003873 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003874 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003875 result = L2CAP_CR_PEND;
3876 status = L2CAP_CS_AUTHEN_PEND;
3877 }
3878 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003879 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003880 result = L2CAP_CR_PEND;
3881 status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003882 }
3883
Linus Torvalds1da177e2005-04-16 15:20:36 -07003884response:
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003885 l2cap_chan_unlock(pchan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003886 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003887
3888sendresp:
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003889 rsp.scid = cpu_to_le16(scid);
3890 rsp.dcid = cpu_to_le16(dcid);
3891 rsp.result = cpu_to_le16(result);
3892 rsp.status = cpu_to_le16(status);
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003893 l2cap_send_cmd(conn, cmd->ident, rsp_code, sizeof(rsp), &rsp);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003894
3895 if (result == L2CAP_CR_PEND && status == L2CAP_CS_NO_INFO) {
3896 struct l2cap_info_req info;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003897 info.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003898
3899 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
3900 conn->info_ident = l2cap_get_ident(conn);
3901
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08003902 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003903
Gustavo Padovan2d792812012-10-06 10:07:01 +01003904 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
3905 sizeof(info), &info);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003906 }
3907
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003908 if (chan && !test_bit(CONF_REQ_SENT, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003909 result == L2CAP_CR_SUCCESS) {
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003910 u8 buf[128];
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003911 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003912 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003913 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003914 chan->num_conf_req++;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003915 }
Mat Martineau17009152012-10-23 15:24:07 -07003916
3917 return chan;
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003918}
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003919
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003920static int l2cap_connect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003921 struct l2cap_cmd_hdr *cmd, u16 cmd_len, u8 *data)
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003922{
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303923 struct hci_dev *hdev = conn->hcon->hdev;
3924 struct hci_conn *hcon = conn->hcon;
3925
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003926 if (cmd_len < sizeof(struct l2cap_conn_req))
3927 return -EPROTO;
3928
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303929 hci_dev_lock(hdev);
3930 if (test_bit(HCI_MGMT, &hdev->dev_flags) &&
3931 !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &hcon->flags))
3932 mgmt_device_connected(hdev, &hcon->dst, hcon->type,
3933 hcon->dst_type, 0, NULL, 0,
3934 hcon->dev_class);
3935 hci_dev_unlock(hdev);
3936
Gustavo Padovan300229f2012-10-12 19:40:40 +08003937 l2cap_connect(conn, cmd, data, L2CAP_CONN_RSP, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003938 return 0;
3939}
3940
Mat Martineau5909cf32012-10-23 15:24:08 -07003941static int l2cap_connect_create_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003942 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3943 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003944{
3945 struct l2cap_conn_rsp *rsp = (struct l2cap_conn_rsp *) data;
3946 u16 scid, dcid, result, status;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003947 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003948 u8 req[128];
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003949 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003950
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003951 if (cmd_len < sizeof(*rsp))
3952 return -EPROTO;
3953
Linus Torvalds1da177e2005-04-16 15:20:36 -07003954 scid = __le16_to_cpu(rsp->scid);
3955 dcid = __le16_to_cpu(rsp->dcid);
3956 result = __le16_to_cpu(rsp->result);
3957 status = __le16_to_cpu(rsp->status);
3958
Andrei Emeltchenko1b009c92012-02-21 12:54:54 +02003959 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 +01003960 dcid, scid, result, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003961
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003962 mutex_lock(&conn->chan_lock);
3963
Linus Torvalds1da177e2005-04-16 15:20:36 -07003964 if (scid) {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003965 chan = __l2cap_get_chan_by_scid(conn, scid);
3966 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003967 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003968 goto unlock;
3969 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003970 } else {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003971 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
3972 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003973 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003974 goto unlock;
3975 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003976 }
3977
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003978 err = 0;
3979
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003980 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003981
Linus Torvalds1da177e2005-04-16 15:20:36 -07003982 switch (result) {
3983 case L2CAP_CR_SUCCESS:
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03003984 l2cap_state_change(chan, BT_CONFIG);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003985 chan->ident = 0;
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003986 chan->dcid = dcid;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003987 clear_bit(CONF_CONNECT_PEND, &chan->conf_state);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01003988
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003989 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003990 break;
3991
Linus Torvalds1da177e2005-04-16 15:20:36 -07003992 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003993 l2cap_build_conf_req(chan, req), req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003994 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003995 break;
3996
3997 case L2CAP_CR_PEND:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003998 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003999 break;
4000
4001 default:
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004002 l2cap_chan_del(chan, ECONNREFUSED);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004003 break;
4004 }
4005
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004006 l2cap_chan_unlock(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004007
4008unlock:
4009 mutex_unlock(&conn->chan_lock);
4010
4011 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004012}
4013
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004014static inline void set_default_fcs(struct l2cap_chan *chan)
Mat Martineau8c462b62010-08-24 15:35:42 -07004015{
4016 /* FCS is enabled only in ERTM or streaming mode, if one or both
4017 * sides request it.
4018 */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03004019 if (chan->mode != L2CAP_MODE_ERTM && chan->mode != L2CAP_MODE_STREAMING)
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004020 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02004021 else if (!test_bit(CONF_RECV_NO_FCS, &chan->conf_state))
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004022 chan->fcs = L2CAP_FCS_CRC16;
Mat Martineau8c462b62010-08-24 15:35:42 -07004023}
4024
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03004025static void l2cap_send_efs_conf_rsp(struct l2cap_chan *chan, void *data,
4026 u8 ident, u16 flags)
4027{
4028 struct l2cap_conn *conn = chan->conn;
4029
4030 BT_DBG("conn %p chan %p ident %d flags 0x%4.4x", conn, chan, ident,
4031 flags);
4032
4033 clear_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
4034 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
4035
4036 l2cap_send_cmd(conn, ident, L2CAP_CONF_RSP,
4037 l2cap_build_conf_rsp(chan, data,
4038 L2CAP_CONF_SUCCESS, flags), data);
4039}
4040
Johan Hedberg662d6522013-10-16 11:20:47 +03004041static void cmd_reject_invalid_cid(struct l2cap_conn *conn, u8 ident,
4042 u16 scid, u16 dcid)
4043{
4044 struct l2cap_cmd_rej_cid rej;
4045
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004046 rej.reason = cpu_to_le16(L2CAP_REJ_INVALID_CID);
Johan Hedberg662d6522013-10-16 11:20:47 +03004047 rej.scid = __cpu_to_le16(scid);
4048 rej.dcid = __cpu_to_le16(dcid);
4049
4050 l2cap_send_cmd(conn, ident, L2CAP_COMMAND_REJ, sizeof(rej), &rej);
4051}
4052
Gustavo Padovan2d792812012-10-06 10:07:01 +01004053static inline int l2cap_config_req(struct l2cap_conn *conn,
4054 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4055 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004056{
4057 struct l2cap_conf_req *req = (struct l2cap_conf_req *) data;
4058 u16 dcid, flags;
4059 u8 rsp[64];
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004060 struct l2cap_chan *chan;
Mat Martineau3c588192012-04-11 10:48:42 -07004061 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004062
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004063 if (cmd_len < sizeof(*req))
4064 return -EPROTO;
4065
Linus Torvalds1da177e2005-04-16 15:20:36 -07004066 dcid = __le16_to_cpu(req->dcid);
4067 flags = __le16_to_cpu(req->flags);
4068
4069 BT_DBG("dcid 0x%4.4x flags 0x%2.2x", dcid, flags);
4070
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004071 chan = l2cap_get_chan_by_scid(conn, dcid);
Johan Hedberg662d6522013-10-16 11:20:47 +03004072 if (!chan) {
4073 cmd_reject_invalid_cid(conn, cmd->ident, dcid, 0);
4074 return 0;
4075 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004076
David S. Miller033b1142011-07-21 13:38:42 -07004077 if (chan->state != BT_CONFIG && chan->state != BT_CONNECT2) {
Johan Hedberg662d6522013-10-16 11:20:47 +03004078 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4079 chan->dcid);
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004080 goto unlock;
Gustavo F. Padovandf6bd742010-06-14 02:26:15 -03004081 }
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004082
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004083 /* Reject if config buffer is too small. */
Al Viro88219a02007-07-29 00:17:25 -07004084 len = cmd_len - sizeof(*req);
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004085 if (chan->conf_len + len > sizeof(chan->conf_req)) {
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004086 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004087 l2cap_build_conf_rsp(chan, rsp,
4088 L2CAP_CONF_REJECT, flags), rsp);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004089 goto unlock;
4090 }
4091
4092 /* Store config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004093 memcpy(chan->conf_req + chan->conf_len, req->data, len);
4094 chan->conf_len += len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004095
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004096 if (flags & L2CAP_CONF_FLAG_CONTINUATION) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004097 /* Incomplete config. Send empty response. */
4098 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004099 l2cap_build_conf_rsp(chan, rsp,
4100 L2CAP_CONF_SUCCESS, flags), rsp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004101 goto unlock;
4102 }
4103
4104 /* Complete config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004105 len = l2cap_parse_conf_req(chan, rsp);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004106 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004107 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004108 goto unlock;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004109 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004110
Mat Martineau1500109b2012-10-23 15:24:15 -07004111 chan->ident = cmd->ident;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004112 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004113 chan->num_conf_rsp++;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004114
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004115 /* Reset config buffer. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004116 chan->conf_len = 0;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004117
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004118 if (!test_bit(CONF_OUTPUT_DONE, &chan->conf_state))
Marcel Holtmann876d9482007-10-20 13:35:42 +02004119 goto unlock;
4120
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004121 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004122 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004123
Mat Martineau105bdf92012-04-27 16:50:48 -07004124 if (chan->mode == L2CAP_MODE_ERTM ||
4125 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004126 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004127
Mat Martineau3c588192012-04-11 10:48:42 -07004128 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004129 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004130 else
4131 l2cap_chan_ready(chan);
4132
Marcel Holtmann876d9482007-10-20 13:35:42 +02004133 goto unlock;
4134 }
4135
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004136 if (!test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02004137 u8 buf[64];
Linus Torvalds1da177e2005-04-16 15:20:36 -07004138 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004139 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004140 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004141 }
4142
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004143 /* Got Conf Rsp PENDING from remote side and asume we sent
4144 Conf Rsp PENDING in the code above */
4145 if (test_bit(CONF_REM_CONF_PEND, &chan->conf_state) &&
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03004146 test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004147
4148 /* check compatibility */
4149
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004150 /* Send rsp for BR/EDR channel */
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004151 if (!chan->hs_hcon)
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004152 l2cap_send_efs_conf_rsp(chan, rsp, cmd->ident, flags);
4153 else
4154 chan->ident = cmd->ident;
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004155 }
4156
Linus Torvalds1da177e2005-04-16 15:20:36 -07004157unlock:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004158 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004159 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004160}
4161
Gustavo Padovan2d792812012-10-06 10:07:01 +01004162static inline int l2cap_config_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004163 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4164 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004165{
4166 struct l2cap_conf_rsp *rsp = (struct l2cap_conf_rsp *)data;
4167 u16 scid, flags, result;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004168 struct l2cap_chan *chan;
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004169 int len = cmd_len - sizeof(*rsp);
Mat Martineau3c588192012-04-11 10:48:42 -07004170 int err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004171
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004172 if (cmd_len < sizeof(*rsp))
4173 return -EPROTO;
4174
Linus Torvalds1da177e2005-04-16 15:20:36 -07004175 scid = __le16_to_cpu(rsp->scid);
4176 flags = __le16_to_cpu(rsp->flags);
4177 result = __le16_to_cpu(rsp->result);
4178
Andrei Emeltchenko61386cb2012-03-12 12:13:07 +02004179 BT_DBG("scid 0x%4.4x flags 0x%2.2x result 0x%2.2x len %d", scid, flags,
4180 result, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004181
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004182 chan = l2cap_get_chan_by_scid(conn, scid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004183 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004184 return 0;
4185
4186 switch (result) {
4187 case L2CAP_CONF_SUCCESS:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004188 l2cap_conf_rfc_get(chan, rsp->data, len);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004189 clear_bit(CONF_REM_CONF_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004190 break;
4191
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004192 case L2CAP_CONF_PENDING:
4193 set_bit(CONF_REM_CONF_PEND, &chan->conf_state);
4194
4195 if (test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
4196 char buf[64];
4197
4198 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004199 buf, &result);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004200 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004201 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004202 goto done;
4203 }
4204
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004205 if (!chan->hs_hcon) {
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004206 l2cap_send_efs_conf_rsp(chan, buf, cmd->ident,
4207 0);
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02004208 } else {
4209 if (l2cap_check_efs(chan)) {
4210 amp_create_logical_link(chan);
4211 chan->ident = cmd->ident;
4212 }
4213 }
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004214 }
4215 goto done;
4216
Linus Torvalds1da177e2005-04-16 15:20:36 -07004217 case L2CAP_CONF_UNACCEPT:
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004218 if (chan->num_conf_rsp <= L2CAP_CONF_MAX_CONF_RSP) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004219 char req[64];
4220
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004221 if (len > sizeof(req) - sizeof(struct l2cap_conf_req)) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004222 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004223 goto done;
4224 }
4225
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004226 /* throw out any old stored conf requests */
4227 result = L2CAP_CONF_SUCCESS;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03004228 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004229 req, &result);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004230 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004231 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004232 goto done;
4233 }
4234
4235 l2cap_send_cmd(conn, l2cap_get_ident(conn),
Gustavo Padovan2d792812012-10-06 10:07:01 +01004236 L2CAP_CONF_REQ, len, req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004237 chan->num_conf_req++;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004238 if (result != L2CAP_CONF_SUCCESS)
4239 goto done;
4240 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004241 }
4242
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09004243 default:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004244 l2cap_chan_set_err(chan, ECONNRESET);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +02004245
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08004246 __set_chan_timer(chan, L2CAP_DISC_REJ_TIMEOUT);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004247 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004248 goto done;
4249 }
4250
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004251 if (flags & L2CAP_CONF_FLAG_CONTINUATION)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004252 goto done;
4253
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004254 set_bit(CONF_INPUT_DONE, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004255
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004256 if (test_bit(CONF_OUTPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004257 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004258
Mat Martineau105bdf92012-04-27 16:50:48 -07004259 if (chan->mode == L2CAP_MODE_ERTM ||
4260 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004261 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004262
Mat Martineau3c588192012-04-11 10:48:42 -07004263 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004264 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004265 else
4266 l2cap_chan_ready(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004267 }
4268
4269done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004270 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004271 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004272}
4273
Gustavo Padovan2d792812012-10-06 10:07:01 +01004274static inline int l2cap_disconnect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004275 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4276 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004277{
4278 struct l2cap_disconn_req *req = (struct l2cap_disconn_req *) data;
4279 struct l2cap_disconn_rsp rsp;
4280 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004281 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004282
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004283 if (cmd_len != sizeof(*req))
4284 return -EPROTO;
4285
Linus Torvalds1da177e2005-04-16 15:20:36 -07004286 scid = __le16_to_cpu(req->scid);
4287 dcid = __le16_to_cpu(req->dcid);
4288
4289 BT_DBG("scid 0x%4.4x dcid 0x%4.4x", scid, dcid);
4290
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004291 mutex_lock(&conn->chan_lock);
4292
4293 chan = __l2cap_get_chan_by_scid(conn, dcid);
4294 if (!chan) {
4295 mutex_unlock(&conn->chan_lock);
Johan Hedberg662d6522013-10-16 11:20:47 +03004296 cmd_reject_invalid_cid(conn, cmd->ident, dcid, scid);
4297 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004298 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004299
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004300 l2cap_chan_lock(chan);
4301
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03004302 rsp.dcid = cpu_to_le16(chan->scid);
4303 rsp.scid = cpu_to_le16(chan->dcid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004304 l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp);
4305
Gustavo Padovan5ec1bbe2013-10-15 19:24:48 -03004306 chan->ops->set_shutdown(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004307
Mat Martineau61d6ef32012-04-27 16:50:50 -07004308 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004309 l2cap_chan_del(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004310
4311 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004312
Gustavo Padovan80b98022012-05-27 22:27:51 -03004313 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004314 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004315
4316 mutex_unlock(&conn->chan_lock);
4317
Linus Torvalds1da177e2005-04-16 15:20:36 -07004318 return 0;
4319}
4320
Gustavo Padovan2d792812012-10-06 10:07:01 +01004321static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004322 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4323 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004324{
4325 struct l2cap_disconn_rsp *rsp = (struct l2cap_disconn_rsp *) data;
4326 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004327 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004328
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004329 if (cmd_len != sizeof(*rsp))
4330 return -EPROTO;
4331
Linus Torvalds1da177e2005-04-16 15:20:36 -07004332 scid = __le16_to_cpu(rsp->scid);
4333 dcid = __le16_to_cpu(rsp->dcid);
4334
4335 BT_DBG("dcid 0x%4.4x scid 0x%4.4x", dcid, scid);
4336
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004337 mutex_lock(&conn->chan_lock);
4338
4339 chan = __l2cap_get_chan_by_scid(conn, scid);
4340 if (!chan) {
4341 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004342 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004343 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004344
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004345 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004346
Mat Martineau61d6ef32012-04-27 16:50:50 -07004347 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004348 l2cap_chan_del(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004349
4350 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004351
Gustavo Padovan80b98022012-05-27 22:27:51 -03004352 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004353 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004354
4355 mutex_unlock(&conn->chan_lock);
4356
Linus Torvalds1da177e2005-04-16 15:20:36 -07004357 return 0;
4358}
4359
Gustavo Padovan2d792812012-10-06 10:07:01 +01004360static inline int l2cap_information_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004361 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4362 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004363{
4364 struct l2cap_info_req *req = (struct l2cap_info_req *) data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004365 u16 type;
4366
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004367 if (cmd_len != sizeof(*req))
4368 return -EPROTO;
4369
Linus Torvalds1da177e2005-04-16 15:20:36 -07004370 type = __le16_to_cpu(req->type);
4371
4372 BT_DBG("type 0x%4.4x", type);
4373
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004374 if (type == L2CAP_IT_FEAT_MASK) {
4375 u8 buf[8];
Marcel Holtmann44dd46d2009-05-02 19:09:01 -07004376 u32 feat_mask = l2cap_feat_mask;
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004377 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004378 rsp->type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
4379 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03004380 if (!disable_ertm)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004381 feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING
Gustavo Padovan2d792812012-10-06 10:07:01 +01004382 | L2CAP_FEAT_FCS;
Marcel Holtmann848566b2013-10-01 22:59:22 -07004383 if (conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03004384 feat_mask |= L2CAP_FEAT_EXT_FLOW
Gustavo Padovan2d792812012-10-06 10:07:01 +01004385 | L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenkoa5fd6f32011-09-16 16:26:32 +03004386
Gustavo F. Padovan1b7bf4e2009-08-24 00:45:20 -03004387 put_unaligned_le32(feat_mask, rsp->data);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004388 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4389 buf);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004390 } else if (type == L2CAP_IT_FIXED_CHAN) {
4391 u8 buf[12];
4392 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Mat Martineau50a147c2011-11-02 16:18:34 -07004393
Marcel Holtmann848566b2013-10-01 22:59:22 -07004394 if (conn->hs_enabled)
Mat Martineau50a147c2011-11-02 16:18:34 -07004395 l2cap_fixed_chan[0] |= L2CAP_FC_A2MP;
4396 else
4397 l2cap_fixed_chan[0] &= ~L2CAP_FC_A2MP;
4398
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004399 rsp->type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
4400 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Andrei Emeltchenkoc6337ea2011-10-20 17:02:44 +03004401 memcpy(rsp->data, l2cap_fixed_chan, sizeof(l2cap_fixed_chan));
Gustavo Padovan2d792812012-10-06 10:07:01 +01004402 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4403 buf);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004404 } else {
4405 struct l2cap_info_rsp rsp;
4406 rsp.type = cpu_to_le16(type);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004407 rsp.result = cpu_to_le16(L2CAP_IR_NOTSUPP);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004408 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(rsp),
4409 &rsp);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004410 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004411
4412 return 0;
4413}
4414
Gustavo Padovan2d792812012-10-06 10:07:01 +01004415static inline int l2cap_information_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004416 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4417 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004418{
4419 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) data;
4420 u16 type, result;
4421
Jaganath Kanakkassery3f6fa3d2013-06-21 19:55:11 +05304422 if (cmd_len < sizeof(*rsp))
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004423 return -EPROTO;
4424
Linus Torvalds1da177e2005-04-16 15:20:36 -07004425 type = __le16_to_cpu(rsp->type);
4426 result = __le16_to_cpu(rsp->result);
4427
4428 BT_DBG("type 0x%4.4x result 0x%2.2x", type, result);
4429
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004430 /* L2CAP Info req/rsp are unbound to channels, add extra checks */
4431 if (cmd->ident != conn->info_ident ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01004432 conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004433 return 0;
4434
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02004435 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004436
Ville Tervoadb08ed2010-08-04 09:43:33 +03004437 if (result != L2CAP_IR_SUCCESS) {
4438 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4439 conn->info_ident = 0;
4440
4441 l2cap_conn_start(conn);
4442
4443 return 0;
4444 }
4445
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004446 switch (type) {
4447 case L2CAP_IT_FEAT_MASK:
Harvey Harrison83985312008-05-02 16:25:46 -07004448 conn->feat_mask = get_unaligned_le32(rsp->data);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004449
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07004450 if (conn->feat_mask & L2CAP_FEAT_FIXED_CHAN) {
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004451 struct l2cap_info_req req;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004452 req.type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004453
4454 conn->info_ident = l2cap_get_ident(conn);
4455
4456 l2cap_send_cmd(conn, conn->info_ident,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004457 L2CAP_INFO_REQ, sizeof(req), &req);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004458 } else {
4459 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4460 conn->info_ident = 0;
4461
4462 l2cap_conn_start(conn);
4463 }
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004464 break;
4465
4466 case L2CAP_IT_FIXED_CHAN:
4467 conn->fixed_chan_mask = rsp->data[0];
Marcel Holtmann984947d2009-02-06 23:35:19 +01004468 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004469 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004470
4471 l2cap_conn_start(conn);
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004472 break;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004473 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004474
Linus Torvalds1da177e2005-04-16 15:20:36 -07004475 return 0;
4476}
4477
Mat Martineau17009152012-10-23 15:24:07 -07004478static int l2cap_create_channel_req(struct l2cap_conn *conn,
4479 struct l2cap_cmd_hdr *cmd,
4480 u16 cmd_len, void *data)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004481{
4482 struct l2cap_create_chan_req *req = data;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004483 struct l2cap_create_chan_rsp rsp;
Mat Martineau17009152012-10-23 15:24:07 -07004484 struct l2cap_chan *chan;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004485 struct hci_dev *hdev;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004486 u16 psm, scid;
4487
4488 if (cmd_len != sizeof(*req))
4489 return -EPROTO;
4490
Marcel Holtmann848566b2013-10-01 22:59:22 -07004491 if (!conn->hs_enabled)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004492 return -EINVAL;
4493
4494 psm = le16_to_cpu(req->psm);
4495 scid = le16_to_cpu(req->scid);
4496
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004497 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 -07004498
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004499 /* For controller id 0 make BR/EDR connection */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004500 if (req->amp_id == AMP_ID_BREDR) {
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004501 l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4502 req->amp_id);
4503 return 0;
4504 }
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004505
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004506 /* Validate AMP controller id */
4507 hdev = hci_dev_get(req->amp_id);
4508 if (!hdev)
4509 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004510
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004511 if (hdev->dev_type != HCI_AMP || !test_bit(HCI_UP, &hdev->flags)) {
Mat Martineau17009152012-10-23 15:24:07 -07004512 hci_dev_put(hdev);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004513 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004514 }
4515
4516 chan = l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4517 req->amp_id);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004518 if (chan) {
4519 struct amp_mgr *mgr = conn->hcon->amp_mgr;
4520 struct hci_conn *hs_hcon;
4521
Marcel Holtmann98e0f7e2013-10-13 02:23:40 -07004522 hs_hcon = hci_conn_hash_lookup_ba(hdev, AMP_LINK,
4523 &conn->hcon->dst);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004524 if (!hs_hcon) {
4525 hci_dev_put(hdev);
Johan Hedberg662d6522013-10-16 11:20:47 +03004526 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4527 chan->dcid);
4528 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004529 }
4530
4531 BT_DBG("mgr %p bredr_chan %p hs_hcon %p", mgr, chan, hs_hcon);
4532
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004533 mgr->bredr_chan = chan;
4534 chan->hs_hcon = hs_hcon;
Andrei Emeltchenkofd45bf42012-11-20 17:16:22 +02004535 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004536 conn->mtu = hdev->block_mtu;
4537 }
4538
4539 hci_dev_put(hdev);
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004540
4541 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004542
4543error:
4544 rsp.dcid = 0;
4545 rsp.scid = cpu_to_le16(scid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004546 rsp.result = cpu_to_le16(L2CAP_CR_BAD_AMP);
4547 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004548
4549 l2cap_send_cmd(conn, cmd->ident, L2CAP_CREATE_CHAN_RSP,
4550 sizeof(rsp), &rsp);
4551
Johan Hedbergdc280802013-09-16 13:05:13 +03004552 return 0;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004553}
4554
Mat Martineau8eb200b2012-10-23 15:24:17 -07004555static void l2cap_send_move_chan_req(struct l2cap_chan *chan, u8 dest_amp_id)
4556{
4557 struct l2cap_move_chan_req req;
4558 u8 ident;
4559
4560 BT_DBG("chan %p, dest_amp_id %d", chan, dest_amp_id);
4561
4562 ident = l2cap_get_ident(chan->conn);
4563 chan->ident = ident;
4564
4565 req.icid = cpu_to_le16(chan->scid);
4566 req.dest_amp_id = dest_amp_id;
4567
4568 l2cap_send_cmd(chan->conn, ident, L2CAP_MOVE_CHAN_REQ, sizeof(req),
4569 &req);
4570
4571 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4572}
4573
Mat Martineau1500109b2012-10-23 15:24:15 -07004574static void l2cap_send_move_chan_rsp(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004575{
4576 struct l2cap_move_chan_rsp rsp;
4577
Mat Martineau1500109b2012-10-23 15:24:15 -07004578 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004579
Mat Martineau1500109b2012-10-23 15:24:15 -07004580 rsp.icid = cpu_to_le16(chan->dcid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004581 rsp.result = cpu_to_le16(result);
4582
Mat Martineau1500109b2012-10-23 15:24:15 -07004583 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_RSP,
4584 sizeof(rsp), &rsp);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004585}
4586
Mat Martineau5b155ef2012-10-23 15:24:14 -07004587static void l2cap_send_move_chan_cfm(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004588{
4589 struct l2cap_move_chan_cfm cfm;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004590
Mat Martineau5b155ef2012-10-23 15:24:14 -07004591 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004592
Mat Martineau5b155ef2012-10-23 15:24:14 -07004593 chan->ident = l2cap_get_ident(chan->conn);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004594
Mat Martineau5b155ef2012-10-23 15:24:14 -07004595 cfm.icid = cpu_to_le16(chan->scid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004596 cfm.result = cpu_to_le16(result);
4597
Mat Martineau5b155ef2012-10-23 15:24:14 -07004598 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_CFM,
4599 sizeof(cfm), &cfm);
4600
4601 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4602}
4603
4604static void l2cap_send_move_chan_cfm_icid(struct l2cap_conn *conn, u16 icid)
4605{
4606 struct l2cap_move_chan_cfm cfm;
4607
4608 BT_DBG("conn %p, icid 0x%4.4x", conn, icid);
4609
4610 cfm.icid = cpu_to_le16(icid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004611 cfm.result = cpu_to_le16(L2CAP_MC_UNCONFIRMED);
Mat Martineau5b155ef2012-10-23 15:24:14 -07004612
4613 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_MOVE_CHAN_CFM,
4614 sizeof(cfm), &cfm);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004615}
4616
4617static void l2cap_send_move_chan_cfm_rsp(struct l2cap_conn *conn, u8 ident,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004618 u16 icid)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004619{
4620 struct l2cap_move_chan_cfm_rsp rsp;
4621
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004622 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004623
4624 rsp.icid = cpu_to_le16(icid);
4625 l2cap_send_cmd(conn, ident, L2CAP_MOVE_CHAN_CFM_RSP, sizeof(rsp), &rsp);
4626}
4627
Mat Martineau5f3847a2012-10-23 15:24:12 -07004628static void __release_logical_link(struct l2cap_chan *chan)
4629{
4630 chan->hs_hchan = NULL;
4631 chan->hs_hcon = NULL;
4632
4633 /* Placeholder - release the logical link */
4634}
4635
Mat Martineau1500109b2012-10-23 15:24:15 -07004636static void l2cap_logical_fail(struct l2cap_chan *chan)
4637{
4638 /* Logical link setup failed */
4639 if (chan->state != BT_CONNECTED) {
4640 /* Create channel failure, disconnect */
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004641 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineau1500109b2012-10-23 15:24:15 -07004642 return;
4643 }
4644
4645 switch (chan->move_role) {
4646 case L2CAP_MOVE_ROLE_RESPONDER:
4647 l2cap_move_done(chan);
4648 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_SUPP);
4649 break;
4650 case L2CAP_MOVE_ROLE_INITIATOR:
4651 if (chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_COMP ||
4652 chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_CFM) {
4653 /* Remote has only sent pending or
4654 * success responses, clean up
4655 */
4656 l2cap_move_done(chan);
4657 }
4658
4659 /* Other amp move states imply that the move
4660 * has already aborted
4661 */
4662 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
4663 break;
4664 }
4665}
4666
4667static void l2cap_logical_finish_create(struct l2cap_chan *chan,
4668 struct hci_chan *hchan)
4669{
4670 struct l2cap_conf_rsp rsp;
Mat Martineau1500109b2012-10-23 15:24:15 -07004671
Andrei Emeltchenko336178a2012-10-31 15:46:27 +02004672 chan->hs_hchan = hchan;
Mat Martineau1500109b2012-10-23 15:24:15 -07004673 chan->hs_hcon->l2cap_data = chan->conn;
4674
Andrei Emeltchenko35ba9562012-10-25 15:20:43 +03004675 l2cap_send_efs_conf_rsp(chan, &rsp, chan->ident, 0);
Mat Martineau1500109b2012-10-23 15:24:15 -07004676
4677 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Andrei Emeltchenkofe79c6f2012-10-25 15:20:42 +03004678 int err;
Mat Martineau1500109b2012-10-23 15:24:15 -07004679
4680 set_default_fcs(chan);
4681
4682 err = l2cap_ertm_init(chan);
4683 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004684 l2cap_send_disconn_req(chan, -err);
Mat Martineau1500109b2012-10-23 15:24:15 -07004685 else
4686 l2cap_chan_ready(chan);
4687 }
4688}
4689
4690static void l2cap_logical_finish_move(struct l2cap_chan *chan,
4691 struct hci_chan *hchan)
4692{
4693 chan->hs_hcon = hchan->conn;
4694 chan->hs_hcon->l2cap_data = chan->conn;
4695
4696 BT_DBG("move_state %d", chan->move_state);
4697
4698 switch (chan->move_state) {
4699 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
4700 /* Move confirm will be sent after a success
4701 * response is received
4702 */
4703 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4704 break;
4705 case L2CAP_MOVE_WAIT_LOGICAL_CFM:
4706 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4707 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4708 } else if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
4709 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
4710 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
4711 } else if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4712 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4713 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4714 }
4715 break;
4716 default:
4717 /* Move was not in expected state, free the channel */
4718 __release_logical_link(chan);
4719
4720 chan->move_state = L2CAP_MOVE_STABLE;
4721 }
4722}
4723
4724/* Call with chan locked */
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004725void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan,
4726 u8 status)
Mat Martineau5b155ef2012-10-23 15:24:14 -07004727{
Mat Martineau1500109b2012-10-23 15:24:15 -07004728 BT_DBG("chan %p, hchan %p, status %d", chan, hchan, status);
4729
4730 if (status) {
4731 l2cap_logical_fail(chan);
4732 __release_logical_link(chan);
4733 return;
4734 }
4735
4736 if (chan->state != BT_CONNECTED) {
4737 /* Ignore logical link if channel is on BR/EDR */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004738 if (chan->local_amp_id != AMP_ID_BREDR)
Mat Martineau1500109b2012-10-23 15:24:15 -07004739 l2cap_logical_finish_create(chan, hchan);
4740 } else {
4741 l2cap_logical_finish_move(chan, hchan);
4742 }
Mat Martineau5b155ef2012-10-23 15:24:14 -07004743}
4744
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004745void l2cap_move_start(struct l2cap_chan *chan)
4746{
4747 BT_DBG("chan %p", chan);
4748
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004749 if (chan->local_amp_id == AMP_ID_BREDR) {
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004750 if (chan->chan_policy != BT_CHANNEL_POLICY_AMP_PREFERRED)
4751 return;
4752 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4753 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4754 /* Placeholder - start physical link setup */
4755 } else {
4756 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4757 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4758 chan->move_id = 0;
4759 l2cap_move_setup(chan);
4760 l2cap_send_move_chan_req(chan, 0);
4761 }
4762}
4763
Mat Martineau8eb200b2012-10-23 15:24:17 -07004764static void l2cap_do_create(struct l2cap_chan *chan, int result,
4765 u8 local_amp_id, u8 remote_amp_id)
4766{
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004767 BT_DBG("chan %p state %s %u -> %u", chan, state_to_string(chan->state),
4768 local_amp_id, remote_amp_id);
4769
Andrei Emeltchenko12d6cc62012-11-14 17:39:31 +02004770 chan->fcs = L2CAP_FCS_NONE;
4771
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004772 /* Outgoing channel on AMP */
4773 if (chan->state == BT_CONNECT) {
4774 if (result == L2CAP_CR_SUCCESS) {
4775 chan->local_amp_id = local_amp_id;
4776 l2cap_send_create_chan_req(chan, remote_amp_id);
4777 } else {
4778 /* Revert to BR/EDR connect */
4779 l2cap_send_conn_req(chan);
4780 }
4781
4782 return;
4783 }
4784
4785 /* Incoming channel on AMP */
4786 if (__l2cap_no_conn_pending(chan)) {
Mat Martineau8eb200b2012-10-23 15:24:17 -07004787 struct l2cap_conn_rsp rsp;
4788 char buf[128];
4789 rsp.scid = cpu_to_le16(chan->dcid);
4790 rsp.dcid = cpu_to_le16(chan->scid);
4791
Mat Martineau8eb200b2012-10-23 15:24:17 -07004792 if (result == L2CAP_CR_SUCCESS) {
4793 /* Send successful response */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004794 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
4795 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004796 } else {
4797 /* Send negative response */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004798 rsp.result = cpu_to_le16(L2CAP_CR_NO_MEM);
4799 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004800 }
4801
4802 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_RSP,
4803 sizeof(rsp), &rsp);
4804
4805 if (result == L2CAP_CR_SUCCESS) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02004806 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004807 set_bit(CONF_REQ_SENT, &chan->conf_state);
4808 l2cap_send_cmd(chan->conn, l2cap_get_ident(chan->conn),
4809 L2CAP_CONF_REQ,
4810 l2cap_build_conf_req(chan, buf), buf);
4811 chan->num_conf_req++;
4812 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004813 }
4814}
4815
4816static void l2cap_do_move_initiate(struct l2cap_chan *chan, u8 local_amp_id,
4817 u8 remote_amp_id)
4818{
4819 l2cap_move_setup(chan);
4820 chan->move_id = local_amp_id;
4821 chan->move_state = L2CAP_MOVE_WAIT_RSP;
4822
4823 l2cap_send_move_chan_req(chan, remote_amp_id);
4824}
4825
4826static void l2cap_do_move_respond(struct l2cap_chan *chan, int result)
4827{
4828 struct hci_chan *hchan = NULL;
4829
4830 /* Placeholder - get hci_chan for logical link */
4831
4832 if (hchan) {
4833 if (hchan->state == BT_CONNECTED) {
4834 /* Logical link is ready to go */
4835 chan->hs_hcon = hchan->conn;
4836 chan->hs_hcon->l2cap_data = chan->conn;
4837 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4838 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4839
4840 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
4841 } else {
4842 /* Wait for logical link to be ready */
4843 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4844 }
4845 } else {
4846 /* Logical link not available */
4847 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_ALLOWED);
4848 }
4849}
4850
4851static void l2cap_do_move_cancel(struct l2cap_chan *chan, int result)
4852{
4853 if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4854 u8 rsp_result;
4855 if (result == -EINVAL)
4856 rsp_result = L2CAP_MR_BAD_ID;
4857 else
4858 rsp_result = L2CAP_MR_NOT_ALLOWED;
4859
4860 l2cap_send_move_chan_rsp(chan, rsp_result);
4861 }
4862
4863 chan->move_role = L2CAP_MOVE_ROLE_NONE;
4864 chan->move_state = L2CAP_MOVE_STABLE;
4865
4866 /* Restart data transmission */
4867 l2cap_ertm_send(chan);
4868}
4869
Andrei Emeltchenkoa514b172012-11-14 17:39:30 +02004870/* Invoke with locked chan */
4871void __l2cap_physical_cfm(struct l2cap_chan *chan, int result)
Mat Martineau8eb200b2012-10-23 15:24:17 -07004872{
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004873 u8 local_amp_id = chan->local_amp_id;
Andrei Emeltchenkofffadc02012-11-01 15:37:03 +02004874 u8 remote_amp_id = chan->remote_amp_id;
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004875
Mat Martineau8eb200b2012-10-23 15:24:17 -07004876 BT_DBG("chan %p, result %d, local_amp_id %d, remote_amp_id %d",
4877 chan, result, local_amp_id, remote_amp_id);
4878
Mat Martineau8eb200b2012-10-23 15:24:17 -07004879 if (chan->state == BT_DISCONN || chan->state == BT_CLOSED) {
4880 l2cap_chan_unlock(chan);
4881 return;
4882 }
4883
4884 if (chan->state != BT_CONNECTED) {
4885 l2cap_do_create(chan, result, local_amp_id, remote_amp_id);
4886 } else if (result != L2CAP_MR_SUCCESS) {
4887 l2cap_do_move_cancel(chan, result);
4888 } else {
4889 switch (chan->move_role) {
4890 case L2CAP_MOVE_ROLE_INITIATOR:
4891 l2cap_do_move_initiate(chan, local_amp_id,
4892 remote_amp_id);
4893 break;
4894 case L2CAP_MOVE_ROLE_RESPONDER:
4895 l2cap_do_move_respond(chan, result);
4896 break;
4897 default:
4898 l2cap_do_move_cancel(chan, result);
4899 break;
4900 }
4901 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004902}
4903
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004904static inline int l2cap_move_channel_req(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004905 struct l2cap_cmd_hdr *cmd,
4906 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004907{
4908 struct l2cap_move_chan_req *req = data;
Mat Martineau1500109b2012-10-23 15:24:15 -07004909 struct l2cap_move_chan_rsp rsp;
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004910 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004911 u16 icid = 0;
4912 u16 result = L2CAP_MR_NOT_ALLOWED;
4913
4914 if (cmd_len != sizeof(*req))
4915 return -EPROTO;
4916
4917 icid = le16_to_cpu(req->icid);
4918
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004919 BT_DBG("icid 0x%4.4x, dest_amp_id %d", icid, req->dest_amp_id);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004920
Marcel Holtmann848566b2013-10-01 22:59:22 -07004921 if (!conn->hs_enabled)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004922 return -EINVAL;
4923
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004924 chan = l2cap_get_chan_by_dcid(conn, icid);
4925 if (!chan) {
Mat Martineau1500109b2012-10-23 15:24:15 -07004926 rsp.icid = cpu_to_le16(icid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004927 rsp.result = cpu_to_le16(L2CAP_MR_NOT_ALLOWED);
Mat Martineau1500109b2012-10-23 15:24:15 -07004928 l2cap_send_cmd(conn, cmd->ident, L2CAP_MOVE_CHAN_RSP,
4929 sizeof(rsp), &rsp);
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004930 return 0;
4931 }
4932
Mat Martineau1500109b2012-10-23 15:24:15 -07004933 chan->ident = cmd->ident;
4934
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004935 if (chan->scid < L2CAP_CID_DYN_START ||
4936 chan->chan_policy == BT_CHANNEL_POLICY_BREDR_ONLY ||
4937 (chan->mode != L2CAP_MODE_ERTM &&
4938 chan->mode != L2CAP_MODE_STREAMING)) {
4939 result = L2CAP_MR_NOT_ALLOWED;
4940 goto send_move_response;
4941 }
4942
4943 if (chan->local_amp_id == req->dest_amp_id) {
4944 result = L2CAP_MR_SAME_ID;
4945 goto send_move_response;
4946 }
4947
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004948 if (req->dest_amp_id != AMP_ID_BREDR) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004949 struct hci_dev *hdev;
4950 hdev = hci_dev_get(req->dest_amp_id);
4951 if (!hdev || hdev->dev_type != HCI_AMP ||
4952 !test_bit(HCI_UP, &hdev->flags)) {
4953 if (hdev)
4954 hci_dev_put(hdev);
4955
4956 result = L2CAP_MR_BAD_ID;
4957 goto send_move_response;
4958 }
4959 hci_dev_put(hdev);
4960 }
4961
4962 /* Detect a move collision. Only send a collision response
4963 * if this side has "lost", otherwise proceed with the move.
4964 * The winner has the larger bd_addr.
4965 */
4966 if ((__chan_is_moving(chan) ||
4967 chan->move_role != L2CAP_MOVE_ROLE_NONE) &&
Marcel Holtmann6f59b902013-10-13 05:24:01 -07004968 bacmp(&conn->hcon->src, &conn->hcon->dst) > 0) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004969 result = L2CAP_MR_COLLISION;
4970 goto send_move_response;
4971 }
4972
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004973 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
4974 l2cap_move_setup(chan);
4975 chan->move_id = req->dest_amp_id;
4976 icid = chan->dcid;
4977
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004978 if (req->dest_amp_id == AMP_ID_BREDR) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004979 /* Moving to BR/EDR */
4980 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4981 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4982 result = L2CAP_MR_PEND;
4983 } else {
4984 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4985 result = L2CAP_MR_SUCCESS;
4986 }
4987 } else {
4988 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4989 /* Placeholder - uncomment when amp functions are available */
4990 /*amp_accept_physical(chan, req->dest_amp_id);*/
4991 result = L2CAP_MR_PEND;
4992 }
4993
4994send_move_response:
Mat Martineau1500109b2012-10-23 15:24:15 -07004995 l2cap_send_move_chan_rsp(chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004996
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004997 l2cap_chan_unlock(chan);
4998
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004999 return 0;
5000}
5001
Mat Martineau5b155ef2012-10-23 15:24:14 -07005002static void l2cap_move_continue(struct l2cap_conn *conn, u16 icid, u16 result)
5003{
5004 struct l2cap_chan *chan;
5005 struct hci_chan *hchan = NULL;
5006
5007 chan = l2cap_get_chan_by_scid(conn, icid);
5008 if (!chan) {
5009 l2cap_send_move_chan_cfm_icid(conn, icid);
5010 return;
5011 }
5012
5013 __clear_chan_timer(chan);
5014 if (result == L2CAP_MR_PEND)
5015 __set_chan_timer(chan, L2CAP_MOVE_ERTX_TIMEOUT);
5016
5017 switch (chan->move_state) {
5018 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
5019 /* Move confirm will be sent when logical link
5020 * is complete.
5021 */
5022 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
5023 break;
5024 case L2CAP_MOVE_WAIT_RSP_SUCCESS:
5025 if (result == L2CAP_MR_PEND) {
5026 break;
5027 } else if (test_bit(CONN_LOCAL_BUSY,
5028 &chan->conn_state)) {
5029 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
5030 } else {
5031 /* Logical link is up or moving to BR/EDR,
5032 * proceed with move
5033 */
5034 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
5035 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
5036 }
5037 break;
5038 case L2CAP_MOVE_WAIT_RSP:
5039 /* Moving to AMP */
5040 if (result == L2CAP_MR_SUCCESS) {
5041 /* Remote is ready, send confirm immediately
5042 * after logical link is ready
5043 */
5044 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
5045 } else {
5046 /* Both logical link and move success
5047 * are required to confirm
5048 */
5049 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_COMP;
5050 }
5051
5052 /* Placeholder - get hci_chan for logical link */
5053 if (!hchan) {
5054 /* Logical link not available */
5055 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5056 break;
5057 }
5058
5059 /* If the logical link is not yet connected, do not
5060 * send confirmation.
5061 */
5062 if (hchan->state != BT_CONNECTED)
5063 break;
5064
5065 /* Logical link is already ready to go */
5066
5067 chan->hs_hcon = hchan->conn;
5068 chan->hs_hcon->l2cap_data = chan->conn;
5069
5070 if (result == L2CAP_MR_SUCCESS) {
5071 /* Can confirm now */
5072 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
5073 } else {
5074 /* Now only need move success
5075 * to confirm
5076 */
5077 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
5078 }
5079
5080 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
5081 break;
5082 default:
5083 /* Any other amp move state means the move failed. */
5084 chan->move_id = chan->local_amp_id;
5085 l2cap_move_done(chan);
5086 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5087 }
5088
5089 l2cap_chan_unlock(chan);
5090}
5091
5092static void l2cap_move_fail(struct l2cap_conn *conn, u8 ident, u16 icid,
5093 u16 result)
5094{
5095 struct l2cap_chan *chan;
5096
5097 chan = l2cap_get_chan_by_ident(conn, ident);
5098 if (!chan) {
5099 /* Could not locate channel, icid is best guess */
5100 l2cap_send_move_chan_cfm_icid(conn, icid);
5101 return;
5102 }
5103
5104 __clear_chan_timer(chan);
5105
5106 if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
5107 if (result == L2CAP_MR_COLLISION) {
5108 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
5109 } else {
5110 /* Cleanup - cancel move */
5111 chan->move_id = chan->local_amp_id;
5112 l2cap_move_done(chan);
5113 }
5114 }
5115
5116 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5117
5118 l2cap_chan_unlock(chan);
5119}
5120
5121static int l2cap_move_channel_rsp(struct l2cap_conn *conn,
5122 struct l2cap_cmd_hdr *cmd,
5123 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005124{
5125 struct l2cap_move_chan_rsp *rsp = data;
5126 u16 icid, result;
5127
5128 if (cmd_len != sizeof(*rsp))
5129 return -EPROTO;
5130
5131 icid = le16_to_cpu(rsp->icid);
5132 result = le16_to_cpu(rsp->result);
5133
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005134 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005135
Mat Martineau5b155ef2012-10-23 15:24:14 -07005136 if (result == L2CAP_MR_SUCCESS || result == L2CAP_MR_PEND)
5137 l2cap_move_continue(conn, icid, result);
5138 else
5139 l2cap_move_fail(conn, cmd->ident, icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005140
5141 return 0;
5142}
5143
Mat Martineau5f3847a2012-10-23 15:24:12 -07005144static int l2cap_move_channel_confirm(struct l2cap_conn *conn,
5145 struct l2cap_cmd_hdr *cmd,
5146 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005147{
5148 struct l2cap_move_chan_cfm *cfm = data;
Mat Martineau5f3847a2012-10-23 15:24:12 -07005149 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005150 u16 icid, result;
5151
5152 if (cmd_len != sizeof(*cfm))
5153 return -EPROTO;
5154
5155 icid = le16_to_cpu(cfm->icid);
5156 result = le16_to_cpu(cfm->result);
5157
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005158 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005159
Mat Martineau5f3847a2012-10-23 15:24:12 -07005160 chan = l2cap_get_chan_by_dcid(conn, icid);
5161 if (!chan) {
5162 /* Spec requires a response even if the icid was not found */
5163 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5164 return 0;
5165 }
5166
5167 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM) {
5168 if (result == L2CAP_MC_CONFIRMED) {
5169 chan->local_amp_id = chan->move_id;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005170 if (chan->local_amp_id == AMP_ID_BREDR)
Mat Martineau5f3847a2012-10-23 15:24:12 -07005171 __release_logical_link(chan);
5172 } else {
5173 chan->move_id = chan->local_amp_id;
5174 }
5175
5176 l2cap_move_done(chan);
5177 }
5178
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005179 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5180
Mat Martineau5f3847a2012-10-23 15:24:12 -07005181 l2cap_chan_unlock(chan);
5182
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005183 return 0;
5184}
5185
5186static inline int l2cap_move_channel_confirm_rsp(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005187 struct l2cap_cmd_hdr *cmd,
5188 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005189{
5190 struct l2cap_move_chan_cfm_rsp *rsp = data;
Mat Martineau3fd71a02012-10-23 15:24:16 -07005191 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005192 u16 icid;
5193
5194 if (cmd_len != sizeof(*rsp))
5195 return -EPROTO;
5196
5197 icid = le16_to_cpu(rsp->icid);
5198
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005199 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005200
Mat Martineau3fd71a02012-10-23 15:24:16 -07005201 chan = l2cap_get_chan_by_scid(conn, icid);
5202 if (!chan)
5203 return 0;
5204
5205 __clear_chan_timer(chan);
5206
5207 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM_RSP) {
5208 chan->local_amp_id = chan->move_id;
5209
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005210 if (chan->local_amp_id == AMP_ID_BREDR && chan->hs_hchan)
Mat Martineau3fd71a02012-10-23 15:24:16 -07005211 __release_logical_link(chan);
5212
5213 l2cap_move_done(chan);
5214 }
5215
5216 l2cap_chan_unlock(chan);
5217
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005218 return 0;
5219}
5220
Claudio Takahaside731152011-02-11 19:28:55 -02005221static inline int l2cap_conn_param_update_req(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005222 struct l2cap_cmd_hdr *cmd,
Johan Hedberg203e6392013-05-15 10:07:15 +03005223 u16 cmd_len, u8 *data)
Claudio Takahaside731152011-02-11 19:28:55 -02005224{
5225 struct hci_conn *hcon = conn->hcon;
5226 struct l2cap_conn_param_update_req *req;
5227 struct l2cap_conn_param_update_rsp rsp;
Johan Hedberg203e6392013-05-15 10:07:15 +03005228 u16 min, max, latency, to_multiplier;
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005229 int err;
Claudio Takahaside731152011-02-11 19:28:55 -02005230
Johan Hedberg40bef302014-07-16 11:42:27 +03005231 if (hcon->role != HCI_ROLE_MASTER)
Claudio Takahaside731152011-02-11 19:28:55 -02005232 return -EINVAL;
5233
Claudio Takahaside731152011-02-11 19:28:55 -02005234 if (cmd_len != sizeof(struct l2cap_conn_param_update_req))
5235 return -EPROTO;
5236
5237 req = (struct l2cap_conn_param_update_req *) data;
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03005238 min = __le16_to_cpu(req->min);
5239 max = __le16_to_cpu(req->max);
Claudio Takahaside731152011-02-11 19:28:55 -02005240 latency = __le16_to_cpu(req->latency);
5241 to_multiplier = __le16_to_cpu(req->to_multiplier);
5242
5243 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 +01005244 min, max, latency, to_multiplier);
Claudio Takahaside731152011-02-11 19:28:55 -02005245
5246 memset(&rsp, 0, sizeof(rsp));
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005247
Andre Guedesd4905f22014-06-25 21:52:52 -03005248 err = hci_check_conn_params(min, max, latency, to_multiplier);
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005249 if (err)
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005250 rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_REJECTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005251 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005252 rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_ACCEPTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005253
5254 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONN_PARAM_UPDATE_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005255 sizeof(rsp), &rsp);
Claudio Takahaside731152011-02-11 19:28:55 -02005256
Andre Guedesffb5a8272014-07-01 18:10:11 -03005257 if (!err) {
Johan Hedbergf4869e22014-07-02 17:37:32 +03005258 u8 store_hint;
Andre Guedesffb5a8272014-07-01 18:10:11 -03005259
Johan Hedbergf4869e22014-07-02 17:37:32 +03005260 store_hint = hci_le_conn_update(hcon, min, max, latency,
5261 to_multiplier);
5262 mgmt_new_conn_param(hcon->hdev, &hcon->dst, hcon->dst_type,
5263 store_hint, min, max, latency,
5264 to_multiplier);
5265
Andre Guedesffb5a8272014-07-01 18:10:11 -03005266 }
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005267
Claudio Takahaside731152011-02-11 19:28:55 -02005268 return 0;
5269}
5270
Johan Hedbergf1496de2013-05-13 14:15:56 +03005271static int l2cap_le_connect_rsp(struct l2cap_conn *conn,
5272 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5273 u8 *data)
5274{
5275 struct l2cap_le_conn_rsp *rsp = (struct l2cap_le_conn_rsp *) data;
5276 u16 dcid, mtu, mps, credits, result;
5277 struct l2cap_chan *chan;
5278 int err;
5279
5280 if (cmd_len < sizeof(*rsp))
5281 return -EPROTO;
5282
5283 dcid = __le16_to_cpu(rsp->dcid);
5284 mtu = __le16_to_cpu(rsp->mtu);
5285 mps = __le16_to_cpu(rsp->mps);
5286 credits = __le16_to_cpu(rsp->credits);
5287 result = __le16_to_cpu(rsp->result);
5288
5289 if (result == L2CAP_CR_SUCCESS && (mtu < 23 || mps < 23))
5290 return -EPROTO;
5291
5292 BT_DBG("dcid 0x%4.4x mtu %u mps %u credits %u result 0x%2.2x",
5293 dcid, mtu, mps, credits, result);
5294
5295 mutex_lock(&conn->chan_lock);
5296
5297 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5298 if (!chan) {
5299 err = -EBADSLT;
5300 goto unlock;
5301 }
5302
5303 err = 0;
5304
5305 l2cap_chan_lock(chan);
5306
5307 switch (result) {
5308 case L2CAP_CR_SUCCESS:
5309 chan->ident = 0;
5310 chan->dcid = dcid;
5311 chan->omtu = mtu;
5312 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005313 chan->tx_credits = credits;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005314 l2cap_chan_ready(chan);
5315 break;
5316
5317 default:
5318 l2cap_chan_del(chan, ECONNREFUSED);
5319 break;
5320 }
5321
5322 l2cap_chan_unlock(chan);
5323
5324unlock:
5325 mutex_unlock(&conn->chan_lock);
5326
5327 return err;
5328}
5329
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005330static inline int l2cap_bredr_sig_cmd(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005331 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5332 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005333{
5334 int err = 0;
5335
5336 switch (cmd->code) {
5337 case L2CAP_COMMAND_REJ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005338 l2cap_command_rej(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005339 break;
5340
5341 case L2CAP_CONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005342 err = l2cap_connect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005343 break;
5344
5345 case L2CAP_CONN_RSP:
Mat Martineauf5a25982012-10-11 17:48:21 +03005346 case L2CAP_CREATE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005347 l2cap_connect_create_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005348 break;
5349
5350 case L2CAP_CONF_REQ:
5351 err = l2cap_config_req(conn, cmd, cmd_len, data);
5352 break;
5353
5354 case L2CAP_CONF_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005355 l2cap_config_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005356 break;
5357
5358 case L2CAP_DISCONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005359 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005360 break;
5361
5362 case L2CAP_DISCONN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005363 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005364 break;
5365
5366 case L2CAP_ECHO_REQ:
5367 l2cap_send_cmd(conn, cmd->ident, L2CAP_ECHO_RSP, cmd_len, data);
5368 break;
5369
5370 case L2CAP_ECHO_RSP:
5371 break;
5372
5373 case L2CAP_INFO_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005374 err = l2cap_information_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005375 break;
5376
5377 case L2CAP_INFO_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005378 l2cap_information_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005379 break;
5380
Mat Martineauf94ff6f2011-11-02 16:18:32 -07005381 case L2CAP_CREATE_CHAN_REQ:
5382 err = l2cap_create_channel_req(conn, cmd, cmd_len, data);
5383 break;
5384
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005385 case L2CAP_MOVE_CHAN_REQ:
5386 err = l2cap_move_channel_req(conn, cmd, cmd_len, data);
5387 break;
5388
5389 case L2CAP_MOVE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005390 l2cap_move_channel_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005391 break;
5392
5393 case L2CAP_MOVE_CHAN_CFM:
5394 err = l2cap_move_channel_confirm(conn, cmd, cmd_len, data);
5395 break;
5396
5397 case L2CAP_MOVE_CHAN_CFM_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005398 l2cap_move_channel_confirm_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005399 break;
5400
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005401 default:
5402 BT_ERR("Unknown BR/EDR signaling command 0x%2.2x", cmd->code);
5403 err = -EINVAL;
5404 break;
5405 }
5406
5407 return err;
5408}
5409
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005410static int l2cap_le_connect_req(struct l2cap_conn *conn,
5411 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5412 u8 *data)
5413{
5414 struct l2cap_le_conn_req *req = (struct l2cap_le_conn_req *) data;
5415 struct l2cap_le_conn_rsp rsp;
5416 struct l2cap_chan *chan, *pchan;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005417 u16 dcid, scid, credits, mtu, mps;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005418 __le16 psm;
5419 u8 result;
5420
5421 if (cmd_len != sizeof(*req))
5422 return -EPROTO;
5423
5424 scid = __le16_to_cpu(req->scid);
5425 mtu = __le16_to_cpu(req->mtu);
5426 mps = __le16_to_cpu(req->mps);
5427 psm = req->psm;
5428 dcid = 0;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005429 credits = 0;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005430
5431 if (mtu < 23 || mps < 23)
5432 return -EPROTO;
5433
5434 BT_DBG("psm 0x%2.2x scid 0x%4.4x mtu %u mps %u", __le16_to_cpu(psm),
5435 scid, mtu, mps);
5436
5437 /* Check if we have socket listening on psm */
5438 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
5439 &conn->hcon->dst, LE_LINK);
5440 if (!pchan) {
5441 result = L2CAP_CR_BAD_PSM;
5442 chan = NULL;
5443 goto response;
5444 }
5445
5446 mutex_lock(&conn->chan_lock);
5447 l2cap_chan_lock(pchan);
5448
5449 if (!smp_sufficient_security(conn->hcon, pchan->sec_level)) {
5450 result = L2CAP_CR_AUTHENTICATION;
5451 chan = NULL;
5452 goto response_unlock;
5453 }
5454
5455 /* Check if we already have channel with that dcid */
5456 if (__l2cap_get_chan_by_dcid(conn, scid)) {
5457 result = L2CAP_CR_NO_MEM;
5458 chan = NULL;
5459 goto response_unlock;
5460 }
5461
5462 chan = pchan->ops->new_connection(pchan);
5463 if (!chan) {
5464 result = L2CAP_CR_NO_MEM;
5465 goto response_unlock;
5466 }
5467
Johan Hedberg0ce43ce2013-12-05 14:55:33 +02005468 l2cap_le_flowctl_init(chan);
5469
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005470 bacpy(&chan->src, &conn->hcon->src);
5471 bacpy(&chan->dst, &conn->hcon->dst);
5472 chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type);
5473 chan->dst_type = bdaddr_type(conn->hcon, conn->hcon->dst_type);
5474 chan->psm = psm;
5475 chan->dcid = scid;
5476 chan->omtu = mtu;
5477 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005478 chan->tx_credits = __le16_to_cpu(req->credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005479
5480 __l2cap_chan_add(conn, chan);
5481 dcid = chan->scid;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005482 credits = chan->rx_credits;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005483
5484 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
5485
5486 chan->ident = cmd->ident;
5487
5488 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
5489 l2cap_state_change(chan, BT_CONNECT2);
5490 result = L2CAP_CR_PEND;
5491 chan->ops->defer(chan);
5492 } else {
5493 l2cap_chan_ready(chan);
5494 result = L2CAP_CR_SUCCESS;
5495 }
5496
5497response_unlock:
5498 l2cap_chan_unlock(pchan);
5499 mutex_unlock(&conn->chan_lock);
5500
5501 if (result == L2CAP_CR_PEND)
5502 return 0;
5503
5504response:
5505 if (chan) {
5506 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02005507 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005508 } else {
5509 rsp.mtu = 0;
5510 rsp.mps = 0;
5511 }
5512
5513 rsp.dcid = cpu_to_le16(dcid);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005514 rsp.credits = cpu_to_le16(credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005515 rsp.result = cpu_to_le16(result);
5516
5517 l2cap_send_cmd(conn, cmd->ident, L2CAP_LE_CONN_RSP, sizeof(rsp), &rsp);
5518
5519 return 0;
5520}
5521
Johan Hedbergfad5fc892013-12-05 09:45:01 +02005522static inline int l2cap_le_credits(struct l2cap_conn *conn,
5523 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5524 u8 *data)
5525{
5526 struct l2cap_le_credits *pkt;
5527 struct l2cap_chan *chan;
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005528 u16 cid, credits, max_credits;
Johan Hedbergfad5fc892013-12-05 09:45:01 +02005529
5530 if (cmd_len != sizeof(*pkt))
5531 return -EPROTO;
5532
5533 pkt = (struct l2cap_le_credits *) data;
5534 cid = __le16_to_cpu(pkt->cid);
5535 credits = __le16_to_cpu(pkt->credits);
5536
5537 BT_DBG("cid 0x%4.4x credits 0x%4.4x", cid, credits);
5538
5539 chan = l2cap_get_chan_by_dcid(conn, cid);
5540 if (!chan)
5541 return -EBADSLT;
5542
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005543 max_credits = LE_FLOWCTL_MAX_CREDITS - chan->tx_credits;
5544 if (credits > max_credits) {
5545 BT_ERR("LE credits overflow");
5546 l2cap_send_disconn_req(chan, ECONNRESET);
5547
5548 /* Return 0 so that we don't trigger an unnecessary
5549 * command reject packet.
5550 */
5551 return 0;
5552 }
5553
Johan Hedbergfad5fc892013-12-05 09:45:01 +02005554 chan->tx_credits += credits;
5555
5556 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
5557 l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
5558 chan->tx_credits--;
5559 }
5560
5561 if (chan->tx_credits)
5562 chan->ops->resume(chan);
5563
5564 l2cap_chan_unlock(chan);
5565
5566 return 0;
5567}
5568
Johan Hedberg71fb4192013-12-10 10:52:48 +02005569static inline int l2cap_le_command_rej(struct l2cap_conn *conn,
5570 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5571 u8 *data)
5572{
5573 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
5574 struct l2cap_chan *chan;
5575
5576 if (cmd_len < sizeof(*rej))
5577 return -EPROTO;
5578
5579 mutex_lock(&conn->chan_lock);
5580
5581 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5582 if (!chan)
5583 goto done;
5584
5585 l2cap_chan_lock(chan);
5586 l2cap_chan_del(chan, ECONNREFUSED);
5587 l2cap_chan_unlock(chan);
5588
5589done:
5590 mutex_unlock(&conn->chan_lock);
5591 return 0;
5592}
5593
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005594static inline int l2cap_le_sig_cmd(struct l2cap_conn *conn,
Johan Hedberg203e6392013-05-15 10:07:15 +03005595 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5596 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005597{
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005598 int err = 0;
5599
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005600 switch (cmd->code) {
5601 case L2CAP_COMMAND_REJ:
Johan Hedberg71fb4192013-12-10 10:52:48 +02005602 l2cap_le_command_rej(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005603 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005604
5605 case L2CAP_CONN_PARAM_UPDATE_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005606 err = l2cap_conn_param_update_req(conn, cmd, cmd_len, data);
5607 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005608
5609 case L2CAP_CONN_PARAM_UPDATE_RSP:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005610 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005611
Johan Hedbergf1496de2013-05-13 14:15:56 +03005612 case L2CAP_LE_CONN_RSP:
5613 l2cap_le_connect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005614 break;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005615
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005616 case L2CAP_LE_CONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005617 err = l2cap_le_connect_req(conn, cmd, cmd_len, data);
5618 break;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005619
Johan Hedbergfad5fc892013-12-05 09:45:01 +02005620 case L2CAP_LE_CREDITS:
5621 err = l2cap_le_credits(conn, cmd, cmd_len, data);
5622 break;
5623
Johan Hedberg3defe012013-05-15 10:16:06 +03005624 case L2CAP_DISCONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005625 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
5626 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005627
5628 case L2CAP_DISCONN_RSP:
5629 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005630 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005631
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005632 default:
5633 BT_ERR("Unknown LE signaling command 0x%2.2x", cmd->code);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005634 err = -EINVAL;
5635 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005636 }
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005637
5638 return err;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005639}
5640
Johan Hedbergc5623552013-04-29 19:35:33 +03005641static inline void l2cap_le_sig_channel(struct l2cap_conn *conn,
5642 struct sk_buff *skb)
5643{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005644 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005645 struct l2cap_cmd_hdr *cmd;
5646 u16 len;
Johan Hedbergc5623552013-04-29 19:35:33 +03005647 int err;
5648
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005649 if (hcon->type != LE_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005650 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005651
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005652 if (skb->len < L2CAP_CMD_HDR_SIZE)
5653 goto drop;
Johan Hedbergc5623552013-04-29 19:35:33 +03005654
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005655 cmd = (void *) skb->data;
5656 skb_pull(skb, L2CAP_CMD_HDR_SIZE);
Johan Hedbergc5623552013-04-29 19:35:33 +03005657
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005658 len = le16_to_cpu(cmd->len);
Johan Hedbergc5623552013-04-29 19:35:33 +03005659
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005660 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd->code, len, cmd->ident);
Johan Hedbergc5623552013-04-29 19:35:33 +03005661
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005662 if (len != skb->len || !cmd->ident) {
5663 BT_DBG("corrupted command");
5664 goto drop;
5665 }
Johan Hedbergc5623552013-04-29 19:35:33 +03005666
Johan Hedberg203e6392013-05-15 10:07:15 +03005667 err = l2cap_le_sig_cmd(conn, cmd, len, skb->data);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005668 if (err) {
5669 struct l2cap_cmd_rej_unk rej;
Johan Hedbergc5623552013-04-29 19:35:33 +03005670
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005671 BT_ERR("Wrong link type (%d)", err);
Johan Hedbergc5623552013-04-29 19:35:33 +03005672
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005673 rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005674 l2cap_send_cmd(conn, cmd->ident, L2CAP_COMMAND_REJ,
5675 sizeof(rej), &rej);
Johan Hedbergc5623552013-04-29 19:35:33 +03005676 }
5677
Marcel Holtmann3b166292013-10-02 08:28:21 -07005678drop:
Johan Hedbergc5623552013-04-29 19:35:33 +03005679 kfree_skb(skb);
5680}
5681
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005682static inline void l2cap_sig_channel(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005683 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005684{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005685 struct hci_conn *hcon = conn->hcon;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005686 u8 *data = skb->data;
5687 int len = skb->len;
5688 struct l2cap_cmd_hdr cmd;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005689 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005690
5691 l2cap_raw_recv(conn, skb);
5692
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005693 if (hcon->type != ACL_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005694 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005695
Linus Torvalds1da177e2005-04-16 15:20:36 -07005696 while (len >= L2CAP_CMD_HDR_SIZE) {
Al Viro88219a02007-07-29 00:17:25 -07005697 u16 cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005698 memcpy(&cmd, data, L2CAP_CMD_HDR_SIZE);
5699 data += L2CAP_CMD_HDR_SIZE;
5700 len -= L2CAP_CMD_HDR_SIZE;
5701
Al Viro88219a02007-07-29 00:17:25 -07005702 cmd_len = le16_to_cpu(cmd.len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005703
Gustavo Padovan2d792812012-10-06 10:07:01 +01005704 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd.code, cmd_len,
5705 cmd.ident);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005706
Al Viro88219a02007-07-29 00:17:25 -07005707 if (cmd_len > len || !cmd.ident) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005708 BT_DBG("corrupted command");
5709 break;
5710 }
5711
Johan Hedbergc5623552013-04-29 19:35:33 +03005712 err = l2cap_bredr_sig_cmd(conn, &cmd, cmd_len, data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005713 if (err) {
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03005714 struct l2cap_cmd_rej_unk rej;
Gustavo F. Padovan2c6d1a22011-03-23 14:38:32 -03005715
5716 BT_ERR("Wrong link type (%d)", err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005717
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005718 rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Gustavo Padovan2d792812012-10-06 10:07:01 +01005719 l2cap_send_cmd(conn, cmd.ident, L2CAP_COMMAND_REJ,
5720 sizeof(rej), &rej);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005721 }
5722
Al Viro88219a02007-07-29 00:17:25 -07005723 data += cmd_len;
5724 len -= cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005725 }
5726
Marcel Holtmann3b166292013-10-02 08:28:21 -07005727drop:
Linus Torvalds1da177e2005-04-16 15:20:36 -07005728 kfree_skb(skb);
5729}
5730
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005731static int l2cap_check_fcs(struct l2cap_chan *chan, struct sk_buff *skb)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005732{
5733 u16 our_fcs, rcv_fcs;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03005734 int hdr_size;
5735
5736 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
5737 hdr_size = L2CAP_EXT_HDR_SIZE;
5738 else
5739 hdr_size = L2CAP_ENH_HDR_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005740
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005741 if (chan->fcs == L2CAP_FCS_CRC16) {
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005742 skb_trim(skb, skb->len - L2CAP_FCS_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005743 rcv_fcs = get_unaligned_le16(skb->data + skb->len);
5744 our_fcs = crc16(0, skb->data - hdr_size, skb->len + hdr_size);
5745
5746 if (our_fcs != rcv_fcs)
João Paulo Rechi Vita7a560e52010-06-22 13:56:27 -03005747 return -EBADMSG;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005748 }
5749 return 0;
5750}
5751
Mat Martineau6ea00482012-05-17 20:53:52 -07005752static void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan)
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005753{
Mat Martineaue31f7632012-05-17 20:53:41 -07005754 struct l2cap_ctrl control;
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005755
Mat Martineaue31f7632012-05-17 20:53:41 -07005756 BT_DBG("chan %p", chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005757
Mat Martineaue31f7632012-05-17 20:53:41 -07005758 memset(&control, 0, sizeof(control));
5759 control.sframe = 1;
5760 control.final = 1;
5761 control.reqseq = chan->buffer_seq;
5762 set_bit(CONN_SEND_FBIT, &chan->conn_state);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005763
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005764 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
Mat Martineaue31f7632012-05-17 20:53:41 -07005765 control.super = L2CAP_SUPER_RNR;
5766 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005767 }
5768
Mat Martineaue31f7632012-05-17 20:53:41 -07005769 if (test_and_clear_bit(CONN_REMOTE_BUSY, &chan->conn_state) &&
5770 chan->unacked_frames > 0)
5771 __set_retrans_timer(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005772
Mat Martineaue31f7632012-05-17 20:53:41 -07005773 /* Send pending iframes */
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03005774 l2cap_ertm_send(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005775
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005776 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
Mat Martineaue31f7632012-05-17 20:53:41 -07005777 test_bit(CONN_SEND_FBIT, &chan->conn_state)) {
5778 /* F-bit wasn't sent in an s-frame or i-frame yet, so
5779 * send it now.
5780 */
5781 control.super = L2CAP_SUPER_RR;
5782 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005783 }
5784}
5785
Gustavo Padovan2d792812012-10-06 10:07:01 +01005786static void append_skb_frag(struct sk_buff *skb, struct sk_buff *new_frag,
5787 struct sk_buff **last_frag)
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005788{
Mat Martineau84084a32011-07-22 14:54:00 -07005789 /* skb->len reflects data in skb as well as all fragments
5790 * skb->data_len reflects only data in fragments
5791 */
5792 if (!skb_has_frag_list(skb))
5793 skb_shinfo(skb)->frag_list = new_frag;
5794
5795 new_frag->next = NULL;
5796
5797 (*last_frag)->next = new_frag;
5798 *last_frag = new_frag;
5799
5800 skb->len += new_frag->len;
5801 skb->data_len += new_frag->len;
5802 skb->truesize += new_frag->truesize;
5803}
5804
Mat Martineau4b51dae92012-05-17 20:53:37 -07005805static int l2cap_reassemble_sdu(struct l2cap_chan *chan, struct sk_buff *skb,
5806 struct l2cap_ctrl *control)
Mat Martineau84084a32011-07-22 14:54:00 -07005807{
5808 int err = -EINVAL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005809
Mat Martineau4b51dae92012-05-17 20:53:37 -07005810 switch (control->sar) {
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005811 case L2CAP_SAR_UNSEGMENTED:
Mat Martineau84084a32011-07-22 14:54:00 -07005812 if (chan->sdu)
5813 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005814
Gustavo Padovan80b98022012-05-27 22:27:51 -03005815 err = chan->ops->recv(chan, skb);
Mat Martineau84084a32011-07-22 14:54:00 -07005816 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005817
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005818 case L2CAP_SAR_START:
Mat Martineau84084a32011-07-22 14:54:00 -07005819 if (chan->sdu)
5820 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005821
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005822 chan->sdu_len = get_unaligned_le16(skb->data);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005823 skb_pull(skb, L2CAP_SDULEN_SIZE);
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005824
Mat Martineau84084a32011-07-22 14:54:00 -07005825 if (chan->sdu_len > chan->imtu) {
5826 err = -EMSGSIZE;
5827 break;
5828 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005829
Mat Martineau84084a32011-07-22 14:54:00 -07005830 if (skb->len >= chan->sdu_len)
5831 break;
5832
5833 chan->sdu = skb;
5834 chan->sdu_last_frag = skb;
5835
5836 skb = NULL;
5837 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005838 break;
5839
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005840 case L2CAP_SAR_CONTINUE:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005841 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005842 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005843
Mat Martineau84084a32011-07-22 14:54:00 -07005844 append_skb_frag(chan->sdu, skb,
5845 &chan->sdu_last_frag);
5846 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005847
Mat Martineau84084a32011-07-22 14:54:00 -07005848 if (chan->sdu->len >= chan->sdu_len)
5849 break;
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005850
Mat Martineau84084a32011-07-22 14:54:00 -07005851 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005852 break;
5853
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005854 case L2CAP_SAR_END:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005855 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005856 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005857
Mat Martineau84084a32011-07-22 14:54:00 -07005858 append_skb_frag(chan->sdu, skb,
5859 &chan->sdu_last_frag);
5860 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005861
Mat Martineau84084a32011-07-22 14:54:00 -07005862 if (chan->sdu->len != chan->sdu_len)
5863 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005864
Gustavo Padovan80b98022012-05-27 22:27:51 -03005865 err = chan->ops->recv(chan, chan->sdu);
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005866
Mat Martineau84084a32011-07-22 14:54:00 -07005867 if (!err) {
5868 /* Reassembly complete */
5869 chan->sdu = NULL;
5870 chan->sdu_last_frag = NULL;
5871 chan->sdu_len = 0;
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005872 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005873 break;
5874 }
5875
Mat Martineau84084a32011-07-22 14:54:00 -07005876 if (err) {
5877 kfree_skb(skb);
5878 kfree_skb(chan->sdu);
5879 chan->sdu = NULL;
5880 chan->sdu_last_frag = NULL;
5881 chan->sdu_len = 0;
5882 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005883
Mat Martineau84084a32011-07-22 14:54:00 -07005884 return err;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005885}
5886
Mat Martineau32b32732012-10-23 15:24:11 -07005887static int l2cap_resegment(struct l2cap_chan *chan)
5888{
5889 /* Placeholder */
5890 return 0;
5891}
5892
Mat Martineaue3281402011-07-07 09:39:02 -07005893void l2cap_chan_busy(struct l2cap_chan *chan, int busy)
Gustavo F. Padovan712132e2010-06-21 19:39:50 -03005894{
Mat Martineau61aa4f52012-05-17 20:53:40 -07005895 u8 event;
5896
5897 if (chan->mode != L2CAP_MODE_ERTM)
5898 return;
5899
5900 event = busy ? L2CAP_EV_LOCAL_BUSY_DETECTED : L2CAP_EV_LOCAL_BUSY_CLEAR;
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03005901 l2cap_tx(chan, NULL, NULL, event);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005902}
5903
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005904static int l2cap_rx_queued_iframes(struct l2cap_chan *chan)
5905{
Mat Martineau63838722012-05-17 20:53:45 -07005906 int err = 0;
5907 /* Pass sequential frames to l2cap_reassemble_sdu()
5908 * until a gap is encountered.
5909 */
5910
5911 BT_DBG("chan %p", chan);
5912
5913 while (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
5914 struct sk_buff *skb;
5915 BT_DBG("Searching for skb with txseq %d (queue len %d)",
5916 chan->buffer_seq, skb_queue_len(&chan->srej_q));
5917
5918 skb = l2cap_ertm_seq_in_queue(&chan->srej_q, chan->buffer_seq);
5919
5920 if (!skb)
5921 break;
5922
5923 skb_unlink(skb, &chan->srej_q);
5924 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
5925 err = l2cap_reassemble_sdu(chan, skb, &bt_cb(skb)->control);
5926 if (err)
5927 break;
5928 }
5929
5930 if (skb_queue_empty(&chan->srej_q)) {
5931 chan->rx_state = L2CAP_RX_STATE_RECV;
5932 l2cap_send_ack(chan);
5933 }
5934
5935 return err;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005936}
5937
5938static void l2cap_handle_srej(struct l2cap_chan *chan,
5939 struct l2cap_ctrl *control)
5940{
Mat Martineauf80842a2012-05-17 20:53:46 -07005941 struct sk_buff *skb;
5942
5943 BT_DBG("chan %p, control %p", chan, control);
5944
5945 if (control->reqseq == chan->next_tx_seq) {
5946 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005947 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005948 return;
5949 }
5950
5951 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
5952
5953 if (skb == NULL) {
5954 BT_DBG("Seq %d not available for retransmission",
5955 control->reqseq);
5956 return;
5957 }
5958
5959 if (chan->max_tx != 0 && bt_cb(skb)->control.retries >= chan->max_tx) {
5960 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005961 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005962 return;
5963 }
5964
5965 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
5966
5967 if (control->poll) {
5968 l2cap_pass_to_tx(chan, control);
5969
5970 set_bit(CONN_SEND_FBIT, &chan->conn_state);
5971 l2cap_retransmit(chan, control);
5972 l2cap_ertm_send(chan);
5973
5974 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5975 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5976 chan->srej_save_reqseq = control->reqseq;
5977 }
5978 } else {
5979 l2cap_pass_to_tx_fbit(chan, control);
5980
5981 if (control->final) {
5982 if (chan->srej_save_reqseq != control->reqseq ||
5983 !test_and_clear_bit(CONN_SREJ_ACT,
5984 &chan->conn_state))
5985 l2cap_retransmit(chan, control);
5986 } else {
5987 l2cap_retransmit(chan, control);
5988 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5989 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5990 chan->srej_save_reqseq = control->reqseq;
5991 }
5992 }
5993 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005994}
5995
5996static void l2cap_handle_rej(struct l2cap_chan *chan,
5997 struct l2cap_ctrl *control)
5998{
Mat Martineaufcd289d2012-05-17 20:53:47 -07005999 struct sk_buff *skb;
6000
6001 BT_DBG("chan %p, control %p", chan, control);
6002
6003 if (control->reqseq == chan->next_tx_seq) {
6004 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006005 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07006006 return;
6007 }
6008
6009 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
6010
6011 if (chan->max_tx && skb &&
6012 bt_cb(skb)->control.retries >= chan->max_tx) {
6013 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006014 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07006015 return;
6016 }
6017
6018 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6019
6020 l2cap_pass_to_tx(chan, control);
6021
6022 if (control->final) {
6023 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state))
6024 l2cap_retransmit_all(chan, control);
6025 } else {
6026 l2cap_retransmit_all(chan, control);
6027 l2cap_ertm_send(chan);
6028 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F)
6029 set_bit(CONN_REJ_ACT, &chan->conn_state);
6030 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006031}
6032
Mat Martineau4b51dae92012-05-17 20:53:37 -07006033static u8 l2cap_classify_txseq(struct l2cap_chan *chan, u16 txseq)
6034{
6035 BT_DBG("chan %p, txseq %d", chan, txseq);
6036
6037 BT_DBG("last_acked_seq %d, expected_tx_seq %d", chan->last_acked_seq,
6038 chan->expected_tx_seq);
6039
6040 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
6041 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
Gustavo Padovan2d792812012-10-06 10:07:01 +01006042 chan->tx_win) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07006043 /* See notes below regarding "double poll" and
6044 * invalid packets.
6045 */
6046 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
6047 BT_DBG("Invalid/Ignore - after SREJ");
6048 return L2CAP_TXSEQ_INVALID_IGNORE;
6049 } else {
6050 BT_DBG("Invalid - in window after SREJ sent");
6051 return L2CAP_TXSEQ_INVALID;
6052 }
6053 }
6054
6055 if (chan->srej_list.head == txseq) {
6056 BT_DBG("Expected SREJ");
6057 return L2CAP_TXSEQ_EXPECTED_SREJ;
6058 }
6059
6060 if (l2cap_ertm_seq_in_queue(&chan->srej_q, txseq)) {
6061 BT_DBG("Duplicate SREJ - txseq already stored");
6062 return L2CAP_TXSEQ_DUPLICATE_SREJ;
6063 }
6064
6065 if (l2cap_seq_list_contains(&chan->srej_list, txseq)) {
6066 BT_DBG("Unexpected SREJ - not requested");
6067 return L2CAP_TXSEQ_UNEXPECTED_SREJ;
6068 }
6069 }
6070
6071 if (chan->expected_tx_seq == txseq) {
6072 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
6073 chan->tx_win) {
6074 BT_DBG("Invalid - txseq outside tx window");
6075 return L2CAP_TXSEQ_INVALID;
6076 } else {
6077 BT_DBG("Expected");
6078 return L2CAP_TXSEQ_EXPECTED;
6079 }
6080 }
6081
6082 if (__seq_offset(chan, txseq, chan->last_acked_seq) <
Gustavo Padovan2d792812012-10-06 10:07:01 +01006083 __seq_offset(chan, chan->expected_tx_seq, chan->last_acked_seq)) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07006084 BT_DBG("Duplicate - expected_tx_seq later than txseq");
6085 return L2CAP_TXSEQ_DUPLICATE;
6086 }
6087
6088 if (__seq_offset(chan, txseq, chan->last_acked_seq) >= chan->tx_win) {
6089 /* A source of invalid packets is a "double poll" condition,
6090 * where delays cause us to send multiple poll packets. If
6091 * the remote stack receives and processes both polls,
6092 * sequence numbers can wrap around in such a way that a
6093 * resent frame has a sequence number that looks like new data
6094 * with a sequence gap. This would trigger an erroneous SREJ
6095 * request.
6096 *
6097 * Fortunately, this is impossible with a tx window that's
6098 * less than half of the maximum sequence number, which allows
6099 * invalid frames to be safely ignored.
6100 *
6101 * With tx window sizes greater than half of the tx window
6102 * maximum, the frame is invalid and cannot be ignored. This
6103 * causes a disconnect.
6104 */
6105
6106 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
6107 BT_DBG("Invalid/Ignore - txseq outside tx window");
6108 return L2CAP_TXSEQ_INVALID_IGNORE;
6109 } else {
6110 BT_DBG("Invalid - txseq outside tx window");
6111 return L2CAP_TXSEQ_INVALID;
6112 }
6113 } else {
6114 BT_DBG("Unexpected - txseq indicates missing frames");
6115 return L2CAP_TXSEQ_UNEXPECTED;
6116 }
6117}
6118
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006119static int l2cap_rx_state_recv(struct l2cap_chan *chan,
6120 struct l2cap_ctrl *control,
6121 struct sk_buff *skb, u8 event)
6122{
6123 int err = 0;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006124 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006125
6126 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6127 event);
6128
6129 switch (event) {
6130 case L2CAP_EV_RECV_IFRAME:
6131 switch (l2cap_classify_txseq(chan, control->txseq)) {
6132 case L2CAP_TXSEQ_EXPECTED:
6133 l2cap_pass_to_tx(chan, control);
6134
6135 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6136 BT_DBG("Busy, discarding expected seq %d",
6137 control->txseq);
6138 break;
6139 }
6140
6141 chan->expected_tx_seq = __next_seq(chan,
6142 control->txseq);
6143
6144 chan->buffer_seq = chan->expected_tx_seq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006145 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006146
6147 err = l2cap_reassemble_sdu(chan, skb, control);
6148 if (err)
6149 break;
6150
6151 if (control->final) {
6152 if (!test_and_clear_bit(CONN_REJ_ACT,
6153 &chan->conn_state)) {
6154 control->final = 0;
6155 l2cap_retransmit_all(chan, control);
6156 l2cap_ertm_send(chan);
6157 }
6158 }
6159
6160 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
6161 l2cap_send_ack(chan);
6162 break;
6163 case L2CAP_TXSEQ_UNEXPECTED:
6164 l2cap_pass_to_tx(chan, control);
6165
6166 /* Can't issue SREJ frames in the local busy state.
6167 * Drop this frame, it will be seen as missing
6168 * when local busy is exited.
6169 */
6170 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6171 BT_DBG("Busy, discarding unexpected seq %d",
6172 control->txseq);
6173 break;
6174 }
6175
6176 /* There was a gap in the sequence, so an SREJ
6177 * must be sent for each missing frame. The
6178 * current frame is stored for later use.
6179 */
6180 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006181 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006182 BT_DBG("Queued %p (queue len %d)", skb,
6183 skb_queue_len(&chan->srej_q));
6184
6185 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
6186 l2cap_seq_list_clear(&chan->srej_list);
6187 l2cap_send_srej(chan, control->txseq);
6188
6189 chan->rx_state = L2CAP_RX_STATE_SREJ_SENT;
6190 break;
6191 case L2CAP_TXSEQ_DUPLICATE:
6192 l2cap_pass_to_tx(chan, control);
6193 break;
6194 case L2CAP_TXSEQ_INVALID_IGNORE:
6195 break;
6196 case L2CAP_TXSEQ_INVALID:
6197 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006198 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006199 break;
6200 }
6201 break;
6202 case L2CAP_EV_RECV_RR:
6203 l2cap_pass_to_tx(chan, control);
6204 if (control->final) {
6205 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6206
Mat Martineaue6a3ee62012-10-23 15:24:22 -07006207 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state) &&
6208 !__chan_is_moving(chan)) {
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006209 control->final = 0;
6210 l2cap_retransmit_all(chan, control);
6211 }
6212
6213 l2cap_ertm_send(chan);
6214 } else if (control->poll) {
6215 l2cap_send_i_or_rr_or_rnr(chan);
6216 } else {
6217 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6218 &chan->conn_state) &&
6219 chan->unacked_frames)
6220 __set_retrans_timer(chan);
6221
6222 l2cap_ertm_send(chan);
6223 }
6224 break;
6225 case L2CAP_EV_RECV_RNR:
6226 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6227 l2cap_pass_to_tx(chan, control);
6228 if (control && control->poll) {
6229 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6230 l2cap_send_rr_or_rnr(chan, 0);
6231 }
6232 __clear_retrans_timer(chan);
6233 l2cap_seq_list_clear(&chan->retrans_list);
6234 break;
6235 case L2CAP_EV_RECV_REJ:
6236 l2cap_handle_rej(chan, control);
6237 break;
6238 case L2CAP_EV_RECV_SREJ:
6239 l2cap_handle_srej(chan, control);
6240 break;
6241 default:
6242 break;
6243 }
6244
6245 if (skb && !skb_in_use) {
6246 BT_DBG("Freeing %p", skb);
6247 kfree_skb(skb);
6248 }
6249
6250 return err;
6251}
6252
6253static int l2cap_rx_state_srej_sent(struct l2cap_chan *chan,
6254 struct l2cap_ctrl *control,
6255 struct sk_buff *skb, u8 event)
6256{
6257 int err = 0;
6258 u16 txseq = control->txseq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006259 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006260
6261 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6262 event);
6263
6264 switch (event) {
6265 case L2CAP_EV_RECV_IFRAME:
6266 switch (l2cap_classify_txseq(chan, txseq)) {
6267 case L2CAP_TXSEQ_EXPECTED:
6268 /* Keep frame for reassembly later */
6269 l2cap_pass_to_tx(chan, control);
6270 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006271 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006272 BT_DBG("Queued %p (queue len %d)", skb,
6273 skb_queue_len(&chan->srej_q));
6274
6275 chan->expected_tx_seq = __next_seq(chan, txseq);
6276 break;
6277 case L2CAP_TXSEQ_EXPECTED_SREJ:
6278 l2cap_seq_list_pop(&chan->srej_list);
6279
6280 l2cap_pass_to_tx(chan, control);
6281 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006282 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006283 BT_DBG("Queued %p (queue len %d)", skb,
6284 skb_queue_len(&chan->srej_q));
6285
6286 err = l2cap_rx_queued_iframes(chan);
6287 if (err)
6288 break;
6289
6290 break;
6291 case L2CAP_TXSEQ_UNEXPECTED:
6292 /* Got a frame that can't be reassembled yet.
6293 * Save it for later, and send SREJs to cover
6294 * the missing frames.
6295 */
6296 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006297 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006298 BT_DBG("Queued %p (queue len %d)", skb,
6299 skb_queue_len(&chan->srej_q));
6300
6301 l2cap_pass_to_tx(chan, control);
6302 l2cap_send_srej(chan, control->txseq);
6303 break;
6304 case L2CAP_TXSEQ_UNEXPECTED_SREJ:
6305 /* This frame was requested with an SREJ, but
6306 * some expected retransmitted frames are
6307 * missing. Request retransmission of missing
6308 * SREJ'd frames.
6309 */
6310 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006311 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006312 BT_DBG("Queued %p (queue len %d)", skb,
6313 skb_queue_len(&chan->srej_q));
6314
6315 l2cap_pass_to_tx(chan, control);
6316 l2cap_send_srej_list(chan, control->txseq);
6317 break;
6318 case L2CAP_TXSEQ_DUPLICATE_SREJ:
6319 /* We've already queued this frame. Drop this copy. */
6320 l2cap_pass_to_tx(chan, control);
6321 break;
6322 case L2CAP_TXSEQ_DUPLICATE:
6323 /* Expecting a later sequence number, so this frame
6324 * was already received. Ignore it completely.
6325 */
6326 break;
6327 case L2CAP_TXSEQ_INVALID_IGNORE:
6328 break;
6329 case L2CAP_TXSEQ_INVALID:
6330 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006331 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006332 break;
6333 }
6334 break;
6335 case L2CAP_EV_RECV_RR:
6336 l2cap_pass_to_tx(chan, control);
6337 if (control->final) {
6338 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6339
6340 if (!test_and_clear_bit(CONN_REJ_ACT,
6341 &chan->conn_state)) {
6342 control->final = 0;
6343 l2cap_retransmit_all(chan, control);
6344 }
6345
6346 l2cap_ertm_send(chan);
6347 } else if (control->poll) {
6348 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6349 &chan->conn_state) &&
6350 chan->unacked_frames) {
6351 __set_retrans_timer(chan);
6352 }
6353
6354 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6355 l2cap_send_srej_tail(chan);
6356 } else {
6357 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6358 &chan->conn_state) &&
6359 chan->unacked_frames)
6360 __set_retrans_timer(chan);
6361
6362 l2cap_send_ack(chan);
6363 }
6364 break;
6365 case L2CAP_EV_RECV_RNR:
6366 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6367 l2cap_pass_to_tx(chan, control);
6368 if (control->poll) {
6369 l2cap_send_srej_tail(chan);
6370 } else {
6371 struct l2cap_ctrl rr_control;
6372 memset(&rr_control, 0, sizeof(rr_control));
6373 rr_control.sframe = 1;
6374 rr_control.super = L2CAP_SUPER_RR;
6375 rr_control.reqseq = chan->buffer_seq;
6376 l2cap_send_sframe(chan, &rr_control);
6377 }
6378
6379 break;
6380 case L2CAP_EV_RECV_REJ:
6381 l2cap_handle_rej(chan, control);
6382 break;
6383 case L2CAP_EV_RECV_SREJ:
6384 l2cap_handle_srej(chan, control);
6385 break;
6386 }
6387
6388 if (skb && !skb_in_use) {
6389 BT_DBG("Freeing %p", skb);
6390 kfree_skb(skb);
6391 }
6392
6393 return err;
6394}
6395
Mat Martineau32b32732012-10-23 15:24:11 -07006396static int l2cap_finish_move(struct l2cap_chan *chan)
6397{
6398 BT_DBG("chan %p", chan);
6399
6400 chan->rx_state = L2CAP_RX_STATE_RECV;
6401
6402 if (chan->hs_hcon)
6403 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6404 else
6405 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6406
6407 return l2cap_resegment(chan);
6408}
6409
6410static int l2cap_rx_state_wait_p(struct l2cap_chan *chan,
6411 struct l2cap_ctrl *control,
6412 struct sk_buff *skb, u8 event)
6413{
6414 int err;
6415
6416 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6417 event);
6418
6419 if (!control->poll)
6420 return -EPROTO;
6421
6422 l2cap_process_reqseq(chan, control->reqseq);
6423
6424 if (!skb_queue_empty(&chan->tx_q))
6425 chan->tx_send_head = skb_peek(&chan->tx_q);
6426 else
6427 chan->tx_send_head = NULL;
6428
6429 /* Rewind next_tx_seq to the point expected
6430 * by the receiver.
6431 */
6432 chan->next_tx_seq = control->reqseq;
6433 chan->unacked_frames = 0;
6434
6435 err = l2cap_finish_move(chan);
6436 if (err)
6437 return err;
6438
6439 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6440 l2cap_send_i_or_rr_or_rnr(chan);
6441
6442 if (event == L2CAP_EV_RECV_IFRAME)
6443 return -EPROTO;
6444
6445 return l2cap_rx_state_recv(chan, control, NULL, event);
6446}
6447
6448static int l2cap_rx_state_wait_f(struct l2cap_chan *chan,
6449 struct l2cap_ctrl *control,
6450 struct sk_buff *skb, u8 event)
6451{
6452 int err;
6453
6454 if (!control->final)
6455 return -EPROTO;
6456
6457 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6458
6459 chan->rx_state = L2CAP_RX_STATE_RECV;
6460 l2cap_process_reqseq(chan, control->reqseq);
6461
6462 if (!skb_queue_empty(&chan->tx_q))
6463 chan->tx_send_head = skb_peek(&chan->tx_q);
6464 else
6465 chan->tx_send_head = NULL;
6466
6467 /* Rewind next_tx_seq to the point expected
6468 * by the receiver.
6469 */
6470 chan->next_tx_seq = control->reqseq;
6471 chan->unacked_frames = 0;
6472
6473 if (chan->hs_hcon)
6474 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6475 else
6476 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6477
6478 err = l2cap_resegment(chan);
6479
6480 if (!err)
6481 err = l2cap_rx_state_recv(chan, control, skb, event);
6482
6483 return err;
6484}
6485
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006486static bool __valid_reqseq(struct l2cap_chan *chan, u16 reqseq)
6487{
6488 /* Make sure reqseq is for a packet that has been sent but not acked */
6489 u16 unacked;
6490
6491 unacked = __seq_offset(chan, chan->next_tx_seq, chan->expected_ack_seq);
6492 return __seq_offset(chan, chan->next_tx_seq, reqseq) <= unacked;
6493}
6494
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006495static int l2cap_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6496 struct sk_buff *skb, u8 event)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006497{
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006498 int err = 0;
6499
6500 BT_DBG("chan %p, control %p, skb %p, event %d, state %d", chan,
6501 control, skb, event, chan->rx_state);
6502
6503 if (__valid_reqseq(chan, control->reqseq)) {
6504 switch (chan->rx_state) {
6505 case L2CAP_RX_STATE_RECV:
6506 err = l2cap_rx_state_recv(chan, control, skb, event);
6507 break;
6508 case L2CAP_RX_STATE_SREJ_SENT:
6509 err = l2cap_rx_state_srej_sent(chan, control, skb,
6510 event);
6511 break;
Mat Martineau32b32732012-10-23 15:24:11 -07006512 case L2CAP_RX_STATE_WAIT_P:
6513 err = l2cap_rx_state_wait_p(chan, control, skb, event);
6514 break;
6515 case L2CAP_RX_STATE_WAIT_F:
6516 err = l2cap_rx_state_wait_f(chan, control, skb, event);
6517 break;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006518 default:
6519 /* shut it down */
6520 break;
6521 }
6522 } else {
6523 BT_DBG("Invalid reqseq %d (next_tx_seq %d, expected_ack_seq %d",
6524 control->reqseq, chan->next_tx_seq,
6525 chan->expected_ack_seq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006526 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006527 }
6528
6529 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006530}
6531
6532static int l2cap_stream_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6533 struct sk_buff *skb)
6534{
Mat Martineau4b51dae92012-05-17 20:53:37 -07006535 int err = 0;
6536
6537 BT_DBG("chan %p, control %p, skb %p, state %d", chan, control, skb,
6538 chan->rx_state);
6539
6540 if (l2cap_classify_txseq(chan, control->txseq) ==
6541 L2CAP_TXSEQ_EXPECTED) {
6542 l2cap_pass_to_tx(chan, control);
6543
6544 BT_DBG("buffer_seq %d->%d", chan->buffer_seq,
6545 __next_seq(chan, chan->buffer_seq));
6546
6547 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
6548
6549 l2cap_reassemble_sdu(chan, skb, control);
6550 } else {
6551 if (chan->sdu) {
6552 kfree_skb(chan->sdu);
6553 chan->sdu = NULL;
6554 }
6555 chan->sdu_last_frag = NULL;
6556 chan->sdu_len = 0;
6557
6558 if (skb) {
6559 BT_DBG("Freeing %p", skb);
6560 kfree_skb(skb);
6561 }
6562 }
6563
6564 chan->last_acked_seq = control->txseq;
6565 chan->expected_tx_seq = __next_seq(chan, control->txseq);
6566
6567 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006568}
6569
6570static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6571{
6572 struct l2cap_ctrl *control = &bt_cb(skb)->control;
6573 u16 len;
6574 u8 event;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006575
Mat Martineaub76bbd62012-04-11 10:48:43 -07006576 __unpack_control(chan, skb);
6577
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006578 len = skb->len;
6579
6580 /*
6581 * We can just drop the corrupted I-frame here.
6582 * Receiver will miss it and start proper recovery
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006583 * procedures and ask for retransmission.
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006584 */
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006585 if (l2cap_check_fcs(chan, skb))
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006586 goto drop;
6587
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006588 if (!control->sframe && control->sar == L2CAP_SAR_START)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006589 len -= L2CAP_SDULEN_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006590
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006591 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006592 len -= L2CAP_FCS_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006593
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006594 if (len > chan->mps) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006595 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006596 goto drop;
6597 }
6598
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006599 if (!control->sframe) {
6600 int err;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006601
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006602 BT_DBG("iframe sar %d, reqseq %d, final %d, txseq %d",
6603 control->sar, control->reqseq, control->final,
6604 control->txseq);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03006605
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006606 /* Validate F-bit - F=0 always valid, F=1 only
6607 * valid in TX WAIT_F
6608 */
6609 if (control->final && chan->tx_state != L2CAP_TX_STATE_WAIT_F)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006610 goto drop;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006611
6612 if (chan->mode != L2CAP_MODE_STREAMING) {
6613 event = L2CAP_EV_RECV_IFRAME;
6614 err = l2cap_rx(chan, control, skb, event);
6615 } else {
6616 err = l2cap_stream_rx(chan, control, skb);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006617 }
6618
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006619 if (err)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006620 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006621 } else {
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006622 const u8 rx_func_to_event[4] = {
6623 L2CAP_EV_RECV_RR, L2CAP_EV_RECV_REJ,
6624 L2CAP_EV_RECV_RNR, L2CAP_EV_RECV_SREJ
6625 };
6626
6627 /* Only I-frames are expected in streaming mode */
6628 if (chan->mode == L2CAP_MODE_STREAMING)
6629 goto drop;
6630
6631 BT_DBG("sframe reqseq %d, final %d, poll %d, super %d",
6632 control->reqseq, control->final, control->poll,
6633 control->super);
6634
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006635 if (len != 0) {
Andrei Emeltchenko1bb166e2012-11-20 17:16:21 +02006636 BT_ERR("Trailing bytes: %d in sframe", len);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006637 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006638 goto drop;
6639 }
6640
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006641 /* Validate F and P bits */
6642 if (control->final && (control->poll ||
6643 chan->tx_state != L2CAP_TX_STATE_WAIT_F))
6644 goto drop;
6645
6646 event = rx_func_to_event[control->super];
6647 if (l2cap_rx(chan, control, skb, event))
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006648 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006649 }
6650
6651 return 0;
6652
6653drop:
6654 kfree_skb(skb);
6655 return 0;
6656}
6657
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006658static void l2cap_chan_le_send_credits(struct l2cap_chan *chan)
6659{
6660 struct l2cap_conn *conn = chan->conn;
6661 struct l2cap_le_credits pkt;
6662 u16 return_credits;
6663
6664 /* We return more credits to the sender only after the amount of
6665 * credits falls below half of the initial amount.
6666 */
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02006667 if (chan->rx_credits >= (le_max_credits + 1) / 2)
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006668 return;
6669
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02006670 return_credits = le_max_credits - chan->rx_credits;
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006671
6672 BT_DBG("chan %p returning %u credits to sender", chan, return_credits);
6673
6674 chan->rx_credits += return_credits;
6675
6676 pkt.cid = cpu_to_le16(chan->scid);
6677 pkt.credits = cpu_to_le16(return_credits);
6678
6679 chan->ident = l2cap_get_ident(conn);
6680
6681 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CREDITS, sizeof(pkt), &pkt);
6682}
6683
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006684static int l2cap_le_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6685{
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006686 int err;
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006687
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006688 if (!chan->rx_credits) {
6689 BT_ERR("No credits to receive LE L2CAP data");
Johan Hedbergdfd97742014-01-27 15:11:34 -08006690 l2cap_send_disconn_req(chan, ECONNRESET);
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006691 return -ENOBUFS;
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006692 }
6693
6694 if (chan->imtu < skb->len) {
6695 BT_ERR("Too big LE L2CAP PDU");
6696 return -ENOBUFS;
6697 }
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006698
6699 chan->rx_credits--;
6700 BT_DBG("rx_credits %u -> %u", chan->rx_credits + 1, chan->rx_credits);
6701
6702 l2cap_chan_le_send_credits(chan);
6703
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006704 err = 0;
6705
6706 if (!chan->sdu) {
6707 u16 sdu_len;
6708
6709 sdu_len = get_unaligned_le16(skb->data);
6710 skb_pull(skb, L2CAP_SDULEN_SIZE);
6711
6712 BT_DBG("Start of new SDU. sdu_len %u skb->len %u imtu %u",
6713 sdu_len, skb->len, chan->imtu);
6714
6715 if (sdu_len > chan->imtu) {
6716 BT_ERR("Too big LE L2CAP SDU length received");
6717 err = -EMSGSIZE;
6718 goto failed;
6719 }
6720
6721 if (skb->len > sdu_len) {
6722 BT_ERR("Too much LE L2CAP data received");
6723 err = -EINVAL;
6724 goto failed;
6725 }
6726
6727 if (skb->len == sdu_len)
6728 return chan->ops->recv(chan, skb);
6729
6730 chan->sdu = skb;
6731 chan->sdu_len = sdu_len;
6732 chan->sdu_last_frag = skb;
6733
6734 return 0;
6735 }
6736
6737 BT_DBG("SDU fragment. chan->sdu->len %u skb->len %u chan->sdu_len %u",
6738 chan->sdu->len, skb->len, chan->sdu_len);
6739
6740 if (chan->sdu->len + skb->len > chan->sdu_len) {
6741 BT_ERR("Too much LE L2CAP data received");
6742 err = -EINVAL;
6743 goto failed;
6744 }
6745
6746 append_skb_frag(chan->sdu, skb, &chan->sdu_last_frag);
6747 skb = NULL;
6748
6749 if (chan->sdu->len == chan->sdu_len) {
6750 err = chan->ops->recv(chan, chan->sdu);
6751 if (!err) {
6752 chan->sdu = NULL;
6753 chan->sdu_last_frag = NULL;
6754 chan->sdu_len = 0;
6755 }
6756 }
6757
6758failed:
6759 if (err) {
6760 kfree_skb(skb);
6761 kfree_skb(chan->sdu);
6762 chan->sdu = NULL;
6763 chan->sdu_last_frag = NULL;
6764 chan->sdu_len = 0;
6765 }
6766
6767 /* We can't return an error here since we took care of the skb
6768 * freeing internally. An error return would cause the caller to
6769 * do a double-free of the skb.
6770 */
6771 return 0;
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006772}
6773
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006774static void l2cap_data_channel(struct l2cap_conn *conn, u16 cid,
6775 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006776{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006777 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006778
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03006779 chan = l2cap_get_chan_by_scid(conn, cid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006780 if (!chan) {
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006781 if (cid == L2CAP_CID_A2MP) {
6782 chan = a2mp_channel_create(conn, skb);
6783 if (!chan) {
6784 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006785 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006786 }
6787
6788 l2cap_chan_lock(chan);
6789 } else {
6790 BT_DBG("unknown cid 0x%4.4x", cid);
6791 /* Drop packet and return */
6792 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006793 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006794 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006795 }
6796
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03006797 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006798
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03006799 if (chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006800 goto drop;
6801
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006802 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03006803 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006804 if (l2cap_le_data_rcv(chan, skb) < 0)
6805 goto drop;
6806
6807 goto done;
6808
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006809 case L2CAP_MODE_BASIC:
6810 /* If socket recv buffers overflows we drop data here
6811 * which is *bad* because L2CAP has to be reliable.
6812 * But we don't have any other choice. L2CAP doesn't
6813 * provide flow control mechanism. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07006814
Szymon Janc2c96e032014-02-18 20:48:34 +01006815 if (chan->imtu < skb->len) {
6816 BT_ERR("Dropping L2CAP data: receive buffer overflow");
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006817 goto drop;
Szymon Janc2c96e032014-02-18 20:48:34 +01006818 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006819
Gustavo Padovan80b98022012-05-27 22:27:51 -03006820 if (!chan->ops->recv(chan, skb))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006821 goto done;
6822 break;
6823
6824 case L2CAP_MODE_ERTM:
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006825 case L2CAP_MODE_STREAMING:
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006826 l2cap_data_rcv(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006827 goto done;
6828
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006829 default:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006830 BT_DBG("chan %p: bad mode 0x%2.2x", chan, chan->mode);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006831 break;
6832 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006833
6834drop:
6835 kfree_skb(skb);
6836
6837done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006838 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006839}
6840
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006841static void l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm,
6842 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006843{
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006844 struct hci_conn *hcon = conn->hcon;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006845 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006846
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006847 if (hcon->type != ACL_LINK)
6848 goto drop;
6849
Johan Hedbergbf20fd42013-05-14 13:23:13 +03006850 chan = l2cap_global_chan_by_psm(0, psm, &hcon->src, &hcon->dst,
6851 ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006852 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006853 goto drop;
6854
Andrei Emeltchenko5b4ceda2012-02-24 16:35:32 +02006855 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006856
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03006857 if (chan->state != BT_BOUND && chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006858 goto drop;
6859
Vinicius Costa Gomese13e21d2011-06-17 22:46:27 -03006860 if (chan->imtu < skb->len)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006861 goto drop;
6862
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006863 /* Store remote BD_ADDR and PSM for msg_name */
Marcel Holtmann06ae3312013-10-18 03:43:00 -07006864 bacpy(&bt_cb(skb)->bdaddr, &hcon->dst);
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006865 bt_cb(skb)->psm = psm;
6866
Gustavo Padovan80b98022012-05-27 22:27:51 -03006867 if (!chan->ops->recv(chan, skb))
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006868 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006869
6870drop:
6871 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006872}
6873
Marcel Holtmann72f78352013-04-23 00:59:00 -07006874static void l2cap_att_channel(struct l2cap_conn *conn,
Andrei Emeltchenko6810fca2012-05-31 11:18:57 +03006875 struct sk_buff *skb)
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006876{
Marcel Holtmannb99707d2013-10-03 02:54:11 -07006877 struct hci_conn *hcon = conn->hcon;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006878 struct l2cap_chan *chan;
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006879
Marcel Holtmannb99707d2013-10-03 02:54:11 -07006880 if (hcon->type != LE_LINK)
6881 goto drop;
6882
Johan Hedbergaf1c0132013-04-29 19:35:42 +03006883 chan = l2cap_global_chan_by_scid(BT_CONNECTED, L2CAP_CID_ATT,
Marcel Holtmann06ae3312013-10-18 03:43:00 -07006884 &hcon->src, &hcon->dst);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006885 if (!chan)
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006886 goto drop;
6887
Andrei Emeltchenko5b4ceda2012-02-24 16:35:32 +02006888 BT_DBG("chan %p, len %d", chan, skb->len);
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006889
Vinicius Costa Gomese13e21d2011-06-17 22:46:27 -03006890 if (chan->imtu < skb->len)
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006891 goto drop;
6892
Gustavo Padovan80b98022012-05-27 22:27:51 -03006893 if (!chan->ops->recv(chan, skb))
Andrei Emeltchenko6810fca2012-05-31 11:18:57 +03006894 return;
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006895
6896drop:
6897 kfree_skb(skb);
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006898}
6899
Linus Torvalds1da177e2005-04-16 15:20:36 -07006900static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb)
6901{
6902 struct l2cap_hdr *lh = (void *) skb->data;
Johan Hedberg61a939c2014-01-17 20:45:11 +02006903 struct hci_conn *hcon = conn->hcon;
Al Viro8e036fc2007-07-29 00:16:36 -07006904 u16 cid, len;
6905 __le16 psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006906
Johan Hedberg61a939c2014-01-17 20:45:11 +02006907 if (hcon->state != BT_CONNECTED) {
6908 BT_DBG("queueing pending rx skb");
6909 skb_queue_tail(&conn->pending_rx, skb);
6910 return;
6911 }
6912
Linus Torvalds1da177e2005-04-16 15:20:36 -07006913 skb_pull(skb, L2CAP_HDR_SIZE);
6914 cid = __le16_to_cpu(lh->cid);
6915 len = __le16_to_cpu(lh->len);
6916
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006917 if (len != skb->len) {
6918 kfree_skb(skb);
6919 return;
6920 }
6921
Johan Hedberg9e1d7e12014-07-06 11:03:36 +03006922 /* Since we can't actively block incoming LE connections we must
6923 * at least ensure that we ignore incoming data from them.
6924 */
6925 if (hcon->type == LE_LINK &&
Johan Hedbergdcc36c12014-07-09 12:59:13 +03006926 hci_bdaddr_list_lookup(&hcon->hdev->blacklist, &hcon->dst,
6927 bdaddr_type(hcon, hcon->dst_type))) {
Johan Hedberge4931502014-07-02 09:36:21 +03006928 kfree_skb(skb);
6929 return;
6930 }
6931
Linus Torvalds1da177e2005-04-16 15:20:36 -07006932 BT_DBG("len %d, cid 0x%4.4x", len, cid);
6933
6934 switch (cid) {
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006935 case L2CAP_CID_SIGNALING:
Linus Torvalds1da177e2005-04-16 15:20:36 -07006936 l2cap_sig_channel(conn, skb);
6937 break;
6938
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006939 case L2CAP_CID_CONN_LESS:
Andrei Emeltchenko097db762012-03-09 14:16:17 +02006940 psm = get_unaligned((__le16 *) skb->data);
Andrei Emeltchenko0181a702012-05-29 10:04:05 +03006941 skb_pull(skb, L2CAP_PSMLEN_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006942 l2cap_conless_channel(conn, psm, skb);
6943 break;
6944
Johan Hedberg073d1cf2013-04-29 19:35:35 +03006945 case L2CAP_CID_ATT:
Marcel Holtmann72f78352013-04-23 00:59:00 -07006946 l2cap_att_channel(conn, skb);
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006947 break;
6948
Marcel Holtmanna2877622013-10-02 23:46:54 -07006949 case L2CAP_CID_LE_SIGNALING:
6950 l2cap_le_sig_channel(conn, skb);
6951 break;
6952
Anderson Brigliab501d6a2011-06-07 18:46:31 -03006953 case L2CAP_CID_SMP:
6954 if (smp_sig_channel(conn, skb))
6955 l2cap_conn_del(conn->hcon, EACCES);
6956 break;
6957
Linus Torvalds1da177e2005-04-16 15:20:36 -07006958 default:
6959 l2cap_data_channel(conn, cid, skb);
6960 break;
6961 }
6962}
6963
Johan Hedberg61a939c2014-01-17 20:45:11 +02006964static void process_pending_rx(struct work_struct *work)
6965{
6966 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
6967 pending_rx_work);
6968 struct sk_buff *skb;
6969
6970 BT_DBG("");
6971
6972 while ((skb = skb_dequeue(&conn->pending_rx)))
6973 l2cap_recv_frame(conn, skb);
6974}
6975
Johan Hedberg162b49e2014-01-17 20:45:10 +02006976static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon)
6977{
6978 struct l2cap_conn *conn = hcon->l2cap_data;
6979 struct hci_chan *hchan;
6980
6981 if (conn)
6982 return conn;
6983
6984 hchan = hci_chan_create(hcon);
6985 if (!hchan)
6986 return NULL;
6987
Johan Hedberg27f70f32014-07-21 10:50:06 +03006988 conn = kzalloc(sizeof(*conn), GFP_KERNEL);
Johan Hedberg162b49e2014-01-17 20:45:10 +02006989 if (!conn) {
6990 hci_chan_del(hchan);
6991 return NULL;
6992 }
6993
6994 kref_init(&conn->ref);
6995 hcon->l2cap_data = conn;
6996 conn->hcon = hcon;
6997 hci_conn_get(conn->hcon);
6998 conn->hchan = hchan;
6999
7000 BT_DBG("hcon %p conn %p hchan %p", hcon, conn, hchan);
7001
7002 switch (hcon->type) {
7003 case LE_LINK:
7004 if (hcon->hdev->le_mtu) {
7005 conn->mtu = hcon->hdev->le_mtu;
7006 break;
7007 }
7008 /* fall through */
7009 default:
7010 conn->mtu = hcon->hdev->acl_mtu;
7011 break;
7012 }
7013
7014 conn->feat_mask = 0;
7015
7016 if (hcon->type == ACL_LINK)
7017 conn->hs_enabled = test_bit(HCI_HS_ENABLED,
7018 &hcon->hdev->dev_flags);
7019
Marcel Holtmann5a54e7c2014-07-13 20:50:15 +02007020 mutex_init(&conn->ident_lock);
Johan Hedberg162b49e2014-01-17 20:45:10 +02007021 mutex_init(&conn->chan_lock);
7022
7023 INIT_LIST_HEAD(&conn->chan_l);
7024 INIT_LIST_HEAD(&conn->users);
7025
7026 if (hcon->type == LE_LINK)
7027 INIT_DELAYED_WORK(&conn->security_timer, security_timeout);
7028 else
7029 INIT_DELAYED_WORK(&conn->info_timer, l2cap_info_timeout);
7030
Johan Hedberg61a939c2014-01-17 20:45:11 +02007031 skb_queue_head_init(&conn->pending_rx);
7032 INIT_WORK(&conn->pending_rx_work, process_pending_rx);
7033
Johan Hedberg162b49e2014-01-17 20:45:10 +02007034 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
7035
7036 return conn;
7037}
7038
7039static bool is_valid_psm(u16 psm, u8 dst_type) {
7040 if (!psm)
7041 return false;
7042
7043 if (bdaddr_type_is_le(dst_type))
7044 return (psm <= 0x00ff);
7045
7046 /* PSM must be odd and lsb of upper byte must be 0 */
7047 return ((psm & 0x0101) == 0x0001);
7048}
7049
7050int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
7051 bdaddr_t *dst, u8 dst_type)
7052{
7053 struct l2cap_conn *conn;
7054 struct hci_conn *hcon;
7055 struct hci_dev *hdev;
Johan Hedberg162b49e2014-01-17 20:45:10 +02007056 int err;
7057
7058 BT_DBG("%pMR -> %pMR (type %u) psm 0x%2.2x", &chan->src, dst,
7059 dst_type, __le16_to_cpu(psm));
7060
7061 hdev = hci_get_route(dst, &chan->src);
7062 if (!hdev)
7063 return -EHOSTUNREACH;
7064
7065 hci_dev_lock(hdev);
7066
7067 l2cap_chan_lock(chan);
7068
7069 if (!is_valid_psm(__le16_to_cpu(psm), dst_type) && !cid &&
7070 chan->chan_type != L2CAP_CHAN_RAW) {
7071 err = -EINVAL;
7072 goto done;
7073 }
7074
Johan Hedberg21626e62014-01-24 10:35:41 +02007075 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED && !psm) {
7076 err = -EINVAL;
7077 goto done;
7078 }
7079
7080 if (chan->chan_type == L2CAP_CHAN_FIXED && !cid) {
Johan Hedberg162b49e2014-01-17 20:45:10 +02007081 err = -EINVAL;
7082 goto done;
7083 }
7084
7085 switch (chan->mode) {
7086 case L2CAP_MODE_BASIC:
7087 break;
7088 case L2CAP_MODE_LE_FLOWCTL:
7089 l2cap_le_flowctl_init(chan);
7090 break;
7091 case L2CAP_MODE_ERTM:
7092 case L2CAP_MODE_STREAMING:
7093 if (!disable_ertm)
7094 break;
7095 /* fall through */
7096 default:
Johan Hedbergbeb19e42014-07-18 11:15:26 +03007097 err = -EOPNOTSUPP;
Johan Hedberg162b49e2014-01-17 20:45:10 +02007098 goto done;
7099 }
7100
7101 switch (chan->state) {
7102 case BT_CONNECT:
7103 case BT_CONNECT2:
7104 case BT_CONFIG:
7105 /* Already connecting */
7106 err = 0;
7107 goto done;
7108
7109 case BT_CONNECTED:
7110 /* Already connected */
7111 err = -EISCONN;
7112 goto done;
7113
7114 case BT_OPEN:
7115 case BT_BOUND:
7116 /* Can connect */
7117 break;
7118
7119 default:
7120 err = -EBADFD;
7121 goto done;
7122 }
7123
7124 /* Set destination address and psm */
7125 bacpy(&chan->dst, dst);
7126 chan->dst_type = dst_type;
7127
7128 chan->psm = psm;
7129 chan->dcid = cid;
7130
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007131 if (bdaddr_type_is_le(dst_type)) {
Johan Hedberge804d252014-07-16 11:42:28 +03007132 u8 role;
Johan Hedbergcdd62752014-07-07 15:02:28 +03007133
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007134 /* Convert from L2CAP channel address type to HCI address type
7135 */
7136 if (dst_type == BDADDR_LE_PUBLIC)
7137 dst_type = ADDR_LE_DEV_PUBLIC;
7138 else
7139 dst_type = ADDR_LE_DEV_RANDOM;
7140
Johan Hedberge804d252014-07-16 11:42:28 +03007141 if (test_bit(HCI_ADVERTISING, &hdev->dev_flags))
7142 role = HCI_ROLE_SLAVE;
7143 else
7144 role = HCI_ROLE_MASTER;
Johan Hedbergcdd62752014-07-07 15:02:28 +03007145
Andre Guedes04a6c582014-02-26 20:21:44 -03007146 hcon = hci_connect_le(hdev, dst, dst_type, chan->sec_level,
Johan Hedberge804d252014-07-16 11:42:28 +03007147 HCI_LE_CONN_TIMEOUT, role);
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007148 } else {
Johan Hedbergd93375a2014-07-07 15:02:27 +03007149 u8 auth_type = l2cap_get_auth_type(chan);
Andre Guedes04a6c582014-02-26 20:21:44 -03007150 hcon = hci_connect_acl(hdev, dst, chan->sec_level, auth_type);
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007151 }
Johan Hedberg162b49e2014-01-17 20:45:10 +02007152
7153 if (IS_ERR(hcon)) {
7154 err = PTR_ERR(hcon);
7155 goto done;
7156 }
7157
7158 conn = l2cap_conn_add(hcon);
7159 if (!conn) {
7160 hci_conn_drop(hcon);
7161 err = -ENOMEM;
7162 goto done;
7163 }
7164
7165 if (cid && __l2cap_get_chan_by_dcid(conn, cid)) {
7166 hci_conn_drop(hcon);
7167 err = -EBUSY;
7168 goto done;
7169 }
7170
7171 /* Update source addr of the socket */
7172 bacpy(&chan->src, &hcon->src);
7173 chan->src_type = bdaddr_type(hcon, hcon->src_type);
7174
7175 l2cap_chan_unlock(chan);
7176 l2cap_chan_add(conn, chan);
7177 l2cap_chan_lock(chan);
7178
7179 /* l2cap_chan_add takes its own ref so we can drop this one */
7180 hci_conn_drop(hcon);
7181
7182 l2cap_state_change(chan, BT_CONNECT);
7183 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
7184
Johan Hedberg61202e42014-01-28 15:16:48 -08007185 /* Release chan->sport so that it can be reused by other
7186 * sockets (as it's only used for listening sockets).
7187 */
7188 write_lock(&chan_list_lock);
7189 chan->sport = 0;
7190 write_unlock(&chan_list_lock);
7191
Johan Hedberg162b49e2014-01-17 20:45:10 +02007192 if (hcon->state == BT_CONNECTED) {
7193 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
7194 __clear_chan_timer(chan);
Johan Hedberge7cafc42014-07-17 15:35:38 +03007195 if (l2cap_chan_check_security(chan, true))
Johan Hedberg162b49e2014-01-17 20:45:10 +02007196 l2cap_state_change(chan, BT_CONNECTED);
7197 } else
7198 l2cap_do_start(chan);
7199 }
7200
7201 err = 0;
7202
7203done:
7204 l2cap_chan_unlock(chan);
7205 hci_dev_unlock(hdev);
7206 hci_dev_put(hdev);
7207 return err;
7208}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +03007209EXPORT_SYMBOL_GPL(l2cap_chan_connect);
Johan Hedberg162b49e2014-01-17 20:45:10 +02007210
Linus Torvalds1da177e2005-04-16 15:20:36 -07007211/* ---- L2CAP interface with lower layer (HCI) ---- */
7212
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007213int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007214{
7215 int exact = 0, lm1 = 0, lm2 = 0;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007216 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007217
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03007218 BT_DBG("hdev %s, bdaddr %pMR", hdev->name, bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007219
7220 /* Find listening sockets and check their link_mode */
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007221 read_lock(&chan_list_lock);
7222 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03007223 if (c->state != BT_LISTEN)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007224 continue;
7225
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007226 if (!bacmp(&c->src, &hdev->bdaddr)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007227 lm1 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03007228 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007229 lm1 |= HCI_LM_MASTER;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007230 exact++;
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007231 } else if (!bacmp(&c->src, BDADDR_ANY)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007232 lm2 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03007233 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007234 lm2 |= HCI_LM_MASTER;
7235 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007236 }
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007237 read_unlock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007238
7239 return exact ? lm1 : lm2;
7240}
7241
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03007242void l2cap_connect_cfm(struct hci_conn *hcon, u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007243{
Marcel Holtmann01394182006-07-03 10:02:46 +02007244 struct l2cap_conn *conn;
7245
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03007246 BT_DBG("hcon %p bdaddr %pMR status %d", hcon, &hcon->dst, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007247
Linus Torvalds1da177e2005-04-16 15:20:36 -07007248 if (!status) {
Claudio Takahasibaf43252013-04-11 13:55:50 -03007249 conn = l2cap_conn_add(hcon);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007250 if (conn)
7251 l2cap_conn_ready(conn);
Andrei Emeltchenkoba6fc312012-10-31 15:46:26 +02007252 } else {
Joe Perchese1750722011-06-29 18:18:29 -07007253 l2cap_conn_del(hcon, bt_to_errno(status));
Andrei Emeltchenkoba6fc312012-10-31 15:46:26 +02007254 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007255}
7256
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007257int l2cap_disconn_ind(struct hci_conn *hcon)
Marcel Holtmann2950f212009-02-12 14:02:50 +01007258{
7259 struct l2cap_conn *conn = hcon->l2cap_data;
7260
7261 BT_DBG("hcon %p", hcon);
7262
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007263 if (!conn)
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02007264 return HCI_ERROR_REMOTE_USER_TERM;
Marcel Holtmann2950f212009-02-12 14:02:50 +01007265 return conn->disc_reason;
7266}
7267
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03007268void l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007269{
7270 BT_DBG("hcon %p reason %d", hcon, reason);
7271
Joe Perchese1750722011-06-29 18:18:29 -07007272 l2cap_conn_del(hcon, bt_to_errno(reason));
Linus Torvalds1da177e2005-04-16 15:20:36 -07007273}
7274
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007275static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt)
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007276{
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03007277 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED)
Marcel Holtmann255c7602009-02-04 21:07:19 +01007278 return;
7279
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007280 if (encrypt == 0x00) {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007281 if (chan->sec_level == BT_SECURITY_MEDIUM) {
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007282 __set_chan_timer(chan, L2CAP_ENC_TIMEOUT);
Marcel Holtmann7d513e92014-01-15 22:37:40 -08007283 } else if (chan->sec_level == BT_SECURITY_HIGH ||
7284 chan->sec_level == BT_SECURITY_FIPS)
Gustavo F. Padovan0f852722011-05-04 19:42:50 -03007285 l2cap_chan_close(chan, ECONNREFUSED);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007286 } else {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007287 if (chan->sec_level == BT_SECURITY_MEDIUM)
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -03007288 __clear_chan_timer(chan);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007289 }
7290}
7291
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007292int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007293{
Marcel Holtmann40be4922008-07-14 20:13:50 +02007294 struct l2cap_conn *conn = hcon->l2cap_data;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03007295 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007296
Marcel Holtmann01394182006-07-03 10:02:46 +02007297 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007298 return 0;
Marcel Holtmann01394182006-07-03 10:02:46 +02007299
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03007300 BT_DBG("conn %p status 0x%2.2x encrypt %u", conn, status, encrypt);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007301
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03007302 if (hcon->type == LE_LINK) {
Hemant Gupta35d4adcc2012-04-18 14:46:26 +05307303 if (!status && encrypt)
Johan Hedberg4bd6d382014-02-26 23:33:45 +02007304 smp_distribute_keys(conn);
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02007305 cancel_delayed_work(&conn->security_timer);
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03007306 }
7307
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007308 mutex_lock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007309
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007310 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007311 l2cap_chan_lock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007312
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03007313 BT_DBG("chan %p scid 0x%4.4x state %s", chan, chan->scid,
7314 state_to_string(chan->state));
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007315
Johan Hedberg2338a7e2014-01-24 10:35:40 +02007316 if (chan->scid == L2CAP_CID_A2MP) {
Andrei Emeltchenko78eb2f92012-07-19 17:03:47 +03007317 l2cap_chan_unlock(chan);
7318 continue;
7319 }
7320
Johan Hedberg073d1cf2013-04-29 19:35:35 +03007321 if (chan->scid == L2CAP_CID_ATT) {
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007322 if (!status && encrypt) {
7323 chan->sec_level = hcon->sec_level;
Andrei Emeltchenkocf4cd002012-02-06 15:03:59 +02007324 l2cap_chan_ready(chan);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007325 }
7326
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007327 l2cap_chan_unlock(chan);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007328 continue;
7329 }
7330
Andrei Emeltchenko96eff462012-11-15 18:14:53 +02007331 if (!__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007332 l2cap_chan_unlock(chan);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01007333 continue;
7334 }
7335
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03007336 if (!status && (chan->state == BT_CONNECTED ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01007337 chan->state == BT_CONFIG)) {
Marcel Holtmannd97c8992013-10-14 02:53:54 -07007338 chan->ops->resume(chan);
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007339 l2cap_check_encryption(chan, encrypt);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007340 l2cap_chan_unlock(chan);
Marcel Holtmann9719f8a2008-07-14 20:13:45 +02007341 continue;
7342 }
7343
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03007344 if (chan->state == BT_CONNECT) {
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007345 if (!status)
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03007346 l2cap_start_connection(chan);
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007347 else
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007348 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03007349 } else if (chan->state == BT_CONNECT2) {
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007350 struct l2cap_conn_rsp rsp;
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007351 __u16 res, stat;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007352
7353 if (!status) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07007354 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007355 res = L2CAP_CR_PEND;
7356 stat = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08007357 chan->ops->defer(chan);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007358 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007359 l2cap_state_change(chan, BT_CONFIG);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007360 res = L2CAP_CR_SUCCESS;
7361 stat = L2CAP_CS_NO_INFO;
7362 }
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007363 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007364 l2cap_state_change(chan, BT_DISCONN);
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007365 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007366 res = L2CAP_CR_SEC_BLOCK;
7367 stat = L2CAP_CS_NO_INFO;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007368 }
7369
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03007370 rsp.scid = cpu_to_le16(chan->dcid);
7371 rsp.dcid = cpu_to_le16(chan->scid);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007372 rsp.result = cpu_to_le16(res);
7373 rsp.status = cpu_to_le16(stat);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03007374 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01007375 sizeof(rsp), &rsp);
Mat Martineau2d369352012-05-23 14:59:30 -07007376
7377 if (!test_bit(CONF_REQ_SENT, &chan->conf_state) &&
7378 res == L2CAP_CR_SUCCESS) {
7379 char buf[128];
7380 set_bit(CONF_REQ_SENT, &chan->conf_state);
7381 l2cap_send_cmd(conn, l2cap_get_ident(conn),
7382 L2CAP_CONF_REQ,
7383 l2cap_build_conf_req(chan, buf),
7384 buf);
7385 chan->num_conf_req++;
7386 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007387 }
7388
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007389 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007390 }
7391
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007392 mutex_unlock(&conn->chan_lock);
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007393
Linus Torvalds1da177e2005-04-16 15:20:36 -07007394 return 0;
7395}
7396
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007397int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007398{
7399 struct l2cap_conn *conn = hcon->l2cap_data;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007400 struct l2cap_hdr *hdr;
7401 int len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007402
Andrei Emeltchenko1d13a252012-10-15 11:58:41 +03007403 /* For AMP controller do not create l2cap conn */
7404 if (!conn && hcon->hdev->dev_type != HCI_BREDR)
7405 goto drop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007406
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007407 if (!conn)
Claudio Takahasibaf43252013-04-11 13:55:50 -03007408 conn = l2cap_conn_add(hcon);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007409
7410 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007411 goto drop;
7412
7413 BT_DBG("conn %p len %d flags 0x%x", conn, skb->len, flags);
7414
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007415 switch (flags) {
7416 case ACL_START:
7417 case ACL_START_NO_FLUSH:
7418 case ACL_COMPLETE:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007419 if (conn->rx_len) {
7420 BT_ERR("Unexpected start frame (len %d)", skb->len);
7421 kfree_skb(conn->rx_skb);
7422 conn->rx_skb = NULL;
7423 conn->rx_len = 0;
7424 l2cap_conn_unreliable(conn, ECOMM);
7425 }
7426
Andrei Emeltchenkoaae7fe22010-09-15 14:28:43 +03007427 /* Start fragment always begin with Basic L2CAP header */
7428 if (skb->len < L2CAP_HDR_SIZE) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07007429 BT_ERR("Frame is too short (len %d)", skb->len);
7430 l2cap_conn_unreliable(conn, ECOMM);
7431 goto drop;
7432 }
7433
7434 hdr = (struct l2cap_hdr *) skb->data;
7435 len = __le16_to_cpu(hdr->len) + L2CAP_HDR_SIZE;
7436
7437 if (len == skb->len) {
7438 /* Complete frame received */
7439 l2cap_recv_frame(conn, skb);
7440 return 0;
7441 }
7442
7443 BT_DBG("Start: total len %d, frag len %d", len, skb->len);
7444
7445 if (skb->len > len) {
7446 BT_ERR("Frame is too long (len %d, expected len %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007447 skb->len, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007448 l2cap_conn_unreliable(conn, ECOMM);
7449 goto drop;
7450 }
7451
7452 /* Allocate skb for the complete frame (with header) */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03007453 conn->rx_skb = bt_skb_alloc(len, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03007454 if (!conn->rx_skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007455 goto drop;
7456
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007457 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007458 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007459 conn->rx_len = len - skb->len;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007460 break;
7461
7462 case ACL_CONT:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007463 BT_DBG("Cont: frag len %d (expecting %d)", skb->len, conn->rx_len);
7464
7465 if (!conn->rx_len) {
7466 BT_ERR("Unexpected continuation frame (len %d)", skb->len);
7467 l2cap_conn_unreliable(conn, ECOMM);
7468 goto drop;
7469 }
7470
7471 if (skb->len > conn->rx_len) {
7472 BT_ERR("Fragment is too long (len %d, expected %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007473 skb->len, conn->rx_len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007474 kfree_skb(conn->rx_skb);
7475 conn->rx_skb = NULL;
7476 conn->rx_len = 0;
7477 l2cap_conn_unreliable(conn, ECOMM);
7478 goto drop;
7479 }
7480
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007481 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007482 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007483 conn->rx_len -= skb->len;
7484
7485 if (!conn->rx_len) {
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007486 /* Complete frame received. l2cap_recv_frame
7487 * takes ownership of the skb so set the global
7488 * rx_skb pointer to NULL first.
7489 */
7490 struct sk_buff *rx_skb = conn->rx_skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007491 conn->rx_skb = NULL;
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007492 l2cap_recv_frame(conn, rx_skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007493 }
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007494 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007495 }
7496
7497drop:
7498 kfree_skb(skb);
7499 return 0;
7500}
7501
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007502static int l2cap_debugfs_show(struct seq_file *f, void *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007503{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007504 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007505
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007506 read_lock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007507
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007508 list_for_each_entry(c, &chan_list, global_l) {
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03007509 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 -07007510 &c->src, &c->dst,
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03007511 c->state, __le16_to_cpu(c->psm),
7512 c->scid, c->dcid, c->imtu, c->omtu,
7513 c->sec_level, c->mode);
Andrei Emeltchenko61e1b4b2012-01-19 11:19:50 +02007514 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007515
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007516 read_unlock(&chan_list_lock);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007517
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007518 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007519}
7520
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007521static int l2cap_debugfs_open(struct inode *inode, struct file *file)
7522{
7523 return single_open(file, l2cap_debugfs_show, inode->i_private);
7524}
7525
7526static const struct file_operations l2cap_debugfs_fops = {
7527 .open = l2cap_debugfs_open,
7528 .read = seq_read,
7529 .llseek = seq_lseek,
7530 .release = single_release,
7531};
7532
7533static struct dentry *l2cap_debugfs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007534
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007535int __init l2cap_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007536{
7537 int err;
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007538
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007539 err = l2cap_init_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007540 if (err < 0)
7541 return err;
7542
Marcel Holtmann1120e4b2013-10-17 17:24:16 -07007543 if (IS_ERR_OR_NULL(bt_debugfs))
7544 return 0;
7545
7546 l2cap_debugfs = debugfs_create_file("l2cap", 0444, bt_debugfs,
7547 NULL, &l2cap_debugfs_fops);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007548
Samuel Ortiz40b93972014-05-14 17:53:35 +02007549 debugfs_create_u16("l2cap_le_max_credits", 0644, bt_debugfs,
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02007550 &le_max_credits);
Samuel Ortiz40b93972014-05-14 17:53:35 +02007551 debugfs_create_u16("l2cap_le_default_mps", 0644, bt_debugfs,
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02007552 &le_default_mps);
7553
Linus Torvalds1da177e2005-04-16 15:20:36 -07007554 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007555}
7556
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007557void l2cap_exit(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007558{
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007559 debugfs_remove(l2cap_debugfs);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007560 l2cap_cleanup_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007561}
7562
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03007563module_param(disable_ertm, bool, 0644);
7564MODULE_PARM_DESC(disable_ertm, "Disable enhanced retransmission mode");