blob: a6e276204ae969571c31774352e80b4fef7c1fff [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 Holtmannd40bffb2013-10-12 08:18:18 -070049static u8 l2cap_fixed_chan[8] = { L2CAP_FC_L2CAP | 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 */
Gustavo F. Padovand45fc422011-11-05 19:54:24 -0200778int l2cap_chan_check_security(struct l2cap_chan *chan)
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200779{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300780 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100781 __u8 auth_type;
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200782
Johan Hedberga17de2f2013-05-14 13:25:37 +0300783 if (conn->hcon->type == LE_LINK)
784 return smp_conn_security(conn->hcon, chan->sec_level);
785
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300786 auth_type = l2cap_get_auth_type(chan);
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100787
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300788 return hci_conn_security(conn->hcon, chan->sec_level, auth_type);
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200789}
790
Johannes Bergb5ad8b72011-06-01 08:54:45 +0200791static u8 l2cap_get_ident(struct l2cap_conn *conn)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200792{
793 u8 id;
794
795 /* Get next available identificator.
796 * 1 - 128 are used by kernel.
797 * 129 - 199 are reserved.
798 * 200 - 254 are used by utilities like l2ping, etc.
799 */
800
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200801 spin_lock(&conn->lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200802
803 if (++conn->tx_ident > 128)
804 conn->tx_ident = 1;
805
806 id = conn->tx_ident;
807
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200808 spin_unlock(&conn->lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200809
810 return id;
811}
812
Gustavo Padovan2d792812012-10-06 10:07:01 +0100813static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len,
814 void *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200815{
816 struct sk_buff *skb = l2cap_build_cmd(conn, code, ident, len, data);
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +0200817 u8 flags;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200818
819 BT_DBG("code 0x%2.2x", code);
820
821 if (!skb)
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -0300822 return;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200823
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +0200824 if (lmp_no_flush_capable(conn->hcon->hdev))
825 flags = ACL_START_NO_FLUSH;
826 else
827 flags = ACL_START;
828
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700829 bt_cb(skb)->force_active = BT_POWER_FORCE_ACTIVE_ON;
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +0200830 skb->priority = HCI_PRIO_MAX;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700831
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200832 hci_send_acl(conn->hchan, skb, flags);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200833}
834
Mat Martineau02b0fbb2012-10-23 15:24:10 -0700835static bool __chan_is_moving(struct l2cap_chan *chan)
836{
837 return chan->move_state != L2CAP_MOVE_STABLE &&
838 chan->move_state != L2CAP_MOVE_WAIT_PREPARE;
839}
840
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200841static void l2cap_do_send(struct l2cap_chan *chan, struct sk_buff *skb)
842{
843 struct hci_conn *hcon = chan->conn->hcon;
844 u16 flags;
845
846 BT_DBG("chan %p, skb %p len %d priority %u", chan, skb, skb->len,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100847 skb->priority);
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200848
Mat Martineaud5f8a752012-10-23 15:24:18 -0700849 if (chan->hs_hcon && !__chan_is_moving(chan)) {
850 if (chan->hs_hchan)
851 hci_send_acl(chan->hs_hchan, skb, ACL_COMPLETE);
852 else
853 kfree_skb(skb);
854
855 return;
856 }
857
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200858 if (!test_bit(FLAG_FLUSHABLE, &chan->flags) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100859 lmp_no_flush_capable(hcon->hdev))
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200860 flags = ACL_START_NO_FLUSH;
861 else
862 flags = ACL_START;
863
864 bt_cb(skb)->force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
865 hci_send_acl(chan->conn->hchan, skb, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700866}
867
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700868static void __unpack_enhanced_control(u16 enh, struct l2cap_ctrl *control)
869{
870 control->reqseq = (enh & L2CAP_CTRL_REQSEQ) >> L2CAP_CTRL_REQSEQ_SHIFT;
871 control->final = (enh & L2CAP_CTRL_FINAL) >> L2CAP_CTRL_FINAL_SHIFT;
872
873 if (enh & L2CAP_CTRL_FRAME_TYPE) {
874 /* S-Frame */
875 control->sframe = 1;
876 control->poll = (enh & L2CAP_CTRL_POLL) >> L2CAP_CTRL_POLL_SHIFT;
877 control->super = (enh & L2CAP_CTRL_SUPERVISE) >> L2CAP_CTRL_SUPER_SHIFT;
878
879 control->sar = 0;
880 control->txseq = 0;
881 } else {
882 /* I-Frame */
883 control->sframe = 0;
884 control->sar = (enh & L2CAP_CTRL_SAR) >> L2CAP_CTRL_SAR_SHIFT;
885 control->txseq = (enh & L2CAP_CTRL_TXSEQ) >> L2CAP_CTRL_TXSEQ_SHIFT;
886
887 control->poll = 0;
888 control->super = 0;
889 }
890}
891
892static void __unpack_extended_control(u32 ext, struct l2cap_ctrl *control)
893{
894 control->reqseq = (ext & L2CAP_EXT_CTRL_REQSEQ) >> L2CAP_EXT_CTRL_REQSEQ_SHIFT;
895 control->final = (ext & L2CAP_EXT_CTRL_FINAL) >> L2CAP_EXT_CTRL_FINAL_SHIFT;
896
897 if (ext & L2CAP_EXT_CTRL_FRAME_TYPE) {
898 /* S-Frame */
899 control->sframe = 1;
900 control->poll = (ext & L2CAP_EXT_CTRL_POLL) >> L2CAP_EXT_CTRL_POLL_SHIFT;
901 control->super = (ext & L2CAP_EXT_CTRL_SUPERVISE) >> L2CAP_EXT_CTRL_SUPER_SHIFT;
902
903 control->sar = 0;
904 control->txseq = 0;
905 } else {
906 /* I-Frame */
907 control->sframe = 0;
908 control->sar = (ext & L2CAP_EXT_CTRL_SAR) >> L2CAP_EXT_CTRL_SAR_SHIFT;
909 control->txseq = (ext & L2CAP_EXT_CTRL_TXSEQ) >> L2CAP_EXT_CTRL_TXSEQ_SHIFT;
910
911 control->poll = 0;
912 control->super = 0;
913 }
914}
915
916static inline void __unpack_control(struct l2cap_chan *chan,
917 struct sk_buff *skb)
918{
919 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
920 __unpack_extended_control(get_unaligned_le32(skb->data),
921 &bt_cb(skb)->control);
Mat Martineaucec8ab6e2012-05-17 20:53:36 -0700922 skb_pull(skb, L2CAP_EXT_CTRL_SIZE);
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700923 } else {
924 __unpack_enhanced_control(get_unaligned_le16(skb->data),
925 &bt_cb(skb)->control);
Mat Martineaucec8ab6e2012-05-17 20:53:36 -0700926 skb_pull(skb, L2CAP_ENH_CTRL_SIZE);
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700927 }
928}
929
930static u32 __pack_extended_control(struct l2cap_ctrl *control)
931{
932 u32 packed;
933
934 packed = control->reqseq << L2CAP_EXT_CTRL_REQSEQ_SHIFT;
935 packed |= control->final << L2CAP_EXT_CTRL_FINAL_SHIFT;
936
937 if (control->sframe) {
938 packed |= control->poll << L2CAP_EXT_CTRL_POLL_SHIFT;
939 packed |= control->super << L2CAP_EXT_CTRL_SUPER_SHIFT;
940 packed |= L2CAP_EXT_CTRL_FRAME_TYPE;
941 } else {
942 packed |= control->sar << L2CAP_EXT_CTRL_SAR_SHIFT;
943 packed |= control->txseq << L2CAP_EXT_CTRL_TXSEQ_SHIFT;
944 }
945
946 return packed;
947}
948
949static u16 __pack_enhanced_control(struct l2cap_ctrl *control)
950{
951 u16 packed;
952
953 packed = control->reqseq << L2CAP_CTRL_REQSEQ_SHIFT;
954 packed |= control->final << L2CAP_CTRL_FINAL_SHIFT;
955
956 if (control->sframe) {
957 packed |= control->poll << L2CAP_CTRL_POLL_SHIFT;
958 packed |= control->super << L2CAP_CTRL_SUPER_SHIFT;
959 packed |= L2CAP_CTRL_FRAME_TYPE;
960 } else {
961 packed |= control->sar << L2CAP_CTRL_SAR_SHIFT;
962 packed |= control->txseq << L2CAP_CTRL_TXSEQ_SHIFT;
963 }
964
965 return packed;
966}
967
968static inline void __pack_control(struct l2cap_chan *chan,
969 struct l2cap_ctrl *control,
970 struct sk_buff *skb)
971{
972 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
973 put_unaligned_le32(__pack_extended_control(control),
974 skb->data + L2CAP_HDR_SIZE);
975 } else {
976 put_unaligned_le16(__pack_enhanced_control(control),
977 skb->data + L2CAP_HDR_SIZE);
978 }
979}
980
Gustavo Padovanba7aa642012-05-29 13:29:16 -0300981static inline unsigned int __ertm_hdr_size(struct l2cap_chan *chan)
982{
983 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
984 return L2CAP_EXT_HDR_SIZE;
985 else
986 return L2CAP_ENH_HDR_SIZE;
987}
988
Mat Martineaua67d7f62012-05-17 20:53:35 -0700989static struct sk_buff *l2cap_create_sframe_pdu(struct l2cap_chan *chan,
990 u32 control)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300991{
992 struct sk_buff *skb;
993 struct l2cap_hdr *lh;
Gustavo Padovanba7aa642012-05-29 13:29:16 -0300994 int hlen = __ertm_hdr_size(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300995
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300996 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +0300997 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300998
Mat Martineaua67d7f62012-05-17 20:53:35 -0700999 skb = bt_skb_alloc(hlen, GFP_KERNEL);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001000
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001001 if (!skb)
Mat Martineaua67d7f62012-05-17 20:53:35 -07001002 return ERR_PTR(-ENOMEM);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001003
1004 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001005 lh->len = cpu_to_le16(hlen - L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001006 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03001007
Mat Martineaua67d7f62012-05-17 20:53:35 -07001008 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
1009 put_unaligned_le32(control, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
1010 else
1011 put_unaligned_le16(control, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001012
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001013 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineaua67d7f62012-05-17 20:53:35 -07001014 u16 fcs = crc16(0, (u8 *)skb->data, skb->len);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03001015 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001016 }
1017
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001018 skb->priority = HCI_PRIO_MAX;
Mat Martineaua67d7f62012-05-17 20:53:35 -07001019 return skb;
1020}
1021
1022static void l2cap_send_sframe(struct l2cap_chan *chan,
1023 struct l2cap_ctrl *control)
1024{
1025 struct sk_buff *skb;
1026 u32 control_field;
1027
1028 BT_DBG("chan %p, control %p", chan, control);
1029
1030 if (!control->sframe)
1031 return;
1032
Mat Martineaub99e13a2012-10-23 15:24:19 -07001033 if (__chan_is_moving(chan))
1034 return;
1035
Mat Martineaua67d7f62012-05-17 20:53:35 -07001036 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state) &&
1037 !control->poll)
1038 control->final = 1;
1039
1040 if (control->super == L2CAP_SUPER_RR)
1041 clear_bit(CONN_RNR_SENT, &chan->conn_state);
1042 else if (control->super == L2CAP_SUPER_RNR)
1043 set_bit(CONN_RNR_SENT, &chan->conn_state);
1044
1045 if (control->super != L2CAP_SUPER_SREJ) {
1046 chan->last_acked_seq = control->reqseq;
1047 __clear_ack_timer(chan);
1048 }
1049
1050 BT_DBG("reqseq %d, final %d, poll %d, super %d", control->reqseq,
1051 control->final, control->poll, control->super);
1052
1053 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
1054 control_field = __pack_extended_control(control);
1055 else
1056 control_field = __pack_enhanced_control(control);
1057
1058 skb = l2cap_create_sframe_pdu(chan, control_field);
1059 if (!IS_ERR(skb))
1060 l2cap_do_send(chan, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001061}
1062
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001063static void l2cap_send_rr_or_rnr(struct l2cap_chan *chan, bool poll)
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001064{
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001065 struct l2cap_ctrl control;
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001066
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001067 BT_DBG("chan %p, poll %d", chan, poll);
1068
1069 memset(&control, 0, sizeof(control));
1070 control.sframe = 1;
1071 control.poll = poll;
1072
1073 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
1074 control.super = L2CAP_SUPER_RNR;
1075 else
1076 control.super = L2CAP_SUPER_RR;
1077
1078 control.reqseq = chan->buffer_seq;
1079 l2cap_send_sframe(chan, &control);
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001080}
1081
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001082static inline int __l2cap_no_conn_pending(struct l2cap_chan *chan)
Andrei Emeltchenkoe501d052010-07-08 12:14:41 +03001083{
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001084 return !test_bit(CONF_CONNECT_PEND, &chan->conf_state);
Andrei Emeltchenkoe501d052010-07-08 12:14:41 +03001085}
1086
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001087static bool __amp_capable(struct l2cap_chan *chan)
1088{
1089 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann1df7b172013-10-05 11:47:49 -07001090 struct hci_dev *hdev;
1091 bool amp_available = false;
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001092
Marcel Holtmann1df7b172013-10-05 11:47:49 -07001093 if (!conn->hs_enabled)
1094 return false;
1095
1096 if (!(conn->fixed_chan_mask & L2CAP_FC_A2MP))
1097 return false;
1098
1099 read_lock(&hci_dev_list_lock);
1100 list_for_each_entry(hdev, &hci_dev_list, list) {
1101 if (hdev->amp_type != AMP_TYPE_BREDR &&
1102 test_bit(HCI_UP, &hdev->flags)) {
1103 amp_available = true;
1104 break;
1105 }
1106 }
1107 read_unlock(&hci_dev_list_lock);
1108
1109 if (chan->chan_policy == BT_CHANNEL_POLICY_AMP_PREFERRED)
1110 return amp_available;
Marcel Holtmann848566b2013-10-01 22:59:22 -07001111
1112 return false;
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001113}
1114
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02001115static bool l2cap_check_efs(struct l2cap_chan *chan)
1116{
1117 /* Check EFS parameters */
1118 return true;
1119}
1120
Andrei Emeltchenko2766be42012-09-27 17:26:21 +03001121void l2cap_send_conn_req(struct l2cap_chan *chan)
Andrei Emeltchenko9b27f352012-02-24 16:00:00 +02001122{
1123 struct l2cap_conn *conn = chan->conn;
1124 struct l2cap_conn_req req;
1125
1126 req.scid = cpu_to_le16(chan->scid);
1127 req.psm = chan->psm;
1128
1129 chan->ident = l2cap_get_ident(conn);
1130
1131 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
1132
1133 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_REQ, sizeof(req), &req);
1134}
1135
Mat Martineau8eb200b2012-10-23 15:24:17 -07001136static void l2cap_send_create_chan_req(struct l2cap_chan *chan, u8 amp_id)
1137{
1138 struct l2cap_create_chan_req req;
1139 req.scid = cpu_to_le16(chan->scid);
1140 req.psm = chan->psm;
1141 req.amp_id = amp_id;
1142
1143 chan->ident = l2cap_get_ident(chan->conn);
1144
1145 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_REQ,
1146 sizeof(req), &req);
1147}
1148
Mat Martineau02b0fbb2012-10-23 15:24:10 -07001149static void l2cap_move_setup(struct l2cap_chan *chan)
1150{
1151 struct sk_buff *skb;
1152
1153 BT_DBG("chan %p", chan);
1154
1155 if (chan->mode != L2CAP_MODE_ERTM)
1156 return;
1157
1158 __clear_retrans_timer(chan);
1159 __clear_monitor_timer(chan);
1160 __clear_ack_timer(chan);
1161
1162 chan->retry_count = 0;
1163 skb_queue_walk(&chan->tx_q, skb) {
1164 if (bt_cb(skb)->control.retries)
1165 bt_cb(skb)->control.retries = 1;
1166 else
1167 break;
1168 }
1169
1170 chan->expected_tx_seq = chan->buffer_seq;
1171
1172 clear_bit(CONN_REJ_ACT, &chan->conn_state);
1173 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
1174 l2cap_seq_list_clear(&chan->retrans_list);
1175 l2cap_seq_list_clear(&chan->srej_list);
1176 skb_queue_purge(&chan->srej_q);
1177
1178 chan->tx_state = L2CAP_TX_STATE_XMIT;
1179 chan->rx_state = L2CAP_RX_STATE_MOVE;
1180
1181 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
1182}
1183
Mat Martineau5f3847a2012-10-23 15:24:12 -07001184static void l2cap_move_done(struct l2cap_chan *chan)
1185{
1186 u8 move_role = chan->move_role;
1187 BT_DBG("chan %p", chan);
1188
1189 chan->move_state = L2CAP_MOVE_STABLE;
1190 chan->move_role = L2CAP_MOVE_ROLE_NONE;
1191
1192 if (chan->mode != L2CAP_MODE_ERTM)
1193 return;
1194
1195 switch (move_role) {
1196 case L2CAP_MOVE_ROLE_INITIATOR:
1197 l2cap_tx(chan, NULL, NULL, L2CAP_EV_EXPLICIT_POLL);
1198 chan->rx_state = L2CAP_RX_STATE_WAIT_F;
1199 break;
1200 case L2CAP_MOVE_ROLE_RESPONDER:
1201 chan->rx_state = L2CAP_RX_STATE_WAIT_P;
1202 break;
1203 }
1204}
1205
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001206static void l2cap_chan_ready(struct l2cap_chan *chan)
1207{
Mat Martineau28270112012-05-17 21:14:09 -07001208 /* This clears all conf flags, including CONF_NOT_COMPLETE */
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001209 chan->conf_state = 0;
1210 __clear_chan_timer(chan);
1211
Johan Hedberg0ce43ce2013-12-05 14:55:33 +02001212 if (chan->mode == L2CAP_MODE_LE_FLOWCTL && !chan->tx_credits)
1213 chan->ops->suspend(chan);
Johan Hedberg177f8f22013-05-31 17:54:51 +03001214
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001215 chan->state = BT_CONNECTED;
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001216
Andrei Emeltchenkofd83e2c2012-05-30 09:55:32 +03001217 chan->ops->ready(chan);
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001218}
1219
Johan Hedbergf1496de2013-05-13 14:15:56 +03001220static void l2cap_le_connect(struct l2cap_chan *chan)
1221{
1222 struct l2cap_conn *conn = chan->conn;
1223 struct l2cap_le_conn_req req;
1224
Johan Hedberg595177f2013-12-02 22:12:22 +02001225 if (test_and_set_bit(FLAG_LE_CONN_REQ_SENT, &chan->flags))
1226 return;
1227
Johan Hedbergf1496de2013-05-13 14:15:56 +03001228 req.psm = chan->psm;
1229 req.scid = cpu_to_le16(chan->scid);
1230 req.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02001231 req.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03001232 req.credits = cpu_to_le16(chan->rx_credits);
Johan Hedbergf1496de2013-05-13 14:15:56 +03001233
1234 chan->ident = l2cap_get_ident(conn);
1235
1236 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_REQ,
1237 sizeof(req), &req);
1238}
1239
1240static void l2cap_le_start(struct l2cap_chan *chan)
1241{
1242 struct l2cap_conn *conn = chan->conn;
1243
1244 if (!smp_conn_security(conn->hcon, chan->sec_level))
1245 return;
1246
1247 if (!chan->psm) {
1248 l2cap_chan_ready(chan);
1249 return;
1250 }
1251
1252 if (chan->state == BT_CONNECT)
1253 l2cap_le_connect(chan);
1254}
1255
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001256static void l2cap_start_connection(struct l2cap_chan *chan)
1257{
1258 if (__amp_capable(chan)) {
1259 BT_DBG("chan %p AMP capable: discover AMPs", chan);
1260 a2mp_discover_amp(chan);
Johan Hedbergf1496de2013-05-13 14:15:56 +03001261 } else if (chan->conn->hcon->type == LE_LINK) {
1262 l2cap_le_start(chan);
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001263 } else {
1264 l2cap_send_conn_req(chan);
1265 }
1266}
1267
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001268static void l2cap_do_start(struct l2cap_chan *chan)
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001269{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03001270 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001271
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001272 if (conn->hcon->type == LE_LINK) {
Johan Hedberg96ac34f2013-05-13 11:15:07 +03001273 l2cap_le_start(chan);
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001274 return;
1275 }
1276
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001277 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) {
Marcel Holtmann984947d2009-02-06 23:35:19 +01001278 if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE))
1279 return;
1280
Gustavo F. Padovand45fc422011-11-05 19:54:24 -02001281 if (l2cap_chan_check_security(chan) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01001282 __l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001283 l2cap_start_connection(chan);
1284 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001285 } else {
1286 struct l2cap_info_req req;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001287 req.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001288
1289 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
1290 conn->info_ident = l2cap_get_ident(conn);
1291
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08001292 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001293
Gustavo Padovan2d792812012-10-06 10:07:01 +01001294 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
1295 sizeof(req), &req);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001296 }
1297}
1298
Gustavo F. Padovancf6c2c02010-06-07 20:54:45 -03001299static inline int l2cap_mode_supported(__u8 mode, __u32 feat_mask)
1300{
1301 u32 local_feat_mask = l2cap_feat_mask;
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03001302 if (!disable_ertm)
Gustavo F. Padovancf6c2c02010-06-07 20:54:45 -03001303 local_feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING;
1304
1305 switch (mode) {
1306 case L2CAP_MODE_ERTM:
1307 return L2CAP_FEAT_ERTM & feat_mask & local_feat_mask;
1308 case L2CAP_MODE_STREAMING:
1309 return L2CAP_FEAT_STREAMING & feat_mask & local_feat_mask;
1310 default:
1311 return 0x00;
1312 }
1313}
1314
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001315static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err)
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001316{
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001317 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001318 struct l2cap_disconn_req req;
1319
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001320 if (!conn)
1321 return;
1322
Andrei Emeltchenkoaad3d0e2012-09-06 15:05:42 +03001323 if (chan->mode == L2CAP_MODE_ERTM && chan->state == BT_CONNECTED) {
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03001324 __clear_retrans_timer(chan);
1325 __clear_monitor_timer(chan);
1326 __clear_ack_timer(chan);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001327 }
1328
Johan Hedberg2338a7e2014-01-24 10:35:40 +02001329 if (chan->scid == L2CAP_CID_A2MP) {
Gustavo Padovand1177732012-10-06 11:47:38 +01001330 l2cap_state_change(chan, BT_DISCONN);
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001331 return;
1332 }
1333
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001334 req.dcid = cpu_to_le16(chan->dcid);
1335 req.scid = cpu_to_le16(chan->scid);
Gustavo Padovan2d792812012-10-06 10:07:01 +01001336 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_DISCONN_REQ,
1337 sizeof(req), &req);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001338
Gustavo Padovanf8e73012013-10-15 19:24:46 -03001339 l2cap_state_change_and_error(chan, BT_DISCONN, err);
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001340}
1341
Linus Torvalds1da177e2005-04-16 15:20:36 -07001342/* ---- L2CAP connections ---- */
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001343static void l2cap_conn_start(struct l2cap_conn *conn)
1344{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001345 struct l2cap_chan *chan, *tmp;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001346
1347 BT_DBG("conn %p", conn);
1348
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001349 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001350
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001351 list_for_each_entry_safe(chan, tmp, &conn->chan_l, list) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001352 l2cap_chan_lock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001353
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001354 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001355 l2cap_chan_unlock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001356 continue;
1357 }
1358
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001359 if (chan->state == BT_CONNECT) {
Gustavo F. Padovand45fc422011-11-05 19:54:24 -02001360 if (!l2cap_chan_check_security(chan) ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01001361 !__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001362 l2cap_chan_unlock(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001363 continue;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02001364 }
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001365
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001366 if (!l2cap_mode_supported(chan->mode, conn->feat_mask)
Gustavo Padovan2d792812012-10-06 10:07:01 +01001367 && test_bit(CONF_STATE2_DEVICE,
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001368 &chan->conf_state)) {
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001369 l2cap_chan_close(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001370 l2cap_chan_unlock(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001371 continue;
1372 }
1373
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001374 l2cap_start_connection(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001375
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001376 } else if (chan->state == BT_CONNECT2) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001377 struct l2cap_conn_rsp rsp;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001378 char buf[128];
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001379 rsp.scid = cpu_to_le16(chan->dcid);
1380 rsp.dcid = cpu_to_le16(chan->scid);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001381
Gustavo F. Padovand45fc422011-11-05 19:54:24 -02001382 if (l2cap_chan_check_security(chan)) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07001383 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001384 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
1385 rsp.status = cpu_to_le16(L2CAP_CS_AUTHOR_PEND);
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001386 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001387
1388 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001389 l2cap_state_change(chan, BT_CONFIG);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001390 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
1391 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001392 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001393 } else {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001394 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
1395 rsp.status = cpu_to_le16(L2CAP_CS_AUTHEN_PEND);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001396 }
1397
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001398 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001399 sizeof(rsp), &rsp);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001400
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001401 if (test_bit(CONF_REQ_SENT, &chan->conf_state) ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01001402 rsp.result != L2CAP_CR_SUCCESS) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001403 l2cap_chan_unlock(chan);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001404 continue;
1405 }
1406
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001407 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001408 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001409 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03001410 chan->num_conf_req++;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001411 }
1412
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001413 l2cap_chan_unlock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001414 }
1415
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001416 mutex_unlock(&conn->chan_lock);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001417}
1418
Ido Yarivc2287682012-04-20 15:46:07 -03001419/* Find socket with cid and source/destination bdaddr.
Ville Tervob62f3282011-02-10 22:38:50 -03001420 * Returns closest match, locked.
1421 */
Andrei Emeltchenkod9b88702012-03-12 12:13:08 +02001422static struct l2cap_chan *l2cap_global_chan_by_scid(int state, u16 cid,
Ido Yarivc2287682012-04-20 15:46:07 -03001423 bdaddr_t *src,
1424 bdaddr_t *dst)
Ville Tervob62f3282011-02-10 22:38:50 -03001425{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001426 struct l2cap_chan *c, *c1 = NULL;
Ville Tervob62f3282011-02-10 22:38:50 -03001427
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001428 read_lock(&chan_list_lock);
Ville Tervob62f3282011-02-10 22:38:50 -03001429
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001430 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001431 if (state && c->state != state)
Ville Tervob62f3282011-02-10 22:38:50 -03001432 continue;
1433
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001434 if (c->scid == cid) {
Ido Yarivc2287682012-04-20 15:46:07 -03001435 int src_match, dst_match;
1436 int src_any, dst_any;
1437
Ville Tervob62f3282011-02-10 22:38:50 -03001438 /* Exact match. */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001439 src_match = !bacmp(&c->src, src);
1440 dst_match = !bacmp(&c->dst, dst);
Ido Yarivc2287682012-04-20 15:46:07 -03001441 if (src_match && dst_match) {
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001442 read_unlock(&chan_list_lock);
1443 return c;
1444 }
Ville Tervob62f3282011-02-10 22:38:50 -03001445
1446 /* Closest match */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001447 src_any = !bacmp(&c->src, BDADDR_ANY);
1448 dst_any = !bacmp(&c->dst, BDADDR_ANY);
Ido Yarivc2287682012-04-20 15:46:07 -03001449 if ((src_match && dst_any) || (src_any && dst_match) ||
1450 (src_any && dst_any))
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001451 c1 = c;
Ville Tervob62f3282011-02-10 22:38:50 -03001452 }
1453 }
Gustavo F. Padovan280f2942011-04-13 19:01:22 -03001454
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001455 read_unlock(&chan_list_lock);
Ville Tervob62f3282011-02-10 22:38:50 -03001456
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001457 return c1;
Ville Tervob62f3282011-02-10 22:38:50 -03001458}
1459
1460static void l2cap_le_conn_ready(struct l2cap_conn *conn)
1461{
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001462 struct hci_conn *hcon = conn->hcon;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001463 struct l2cap_chan *chan, *pchan;
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001464 u8 dst_type;
Ville Tervob62f3282011-02-10 22:38:50 -03001465
1466 BT_DBG("");
1467
1468 /* Check if we have socket listening on cid */
Johan Hedberg073d1cf2013-04-29 19:35:35 +03001469 pchan = l2cap_global_chan_by_scid(BT_LISTEN, L2CAP_CID_ATT,
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001470 &hcon->src, &hcon->dst);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001471 if (!pchan)
Ville Tervob62f3282011-02-10 22:38:50 -03001472 return;
1473
Johan Hedberg44f3b0f2013-04-29 19:35:45 +03001474 /* Client ATT sockets should override the server one */
1475 if (__l2cap_get_chan_by_dcid(conn, L2CAP_CID_ATT))
1476 return;
1477
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001478 dst_type = bdaddr_type(hcon, hcon->dst_type);
1479
1480 /* If device is blocked, do not create a channel for it */
1481 if (hci_blacklist_lookup(hcon->hdev, &hcon->dst, dst_type))
1482 return;
1483
Marcel Holtmann80afeb62014-06-23 12:18:51 +02001484 /* For LE slave connections, make sure the connection interval
1485 * is in the range of the minium and maximum interval that has
1486 * been configured for this connection. If not, then trigger
1487 * the connection update procedure.
1488 */
Johan Hedberg4dae2792014-06-24 17:03:50 +03001489 if (!test_bit(HCI_CONN_MASTER, &hcon->flags) &&
Marcel Holtmann80afeb62014-06-23 12:18:51 +02001490 (hcon->le_conn_interval < hcon->le_conn_min_interval ||
1491 hcon->le_conn_interval > hcon->le_conn_max_interval)) {
1492 struct l2cap_conn_param_update_req req;
1493
1494 req.min = cpu_to_le16(hcon->le_conn_min_interval);
1495 req.max = cpu_to_le16(hcon->le_conn_max_interval);
1496 req.latency = cpu_to_le16(hcon->le_conn_latency);
1497 req.to_multiplier = cpu_to_le16(hcon->le_supv_timeout);
1498
1499 l2cap_send_cmd(conn, l2cap_get_ident(conn),
1500 L2CAP_CONN_PARAM_UPDATE_REQ, sizeof(req), &req);
1501 }
1502
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001503 l2cap_chan_lock(pchan);
Gustavo F. Padovan62f3a2c2011-04-14 18:34:34 -03001504
Gustavo Padovan80b98022012-05-27 22:27:51 -03001505 chan = pchan->ops->new_connection(pchan);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001506 if (!chan)
Ville Tervob62f3282011-02-10 22:38:50 -03001507 goto clean;
1508
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001509 bacpy(&chan->src, &hcon->src);
1510 bacpy(&chan->dst, &hcon->dst);
1511 chan->src_type = bdaddr_type(hcon, hcon->src_type);
1512 chan->dst_type = dst_type;
Ville Tervob62f3282011-02-10 22:38:50 -03001513
Johan Hedberg44f3b0f2013-04-29 19:35:45 +03001514 __l2cap_chan_add(conn, chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001515
Ville Tervob62f3282011-02-10 22:38:50 -03001516clean:
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001517 l2cap_chan_unlock(pchan);
Ville Tervob62f3282011-02-10 22:38:50 -03001518}
1519
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001520static void l2cap_conn_ready(struct l2cap_conn *conn)
1521{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001522 struct l2cap_chan *chan;
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001523 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001524
1525 BT_DBG("conn %p", conn);
1526
Johan Hedbergd8729922013-04-29 19:35:39 +03001527 /* For outgoing pairing which doesn't necessarily have an
1528 * associated socket (e.g. mgmt_pair_device).
1529 */
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001530 if (hcon->out && hcon->type == LE_LINK)
1531 smp_conn_security(hcon, hcon->pending_sec_level);
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03001532
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001533 mutex_lock(&conn->chan_lock);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001534
Johan Hedberg44f3b0f2013-04-29 19:35:45 +03001535 if (hcon->type == LE_LINK)
1536 l2cap_le_conn_ready(conn);
1537
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001538 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03001539
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001540 l2cap_chan_lock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001541
Johan Hedberg2338a7e2014-01-24 10:35:40 +02001542 if (chan->scid == L2CAP_CID_A2MP) {
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001543 l2cap_chan_unlock(chan);
1544 continue;
1545 }
1546
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001547 if (hcon->type == LE_LINK) {
Johan Hedbergf1496de2013-05-13 14:15:56 +03001548 l2cap_le_start(chan);
Vinicius Costa Gomes63128452011-06-17 22:46:26 -03001549 } else if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Gustavo Padovan74e75742013-10-15 19:24:51 -03001550 l2cap_chan_ready(chan);
Anderson Brigliab501d6a2011-06-07 18:46:31 -03001551
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001552 } else if (chan->state == BT_CONNECT) {
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001553 l2cap_do_start(chan);
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001554 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001555
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001556 l2cap_chan_unlock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001557 }
1558
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001559 mutex_unlock(&conn->chan_lock);
Johan Hedberg61a939c2014-01-17 20:45:11 +02001560
1561 queue_work(hcon->hdev->workqueue, &conn->pending_rx_work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001562}
1563
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001564/* Notify sockets that we cannot guaranty reliability anymore */
1565static void l2cap_conn_unreliable(struct l2cap_conn *conn, int err)
1566{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001567 struct l2cap_chan *chan;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001568
1569 BT_DBG("conn %p", conn);
1570
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001571 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001572
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001573 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +03001574 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo Padovan1d8b1fd2012-10-06 11:34:52 +01001575 l2cap_chan_set_err(chan, err);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001576 }
1577
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001578 mutex_unlock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001579}
1580
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001581static void l2cap_info_timeout(struct work_struct *work)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001582{
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001583 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001584 info_timer.work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001585
Marcel Holtmann984947d2009-02-06 23:35:19 +01001586 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01001587 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01001588
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001589 l2cap_conn_start(conn);
1590}
1591
David Herrmann2c8e1412013-04-06 20:28:45 +02001592/*
1593 * l2cap_user
1594 * External modules can register l2cap_user objects on l2cap_conn. The ->probe
1595 * callback is called during registration. The ->remove callback is called
1596 * during unregistration.
1597 * An l2cap_user object can either be explicitly unregistered or when the
1598 * underlying l2cap_conn object is deleted. This guarantees that l2cap->hcon,
1599 * l2cap->hchan, .. are valid as long as the remove callback hasn't been called.
1600 * External modules must own a reference to the l2cap_conn object if they intend
1601 * to call l2cap_unregister_user(). The l2cap_conn object might get destroyed at
1602 * any time if they don't.
1603 */
1604
1605int l2cap_register_user(struct l2cap_conn *conn, struct l2cap_user *user)
1606{
1607 struct hci_dev *hdev = conn->hcon->hdev;
1608 int ret;
1609
1610 /* We need to check whether l2cap_conn is registered. If it is not, we
1611 * must not register the l2cap_user. l2cap_conn_del() is unregisters
1612 * l2cap_conn objects, but doesn't provide its own locking. Instead, it
1613 * relies on the parent hci_conn object to be locked. This itself relies
1614 * on the hci_dev object to be locked. So we must lock the hci device
1615 * here, too. */
1616
1617 hci_dev_lock(hdev);
1618
1619 if (user->list.next || user->list.prev) {
1620 ret = -EINVAL;
1621 goto out_unlock;
1622 }
1623
1624 /* conn->hchan is NULL after l2cap_conn_del() was called */
1625 if (!conn->hchan) {
1626 ret = -ENODEV;
1627 goto out_unlock;
1628 }
1629
1630 ret = user->probe(conn, user);
1631 if (ret)
1632 goto out_unlock;
1633
1634 list_add(&user->list, &conn->users);
1635 ret = 0;
1636
1637out_unlock:
1638 hci_dev_unlock(hdev);
1639 return ret;
1640}
1641EXPORT_SYMBOL(l2cap_register_user);
1642
1643void l2cap_unregister_user(struct l2cap_conn *conn, struct l2cap_user *user)
1644{
1645 struct hci_dev *hdev = conn->hcon->hdev;
1646
1647 hci_dev_lock(hdev);
1648
1649 if (!user->list.next || !user->list.prev)
1650 goto out_unlock;
1651
1652 list_del(&user->list);
1653 user->list.next = NULL;
1654 user->list.prev = NULL;
1655 user->remove(conn, user);
1656
1657out_unlock:
1658 hci_dev_unlock(hdev);
1659}
1660EXPORT_SYMBOL(l2cap_unregister_user);
1661
1662static void l2cap_unregister_all_users(struct l2cap_conn *conn)
1663{
1664 struct l2cap_user *user;
1665
1666 while (!list_empty(&conn->users)) {
1667 user = list_first_entry(&conn->users, struct l2cap_user, list);
1668 list_del(&user->list);
1669 user->list.next = NULL;
1670 user->list.prev = NULL;
1671 user->remove(conn, user);
1672 }
1673}
1674
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001675static void l2cap_conn_del(struct hci_conn *hcon, int err)
1676{
1677 struct l2cap_conn *conn = hcon->l2cap_data;
1678 struct l2cap_chan *chan, *l;
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001679
1680 if (!conn)
1681 return;
1682
1683 BT_DBG("hcon %p conn %p, err %d", hcon, conn, err);
1684
1685 kfree_skb(conn->rx_skb);
1686
Johan Hedberg61a939c2014-01-17 20:45:11 +02001687 skb_queue_purge(&conn->pending_rx);
Jukka Taimisto7ab56c32014-06-12 10:15:13 +00001688
1689 /* We can not call flush_work(&conn->pending_rx_work) here since we
1690 * might block if we are running on a worker from the same workqueue
1691 * pending_rx_work is waiting on.
1692 */
1693 if (work_pending(&conn->pending_rx_work))
1694 cancel_work_sync(&conn->pending_rx_work);
Johan Hedberg61a939c2014-01-17 20:45:11 +02001695
David Herrmann2c8e1412013-04-06 20:28:45 +02001696 l2cap_unregister_all_users(conn);
1697
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001698 mutex_lock(&conn->chan_lock);
1699
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001700 /* Kill channels */
1701 list_for_each_entry_safe(chan, l, &conn->chan_l, list) {
Mat Martineau61d6ef32012-04-27 16:50:50 -07001702 l2cap_chan_hold(chan);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001703 l2cap_chan_lock(chan);
1704
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001705 l2cap_chan_del(chan, err);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001706
1707 l2cap_chan_unlock(chan);
1708
Gustavo Padovan80b98022012-05-27 22:27:51 -03001709 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07001710 l2cap_chan_put(chan);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001711 }
1712
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001713 mutex_unlock(&conn->chan_lock);
1714
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001715 hci_chan_del(conn->hchan);
1716
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001717 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT)
Ulisses Furquim127074b2012-01-30 18:26:29 -02001718 cancel_delayed_work_sync(&conn->info_timer);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001719
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001720 if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags)) {
Ulisses Furquim127074b2012-01-30 18:26:29 -02001721 cancel_delayed_work_sync(&conn->security_timer);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001722 smp_chan_destroy(conn);
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001723 }
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001724
1725 hcon->l2cap_data = NULL;
David Herrmann9c903e32013-04-06 20:28:44 +02001726 conn->hchan = NULL;
1727 l2cap_conn_put(conn);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001728}
1729
Gustavo F. Padovan6c9d42a2011-12-20 10:57:27 -02001730static void security_timeout(struct work_struct *work)
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001731{
Gustavo F. Padovan6c9d42a2011-12-20 10:57:27 -02001732 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001733 security_timer.work);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001734
Johan Hedbergd06cc412012-06-06 18:44:11 +08001735 BT_DBG("conn %p", conn);
1736
1737 if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags)) {
1738 smp_chan_destroy(conn);
1739 l2cap_conn_del(conn->hcon, ETIMEDOUT);
1740 }
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001741}
1742
David Herrmann9c903e32013-04-06 20:28:44 +02001743static void l2cap_conn_free(struct kref *ref)
1744{
1745 struct l2cap_conn *conn = container_of(ref, struct l2cap_conn, ref);
1746
1747 hci_conn_put(conn->hcon);
1748 kfree(conn);
1749}
1750
1751void l2cap_conn_get(struct l2cap_conn *conn)
1752{
1753 kref_get(&conn->ref);
1754}
1755EXPORT_SYMBOL(l2cap_conn_get);
1756
1757void l2cap_conn_put(struct l2cap_conn *conn)
1758{
1759 kref_put(&conn->ref, l2cap_conn_free);
1760}
1761EXPORT_SYMBOL(l2cap_conn_put);
1762
Linus Torvalds1da177e2005-04-16 15:20:36 -07001763/* ---- Socket interface ---- */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001764
Ido Yarivc2287682012-04-20 15:46:07 -03001765/* Find socket with psm and source / destination bdaddr.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001766 * Returns closest match.
1767 */
Ido Yarivc2287682012-04-20 15:46:07 -03001768static struct l2cap_chan *l2cap_global_chan_by_psm(int state, __le16 psm,
1769 bdaddr_t *src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001770 bdaddr_t *dst,
1771 u8 link_type)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001772{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001773 struct l2cap_chan *c, *c1 = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001774
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001775 read_lock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001776
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001777 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001778 if (state && c->state != state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001779 continue;
1780
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001781 if (link_type == ACL_LINK && c->src_type != BDADDR_BREDR)
1782 continue;
1783
1784 if (link_type == LE_LINK && c->src_type == BDADDR_BREDR)
1785 continue;
1786
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001787 if (c->psm == psm) {
Ido Yarivc2287682012-04-20 15:46:07 -03001788 int src_match, dst_match;
1789 int src_any, dst_any;
1790
Linus Torvalds1da177e2005-04-16 15:20:36 -07001791 /* Exact match. */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001792 src_match = !bacmp(&c->src, src);
1793 dst_match = !bacmp(&c->dst, dst);
Ido Yarivc2287682012-04-20 15:46:07 -03001794 if (src_match && dst_match) {
Johannes Berga7567b22011-06-01 08:29:54 +02001795 read_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001796 return c;
1797 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001798
1799 /* Closest match */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001800 src_any = !bacmp(&c->src, BDADDR_ANY);
1801 dst_any = !bacmp(&c->dst, BDADDR_ANY);
Ido Yarivc2287682012-04-20 15:46:07 -03001802 if ((src_match && dst_any) || (src_any && dst_match) ||
1803 (src_any && dst_any))
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001804 c1 = c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001805 }
1806 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001807
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001808 read_unlock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001809
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001810 return c1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001811}
1812
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001813static void l2cap_monitor_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001814{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001815 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001816 monitor_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001817
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03001818 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001819
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001820 l2cap_chan_lock(chan);
1821
Mat Martineau80909e02012-05-17 20:53:50 -07001822 if (!chan->conn) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001823 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001824 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001825 return;
1826 }
1827
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001828 l2cap_tx(chan, NULL, NULL, L2CAP_EV_MONITOR_TO);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001829
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001830 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001831 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001832}
1833
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001834static void l2cap_retrans_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001835{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001836 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001837 retrans_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001838
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03001839 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001840
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001841 l2cap_chan_lock(chan);
1842
Mat Martineau80909e02012-05-17 20:53:50 -07001843 if (!chan->conn) {
1844 l2cap_chan_unlock(chan);
1845 l2cap_chan_put(chan);
1846 return;
1847 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001848
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001849 l2cap_tx(chan, NULL, NULL, L2CAP_EV_RETRANS_TO);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001850 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001851 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001852}
1853
Gustavo Padovand6603662012-05-21 13:58:22 -03001854static void l2cap_streaming_send(struct l2cap_chan *chan,
1855 struct sk_buff_head *skbs)
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001856{
Gustavo F. Padovanccbb84a2010-08-30 18:44:44 -03001857 struct sk_buff *skb;
Mat Martineau37339372012-05-17 20:53:33 -07001858 struct l2cap_ctrl *control;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001859
Mat Martineau37339372012-05-17 20:53:33 -07001860 BT_DBG("chan %p, skbs %p", chan, skbs);
1861
Mat Martineaub99e13a2012-10-23 15:24:19 -07001862 if (__chan_is_moving(chan))
1863 return;
1864
Mat Martineau37339372012-05-17 20:53:33 -07001865 skb_queue_splice_tail_init(skbs, &chan->tx_q);
1866
1867 while (!skb_queue_empty(&chan->tx_q)) {
1868
1869 skb = skb_dequeue(&chan->tx_q);
1870
1871 bt_cb(skb)->control.retries = 1;
1872 control = &bt_cb(skb)->control;
1873
1874 control->reqseq = 0;
1875 control->txseq = chan->next_tx_seq;
1876
1877 __pack_control(chan, control, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001878
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001879 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau37339372012-05-17 20:53:33 -07001880 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1881 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001882 }
1883
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001884 l2cap_do_send(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001885
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001886 BT_DBG("Sent txseq %u", control->txseq);
Mat Martineau37339372012-05-17 20:53:33 -07001887
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001888 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau37339372012-05-17 20:53:33 -07001889 chan->frames_sent++;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001890 }
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001891}
1892
Szymon Janc67c9e842011-07-28 16:24:33 +02001893static int l2cap_ertm_send(struct l2cap_chan *chan)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001894{
1895 struct sk_buff *skb, *tx_skb;
Mat Martineau18a48e72012-05-17 20:53:34 -07001896 struct l2cap_ctrl *control;
1897 int sent = 0;
1898
1899 BT_DBG("chan %p", chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001900
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001901 if (chan->state != BT_CONNECTED)
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001902 return -ENOTCONN;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001903
Mat Martineau94122bb2012-05-02 09:42:02 -07001904 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1905 return 0;
1906
Mat Martineaub99e13a2012-10-23 15:24:19 -07001907 if (__chan_is_moving(chan))
1908 return 0;
1909
Mat Martineau18a48e72012-05-17 20:53:34 -07001910 while (chan->tx_send_head &&
1911 chan->unacked_frames < chan->remote_tx_win &&
1912 chan->tx_state == L2CAP_TX_STATE_XMIT) {
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001913
Mat Martineau18a48e72012-05-17 20:53:34 -07001914 skb = chan->tx_send_head;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001915
Mat Martineau18a48e72012-05-17 20:53:34 -07001916 bt_cb(skb)->control.retries = 1;
1917 control = &bt_cb(skb)->control;
Gustavo F. Padovan95ffa972010-06-18 20:37:33 -03001918
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001919 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
Mat Martineau18a48e72012-05-17 20:53:34 -07001920 control->final = 1;
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001921
Mat Martineau18a48e72012-05-17 20:53:34 -07001922 control->reqseq = chan->buffer_seq;
1923 chan->last_acked_seq = chan->buffer_seq;
1924 control->txseq = chan->next_tx_seq;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001925
Mat Martineau18a48e72012-05-17 20:53:34 -07001926 __pack_control(chan, control, skb);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001927
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001928 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau18a48e72012-05-17 20:53:34 -07001929 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1930 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001931 }
1932
Mat Martineau18a48e72012-05-17 20:53:34 -07001933 /* Clone after data has been modified. Data is assumed to be
1934 read-only (for locking purposes) on cloned sk_buffs.
1935 */
1936 tx_skb = skb_clone(skb, GFP_KERNEL);
1937
1938 if (!tx_skb)
1939 break;
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -03001940
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03001941 __set_retrans_timer(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001942
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001943 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau18a48e72012-05-17 20:53:34 -07001944 chan->unacked_frames++;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03001945 chan->frames_sent++;
Mat Martineau18a48e72012-05-17 20:53:34 -07001946 sent++;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001947
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001948 if (skb_queue_is_last(&chan->tx_q, skb))
1949 chan->tx_send_head = NULL;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001950 else
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001951 chan->tx_send_head = skb_queue_next(&chan->tx_q, skb);
Mat Martineau18a48e72012-05-17 20:53:34 -07001952
1953 l2cap_do_send(chan, tx_skb);
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001954 BT_DBG("Sent txseq %u", control->txseq);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001955 }
1956
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001957 BT_DBG("Sent %d, %u unacked, %u in ERTM queue", sent,
1958 chan->unacked_frames, skb_queue_len(&chan->tx_q));
Mat Martineau18a48e72012-05-17 20:53:34 -07001959
1960 return sent;
Gustavo F. Padovan9e917af2010-05-01 16:15:37 -03001961}
1962
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001963static void l2cap_ertm_resend(struct l2cap_chan *chan)
1964{
1965 struct l2cap_ctrl control;
1966 struct sk_buff *skb;
1967 struct sk_buff *tx_skb;
1968 u16 seq;
1969
1970 BT_DBG("chan %p", chan);
1971
1972 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1973 return;
1974
Mat Martineaub99e13a2012-10-23 15:24:19 -07001975 if (__chan_is_moving(chan))
1976 return;
1977
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001978 while (chan->retrans_list.head != L2CAP_SEQ_LIST_CLEAR) {
1979 seq = l2cap_seq_list_pop(&chan->retrans_list);
1980
1981 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, seq);
1982 if (!skb) {
1983 BT_DBG("Error: Can't retransmit seq %d, frame missing",
Gustavo Padovan2d792812012-10-06 10:07:01 +01001984 seq);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001985 continue;
1986 }
1987
1988 bt_cb(skb)->control.retries++;
1989 control = bt_cb(skb)->control;
1990
1991 if (chan->max_tx != 0 &&
1992 bt_cb(skb)->control.retries > chan->max_tx) {
1993 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001994 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001995 l2cap_seq_list_clear(&chan->retrans_list);
1996 break;
1997 }
1998
1999 control.reqseq = chan->buffer_seq;
2000 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
2001 control.final = 1;
2002 else
2003 control.final = 0;
2004
2005 if (skb_cloned(skb)) {
2006 /* Cloned sk_buffs are read-only, so we need a
2007 * writeable copy
2008 */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002009 tx_skb = skb_copy(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002010 } else {
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002011 tx_skb = skb_clone(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002012 }
2013
2014 if (!tx_skb) {
2015 l2cap_seq_list_clear(&chan->retrans_list);
2016 break;
2017 }
2018
2019 /* Update skb contents */
2020 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
2021 put_unaligned_le32(__pack_extended_control(&control),
2022 tx_skb->data + L2CAP_HDR_SIZE);
2023 } else {
2024 put_unaligned_le16(__pack_enhanced_control(&control),
2025 tx_skb->data + L2CAP_HDR_SIZE);
2026 }
2027
2028 if (chan->fcs == L2CAP_FCS_CRC16) {
2029 u16 fcs = crc16(0, (u8 *) tx_skb->data, tx_skb->len);
2030 put_unaligned_le16(fcs, skb_put(tx_skb,
2031 L2CAP_FCS_SIZE));
2032 }
2033
2034 l2cap_do_send(chan, tx_skb);
2035
2036 BT_DBG("Resent txseq %d", control.txseq);
2037
2038 chan->last_acked_seq = chan->buffer_seq;
2039 }
2040}
2041
Mat Martineauf80842a2012-05-17 20:53:46 -07002042static void l2cap_retransmit(struct l2cap_chan *chan,
2043 struct l2cap_ctrl *control)
2044{
2045 BT_DBG("chan %p, control %p", chan, control);
2046
2047 l2cap_seq_list_append(&chan->retrans_list, control->reqseq);
2048 l2cap_ertm_resend(chan);
2049}
2050
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002051static void l2cap_retransmit_all(struct l2cap_chan *chan,
2052 struct l2cap_ctrl *control)
2053{
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002054 struct sk_buff *skb;
2055
2056 BT_DBG("chan %p, control %p", chan, control);
2057
2058 if (control->poll)
2059 set_bit(CONN_SEND_FBIT, &chan->conn_state);
2060
2061 l2cap_seq_list_clear(&chan->retrans_list);
2062
2063 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
2064 return;
2065
2066 if (chan->unacked_frames) {
2067 skb_queue_walk(&chan->tx_q, skb) {
2068 if (bt_cb(skb)->control.txseq == control->reqseq ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01002069 skb == chan->tx_send_head)
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002070 break;
2071 }
2072
2073 skb_queue_walk_from(&chan->tx_q, skb) {
2074 if (skb == chan->tx_send_head)
2075 break;
2076
2077 l2cap_seq_list_append(&chan->retrans_list,
2078 bt_cb(skb)->control.txseq);
2079 }
2080
2081 l2cap_ertm_resend(chan);
2082 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002083}
2084
Szymon Jancb17e73b2012-01-11 10:59:47 +01002085static void l2cap_send_ack(struct l2cap_chan *chan)
2086{
Mat Martineau0a0aba42012-05-17 20:53:39 -07002087 struct l2cap_ctrl control;
2088 u16 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
2089 chan->last_acked_seq);
2090 int threshold;
2091
2092 BT_DBG("chan %p last_acked_seq %d buffer_seq %d",
2093 chan, chan->last_acked_seq, chan->buffer_seq);
2094
2095 memset(&control, 0, sizeof(control));
2096 control.sframe = 1;
2097
2098 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
2099 chan->rx_state == L2CAP_RX_STATE_RECV) {
2100 __clear_ack_timer(chan);
2101 control.super = L2CAP_SUPER_RNR;
2102 control.reqseq = chan->buffer_seq;
2103 l2cap_send_sframe(chan, &control);
2104 } else {
2105 if (!test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) {
2106 l2cap_ertm_send(chan);
2107 /* If any i-frames were sent, they included an ack */
2108 if (chan->buffer_seq == chan->last_acked_seq)
2109 frames_to_ack = 0;
2110 }
2111
Mat Martineauc20f8e32012-07-10 05:47:07 -07002112 /* Ack now if the window is 3/4ths full.
Mat Martineau0a0aba42012-05-17 20:53:39 -07002113 * Calculate without mul or div
2114 */
Mat Martineauc20f8e32012-07-10 05:47:07 -07002115 threshold = chan->ack_win;
Mat Martineau0a0aba42012-05-17 20:53:39 -07002116 threshold += threshold << 1;
2117 threshold >>= 2;
2118
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002119 BT_DBG("frames_to_ack %u, threshold %d", frames_to_ack,
Mat Martineau0a0aba42012-05-17 20:53:39 -07002120 threshold);
2121
2122 if (frames_to_ack >= threshold) {
2123 __clear_ack_timer(chan);
2124 control.super = L2CAP_SUPER_RR;
2125 control.reqseq = chan->buffer_seq;
2126 l2cap_send_sframe(chan, &control);
2127 frames_to_ack = 0;
2128 }
2129
2130 if (frames_to_ack)
2131 __set_ack_timer(chan);
2132 }
Szymon Jancb17e73b2012-01-11 10:59:47 +01002133}
2134
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002135static inline int l2cap_skbuff_fromiovec(struct l2cap_chan *chan,
2136 struct msghdr *msg, int len,
2137 int count, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002138{
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002139 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002140 struct sk_buff **frag;
Gustavo Padovan90338942012-04-06 20:15:47 -03002141 int sent = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002142
Jukka Rissanen04988782014-06-18 16:37:07 +03002143 if (chan->ops->memcpy_fromiovec(chan, skb_put(skb, count),
2144 msg->msg_iov, count))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002145 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002146
2147 sent += count;
2148 len -= count;
2149
2150 /* Continuation fragments (no L2CAP header) */
2151 frag = &skb_shinfo(skb)->frag_list;
2152 while (len) {
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002153 struct sk_buff *tmp;
2154
Linus Torvalds1da177e2005-04-16 15:20:36 -07002155 count = min_t(unsigned int, conn->mtu, len);
2156
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002157 tmp = chan->ops->alloc_skb(chan, 0, count,
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002158 msg->msg_flags & MSG_DONTWAIT);
2159 if (IS_ERR(tmp))
2160 return PTR_ERR(tmp);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002161
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002162 *frag = tmp;
2163
Jukka Rissanen04988782014-06-18 16:37:07 +03002164 if (chan->ops->memcpy_fromiovec(chan, skb_put(*frag, count),
2165 msg->msg_iov, count))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002166 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002167
2168 sent += count;
2169 len -= count;
2170
Gustavo Padovan2d0ed3d2012-05-11 13:16:12 -03002171 skb->len += (*frag)->len;
2172 skb->data_len += (*frag)->len;
2173
Linus Torvalds1da177e2005-04-16 15:20:36 -07002174 frag = &(*frag)->next;
2175 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002176
2177 return sent;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002178}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002179
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002180static struct sk_buff *l2cap_create_connless_pdu(struct l2cap_chan *chan,
Marcel Holtmann8d463212014-06-05 15:22:51 +02002181 struct msghdr *msg, size_t len)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002182{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002183 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002184 struct sk_buff *skb;
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002185 int err, count, hlen = L2CAP_HDR_SIZE + L2CAP_PSMLEN_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002186 struct l2cap_hdr *lh;
2187
Marcel Holtmann8d463212014-06-05 15:22:51 +02002188 BT_DBG("chan %p psm 0x%2.2x len %zu", chan,
2189 __le16_to_cpu(chan->psm), len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002190
2191 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002192
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002193 skb = chan->ops->alloc_skb(chan, hlen, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002194 msg->msg_flags & MSG_DONTWAIT);
2195 if (IS_ERR(skb))
2196 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002197
2198 /* Create L2CAP header */
2199 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002200 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenkodaf6a78c2012-05-03 10:55:52 +03002201 lh->len = cpu_to_le16(len + L2CAP_PSMLEN_SIZE);
Marcel Holtmann43b1b8d2013-10-12 06:01:26 -07002202 put_unaligned(chan->psm, (__le16 *) skb_put(skb, L2CAP_PSMLEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002203
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002204 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002205 if (unlikely(err < 0)) {
2206 kfree_skb(skb);
2207 return ERR_PTR(err);
2208 }
2209 return skb;
2210}
2211
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002212static struct sk_buff *l2cap_create_basic_pdu(struct l2cap_chan *chan,
Marcel Holtmann8d463212014-06-05 15:22:51 +02002213 struct msghdr *msg, size_t len)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002214{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002215 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002216 struct sk_buff *skb;
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002217 int err, count;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002218 struct l2cap_hdr *lh;
2219
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002220 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002221
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002222 count = min_t(unsigned int, (conn->mtu - L2CAP_HDR_SIZE), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002223
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002224 skb = chan->ops->alloc_skb(chan, L2CAP_HDR_SIZE, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002225 msg->msg_flags & MSG_DONTWAIT);
2226 if (IS_ERR(skb))
2227 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002228
2229 /* Create L2CAP header */
2230 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002231 lh->cid = cpu_to_le16(chan->dcid);
Gustavo Padovan6ff9b5e2012-05-02 11:56:17 -03002232 lh->len = cpu_to_le16(len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002233
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002234 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002235 if (unlikely(err < 0)) {
2236 kfree_skb(skb);
2237 return ERR_PTR(err);
2238 }
2239 return skb;
2240}
2241
Luiz Augusto von Dentzab0ff762011-09-12 20:00:50 +03002242static struct sk_buff *l2cap_create_iframe_pdu(struct l2cap_chan *chan,
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002243 struct msghdr *msg, size_t len,
2244 u16 sdulen)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002245{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002246 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002247 struct sk_buff *skb;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002248 int err, count, hlen;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002249 struct l2cap_hdr *lh;
2250
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002251 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002252
Gustavo F. Padovan0ee0d202010-05-01 16:15:41 -03002253 if (!conn)
2254 return ERR_PTR(-ENOTCONN);
2255
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002256 hlen = __ertm_hdr_size(chan);
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002257
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002258 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002259 hlen += L2CAP_SDULEN_SIZE;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002260
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03002261 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002262 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03002263
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002264 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002265
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002266 skb = chan->ops->alloc_skb(chan, hlen, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002267 msg->msg_flags & MSG_DONTWAIT);
2268 if (IS_ERR(skb))
2269 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002270
2271 /* Create L2CAP header */
2272 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002273 lh->cid = cpu_to_le16(chan->dcid);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002274 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002275
Mat Martineau18a48e72012-05-17 20:53:34 -07002276 /* Control header is populated later */
2277 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
2278 put_unaligned_le32(0, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
2279 else
2280 put_unaligned_le16(0, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002281
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002282 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002283 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002284
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002285 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002286 if (unlikely(err < 0)) {
2287 kfree_skb(skb);
2288 return ERR_PTR(err);
2289 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03002290
Mat Martineau18a48e72012-05-17 20:53:34 -07002291 bt_cb(skb)->control.fcs = chan->fcs;
Mat Martineau3ce35142012-04-25 16:36:14 -07002292 bt_cb(skb)->control.retries = 0;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002293 return skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002294}
2295
Mat Martineau94122bb2012-05-02 09:42:02 -07002296static int l2cap_segment_sdu(struct l2cap_chan *chan,
2297 struct sk_buff_head *seg_queue,
2298 struct msghdr *msg, size_t len)
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002299{
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002300 struct sk_buff *skb;
Mat Martineau94122bb2012-05-02 09:42:02 -07002301 u16 sdu_len;
2302 size_t pdu_len;
Mat Martineau94122bb2012-05-02 09:42:02 -07002303 u8 sar;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002304
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002305 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002306
Mat Martineau94122bb2012-05-02 09:42:02 -07002307 /* It is critical that ERTM PDUs fit in a single HCI fragment,
2308 * so fragmented skbs are not used. The HCI layer's handling
2309 * of fragmented skbs is not compatible with ERTM's queueing.
2310 */
2311
2312 /* PDU size is derived from the HCI MTU */
2313 pdu_len = chan->conn->mtu;
2314
Mat Martineaua5495742012-10-23 15:24:21 -07002315 /* Constrain PDU size for BR/EDR connections */
2316 if (!chan->hs_hcon)
2317 pdu_len = min_t(size_t, pdu_len, L2CAP_BREDR_MAX_PAYLOAD);
Mat Martineau94122bb2012-05-02 09:42:02 -07002318
2319 /* Adjust for largest possible L2CAP overhead. */
Gustavo Padovan35d401d2012-05-25 18:57:05 -03002320 if (chan->fcs)
2321 pdu_len -= L2CAP_FCS_SIZE;
2322
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002323 pdu_len -= __ertm_hdr_size(chan);
Mat Martineau94122bb2012-05-02 09:42:02 -07002324
2325 /* Remote device may have requested smaller PDUs */
2326 pdu_len = min_t(size_t, pdu_len, chan->remote_mps);
2327
2328 if (len <= pdu_len) {
2329 sar = L2CAP_SAR_UNSEGMENTED;
2330 sdu_len = 0;
2331 pdu_len = len;
2332 } else {
2333 sar = L2CAP_SAR_START;
2334 sdu_len = len;
2335 pdu_len -= L2CAP_SDULEN_SIZE;
2336 }
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002337
2338 while (len > 0) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002339 skb = l2cap_create_iframe_pdu(chan, msg, pdu_len, sdu_len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002340
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002341 if (IS_ERR(skb)) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002342 __skb_queue_purge(seg_queue);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002343 return PTR_ERR(skb);
2344 }
2345
Mat Martineau94122bb2012-05-02 09:42:02 -07002346 bt_cb(skb)->control.sar = sar;
2347 __skb_queue_tail(seg_queue, skb);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002348
Mat Martineau94122bb2012-05-02 09:42:02 -07002349 len -= pdu_len;
2350 if (sdu_len) {
2351 sdu_len = 0;
2352 pdu_len += L2CAP_SDULEN_SIZE;
2353 }
2354
2355 if (len <= pdu_len) {
2356 sar = L2CAP_SAR_END;
2357 pdu_len = len;
2358 } else {
2359 sar = L2CAP_SAR_CONTINUE;
2360 }
2361 }
2362
Gustavo Padovanf0f62792012-05-29 13:29:17 -03002363 return 0;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002364}
2365
Johan Hedberg177f8f22013-05-31 17:54:51 +03002366static struct sk_buff *l2cap_create_le_flowctl_pdu(struct l2cap_chan *chan,
2367 struct msghdr *msg,
2368 size_t len, u16 sdulen)
2369{
2370 struct l2cap_conn *conn = chan->conn;
2371 struct sk_buff *skb;
2372 int err, count, hlen;
2373 struct l2cap_hdr *lh;
2374
2375 BT_DBG("chan %p len %zu", chan, len);
2376
2377 if (!conn)
2378 return ERR_PTR(-ENOTCONN);
2379
2380 hlen = L2CAP_HDR_SIZE;
2381
2382 if (sdulen)
2383 hlen += L2CAP_SDULEN_SIZE;
2384
2385 count = min_t(unsigned int, (conn->mtu - hlen), len);
2386
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002387 skb = chan->ops->alloc_skb(chan, hlen, count,
Johan Hedberg177f8f22013-05-31 17:54:51 +03002388 msg->msg_flags & MSG_DONTWAIT);
2389 if (IS_ERR(skb))
2390 return skb;
2391
2392 /* Create L2CAP header */
2393 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
2394 lh->cid = cpu_to_le16(chan->dcid);
2395 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
2396
2397 if (sdulen)
2398 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
2399
2400 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
2401 if (unlikely(err < 0)) {
2402 kfree_skb(skb);
2403 return ERR_PTR(err);
2404 }
2405
2406 return skb;
2407}
2408
2409static int l2cap_segment_le_sdu(struct l2cap_chan *chan,
2410 struct sk_buff_head *seg_queue,
2411 struct msghdr *msg, size_t len)
2412{
2413 struct sk_buff *skb;
2414 size_t pdu_len;
2415 u16 sdu_len;
2416
2417 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
2418
2419 pdu_len = chan->conn->mtu - L2CAP_HDR_SIZE;
2420
2421 pdu_len = min_t(size_t, pdu_len, chan->remote_mps);
2422
2423 sdu_len = len;
2424 pdu_len -= L2CAP_SDULEN_SIZE;
2425
2426 while (len > 0) {
2427 if (len <= pdu_len)
2428 pdu_len = len;
2429
2430 skb = l2cap_create_le_flowctl_pdu(chan, msg, pdu_len, sdu_len);
2431 if (IS_ERR(skb)) {
2432 __skb_queue_purge(seg_queue);
2433 return PTR_ERR(skb);
2434 }
2435
2436 __skb_queue_tail(seg_queue, skb);
2437
2438 len -= pdu_len;
2439
2440 if (sdu_len) {
2441 sdu_len = 0;
2442 pdu_len += L2CAP_SDULEN_SIZE;
2443 }
2444 }
2445
2446 return 0;
2447}
2448
Marcel Holtmann8d463212014-06-05 15:22:51 +02002449int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002450{
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002451 struct sk_buff *skb;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002452 int err;
Mat Martineau94122bb2012-05-02 09:42:02 -07002453 struct sk_buff_head seg_queue;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002454
Seung-Woo Kim31e8ce82013-11-05 18:46:33 +09002455 if (!chan->conn)
2456 return -ENOTCONN;
2457
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002458 /* Connectionless channel */
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002459 if (chan->chan_type == L2CAP_CHAN_CONN_LESS) {
Marcel Holtmann8d463212014-06-05 15:22:51 +02002460 skb = l2cap_create_connless_pdu(chan, msg, len);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002461 if (IS_ERR(skb))
2462 return PTR_ERR(skb);
2463
Andrzej Kaczmarekede81a22014-02-25 17:16:22 +01002464 /* Channel lock is released before requesting new skb and then
2465 * reacquired thus we need to recheck channel state.
2466 */
2467 if (chan->state != BT_CONNECTED) {
2468 kfree_skb(skb);
2469 return -ENOTCONN;
2470 }
2471
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002472 l2cap_do_send(chan, skb);
2473 return len;
2474 }
2475
2476 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03002477 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedberg177f8f22013-05-31 17:54:51 +03002478 /* Check outgoing MTU */
2479 if (len > chan->omtu)
2480 return -EMSGSIZE;
2481
Johan Hedbergfad5fc892013-12-05 09:45:01 +02002482 if (!chan->tx_credits)
2483 return -EAGAIN;
2484
Johan Hedberg177f8f22013-05-31 17:54:51 +03002485 __skb_queue_head_init(&seg_queue);
2486
2487 err = l2cap_segment_le_sdu(chan, &seg_queue, msg, len);
2488
2489 if (chan->state != BT_CONNECTED) {
2490 __skb_queue_purge(&seg_queue);
2491 err = -ENOTCONN;
2492 }
2493
2494 if (err)
2495 return err;
2496
2497 skb_queue_splice_tail_init(&seg_queue, &chan->tx_q);
2498
2499 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
2500 l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
2501 chan->tx_credits--;
2502 }
2503
2504 if (!chan->tx_credits)
2505 chan->ops->suspend(chan);
2506
2507 err = len;
2508
2509 break;
2510
Johan Hedbergfad5fc892013-12-05 09:45:01 +02002511 case L2CAP_MODE_BASIC:
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002512 /* Check outgoing MTU */
2513 if (len > chan->omtu)
2514 return -EMSGSIZE;
2515
2516 /* Create a basic PDU */
Marcel Holtmann8d463212014-06-05 15:22:51 +02002517 skb = l2cap_create_basic_pdu(chan, msg, len);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002518 if (IS_ERR(skb))
2519 return PTR_ERR(skb);
2520
Andrzej Kaczmarekede81a22014-02-25 17:16:22 +01002521 /* Channel lock is released before requesting new skb and then
2522 * reacquired thus we need to recheck channel state.
2523 */
2524 if (chan->state != BT_CONNECTED) {
2525 kfree_skb(skb);
2526 return -ENOTCONN;
2527 }
2528
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002529 l2cap_do_send(chan, skb);
2530 err = len;
2531 break;
2532
2533 case L2CAP_MODE_ERTM:
2534 case L2CAP_MODE_STREAMING:
Mat Martineau94122bb2012-05-02 09:42:02 -07002535 /* Check outgoing MTU */
2536 if (len > chan->omtu) {
2537 err = -EMSGSIZE;
2538 break;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002539 }
2540
Mat Martineau94122bb2012-05-02 09:42:02 -07002541 __skb_queue_head_init(&seg_queue);
2542
2543 /* Do segmentation before calling in to the state machine,
2544 * since it's possible to block while waiting for memory
2545 * allocation.
2546 */
2547 err = l2cap_segment_sdu(chan, &seg_queue, msg, len);
2548
2549 /* The channel could have been closed while segmenting,
2550 * check that it is still connected.
2551 */
2552 if (chan->state != BT_CONNECTED) {
2553 __skb_queue_purge(&seg_queue);
2554 err = -ENOTCONN;
2555 }
2556
2557 if (err)
2558 break;
2559
Mat Martineau37339372012-05-17 20:53:33 -07002560 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo Padovand6603662012-05-21 13:58:22 -03002561 l2cap_tx(chan, NULL, &seg_queue, L2CAP_EV_DATA_REQUEST);
Mat Martineau37339372012-05-17 20:53:33 -07002562 else
Gustavo Padovand6603662012-05-21 13:58:22 -03002563 l2cap_streaming_send(chan, &seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002564
Gustavo Padovand6603662012-05-21 13:58:22 -03002565 err = len;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002566
Mat Martineau94122bb2012-05-02 09:42:02 -07002567 /* If the skbs were not queued for sending, they'll still be in
2568 * seg_queue and need to be purged.
2569 */
2570 __skb_queue_purge(&seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002571 break;
2572
2573 default:
2574 BT_DBG("bad state %1.1x", chan->mode);
2575 err = -EBADFD;
2576 }
2577
2578 return err;
2579}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +03002580EXPORT_SYMBOL_GPL(l2cap_chan_send);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002581
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002582static void l2cap_send_srej(struct l2cap_chan *chan, u16 txseq)
2583{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002584 struct l2cap_ctrl control;
2585 u16 seq;
2586
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002587 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002588
2589 memset(&control, 0, sizeof(control));
2590 control.sframe = 1;
2591 control.super = L2CAP_SUPER_SREJ;
2592
2593 for (seq = chan->expected_tx_seq; seq != txseq;
2594 seq = __next_seq(chan, seq)) {
2595 if (!l2cap_ertm_seq_in_queue(&chan->srej_q, seq)) {
2596 control.reqseq = seq;
2597 l2cap_send_sframe(chan, &control);
2598 l2cap_seq_list_append(&chan->srej_list, seq);
2599 }
2600 }
2601
2602 chan->expected_tx_seq = __next_seq(chan, txseq);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002603}
2604
2605static void l2cap_send_srej_tail(struct l2cap_chan *chan)
2606{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002607 struct l2cap_ctrl control;
2608
2609 BT_DBG("chan %p", chan);
2610
2611 if (chan->srej_list.tail == L2CAP_SEQ_LIST_CLEAR)
2612 return;
2613
2614 memset(&control, 0, sizeof(control));
2615 control.sframe = 1;
2616 control.super = L2CAP_SUPER_SREJ;
2617 control.reqseq = chan->srej_list.tail;
2618 l2cap_send_sframe(chan, &control);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002619}
2620
2621static void l2cap_send_srej_list(struct l2cap_chan *chan, u16 txseq)
2622{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002623 struct l2cap_ctrl control;
2624 u16 initial_head;
2625 u16 seq;
2626
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002627 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002628
2629 memset(&control, 0, sizeof(control));
2630 control.sframe = 1;
2631 control.super = L2CAP_SUPER_SREJ;
2632
2633 /* Capture initial list head to allow only one pass through the list. */
2634 initial_head = chan->srej_list.head;
2635
2636 do {
2637 seq = l2cap_seq_list_pop(&chan->srej_list);
2638 if (seq == txseq || seq == L2CAP_SEQ_LIST_CLEAR)
2639 break;
2640
2641 control.reqseq = seq;
2642 l2cap_send_sframe(chan, &control);
2643 l2cap_seq_list_append(&chan->srej_list, seq);
2644 } while (chan->srej_list.head != initial_head);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002645}
2646
Mat Martineau608bcc62012-05-17 20:53:32 -07002647static void l2cap_process_reqseq(struct l2cap_chan *chan, u16 reqseq)
2648{
2649 struct sk_buff *acked_skb;
2650 u16 ackseq;
2651
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002652 BT_DBG("chan %p, reqseq %u", chan, reqseq);
Mat Martineau608bcc62012-05-17 20:53:32 -07002653
2654 if (chan->unacked_frames == 0 || reqseq == chan->expected_ack_seq)
2655 return;
2656
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002657 BT_DBG("expected_ack_seq %u, unacked_frames %u",
Mat Martineau608bcc62012-05-17 20:53:32 -07002658 chan->expected_ack_seq, chan->unacked_frames);
2659
2660 for (ackseq = chan->expected_ack_seq; ackseq != reqseq;
2661 ackseq = __next_seq(chan, ackseq)) {
2662
2663 acked_skb = l2cap_ertm_seq_in_queue(&chan->tx_q, ackseq);
2664 if (acked_skb) {
2665 skb_unlink(acked_skb, &chan->tx_q);
2666 kfree_skb(acked_skb);
2667 chan->unacked_frames--;
2668 }
2669 }
2670
2671 chan->expected_ack_seq = reqseq;
2672
2673 if (chan->unacked_frames == 0)
2674 __clear_retrans_timer(chan);
2675
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002676 BT_DBG("unacked_frames %u", chan->unacked_frames);
Mat Martineau608bcc62012-05-17 20:53:32 -07002677}
2678
2679static void l2cap_abort_rx_srej_sent(struct l2cap_chan *chan)
2680{
2681 BT_DBG("chan %p", chan);
2682
2683 chan->expected_tx_seq = chan->buffer_seq;
2684 l2cap_seq_list_clear(&chan->srej_list);
2685 skb_queue_purge(&chan->srej_q);
2686 chan->rx_state = L2CAP_RX_STATE_RECV;
2687}
2688
Gustavo Padovand6603662012-05-21 13:58:22 -03002689static void l2cap_tx_state_xmit(struct l2cap_chan *chan,
2690 struct l2cap_ctrl *control,
2691 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002692{
Mat Martineau608bcc62012-05-17 20:53:32 -07002693 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2694 event);
2695
2696 switch (event) {
2697 case L2CAP_EV_DATA_REQUEST:
2698 if (chan->tx_send_head == NULL)
2699 chan->tx_send_head = skb_peek(skbs);
2700
2701 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2702 l2cap_ertm_send(chan);
2703 break;
2704 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2705 BT_DBG("Enter LOCAL_BUSY");
2706 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2707
2708 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2709 /* The SREJ_SENT state must be aborted if we are to
2710 * enter the LOCAL_BUSY state.
2711 */
2712 l2cap_abort_rx_srej_sent(chan);
2713 }
2714
2715 l2cap_send_ack(chan);
2716
2717 break;
2718 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2719 BT_DBG("Exit LOCAL_BUSY");
2720 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2721
2722 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2723 struct l2cap_ctrl local_control;
2724
2725 memset(&local_control, 0, sizeof(local_control));
2726 local_control.sframe = 1;
2727 local_control.super = L2CAP_SUPER_RR;
2728 local_control.poll = 1;
2729 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002730 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002731
2732 chan->retry_count = 1;
2733 __set_monitor_timer(chan);
2734 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2735 }
2736 break;
2737 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2738 l2cap_process_reqseq(chan, control->reqseq);
2739 break;
2740 case L2CAP_EV_EXPLICIT_POLL:
2741 l2cap_send_rr_or_rnr(chan, 1);
2742 chan->retry_count = 1;
2743 __set_monitor_timer(chan);
2744 __clear_ack_timer(chan);
2745 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2746 break;
2747 case L2CAP_EV_RETRANS_TO:
2748 l2cap_send_rr_or_rnr(chan, 1);
2749 chan->retry_count = 1;
2750 __set_monitor_timer(chan);
2751 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2752 break;
2753 case L2CAP_EV_RECV_FBIT:
2754 /* Nothing to process */
2755 break;
2756 default:
2757 break;
2758 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002759}
2760
Gustavo Padovand6603662012-05-21 13:58:22 -03002761static void l2cap_tx_state_wait_f(struct l2cap_chan *chan,
2762 struct l2cap_ctrl *control,
2763 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002764{
Mat Martineau608bcc62012-05-17 20:53:32 -07002765 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2766 event);
2767
2768 switch (event) {
2769 case L2CAP_EV_DATA_REQUEST:
2770 if (chan->tx_send_head == NULL)
2771 chan->tx_send_head = skb_peek(skbs);
2772 /* Queue data, but don't send. */
2773 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2774 break;
2775 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2776 BT_DBG("Enter LOCAL_BUSY");
2777 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2778
2779 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2780 /* The SREJ_SENT state must be aborted if we are to
2781 * enter the LOCAL_BUSY state.
2782 */
2783 l2cap_abort_rx_srej_sent(chan);
2784 }
2785
2786 l2cap_send_ack(chan);
2787
2788 break;
2789 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2790 BT_DBG("Exit LOCAL_BUSY");
2791 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2792
2793 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2794 struct l2cap_ctrl local_control;
2795 memset(&local_control, 0, sizeof(local_control));
2796 local_control.sframe = 1;
2797 local_control.super = L2CAP_SUPER_RR;
2798 local_control.poll = 1;
2799 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002800 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002801
2802 chan->retry_count = 1;
2803 __set_monitor_timer(chan);
2804 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2805 }
2806 break;
2807 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2808 l2cap_process_reqseq(chan, control->reqseq);
2809
2810 /* Fall through */
2811
2812 case L2CAP_EV_RECV_FBIT:
2813 if (control && control->final) {
2814 __clear_monitor_timer(chan);
2815 if (chan->unacked_frames > 0)
2816 __set_retrans_timer(chan);
2817 chan->retry_count = 0;
2818 chan->tx_state = L2CAP_TX_STATE_XMIT;
2819 BT_DBG("recv fbit tx_state 0x2.2%x", chan->tx_state);
2820 }
2821 break;
2822 case L2CAP_EV_EXPLICIT_POLL:
2823 /* Ignore */
2824 break;
2825 case L2CAP_EV_MONITOR_TO:
2826 if (chan->max_tx == 0 || chan->retry_count < chan->max_tx) {
2827 l2cap_send_rr_or_rnr(chan, 1);
2828 __set_monitor_timer(chan);
2829 chan->retry_count++;
2830 } else {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02002831 l2cap_send_disconn_req(chan, ECONNABORTED);
Mat Martineau608bcc62012-05-17 20:53:32 -07002832 }
2833 break;
2834 default:
2835 break;
2836 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002837}
2838
Gustavo Padovand6603662012-05-21 13:58:22 -03002839static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
2840 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002841{
Mat Martineau608bcc62012-05-17 20:53:32 -07002842 BT_DBG("chan %p, control %p, skbs %p, event %d, state %d",
2843 chan, control, skbs, event, chan->tx_state);
2844
2845 switch (chan->tx_state) {
2846 case L2CAP_TX_STATE_XMIT:
Gustavo Padovand6603662012-05-21 13:58:22 -03002847 l2cap_tx_state_xmit(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002848 break;
2849 case L2CAP_TX_STATE_WAIT_F:
Gustavo Padovand6603662012-05-21 13:58:22 -03002850 l2cap_tx_state_wait_f(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002851 break;
2852 default:
2853 /* Ignore event */
2854 break;
2855 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002856}
2857
Mat Martineau4b51dae92012-05-17 20:53:37 -07002858static void l2cap_pass_to_tx(struct l2cap_chan *chan,
2859 struct l2cap_ctrl *control)
2860{
2861 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002862 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_REQSEQ_AND_FBIT);
Mat Martineau4b51dae92012-05-17 20:53:37 -07002863}
2864
Mat Martineauf80842a2012-05-17 20:53:46 -07002865static void l2cap_pass_to_tx_fbit(struct l2cap_chan *chan,
2866 struct l2cap_ctrl *control)
2867{
2868 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002869 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_FBIT);
Mat Martineauf80842a2012-05-17 20:53:46 -07002870}
2871
Linus Torvalds1da177e2005-04-16 15:20:36 -07002872/* Copy frame to all raw sockets on that connection */
2873static void l2cap_raw_recv(struct l2cap_conn *conn, struct sk_buff *skb)
2874{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002875 struct sk_buff *nskb;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03002876 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002877
2878 BT_DBG("conn %p", conn);
2879
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002880 mutex_lock(&conn->chan_lock);
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002881
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002882 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002883 if (chan->chan_type != L2CAP_CHAN_RAW)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002884 continue;
2885
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002886 /* Don't send frame to the channel it came from */
2887 if (bt_cb(skb)->chan == chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002888 continue;
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002889
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002890 nskb = skb_clone(skb, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03002891 if (!nskb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002892 continue;
Gustavo Padovan80b98022012-05-27 22:27:51 -03002893 if (chan->ops->recv(chan, nskb))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002894 kfree_skb(nskb);
2895 }
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002896
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002897 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002898}
2899
2900/* ---- L2CAP signalling commands ---- */
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002901static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn, u8 code,
2902 u8 ident, u16 dlen, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002903{
2904 struct sk_buff *skb, **frag;
2905 struct l2cap_cmd_hdr *cmd;
2906 struct l2cap_hdr *lh;
2907 int len, count;
2908
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002909 BT_DBG("conn %p, code 0x%2.2x, ident 0x%2.2x, len %u",
2910 conn, code, ident, dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002911
Anderson Lizardo300b9622013-06-02 16:30:40 -04002912 if (conn->mtu < L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE)
2913 return NULL;
2914
Linus Torvalds1da177e2005-04-16 15:20:36 -07002915 len = L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE + dlen;
2916 count = min_t(unsigned int, conn->mtu, len);
2917
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002918 skb = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002919 if (!skb)
2920 return NULL;
2921
2922 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002923 lh->len = cpu_to_le16(L2CAP_CMD_HDR_SIZE + dlen);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002924
2925 if (conn->hcon->type == LE_LINK)
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002926 lh->cid = cpu_to_le16(L2CAP_CID_LE_SIGNALING);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002927 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002928 lh->cid = cpu_to_le16(L2CAP_CID_SIGNALING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002929
2930 cmd = (struct l2cap_cmd_hdr *) skb_put(skb, L2CAP_CMD_HDR_SIZE);
2931 cmd->code = code;
2932 cmd->ident = ident;
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002933 cmd->len = cpu_to_le16(dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002934
2935 if (dlen) {
2936 count -= L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE;
2937 memcpy(skb_put(skb, count), data, count);
2938 data += count;
2939 }
2940
2941 len -= skb->len;
2942
2943 /* Continuation fragments (no L2CAP header) */
2944 frag = &skb_shinfo(skb)->frag_list;
2945 while (len) {
2946 count = min_t(unsigned int, conn->mtu, len);
2947
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002948 *frag = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002949 if (!*frag)
2950 goto fail;
2951
2952 memcpy(skb_put(*frag, count), data, count);
2953
2954 len -= count;
2955 data += count;
2956
2957 frag = &(*frag)->next;
2958 }
2959
2960 return skb;
2961
2962fail:
2963 kfree_skb(skb);
2964 return NULL;
2965}
2966
Gustavo Padovan2d792812012-10-06 10:07:01 +01002967static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen,
2968 unsigned long *val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002969{
2970 struct l2cap_conf_opt *opt = *ptr;
2971 int len;
2972
2973 len = L2CAP_CONF_OPT_SIZE + opt->len;
2974 *ptr += len;
2975
2976 *type = opt->type;
2977 *olen = opt->len;
2978
2979 switch (opt->len) {
2980 case 1:
2981 *val = *((u8 *) opt->val);
2982 break;
2983
2984 case 2:
steven miaobfaaeb32010-10-16 18:29:47 -04002985 *val = get_unaligned_le16(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002986 break;
2987
2988 case 4:
steven miaobfaaeb32010-10-16 18:29:47 -04002989 *val = get_unaligned_le32(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002990 break;
2991
2992 default:
2993 *val = (unsigned long) opt->val;
2994 break;
2995 }
2996
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002997 BT_DBG("type 0x%2.2x len %u val 0x%lx", *type, opt->len, *val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002998 return len;
2999}
3000
Linus Torvalds1da177e2005-04-16 15:20:36 -07003001static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val)
3002{
3003 struct l2cap_conf_opt *opt = *ptr;
3004
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03003005 BT_DBG("type 0x%2.2x len %u val 0x%lx", type, len, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003006
3007 opt->type = type;
3008 opt->len = len;
3009
3010 switch (len) {
3011 case 1:
3012 *((u8 *) opt->val) = val;
3013 break;
3014
3015 case 2:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02003016 put_unaligned_le16(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003017 break;
3018
3019 case 4:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02003020 put_unaligned_le32(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003021 break;
3022
3023 default:
3024 memcpy(opt->val, (void *) val, len);
3025 break;
3026 }
3027
3028 *ptr += L2CAP_CONF_OPT_SIZE + len;
3029}
3030
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003031static void l2cap_add_opt_efs(void **ptr, struct l2cap_chan *chan)
3032{
3033 struct l2cap_conf_efs efs;
3034
Szymon Janc1ec918c2011-11-16 09:32:21 +01003035 switch (chan->mode) {
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003036 case L2CAP_MODE_ERTM:
3037 efs.id = chan->local_id;
3038 efs.stype = chan->local_stype;
3039 efs.msdu = cpu_to_le16(chan->local_msdu);
3040 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003041 efs.acc_lat = cpu_to_le32(L2CAP_DEFAULT_ACC_LAT);
3042 efs.flush_to = cpu_to_le32(L2CAP_EFS_DEFAULT_FLUSH_TO);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003043 break;
3044
3045 case L2CAP_MODE_STREAMING:
3046 efs.id = 1;
3047 efs.stype = L2CAP_SERV_BESTEFFORT;
3048 efs.msdu = cpu_to_le16(chan->local_msdu);
3049 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
3050 efs.acc_lat = 0;
3051 efs.flush_to = 0;
3052 break;
3053
3054 default:
3055 return;
3056 }
3057
3058 l2cap_add_conf_opt(ptr, L2CAP_CONF_EFS, sizeof(efs),
Andrei Emeltchenko8936fa62012-10-08 11:14:41 +03003059 (unsigned long) &efs);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003060}
3061
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003062static void l2cap_ack_timeout(struct work_struct *work)
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003063{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003064 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau03625202012-05-17 20:53:51 -07003065 ack_timer.work);
3066 u16 frames_to_ack;
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003067
Gustavo F. Padovan2fb9b3d2011-12-22 16:56:05 -02003068 BT_DBG("chan %p", chan);
3069
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003070 l2cap_chan_lock(chan);
3071
Mat Martineau03625202012-05-17 20:53:51 -07003072 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
3073 chan->last_acked_seq);
3074
3075 if (frames_to_ack)
3076 l2cap_send_rr_or_rnr(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003077
3078 l2cap_chan_unlock(chan);
Szymon Janc09bfb2e2012-01-11 10:59:49 +01003079 l2cap_chan_put(chan);
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003080}
3081
Andrei Emeltchenko466f8002012-05-29 13:59:01 +03003082int l2cap_ertm_init(struct l2cap_chan *chan)
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003083{
Mat Martineau3c588192012-04-11 10:48:42 -07003084 int err;
3085
Mat Martineau105bdf92012-04-27 16:50:48 -07003086 chan->next_tx_seq = 0;
3087 chan->expected_tx_seq = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003088 chan->expected_ack_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003089 chan->unacked_frames = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003090 chan->buffer_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003091 chan->frames_sent = 0;
Mat Martineau105bdf92012-04-27 16:50:48 -07003092 chan->last_acked_seq = 0;
3093 chan->sdu = NULL;
3094 chan->sdu_last_frag = NULL;
3095 chan->sdu_len = 0;
3096
Mat Martineaud34c34f2012-05-14 14:49:27 -07003097 skb_queue_head_init(&chan->tx_q);
3098
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003099 chan->local_amp_id = AMP_ID_BREDR;
3100 chan->move_id = AMP_ID_BREDR;
Mat Martineau08333282012-10-23 15:24:06 -07003101 chan->move_state = L2CAP_MOVE_STABLE;
3102 chan->move_role = L2CAP_MOVE_ROLE_NONE;
3103
Mat Martineau105bdf92012-04-27 16:50:48 -07003104 if (chan->mode != L2CAP_MODE_ERTM)
3105 return 0;
3106
3107 chan->rx_state = L2CAP_RX_STATE_RECV;
3108 chan->tx_state = L2CAP_TX_STATE_XMIT;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003109
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003110 INIT_DELAYED_WORK(&chan->retrans_timer, l2cap_retrans_timeout);
3111 INIT_DELAYED_WORK(&chan->monitor_timer, l2cap_monitor_timeout);
3112 INIT_DELAYED_WORK(&chan->ack_timer, l2cap_ack_timeout);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003113
Gustavo F. Padovanf1c67752011-03-25 20:36:10 -03003114 skb_queue_head_init(&chan->srej_q);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03003115
Mat Martineau3c588192012-04-11 10:48:42 -07003116 err = l2cap_seq_list_init(&chan->srej_list, chan->tx_win);
3117 if (err < 0)
3118 return err;
3119
Mat Martineau9dc9aff2012-05-17 16:20:14 -07003120 err = l2cap_seq_list_init(&chan->retrans_list, chan->remote_tx_win);
3121 if (err < 0)
3122 l2cap_seq_list_free(&chan->srej_list);
3123
3124 return err;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003125}
3126
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003127static inline __u8 l2cap_select_mode(__u8 mode, __u16 remote_feat_mask)
3128{
3129 switch (mode) {
3130 case L2CAP_MODE_STREAMING:
3131 case L2CAP_MODE_ERTM:
3132 if (l2cap_mode_supported(mode, remote_feat_mask))
3133 return mode;
3134 /* fall through */
3135 default:
3136 return L2CAP_MODE_BASIC;
3137 }
3138}
3139
Marcel Holtmann848566b2013-10-01 22:59:22 -07003140static inline bool __l2cap_ews_supported(struct l2cap_conn *conn)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003141{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003142 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003143}
3144
Marcel Holtmann848566b2013-10-01 22:59:22 -07003145static inline bool __l2cap_efs_supported(struct l2cap_conn *conn)
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003146{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003147 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_FLOW;
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003148}
3149
Mat Martineau36c86c82012-10-23 15:24:20 -07003150static void __l2cap_set_ertm_timeouts(struct l2cap_chan *chan,
3151 struct l2cap_conf_rfc *rfc)
3152{
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003153 if (chan->local_amp_id != AMP_ID_BREDR && chan->hs_hcon) {
Mat Martineau36c86c82012-10-23 15:24:20 -07003154 u64 ertm_to = chan->hs_hcon->hdev->amp_be_flush_to;
3155
3156 /* Class 1 devices have must have ERTM timeouts
3157 * exceeding the Link Supervision Timeout. The
3158 * default Link Supervision Timeout for AMP
3159 * controllers is 10 seconds.
3160 *
3161 * Class 1 devices use 0xffffffff for their
3162 * best-effort flush timeout, so the clamping logic
3163 * will result in a timeout that meets the above
3164 * requirement. ERTM timeouts are 16-bit values, so
3165 * the maximum timeout is 65.535 seconds.
3166 */
3167
3168 /* Convert timeout to milliseconds and round */
3169 ertm_to = DIV_ROUND_UP_ULL(ertm_to, 1000);
3170
3171 /* This is the recommended formula for class 2 devices
3172 * that start ERTM timers when packets are sent to the
3173 * controller.
3174 */
3175 ertm_to = 3 * ertm_to + 500;
3176
3177 if (ertm_to > 0xffff)
3178 ertm_to = 0xffff;
3179
3180 rfc->retrans_timeout = cpu_to_le16((u16) ertm_to);
3181 rfc->monitor_timeout = rfc->retrans_timeout;
3182 } else {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003183 rfc->retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO);
3184 rfc->monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO);
Mat Martineau36c86c82012-10-23 15:24:20 -07003185 }
3186}
3187
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003188static inline void l2cap_txwin_setup(struct l2cap_chan *chan)
3189{
3190 if (chan->tx_win > L2CAP_DEFAULT_TX_WINDOW &&
Marcel Holtmann848566b2013-10-01 22:59:22 -07003191 __l2cap_ews_supported(chan->conn)) {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003192 /* use extended control field */
3193 set_bit(FLAG_EXT_CTRL, &chan->flags);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003194 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
3195 } else {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003196 chan->tx_win = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003197 L2CAP_DEFAULT_TX_WINDOW);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003198 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
3199 }
Mat Martineauc20f8e32012-07-10 05:47:07 -07003200 chan->ack_win = chan->tx_win;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003201}
3202
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003203static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003204{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003205 struct l2cap_conf_req *req = data;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003206 struct l2cap_conf_rfc rfc = { .mode = chan->mode };
Linus Torvalds1da177e2005-04-16 15:20:36 -07003207 void *ptr = req->data;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003208 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003209
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03003210 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003211
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003212 if (chan->num_conf_req || chan->num_conf_rsp)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003213 goto done;
3214
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003215 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003216 case L2CAP_MODE_STREAMING:
3217 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003218 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state))
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003219 break;
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003220
Marcel Holtmann848566b2013-10-01 22:59:22 -07003221 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003222 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3223
Gustavo F. Padovan2ba13ed2010-06-09 16:39:05 -03003224 /* fall through */
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003225 default:
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003226 chan->mode = l2cap_select_mode(rfc.mode, chan->conn->feat_mask);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003227 break;
3228 }
3229
3230done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003231 if (chan->imtu != L2CAP_DEFAULT_MTU)
3232 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovan7990681c2011-01-24 16:01:43 -02003233
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003234 switch (chan->mode) {
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003235 case L2CAP_MODE_BASIC:
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003236 if (!(chan->conn->feat_mask & L2CAP_FEAT_ERTM) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003237 !(chan->conn->feat_mask & L2CAP_FEAT_STREAMING))
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003238 break;
3239
Gustavo F. Padovan62547752010-06-08 20:05:31 -03003240 rfc.mode = L2CAP_MODE_BASIC;
3241 rfc.txwin_size = 0;
3242 rfc.max_transmit = 0;
3243 rfc.retrans_timeout = 0;
3244 rfc.monitor_timeout = 0;
3245 rfc.max_pdu_size = 0;
3246
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003247 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003248 (unsigned long) &rfc);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003249 break;
3250
3251 case L2CAP_MODE_ERTM:
3252 rfc.mode = L2CAP_MODE_ERTM;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003253 rfc.max_transmit = chan->max_tx;
Mat Martineau36c86c82012-10-23 15:24:20 -07003254
3255 __l2cap_set_ertm_timeouts(chan, &rfc);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003256
3257 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003258 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3259 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003260 rfc.max_pdu_size = cpu_to_le16(size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003261
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003262 l2cap_txwin_setup(chan);
3263
3264 rfc.txwin_size = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003265 L2CAP_DEFAULT_TX_WINDOW);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003266
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003267 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003268 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003269
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003270 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3271 l2cap_add_opt_efs(&ptr, chan);
3272
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003273 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3274 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003275 chan->tx_win);
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003276
3277 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3278 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003279 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003280 chan->fcs = L2CAP_FCS_NONE;
3281 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3282 chan->fcs);
3283 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003284 break;
3285
3286 case L2CAP_MODE_STREAMING:
Mat Martineau273759e2012-05-17 20:53:53 -07003287 l2cap_txwin_setup(chan);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003288 rfc.mode = L2CAP_MODE_STREAMING;
3289 rfc.txwin_size = 0;
3290 rfc.max_transmit = 0;
3291 rfc.retrans_timeout = 0;
3292 rfc.monitor_timeout = 0;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003293
3294 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003295 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3296 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003297 rfc.max_pdu_size = cpu_to_le16(size);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003298
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003299 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003300 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003301
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003302 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3303 l2cap_add_opt_efs(&ptr, chan);
3304
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003305 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3306 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003307 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003308 chan->fcs = L2CAP_FCS_NONE;
3309 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3310 chan->fcs);
3311 }
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003312 break;
3313 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003314
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003315 req->dcid = cpu_to_le16(chan->dcid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003316 req->flags = cpu_to_le16(0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003317
3318 return ptr - data;
3319}
3320
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003321static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003322{
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003323 struct l2cap_conf_rsp *rsp = data;
3324 void *ptr = rsp->data;
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003325 void *req = chan->conf_req;
3326 int len = chan->conf_len;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003327 int type, hint, olen;
3328 unsigned long val;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003329 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003330 struct l2cap_conf_efs efs;
3331 u8 remote_efs = 0;
Marcel Holtmann861d6882007-10-20 13:37:06 +02003332 u16 mtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003333 u16 result = L2CAP_CONF_SUCCESS;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003334 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003335
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003336 BT_DBG("chan %p", chan);
Marcel Holtmann820ae1b2006-11-18 22:15:00 +01003337
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003338 while (len >= L2CAP_CONF_OPT_SIZE) {
3339 len -= l2cap_get_conf_opt(&req, &type, &olen, &val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003340
Gustavo F. Padovan589d2742009-04-20 01:31:07 -03003341 hint = type & L2CAP_CONF_HINT;
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07003342 type &= L2CAP_CONF_MASK;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003343
3344 switch (type) {
3345 case L2CAP_CONF_MTU:
Marcel Holtmann861d6882007-10-20 13:37:06 +02003346 mtu = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003347 break;
3348
3349 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003350 chan->flush_to = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003351 break;
3352
3353 case L2CAP_CONF_QOS:
3354 break;
3355
Marcel Holtmann6464f352007-10-20 13:39:51 +02003356 case L2CAP_CONF_RFC:
3357 if (olen == sizeof(rfc))
3358 memcpy(&rfc, (void *) val, olen);
3359 break;
3360
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003361 case L2CAP_CONF_FCS:
3362 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003363 set_bit(CONF_RECV_NO_FCS, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003364 break;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003365
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003366 case L2CAP_CONF_EFS:
3367 remote_efs = 1;
3368 if (olen == sizeof(efs))
3369 memcpy(&efs, (void *) val, olen);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003370 break;
3371
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003372 case L2CAP_CONF_EWS:
Marcel Holtmann848566b2013-10-01 22:59:22 -07003373 if (!chan->conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003374 return -ECONNREFUSED;
3375
3376 set_bit(FLAG_EXT_CTRL, &chan->flags);
3377 set_bit(CONF_EWS_RECV, &chan->conf_state);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003378 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003379 chan->remote_tx_win = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003380 break;
3381
3382 default:
3383 if (hint)
3384 break;
3385
3386 result = L2CAP_CONF_UNKNOWN;
3387 *((u8 *) ptr++) = type;
3388 break;
3389 }
3390 }
3391
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003392 if (chan->num_conf_rsp || chan->num_conf_req > 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003393 goto done;
3394
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003395 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003396 case L2CAP_MODE_STREAMING:
3397 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003398 if (!test_bit(CONF_STATE2_DEVICE, &chan->conf_state)) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003399 chan->mode = l2cap_select_mode(rfc.mode,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003400 chan->conn->feat_mask);
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003401 break;
3402 }
3403
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003404 if (remote_efs) {
Marcel Holtmann848566b2013-10-01 22:59:22 -07003405 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003406 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3407 else
3408 return -ECONNREFUSED;
3409 }
3410
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003411 if (chan->mode != rfc.mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003412 return -ECONNREFUSED;
Gustavo F. Padovan742e5192010-06-08 19:09:48 -03003413
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003414 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003415 }
3416
3417done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003418 if (chan->mode != rfc.mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003419 result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003420 rfc.mode = chan->mode;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003421
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003422 if (chan->num_conf_rsp == 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003423 return -ECONNREFUSED;
3424
Gustavo Padovan2d792812012-10-06 10:07:01 +01003425 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3426 (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003427 }
3428
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003429 if (result == L2CAP_CONF_SUCCESS) {
3430 /* Configure output options and let the other side know
3431 * which ones we don't like. */
3432
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003433 if (mtu < L2CAP_DEFAULT_MIN_MTU)
3434 result = L2CAP_CONF_UNACCEPT;
3435 else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003436 chan->omtu = mtu;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003437 set_bit(CONF_MTU_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003438 }
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003439 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->omtu);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003440
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003441 if (remote_efs) {
3442 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003443 efs.stype != L2CAP_SERV_NOTRAFIC &&
3444 efs.stype != chan->local_stype) {
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003445
3446 result = L2CAP_CONF_UNACCEPT;
3447
3448 if (chan->num_conf_req >= 1)
3449 return -ECONNREFUSED;
3450
3451 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003452 sizeof(efs),
3453 (unsigned long) &efs);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003454 } else {
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003455 /* Send PENDING Conf Rsp */
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003456 result = L2CAP_CONF_PENDING;
3457 set_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003458 }
3459 }
3460
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003461 switch (rfc.mode) {
3462 case L2CAP_MODE_BASIC:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003463 chan->fcs = L2CAP_FCS_NONE;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003464 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003465 break;
3466
3467 case L2CAP_MODE_ERTM:
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003468 if (!test_bit(CONF_EWS_RECV, &chan->conf_state))
3469 chan->remote_tx_win = rfc.txwin_size;
3470 else
3471 rfc.txwin_size = L2CAP_DEFAULT_TX_WINDOW;
3472
Gustavo F. Padovan2c03a7a2011-03-25 20:15:28 -03003473 chan->remote_max_tx = rfc.max_transmit;
Mat Martineau86b1b262010-08-05 15:54:22 -07003474
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003475 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003476 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3477 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003478 rfc.max_pdu_size = cpu_to_le16(size);
3479 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003480
Mat Martineau36c86c82012-10-23 15:24:20 -07003481 __l2cap_set_ertm_timeouts(chan, &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003482
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003483 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003484
3485 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003486 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003487
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003488 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3489 chan->remote_id = efs.id;
3490 chan->remote_stype = efs.stype;
3491 chan->remote_msdu = le16_to_cpu(efs.msdu);
3492 chan->remote_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003493 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003494 chan->remote_acc_lat =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003495 le32_to_cpu(efs.acc_lat);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003496 chan->remote_sdu_itime =
3497 le32_to_cpu(efs.sdu_itime);
3498 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003499 sizeof(efs),
3500 (unsigned long) &efs);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003501 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003502 break;
3503
3504 case L2CAP_MODE_STREAMING:
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003505 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003506 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3507 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003508 rfc.max_pdu_size = cpu_to_le16(size);
3509 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003510
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003511 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003512
Gustavo Padovan2d792812012-10-06 10:07:01 +01003513 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3514 (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003515
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003516 break;
3517
3518 default:
Marcel Holtmann6464f352007-10-20 13:39:51 +02003519 result = L2CAP_CONF_UNACCEPT;
3520
3521 memset(&rfc, 0, sizeof(rfc));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003522 rfc.mode = chan->mode;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003523 }
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003524
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003525 if (result == L2CAP_CONF_SUCCESS)
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003526 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003527 }
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003528 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003529 rsp->result = cpu_to_le16(result);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003530 rsp->flags = cpu_to_le16(0);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003531
3532 return ptr - data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003533}
3534
Gustavo Padovan2d792812012-10-06 10:07:01 +01003535static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len,
3536 void *data, u16 *result)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003537{
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003538 struct l2cap_conf_req *req = data;
3539 void *ptr = req->data;
3540 int type, olen;
3541 unsigned long val;
Mat Martineau36e999a2011-12-08 17:23:21 -08003542 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003543 struct l2cap_conf_efs efs;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003544
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003545 BT_DBG("chan %p, rsp %p, len %d, req %p", chan, rsp, len, data);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003546
3547 while (len >= L2CAP_CONF_OPT_SIZE) {
3548 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3549
3550 switch (type) {
3551 case L2CAP_CONF_MTU:
3552 if (val < L2CAP_DEFAULT_MIN_MTU) {
3553 *result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003554 chan->imtu = L2CAP_DEFAULT_MIN_MTU;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003555 } else
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003556 chan->imtu = val;
3557 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003558 break;
3559
3560 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003561 chan->flush_to = val;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003562 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003563 2, chan->flush_to);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003564 break;
3565
3566 case L2CAP_CONF_RFC:
3567 if (olen == sizeof(rfc))
3568 memcpy(&rfc, (void *)val, olen);
3569
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003570 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003571 rfc.mode != chan->mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003572 return -ECONNREFUSED;
3573
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003574 chan->fcs = 0;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003575
3576 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003577 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003578 break;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003579
3580 case L2CAP_CONF_EWS:
Mat Martineauc20f8e32012-07-10 05:47:07 -07003581 chan->ack_win = min_t(u16, val, chan->ack_win);
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003582 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Mat Martineauc20f8e32012-07-10 05:47:07 -07003583 chan->tx_win);
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003584 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003585
3586 case L2CAP_CONF_EFS:
3587 if (olen == sizeof(efs))
3588 memcpy(&efs, (void *)val, olen);
3589
3590 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003591 efs.stype != L2CAP_SERV_NOTRAFIC &&
3592 efs.stype != chan->local_stype)
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003593 return -ECONNREFUSED;
3594
Gustavo Padovan2d792812012-10-06 10:07:01 +01003595 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS, sizeof(efs),
3596 (unsigned long) &efs);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003597 break;
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003598
3599 case L2CAP_CONF_FCS:
3600 if (*result == L2CAP_CONF_PENDING)
3601 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003602 set_bit(CONF_RECV_NO_FCS,
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003603 &chan->conf_state);
3604 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003605 }
3606 }
3607
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003608 if (chan->mode == L2CAP_MODE_BASIC && chan->mode != rfc.mode)
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003609 return -ECONNREFUSED;
3610
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003611 chan->mode = rfc.mode;
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003612
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003613 if (*result == L2CAP_CONF_SUCCESS || *result == L2CAP_CONF_PENDING) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003614 switch (rfc.mode) {
3615 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003616 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3617 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
3618 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003619 if (!test_bit(FLAG_EXT_CTRL, &chan->flags))
3620 chan->ack_win = min_t(u16, chan->ack_win,
3621 rfc.txwin_size);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003622
3623 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3624 chan->local_msdu = le16_to_cpu(efs.msdu);
3625 chan->local_sdu_itime =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003626 le32_to_cpu(efs.sdu_itime);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003627 chan->local_acc_lat = le32_to_cpu(efs.acc_lat);
3628 chan->local_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003629 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003630 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003631 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003632
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003633 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003634 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003635 }
3636 }
3637
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003638 req->dcid = cpu_to_le16(chan->dcid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003639 req->flags = cpu_to_le16(0);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003640
3641 return ptr - data;
3642}
3643
Gustavo Padovan2d792812012-10-06 10:07:01 +01003644static int l2cap_build_conf_rsp(struct l2cap_chan *chan, void *data,
3645 u16 result, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003646{
3647 struct l2cap_conf_rsp *rsp = data;
3648 void *ptr = rsp->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003649
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003650 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003651
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003652 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003653 rsp->result = cpu_to_le16(result);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003654 rsp->flags = cpu_to_le16(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003655
3656 return ptr - data;
3657}
3658
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003659void __l2cap_le_connect_rsp_defer(struct l2cap_chan *chan)
3660{
3661 struct l2cap_le_conn_rsp rsp;
3662 struct l2cap_conn *conn = chan->conn;
3663
3664 BT_DBG("chan %p", chan);
3665
3666 rsp.dcid = cpu_to_le16(chan->scid);
3667 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02003668 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03003669 rsp.credits = cpu_to_le16(chan->rx_credits);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003670 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003671
3672 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp),
3673 &rsp);
3674}
3675
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003676void __l2cap_connect_rsp_defer(struct l2cap_chan *chan)
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003677{
3678 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003679 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003680 u8 buf[128];
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003681 u8 rsp_code;
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003682
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003683 rsp.scid = cpu_to_le16(chan->dcid);
3684 rsp.dcid = cpu_to_le16(chan->scid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003685 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
3686 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003687
3688 if (chan->hs_hcon)
3689 rsp_code = L2CAP_CREATE_CHAN_RSP;
3690 else
3691 rsp_code = L2CAP_CONN_RSP;
3692
3693 BT_DBG("chan %p rsp_code %u", chan, rsp_code);
3694
3695 l2cap_send_cmd(conn, chan->ident, rsp_code, sizeof(rsp), &rsp);
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003696
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003697 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003698 return;
3699
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003700 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003701 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003702 chan->num_conf_req++;
3703}
3704
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003705static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len)
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003706{
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003707 int type, olen;
3708 unsigned long val;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003709 /* Use sane default values in case a misbehaving remote device
3710 * did not send an RFC or extended window size option.
3711 */
3712 u16 txwin_ext = chan->ack_win;
3713 struct l2cap_conf_rfc rfc = {
3714 .mode = chan->mode,
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003715 .retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO),
3716 .monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO),
Mat Martineauc20f8e32012-07-10 05:47:07 -07003717 .max_pdu_size = cpu_to_le16(chan->imtu),
3718 .txwin_size = min_t(u16, chan->ack_win, L2CAP_DEFAULT_TX_WINDOW),
3719 };
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003720
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003721 BT_DBG("chan %p, rsp %p, len %d", chan, rsp, len);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003722
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003723 if ((chan->mode != L2CAP_MODE_ERTM) && (chan->mode != L2CAP_MODE_STREAMING))
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003724 return;
3725
3726 while (len >= L2CAP_CONF_OPT_SIZE) {
3727 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3728
Mat Martineauc20f8e32012-07-10 05:47:07 -07003729 switch (type) {
3730 case L2CAP_CONF_RFC:
3731 if (olen == sizeof(rfc))
3732 memcpy(&rfc, (void *)val, olen);
Szymon Janc8f321f82012-06-08 11:33:33 +02003733 break;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003734 case L2CAP_CONF_EWS:
3735 txwin_ext = val;
3736 break;
3737 }
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003738 }
3739
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003740 switch (rfc.mode) {
3741 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003742 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3743 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003744 chan->mps = le16_to_cpu(rfc.max_pdu_size);
3745 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3746 chan->ack_win = min_t(u16, chan->ack_win, txwin_ext);
3747 else
3748 chan->ack_win = min_t(u16, chan->ack_win,
3749 rfc.txwin_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003750 break;
3751 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003752 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003753 }
3754}
3755
Gustavo Padovan2d792812012-10-06 10:07:01 +01003756static inline int l2cap_command_rej(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003757 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3758 u8 *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003759{
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003760 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003761
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003762 if (cmd_len < sizeof(*rej))
3763 return -EPROTO;
3764
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003765 if (rej->reason != L2CAP_REJ_NOT_UNDERSTOOD)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003766 return 0;
3767
3768 if ((conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003769 cmd->ident == conn->info_ident) {
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02003770 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann984947d2009-02-06 23:35:19 +01003771
3772 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01003773 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01003774
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003775 l2cap_conn_start(conn);
3776 }
3777
3778 return 0;
3779}
3780
Mat Martineau17009152012-10-23 15:24:07 -07003781static struct l2cap_chan *l2cap_connect(struct l2cap_conn *conn,
3782 struct l2cap_cmd_hdr *cmd,
3783 u8 *data, u8 rsp_code, u8 amp_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003784{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003785 struct l2cap_conn_req *req = (struct l2cap_conn_req *) data;
3786 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003787 struct l2cap_chan *chan = NULL, *pchan;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003788 int result, status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003789
3790 u16 dcid = 0, scid = __le16_to_cpu(req->scid);
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003791 __le16 psm = req->psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003792
Andrei Emeltchenko097db762012-03-09 14:16:17 +02003793 BT_DBG("psm 0x%2.2x scid 0x%4.4x", __le16_to_cpu(psm), scid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003794
3795 /* Check if we have socket listening on psm */
Marcel Holtmann6f59b902013-10-13 05:24:01 -07003796 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03003797 &conn->hcon->dst, ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003798 if (!pchan) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003799 result = L2CAP_CR_BAD_PSM;
3800 goto sendresp;
3801 }
3802
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003803 mutex_lock(&conn->chan_lock);
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003804 l2cap_chan_lock(pchan);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00003805
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003806 /* Check if the ACL is secure enough (if not SDP) */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003807 if (psm != cpu_to_le16(L2CAP_PSM_SDP) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003808 !hci_conn_check_link_mode(conn->hcon)) {
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02003809 conn->disc_reason = HCI_ERROR_AUTH_FAILURE;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003810 result = L2CAP_CR_SEC_BLOCK;
3811 goto response;
3812 }
3813
Linus Torvalds1da177e2005-04-16 15:20:36 -07003814 result = L2CAP_CR_NO_MEM;
3815
Gustavo Padovan2dfa1002012-05-27 22:27:58 -03003816 /* Check if we already have channel with that dcid */
3817 if (__l2cap_get_chan_by_dcid(conn, scid))
3818 goto response;
3819
Gustavo Padovan80b98022012-05-27 22:27:51 -03003820 chan = pchan->ops->new_connection(pchan);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03003821 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003822 goto response;
3823
Syam Sidhardhan330b6c12013-08-06 01:59:12 +09003824 /* For certain devices (ex: HID mouse), support for authentication,
3825 * pairing and bonding is optional. For such devices, inorder to avoid
3826 * the ACL alive for too long after L2CAP disconnection, reset the ACL
3827 * disc_timeout back to HCI_DISCONN_TIMEOUT during L2CAP connect.
3828 */
3829 conn->hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
3830
Marcel Holtmann7eafc592013-10-13 08:12:47 -07003831 bacpy(&chan->src, &conn->hcon->src);
3832 bacpy(&chan->dst, &conn->hcon->dst);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -07003833 chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type);
3834 chan->dst_type = bdaddr_type(conn->hcon, conn->hcon->dst_type);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003835 chan->psm = psm;
3836 chan->dcid = scid;
Mat Martineau17009152012-10-23 15:24:07 -07003837 chan->local_amp_id = amp_id;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003838
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003839 __l2cap_chan_add(conn, chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003840
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003841 dcid = chan->scid;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003842
Gustavo Padovan8d836d72013-10-15 19:24:47 -03003843 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003844
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003845 chan->ident = cmd->ident;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003846
Marcel Holtmann984947d2009-02-06 23:35:19 +01003847 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) {
Gustavo F. Padovand45fc422011-11-05 19:54:24 -02003848 if (l2cap_chan_check_security(chan)) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07003849 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003850 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003851 result = L2CAP_CR_PEND;
3852 status = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08003853 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003854 } else {
Mat Martineau17009152012-10-23 15:24:07 -07003855 /* Force pending result for AMP controllers.
3856 * The connection will succeed after the
3857 * physical link is up.
3858 */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003859 if (amp_id == AMP_ID_BREDR) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003860 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau17009152012-10-23 15:24:07 -07003861 result = L2CAP_CR_SUCCESS;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003862 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003863 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003864 result = L2CAP_CR_PEND;
Mat Martineau17009152012-10-23 15:24:07 -07003865 }
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003866 status = L2CAP_CS_NO_INFO;
3867 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003868 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003869 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003870 result = L2CAP_CR_PEND;
3871 status = L2CAP_CS_AUTHEN_PEND;
3872 }
3873 } 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_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003877 }
3878
Linus Torvalds1da177e2005-04-16 15:20:36 -07003879response:
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003880 l2cap_chan_unlock(pchan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003881 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003882
3883sendresp:
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003884 rsp.scid = cpu_to_le16(scid);
3885 rsp.dcid = cpu_to_le16(dcid);
3886 rsp.result = cpu_to_le16(result);
3887 rsp.status = cpu_to_le16(status);
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003888 l2cap_send_cmd(conn, cmd->ident, rsp_code, sizeof(rsp), &rsp);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003889
3890 if (result == L2CAP_CR_PEND && status == L2CAP_CS_NO_INFO) {
3891 struct l2cap_info_req info;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003892 info.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003893
3894 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
3895 conn->info_ident = l2cap_get_ident(conn);
3896
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08003897 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003898
Gustavo Padovan2d792812012-10-06 10:07:01 +01003899 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
3900 sizeof(info), &info);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003901 }
3902
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003903 if (chan && !test_bit(CONF_REQ_SENT, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003904 result == L2CAP_CR_SUCCESS) {
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003905 u8 buf[128];
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003906 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003907 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003908 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003909 chan->num_conf_req++;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003910 }
Mat Martineau17009152012-10-23 15:24:07 -07003911
3912 return chan;
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003913}
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003914
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003915static int l2cap_connect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003916 struct l2cap_cmd_hdr *cmd, u16 cmd_len, u8 *data)
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003917{
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303918 struct hci_dev *hdev = conn->hcon->hdev;
3919 struct hci_conn *hcon = conn->hcon;
3920
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003921 if (cmd_len < sizeof(struct l2cap_conn_req))
3922 return -EPROTO;
3923
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303924 hci_dev_lock(hdev);
3925 if (test_bit(HCI_MGMT, &hdev->dev_flags) &&
3926 !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &hcon->flags))
3927 mgmt_device_connected(hdev, &hcon->dst, hcon->type,
3928 hcon->dst_type, 0, NULL, 0,
3929 hcon->dev_class);
3930 hci_dev_unlock(hdev);
3931
Gustavo Padovan300229f2012-10-12 19:40:40 +08003932 l2cap_connect(conn, cmd, data, L2CAP_CONN_RSP, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003933 return 0;
3934}
3935
Mat Martineau5909cf32012-10-23 15:24:08 -07003936static int l2cap_connect_create_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003937 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3938 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003939{
3940 struct l2cap_conn_rsp *rsp = (struct l2cap_conn_rsp *) data;
3941 u16 scid, dcid, result, status;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003942 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003943 u8 req[128];
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003944 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003945
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003946 if (cmd_len < sizeof(*rsp))
3947 return -EPROTO;
3948
Linus Torvalds1da177e2005-04-16 15:20:36 -07003949 scid = __le16_to_cpu(rsp->scid);
3950 dcid = __le16_to_cpu(rsp->dcid);
3951 result = __le16_to_cpu(rsp->result);
3952 status = __le16_to_cpu(rsp->status);
3953
Andrei Emeltchenko1b009c92012-02-21 12:54:54 +02003954 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 +01003955 dcid, scid, result, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003956
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003957 mutex_lock(&conn->chan_lock);
3958
Linus Torvalds1da177e2005-04-16 15:20:36 -07003959 if (scid) {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003960 chan = __l2cap_get_chan_by_scid(conn, scid);
3961 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003962 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003963 goto unlock;
3964 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003965 } else {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003966 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
3967 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003968 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003969 goto unlock;
3970 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003971 }
3972
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003973 err = 0;
3974
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003975 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003976
Linus Torvalds1da177e2005-04-16 15:20:36 -07003977 switch (result) {
3978 case L2CAP_CR_SUCCESS:
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03003979 l2cap_state_change(chan, BT_CONFIG);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003980 chan->ident = 0;
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003981 chan->dcid = dcid;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003982 clear_bit(CONF_CONNECT_PEND, &chan->conf_state);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01003983
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003984 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003985 break;
3986
Linus Torvalds1da177e2005-04-16 15:20:36 -07003987 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003988 l2cap_build_conf_req(chan, req), req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003989 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003990 break;
3991
3992 case L2CAP_CR_PEND:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003993 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003994 break;
3995
3996 default:
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003997 l2cap_chan_del(chan, ECONNREFUSED);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003998 break;
3999 }
4000
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004001 l2cap_chan_unlock(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004002
4003unlock:
4004 mutex_unlock(&conn->chan_lock);
4005
4006 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004007}
4008
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004009static inline void set_default_fcs(struct l2cap_chan *chan)
Mat Martineau8c462b62010-08-24 15:35:42 -07004010{
4011 /* FCS is enabled only in ERTM or streaming mode, if one or both
4012 * sides request it.
4013 */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03004014 if (chan->mode != L2CAP_MODE_ERTM && chan->mode != L2CAP_MODE_STREAMING)
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004015 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02004016 else if (!test_bit(CONF_RECV_NO_FCS, &chan->conf_state))
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004017 chan->fcs = L2CAP_FCS_CRC16;
Mat Martineau8c462b62010-08-24 15:35:42 -07004018}
4019
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03004020static void l2cap_send_efs_conf_rsp(struct l2cap_chan *chan, void *data,
4021 u8 ident, u16 flags)
4022{
4023 struct l2cap_conn *conn = chan->conn;
4024
4025 BT_DBG("conn %p chan %p ident %d flags 0x%4.4x", conn, chan, ident,
4026 flags);
4027
4028 clear_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
4029 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
4030
4031 l2cap_send_cmd(conn, ident, L2CAP_CONF_RSP,
4032 l2cap_build_conf_rsp(chan, data,
4033 L2CAP_CONF_SUCCESS, flags), data);
4034}
4035
Johan Hedberg662d6522013-10-16 11:20:47 +03004036static void cmd_reject_invalid_cid(struct l2cap_conn *conn, u8 ident,
4037 u16 scid, u16 dcid)
4038{
4039 struct l2cap_cmd_rej_cid rej;
4040
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004041 rej.reason = cpu_to_le16(L2CAP_REJ_INVALID_CID);
Johan Hedberg662d6522013-10-16 11:20:47 +03004042 rej.scid = __cpu_to_le16(scid);
4043 rej.dcid = __cpu_to_le16(dcid);
4044
4045 l2cap_send_cmd(conn, ident, L2CAP_COMMAND_REJ, sizeof(rej), &rej);
4046}
4047
Gustavo Padovan2d792812012-10-06 10:07:01 +01004048static inline int l2cap_config_req(struct l2cap_conn *conn,
4049 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4050 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004051{
4052 struct l2cap_conf_req *req = (struct l2cap_conf_req *) data;
4053 u16 dcid, flags;
4054 u8 rsp[64];
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004055 struct l2cap_chan *chan;
Mat Martineau3c588192012-04-11 10:48:42 -07004056 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004057
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004058 if (cmd_len < sizeof(*req))
4059 return -EPROTO;
4060
Linus Torvalds1da177e2005-04-16 15:20:36 -07004061 dcid = __le16_to_cpu(req->dcid);
4062 flags = __le16_to_cpu(req->flags);
4063
4064 BT_DBG("dcid 0x%4.4x flags 0x%2.2x", dcid, flags);
4065
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004066 chan = l2cap_get_chan_by_scid(conn, dcid);
Johan Hedberg662d6522013-10-16 11:20:47 +03004067 if (!chan) {
4068 cmd_reject_invalid_cid(conn, cmd->ident, dcid, 0);
4069 return 0;
4070 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004071
David S. Miller033b1142011-07-21 13:38:42 -07004072 if (chan->state != BT_CONFIG && chan->state != BT_CONNECT2) {
Johan Hedberg662d6522013-10-16 11:20:47 +03004073 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4074 chan->dcid);
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004075 goto unlock;
Gustavo F. Padovandf6bd742010-06-14 02:26:15 -03004076 }
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004077
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004078 /* Reject if config buffer is too small. */
Al Viro88219a02007-07-29 00:17:25 -07004079 len = cmd_len - sizeof(*req);
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004080 if (chan->conf_len + len > sizeof(chan->conf_req)) {
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004081 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004082 l2cap_build_conf_rsp(chan, rsp,
4083 L2CAP_CONF_REJECT, flags), rsp);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004084 goto unlock;
4085 }
4086
4087 /* Store config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004088 memcpy(chan->conf_req + chan->conf_len, req->data, len);
4089 chan->conf_len += len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004090
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004091 if (flags & L2CAP_CONF_FLAG_CONTINUATION) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004092 /* Incomplete config. Send empty response. */
4093 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004094 l2cap_build_conf_rsp(chan, rsp,
4095 L2CAP_CONF_SUCCESS, flags), rsp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004096 goto unlock;
4097 }
4098
4099 /* Complete config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004100 len = l2cap_parse_conf_req(chan, rsp);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004101 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004102 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004103 goto unlock;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004104 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004105
Mat Martineau1500109b2012-10-23 15:24:15 -07004106 chan->ident = cmd->ident;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004107 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004108 chan->num_conf_rsp++;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004109
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004110 /* Reset config buffer. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004111 chan->conf_len = 0;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004112
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004113 if (!test_bit(CONF_OUTPUT_DONE, &chan->conf_state))
Marcel Holtmann876d9482007-10-20 13:35:42 +02004114 goto unlock;
4115
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004116 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004117 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004118
Mat Martineau105bdf92012-04-27 16:50:48 -07004119 if (chan->mode == L2CAP_MODE_ERTM ||
4120 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004121 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004122
Mat Martineau3c588192012-04-11 10:48:42 -07004123 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004124 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004125 else
4126 l2cap_chan_ready(chan);
4127
Marcel Holtmann876d9482007-10-20 13:35:42 +02004128 goto unlock;
4129 }
4130
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004131 if (!test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02004132 u8 buf[64];
Linus Torvalds1da177e2005-04-16 15:20:36 -07004133 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004134 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004135 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004136 }
4137
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004138 /* Got Conf Rsp PENDING from remote side and asume we sent
4139 Conf Rsp PENDING in the code above */
4140 if (test_bit(CONF_REM_CONF_PEND, &chan->conf_state) &&
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03004141 test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004142
4143 /* check compatibility */
4144
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004145 /* Send rsp for BR/EDR channel */
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004146 if (!chan->hs_hcon)
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004147 l2cap_send_efs_conf_rsp(chan, rsp, cmd->ident, flags);
4148 else
4149 chan->ident = cmd->ident;
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004150 }
4151
Linus Torvalds1da177e2005-04-16 15:20:36 -07004152unlock:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004153 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004154 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004155}
4156
Gustavo Padovan2d792812012-10-06 10:07:01 +01004157static inline int l2cap_config_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004158 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4159 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004160{
4161 struct l2cap_conf_rsp *rsp = (struct l2cap_conf_rsp *)data;
4162 u16 scid, flags, result;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004163 struct l2cap_chan *chan;
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004164 int len = cmd_len - sizeof(*rsp);
Mat Martineau3c588192012-04-11 10:48:42 -07004165 int err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004166
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004167 if (cmd_len < sizeof(*rsp))
4168 return -EPROTO;
4169
Linus Torvalds1da177e2005-04-16 15:20:36 -07004170 scid = __le16_to_cpu(rsp->scid);
4171 flags = __le16_to_cpu(rsp->flags);
4172 result = __le16_to_cpu(rsp->result);
4173
Andrei Emeltchenko61386cb2012-03-12 12:13:07 +02004174 BT_DBG("scid 0x%4.4x flags 0x%2.2x result 0x%2.2x len %d", scid, flags,
4175 result, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004176
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004177 chan = l2cap_get_chan_by_scid(conn, scid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004178 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004179 return 0;
4180
4181 switch (result) {
4182 case L2CAP_CONF_SUCCESS:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004183 l2cap_conf_rfc_get(chan, rsp->data, len);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004184 clear_bit(CONF_REM_CONF_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004185 break;
4186
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004187 case L2CAP_CONF_PENDING:
4188 set_bit(CONF_REM_CONF_PEND, &chan->conf_state);
4189
4190 if (test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
4191 char buf[64];
4192
4193 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004194 buf, &result);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004195 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004196 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004197 goto done;
4198 }
4199
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004200 if (!chan->hs_hcon) {
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004201 l2cap_send_efs_conf_rsp(chan, buf, cmd->ident,
4202 0);
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02004203 } else {
4204 if (l2cap_check_efs(chan)) {
4205 amp_create_logical_link(chan);
4206 chan->ident = cmd->ident;
4207 }
4208 }
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004209 }
4210 goto done;
4211
Linus Torvalds1da177e2005-04-16 15:20:36 -07004212 case L2CAP_CONF_UNACCEPT:
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004213 if (chan->num_conf_rsp <= L2CAP_CONF_MAX_CONF_RSP) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004214 char req[64];
4215
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004216 if (len > sizeof(req) - sizeof(struct l2cap_conf_req)) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004217 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004218 goto done;
4219 }
4220
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004221 /* throw out any old stored conf requests */
4222 result = L2CAP_CONF_SUCCESS;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03004223 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004224 req, &result);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004225 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004226 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004227 goto done;
4228 }
4229
4230 l2cap_send_cmd(conn, l2cap_get_ident(conn),
Gustavo Padovan2d792812012-10-06 10:07:01 +01004231 L2CAP_CONF_REQ, len, req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004232 chan->num_conf_req++;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004233 if (result != L2CAP_CONF_SUCCESS)
4234 goto done;
4235 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004236 }
4237
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09004238 default:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004239 l2cap_chan_set_err(chan, ECONNRESET);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +02004240
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08004241 __set_chan_timer(chan, L2CAP_DISC_REJ_TIMEOUT);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004242 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004243 goto done;
4244 }
4245
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004246 if (flags & L2CAP_CONF_FLAG_CONTINUATION)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004247 goto done;
4248
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004249 set_bit(CONF_INPUT_DONE, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004250
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004251 if (test_bit(CONF_OUTPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004252 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004253
Mat Martineau105bdf92012-04-27 16:50:48 -07004254 if (chan->mode == L2CAP_MODE_ERTM ||
4255 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004256 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004257
Mat Martineau3c588192012-04-11 10:48:42 -07004258 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004259 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004260 else
4261 l2cap_chan_ready(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004262 }
4263
4264done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004265 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004266 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004267}
4268
Gustavo Padovan2d792812012-10-06 10:07:01 +01004269static inline int l2cap_disconnect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004270 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4271 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004272{
4273 struct l2cap_disconn_req *req = (struct l2cap_disconn_req *) data;
4274 struct l2cap_disconn_rsp rsp;
4275 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004276 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004277
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004278 if (cmd_len != sizeof(*req))
4279 return -EPROTO;
4280
Linus Torvalds1da177e2005-04-16 15:20:36 -07004281 scid = __le16_to_cpu(req->scid);
4282 dcid = __le16_to_cpu(req->dcid);
4283
4284 BT_DBG("scid 0x%4.4x dcid 0x%4.4x", scid, dcid);
4285
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004286 mutex_lock(&conn->chan_lock);
4287
4288 chan = __l2cap_get_chan_by_scid(conn, dcid);
4289 if (!chan) {
4290 mutex_unlock(&conn->chan_lock);
Johan Hedberg662d6522013-10-16 11:20:47 +03004291 cmd_reject_invalid_cid(conn, cmd->ident, dcid, scid);
4292 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004293 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004294
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004295 l2cap_chan_lock(chan);
4296
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03004297 rsp.dcid = cpu_to_le16(chan->scid);
4298 rsp.scid = cpu_to_le16(chan->dcid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004299 l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp);
4300
Gustavo Padovan5ec1bbe2013-10-15 19:24:48 -03004301 chan->ops->set_shutdown(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004302
Mat Martineau61d6ef32012-04-27 16:50:50 -07004303 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004304 l2cap_chan_del(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004305
4306 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004307
Gustavo Padovan80b98022012-05-27 22:27:51 -03004308 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004309 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004310
4311 mutex_unlock(&conn->chan_lock);
4312
Linus Torvalds1da177e2005-04-16 15:20:36 -07004313 return 0;
4314}
4315
Gustavo Padovan2d792812012-10-06 10:07:01 +01004316static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004317 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4318 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004319{
4320 struct l2cap_disconn_rsp *rsp = (struct l2cap_disconn_rsp *) data;
4321 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004322 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004323
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004324 if (cmd_len != sizeof(*rsp))
4325 return -EPROTO;
4326
Linus Torvalds1da177e2005-04-16 15:20:36 -07004327 scid = __le16_to_cpu(rsp->scid);
4328 dcid = __le16_to_cpu(rsp->dcid);
4329
4330 BT_DBG("dcid 0x%4.4x scid 0x%4.4x", dcid, scid);
4331
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004332 mutex_lock(&conn->chan_lock);
4333
4334 chan = __l2cap_get_chan_by_scid(conn, scid);
4335 if (!chan) {
4336 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004337 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004338 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004339
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004340 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004341
Mat Martineau61d6ef32012-04-27 16:50:50 -07004342 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004343 l2cap_chan_del(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004344
4345 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004346
Gustavo Padovan80b98022012-05-27 22:27:51 -03004347 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004348 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004349
4350 mutex_unlock(&conn->chan_lock);
4351
Linus Torvalds1da177e2005-04-16 15:20:36 -07004352 return 0;
4353}
4354
Gustavo Padovan2d792812012-10-06 10:07:01 +01004355static inline int l2cap_information_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004356 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4357 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004358{
4359 struct l2cap_info_req *req = (struct l2cap_info_req *) data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004360 u16 type;
4361
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004362 if (cmd_len != sizeof(*req))
4363 return -EPROTO;
4364
Linus Torvalds1da177e2005-04-16 15:20:36 -07004365 type = __le16_to_cpu(req->type);
4366
4367 BT_DBG("type 0x%4.4x", type);
4368
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004369 if (type == L2CAP_IT_FEAT_MASK) {
4370 u8 buf[8];
Marcel Holtmann44dd46d2009-05-02 19:09:01 -07004371 u32 feat_mask = l2cap_feat_mask;
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004372 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004373 rsp->type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
4374 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03004375 if (!disable_ertm)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004376 feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING
Gustavo Padovan2d792812012-10-06 10:07:01 +01004377 | L2CAP_FEAT_FCS;
Marcel Holtmann848566b2013-10-01 22:59:22 -07004378 if (conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03004379 feat_mask |= L2CAP_FEAT_EXT_FLOW
Gustavo Padovan2d792812012-10-06 10:07:01 +01004380 | L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenkoa5fd6f32011-09-16 16:26:32 +03004381
Gustavo F. Padovan1b7bf4e2009-08-24 00:45:20 -03004382 put_unaligned_le32(feat_mask, rsp->data);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004383 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4384 buf);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004385 } else if (type == L2CAP_IT_FIXED_CHAN) {
4386 u8 buf[12];
4387 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Mat Martineau50a147c2011-11-02 16:18:34 -07004388
Marcel Holtmann848566b2013-10-01 22:59:22 -07004389 if (conn->hs_enabled)
Mat Martineau50a147c2011-11-02 16:18:34 -07004390 l2cap_fixed_chan[0] |= L2CAP_FC_A2MP;
4391 else
4392 l2cap_fixed_chan[0] &= ~L2CAP_FC_A2MP;
4393
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004394 rsp->type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
4395 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Andrei Emeltchenkoc6337ea2011-10-20 17:02:44 +03004396 memcpy(rsp->data, l2cap_fixed_chan, sizeof(l2cap_fixed_chan));
Gustavo Padovan2d792812012-10-06 10:07:01 +01004397 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4398 buf);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004399 } else {
4400 struct l2cap_info_rsp rsp;
4401 rsp.type = cpu_to_le16(type);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004402 rsp.result = cpu_to_le16(L2CAP_IR_NOTSUPP);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004403 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(rsp),
4404 &rsp);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004405 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004406
4407 return 0;
4408}
4409
Gustavo Padovan2d792812012-10-06 10:07:01 +01004410static inline int l2cap_information_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004411 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4412 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004413{
4414 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) data;
4415 u16 type, result;
4416
Jaganath Kanakkassery3f6fa3d2013-06-21 19:55:11 +05304417 if (cmd_len < sizeof(*rsp))
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004418 return -EPROTO;
4419
Linus Torvalds1da177e2005-04-16 15:20:36 -07004420 type = __le16_to_cpu(rsp->type);
4421 result = __le16_to_cpu(rsp->result);
4422
4423 BT_DBG("type 0x%4.4x result 0x%2.2x", type, result);
4424
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004425 /* L2CAP Info req/rsp are unbound to channels, add extra checks */
4426 if (cmd->ident != conn->info_ident ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01004427 conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004428 return 0;
4429
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02004430 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004431
Ville Tervoadb08ed2010-08-04 09:43:33 +03004432 if (result != L2CAP_IR_SUCCESS) {
4433 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4434 conn->info_ident = 0;
4435
4436 l2cap_conn_start(conn);
4437
4438 return 0;
4439 }
4440
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004441 switch (type) {
4442 case L2CAP_IT_FEAT_MASK:
Harvey Harrison83985312008-05-02 16:25:46 -07004443 conn->feat_mask = get_unaligned_le32(rsp->data);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004444
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07004445 if (conn->feat_mask & L2CAP_FEAT_FIXED_CHAN) {
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004446 struct l2cap_info_req req;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004447 req.type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004448
4449 conn->info_ident = l2cap_get_ident(conn);
4450
4451 l2cap_send_cmd(conn, conn->info_ident,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004452 L2CAP_INFO_REQ, sizeof(req), &req);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004453 } else {
4454 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4455 conn->info_ident = 0;
4456
4457 l2cap_conn_start(conn);
4458 }
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004459 break;
4460
4461 case L2CAP_IT_FIXED_CHAN:
4462 conn->fixed_chan_mask = rsp->data[0];
Marcel Holtmann984947d2009-02-06 23:35:19 +01004463 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004464 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004465
4466 l2cap_conn_start(conn);
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004467 break;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004468 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004469
Linus Torvalds1da177e2005-04-16 15:20:36 -07004470 return 0;
4471}
4472
Mat Martineau17009152012-10-23 15:24:07 -07004473static int l2cap_create_channel_req(struct l2cap_conn *conn,
4474 struct l2cap_cmd_hdr *cmd,
4475 u16 cmd_len, void *data)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004476{
4477 struct l2cap_create_chan_req *req = data;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004478 struct l2cap_create_chan_rsp rsp;
Mat Martineau17009152012-10-23 15:24:07 -07004479 struct l2cap_chan *chan;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004480 struct hci_dev *hdev;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004481 u16 psm, scid;
4482
4483 if (cmd_len != sizeof(*req))
4484 return -EPROTO;
4485
Marcel Holtmann848566b2013-10-01 22:59:22 -07004486 if (!conn->hs_enabled)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004487 return -EINVAL;
4488
4489 psm = le16_to_cpu(req->psm);
4490 scid = le16_to_cpu(req->scid);
4491
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004492 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 -07004493
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004494 /* For controller id 0 make BR/EDR connection */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004495 if (req->amp_id == AMP_ID_BREDR) {
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004496 l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4497 req->amp_id);
4498 return 0;
4499 }
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004500
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004501 /* Validate AMP controller id */
4502 hdev = hci_dev_get(req->amp_id);
4503 if (!hdev)
4504 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004505
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004506 if (hdev->dev_type != HCI_AMP || !test_bit(HCI_UP, &hdev->flags)) {
Mat Martineau17009152012-10-23 15:24:07 -07004507 hci_dev_put(hdev);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004508 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004509 }
4510
4511 chan = l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4512 req->amp_id);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004513 if (chan) {
4514 struct amp_mgr *mgr = conn->hcon->amp_mgr;
4515 struct hci_conn *hs_hcon;
4516
Marcel Holtmann98e0f7e2013-10-13 02:23:40 -07004517 hs_hcon = hci_conn_hash_lookup_ba(hdev, AMP_LINK,
4518 &conn->hcon->dst);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004519 if (!hs_hcon) {
4520 hci_dev_put(hdev);
Johan Hedberg662d6522013-10-16 11:20:47 +03004521 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4522 chan->dcid);
4523 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004524 }
4525
4526 BT_DBG("mgr %p bredr_chan %p hs_hcon %p", mgr, chan, hs_hcon);
4527
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004528 mgr->bredr_chan = chan;
4529 chan->hs_hcon = hs_hcon;
Andrei Emeltchenkofd45bf42012-11-20 17:16:22 +02004530 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004531 conn->mtu = hdev->block_mtu;
4532 }
4533
4534 hci_dev_put(hdev);
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004535
4536 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004537
4538error:
4539 rsp.dcid = 0;
4540 rsp.scid = cpu_to_le16(scid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004541 rsp.result = cpu_to_le16(L2CAP_CR_BAD_AMP);
4542 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004543
4544 l2cap_send_cmd(conn, cmd->ident, L2CAP_CREATE_CHAN_RSP,
4545 sizeof(rsp), &rsp);
4546
Johan Hedbergdc280802013-09-16 13:05:13 +03004547 return 0;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004548}
4549
Mat Martineau8eb200b2012-10-23 15:24:17 -07004550static void l2cap_send_move_chan_req(struct l2cap_chan *chan, u8 dest_amp_id)
4551{
4552 struct l2cap_move_chan_req req;
4553 u8 ident;
4554
4555 BT_DBG("chan %p, dest_amp_id %d", chan, dest_amp_id);
4556
4557 ident = l2cap_get_ident(chan->conn);
4558 chan->ident = ident;
4559
4560 req.icid = cpu_to_le16(chan->scid);
4561 req.dest_amp_id = dest_amp_id;
4562
4563 l2cap_send_cmd(chan->conn, ident, L2CAP_MOVE_CHAN_REQ, sizeof(req),
4564 &req);
4565
4566 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4567}
4568
Mat Martineau1500109b2012-10-23 15:24:15 -07004569static void l2cap_send_move_chan_rsp(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004570{
4571 struct l2cap_move_chan_rsp rsp;
4572
Mat Martineau1500109b2012-10-23 15:24:15 -07004573 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004574
Mat Martineau1500109b2012-10-23 15:24:15 -07004575 rsp.icid = cpu_to_le16(chan->dcid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004576 rsp.result = cpu_to_le16(result);
4577
Mat Martineau1500109b2012-10-23 15:24:15 -07004578 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_RSP,
4579 sizeof(rsp), &rsp);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004580}
4581
Mat Martineau5b155ef2012-10-23 15:24:14 -07004582static void l2cap_send_move_chan_cfm(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004583{
4584 struct l2cap_move_chan_cfm cfm;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004585
Mat Martineau5b155ef2012-10-23 15:24:14 -07004586 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004587
Mat Martineau5b155ef2012-10-23 15:24:14 -07004588 chan->ident = l2cap_get_ident(chan->conn);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004589
Mat Martineau5b155ef2012-10-23 15:24:14 -07004590 cfm.icid = cpu_to_le16(chan->scid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004591 cfm.result = cpu_to_le16(result);
4592
Mat Martineau5b155ef2012-10-23 15:24:14 -07004593 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_CFM,
4594 sizeof(cfm), &cfm);
4595
4596 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4597}
4598
4599static void l2cap_send_move_chan_cfm_icid(struct l2cap_conn *conn, u16 icid)
4600{
4601 struct l2cap_move_chan_cfm cfm;
4602
4603 BT_DBG("conn %p, icid 0x%4.4x", conn, icid);
4604
4605 cfm.icid = cpu_to_le16(icid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004606 cfm.result = cpu_to_le16(L2CAP_MC_UNCONFIRMED);
Mat Martineau5b155ef2012-10-23 15:24:14 -07004607
4608 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_MOVE_CHAN_CFM,
4609 sizeof(cfm), &cfm);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004610}
4611
4612static void l2cap_send_move_chan_cfm_rsp(struct l2cap_conn *conn, u8 ident,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004613 u16 icid)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004614{
4615 struct l2cap_move_chan_cfm_rsp rsp;
4616
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004617 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004618
4619 rsp.icid = cpu_to_le16(icid);
4620 l2cap_send_cmd(conn, ident, L2CAP_MOVE_CHAN_CFM_RSP, sizeof(rsp), &rsp);
4621}
4622
Mat Martineau5f3847a2012-10-23 15:24:12 -07004623static void __release_logical_link(struct l2cap_chan *chan)
4624{
4625 chan->hs_hchan = NULL;
4626 chan->hs_hcon = NULL;
4627
4628 /* Placeholder - release the logical link */
4629}
4630
Mat Martineau1500109b2012-10-23 15:24:15 -07004631static void l2cap_logical_fail(struct l2cap_chan *chan)
4632{
4633 /* Logical link setup failed */
4634 if (chan->state != BT_CONNECTED) {
4635 /* Create channel failure, disconnect */
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004636 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineau1500109b2012-10-23 15:24:15 -07004637 return;
4638 }
4639
4640 switch (chan->move_role) {
4641 case L2CAP_MOVE_ROLE_RESPONDER:
4642 l2cap_move_done(chan);
4643 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_SUPP);
4644 break;
4645 case L2CAP_MOVE_ROLE_INITIATOR:
4646 if (chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_COMP ||
4647 chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_CFM) {
4648 /* Remote has only sent pending or
4649 * success responses, clean up
4650 */
4651 l2cap_move_done(chan);
4652 }
4653
4654 /* Other amp move states imply that the move
4655 * has already aborted
4656 */
4657 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
4658 break;
4659 }
4660}
4661
4662static void l2cap_logical_finish_create(struct l2cap_chan *chan,
4663 struct hci_chan *hchan)
4664{
4665 struct l2cap_conf_rsp rsp;
Mat Martineau1500109b2012-10-23 15:24:15 -07004666
Andrei Emeltchenko336178a2012-10-31 15:46:27 +02004667 chan->hs_hchan = hchan;
Mat Martineau1500109b2012-10-23 15:24:15 -07004668 chan->hs_hcon->l2cap_data = chan->conn;
4669
Andrei Emeltchenko35ba9562012-10-25 15:20:43 +03004670 l2cap_send_efs_conf_rsp(chan, &rsp, chan->ident, 0);
Mat Martineau1500109b2012-10-23 15:24:15 -07004671
4672 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Andrei Emeltchenkofe79c6f2012-10-25 15:20:42 +03004673 int err;
Mat Martineau1500109b2012-10-23 15:24:15 -07004674
4675 set_default_fcs(chan);
4676
4677 err = l2cap_ertm_init(chan);
4678 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004679 l2cap_send_disconn_req(chan, -err);
Mat Martineau1500109b2012-10-23 15:24:15 -07004680 else
4681 l2cap_chan_ready(chan);
4682 }
4683}
4684
4685static void l2cap_logical_finish_move(struct l2cap_chan *chan,
4686 struct hci_chan *hchan)
4687{
4688 chan->hs_hcon = hchan->conn;
4689 chan->hs_hcon->l2cap_data = chan->conn;
4690
4691 BT_DBG("move_state %d", chan->move_state);
4692
4693 switch (chan->move_state) {
4694 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
4695 /* Move confirm will be sent after a success
4696 * response is received
4697 */
4698 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4699 break;
4700 case L2CAP_MOVE_WAIT_LOGICAL_CFM:
4701 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4702 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4703 } else if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
4704 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
4705 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
4706 } else if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4707 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4708 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4709 }
4710 break;
4711 default:
4712 /* Move was not in expected state, free the channel */
4713 __release_logical_link(chan);
4714
4715 chan->move_state = L2CAP_MOVE_STABLE;
4716 }
4717}
4718
4719/* Call with chan locked */
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004720void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan,
4721 u8 status)
Mat Martineau5b155ef2012-10-23 15:24:14 -07004722{
Mat Martineau1500109b2012-10-23 15:24:15 -07004723 BT_DBG("chan %p, hchan %p, status %d", chan, hchan, status);
4724
4725 if (status) {
4726 l2cap_logical_fail(chan);
4727 __release_logical_link(chan);
4728 return;
4729 }
4730
4731 if (chan->state != BT_CONNECTED) {
4732 /* Ignore logical link if channel is on BR/EDR */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004733 if (chan->local_amp_id != AMP_ID_BREDR)
Mat Martineau1500109b2012-10-23 15:24:15 -07004734 l2cap_logical_finish_create(chan, hchan);
4735 } else {
4736 l2cap_logical_finish_move(chan, hchan);
4737 }
Mat Martineau5b155ef2012-10-23 15:24:14 -07004738}
4739
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004740void l2cap_move_start(struct l2cap_chan *chan)
4741{
4742 BT_DBG("chan %p", chan);
4743
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004744 if (chan->local_amp_id == AMP_ID_BREDR) {
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004745 if (chan->chan_policy != BT_CHANNEL_POLICY_AMP_PREFERRED)
4746 return;
4747 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4748 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4749 /* Placeholder - start physical link setup */
4750 } else {
4751 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4752 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4753 chan->move_id = 0;
4754 l2cap_move_setup(chan);
4755 l2cap_send_move_chan_req(chan, 0);
4756 }
4757}
4758
Mat Martineau8eb200b2012-10-23 15:24:17 -07004759static void l2cap_do_create(struct l2cap_chan *chan, int result,
4760 u8 local_amp_id, u8 remote_amp_id)
4761{
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004762 BT_DBG("chan %p state %s %u -> %u", chan, state_to_string(chan->state),
4763 local_amp_id, remote_amp_id);
4764
Andrei Emeltchenko12d6cc62012-11-14 17:39:31 +02004765 chan->fcs = L2CAP_FCS_NONE;
4766
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004767 /* Outgoing channel on AMP */
4768 if (chan->state == BT_CONNECT) {
4769 if (result == L2CAP_CR_SUCCESS) {
4770 chan->local_amp_id = local_amp_id;
4771 l2cap_send_create_chan_req(chan, remote_amp_id);
4772 } else {
4773 /* Revert to BR/EDR connect */
4774 l2cap_send_conn_req(chan);
4775 }
4776
4777 return;
4778 }
4779
4780 /* Incoming channel on AMP */
4781 if (__l2cap_no_conn_pending(chan)) {
Mat Martineau8eb200b2012-10-23 15:24:17 -07004782 struct l2cap_conn_rsp rsp;
4783 char buf[128];
4784 rsp.scid = cpu_to_le16(chan->dcid);
4785 rsp.dcid = cpu_to_le16(chan->scid);
4786
Mat Martineau8eb200b2012-10-23 15:24:17 -07004787 if (result == L2CAP_CR_SUCCESS) {
4788 /* Send successful response */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004789 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
4790 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004791 } else {
4792 /* Send negative response */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004793 rsp.result = cpu_to_le16(L2CAP_CR_NO_MEM);
4794 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004795 }
4796
4797 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_RSP,
4798 sizeof(rsp), &rsp);
4799
4800 if (result == L2CAP_CR_SUCCESS) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02004801 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004802 set_bit(CONF_REQ_SENT, &chan->conf_state);
4803 l2cap_send_cmd(chan->conn, l2cap_get_ident(chan->conn),
4804 L2CAP_CONF_REQ,
4805 l2cap_build_conf_req(chan, buf), buf);
4806 chan->num_conf_req++;
4807 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004808 }
4809}
4810
4811static void l2cap_do_move_initiate(struct l2cap_chan *chan, u8 local_amp_id,
4812 u8 remote_amp_id)
4813{
4814 l2cap_move_setup(chan);
4815 chan->move_id = local_amp_id;
4816 chan->move_state = L2CAP_MOVE_WAIT_RSP;
4817
4818 l2cap_send_move_chan_req(chan, remote_amp_id);
4819}
4820
4821static void l2cap_do_move_respond(struct l2cap_chan *chan, int result)
4822{
4823 struct hci_chan *hchan = NULL;
4824
4825 /* Placeholder - get hci_chan for logical link */
4826
4827 if (hchan) {
4828 if (hchan->state == BT_CONNECTED) {
4829 /* Logical link is ready to go */
4830 chan->hs_hcon = hchan->conn;
4831 chan->hs_hcon->l2cap_data = chan->conn;
4832 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4833 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4834
4835 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
4836 } else {
4837 /* Wait for logical link to be ready */
4838 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4839 }
4840 } else {
4841 /* Logical link not available */
4842 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_ALLOWED);
4843 }
4844}
4845
4846static void l2cap_do_move_cancel(struct l2cap_chan *chan, int result)
4847{
4848 if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4849 u8 rsp_result;
4850 if (result == -EINVAL)
4851 rsp_result = L2CAP_MR_BAD_ID;
4852 else
4853 rsp_result = L2CAP_MR_NOT_ALLOWED;
4854
4855 l2cap_send_move_chan_rsp(chan, rsp_result);
4856 }
4857
4858 chan->move_role = L2CAP_MOVE_ROLE_NONE;
4859 chan->move_state = L2CAP_MOVE_STABLE;
4860
4861 /* Restart data transmission */
4862 l2cap_ertm_send(chan);
4863}
4864
Andrei Emeltchenkoa514b172012-11-14 17:39:30 +02004865/* Invoke with locked chan */
4866void __l2cap_physical_cfm(struct l2cap_chan *chan, int result)
Mat Martineau8eb200b2012-10-23 15:24:17 -07004867{
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004868 u8 local_amp_id = chan->local_amp_id;
Andrei Emeltchenkofffadc02012-11-01 15:37:03 +02004869 u8 remote_amp_id = chan->remote_amp_id;
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004870
Mat Martineau8eb200b2012-10-23 15:24:17 -07004871 BT_DBG("chan %p, result %d, local_amp_id %d, remote_amp_id %d",
4872 chan, result, local_amp_id, remote_amp_id);
4873
Mat Martineau8eb200b2012-10-23 15:24:17 -07004874 if (chan->state == BT_DISCONN || chan->state == BT_CLOSED) {
4875 l2cap_chan_unlock(chan);
4876 return;
4877 }
4878
4879 if (chan->state != BT_CONNECTED) {
4880 l2cap_do_create(chan, result, local_amp_id, remote_amp_id);
4881 } else if (result != L2CAP_MR_SUCCESS) {
4882 l2cap_do_move_cancel(chan, result);
4883 } else {
4884 switch (chan->move_role) {
4885 case L2CAP_MOVE_ROLE_INITIATOR:
4886 l2cap_do_move_initiate(chan, local_amp_id,
4887 remote_amp_id);
4888 break;
4889 case L2CAP_MOVE_ROLE_RESPONDER:
4890 l2cap_do_move_respond(chan, result);
4891 break;
4892 default:
4893 l2cap_do_move_cancel(chan, result);
4894 break;
4895 }
4896 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004897}
4898
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004899static inline int l2cap_move_channel_req(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004900 struct l2cap_cmd_hdr *cmd,
4901 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004902{
4903 struct l2cap_move_chan_req *req = data;
Mat Martineau1500109b2012-10-23 15:24:15 -07004904 struct l2cap_move_chan_rsp rsp;
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004905 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004906 u16 icid = 0;
4907 u16 result = L2CAP_MR_NOT_ALLOWED;
4908
4909 if (cmd_len != sizeof(*req))
4910 return -EPROTO;
4911
4912 icid = le16_to_cpu(req->icid);
4913
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004914 BT_DBG("icid 0x%4.4x, dest_amp_id %d", icid, req->dest_amp_id);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004915
Marcel Holtmann848566b2013-10-01 22:59:22 -07004916 if (!conn->hs_enabled)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004917 return -EINVAL;
4918
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004919 chan = l2cap_get_chan_by_dcid(conn, icid);
4920 if (!chan) {
Mat Martineau1500109b2012-10-23 15:24:15 -07004921 rsp.icid = cpu_to_le16(icid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004922 rsp.result = cpu_to_le16(L2CAP_MR_NOT_ALLOWED);
Mat Martineau1500109b2012-10-23 15:24:15 -07004923 l2cap_send_cmd(conn, cmd->ident, L2CAP_MOVE_CHAN_RSP,
4924 sizeof(rsp), &rsp);
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004925 return 0;
4926 }
4927
Mat Martineau1500109b2012-10-23 15:24:15 -07004928 chan->ident = cmd->ident;
4929
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004930 if (chan->scid < L2CAP_CID_DYN_START ||
4931 chan->chan_policy == BT_CHANNEL_POLICY_BREDR_ONLY ||
4932 (chan->mode != L2CAP_MODE_ERTM &&
4933 chan->mode != L2CAP_MODE_STREAMING)) {
4934 result = L2CAP_MR_NOT_ALLOWED;
4935 goto send_move_response;
4936 }
4937
4938 if (chan->local_amp_id == req->dest_amp_id) {
4939 result = L2CAP_MR_SAME_ID;
4940 goto send_move_response;
4941 }
4942
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004943 if (req->dest_amp_id != AMP_ID_BREDR) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004944 struct hci_dev *hdev;
4945 hdev = hci_dev_get(req->dest_amp_id);
4946 if (!hdev || hdev->dev_type != HCI_AMP ||
4947 !test_bit(HCI_UP, &hdev->flags)) {
4948 if (hdev)
4949 hci_dev_put(hdev);
4950
4951 result = L2CAP_MR_BAD_ID;
4952 goto send_move_response;
4953 }
4954 hci_dev_put(hdev);
4955 }
4956
4957 /* Detect a move collision. Only send a collision response
4958 * if this side has "lost", otherwise proceed with the move.
4959 * The winner has the larger bd_addr.
4960 */
4961 if ((__chan_is_moving(chan) ||
4962 chan->move_role != L2CAP_MOVE_ROLE_NONE) &&
Marcel Holtmann6f59b902013-10-13 05:24:01 -07004963 bacmp(&conn->hcon->src, &conn->hcon->dst) > 0) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004964 result = L2CAP_MR_COLLISION;
4965 goto send_move_response;
4966 }
4967
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004968 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
4969 l2cap_move_setup(chan);
4970 chan->move_id = req->dest_amp_id;
4971 icid = chan->dcid;
4972
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004973 if (req->dest_amp_id == AMP_ID_BREDR) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004974 /* Moving to BR/EDR */
4975 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4976 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4977 result = L2CAP_MR_PEND;
4978 } else {
4979 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4980 result = L2CAP_MR_SUCCESS;
4981 }
4982 } else {
4983 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4984 /* Placeholder - uncomment when amp functions are available */
4985 /*amp_accept_physical(chan, req->dest_amp_id);*/
4986 result = L2CAP_MR_PEND;
4987 }
4988
4989send_move_response:
Mat Martineau1500109b2012-10-23 15:24:15 -07004990 l2cap_send_move_chan_rsp(chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004991
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004992 l2cap_chan_unlock(chan);
4993
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004994 return 0;
4995}
4996
Mat Martineau5b155ef2012-10-23 15:24:14 -07004997static void l2cap_move_continue(struct l2cap_conn *conn, u16 icid, u16 result)
4998{
4999 struct l2cap_chan *chan;
5000 struct hci_chan *hchan = NULL;
5001
5002 chan = l2cap_get_chan_by_scid(conn, icid);
5003 if (!chan) {
5004 l2cap_send_move_chan_cfm_icid(conn, icid);
5005 return;
5006 }
5007
5008 __clear_chan_timer(chan);
5009 if (result == L2CAP_MR_PEND)
5010 __set_chan_timer(chan, L2CAP_MOVE_ERTX_TIMEOUT);
5011
5012 switch (chan->move_state) {
5013 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
5014 /* Move confirm will be sent when logical link
5015 * is complete.
5016 */
5017 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
5018 break;
5019 case L2CAP_MOVE_WAIT_RSP_SUCCESS:
5020 if (result == L2CAP_MR_PEND) {
5021 break;
5022 } else if (test_bit(CONN_LOCAL_BUSY,
5023 &chan->conn_state)) {
5024 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
5025 } else {
5026 /* Logical link is up or moving to BR/EDR,
5027 * proceed with move
5028 */
5029 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
5030 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
5031 }
5032 break;
5033 case L2CAP_MOVE_WAIT_RSP:
5034 /* Moving to AMP */
5035 if (result == L2CAP_MR_SUCCESS) {
5036 /* Remote is ready, send confirm immediately
5037 * after logical link is ready
5038 */
5039 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
5040 } else {
5041 /* Both logical link and move success
5042 * are required to confirm
5043 */
5044 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_COMP;
5045 }
5046
5047 /* Placeholder - get hci_chan for logical link */
5048 if (!hchan) {
5049 /* Logical link not available */
5050 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5051 break;
5052 }
5053
5054 /* If the logical link is not yet connected, do not
5055 * send confirmation.
5056 */
5057 if (hchan->state != BT_CONNECTED)
5058 break;
5059
5060 /* Logical link is already ready to go */
5061
5062 chan->hs_hcon = hchan->conn;
5063 chan->hs_hcon->l2cap_data = chan->conn;
5064
5065 if (result == L2CAP_MR_SUCCESS) {
5066 /* Can confirm now */
5067 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
5068 } else {
5069 /* Now only need move success
5070 * to confirm
5071 */
5072 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
5073 }
5074
5075 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
5076 break;
5077 default:
5078 /* Any other amp move state means the move failed. */
5079 chan->move_id = chan->local_amp_id;
5080 l2cap_move_done(chan);
5081 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5082 }
5083
5084 l2cap_chan_unlock(chan);
5085}
5086
5087static void l2cap_move_fail(struct l2cap_conn *conn, u8 ident, u16 icid,
5088 u16 result)
5089{
5090 struct l2cap_chan *chan;
5091
5092 chan = l2cap_get_chan_by_ident(conn, ident);
5093 if (!chan) {
5094 /* Could not locate channel, icid is best guess */
5095 l2cap_send_move_chan_cfm_icid(conn, icid);
5096 return;
5097 }
5098
5099 __clear_chan_timer(chan);
5100
5101 if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
5102 if (result == L2CAP_MR_COLLISION) {
5103 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
5104 } else {
5105 /* Cleanup - cancel move */
5106 chan->move_id = chan->local_amp_id;
5107 l2cap_move_done(chan);
5108 }
5109 }
5110
5111 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5112
5113 l2cap_chan_unlock(chan);
5114}
5115
5116static int l2cap_move_channel_rsp(struct l2cap_conn *conn,
5117 struct l2cap_cmd_hdr *cmd,
5118 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005119{
5120 struct l2cap_move_chan_rsp *rsp = data;
5121 u16 icid, result;
5122
5123 if (cmd_len != sizeof(*rsp))
5124 return -EPROTO;
5125
5126 icid = le16_to_cpu(rsp->icid);
5127 result = le16_to_cpu(rsp->result);
5128
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005129 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005130
Mat Martineau5b155ef2012-10-23 15:24:14 -07005131 if (result == L2CAP_MR_SUCCESS || result == L2CAP_MR_PEND)
5132 l2cap_move_continue(conn, icid, result);
5133 else
5134 l2cap_move_fail(conn, cmd->ident, icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005135
5136 return 0;
5137}
5138
Mat Martineau5f3847a2012-10-23 15:24:12 -07005139static int l2cap_move_channel_confirm(struct l2cap_conn *conn,
5140 struct l2cap_cmd_hdr *cmd,
5141 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005142{
5143 struct l2cap_move_chan_cfm *cfm = data;
Mat Martineau5f3847a2012-10-23 15:24:12 -07005144 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005145 u16 icid, result;
5146
5147 if (cmd_len != sizeof(*cfm))
5148 return -EPROTO;
5149
5150 icid = le16_to_cpu(cfm->icid);
5151 result = le16_to_cpu(cfm->result);
5152
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005153 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005154
Mat Martineau5f3847a2012-10-23 15:24:12 -07005155 chan = l2cap_get_chan_by_dcid(conn, icid);
5156 if (!chan) {
5157 /* Spec requires a response even if the icid was not found */
5158 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5159 return 0;
5160 }
5161
5162 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM) {
5163 if (result == L2CAP_MC_CONFIRMED) {
5164 chan->local_amp_id = chan->move_id;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005165 if (chan->local_amp_id == AMP_ID_BREDR)
Mat Martineau5f3847a2012-10-23 15:24:12 -07005166 __release_logical_link(chan);
5167 } else {
5168 chan->move_id = chan->local_amp_id;
5169 }
5170
5171 l2cap_move_done(chan);
5172 }
5173
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005174 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5175
Mat Martineau5f3847a2012-10-23 15:24:12 -07005176 l2cap_chan_unlock(chan);
5177
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005178 return 0;
5179}
5180
5181static inline int l2cap_move_channel_confirm_rsp(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005182 struct l2cap_cmd_hdr *cmd,
5183 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005184{
5185 struct l2cap_move_chan_cfm_rsp *rsp = data;
Mat Martineau3fd71a02012-10-23 15:24:16 -07005186 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005187 u16 icid;
5188
5189 if (cmd_len != sizeof(*rsp))
5190 return -EPROTO;
5191
5192 icid = le16_to_cpu(rsp->icid);
5193
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005194 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005195
Mat Martineau3fd71a02012-10-23 15:24:16 -07005196 chan = l2cap_get_chan_by_scid(conn, icid);
5197 if (!chan)
5198 return 0;
5199
5200 __clear_chan_timer(chan);
5201
5202 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM_RSP) {
5203 chan->local_amp_id = chan->move_id;
5204
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005205 if (chan->local_amp_id == AMP_ID_BREDR && chan->hs_hchan)
Mat Martineau3fd71a02012-10-23 15:24:16 -07005206 __release_logical_link(chan);
5207
5208 l2cap_move_done(chan);
5209 }
5210
5211 l2cap_chan_unlock(chan);
5212
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005213 return 0;
5214}
5215
Claudio Takahaside731152011-02-11 19:28:55 -02005216static inline int l2cap_conn_param_update_req(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005217 struct l2cap_cmd_hdr *cmd,
Johan Hedberg203e6392013-05-15 10:07:15 +03005218 u16 cmd_len, u8 *data)
Claudio Takahaside731152011-02-11 19:28:55 -02005219{
5220 struct hci_conn *hcon = conn->hcon;
5221 struct l2cap_conn_param_update_req *req;
5222 struct l2cap_conn_param_update_rsp rsp;
Johan Hedberg203e6392013-05-15 10:07:15 +03005223 u16 min, max, latency, to_multiplier;
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005224 int err;
Claudio Takahaside731152011-02-11 19:28:55 -02005225
Johan Hedberg4dae2792014-06-24 17:03:50 +03005226 if (!test_bit(HCI_CONN_MASTER, &hcon->flags))
Claudio Takahaside731152011-02-11 19:28:55 -02005227 return -EINVAL;
5228
Claudio Takahaside731152011-02-11 19:28:55 -02005229 if (cmd_len != sizeof(struct l2cap_conn_param_update_req))
5230 return -EPROTO;
5231
5232 req = (struct l2cap_conn_param_update_req *) data;
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03005233 min = __le16_to_cpu(req->min);
5234 max = __le16_to_cpu(req->max);
Claudio Takahaside731152011-02-11 19:28:55 -02005235 latency = __le16_to_cpu(req->latency);
5236 to_multiplier = __le16_to_cpu(req->to_multiplier);
5237
5238 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 +01005239 min, max, latency, to_multiplier);
Claudio Takahaside731152011-02-11 19:28:55 -02005240
5241 memset(&rsp, 0, sizeof(rsp));
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005242
Andre Guedesd4905f22014-06-25 21:52:52 -03005243 err = hci_check_conn_params(min, max, latency, to_multiplier);
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005244 if (err)
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005245 rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_REJECTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005246 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005247 rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_ACCEPTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005248
5249 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONN_PARAM_UPDATE_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005250 sizeof(rsp), &rsp);
Claudio Takahaside731152011-02-11 19:28:55 -02005251
Andre Guedesffb5a8272014-07-01 18:10:11 -03005252 if (!err) {
5253 mgmt_new_conn_param(hcon->hdev, &hcon->dst, hcon->dst_type,
5254 min, max, latency, to_multiplier);
5255
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005256 hci_le_conn_update(hcon, min, max, latency, to_multiplier);
Andre Guedesffb5a8272014-07-01 18:10:11 -03005257 }
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005258
Claudio Takahaside731152011-02-11 19:28:55 -02005259 return 0;
5260}
5261
Johan Hedbergf1496de2013-05-13 14:15:56 +03005262static int l2cap_le_connect_rsp(struct l2cap_conn *conn,
5263 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5264 u8 *data)
5265{
5266 struct l2cap_le_conn_rsp *rsp = (struct l2cap_le_conn_rsp *) data;
5267 u16 dcid, mtu, mps, credits, result;
5268 struct l2cap_chan *chan;
5269 int err;
5270
5271 if (cmd_len < sizeof(*rsp))
5272 return -EPROTO;
5273
5274 dcid = __le16_to_cpu(rsp->dcid);
5275 mtu = __le16_to_cpu(rsp->mtu);
5276 mps = __le16_to_cpu(rsp->mps);
5277 credits = __le16_to_cpu(rsp->credits);
5278 result = __le16_to_cpu(rsp->result);
5279
5280 if (result == L2CAP_CR_SUCCESS && (mtu < 23 || mps < 23))
5281 return -EPROTO;
5282
5283 BT_DBG("dcid 0x%4.4x mtu %u mps %u credits %u result 0x%2.2x",
5284 dcid, mtu, mps, credits, result);
5285
5286 mutex_lock(&conn->chan_lock);
5287
5288 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5289 if (!chan) {
5290 err = -EBADSLT;
5291 goto unlock;
5292 }
5293
5294 err = 0;
5295
5296 l2cap_chan_lock(chan);
5297
5298 switch (result) {
5299 case L2CAP_CR_SUCCESS:
5300 chan->ident = 0;
5301 chan->dcid = dcid;
5302 chan->omtu = mtu;
5303 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005304 chan->tx_credits = credits;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005305 l2cap_chan_ready(chan);
5306 break;
5307
5308 default:
5309 l2cap_chan_del(chan, ECONNREFUSED);
5310 break;
5311 }
5312
5313 l2cap_chan_unlock(chan);
5314
5315unlock:
5316 mutex_unlock(&conn->chan_lock);
5317
5318 return err;
5319}
5320
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005321static inline int l2cap_bredr_sig_cmd(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005322 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5323 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005324{
5325 int err = 0;
5326
5327 switch (cmd->code) {
5328 case L2CAP_COMMAND_REJ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005329 l2cap_command_rej(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005330 break;
5331
5332 case L2CAP_CONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005333 err = l2cap_connect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005334 break;
5335
5336 case L2CAP_CONN_RSP:
Mat Martineauf5a25982012-10-11 17:48:21 +03005337 case L2CAP_CREATE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005338 l2cap_connect_create_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005339 break;
5340
5341 case L2CAP_CONF_REQ:
5342 err = l2cap_config_req(conn, cmd, cmd_len, data);
5343 break;
5344
5345 case L2CAP_CONF_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005346 l2cap_config_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005347 break;
5348
5349 case L2CAP_DISCONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005350 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005351 break;
5352
5353 case L2CAP_DISCONN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005354 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005355 break;
5356
5357 case L2CAP_ECHO_REQ:
5358 l2cap_send_cmd(conn, cmd->ident, L2CAP_ECHO_RSP, cmd_len, data);
5359 break;
5360
5361 case L2CAP_ECHO_RSP:
5362 break;
5363
5364 case L2CAP_INFO_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005365 err = l2cap_information_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005366 break;
5367
5368 case L2CAP_INFO_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005369 l2cap_information_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005370 break;
5371
Mat Martineauf94ff6f2011-11-02 16:18:32 -07005372 case L2CAP_CREATE_CHAN_REQ:
5373 err = l2cap_create_channel_req(conn, cmd, cmd_len, data);
5374 break;
5375
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005376 case L2CAP_MOVE_CHAN_REQ:
5377 err = l2cap_move_channel_req(conn, cmd, cmd_len, data);
5378 break;
5379
5380 case L2CAP_MOVE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005381 l2cap_move_channel_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005382 break;
5383
5384 case L2CAP_MOVE_CHAN_CFM:
5385 err = l2cap_move_channel_confirm(conn, cmd, cmd_len, data);
5386 break;
5387
5388 case L2CAP_MOVE_CHAN_CFM_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005389 l2cap_move_channel_confirm_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005390 break;
5391
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005392 default:
5393 BT_ERR("Unknown BR/EDR signaling command 0x%2.2x", cmd->code);
5394 err = -EINVAL;
5395 break;
5396 }
5397
5398 return err;
5399}
5400
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005401static int l2cap_le_connect_req(struct l2cap_conn *conn,
5402 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5403 u8 *data)
5404{
5405 struct l2cap_le_conn_req *req = (struct l2cap_le_conn_req *) data;
5406 struct l2cap_le_conn_rsp rsp;
5407 struct l2cap_chan *chan, *pchan;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005408 u16 dcid, scid, credits, mtu, mps;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005409 __le16 psm;
5410 u8 result;
5411
5412 if (cmd_len != sizeof(*req))
5413 return -EPROTO;
5414
5415 scid = __le16_to_cpu(req->scid);
5416 mtu = __le16_to_cpu(req->mtu);
5417 mps = __le16_to_cpu(req->mps);
5418 psm = req->psm;
5419 dcid = 0;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005420 credits = 0;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005421
5422 if (mtu < 23 || mps < 23)
5423 return -EPROTO;
5424
5425 BT_DBG("psm 0x%2.2x scid 0x%4.4x mtu %u mps %u", __le16_to_cpu(psm),
5426 scid, mtu, mps);
5427
5428 /* Check if we have socket listening on psm */
5429 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
5430 &conn->hcon->dst, LE_LINK);
5431 if (!pchan) {
5432 result = L2CAP_CR_BAD_PSM;
5433 chan = NULL;
5434 goto response;
5435 }
5436
5437 mutex_lock(&conn->chan_lock);
5438 l2cap_chan_lock(pchan);
5439
5440 if (!smp_sufficient_security(conn->hcon, pchan->sec_level)) {
5441 result = L2CAP_CR_AUTHENTICATION;
5442 chan = NULL;
5443 goto response_unlock;
5444 }
5445
5446 /* Check if we already have channel with that dcid */
5447 if (__l2cap_get_chan_by_dcid(conn, scid)) {
5448 result = L2CAP_CR_NO_MEM;
5449 chan = NULL;
5450 goto response_unlock;
5451 }
5452
5453 chan = pchan->ops->new_connection(pchan);
5454 if (!chan) {
5455 result = L2CAP_CR_NO_MEM;
5456 goto response_unlock;
5457 }
5458
Johan Hedberg0ce43ce2013-12-05 14:55:33 +02005459 l2cap_le_flowctl_init(chan);
5460
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005461 bacpy(&chan->src, &conn->hcon->src);
5462 bacpy(&chan->dst, &conn->hcon->dst);
5463 chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type);
5464 chan->dst_type = bdaddr_type(conn->hcon, conn->hcon->dst_type);
5465 chan->psm = psm;
5466 chan->dcid = scid;
5467 chan->omtu = mtu;
5468 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005469 chan->tx_credits = __le16_to_cpu(req->credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005470
5471 __l2cap_chan_add(conn, chan);
5472 dcid = chan->scid;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005473 credits = chan->rx_credits;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005474
5475 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
5476
5477 chan->ident = cmd->ident;
5478
5479 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
5480 l2cap_state_change(chan, BT_CONNECT2);
5481 result = L2CAP_CR_PEND;
5482 chan->ops->defer(chan);
5483 } else {
5484 l2cap_chan_ready(chan);
5485 result = L2CAP_CR_SUCCESS;
5486 }
5487
5488response_unlock:
5489 l2cap_chan_unlock(pchan);
5490 mutex_unlock(&conn->chan_lock);
5491
5492 if (result == L2CAP_CR_PEND)
5493 return 0;
5494
5495response:
5496 if (chan) {
5497 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02005498 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005499 } else {
5500 rsp.mtu = 0;
5501 rsp.mps = 0;
5502 }
5503
5504 rsp.dcid = cpu_to_le16(dcid);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005505 rsp.credits = cpu_to_le16(credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005506 rsp.result = cpu_to_le16(result);
5507
5508 l2cap_send_cmd(conn, cmd->ident, L2CAP_LE_CONN_RSP, sizeof(rsp), &rsp);
5509
5510 return 0;
5511}
5512
Johan Hedbergfad5fc892013-12-05 09:45:01 +02005513static inline int l2cap_le_credits(struct l2cap_conn *conn,
5514 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5515 u8 *data)
5516{
5517 struct l2cap_le_credits *pkt;
5518 struct l2cap_chan *chan;
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005519 u16 cid, credits, max_credits;
Johan Hedbergfad5fc892013-12-05 09:45:01 +02005520
5521 if (cmd_len != sizeof(*pkt))
5522 return -EPROTO;
5523
5524 pkt = (struct l2cap_le_credits *) data;
5525 cid = __le16_to_cpu(pkt->cid);
5526 credits = __le16_to_cpu(pkt->credits);
5527
5528 BT_DBG("cid 0x%4.4x credits 0x%4.4x", cid, credits);
5529
5530 chan = l2cap_get_chan_by_dcid(conn, cid);
5531 if (!chan)
5532 return -EBADSLT;
5533
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005534 max_credits = LE_FLOWCTL_MAX_CREDITS - chan->tx_credits;
5535 if (credits > max_credits) {
5536 BT_ERR("LE credits overflow");
5537 l2cap_send_disconn_req(chan, ECONNRESET);
5538
5539 /* Return 0 so that we don't trigger an unnecessary
5540 * command reject packet.
5541 */
5542 return 0;
5543 }
5544
Johan Hedbergfad5fc892013-12-05 09:45:01 +02005545 chan->tx_credits += credits;
5546
5547 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
5548 l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
5549 chan->tx_credits--;
5550 }
5551
5552 if (chan->tx_credits)
5553 chan->ops->resume(chan);
5554
5555 l2cap_chan_unlock(chan);
5556
5557 return 0;
5558}
5559
Johan Hedberg71fb4192013-12-10 10:52:48 +02005560static inline int l2cap_le_command_rej(struct l2cap_conn *conn,
5561 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5562 u8 *data)
5563{
5564 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
5565 struct l2cap_chan *chan;
5566
5567 if (cmd_len < sizeof(*rej))
5568 return -EPROTO;
5569
5570 mutex_lock(&conn->chan_lock);
5571
5572 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5573 if (!chan)
5574 goto done;
5575
5576 l2cap_chan_lock(chan);
5577 l2cap_chan_del(chan, ECONNREFUSED);
5578 l2cap_chan_unlock(chan);
5579
5580done:
5581 mutex_unlock(&conn->chan_lock);
5582 return 0;
5583}
5584
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005585static inline int l2cap_le_sig_cmd(struct l2cap_conn *conn,
Johan Hedberg203e6392013-05-15 10:07:15 +03005586 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5587 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005588{
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005589 int err = 0;
5590
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005591 switch (cmd->code) {
5592 case L2CAP_COMMAND_REJ:
Johan Hedberg71fb4192013-12-10 10:52:48 +02005593 l2cap_le_command_rej(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005594 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005595
5596 case L2CAP_CONN_PARAM_UPDATE_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005597 err = l2cap_conn_param_update_req(conn, cmd, cmd_len, data);
5598 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005599
5600 case L2CAP_CONN_PARAM_UPDATE_RSP:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005601 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005602
Johan Hedbergf1496de2013-05-13 14:15:56 +03005603 case L2CAP_LE_CONN_RSP:
5604 l2cap_le_connect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005605 break;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005606
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005607 case L2CAP_LE_CONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005608 err = l2cap_le_connect_req(conn, cmd, cmd_len, data);
5609 break;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005610
Johan Hedbergfad5fc892013-12-05 09:45:01 +02005611 case L2CAP_LE_CREDITS:
5612 err = l2cap_le_credits(conn, cmd, cmd_len, data);
5613 break;
5614
Johan Hedberg3defe012013-05-15 10:16:06 +03005615 case L2CAP_DISCONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005616 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
5617 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005618
5619 case L2CAP_DISCONN_RSP:
5620 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005621 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005622
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005623 default:
5624 BT_ERR("Unknown LE signaling command 0x%2.2x", cmd->code);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005625 err = -EINVAL;
5626 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005627 }
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005628
5629 return err;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005630}
5631
Johan Hedbergc5623552013-04-29 19:35:33 +03005632static inline void l2cap_le_sig_channel(struct l2cap_conn *conn,
5633 struct sk_buff *skb)
5634{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005635 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005636 struct l2cap_cmd_hdr *cmd;
5637 u16 len;
Johan Hedbergc5623552013-04-29 19:35:33 +03005638 int err;
5639
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005640 if (hcon->type != LE_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005641 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005642
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005643 if (skb->len < L2CAP_CMD_HDR_SIZE)
5644 goto drop;
Johan Hedbergc5623552013-04-29 19:35:33 +03005645
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005646 cmd = (void *) skb->data;
5647 skb_pull(skb, L2CAP_CMD_HDR_SIZE);
Johan Hedbergc5623552013-04-29 19:35:33 +03005648
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005649 len = le16_to_cpu(cmd->len);
Johan Hedbergc5623552013-04-29 19:35:33 +03005650
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005651 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd->code, len, cmd->ident);
Johan Hedbergc5623552013-04-29 19:35:33 +03005652
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005653 if (len != skb->len || !cmd->ident) {
5654 BT_DBG("corrupted command");
5655 goto drop;
5656 }
Johan Hedbergc5623552013-04-29 19:35:33 +03005657
Johan Hedberg203e6392013-05-15 10:07:15 +03005658 err = l2cap_le_sig_cmd(conn, cmd, len, skb->data);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005659 if (err) {
5660 struct l2cap_cmd_rej_unk rej;
Johan Hedbergc5623552013-04-29 19:35:33 +03005661
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005662 BT_ERR("Wrong link type (%d)", err);
Johan Hedbergc5623552013-04-29 19:35:33 +03005663
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005664 rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005665 l2cap_send_cmd(conn, cmd->ident, L2CAP_COMMAND_REJ,
5666 sizeof(rej), &rej);
Johan Hedbergc5623552013-04-29 19:35:33 +03005667 }
5668
Marcel Holtmann3b166292013-10-02 08:28:21 -07005669drop:
Johan Hedbergc5623552013-04-29 19:35:33 +03005670 kfree_skb(skb);
5671}
5672
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005673static inline void l2cap_sig_channel(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005674 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005675{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005676 struct hci_conn *hcon = conn->hcon;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005677 u8 *data = skb->data;
5678 int len = skb->len;
5679 struct l2cap_cmd_hdr cmd;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005680 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005681
5682 l2cap_raw_recv(conn, skb);
5683
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005684 if (hcon->type != ACL_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005685 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005686
Linus Torvalds1da177e2005-04-16 15:20:36 -07005687 while (len >= L2CAP_CMD_HDR_SIZE) {
Al Viro88219a02007-07-29 00:17:25 -07005688 u16 cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005689 memcpy(&cmd, data, L2CAP_CMD_HDR_SIZE);
5690 data += L2CAP_CMD_HDR_SIZE;
5691 len -= L2CAP_CMD_HDR_SIZE;
5692
Al Viro88219a02007-07-29 00:17:25 -07005693 cmd_len = le16_to_cpu(cmd.len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005694
Gustavo Padovan2d792812012-10-06 10:07:01 +01005695 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd.code, cmd_len,
5696 cmd.ident);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005697
Al Viro88219a02007-07-29 00:17:25 -07005698 if (cmd_len > len || !cmd.ident) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005699 BT_DBG("corrupted command");
5700 break;
5701 }
5702
Johan Hedbergc5623552013-04-29 19:35:33 +03005703 err = l2cap_bredr_sig_cmd(conn, &cmd, cmd_len, data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005704 if (err) {
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03005705 struct l2cap_cmd_rej_unk rej;
Gustavo F. Padovan2c6d1a22011-03-23 14:38:32 -03005706
5707 BT_ERR("Wrong link type (%d)", err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005708
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005709 rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Gustavo Padovan2d792812012-10-06 10:07:01 +01005710 l2cap_send_cmd(conn, cmd.ident, L2CAP_COMMAND_REJ,
5711 sizeof(rej), &rej);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005712 }
5713
Al Viro88219a02007-07-29 00:17:25 -07005714 data += cmd_len;
5715 len -= cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005716 }
5717
Marcel Holtmann3b166292013-10-02 08:28:21 -07005718drop:
Linus Torvalds1da177e2005-04-16 15:20:36 -07005719 kfree_skb(skb);
5720}
5721
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005722static int l2cap_check_fcs(struct l2cap_chan *chan, struct sk_buff *skb)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005723{
5724 u16 our_fcs, rcv_fcs;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03005725 int hdr_size;
5726
5727 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
5728 hdr_size = L2CAP_EXT_HDR_SIZE;
5729 else
5730 hdr_size = L2CAP_ENH_HDR_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005731
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005732 if (chan->fcs == L2CAP_FCS_CRC16) {
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005733 skb_trim(skb, skb->len - L2CAP_FCS_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005734 rcv_fcs = get_unaligned_le16(skb->data + skb->len);
5735 our_fcs = crc16(0, skb->data - hdr_size, skb->len + hdr_size);
5736
5737 if (our_fcs != rcv_fcs)
João Paulo Rechi Vita7a560e52010-06-22 13:56:27 -03005738 return -EBADMSG;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005739 }
5740 return 0;
5741}
5742
Mat Martineau6ea00482012-05-17 20:53:52 -07005743static void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan)
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005744{
Mat Martineaue31f7632012-05-17 20:53:41 -07005745 struct l2cap_ctrl control;
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005746
Mat Martineaue31f7632012-05-17 20:53:41 -07005747 BT_DBG("chan %p", chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005748
Mat Martineaue31f7632012-05-17 20:53:41 -07005749 memset(&control, 0, sizeof(control));
5750 control.sframe = 1;
5751 control.final = 1;
5752 control.reqseq = chan->buffer_seq;
5753 set_bit(CONN_SEND_FBIT, &chan->conn_state);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005754
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005755 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
Mat Martineaue31f7632012-05-17 20:53:41 -07005756 control.super = L2CAP_SUPER_RNR;
5757 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005758 }
5759
Mat Martineaue31f7632012-05-17 20:53:41 -07005760 if (test_and_clear_bit(CONN_REMOTE_BUSY, &chan->conn_state) &&
5761 chan->unacked_frames > 0)
5762 __set_retrans_timer(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005763
Mat Martineaue31f7632012-05-17 20:53:41 -07005764 /* Send pending iframes */
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03005765 l2cap_ertm_send(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005766
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005767 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
Mat Martineaue31f7632012-05-17 20:53:41 -07005768 test_bit(CONN_SEND_FBIT, &chan->conn_state)) {
5769 /* F-bit wasn't sent in an s-frame or i-frame yet, so
5770 * send it now.
5771 */
5772 control.super = L2CAP_SUPER_RR;
5773 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005774 }
5775}
5776
Gustavo Padovan2d792812012-10-06 10:07:01 +01005777static void append_skb_frag(struct sk_buff *skb, struct sk_buff *new_frag,
5778 struct sk_buff **last_frag)
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005779{
Mat Martineau84084a32011-07-22 14:54:00 -07005780 /* skb->len reflects data in skb as well as all fragments
5781 * skb->data_len reflects only data in fragments
5782 */
5783 if (!skb_has_frag_list(skb))
5784 skb_shinfo(skb)->frag_list = new_frag;
5785
5786 new_frag->next = NULL;
5787
5788 (*last_frag)->next = new_frag;
5789 *last_frag = new_frag;
5790
5791 skb->len += new_frag->len;
5792 skb->data_len += new_frag->len;
5793 skb->truesize += new_frag->truesize;
5794}
5795
Mat Martineau4b51dae92012-05-17 20:53:37 -07005796static int l2cap_reassemble_sdu(struct l2cap_chan *chan, struct sk_buff *skb,
5797 struct l2cap_ctrl *control)
Mat Martineau84084a32011-07-22 14:54:00 -07005798{
5799 int err = -EINVAL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005800
Mat Martineau4b51dae92012-05-17 20:53:37 -07005801 switch (control->sar) {
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005802 case L2CAP_SAR_UNSEGMENTED:
Mat Martineau84084a32011-07-22 14:54:00 -07005803 if (chan->sdu)
5804 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005805
Gustavo Padovan80b98022012-05-27 22:27:51 -03005806 err = chan->ops->recv(chan, skb);
Mat Martineau84084a32011-07-22 14:54:00 -07005807 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005808
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005809 case L2CAP_SAR_START:
Mat Martineau84084a32011-07-22 14:54:00 -07005810 if (chan->sdu)
5811 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005812
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005813 chan->sdu_len = get_unaligned_le16(skb->data);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005814 skb_pull(skb, L2CAP_SDULEN_SIZE);
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005815
Mat Martineau84084a32011-07-22 14:54:00 -07005816 if (chan->sdu_len > chan->imtu) {
5817 err = -EMSGSIZE;
5818 break;
5819 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005820
Mat Martineau84084a32011-07-22 14:54:00 -07005821 if (skb->len >= chan->sdu_len)
5822 break;
5823
5824 chan->sdu = skb;
5825 chan->sdu_last_frag = skb;
5826
5827 skb = NULL;
5828 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005829 break;
5830
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005831 case L2CAP_SAR_CONTINUE:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005832 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005833 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005834
Mat Martineau84084a32011-07-22 14:54:00 -07005835 append_skb_frag(chan->sdu, skb,
5836 &chan->sdu_last_frag);
5837 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005838
Mat Martineau84084a32011-07-22 14:54:00 -07005839 if (chan->sdu->len >= chan->sdu_len)
5840 break;
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005841
Mat Martineau84084a32011-07-22 14:54:00 -07005842 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005843 break;
5844
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005845 case L2CAP_SAR_END:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005846 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005847 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005848
Mat Martineau84084a32011-07-22 14:54:00 -07005849 append_skb_frag(chan->sdu, skb,
5850 &chan->sdu_last_frag);
5851 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005852
Mat Martineau84084a32011-07-22 14:54:00 -07005853 if (chan->sdu->len != chan->sdu_len)
5854 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005855
Gustavo Padovan80b98022012-05-27 22:27:51 -03005856 err = chan->ops->recv(chan, chan->sdu);
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005857
Mat Martineau84084a32011-07-22 14:54:00 -07005858 if (!err) {
5859 /* Reassembly complete */
5860 chan->sdu = NULL;
5861 chan->sdu_last_frag = NULL;
5862 chan->sdu_len = 0;
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005863 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005864 break;
5865 }
5866
Mat Martineau84084a32011-07-22 14:54:00 -07005867 if (err) {
5868 kfree_skb(skb);
5869 kfree_skb(chan->sdu);
5870 chan->sdu = NULL;
5871 chan->sdu_last_frag = NULL;
5872 chan->sdu_len = 0;
5873 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005874
Mat Martineau84084a32011-07-22 14:54:00 -07005875 return err;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005876}
5877
Mat Martineau32b32732012-10-23 15:24:11 -07005878static int l2cap_resegment(struct l2cap_chan *chan)
5879{
5880 /* Placeholder */
5881 return 0;
5882}
5883
Mat Martineaue3281402011-07-07 09:39:02 -07005884void l2cap_chan_busy(struct l2cap_chan *chan, int busy)
Gustavo F. Padovan712132e2010-06-21 19:39:50 -03005885{
Mat Martineau61aa4f52012-05-17 20:53:40 -07005886 u8 event;
5887
5888 if (chan->mode != L2CAP_MODE_ERTM)
5889 return;
5890
5891 event = busy ? L2CAP_EV_LOCAL_BUSY_DETECTED : L2CAP_EV_LOCAL_BUSY_CLEAR;
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03005892 l2cap_tx(chan, NULL, NULL, event);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005893}
5894
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005895static int l2cap_rx_queued_iframes(struct l2cap_chan *chan)
5896{
Mat Martineau63838722012-05-17 20:53:45 -07005897 int err = 0;
5898 /* Pass sequential frames to l2cap_reassemble_sdu()
5899 * until a gap is encountered.
5900 */
5901
5902 BT_DBG("chan %p", chan);
5903
5904 while (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
5905 struct sk_buff *skb;
5906 BT_DBG("Searching for skb with txseq %d (queue len %d)",
5907 chan->buffer_seq, skb_queue_len(&chan->srej_q));
5908
5909 skb = l2cap_ertm_seq_in_queue(&chan->srej_q, chan->buffer_seq);
5910
5911 if (!skb)
5912 break;
5913
5914 skb_unlink(skb, &chan->srej_q);
5915 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
5916 err = l2cap_reassemble_sdu(chan, skb, &bt_cb(skb)->control);
5917 if (err)
5918 break;
5919 }
5920
5921 if (skb_queue_empty(&chan->srej_q)) {
5922 chan->rx_state = L2CAP_RX_STATE_RECV;
5923 l2cap_send_ack(chan);
5924 }
5925
5926 return err;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005927}
5928
5929static void l2cap_handle_srej(struct l2cap_chan *chan,
5930 struct l2cap_ctrl *control)
5931{
Mat Martineauf80842a2012-05-17 20:53:46 -07005932 struct sk_buff *skb;
5933
5934 BT_DBG("chan %p, control %p", chan, control);
5935
5936 if (control->reqseq == chan->next_tx_seq) {
5937 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005938 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005939 return;
5940 }
5941
5942 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
5943
5944 if (skb == NULL) {
5945 BT_DBG("Seq %d not available for retransmission",
5946 control->reqseq);
5947 return;
5948 }
5949
5950 if (chan->max_tx != 0 && bt_cb(skb)->control.retries >= chan->max_tx) {
5951 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005952 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005953 return;
5954 }
5955
5956 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
5957
5958 if (control->poll) {
5959 l2cap_pass_to_tx(chan, control);
5960
5961 set_bit(CONN_SEND_FBIT, &chan->conn_state);
5962 l2cap_retransmit(chan, control);
5963 l2cap_ertm_send(chan);
5964
5965 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5966 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5967 chan->srej_save_reqseq = control->reqseq;
5968 }
5969 } else {
5970 l2cap_pass_to_tx_fbit(chan, control);
5971
5972 if (control->final) {
5973 if (chan->srej_save_reqseq != control->reqseq ||
5974 !test_and_clear_bit(CONN_SREJ_ACT,
5975 &chan->conn_state))
5976 l2cap_retransmit(chan, control);
5977 } else {
5978 l2cap_retransmit(chan, control);
5979 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5980 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5981 chan->srej_save_reqseq = control->reqseq;
5982 }
5983 }
5984 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005985}
5986
5987static void l2cap_handle_rej(struct l2cap_chan *chan,
5988 struct l2cap_ctrl *control)
5989{
Mat Martineaufcd289d2012-05-17 20:53:47 -07005990 struct sk_buff *skb;
5991
5992 BT_DBG("chan %p, control %p", chan, control);
5993
5994 if (control->reqseq == chan->next_tx_seq) {
5995 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005996 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07005997 return;
5998 }
5999
6000 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
6001
6002 if (chan->max_tx && skb &&
6003 bt_cb(skb)->control.retries >= chan->max_tx) {
6004 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
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 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6010
6011 l2cap_pass_to_tx(chan, control);
6012
6013 if (control->final) {
6014 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state))
6015 l2cap_retransmit_all(chan, control);
6016 } else {
6017 l2cap_retransmit_all(chan, control);
6018 l2cap_ertm_send(chan);
6019 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F)
6020 set_bit(CONN_REJ_ACT, &chan->conn_state);
6021 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006022}
6023
Mat Martineau4b51dae92012-05-17 20:53:37 -07006024static u8 l2cap_classify_txseq(struct l2cap_chan *chan, u16 txseq)
6025{
6026 BT_DBG("chan %p, txseq %d", chan, txseq);
6027
6028 BT_DBG("last_acked_seq %d, expected_tx_seq %d", chan->last_acked_seq,
6029 chan->expected_tx_seq);
6030
6031 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
6032 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
Gustavo Padovan2d792812012-10-06 10:07:01 +01006033 chan->tx_win) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07006034 /* See notes below regarding "double poll" and
6035 * invalid packets.
6036 */
6037 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
6038 BT_DBG("Invalid/Ignore - after SREJ");
6039 return L2CAP_TXSEQ_INVALID_IGNORE;
6040 } else {
6041 BT_DBG("Invalid - in window after SREJ sent");
6042 return L2CAP_TXSEQ_INVALID;
6043 }
6044 }
6045
6046 if (chan->srej_list.head == txseq) {
6047 BT_DBG("Expected SREJ");
6048 return L2CAP_TXSEQ_EXPECTED_SREJ;
6049 }
6050
6051 if (l2cap_ertm_seq_in_queue(&chan->srej_q, txseq)) {
6052 BT_DBG("Duplicate SREJ - txseq already stored");
6053 return L2CAP_TXSEQ_DUPLICATE_SREJ;
6054 }
6055
6056 if (l2cap_seq_list_contains(&chan->srej_list, txseq)) {
6057 BT_DBG("Unexpected SREJ - not requested");
6058 return L2CAP_TXSEQ_UNEXPECTED_SREJ;
6059 }
6060 }
6061
6062 if (chan->expected_tx_seq == txseq) {
6063 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
6064 chan->tx_win) {
6065 BT_DBG("Invalid - txseq outside tx window");
6066 return L2CAP_TXSEQ_INVALID;
6067 } else {
6068 BT_DBG("Expected");
6069 return L2CAP_TXSEQ_EXPECTED;
6070 }
6071 }
6072
6073 if (__seq_offset(chan, txseq, chan->last_acked_seq) <
Gustavo Padovan2d792812012-10-06 10:07:01 +01006074 __seq_offset(chan, chan->expected_tx_seq, chan->last_acked_seq)) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07006075 BT_DBG("Duplicate - expected_tx_seq later than txseq");
6076 return L2CAP_TXSEQ_DUPLICATE;
6077 }
6078
6079 if (__seq_offset(chan, txseq, chan->last_acked_seq) >= chan->tx_win) {
6080 /* A source of invalid packets is a "double poll" condition,
6081 * where delays cause us to send multiple poll packets. If
6082 * the remote stack receives and processes both polls,
6083 * sequence numbers can wrap around in such a way that a
6084 * resent frame has a sequence number that looks like new data
6085 * with a sequence gap. This would trigger an erroneous SREJ
6086 * request.
6087 *
6088 * Fortunately, this is impossible with a tx window that's
6089 * less than half of the maximum sequence number, which allows
6090 * invalid frames to be safely ignored.
6091 *
6092 * With tx window sizes greater than half of the tx window
6093 * maximum, the frame is invalid and cannot be ignored. This
6094 * causes a disconnect.
6095 */
6096
6097 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
6098 BT_DBG("Invalid/Ignore - txseq outside tx window");
6099 return L2CAP_TXSEQ_INVALID_IGNORE;
6100 } else {
6101 BT_DBG("Invalid - txseq outside tx window");
6102 return L2CAP_TXSEQ_INVALID;
6103 }
6104 } else {
6105 BT_DBG("Unexpected - txseq indicates missing frames");
6106 return L2CAP_TXSEQ_UNEXPECTED;
6107 }
6108}
6109
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006110static int l2cap_rx_state_recv(struct l2cap_chan *chan,
6111 struct l2cap_ctrl *control,
6112 struct sk_buff *skb, u8 event)
6113{
6114 int err = 0;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006115 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006116
6117 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6118 event);
6119
6120 switch (event) {
6121 case L2CAP_EV_RECV_IFRAME:
6122 switch (l2cap_classify_txseq(chan, control->txseq)) {
6123 case L2CAP_TXSEQ_EXPECTED:
6124 l2cap_pass_to_tx(chan, control);
6125
6126 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6127 BT_DBG("Busy, discarding expected seq %d",
6128 control->txseq);
6129 break;
6130 }
6131
6132 chan->expected_tx_seq = __next_seq(chan,
6133 control->txseq);
6134
6135 chan->buffer_seq = chan->expected_tx_seq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006136 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006137
6138 err = l2cap_reassemble_sdu(chan, skb, control);
6139 if (err)
6140 break;
6141
6142 if (control->final) {
6143 if (!test_and_clear_bit(CONN_REJ_ACT,
6144 &chan->conn_state)) {
6145 control->final = 0;
6146 l2cap_retransmit_all(chan, control);
6147 l2cap_ertm_send(chan);
6148 }
6149 }
6150
6151 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
6152 l2cap_send_ack(chan);
6153 break;
6154 case L2CAP_TXSEQ_UNEXPECTED:
6155 l2cap_pass_to_tx(chan, control);
6156
6157 /* Can't issue SREJ frames in the local busy state.
6158 * Drop this frame, it will be seen as missing
6159 * when local busy is exited.
6160 */
6161 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6162 BT_DBG("Busy, discarding unexpected seq %d",
6163 control->txseq);
6164 break;
6165 }
6166
6167 /* There was a gap in the sequence, so an SREJ
6168 * must be sent for each missing frame. The
6169 * current frame is stored for later use.
6170 */
6171 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006172 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006173 BT_DBG("Queued %p (queue len %d)", skb,
6174 skb_queue_len(&chan->srej_q));
6175
6176 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
6177 l2cap_seq_list_clear(&chan->srej_list);
6178 l2cap_send_srej(chan, control->txseq);
6179
6180 chan->rx_state = L2CAP_RX_STATE_SREJ_SENT;
6181 break;
6182 case L2CAP_TXSEQ_DUPLICATE:
6183 l2cap_pass_to_tx(chan, control);
6184 break;
6185 case L2CAP_TXSEQ_INVALID_IGNORE:
6186 break;
6187 case L2CAP_TXSEQ_INVALID:
6188 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006189 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006190 break;
6191 }
6192 break;
6193 case L2CAP_EV_RECV_RR:
6194 l2cap_pass_to_tx(chan, control);
6195 if (control->final) {
6196 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6197
Mat Martineaue6a3ee62012-10-23 15:24:22 -07006198 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state) &&
6199 !__chan_is_moving(chan)) {
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006200 control->final = 0;
6201 l2cap_retransmit_all(chan, control);
6202 }
6203
6204 l2cap_ertm_send(chan);
6205 } else if (control->poll) {
6206 l2cap_send_i_or_rr_or_rnr(chan);
6207 } else {
6208 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6209 &chan->conn_state) &&
6210 chan->unacked_frames)
6211 __set_retrans_timer(chan);
6212
6213 l2cap_ertm_send(chan);
6214 }
6215 break;
6216 case L2CAP_EV_RECV_RNR:
6217 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6218 l2cap_pass_to_tx(chan, control);
6219 if (control && control->poll) {
6220 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6221 l2cap_send_rr_or_rnr(chan, 0);
6222 }
6223 __clear_retrans_timer(chan);
6224 l2cap_seq_list_clear(&chan->retrans_list);
6225 break;
6226 case L2CAP_EV_RECV_REJ:
6227 l2cap_handle_rej(chan, control);
6228 break;
6229 case L2CAP_EV_RECV_SREJ:
6230 l2cap_handle_srej(chan, control);
6231 break;
6232 default:
6233 break;
6234 }
6235
6236 if (skb && !skb_in_use) {
6237 BT_DBG("Freeing %p", skb);
6238 kfree_skb(skb);
6239 }
6240
6241 return err;
6242}
6243
6244static int l2cap_rx_state_srej_sent(struct l2cap_chan *chan,
6245 struct l2cap_ctrl *control,
6246 struct sk_buff *skb, u8 event)
6247{
6248 int err = 0;
6249 u16 txseq = control->txseq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006250 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006251
6252 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6253 event);
6254
6255 switch (event) {
6256 case L2CAP_EV_RECV_IFRAME:
6257 switch (l2cap_classify_txseq(chan, txseq)) {
6258 case L2CAP_TXSEQ_EXPECTED:
6259 /* Keep frame for reassembly later */
6260 l2cap_pass_to_tx(chan, control);
6261 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006262 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006263 BT_DBG("Queued %p (queue len %d)", skb,
6264 skb_queue_len(&chan->srej_q));
6265
6266 chan->expected_tx_seq = __next_seq(chan, txseq);
6267 break;
6268 case L2CAP_TXSEQ_EXPECTED_SREJ:
6269 l2cap_seq_list_pop(&chan->srej_list);
6270
6271 l2cap_pass_to_tx(chan, control);
6272 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006273 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006274 BT_DBG("Queued %p (queue len %d)", skb,
6275 skb_queue_len(&chan->srej_q));
6276
6277 err = l2cap_rx_queued_iframes(chan);
6278 if (err)
6279 break;
6280
6281 break;
6282 case L2CAP_TXSEQ_UNEXPECTED:
6283 /* Got a frame that can't be reassembled yet.
6284 * Save it for later, and send SREJs to cover
6285 * the missing frames.
6286 */
6287 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006288 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006289 BT_DBG("Queued %p (queue len %d)", skb,
6290 skb_queue_len(&chan->srej_q));
6291
6292 l2cap_pass_to_tx(chan, control);
6293 l2cap_send_srej(chan, control->txseq);
6294 break;
6295 case L2CAP_TXSEQ_UNEXPECTED_SREJ:
6296 /* This frame was requested with an SREJ, but
6297 * some expected retransmitted frames are
6298 * missing. Request retransmission of missing
6299 * SREJ'd frames.
6300 */
6301 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006302 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006303 BT_DBG("Queued %p (queue len %d)", skb,
6304 skb_queue_len(&chan->srej_q));
6305
6306 l2cap_pass_to_tx(chan, control);
6307 l2cap_send_srej_list(chan, control->txseq);
6308 break;
6309 case L2CAP_TXSEQ_DUPLICATE_SREJ:
6310 /* We've already queued this frame. Drop this copy. */
6311 l2cap_pass_to_tx(chan, control);
6312 break;
6313 case L2CAP_TXSEQ_DUPLICATE:
6314 /* Expecting a later sequence number, so this frame
6315 * was already received. Ignore it completely.
6316 */
6317 break;
6318 case L2CAP_TXSEQ_INVALID_IGNORE:
6319 break;
6320 case L2CAP_TXSEQ_INVALID:
6321 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006322 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006323 break;
6324 }
6325 break;
6326 case L2CAP_EV_RECV_RR:
6327 l2cap_pass_to_tx(chan, control);
6328 if (control->final) {
6329 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6330
6331 if (!test_and_clear_bit(CONN_REJ_ACT,
6332 &chan->conn_state)) {
6333 control->final = 0;
6334 l2cap_retransmit_all(chan, control);
6335 }
6336
6337 l2cap_ertm_send(chan);
6338 } else if (control->poll) {
6339 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6340 &chan->conn_state) &&
6341 chan->unacked_frames) {
6342 __set_retrans_timer(chan);
6343 }
6344
6345 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6346 l2cap_send_srej_tail(chan);
6347 } else {
6348 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6349 &chan->conn_state) &&
6350 chan->unacked_frames)
6351 __set_retrans_timer(chan);
6352
6353 l2cap_send_ack(chan);
6354 }
6355 break;
6356 case L2CAP_EV_RECV_RNR:
6357 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6358 l2cap_pass_to_tx(chan, control);
6359 if (control->poll) {
6360 l2cap_send_srej_tail(chan);
6361 } else {
6362 struct l2cap_ctrl rr_control;
6363 memset(&rr_control, 0, sizeof(rr_control));
6364 rr_control.sframe = 1;
6365 rr_control.super = L2CAP_SUPER_RR;
6366 rr_control.reqseq = chan->buffer_seq;
6367 l2cap_send_sframe(chan, &rr_control);
6368 }
6369
6370 break;
6371 case L2CAP_EV_RECV_REJ:
6372 l2cap_handle_rej(chan, control);
6373 break;
6374 case L2CAP_EV_RECV_SREJ:
6375 l2cap_handle_srej(chan, control);
6376 break;
6377 }
6378
6379 if (skb && !skb_in_use) {
6380 BT_DBG("Freeing %p", skb);
6381 kfree_skb(skb);
6382 }
6383
6384 return err;
6385}
6386
Mat Martineau32b32732012-10-23 15:24:11 -07006387static int l2cap_finish_move(struct l2cap_chan *chan)
6388{
6389 BT_DBG("chan %p", chan);
6390
6391 chan->rx_state = L2CAP_RX_STATE_RECV;
6392
6393 if (chan->hs_hcon)
6394 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6395 else
6396 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6397
6398 return l2cap_resegment(chan);
6399}
6400
6401static int l2cap_rx_state_wait_p(struct l2cap_chan *chan,
6402 struct l2cap_ctrl *control,
6403 struct sk_buff *skb, u8 event)
6404{
6405 int err;
6406
6407 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6408 event);
6409
6410 if (!control->poll)
6411 return -EPROTO;
6412
6413 l2cap_process_reqseq(chan, control->reqseq);
6414
6415 if (!skb_queue_empty(&chan->tx_q))
6416 chan->tx_send_head = skb_peek(&chan->tx_q);
6417 else
6418 chan->tx_send_head = NULL;
6419
6420 /* Rewind next_tx_seq to the point expected
6421 * by the receiver.
6422 */
6423 chan->next_tx_seq = control->reqseq;
6424 chan->unacked_frames = 0;
6425
6426 err = l2cap_finish_move(chan);
6427 if (err)
6428 return err;
6429
6430 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6431 l2cap_send_i_or_rr_or_rnr(chan);
6432
6433 if (event == L2CAP_EV_RECV_IFRAME)
6434 return -EPROTO;
6435
6436 return l2cap_rx_state_recv(chan, control, NULL, event);
6437}
6438
6439static int l2cap_rx_state_wait_f(struct l2cap_chan *chan,
6440 struct l2cap_ctrl *control,
6441 struct sk_buff *skb, u8 event)
6442{
6443 int err;
6444
6445 if (!control->final)
6446 return -EPROTO;
6447
6448 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6449
6450 chan->rx_state = L2CAP_RX_STATE_RECV;
6451 l2cap_process_reqseq(chan, control->reqseq);
6452
6453 if (!skb_queue_empty(&chan->tx_q))
6454 chan->tx_send_head = skb_peek(&chan->tx_q);
6455 else
6456 chan->tx_send_head = NULL;
6457
6458 /* Rewind next_tx_seq to the point expected
6459 * by the receiver.
6460 */
6461 chan->next_tx_seq = control->reqseq;
6462 chan->unacked_frames = 0;
6463
6464 if (chan->hs_hcon)
6465 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6466 else
6467 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6468
6469 err = l2cap_resegment(chan);
6470
6471 if (!err)
6472 err = l2cap_rx_state_recv(chan, control, skb, event);
6473
6474 return err;
6475}
6476
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006477static bool __valid_reqseq(struct l2cap_chan *chan, u16 reqseq)
6478{
6479 /* Make sure reqseq is for a packet that has been sent but not acked */
6480 u16 unacked;
6481
6482 unacked = __seq_offset(chan, chan->next_tx_seq, chan->expected_ack_seq);
6483 return __seq_offset(chan, chan->next_tx_seq, reqseq) <= unacked;
6484}
6485
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006486static int l2cap_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6487 struct sk_buff *skb, u8 event)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006488{
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006489 int err = 0;
6490
6491 BT_DBG("chan %p, control %p, skb %p, event %d, state %d", chan,
6492 control, skb, event, chan->rx_state);
6493
6494 if (__valid_reqseq(chan, control->reqseq)) {
6495 switch (chan->rx_state) {
6496 case L2CAP_RX_STATE_RECV:
6497 err = l2cap_rx_state_recv(chan, control, skb, event);
6498 break;
6499 case L2CAP_RX_STATE_SREJ_SENT:
6500 err = l2cap_rx_state_srej_sent(chan, control, skb,
6501 event);
6502 break;
Mat Martineau32b32732012-10-23 15:24:11 -07006503 case L2CAP_RX_STATE_WAIT_P:
6504 err = l2cap_rx_state_wait_p(chan, control, skb, event);
6505 break;
6506 case L2CAP_RX_STATE_WAIT_F:
6507 err = l2cap_rx_state_wait_f(chan, control, skb, event);
6508 break;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006509 default:
6510 /* shut it down */
6511 break;
6512 }
6513 } else {
6514 BT_DBG("Invalid reqseq %d (next_tx_seq %d, expected_ack_seq %d",
6515 control->reqseq, chan->next_tx_seq,
6516 chan->expected_ack_seq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006517 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006518 }
6519
6520 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006521}
6522
6523static int l2cap_stream_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6524 struct sk_buff *skb)
6525{
Mat Martineau4b51dae92012-05-17 20:53:37 -07006526 int err = 0;
6527
6528 BT_DBG("chan %p, control %p, skb %p, state %d", chan, control, skb,
6529 chan->rx_state);
6530
6531 if (l2cap_classify_txseq(chan, control->txseq) ==
6532 L2CAP_TXSEQ_EXPECTED) {
6533 l2cap_pass_to_tx(chan, control);
6534
6535 BT_DBG("buffer_seq %d->%d", chan->buffer_seq,
6536 __next_seq(chan, chan->buffer_seq));
6537
6538 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
6539
6540 l2cap_reassemble_sdu(chan, skb, control);
6541 } else {
6542 if (chan->sdu) {
6543 kfree_skb(chan->sdu);
6544 chan->sdu = NULL;
6545 }
6546 chan->sdu_last_frag = NULL;
6547 chan->sdu_len = 0;
6548
6549 if (skb) {
6550 BT_DBG("Freeing %p", skb);
6551 kfree_skb(skb);
6552 }
6553 }
6554
6555 chan->last_acked_seq = control->txseq;
6556 chan->expected_tx_seq = __next_seq(chan, control->txseq);
6557
6558 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006559}
6560
6561static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6562{
6563 struct l2cap_ctrl *control = &bt_cb(skb)->control;
6564 u16 len;
6565 u8 event;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006566
Mat Martineaub76bbd62012-04-11 10:48:43 -07006567 __unpack_control(chan, skb);
6568
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006569 len = skb->len;
6570
6571 /*
6572 * We can just drop the corrupted I-frame here.
6573 * Receiver will miss it and start proper recovery
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006574 * procedures and ask for retransmission.
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006575 */
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006576 if (l2cap_check_fcs(chan, skb))
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006577 goto drop;
6578
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006579 if (!control->sframe && control->sar == L2CAP_SAR_START)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006580 len -= L2CAP_SDULEN_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006581
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006582 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006583 len -= L2CAP_FCS_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006584
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006585 if (len > chan->mps) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006586 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006587 goto drop;
6588 }
6589
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006590 if (!control->sframe) {
6591 int err;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006592
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006593 BT_DBG("iframe sar %d, reqseq %d, final %d, txseq %d",
6594 control->sar, control->reqseq, control->final,
6595 control->txseq);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03006596
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006597 /* Validate F-bit - F=0 always valid, F=1 only
6598 * valid in TX WAIT_F
6599 */
6600 if (control->final && chan->tx_state != L2CAP_TX_STATE_WAIT_F)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006601 goto drop;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006602
6603 if (chan->mode != L2CAP_MODE_STREAMING) {
6604 event = L2CAP_EV_RECV_IFRAME;
6605 err = l2cap_rx(chan, control, skb, event);
6606 } else {
6607 err = l2cap_stream_rx(chan, control, skb);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006608 }
6609
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006610 if (err)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006611 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006612 } else {
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006613 const u8 rx_func_to_event[4] = {
6614 L2CAP_EV_RECV_RR, L2CAP_EV_RECV_REJ,
6615 L2CAP_EV_RECV_RNR, L2CAP_EV_RECV_SREJ
6616 };
6617
6618 /* Only I-frames are expected in streaming mode */
6619 if (chan->mode == L2CAP_MODE_STREAMING)
6620 goto drop;
6621
6622 BT_DBG("sframe reqseq %d, final %d, poll %d, super %d",
6623 control->reqseq, control->final, control->poll,
6624 control->super);
6625
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006626 if (len != 0) {
Andrei Emeltchenko1bb166e2012-11-20 17:16:21 +02006627 BT_ERR("Trailing bytes: %d in sframe", len);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006628 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006629 goto drop;
6630 }
6631
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006632 /* Validate F and P bits */
6633 if (control->final && (control->poll ||
6634 chan->tx_state != L2CAP_TX_STATE_WAIT_F))
6635 goto drop;
6636
6637 event = rx_func_to_event[control->super];
6638 if (l2cap_rx(chan, control, skb, event))
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006639 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006640 }
6641
6642 return 0;
6643
6644drop:
6645 kfree_skb(skb);
6646 return 0;
6647}
6648
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006649static void l2cap_chan_le_send_credits(struct l2cap_chan *chan)
6650{
6651 struct l2cap_conn *conn = chan->conn;
6652 struct l2cap_le_credits pkt;
6653 u16 return_credits;
6654
6655 /* We return more credits to the sender only after the amount of
6656 * credits falls below half of the initial amount.
6657 */
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02006658 if (chan->rx_credits >= (le_max_credits + 1) / 2)
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006659 return;
6660
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02006661 return_credits = le_max_credits - chan->rx_credits;
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006662
6663 BT_DBG("chan %p returning %u credits to sender", chan, return_credits);
6664
6665 chan->rx_credits += return_credits;
6666
6667 pkt.cid = cpu_to_le16(chan->scid);
6668 pkt.credits = cpu_to_le16(return_credits);
6669
6670 chan->ident = l2cap_get_ident(conn);
6671
6672 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CREDITS, sizeof(pkt), &pkt);
6673}
6674
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006675static int l2cap_le_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6676{
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006677 int err;
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006678
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006679 if (!chan->rx_credits) {
6680 BT_ERR("No credits to receive LE L2CAP data");
Johan Hedbergdfd97742014-01-27 15:11:34 -08006681 l2cap_send_disconn_req(chan, ECONNRESET);
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006682 return -ENOBUFS;
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006683 }
6684
6685 if (chan->imtu < skb->len) {
6686 BT_ERR("Too big LE L2CAP PDU");
6687 return -ENOBUFS;
6688 }
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006689
6690 chan->rx_credits--;
6691 BT_DBG("rx_credits %u -> %u", chan->rx_credits + 1, chan->rx_credits);
6692
6693 l2cap_chan_le_send_credits(chan);
6694
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006695 err = 0;
6696
6697 if (!chan->sdu) {
6698 u16 sdu_len;
6699
6700 sdu_len = get_unaligned_le16(skb->data);
6701 skb_pull(skb, L2CAP_SDULEN_SIZE);
6702
6703 BT_DBG("Start of new SDU. sdu_len %u skb->len %u imtu %u",
6704 sdu_len, skb->len, chan->imtu);
6705
6706 if (sdu_len > chan->imtu) {
6707 BT_ERR("Too big LE L2CAP SDU length received");
6708 err = -EMSGSIZE;
6709 goto failed;
6710 }
6711
6712 if (skb->len > sdu_len) {
6713 BT_ERR("Too much LE L2CAP data received");
6714 err = -EINVAL;
6715 goto failed;
6716 }
6717
6718 if (skb->len == sdu_len)
6719 return chan->ops->recv(chan, skb);
6720
6721 chan->sdu = skb;
6722 chan->sdu_len = sdu_len;
6723 chan->sdu_last_frag = skb;
6724
6725 return 0;
6726 }
6727
6728 BT_DBG("SDU fragment. chan->sdu->len %u skb->len %u chan->sdu_len %u",
6729 chan->sdu->len, skb->len, chan->sdu_len);
6730
6731 if (chan->sdu->len + skb->len > chan->sdu_len) {
6732 BT_ERR("Too much LE L2CAP data received");
6733 err = -EINVAL;
6734 goto failed;
6735 }
6736
6737 append_skb_frag(chan->sdu, skb, &chan->sdu_last_frag);
6738 skb = NULL;
6739
6740 if (chan->sdu->len == chan->sdu_len) {
6741 err = chan->ops->recv(chan, chan->sdu);
6742 if (!err) {
6743 chan->sdu = NULL;
6744 chan->sdu_last_frag = NULL;
6745 chan->sdu_len = 0;
6746 }
6747 }
6748
6749failed:
6750 if (err) {
6751 kfree_skb(skb);
6752 kfree_skb(chan->sdu);
6753 chan->sdu = NULL;
6754 chan->sdu_last_frag = NULL;
6755 chan->sdu_len = 0;
6756 }
6757
6758 /* We can't return an error here since we took care of the skb
6759 * freeing internally. An error return would cause the caller to
6760 * do a double-free of the skb.
6761 */
6762 return 0;
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006763}
6764
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006765static void l2cap_data_channel(struct l2cap_conn *conn, u16 cid,
6766 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006767{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006768 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006769
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03006770 chan = l2cap_get_chan_by_scid(conn, cid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006771 if (!chan) {
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006772 if (cid == L2CAP_CID_A2MP) {
6773 chan = a2mp_channel_create(conn, skb);
6774 if (!chan) {
6775 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006776 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006777 }
6778
6779 l2cap_chan_lock(chan);
6780 } else {
6781 BT_DBG("unknown cid 0x%4.4x", cid);
6782 /* Drop packet and return */
6783 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006784 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006785 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006786 }
6787
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03006788 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006789
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03006790 if (chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006791 goto drop;
6792
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006793 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03006794 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006795 if (l2cap_le_data_rcv(chan, skb) < 0)
6796 goto drop;
6797
6798 goto done;
6799
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006800 case L2CAP_MODE_BASIC:
6801 /* If socket recv buffers overflows we drop data here
6802 * which is *bad* because L2CAP has to be reliable.
6803 * But we don't have any other choice. L2CAP doesn't
6804 * provide flow control mechanism. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07006805
Szymon Janc2c96e032014-02-18 20:48:34 +01006806 if (chan->imtu < skb->len) {
6807 BT_ERR("Dropping L2CAP data: receive buffer overflow");
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006808 goto drop;
Szymon Janc2c96e032014-02-18 20:48:34 +01006809 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006810
Gustavo Padovan80b98022012-05-27 22:27:51 -03006811 if (!chan->ops->recv(chan, skb))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006812 goto done;
6813 break;
6814
6815 case L2CAP_MODE_ERTM:
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006816 case L2CAP_MODE_STREAMING:
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006817 l2cap_data_rcv(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006818 goto done;
6819
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006820 default:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006821 BT_DBG("chan %p: bad mode 0x%2.2x", chan, chan->mode);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006822 break;
6823 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006824
6825drop:
6826 kfree_skb(skb);
6827
6828done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006829 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006830}
6831
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006832static void l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm,
6833 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006834{
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006835 struct hci_conn *hcon = conn->hcon;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006836 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006837
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006838 if (hcon->type != ACL_LINK)
6839 goto drop;
6840
Johan Hedbergbf20fd42013-05-14 13:23:13 +03006841 chan = l2cap_global_chan_by_psm(0, psm, &hcon->src, &hcon->dst,
6842 ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006843 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006844 goto drop;
6845
Andrei Emeltchenko5b4ceda2012-02-24 16:35:32 +02006846 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006847
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03006848 if (chan->state != BT_BOUND && chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006849 goto drop;
6850
Vinicius Costa Gomese13e21d2011-06-17 22:46:27 -03006851 if (chan->imtu < skb->len)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006852 goto drop;
6853
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006854 /* Store remote BD_ADDR and PSM for msg_name */
Marcel Holtmann06ae3312013-10-18 03:43:00 -07006855 bacpy(&bt_cb(skb)->bdaddr, &hcon->dst);
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006856 bt_cb(skb)->psm = psm;
6857
Gustavo Padovan80b98022012-05-27 22:27:51 -03006858 if (!chan->ops->recv(chan, skb))
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006859 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006860
6861drop:
6862 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006863}
6864
Marcel Holtmann72f78352013-04-23 00:59:00 -07006865static void l2cap_att_channel(struct l2cap_conn *conn,
Andrei Emeltchenko6810fca2012-05-31 11:18:57 +03006866 struct sk_buff *skb)
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006867{
Marcel Holtmannb99707d2013-10-03 02:54:11 -07006868 struct hci_conn *hcon = conn->hcon;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006869 struct l2cap_chan *chan;
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006870
Marcel Holtmannb99707d2013-10-03 02:54:11 -07006871 if (hcon->type != LE_LINK)
6872 goto drop;
6873
Johan Hedbergaf1c0132013-04-29 19:35:42 +03006874 chan = l2cap_global_chan_by_scid(BT_CONNECTED, L2CAP_CID_ATT,
Marcel Holtmann06ae3312013-10-18 03:43:00 -07006875 &hcon->src, &hcon->dst);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006876 if (!chan)
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006877 goto drop;
6878
Andrei Emeltchenko5b4ceda2012-02-24 16:35:32 +02006879 BT_DBG("chan %p, len %d", chan, skb->len);
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006880
Vinicius Costa Gomese13e21d2011-06-17 22:46:27 -03006881 if (chan->imtu < skb->len)
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006882 goto drop;
6883
Gustavo Padovan80b98022012-05-27 22:27:51 -03006884 if (!chan->ops->recv(chan, skb))
Andrei Emeltchenko6810fca2012-05-31 11:18:57 +03006885 return;
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006886
6887drop:
6888 kfree_skb(skb);
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006889}
6890
Linus Torvalds1da177e2005-04-16 15:20:36 -07006891static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb)
6892{
6893 struct l2cap_hdr *lh = (void *) skb->data;
Johan Hedberg61a939c2014-01-17 20:45:11 +02006894 struct hci_conn *hcon = conn->hcon;
Al Viro8e036fc2007-07-29 00:16:36 -07006895 u16 cid, len;
6896 __le16 psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006897
Johan Hedberg61a939c2014-01-17 20:45:11 +02006898 if (hcon->state != BT_CONNECTED) {
6899 BT_DBG("queueing pending rx skb");
6900 skb_queue_tail(&conn->pending_rx, skb);
6901 return;
6902 }
6903
Linus Torvalds1da177e2005-04-16 15:20:36 -07006904 skb_pull(skb, L2CAP_HDR_SIZE);
6905 cid = __le16_to_cpu(lh->cid);
6906 len = __le16_to_cpu(lh->len);
6907
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006908 if (len != skb->len) {
6909 kfree_skb(skb);
6910 return;
6911 }
6912
Johan Hedberge4931502014-07-02 09:36:21 +03006913 if (hci_blacklist_lookup(hcon->hdev, &hcon->dst,
6914 bdaddr_type(hcon, hcon->dst_type))) {
6915 kfree_skb(skb);
6916 return;
6917 }
6918
Linus Torvalds1da177e2005-04-16 15:20:36 -07006919 BT_DBG("len %d, cid 0x%4.4x", len, cid);
6920
6921 switch (cid) {
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006922 case L2CAP_CID_SIGNALING:
Linus Torvalds1da177e2005-04-16 15:20:36 -07006923 l2cap_sig_channel(conn, skb);
6924 break;
6925
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006926 case L2CAP_CID_CONN_LESS:
Andrei Emeltchenko097db762012-03-09 14:16:17 +02006927 psm = get_unaligned((__le16 *) skb->data);
Andrei Emeltchenko0181a702012-05-29 10:04:05 +03006928 skb_pull(skb, L2CAP_PSMLEN_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006929 l2cap_conless_channel(conn, psm, skb);
6930 break;
6931
Johan Hedberg073d1cf2013-04-29 19:35:35 +03006932 case L2CAP_CID_ATT:
Marcel Holtmann72f78352013-04-23 00:59:00 -07006933 l2cap_att_channel(conn, skb);
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006934 break;
6935
Marcel Holtmanna2877622013-10-02 23:46:54 -07006936 case L2CAP_CID_LE_SIGNALING:
6937 l2cap_le_sig_channel(conn, skb);
6938 break;
6939
Anderson Brigliab501d6a2011-06-07 18:46:31 -03006940 case L2CAP_CID_SMP:
6941 if (smp_sig_channel(conn, skb))
6942 l2cap_conn_del(conn->hcon, EACCES);
6943 break;
6944
Linus Torvalds1da177e2005-04-16 15:20:36 -07006945 default:
6946 l2cap_data_channel(conn, cid, skb);
6947 break;
6948 }
6949}
6950
Johan Hedberg61a939c2014-01-17 20:45:11 +02006951static void process_pending_rx(struct work_struct *work)
6952{
6953 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
6954 pending_rx_work);
6955 struct sk_buff *skb;
6956
6957 BT_DBG("");
6958
6959 while ((skb = skb_dequeue(&conn->pending_rx)))
6960 l2cap_recv_frame(conn, skb);
6961}
6962
Johan Hedberg162b49e2014-01-17 20:45:10 +02006963static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon)
6964{
6965 struct l2cap_conn *conn = hcon->l2cap_data;
6966 struct hci_chan *hchan;
6967
6968 if (conn)
6969 return conn;
6970
6971 hchan = hci_chan_create(hcon);
6972 if (!hchan)
6973 return NULL;
6974
6975 conn = kzalloc(sizeof(struct l2cap_conn), GFP_KERNEL);
6976 if (!conn) {
6977 hci_chan_del(hchan);
6978 return NULL;
6979 }
6980
6981 kref_init(&conn->ref);
6982 hcon->l2cap_data = conn;
6983 conn->hcon = hcon;
6984 hci_conn_get(conn->hcon);
6985 conn->hchan = hchan;
6986
6987 BT_DBG("hcon %p conn %p hchan %p", hcon, conn, hchan);
6988
6989 switch (hcon->type) {
6990 case LE_LINK:
6991 if (hcon->hdev->le_mtu) {
6992 conn->mtu = hcon->hdev->le_mtu;
6993 break;
6994 }
6995 /* fall through */
6996 default:
6997 conn->mtu = hcon->hdev->acl_mtu;
6998 break;
6999 }
7000
7001 conn->feat_mask = 0;
7002
7003 if (hcon->type == ACL_LINK)
7004 conn->hs_enabled = test_bit(HCI_HS_ENABLED,
7005 &hcon->hdev->dev_flags);
7006
7007 spin_lock_init(&conn->lock);
7008 mutex_init(&conn->chan_lock);
7009
7010 INIT_LIST_HEAD(&conn->chan_l);
7011 INIT_LIST_HEAD(&conn->users);
7012
7013 if (hcon->type == LE_LINK)
7014 INIT_DELAYED_WORK(&conn->security_timer, security_timeout);
7015 else
7016 INIT_DELAYED_WORK(&conn->info_timer, l2cap_info_timeout);
7017
Johan Hedberg61a939c2014-01-17 20:45:11 +02007018 skb_queue_head_init(&conn->pending_rx);
7019 INIT_WORK(&conn->pending_rx_work, process_pending_rx);
7020
Johan Hedberg162b49e2014-01-17 20:45:10 +02007021 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
7022
7023 return conn;
7024}
7025
7026static bool is_valid_psm(u16 psm, u8 dst_type) {
7027 if (!psm)
7028 return false;
7029
7030 if (bdaddr_type_is_le(dst_type))
7031 return (psm <= 0x00ff);
7032
7033 /* PSM must be odd and lsb of upper byte must be 0 */
7034 return ((psm & 0x0101) == 0x0001);
7035}
7036
7037int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
7038 bdaddr_t *dst, u8 dst_type)
7039{
7040 struct l2cap_conn *conn;
7041 struct hci_conn *hcon;
7042 struct hci_dev *hdev;
7043 __u8 auth_type;
7044 int err;
7045
7046 BT_DBG("%pMR -> %pMR (type %u) psm 0x%2.2x", &chan->src, dst,
7047 dst_type, __le16_to_cpu(psm));
7048
7049 hdev = hci_get_route(dst, &chan->src);
7050 if (!hdev)
7051 return -EHOSTUNREACH;
7052
7053 hci_dev_lock(hdev);
7054
7055 l2cap_chan_lock(chan);
7056
7057 if (!is_valid_psm(__le16_to_cpu(psm), dst_type) && !cid &&
7058 chan->chan_type != L2CAP_CHAN_RAW) {
7059 err = -EINVAL;
7060 goto done;
7061 }
7062
Johan Hedberg21626e62014-01-24 10:35:41 +02007063 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED && !psm) {
7064 err = -EINVAL;
7065 goto done;
7066 }
7067
7068 if (chan->chan_type == L2CAP_CHAN_FIXED && !cid) {
Johan Hedberg162b49e2014-01-17 20:45:10 +02007069 err = -EINVAL;
7070 goto done;
7071 }
7072
7073 switch (chan->mode) {
7074 case L2CAP_MODE_BASIC:
7075 break;
7076 case L2CAP_MODE_LE_FLOWCTL:
7077 l2cap_le_flowctl_init(chan);
7078 break;
7079 case L2CAP_MODE_ERTM:
7080 case L2CAP_MODE_STREAMING:
7081 if (!disable_ertm)
7082 break;
7083 /* fall through */
7084 default:
7085 err = -ENOTSUPP;
7086 goto done;
7087 }
7088
7089 switch (chan->state) {
7090 case BT_CONNECT:
7091 case BT_CONNECT2:
7092 case BT_CONFIG:
7093 /* Already connecting */
7094 err = 0;
7095 goto done;
7096
7097 case BT_CONNECTED:
7098 /* Already connected */
7099 err = -EISCONN;
7100 goto done;
7101
7102 case BT_OPEN:
7103 case BT_BOUND:
7104 /* Can connect */
7105 break;
7106
7107 default:
7108 err = -EBADFD;
7109 goto done;
7110 }
7111
7112 /* Set destination address and psm */
7113 bacpy(&chan->dst, dst);
7114 chan->dst_type = dst_type;
7115
7116 chan->psm = psm;
7117 chan->dcid = cid;
7118
7119 auth_type = l2cap_get_auth_type(chan);
7120
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007121 if (bdaddr_type_is_le(dst_type)) {
7122 /* Convert from L2CAP channel address type to HCI address type
7123 */
7124 if (dst_type == BDADDR_LE_PUBLIC)
7125 dst_type = ADDR_LE_DEV_PUBLIC;
7126 else
7127 dst_type = ADDR_LE_DEV_RANDOM;
7128
Andre Guedes04a6c582014-02-26 20:21:44 -03007129 hcon = hci_connect_le(hdev, dst, dst_type, chan->sec_level,
7130 auth_type);
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007131 } else {
Andre Guedes04a6c582014-02-26 20:21:44 -03007132 hcon = hci_connect_acl(hdev, dst, chan->sec_level, auth_type);
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007133 }
Johan Hedberg162b49e2014-01-17 20:45:10 +02007134
7135 if (IS_ERR(hcon)) {
7136 err = PTR_ERR(hcon);
7137 goto done;
7138 }
7139
7140 conn = l2cap_conn_add(hcon);
7141 if (!conn) {
7142 hci_conn_drop(hcon);
7143 err = -ENOMEM;
7144 goto done;
7145 }
7146
7147 if (cid && __l2cap_get_chan_by_dcid(conn, cid)) {
7148 hci_conn_drop(hcon);
7149 err = -EBUSY;
7150 goto done;
7151 }
7152
7153 /* Update source addr of the socket */
7154 bacpy(&chan->src, &hcon->src);
7155 chan->src_type = bdaddr_type(hcon, hcon->src_type);
7156
7157 l2cap_chan_unlock(chan);
7158 l2cap_chan_add(conn, chan);
7159 l2cap_chan_lock(chan);
7160
7161 /* l2cap_chan_add takes its own ref so we can drop this one */
7162 hci_conn_drop(hcon);
7163
7164 l2cap_state_change(chan, BT_CONNECT);
7165 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
7166
Johan Hedberg61202e42014-01-28 15:16:48 -08007167 /* Release chan->sport so that it can be reused by other
7168 * sockets (as it's only used for listening sockets).
7169 */
7170 write_lock(&chan_list_lock);
7171 chan->sport = 0;
7172 write_unlock(&chan_list_lock);
7173
Johan Hedberg162b49e2014-01-17 20:45:10 +02007174 if (hcon->state == BT_CONNECTED) {
7175 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
7176 __clear_chan_timer(chan);
7177 if (l2cap_chan_check_security(chan))
7178 l2cap_state_change(chan, BT_CONNECTED);
7179 } else
7180 l2cap_do_start(chan);
7181 }
7182
7183 err = 0;
7184
7185done:
7186 l2cap_chan_unlock(chan);
7187 hci_dev_unlock(hdev);
7188 hci_dev_put(hdev);
7189 return err;
7190}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +03007191EXPORT_SYMBOL_GPL(l2cap_chan_connect);
Johan Hedberg162b49e2014-01-17 20:45:10 +02007192
Linus Torvalds1da177e2005-04-16 15:20:36 -07007193/* ---- L2CAP interface with lower layer (HCI) ---- */
7194
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007195int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007196{
7197 int exact = 0, lm1 = 0, lm2 = 0;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007198 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007199
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03007200 BT_DBG("hdev %s, bdaddr %pMR", hdev->name, bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007201
7202 /* Find listening sockets and check their link_mode */
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007203 read_lock(&chan_list_lock);
7204 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03007205 if (c->state != BT_LISTEN)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007206 continue;
7207
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007208 if (!bacmp(&c->src, &hdev->bdaddr)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007209 lm1 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03007210 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007211 lm1 |= HCI_LM_MASTER;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007212 exact++;
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007213 } else if (!bacmp(&c->src, BDADDR_ANY)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007214 lm2 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03007215 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007216 lm2 |= HCI_LM_MASTER;
7217 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007218 }
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007219 read_unlock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007220
7221 return exact ? lm1 : lm2;
7222}
7223
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03007224void l2cap_connect_cfm(struct hci_conn *hcon, u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007225{
Marcel Holtmann01394182006-07-03 10:02:46 +02007226 struct l2cap_conn *conn;
7227
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03007228 BT_DBG("hcon %p bdaddr %pMR status %d", hcon, &hcon->dst, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007229
Linus Torvalds1da177e2005-04-16 15:20:36 -07007230 if (!status) {
Claudio Takahasibaf43252013-04-11 13:55:50 -03007231 conn = l2cap_conn_add(hcon);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007232 if (conn)
7233 l2cap_conn_ready(conn);
Andrei Emeltchenkoba6fc312012-10-31 15:46:26 +02007234 } else {
Joe Perchese1750722011-06-29 18:18:29 -07007235 l2cap_conn_del(hcon, bt_to_errno(status));
Andrei Emeltchenkoba6fc312012-10-31 15:46:26 +02007236 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007237}
7238
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007239int l2cap_disconn_ind(struct hci_conn *hcon)
Marcel Holtmann2950f212009-02-12 14:02:50 +01007240{
7241 struct l2cap_conn *conn = hcon->l2cap_data;
7242
7243 BT_DBG("hcon %p", hcon);
7244
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007245 if (!conn)
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02007246 return HCI_ERROR_REMOTE_USER_TERM;
Marcel Holtmann2950f212009-02-12 14:02:50 +01007247 return conn->disc_reason;
7248}
7249
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03007250void l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007251{
7252 BT_DBG("hcon %p reason %d", hcon, reason);
7253
Joe Perchese1750722011-06-29 18:18:29 -07007254 l2cap_conn_del(hcon, bt_to_errno(reason));
Linus Torvalds1da177e2005-04-16 15:20:36 -07007255}
7256
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007257static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt)
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007258{
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03007259 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED)
Marcel Holtmann255c7602009-02-04 21:07:19 +01007260 return;
7261
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007262 if (encrypt == 0x00) {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007263 if (chan->sec_level == BT_SECURITY_MEDIUM) {
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007264 __set_chan_timer(chan, L2CAP_ENC_TIMEOUT);
Marcel Holtmann7d513e92014-01-15 22:37:40 -08007265 } else if (chan->sec_level == BT_SECURITY_HIGH ||
7266 chan->sec_level == BT_SECURITY_FIPS)
Gustavo F. Padovan0f852722011-05-04 19:42:50 -03007267 l2cap_chan_close(chan, ECONNREFUSED);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007268 } else {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007269 if (chan->sec_level == BT_SECURITY_MEDIUM)
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -03007270 __clear_chan_timer(chan);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007271 }
7272}
7273
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007274int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007275{
Marcel Holtmann40be4922008-07-14 20:13:50 +02007276 struct l2cap_conn *conn = hcon->l2cap_data;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03007277 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007278
Marcel Holtmann01394182006-07-03 10:02:46 +02007279 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007280 return 0;
Marcel Holtmann01394182006-07-03 10:02:46 +02007281
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03007282 BT_DBG("conn %p status 0x%2.2x encrypt %u", conn, status, encrypt);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007283
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03007284 if (hcon->type == LE_LINK) {
Hemant Gupta35d4adcc2012-04-18 14:46:26 +05307285 if (!status && encrypt)
Johan Hedberg4bd6d382014-02-26 23:33:45 +02007286 smp_distribute_keys(conn);
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02007287 cancel_delayed_work(&conn->security_timer);
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03007288 }
7289
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007290 mutex_lock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007291
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007292 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007293 l2cap_chan_lock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007294
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03007295 BT_DBG("chan %p scid 0x%4.4x state %s", chan, chan->scid,
7296 state_to_string(chan->state));
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007297
Johan Hedberg2338a7e2014-01-24 10:35:40 +02007298 if (chan->scid == L2CAP_CID_A2MP) {
Andrei Emeltchenko78eb2f92012-07-19 17:03:47 +03007299 l2cap_chan_unlock(chan);
7300 continue;
7301 }
7302
Johan Hedberg073d1cf2013-04-29 19:35:35 +03007303 if (chan->scid == L2CAP_CID_ATT) {
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007304 if (!status && encrypt) {
7305 chan->sec_level = hcon->sec_level;
Andrei Emeltchenkocf4cd002012-02-06 15:03:59 +02007306 l2cap_chan_ready(chan);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007307 }
7308
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007309 l2cap_chan_unlock(chan);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007310 continue;
7311 }
7312
Andrei Emeltchenko96eff462012-11-15 18:14:53 +02007313 if (!__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007314 l2cap_chan_unlock(chan);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01007315 continue;
7316 }
7317
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03007318 if (!status && (chan->state == BT_CONNECTED ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01007319 chan->state == BT_CONFIG)) {
Marcel Holtmannd97c8992013-10-14 02:53:54 -07007320 chan->ops->resume(chan);
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007321 l2cap_check_encryption(chan, encrypt);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007322 l2cap_chan_unlock(chan);
Marcel Holtmann9719f8a2008-07-14 20:13:45 +02007323 continue;
7324 }
7325
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03007326 if (chan->state == BT_CONNECT) {
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007327 if (!status)
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03007328 l2cap_start_connection(chan);
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007329 else
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007330 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03007331 } else if (chan->state == BT_CONNECT2) {
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007332 struct l2cap_conn_rsp rsp;
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007333 __u16 res, stat;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007334
7335 if (!status) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07007336 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007337 res = L2CAP_CR_PEND;
7338 stat = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08007339 chan->ops->defer(chan);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007340 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007341 l2cap_state_change(chan, BT_CONFIG);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007342 res = L2CAP_CR_SUCCESS;
7343 stat = L2CAP_CS_NO_INFO;
7344 }
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007345 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007346 l2cap_state_change(chan, BT_DISCONN);
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007347 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007348 res = L2CAP_CR_SEC_BLOCK;
7349 stat = L2CAP_CS_NO_INFO;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007350 }
7351
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03007352 rsp.scid = cpu_to_le16(chan->dcid);
7353 rsp.dcid = cpu_to_le16(chan->scid);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007354 rsp.result = cpu_to_le16(res);
7355 rsp.status = cpu_to_le16(stat);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03007356 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01007357 sizeof(rsp), &rsp);
Mat Martineau2d369352012-05-23 14:59:30 -07007358
7359 if (!test_bit(CONF_REQ_SENT, &chan->conf_state) &&
7360 res == L2CAP_CR_SUCCESS) {
7361 char buf[128];
7362 set_bit(CONF_REQ_SENT, &chan->conf_state);
7363 l2cap_send_cmd(conn, l2cap_get_ident(conn),
7364 L2CAP_CONF_REQ,
7365 l2cap_build_conf_req(chan, buf),
7366 buf);
7367 chan->num_conf_req++;
7368 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007369 }
7370
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007371 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007372 }
7373
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007374 mutex_unlock(&conn->chan_lock);
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007375
Linus Torvalds1da177e2005-04-16 15:20:36 -07007376 return 0;
7377}
7378
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007379int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007380{
7381 struct l2cap_conn *conn = hcon->l2cap_data;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007382 struct l2cap_hdr *hdr;
7383 int len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007384
Andrei Emeltchenko1d13a252012-10-15 11:58:41 +03007385 /* For AMP controller do not create l2cap conn */
7386 if (!conn && hcon->hdev->dev_type != HCI_BREDR)
7387 goto drop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007388
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007389 if (!conn)
Claudio Takahasibaf43252013-04-11 13:55:50 -03007390 conn = l2cap_conn_add(hcon);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007391
7392 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007393 goto drop;
7394
7395 BT_DBG("conn %p len %d flags 0x%x", conn, skb->len, flags);
7396
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007397 switch (flags) {
7398 case ACL_START:
7399 case ACL_START_NO_FLUSH:
7400 case ACL_COMPLETE:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007401 if (conn->rx_len) {
7402 BT_ERR("Unexpected start frame (len %d)", skb->len);
7403 kfree_skb(conn->rx_skb);
7404 conn->rx_skb = NULL;
7405 conn->rx_len = 0;
7406 l2cap_conn_unreliable(conn, ECOMM);
7407 }
7408
Andrei Emeltchenkoaae7fe22010-09-15 14:28:43 +03007409 /* Start fragment always begin with Basic L2CAP header */
7410 if (skb->len < L2CAP_HDR_SIZE) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07007411 BT_ERR("Frame is too short (len %d)", skb->len);
7412 l2cap_conn_unreliable(conn, ECOMM);
7413 goto drop;
7414 }
7415
7416 hdr = (struct l2cap_hdr *) skb->data;
7417 len = __le16_to_cpu(hdr->len) + L2CAP_HDR_SIZE;
7418
7419 if (len == skb->len) {
7420 /* Complete frame received */
7421 l2cap_recv_frame(conn, skb);
7422 return 0;
7423 }
7424
7425 BT_DBG("Start: total len %d, frag len %d", len, skb->len);
7426
7427 if (skb->len > len) {
7428 BT_ERR("Frame is too long (len %d, expected len %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007429 skb->len, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007430 l2cap_conn_unreliable(conn, ECOMM);
7431 goto drop;
7432 }
7433
7434 /* Allocate skb for the complete frame (with header) */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03007435 conn->rx_skb = bt_skb_alloc(len, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03007436 if (!conn->rx_skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007437 goto drop;
7438
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007439 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007440 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007441 conn->rx_len = len - skb->len;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007442 break;
7443
7444 case ACL_CONT:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007445 BT_DBG("Cont: frag len %d (expecting %d)", skb->len, conn->rx_len);
7446
7447 if (!conn->rx_len) {
7448 BT_ERR("Unexpected continuation frame (len %d)", skb->len);
7449 l2cap_conn_unreliable(conn, ECOMM);
7450 goto drop;
7451 }
7452
7453 if (skb->len > conn->rx_len) {
7454 BT_ERR("Fragment is too long (len %d, expected %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007455 skb->len, conn->rx_len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007456 kfree_skb(conn->rx_skb);
7457 conn->rx_skb = NULL;
7458 conn->rx_len = 0;
7459 l2cap_conn_unreliable(conn, ECOMM);
7460 goto drop;
7461 }
7462
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007463 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007464 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007465 conn->rx_len -= skb->len;
7466
7467 if (!conn->rx_len) {
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007468 /* Complete frame received. l2cap_recv_frame
7469 * takes ownership of the skb so set the global
7470 * rx_skb pointer to NULL first.
7471 */
7472 struct sk_buff *rx_skb = conn->rx_skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007473 conn->rx_skb = NULL;
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007474 l2cap_recv_frame(conn, rx_skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007475 }
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007476 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007477 }
7478
7479drop:
7480 kfree_skb(skb);
7481 return 0;
7482}
7483
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007484static int l2cap_debugfs_show(struct seq_file *f, void *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007485{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007486 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007487
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007488 read_lock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007489
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007490 list_for_each_entry(c, &chan_list, global_l) {
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03007491 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 -07007492 &c->src, &c->dst,
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03007493 c->state, __le16_to_cpu(c->psm),
7494 c->scid, c->dcid, c->imtu, c->omtu,
7495 c->sec_level, c->mode);
Andrei Emeltchenko61e1b4b2012-01-19 11:19:50 +02007496 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007497
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007498 read_unlock(&chan_list_lock);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007499
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007500 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007501}
7502
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007503static int l2cap_debugfs_open(struct inode *inode, struct file *file)
7504{
7505 return single_open(file, l2cap_debugfs_show, inode->i_private);
7506}
7507
7508static const struct file_operations l2cap_debugfs_fops = {
7509 .open = l2cap_debugfs_open,
7510 .read = seq_read,
7511 .llseek = seq_lseek,
7512 .release = single_release,
7513};
7514
7515static struct dentry *l2cap_debugfs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007516
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007517int __init l2cap_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007518{
7519 int err;
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007520
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007521 err = l2cap_init_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007522 if (err < 0)
7523 return err;
7524
Marcel Holtmann1120e4b2013-10-17 17:24:16 -07007525 if (IS_ERR_OR_NULL(bt_debugfs))
7526 return 0;
7527
7528 l2cap_debugfs = debugfs_create_file("l2cap", 0444, bt_debugfs,
7529 NULL, &l2cap_debugfs_fops);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007530
Samuel Ortiz40b93972014-05-14 17:53:35 +02007531 debugfs_create_u16("l2cap_le_max_credits", 0644, bt_debugfs,
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02007532 &le_max_credits);
Samuel Ortiz40b93972014-05-14 17:53:35 +02007533 debugfs_create_u16("l2cap_le_default_mps", 0644, bt_debugfs,
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02007534 &le_default_mps);
7535
Linus Torvalds1da177e2005-04-16 15:20:36 -07007536 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007537}
7538
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007539void l2cap_exit(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007540{
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007541 debugfs_remove(l2cap_debugfs);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007542 l2cap_cleanup_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007543}
7544
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03007545module_param(disable_ertm, bool, 0644);
7546MODULE_PARM_DESC(disable_ertm, "Disable enhanced retransmission mode");