blob: a47a14efd5aa9c4cba9f2b7f13594de1fea738e5 [file] [log] [blame]
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2000-2001 Qualcomm Incorporated
Gustavo F. Padovance5706b2010-07-13 11:57:11 -03004 Copyright (C) 2009-2010 Gustavo F. Padovan <gustavo@padovan.org>
Gustavo F. Padovan5d8868f2010-07-16 16:18:39 -03005 Copyright (C) 2010 Google Inc.
Gustavo F. Padovan590051d2011-12-18 13:39:33 -02006 Copyright (C) 2011 ProFUSION Embedded Systems
Mat Martineau422e9252012-04-27 16:50:55 -07007 Copyright (c) 2012 Code Aurora Forum. All rights reserved.
Linus Torvalds1da177e2005-04-16 15:20:36 -07008
9 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
10
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License version 2 as
13 published by the Free Software Foundation;
14
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
18 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090019 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
20 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
21 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
Linus Torvalds1da177e2005-04-16 15:20:36 -070022 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090024 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
25 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
Linus Torvalds1da177e2005-04-16 15:20:36 -070026 SOFTWARE IS DISCLAIMED.
27*/
28
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020029/* Bluetooth L2CAP core. */
Linus Torvalds1da177e2005-04-16 15:20:36 -070030
Linus Torvalds1da177e2005-04-16 15:20:36 -070031#include <linux/module.h>
32
Marcel Holtmannaef7d972010-03-21 05:27:45 +010033#include <linux/debugfs.h>
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -030034#include <linux/crc16.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070035
36#include <net/bluetooth/bluetooth.h>
37#include <net/bluetooth/hci_core.h>
38#include <net/bluetooth/l2cap.h>
Marcel Holtmann7ef9fbf2013-10-10 14:54:14 -070039
Marcel Holtmannac4b7232013-10-10 14:54:16 -070040#include "smp.h"
Marcel Holtmann70247282013-10-10 14:54:15 -070041#include "a2mp.h"
Marcel Holtmann7ef9fbf2013-10-10 14:54:14 -070042#include "amp.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070043
Johan Hedberg0f1bfe42014-01-27 15:11:35 -080044#define LE_FLOWCTL_MAX_CREDITS 65535
45
Mat Martineaud1de6d42012-05-17 20:53:55 -070046bool disable_ertm;
Marcel Holtmannf0709e02007-10-20 13:38:51 +020047
Marcel Holtmann547d1032013-10-12 08:18:19 -070048static u32 l2cap_feat_mask = L2CAP_FEAT_FIXED_CHAN | L2CAP_FEAT_UCD;
Marcel Holtmanna6801ca2014-07-11 06:03:08 +020049static u8 l2cap_fixed_chan[8] = { L2CAP_FC_SIG_BREDR | L2CAP_FC_CONNLESS, };
Linus Torvalds1da177e2005-04-16 15:20:36 -070050
Johannes Bergb5ad8b72011-06-01 08:54:45 +020051static LIST_HEAD(chan_list);
52static DEFINE_RWLOCK(chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -070053
Johan Hedbergf15b8ec2013-12-03 15:08:25 +020054static u16 le_max_credits = L2CAP_LE_MAX_CREDITS;
55static u16 le_default_mps = L2CAP_LE_DEFAULT_MPS;
56
Linus Torvalds1da177e2005-04-16 15:20:36 -070057static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +010058 u8 code, u8 ident, u16 dlen, void *data);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -030059static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len,
Gustavo Padovan2d792812012-10-06 10:07:01 +010060 void *data);
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -030061static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +020062static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err);
Linus Torvalds1da177e2005-04-16 15:20:36 -070063
Gustavo Padovand6603662012-05-21 13:58:22 -030064static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
Gustavo Padovan2d792812012-10-06 10:07:01 +010065 struct sk_buff_head *skbs, u8 event);
Mat Martineau608bcc62012-05-17 20:53:32 -070066
Marcel Holtmann4f1654e2013-10-13 08:50:41 -070067static inline __u8 bdaddr_type(struct hci_conn *hcon, __u8 type)
68{
69 if (hcon->type == LE_LINK) {
70 if (type == ADDR_LE_DEV_PUBLIC)
71 return BDADDR_LE_PUBLIC;
72 else
73 return BDADDR_LE_RANDOM;
74 }
75
76 return BDADDR_BREDR;
77}
78
Marcel Holtmann01394182006-07-03 10:02:46 +020079/* ---- L2CAP channels ---- */
Gustavo F. Padovan71ba0e52011-05-17 14:34:52 -030080
Gustavo Padovan2d792812012-10-06 10:07:01 +010081static struct l2cap_chan *__l2cap_get_chan_by_dcid(struct l2cap_conn *conn,
82 u16 cid)
Marcel Holtmann01394182006-07-03 10:02:46 +020083{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020084 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -030085
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020086 list_for_each_entry(c, &conn->chan_l, list) {
87 if (c->dcid == cid)
88 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +020089 }
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020090 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +020091}
92
Gustavo Padovan2d792812012-10-06 10:07:01 +010093static struct l2cap_chan *__l2cap_get_chan_by_scid(struct l2cap_conn *conn,
94 u16 cid)
Marcel Holtmann01394182006-07-03 10:02:46 +020095{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020096 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -030097
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020098 list_for_each_entry(c, &conn->chan_l, list) {
99 if (c->scid == cid)
100 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +0200101 }
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200102 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200103}
104
105/* Find channel with given SCID.
Mat Martineauef191ad2012-05-02 09:42:00 -0700106 * Returns locked channel. */
Gustavo Padovan2d792812012-10-06 10:07:01 +0100107static struct l2cap_chan *l2cap_get_chan_by_scid(struct l2cap_conn *conn,
108 u16 cid)
Marcel Holtmann01394182006-07-03 10:02:46 +0200109{
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300110 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300111
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200112 mutex_lock(&conn->chan_lock);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300113 c = __l2cap_get_chan_by_scid(conn, cid);
Mat Martineauef191ad2012-05-02 09:42:00 -0700114 if (c)
115 l2cap_chan_lock(c);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200116 mutex_unlock(&conn->chan_lock);
117
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300118 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +0200119}
120
Mat Martineaub1a130b2012-10-23 15:24:09 -0700121/* Find channel with given DCID.
122 * Returns locked channel.
123 */
124static struct l2cap_chan *l2cap_get_chan_by_dcid(struct l2cap_conn *conn,
125 u16 cid)
126{
127 struct l2cap_chan *c;
128
129 mutex_lock(&conn->chan_lock);
130 c = __l2cap_get_chan_by_dcid(conn, cid);
131 if (c)
132 l2cap_chan_lock(c);
133 mutex_unlock(&conn->chan_lock);
134
135 return c;
136}
137
Gustavo Padovan2d792812012-10-06 10:07:01 +0100138static struct l2cap_chan *__l2cap_get_chan_by_ident(struct l2cap_conn *conn,
139 u8 ident)
Marcel Holtmann01394182006-07-03 10:02:46 +0200140{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200141 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300142
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200143 list_for_each_entry(c, &conn->chan_l, list) {
144 if (c->ident == ident)
145 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +0200146 }
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200147 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200148}
149
Mat Martineau5b155ef2012-10-23 15:24:14 -0700150static struct l2cap_chan *l2cap_get_chan_by_ident(struct l2cap_conn *conn,
151 u8 ident)
152{
153 struct l2cap_chan *c;
154
155 mutex_lock(&conn->chan_lock);
156 c = __l2cap_get_chan_by_ident(conn, ident);
157 if (c)
158 l2cap_chan_lock(c);
159 mutex_unlock(&conn->chan_lock);
160
161 return c;
162}
163
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300164static struct l2cap_chan *__l2cap_global_chan_by_addr(__le16 psm, bdaddr_t *src)
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300165{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300166 struct l2cap_chan *c;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300167
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300168 list_for_each_entry(c, &chan_list, global_l) {
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700169 if (c->sport == psm && !bacmp(&c->src, src))
Szymon Janc250938c2011-11-16 09:32:22 +0100170 return c;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300171 }
Szymon Janc250938c2011-11-16 09:32:22 +0100172 return NULL;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300173}
174
175int l2cap_add_psm(struct l2cap_chan *chan, bdaddr_t *src, __le16 psm)
176{
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300177 int err;
178
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200179 write_lock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300180
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300181 if (psm && __l2cap_global_chan_by_addr(psm, src)) {
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300182 err = -EADDRINUSE;
183 goto done;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300184 }
185
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300186 if (psm) {
187 chan->psm = psm;
188 chan->sport = psm;
189 err = 0;
190 } else {
191 u16 p;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300192
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300193 err = -EINVAL;
194 for (p = 0x1001; p < 0x1100; p += 2)
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300195 if (!__l2cap_global_chan_by_addr(cpu_to_le16(p), src)) {
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300196 chan->psm = cpu_to_le16(p);
197 chan->sport = cpu_to_le16(p);
198 err = 0;
199 break;
200 }
201 }
202
203done:
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200204 write_unlock(&chan_list_lock);
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300205 return err;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300206}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300207EXPORT_SYMBOL_GPL(l2cap_add_psm);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300208
209int l2cap_add_scid(struct l2cap_chan *chan, __u16 scid)
210{
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200211 write_lock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300212
213 chan->scid = scid;
214
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200215 write_unlock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300216
217 return 0;
218}
219
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300220static u16 l2cap_alloc_cid(struct l2cap_conn *conn)
Marcel Holtmann01394182006-07-03 10:02:46 +0200221{
Johan Hedberge77af752013-10-08 10:31:00 +0200222 u16 cid, dyn_end;
Marcel Holtmann01394182006-07-03 10:02:46 +0200223
Johan Hedberge77af752013-10-08 10:31:00 +0200224 if (conn->hcon->type == LE_LINK)
225 dyn_end = L2CAP_CID_LE_DYN_END;
226 else
227 dyn_end = L2CAP_CID_DYN_END;
228
229 for (cid = L2CAP_CID_DYN_START; cid < dyn_end; cid++) {
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300230 if (!__l2cap_get_chan_by_scid(conn, cid))
Marcel Holtmann01394182006-07-03 10:02:46 +0200231 return cid;
232 }
233
234 return 0;
235}
236
Gustavo Padovanf93fa272013-10-21 14:21:40 -0200237static void l2cap_state_change(struct l2cap_chan *chan, int state)
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300238{
Andrei Emeltchenko42d2d872012-02-17 11:40:57 +0200239 BT_DBG("chan %p %s -> %s", chan, state_to_string(chan->state),
Gustavo Padovan2d792812012-10-06 10:07:01 +0100240 state_to_string(state));
Gustavo F. Padovanbadaaa02011-11-23 20:11:46 -0200241
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300242 chan->state = state;
Gustavo Padovan53f52122013-10-15 19:24:45 -0300243 chan->ops->state_change(chan, state, 0);
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300244}
245
Gustavo Padovanf8e73012013-10-15 19:24:46 -0300246static inline void l2cap_state_change_and_error(struct l2cap_chan *chan,
247 int state, int err)
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +0200248{
Gustavo Padovanf8e73012013-10-15 19:24:46 -0300249 chan->state = state;
Gustavo Padovan53f52122013-10-15 19:24:45 -0300250 chan->ops->state_change(chan, chan->state, err);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +0200251}
252
253static inline void l2cap_chan_set_err(struct l2cap_chan *chan, int err)
254{
Gustavo Padovanf8e73012013-10-15 19:24:46 -0300255 chan->ops->state_change(chan, chan->state, err);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +0200256}
257
Mat Martineau4239d162012-05-17 20:53:49 -0700258static void __set_retrans_timer(struct l2cap_chan *chan)
259{
260 if (!delayed_work_pending(&chan->monitor_timer) &&
261 chan->retrans_timeout) {
262 l2cap_set_timer(chan, &chan->retrans_timer,
263 msecs_to_jiffies(chan->retrans_timeout));
264 }
265}
266
267static void __set_monitor_timer(struct l2cap_chan *chan)
268{
269 __clear_retrans_timer(chan);
270 if (chan->monitor_timeout) {
271 l2cap_set_timer(chan, &chan->monitor_timer,
272 msecs_to_jiffies(chan->monitor_timeout));
273 }
274}
275
Mat Martineau608bcc62012-05-17 20:53:32 -0700276static struct sk_buff *l2cap_ertm_seq_in_queue(struct sk_buff_head *head,
277 u16 seq)
278{
279 struct sk_buff *skb;
280
281 skb_queue_walk(head, skb) {
282 if (bt_cb(skb)->control.txseq == seq)
283 return skb;
284 }
285
286 return NULL;
287}
288
Mat Martineau3c588192012-04-11 10:48:42 -0700289/* ---- L2CAP sequence number lists ---- */
290
291/* For ERTM, ordered lists of sequence numbers must be tracked for
292 * SREJ requests that are received and for frames that are to be
293 * retransmitted. These seq_list functions implement a singly-linked
294 * list in an array, where membership in the list can also be checked
295 * in constant time. Items can also be added to the tail of the list
296 * and removed from the head in constant time, without further memory
297 * allocs or frees.
298 */
299
300static int l2cap_seq_list_init(struct l2cap_seq_list *seq_list, u16 size)
301{
302 size_t alloc_size, i;
303
304 /* Allocated size is a power of 2 to map sequence numbers
305 * (which may be up to 14 bits) in to a smaller array that is
306 * sized for the negotiated ERTM transmit windows.
307 */
308 alloc_size = roundup_pow_of_two(size);
309
310 seq_list->list = kmalloc(sizeof(u16) * alloc_size, GFP_KERNEL);
311 if (!seq_list->list)
312 return -ENOMEM;
313
314 seq_list->mask = alloc_size - 1;
315 seq_list->head = L2CAP_SEQ_LIST_CLEAR;
316 seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
317 for (i = 0; i < alloc_size; i++)
318 seq_list->list[i] = L2CAP_SEQ_LIST_CLEAR;
319
320 return 0;
321}
322
323static inline void l2cap_seq_list_free(struct l2cap_seq_list *seq_list)
324{
325 kfree(seq_list->list);
326}
327
328static inline bool l2cap_seq_list_contains(struct l2cap_seq_list *seq_list,
329 u16 seq)
330{
331 /* Constant-time check for list membership */
332 return seq_list->list[seq & seq_list->mask] != L2CAP_SEQ_LIST_CLEAR;
333}
334
Mat Martineau3c588192012-04-11 10:48:42 -0700335static inline u16 l2cap_seq_list_pop(struct l2cap_seq_list *seq_list)
336{
Johan Hedberg03a0c5d2014-01-18 21:32:59 +0200337 u16 seq = seq_list->head;
338 u16 mask = seq_list->mask;
339
340 seq_list->head = seq_list->list[seq & mask];
341 seq_list->list[seq & mask] = L2CAP_SEQ_LIST_CLEAR;
342
343 if (seq_list->head == L2CAP_SEQ_LIST_TAIL) {
344 seq_list->head = L2CAP_SEQ_LIST_CLEAR;
345 seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
346 }
347
348 return seq;
Mat Martineau3c588192012-04-11 10:48:42 -0700349}
350
351static void l2cap_seq_list_clear(struct l2cap_seq_list *seq_list)
352{
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300353 u16 i;
Mat Martineau3c588192012-04-11 10:48:42 -0700354
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300355 if (seq_list->head == L2CAP_SEQ_LIST_CLEAR)
356 return;
357
358 for (i = 0; i <= seq_list->mask; i++)
359 seq_list->list[i] = L2CAP_SEQ_LIST_CLEAR;
360
361 seq_list->head = L2CAP_SEQ_LIST_CLEAR;
362 seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
Mat Martineau3c588192012-04-11 10:48:42 -0700363}
364
365static void l2cap_seq_list_append(struct l2cap_seq_list *seq_list, u16 seq)
366{
367 u16 mask = seq_list->mask;
368
369 /* All appends happen in constant time */
370
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300371 if (seq_list->list[seq & mask] != L2CAP_SEQ_LIST_CLEAR)
372 return;
Mat Martineau3c588192012-04-11 10:48:42 -0700373
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300374 if (seq_list->tail == L2CAP_SEQ_LIST_CLEAR)
375 seq_list->head = seq;
376 else
377 seq_list->list[seq_list->tail & mask] = seq;
378
379 seq_list->tail = seq;
380 seq_list->list[seq & mask] = L2CAP_SEQ_LIST_TAIL;
Mat Martineau3c588192012-04-11 10:48:42 -0700381}
382
Gustavo F. Padovan721c4182011-06-23 19:29:58 -0300383static void l2cap_chan_timeout(struct work_struct *work)
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300384{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -0300385 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100386 chan_timer.work);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200387 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300388 int reason;
389
Andrei Emeltchenkoe05dcc32012-02-17 11:40:56 +0200390 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300391
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200392 mutex_lock(&conn->chan_lock);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200393 l2cap_chan_lock(chan);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300394
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300395 if (chan->state == BT_CONNECTED || chan->state == BT_CONFIG)
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300396 reason = ECONNREFUSED;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300397 else if (chan->state == BT_CONNECT &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100398 chan->sec_level != BT_SECURITY_SDP)
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300399 reason = ECONNREFUSED;
400 else
401 reason = ETIMEDOUT;
402
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300403 l2cap_chan_close(chan, reason);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300404
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200405 l2cap_chan_unlock(chan);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300406
Gustavo Padovan80b98022012-05-27 22:27:51 -0300407 chan->ops->close(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200408 mutex_unlock(&conn->chan_lock);
409
Ulisses Furquim371fd832011-12-21 20:02:36 -0200410 l2cap_chan_put(chan);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300411}
412
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -0300413struct l2cap_chan *l2cap_chan_create(void)
Marcel Holtmann01394182006-07-03 10:02:46 +0200414{
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300415 struct l2cap_chan *chan;
Marcel Holtmann01394182006-07-03 10:02:46 +0200416
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300417 chan = kzalloc(sizeof(*chan), GFP_ATOMIC);
418 if (!chan)
419 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200420
Andrei Emeltchenkoc03b3552012-02-21 12:54:56 +0200421 mutex_init(&chan->lock);
422
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200423 write_lock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300424 list_add(&chan->global_l, &chan_list);
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200425 write_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300426
Gustavo F. Padovan721c4182011-06-23 19:29:58 -0300427 INIT_DELAYED_WORK(&chan->chan_timer, l2cap_chan_timeout);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300428
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300429 chan->state = BT_OPEN;
430
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530431 kref_init(&chan->kref);
Gustavo F. Padovan71ba0e52011-05-17 14:34:52 -0300432
Mat Martineau28270112012-05-17 21:14:09 -0700433 /* This flag is cleared in l2cap_chan_ready() */
434 set_bit(CONF_NOT_COMPLETE, &chan->conf_state);
435
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -0300436 BT_DBG("chan %p", chan);
Szymon Jancabc545b2011-11-03 16:05:44 +0100437
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300438 return chan;
Marcel Holtmann01394182006-07-03 10:02:46 +0200439}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300440EXPORT_SYMBOL_GPL(l2cap_chan_create);
Marcel Holtmann01394182006-07-03 10:02:46 +0200441
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530442static void l2cap_chan_destroy(struct kref *kref)
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300443{
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530444 struct l2cap_chan *chan = container_of(kref, struct l2cap_chan, kref);
445
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +0530446 BT_DBG("chan %p", chan);
447
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200448 write_lock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300449 list_del(&chan->global_l);
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200450 write_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300451
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +0530452 kfree(chan);
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300453}
454
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530455void l2cap_chan_hold(struct l2cap_chan *c)
456{
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530457 BT_DBG("chan %p orig refcnt %d", c, atomic_read(&c->kref.refcount));
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530458
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530459 kref_get(&c->kref);
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530460}
461
462void l2cap_chan_put(struct l2cap_chan *c)
463{
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530464 BT_DBG("chan %p orig refcnt %d", c, atomic_read(&c->kref.refcount));
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530465
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530466 kref_put(&c->kref, l2cap_chan_destroy);
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530467}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300468EXPORT_SYMBOL_GPL(l2cap_chan_put);
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530469
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300470void l2cap_chan_set_defaults(struct l2cap_chan *chan)
471{
472 chan->fcs = L2CAP_FCS_CRC16;
473 chan->max_tx = L2CAP_DEFAULT_MAX_TX;
474 chan->tx_win = L2CAP_DEFAULT_TX_WINDOW;
475 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
Jukka Rissanen6a5e8162014-05-28 14:43:04 +0300476 chan->remote_max_tx = chan->max_tx;
477 chan->remote_tx_win = chan->tx_win;
Mat Martineauc20f8e32012-07-10 05:47:07 -0700478 chan->ack_win = L2CAP_DEFAULT_TX_WINDOW;
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300479 chan->sec_level = BT_SECURITY_LOW;
Jukka Rissanen6a5e8162014-05-28 14:43:04 +0300480 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
481 chan->retrans_timeout = L2CAP_DEFAULT_RETRANS_TO;
482 chan->monitor_timeout = L2CAP_DEFAULT_MONITOR_TO;
483 chan->conf_state = 0;
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300484
485 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
486}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300487EXPORT_SYMBOL_GPL(l2cap_chan_set_defaults);
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300488
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200489static void l2cap_le_flowctl_init(struct l2cap_chan *chan)
Johan Hedberg38319712013-05-17 12:49:23 +0300490{
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200491 chan->sdu = NULL;
492 chan->sdu_last_frag = NULL;
493 chan->sdu_len = 0;
Johan Hedberg0cd75f72013-05-17 13:09:05 +0300494 chan->tx_credits = 0;
Johan Hedbergf15b8ec2013-12-03 15:08:25 +0200495 chan->rx_credits = le_max_credits;
Johan Hedbergd1d79412014-01-27 15:11:33 -0800496 chan->mps = min_t(u16, chan->imtu, le_default_mps);
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200497
498 skb_queue_head_init(&chan->tx_q);
Johan Hedberg38319712013-05-17 12:49:23 +0300499}
500
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +0300501void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
Marcel Holtmann01394182006-07-03 10:02:46 +0200502{
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -0300503 BT_DBG("conn %p, psm 0x%2.2x, dcid 0x%4.4x", conn,
Andrei Emeltchenko097db762012-03-09 14:16:17 +0200504 __le16_to_cpu(chan->psm), chan->dcid);
Marcel Holtmann01394182006-07-03 10:02:46 +0200505
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +0200506 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
Marcel Holtmann2950f212009-02-12 14:02:50 +0100507
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300508 chan->conn = conn;
Marcel Holtmann01394182006-07-03 10:02:46 +0200509
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200510 switch (chan->chan_type) {
511 case L2CAP_CHAN_CONN_ORIENTED:
Johan Hedberg21626e62014-01-24 10:35:41 +0200512 /* Alloc CID for connection-oriented socket */
513 chan->scid = l2cap_alloc_cid(conn);
514 if (conn->hcon->type == ACL_LINK)
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300515 chan->omtu = L2CAP_DEFAULT_MTU;
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200516 break;
517
518 case L2CAP_CHAN_CONN_LESS:
Marcel Holtmann01394182006-07-03 10:02:46 +0200519 /* Connectionless socket */
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300520 chan->scid = L2CAP_CID_CONN_LESS;
521 chan->dcid = L2CAP_CID_CONN_LESS;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300522 chan->omtu = L2CAP_DEFAULT_MTU;
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200523 break;
524
Johan Hedberg2338a7e2014-01-24 10:35:40 +0200525 case L2CAP_CHAN_FIXED:
526 /* Caller will set CID and CID specific MTU values */
Andrei Emeltchenko416fa752012-05-29 13:59:16 +0300527 break;
528
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200529 default:
Marcel Holtmann01394182006-07-03 10:02:46 +0200530 /* Raw socket can send/recv signalling messages only */
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300531 chan->scid = L2CAP_CID_SIGNALING;
532 chan->dcid = L2CAP_CID_SIGNALING;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300533 chan->omtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann01394182006-07-03 10:02:46 +0200534 }
535
Andrei Emeltchenko8f7975b2011-10-13 16:18:54 +0300536 chan->local_id = L2CAP_BESTEFFORT_ID;
537 chan->local_stype = L2CAP_SERV_BESTEFFORT;
538 chan->local_msdu = L2CAP_DEFAULT_MAX_SDU_SIZE;
539 chan->local_sdu_itime = L2CAP_DEFAULT_SDU_ITIME;
540 chan->local_acc_lat = L2CAP_DEFAULT_ACC_LAT;
Andrei Emeltchenko8936fa62012-10-08 11:14:41 +0300541 chan->local_flush_to = L2CAP_EFS_DEFAULT_FLUSH_TO;
Andrei Emeltchenko8f7975b2011-10-13 16:18:54 +0300542
Ulisses Furquim371fd832011-12-21 20:02:36 -0200543 l2cap_chan_hold(chan);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300544
Johan Hedberg5ee98912013-04-29 19:35:43 +0300545 hci_conn_hold(conn->hcon);
546
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200547 list_add(&chan->list, &conn->chan_l);
Andrei Emeltchenko643162a2012-02-22 17:11:55 +0200548}
549
Andrei Emeltchenko466f8002012-05-29 13:59:01 +0300550void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
Andrei Emeltchenko643162a2012-02-22 17:11:55 +0200551{
552 mutex_lock(&conn->chan_lock);
553 __l2cap_chan_add(conn, chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200554 mutex_unlock(&conn->chan_lock);
Marcel Holtmann01394182006-07-03 10:02:46 +0200555}
556
Andrei Emeltchenko466f8002012-05-29 13:59:01 +0300557void l2cap_chan_del(struct l2cap_chan *chan, int err)
Marcel Holtmann01394182006-07-03 10:02:46 +0200558{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300559 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann01394182006-07-03 10:02:46 +0200560
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -0300561 __clear_chan_timer(chan);
Marcel Holtmann01394182006-07-03 10:02:46 +0200562
Gustavo F. Padovan49208c92011-04-04 15:59:54 -0300563 BT_DBG("chan %p, conn %p, err %d", chan, conn, err);
Marcel Holtmann01394182006-07-03 10:02:46 +0200564
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900565 if (conn) {
Andrei Emeltchenko56f60982012-10-15 11:58:44 +0300566 struct amp_mgr *mgr = conn->hcon->amp_mgr;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300567 /* Delete from channel list */
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200568 list_del(&chan->list);
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -0200569
Ulisses Furquim371fd832011-12-21 20:02:36 -0200570 l2cap_chan_put(chan);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300571
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300572 chan->conn = NULL;
Andrei Emeltchenko3cabbfd2012-05-31 11:01:37 +0300573
Johan Hedberg2338a7e2014-01-24 10:35:40 +0200574 if (chan->scid != L2CAP_CID_A2MP)
David Herrmann76a68ba2013-04-06 20:28:37 +0200575 hci_conn_drop(conn->hcon);
Andrei Emeltchenko56f60982012-10-15 11:58:44 +0300576
577 if (mgr && mgr->bredr_chan == chan)
578 mgr->bredr_chan = NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200579 }
580
Andrei Emeltchenko419e08c2012-10-31 15:46:34 +0200581 if (chan->hs_hchan) {
582 struct hci_chan *hs_hchan = chan->hs_hchan;
583
584 BT_DBG("chan %p disconnect hs_hchan %p", chan, hs_hchan);
585 amp_disconnect_logical_link(hs_hchan);
586 }
587
Gustavo Padovanb699ec02012-10-06 11:51:54 +0100588 chan->ops->teardown(chan, err);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200589
Mat Martineau28270112012-05-17 21:14:09 -0700590 if (test_bit(CONF_NOT_COMPLETE, &chan->conf_state))
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300591 return;
Gustavo F. Padovan2ead70b2011-04-01 15:13:36 -0300592
Gustavo Padovanee556f62012-05-18 20:22:38 -0300593 switch(chan->mode) {
594 case L2CAP_MODE_BASIC:
595 break;
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300596
Johan Hedberg38319712013-05-17 12:49:23 +0300597 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedberg177f8f22013-05-31 17:54:51 +0300598 skb_queue_purge(&chan->tx_q);
Johan Hedberg38319712013-05-17 12:49:23 +0300599 break;
600
Gustavo Padovanee556f62012-05-18 20:22:38 -0300601 case L2CAP_MODE_ERTM:
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -0300602 __clear_retrans_timer(chan);
603 __clear_monitor_timer(chan);
604 __clear_ack_timer(chan);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300605
Gustavo F. Padovanf1c67752011-03-25 20:36:10 -0300606 skb_queue_purge(&chan->srej_q);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300607
Mat Martineau3c588192012-04-11 10:48:42 -0700608 l2cap_seq_list_free(&chan->srej_list);
609 l2cap_seq_list_free(&chan->retrans_list);
Gustavo Padovanee556f62012-05-18 20:22:38 -0300610
611 /* fall through */
612
613 case L2CAP_MODE_STREAMING:
614 skb_queue_purge(&chan->tx_q);
615 break;
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300616 }
Gustavo Padovanee556f62012-05-18 20:22:38 -0300617
618 return;
Marcel Holtmann01394182006-07-03 10:02:46 +0200619}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300620EXPORT_SYMBOL_GPL(l2cap_chan_del);
Marcel Holtmann01394182006-07-03 10:02:46 +0200621
Johan Hedberg387a33e2014-02-18 21:41:33 +0200622void l2cap_conn_update_id_addr(struct hci_conn *hcon)
623{
624 struct l2cap_conn *conn = hcon->l2cap_data;
625 struct l2cap_chan *chan;
626
627 mutex_lock(&conn->chan_lock);
628
629 list_for_each_entry(chan, &conn->chan_l, list) {
630 l2cap_chan_lock(chan);
631 bacpy(&chan->dst, &hcon->dst);
632 chan->dst_type = bdaddr_type(hcon, hcon->dst_type);
633 l2cap_chan_unlock(chan);
634 }
635
636 mutex_unlock(&conn->chan_lock);
637}
638
Johan Hedberg27e2d4c2013-05-14 13:27:21 +0300639static void l2cap_chan_le_connect_reject(struct l2cap_chan *chan)
640{
641 struct l2cap_conn *conn = chan->conn;
642 struct l2cap_le_conn_rsp rsp;
643 u16 result;
644
645 if (test_bit(FLAG_DEFER_SETUP, &chan->flags))
646 result = L2CAP_CR_AUTHORIZATION;
647 else
648 result = L2CAP_CR_BAD_PSM;
649
650 l2cap_state_change(chan, BT_DISCONN);
651
652 rsp.dcid = cpu_to_le16(chan->scid);
653 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +0200654 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +0300655 rsp.credits = cpu_to_le16(chan->rx_credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +0300656 rsp.result = cpu_to_le16(result);
657
658 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp),
659 &rsp);
660}
661
Johan Hedberg791d60f2013-05-14 22:24:44 +0300662static void l2cap_chan_connect_reject(struct l2cap_chan *chan)
663{
664 struct l2cap_conn *conn = chan->conn;
665 struct l2cap_conn_rsp rsp;
666 u16 result;
667
668 if (test_bit(FLAG_DEFER_SETUP, &chan->flags))
669 result = L2CAP_CR_SEC_BLOCK;
670 else
671 result = L2CAP_CR_BAD_PSM;
672
673 l2cap_state_change(chan, BT_DISCONN);
674
675 rsp.scid = cpu_to_le16(chan->dcid);
676 rsp.dcid = cpu_to_le16(chan->scid);
677 rsp.result = cpu_to_le16(result);
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700678 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Johan Hedberg791d60f2013-05-14 22:24:44 +0300679
680 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, sizeof(rsp), &rsp);
681}
682
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300683void l2cap_chan_close(struct l2cap_chan *chan, int reason)
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300684{
685 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300686
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700687 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300688
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300689 switch (chan->state) {
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300690 case BT_LISTEN:
Gustavo Padovanb699ec02012-10-06 11:51:54 +0100691 chan->ops->teardown(chan, 0);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300692 break;
693
694 case BT_CONNECTED:
695 case BT_CONFIG:
Johan Hedberg7b25c9b2014-01-28 15:28:04 -0800696 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED) {
Gustavo Padovan8d836d72013-10-15 19:24:47 -0300697 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +0200698 l2cap_send_disconn_req(chan, reason);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300699 } else
700 l2cap_chan_del(chan, reason);
701 break;
702
703 case BT_CONNECT2:
Johan Hedberg791d60f2013-05-14 22:24:44 +0300704 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED) {
705 if (conn->hcon->type == ACL_LINK)
706 l2cap_chan_connect_reject(chan);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +0300707 else if (conn->hcon->type == LE_LINK)
708 l2cap_chan_le_connect_reject(chan);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300709 }
710
711 l2cap_chan_del(chan, reason);
712 break;
713
714 case BT_CONNECT:
715 case BT_DISCONN:
716 l2cap_chan_del(chan, reason);
717 break;
718
719 default:
Gustavo Padovanb699ec02012-10-06 11:51:54 +0100720 chan->ops->teardown(chan, 0);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300721 break;
722 }
723}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300724EXPORT_SYMBOL(l2cap_chan_close);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300725
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300726static inline u8 l2cap_get_auth_type(struct l2cap_chan *chan)
Johan Hedberg8556edd32011-01-19 12:06:50 +0530727{
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700728 switch (chan->chan_type) {
729 case L2CAP_CHAN_RAW:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300730 switch (chan->sec_level) {
Johan Hedberg8556edd32011-01-19 12:06:50 +0530731 case BT_SECURITY_HIGH:
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800732 case BT_SECURITY_FIPS:
Johan Hedberg8556edd32011-01-19 12:06:50 +0530733 return HCI_AT_DEDICATED_BONDING_MITM;
734 case BT_SECURITY_MEDIUM:
735 return HCI_AT_DEDICATED_BONDING;
736 default:
737 return HCI_AT_NO_BONDING;
738 }
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700739 break;
Marcel Holtmann3124b842013-10-12 07:19:32 -0700740 case L2CAP_CHAN_CONN_LESS:
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700741 if (chan->psm == cpu_to_le16(L2CAP_PSM_3DSP)) {
Marcel Holtmann3124b842013-10-12 07:19:32 -0700742 if (chan->sec_level == BT_SECURITY_LOW)
743 chan->sec_level = BT_SECURITY_SDP;
744 }
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800745 if (chan->sec_level == BT_SECURITY_HIGH ||
746 chan->sec_level == BT_SECURITY_FIPS)
Marcel Holtmann3124b842013-10-12 07:19:32 -0700747 return HCI_AT_NO_BONDING_MITM;
748 else
749 return HCI_AT_NO_BONDING;
750 break;
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700751 case L2CAP_CHAN_CONN_ORIENTED:
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700752 if (chan->psm == cpu_to_le16(L2CAP_PSM_SDP)) {
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700753 if (chan->sec_level == BT_SECURITY_LOW)
754 chan->sec_level = BT_SECURITY_SDP;
Johan Hedberg8556edd32011-01-19 12:06:50 +0530755
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800756 if (chan->sec_level == BT_SECURITY_HIGH ||
757 chan->sec_level == BT_SECURITY_FIPS)
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700758 return HCI_AT_NO_BONDING_MITM;
759 else
760 return HCI_AT_NO_BONDING;
761 }
762 /* fall through */
763 default:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300764 switch (chan->sec_level) {
Johan Hedberg8556edd32011-01-19 12:06:50 +0530765 case BT_SECURITY_HIGH:
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800766 case BT_SECURITY_FIPS:
Johan Hedberg8556edd32011-01-19 12:06:50 +0530767 return HCI_AT_GENERAL_BONDING_MITM;
768 case BT_SECURITY_MEDIUM:
769 return HCI_AT_GENERAL_BONDING;
770 default:
771 return HCI_AT_NO_BONDING;
772 }
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700773 break;
Johan Hedberg8556edd32011-01-19 12:06:50 +0530774 }
775}
776
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200777/* Service level security */
Johan Hedberge7cafc42014-07-17 15:35:38 +0300778int l2cap_chan_check_security(struct l2cap_chan *chan, bool initiator)
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200779{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300780 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100781 __u8 auth_type;
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200782
Johan Hedberga17de2f2013-05-14 13:25:37 +0300783 if (conn->hcon->type == LE_LINK)
784 return smp_conn_security(conn->hcon, chan->sec_level);
785
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300786 auth_type = l2cap_get_auth_type(chan);
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100787
Johan Hedberge7cafc42014-07-17 15:35:38 +0300788 return hci_conn_security(conn->hcon, chan->sec_level, auth_type,
789 initiator);
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200790}
791
Johannes Bergb5ad8b72011-06-01 08:54:45 +0200792static u8 l2cap_get_ident(struct l2cap_conn *conn)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200793{
794 u8 id;
795
796 /* Get next available identificator.
797 * 1 - 128 are used by kernel.
798 * 129 - 199 are reserved.
799 * 200 - 254 are used by utilities like l2ping, etc.
800 */
801
Marcel Holtmann5a54e7c2014-07-13 20:50:15 +0200802 mutex_lock(&conn->ident_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200803
804 if (++conn->tx_ident > 128)
805 conn->tx_ident = 1;
806
807 id = conn->tx_ident;
808
Marcel Holtmann5a54e7c2014-07-13 20:50:15 +0200809 mutex_unlock(&conn->ident_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200810
811 return id;
812}
813
Gustavo Padovan2d792812012-10-06 10:07:01 +0100814static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len,
815 void *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200816{
817 struct sk_buff *skb = l2cap_build_cmd(conn, code, ident, len, data);
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +0200818 u8 flags;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200819
820 BT_DBG("code 0x%2.2x", code);
821
822 if (!skb)
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -0300823 return;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200824
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +0200825 if (lmp_no_flush_capable(conn->hcon->hdev))
826 flags = ACL_START_NO_FLUSH;
827 else
828 flags = ACL_START;
829
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700830 bt_cb(skb)->force_active = BT_POWER_FORCE_ACTIVE_ON;
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +0200831 skb->priority = HCI_PRIO_MAX;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700832
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200833 hci_send_acl(conn->hchan, skb, flags);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200834}
835
Mat Martineau02b0fbb2012-10-23 15:24:10 -0700836static bool __chan_is_moving(struct l2cap_chan *chan)
837{
838 return chan->move_state != L2CAP_MOVE_STABLE &&
839 chan->move_state != L2CAP_MOVE_WAIT_PREPARE;
840}
841
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200842static void l2cap_do_send(struct l2cap_chan *chan, struct sk_buff *skb)
843{
844 struct hci_conn *hcon = chan->conn->hcon;
845 u16 flags;
846
847 BT_DBG("chan %p, skb %p len %d priority %u", chan, skb, skb->len,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100848 skb->priority);
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200849
Mat Martineaud5f8a752012-10-23 15:24:18 -0700850 if (chan->hs_hcon && !__chan_is_moving(chan)) {
851 if (chan->hs_hchan)
852 hci_send_acl(chan->hs_hchan, skb, ACL_COMPLETE);
853 else
854 kfree_skb(skb);
855
856 return;
857 }
858
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200859 if (!test_bit(FLAG_FLUSHABLE, &chan->flags) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100860 lmp_no_flush_capable(hcon->hdev))
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200861 flags = ACL_START_NO_FLUSH;
862 else
863 flags = ACL_START;
864
865 bt_cb(skb)->force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
866 hci_send_acl(chan->conn->hchan, skb, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700867}
868
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700869static void __unpack_enhanced_control(u16 enh, struct l2cap_ctrl *control)
870{
871 control->reqseq = (enh & L2CAP_CTRL_REQSEQ) >> L2CAP_CTRL_REQSEQ_SHIFT;
872 control->final = (enh & L2CAP_CTRL_FINAL) >> L2CAP_CTRL_FINAL_SHIFT;
873
874 if (enh & L2CAP_CTRL_FRAME_TYPE) {
875 /* S-Frame */
876 control->sframe = 1;
877 control->poll = (enh & L2CAP_CTRL_POLL) >> L2CAP_CTRL_POLL_SHIFT;
878 control->super = (enh & L2CAP_CTRL_SUPERVISE) >> L2CAP_CTRL_SUPER_SHIFT;
879
880 control->sar = 0;
881 control->txseq = 0;
882 } else {
883 /* I-Frame */
884 control->sframe = 0;
885 control->sar = (enh & L2CAP_CTRL_SAR) >> L2CAP_CTRL_SAR_SHIFT;
886 control->txseq = (enh & L2CAP_CTRL_TXSEQ) >> L2CAP_CTRL_TXSEQ_SHIFT;
887
888 control->poll = 0;
889 control->super = 0;
890 }
891}
892
893static void __unpack_extended_control(u32 ext, struct l2cap_ctrl *control)
894{
895 control->reqseq = (ext & L2CAP_EXT_CTRL_REQSEQ) >> L2CAP_EXT_CTRL_REQSEQ_SHIFT;
896 control->final = (ext & L2CAP_EXT_CTRL_FINAL) >> L2CAP_EXT_CTRL_FINAL_SHIFT;
897
898 if (ext & L2CAP_EXT_CTRL_FRAME_TYPE) {
899 /* S-Frame */
900 control->sframe = 1;
901 control->poll = (ext & L2CAP_EXT_CTRL_POLL) >> L2CAP_EXT_CTRL_POLL_SHIFT;
902 control->super = (ext & L2CAP_EXT_CTRL_SUPERVISE) >> L2CAP_EXT_CTRL_SUPER_SHIFT;
903
904 control->sar = 0;
905 control->txseq = 0;
906 } else {
907 /* I-Frame */
908 control->sframe = 0;
909 control->sar = (ext & L2CAP_EXT_CTRL_SAR) >> L2CAP_EXT_CTRL_SAR_SHIFT;
910 control->txseq = (ext & L2CAP_EXT_CTRL_TXSEQ) >> L2CAP_EXT_CTRL_TXSEQ_SHIFT;
911
912 control->poll = 0;
913 control->super = 0;
914 }
915}
916
917static inline void __unpack_control(struct l2cap_chan *chan,
918 struct sk_buff *skb)
919{
920 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
921 __unpack_extended_control(get_unaligned_le32(skb->data),
922 &bt_cb(skb)->control);
Mat Martineaucec8ab6e2012-05-17 20:53:36 -0700923 skb_pull(skb, L2CAP_EXT_CTRL_SIZE);
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700924 } else {
925 __unpack_enhanced_control(get_unaligned_le16(skb->data),
926 &bt_cb(skb)->control);
Mat Martineaucec8ab6e2012-05-17 20:53:36 -0700927 skb_pull(skb, L2CAP_ENH_CTRL_SIZE);
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700928 }
929}
930
931static u32 __pack_extended_control(struct l2cap_ctrl *control)
932{
933 u32 packed;
934
935 packed = control->reqseq << L2CAP_EXT_CTRL_REQSEQ_SHIFT;
936 packed |= control->final << L2CAP_EXT_CTRL_FINAL_SHIFT;
937
938 if (control->sframe) {
939 packed |= control->poll << L2CAP_EXT_CTRL_POLL_SHIFT;
940 packed |= control->super << L2CAP_EXT_CTRL_SUPER_SHIFT;
941 packed |= L2CAP_EXT_CTRL_FRAME_TYPE;
942 } else {
943 packed |= control->sar << L2CAP_EXT_CTRL_SAR_SHIFT;
944 packed |= control->txseq << L2CAP_EXT_CTRL_TXSEQ_SHIFT;
945 }
946
947 return packed;
948}
949
950static u16 __pack_enhanced_control(struct l2cap_ctrl *control)
951{
952 u16 packed;
953
954 packed = control->reqseq << L2CAP_CTRL_REQSEQ_SHIFT;
955 packed |= control->final << L2CAP_CTRL_FINAL_SHIFT;
956
957 if (control->sframe) {
958 packed |= control->poll << L2CAP_CTRL_POLL_SHIFT;
959 packed |= control->super << L2CAP_CTRL_SUPER_SHIFT;
960 packed |= L2CAP_CTRL_FRAME_TYPE;
961 } else {
962 packed |= control->sar << L2CAP_CTRL_SAR_SHIFT;
963 packed |= control->txseq << L2CAP_CTRL_TXSEQ_SHIFT;
964 }
965
966 return packed;
967}
968
969static inline void __pack_control(struct l2cap_chan *chan,
970 struct l2cap_ctrl *control,
971 struct sk_buff *skb)
972{
973 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
974 put_unaligned_le32(__pack_extended_control(control),
975 skb->data + L2CAP_HDR_SIZE);
976 } else {
977 put_unaligned_le16(__pack_enhanced_control(control),
978 skb->data + L2CAP_HDR_SIZE);
979 }
980}
981
Gustavo Padovanba7aa642012-05-29 13:29:16 -0300982static inline unsigned int __ertm_hdr_size(struct l2cap_chan *chan)
983{
984 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
985 return L2CAP_EXT_HDR_SIZE;
986 else
987 return L2CAP_ENH_HDR_SIZE;
988}
989
Mat Martineaua67d7f62012-05-17 20:53:35 -0700990static struct sk_buff *l2cap_create_sframe_pdu(struct l2cap_chan *chan,
991 u32 control)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300992{
993 struct sk_buff *skb;
994 struct l2cap_hdr *lh;
Gustavo Padovanba7aa642012-05-29 13:29:16 -0300995 int hlen = __ertm_hdr_size(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300996
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300997 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +0300998 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300999
Mat Martineaua67d7f62012-05-17 20:53:35 -07001000 skb = bt_skb_alloc(hlen, GFP_KERNEL);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001001
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001002 if (!skb)
Mat Martineaua67d7f62012-05-17 20:53:35 -07001003 return ERR_PTR(-ENOMEM);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001004
1005 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001006 lh->len = cpu_to_le16(hlen - L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001007 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03001008
Mat Martineaua67d7f62012-05-17 20:53:35 -07001009 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
1010 put_unaligned_le32(control, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
1011 else
1012 put_unaligned_le16(control, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001013
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001014 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineaua67d7f62012-05-17 20:53:35 -07001015 u16 fcs = crc16(0, (u8 *)skb->data, skb->len);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03001016 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001017 }
1018
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001019 skb->priority = HCI_PRIO_MAX;
Mat Martineaua67d7f62012-05-17 20:53:35 -07001020 return skb;
1021}
1022
1023static void l2cap_send_sframe(struct l2cap_chan *chan,
1024 struct l2cap_ctrl *control)
1025{
1026 struct sk_buff *skb;
1027 u32 control_field;
1028
1029 BT_DBG("chan %p, control %p", chan, control);
1030
1031 if (!control->sframe)
1032 return;
1033
Mat Martineaub99e13a2012-10-23 15:24:19 -07001034 if (__chan_is_moving(chan))
1035 return;
1036
Mat Martineaua67d7f62012-05-17 20:53:35 -07001037 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state) &&
1038 !control->poll)
1039 control->final = 1;
1040
1041 if (control->super == L2CAP_SUPER_RR)
1042 clear_bit(CONN_RNR_SENT, &chan->conn_state);
1043 else if (control->super == L2CAP_SUPER_RNR)
1044 set_bit(CONN_RNR_SENT, &chan->conn_state);
1045
1046 if (control->super != L2CAP_SUPER_SREJ) {
1047 chan->last_acked_seq = control->reqseq;
1048 __clear_ack_timer(chan);
1049 }
1050
1051 BT_DBG("reqseq %d, final %d, poll %d, super %d", control->reqseq,
1052 control->final, control->poll, control->super);
1053
1054 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
1055 control_field = __pack_extended_control(control);
1056 else
1057 control_field = __pack_enhanced_control(control);
1058
1059 skb = l2cap_create_sframe_pdu(chan, control_field);
1060 if (!IS_ERR(skb))
1061 l2cap_do_send(chan, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001062}
1063
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001064static void l2cap_send_rr_or_rnr(struct l2cap_chan *chan, bool poll)
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001065{
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001066 struct l2cap_ctrl control;
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001067
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001068 BT_DBG("chan %p, poll %d", chan, poll);
1069
1070 memset(&control, 0, sizeof(control));
1071 control.sframe = 1;
1072 control.poll = poll;
1073
1074 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
1075 control.super = L2CAP_SUPER_RNR;
1076 else
1077 control.super = L2CAP_SUPER_RR;
1078
1079 control.reqseq = chan->buffer_seq;
1080 l2cap_send_sframe(chan, &control);
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001081}
1082
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001083static inline int __l2cap_no_conn_pending(struct l2cap_chan *chan)
Andrei Emeltchenkoe501d052010-07-08 12:14:41 +03001084{
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001085 return !test_bit(CONF_CONNECT_PEND, &chan->conf_state);
Andrei Emeltchenkoe501d052010-07-08 12:14:41 +03001086}
1087
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001088static bool __amp_capable(struct l2cap_chan *chan)
1089{
1090 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann1df7b172013-10-05 11:47:49 -07001091 struct hci_dev *hdev;
1092 bool amp_available = false;
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001093
Marcel Holtmann1df7b172013-10-05 11:47:49 -07001094 if (!conn->hs_enabled)
1095 return false;
1096
1097 if (!(conn->fixed_chan_mask & L2CAP_FC_A2MP))
1098 return false;
1099
1100 read_lock(&hci_dev_list_lock);
1101 list_for_each_entry(hdev, &hci_dev_list, list) {
1102 if (hdev->amp_type != AMP_TYPE_BREDR &&
1103 test_bit(HCI_UP, &hdev->flags)) {
1104 amp_available = true;
1105 break;
1106 }
1107 }
1108 read_unlock(&hci_dev_list_lock);
1109
1110 if (chan->chan_policy == BT_CHANNEL_POLICY_AMP_PREFERRED)
1111 return amp_available;
Marcel Holtmann848566b2013-10-01 22:59:22 -07001112
1113 return false;
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001114}
1115
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02001116static bool l2cap_check_efs(struct l2cap_chan *chan)
1117{
1118 /* Check EFS parameters */
1119 return true;
1120}
1121
Andrei Emeltchenko2766be42012-09-27 17:26:21 +03001122void l2cap_send_conn_req(struct l2cap_chan *chan)
Andrei Emeltchenko9b27f352012-02-24 16:00:00 +02001123{
1124 struct l2cap_conn *conn = chan->conn;
1125 struct l2cap_conn_req req;
1126
1127 req.scid = cpu_to_le16(chan->scid);
1128 req.psm = chan->psm;
1129
1130 chan->ident = l2cap_get_ident(conn);
1131
1132 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
1133
1134 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_REQ, sizeof(req), &req);
1135}
1136
Mat Martineau8eb200b2012-10-23 15:24:17 -07001137static void l2cap_send_create_chan_req(struct l2cap_chan *chan, u8 amp_id)
1138{
1139 struct l2cap_create_chan_req req;
1140 req.scid = cpu_to_le16(chan->scid);
1141 req.psm = chan->psm;
1142 req.amp_id = amp_id;
1143
1144 chan->ident = l2cap_get_ident(chan->conn);
1145
1146 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_REQ,
1147 sizeof(req), &req);
1148}
1149
Mat Martineau02b0fbb2012-10-23 15:24:10 -07001150static void l2cap_move_setup(struct l2cap_chan *chan)
1151{
1152 struct sk_buff *skb;
1153
1154 BT_DBG("chan %p", chan);
1155
1156 if (chan->mode != L2CAP_MODE_ERTM)
1157 return;
1158
1159 __clear_retrans_timer(chan);
1160 __clear_monitor_timer(chan);
1161 __clear_ack_timer(chan);
1162
1163 chan->retry_count = 0;
1164 skb_queue_walk(&chan->tx_q, skb) {
1165 if (bt_cb(skb)->control.retries)
1166 bt_cb(skb)->control.retries = 1;
1167 else
1168 break;
1169 }
1170
1171 chan->expected_tx_seq = chan->buffer_seq;
1172
1173 clear_bit(CONN_REJ_ACT, &chan->conn_state);
1174 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
1175 l2cap_seq_list_clear(&chan->retrans_list);
1176 l2cap_seq_list_clear(&chan->srej_list);
1177 skb_queue_purge(&chan->srej_q);
1178
1179 chan->tx_state = L2CAP_TX_STATE_XMIT;
1180 chan->rx_state = L2CAP_RX_STATE_MOVE;
1181
1182 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
1183}
1184
Mat Martineau5f3847a2012-10-23 15:24:12 -07001185static void l2cap_move_done(struct l2cap_chan *chan)
1186{
1187 u8 move_role = chan->move_role;
1188 BT_DBG("chan %p", chan);
1189
1190 chan->move_state = L2CAP_MOVE_STABLE;
1191 chan->move_role = L2CAP_MOVE_ROLE_NONE;
1192
1193 if (chan->mode != L2CAP_MODE_ERTM)
1194 return;
1195
1196 switch (move_role) {
1197 case L2CAP_MOVE_ROLE_INITIATOR:
1198 l2cap_tx(chan, NULL, NULL, L2CAP_EV_EXPLICIT_POLL);
1199 chan->rx_state = L2CAP_RX_STATE_WAIT_F;
1200 break;
1201 case L2CAP_MOVE_ROLE_RESPONDER:
1202 chan->rx_state = L2CAP_RX_STATE_WAIT_P;
1203 break;
1204 }
1205}
1206
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001207static void l2cap_chan_ready(struct l2cap_chan *chan)
1208{
Mat Martineau28270112012-05-17 21:14:09 -07001209 /* This clears all conf flags, including CONF_NOT_COMPLETE */
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001210 chan->conf_state = 0;
1211 __clear_chan_timer(chan);
1212
Johan Hedberg0ce43ce2013-12-05 14:55:33 +02001213 if (chan->mode == L2CAP_MODE_LE_FLOWCTL && !chan->tx_credits)
1214 chan->ops->suspend(chan);
Johan Hedberg177f8f22013-05-31 17:54:51 +03001215
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001216 chan->state = BT_CONNECTED;
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001217
Andrei Emeltchenkofd83e2c2012-05-30 09:55:32 +03001218 chan->ops->ready(chan);
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001219}
1220
Johan Hedbergf1496de2013-05-13 14:15:56 +03001221static void l2cap_le_connect(struct l2cap_chan *chan)
1222{
1223 struct l2cap_conn *conn = chan->conn;
1224 struct l2cap_le_conn_req req;
1225
Johan Hedberg595177f2013-12-02 22:12:22 +02001226 if (test_and_set_bit(FLAG_LE_CONN_REQ_SENT, &chan->flags))
1227 return;
1228
Johan Hedbergf1496de2013-05-13 14:15:56 +03001229 req.psm = chan->psm;
1230 req.scid = cpu_to_le16(chan->scid);
1231 req.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02001232 req.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03001233 req.credits = cpu_to_le16(chan->rx_credits);
Johan Hedbergf1496de2013-05-13 14:15:56 +03001234
1235 chan->ident = l2cap_get_ident(conn);
1236
1237 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_REQ,
1238 sizeof(req), &req);
1239}
1240
1241static void l2cap_le_start(struct l2cap_chan *chan)
1242{
1243 struct l2cap_conn *conn = chan->conn;
1244
1245 if (!smp_conn_security(conn->hcon, chan->sec_level))
1246 return;
1247
1248 if (!chan->psm) {
1249 l2cap_chan_ready(chan);
1250 return;
1251 }
1252
1253 if (chan->state == BT_CONNECT)
1254 l2cap_le_connect(chan);
1255}
1256
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001257static void l2cap_start_connection(struct l2cap_chan *chan)
1258{
1259 if (__amp_capable(chan)) {
1260 BT_DBG("chan %p AMP capable: discover AMPs", chan);
1261 a2mp_discover_amp(chan);
Johan Hedbergf1496de2013-05-13 14:15:56 +03001262 } else if (chan->conn->hcon->type == LE_LINK) {
1263 l2cap_le_start(chan);
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001264 } else {
1265 l2cap_send_conn_req(chan);
1266 }
1267}
1268
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001269static void l2cap_do_start(struct l2cap_chan *chan)
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001270{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03001271 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001272
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001273 if (conn->hcon->type == LE_LINK) {
Johan Hedberg96ac34f2013-05-13 11:15:07 +03001274 l2cap_le_start(chan);
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001275 return;
1276 }
1277
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001278 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) {
Marcel Holtmann984947d2009-02-06 23:35:19 +01001279 if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE))
1280 return;
1281
Johan Hedberge7cafc42014-07-17 15:35:38 +03001282 if (l2cap_chan_check_security(chan, true) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01001283 __l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001284 l2cap_start_connection(chan);
1285 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001286 } else {
1287 struct l2cap_info_req req;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001288 req.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001289
1290 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
1291 conn->info_ident = l2cap_get_ident(conn);
1292
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08001293 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001294
Gustavo Padovan2d792812012-10-06 10:07:01 +01001295 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
1296 sizeof(req), &req);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001297 }
1298}
1299
Gustavo F. Padovancf6c2c02010-06-07 20:54:45 -03001300static inline int l2cap_mode_supported(__u8 mode, __u32 feat_mask)
1301{
1302 u32 local_feat_mask = l2cap_feat_mask;
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03001303 if (!disable_ertm)
Gustavo F. Padovancf6c2c02010-06-07 20:54:45 -03001304 local_feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING;
1305
1306 switch (mode) {
1307 case L2CAP_MODE_ERTM:
1308 return L2CAP_FEAT_ERTM & feat_mask & local_feat_mask;
1309 case L2CAP_MODE_STREAMING:
1310 return L2CAP_FEAT_STREAMING & feat_mask & local_feat_mask;
1311 default:
1312 return 0x00;
1313 }
1314}
1315
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001316static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err)
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001317{
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001318 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001319 struct l2cap_disconn_req req;
1320
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001321 if (!conn)
1322 return;
1323
Andrei Emeltchenkoaad3d0e2012-09-06 15:05:42 +03001324 if (chan->mode == L2CAP_MODE_ERTM && chan->state == BT_CONNECTED) {
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03001325 __clear_retrans_timer(chan);
1326 __clear_monitor_timer(chan);
1327 __clear_ack_timer(chan);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001328 }
1329
Johan Hedberg2338a7e2014-01-24 10:35:40 +02001330 if (chan->scid == L2CAP_CID_A2MP) {
Gustavo Padovand1177732012-10-06 11:47:38 +01001331 l2cap_state_change(chan, BT_DISCONN);
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001332 return;
1333 }
1334
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001335 req.dcid = cpu_to_le16(chan->dcid);
1336 req.scid = cpu_to_le16(chan->scid);
Gustavo Padovan2d792812012-10-06 10:07:01 +01001337 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_DISCONN_REQ,
1338 sizeof(req), &req);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001339
Gustavo Padovanf8e73012013-10-15 19:24:46 -03001340 l2cap_state_change_and_error(chan, BT_DISCONN, err);
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001341}
1342
Linus Torvalds1da177e2005-04-16 15:20:36 -07001343/* ---- L2CAP connections ---- */
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001344static void l2cap_conn_start(struct l2cap_conn *conn)
1345{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001346 struct l2cap_chan *chan, *tmp;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001347
1348 BT_DBG("conn %p", conn);
1349
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001350 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001351
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001352 list_for_each_entry_safe(chan, tmp, &conn->chan_l, list) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001353 l2cap_chan_lock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001354
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001355 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001356 l2cap_chan_unlock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001357 continue;
1358 }
1359
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001360 if (chan->state == BT_CONNECT) {
Johan Hedberge7cafc42014-07-17 15:35:38 +03001361 if (!l2cap_chan_check_security(chan, true) ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01001362 !__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001363 l2cap_chan_unlock(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001364 continue;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02001365 }
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001366
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001367 if (!l2cap_mode_supported(chan->mode, conn->feat_mask)
Gustavo Padovan2d792812012-10-06 10:07:01 +01001368 && test_bit(CONF_STATE2_DEVICE,
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001369 &chan->conf_state)) {
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001370 l2cap_chan_close(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001371 l2cap_chan_unlock(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001372 continue;
1373 }
1374
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001375 l2cap_start_connection(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001376
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001377 } else if (chan->state == BT_CONNECT2) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001378 struct l2cap_conn_rsp rsp;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001379 char buf[128];
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001380 rsp.scid = cpu_to_le16(chan->dcid);
1381 rsp.dcid = cpu_to_le16(chan->scid);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001382
Johan Hedberge7cafc42014-07-17 15:35:38 +03001383 if (l2cap_chan_check_security(chan, false)) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07001384 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001385 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
1386 rsp.status = cpu_to_le16(L2CAP_CS_AUTHOR_PEND);
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001387 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001388
1389 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001390 l2cap_state_change(chan, BT_CONFIG);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001391 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
1392 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001393 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001394 } else {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001395 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
1396 rsp.status = cpu_to_le16(L2CAP_CS_AUTHEN_PEND);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001397 }
1398
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001399 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001400 sizeof(rsp), &rsp);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001401
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001402 if (test_bit(CONF_REQ_SENT, &chan->conf_state) ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01001403 rsp.result != L2CAP_CR_SUCCESS) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001404 l2cap_chan_unlock(chan);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001405 continue;
1406 }
1407
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001408 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001409 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001410 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03001411 chan->num_conf_req++;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001412 }
1413
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001414 l2cap_chan_unlock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001415 }
1416
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001417 mutex_unlock(&conn->chan_lock);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001418}
1419
Ido Yarivc2287682012-04-20 15:46:07 -03001420/* Find socket with cid and source/destination bdaddr.
Ville Tervob62f3282011-02-10 22:38:50 -03001421 * Returns closest match, locked.
1422 */
Andrei Emeltchenkod9b88702012-03-12 12:13:08 +02001423static struct l2cap_chan *l2cap_global_chan_by_scid(int state, u16 cid,
Ido Yarivc2287682012-04-20 15:46:07 -03001424 bdaddr_t *src,
1425 bdaddr_t *dst)
Ville Tervob62f3282011-02-10 22:38:50 -03001426{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001427 struct l2cap_chan *c, *c1 = NULL;
Ville Tervob62f3282011-02-10 22:38:50 -03001428
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001429 read_lock(&chan_list_lock);
Ville Tervob62f3282011-02-10 22:38:50 -03001430
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001431 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001432 if (state && c->state != state)
Ville Tervob62f3282011-02-10 22:38:50 -03001433 continue;
1434
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001435 if (c->scid == cid) {
Ido Yarivc2287682012-04-20 15:46:07 -03001436 int src_match, dst_match;
1437 int src_any, dst_any;
1438
Ville Tervob62f3282011-02-10 22:38:50 -03001439 /* Exact match. */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001440 src_match = !bacmp(&c->src, src);
1441 dst_match = !bacmp(&c->dst, dst);
Ido Yarivc2287682012-04-20 15:46:07 -03001442 if (src_match && dst_match) {
Johan Hedberga24cce12014-08-07 22:56:42 +03001443 l2cap_chan_hold(c);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001444 read_unlock(&chan_list_lock);
1445 return c;
1446 }
Ville Tervob62f3282011-02-10 22:38:50 -03001447
1448 /* Closest match */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001449 src_any = !bacmp(&c->src, BDADDR_ANY);
1450 dst_any = !bacmp(&c->dst, BDADDR_ANY);
Ido Yarivc2287682012-04-20 15:46:07 -03001451 if ((src_match && dst_any) || (src_any && dst_match) ||
1452 (src_any && dst_any))
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001453 c1 = c;
Ville Tervob62f3282011-02-10 22:38:50 -03001454 }
1455 }
Gustavo F. Padovan280f2942011-04-13 19:01:22 -03001456
Johan Hedberga24cce12014-08-07 22:56:42 +03001457 if (c1)
1458 l2cap_chan_hold(c1);
1459
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001460 read_unlock(&chan_list_lock);
Ville Tervob62f3282011-02-10 22:38:50 -03001461
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001462 return c1;
Ville Tervob62f3282011-02-10 22:38:50 -03001463}
1464
1465static void l2cap_le_conn_ready(struct l2cap_conn *conn)
1466{
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001467 struct hci_conn *hcon = conn->hcon;
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001468 struct hci_dev *hdev = hcon->hdev;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001469 struct l2cap_chan *chan, *pchan;
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001470 u8 dst_type;
Ville Tervob62f3282011-02-10 22:38:50 -03001471
1472 BT_DBG("");
1473
1474 /* Check if we have socket listening on cid */
Johan Hedberg073d1cf2013-04-29 19:35:35 +03001475 pchan = l2cap_global_chan_by_scid(BT_LISTEN, L2CAP_CID_ATT,
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001476 &hcon->src, &hcon->dst);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001477 if (!pchan)
Ville Tervob62f3282011-02-10 22:38:50 -03001478 return;
1479
Johan Hedberg44f3b0f2013-04-29 19:35:45 +03001480 /* Client ATT sockets should override the server one */
1481 if (__l2cap_get_chan_by_dcid(conn, L2CAP_CID_ATT))
Johan Hedberga24cce12014-08-07 22:56:42 +03001482 goto put;
Johan Hedberg44f3b0f2013-04-29 19:35:45 +03001483
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001484 dst_type = bdaddr_type(hcon, hcon->dst_type);
1485
1486 /* If device is blocked, do not create a channel for it */
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001487 if (hci_bdaddr_list_lookup(&hdev->blacklist, &hcon->dst, dst_type))
Johan Hedberga24cce12014-08-07 22:56:42 +03001488 goto put;
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001489
Marcel Holtmann80afeb62014-06-23 12:18:51 +02001490 /* For LE slave connections, make sure the connection interval
1491 * is in the range of the minium and maximum interval that has
1492 * been configured for this connection. If not, then trigger
1493 * the connection update procedure.
1494 */
Johan Hedberg40bef302014-07-16 11:42:27 +03001495 if (hcon->role == HCI_ROLE_SLAVE &&
Marcel Holtmann80afeb62014-06-23 12:18:51 +02001496 (hcon->le_conn_interval < hcon->le_conn_min_interval ||
1497 hcon->le_conn_interval > hcon->le_conn_max_interval)) {
1498 struct l2cap_conn_param_update_req req;
1499
1500 req.min = cpu_to_le16(hcon->le_conn_min_interval);
1501 req.max = cpu_to_le16(hcon->le_conn_max_interval);
1502 req.latency = cpu_to_le16(hcon->le_conn_latency);
1503 req.to_multiplier = cpu_to_le16(hcon->le_supv_timeout);
1504
1505 l2cap_send_cmd(conn, l2cap_get_ident(conn),
1506 L2CAP_CONN_PARAM_UPDATE_REQ, sizeof(req), &req);
1507 }
1508
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001509 l2cap_chan_lock(pchan);
Gustavo F. Padovan62f3a2c2011-04-14 18:34:34 -03001510
Gustavo Padovan80b98022012-05-27 22:27:51 -03001511 chan = pchan->ops->new_connection(pchan);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001512 if (!chan)
Ville Tervob62f3282011-02-10 22:38:50 -03001513 goto clean;
1514
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001515 bacpy(&chan->src, &hcon->src);
1516 bacpy(&chan->dst, &hcon->dst);
1517 chan->src_type = bdaddr_type(hcon, hcon->src_type);
1518 chan->dst_type = dst_type;
Ville Tervob62f3282011-02-10 22:38:50 -03001519
Johan Hedberg44f3b0f2013-04-29 19:35:45 +03001520 __l2cap_chan_add(conn, chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001521
Ville Tervob62f3282011-02-10 22:38:50 -03001522clean:
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001523 l2cap_chan_unlock(pchan);
Johan Hedberga24cce12014-08-07 22:56:42 +03001524put:
1525 l2cap_chan_put(pchan);
Ville Tervob62f3282011-02-10 22:38:50 -03001526}
1527
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001528static void l2cap_conn_ready(struct l2cap_conn *conn)
1529{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001530 struct l2cap_chan *chan;
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001531 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001532
1533 BT_DBG("conn %p", conn);
1534
Johan Hedbergd8729922013-04-29 19:35:39 +03001535 /* For outgoing pairing which doesn't necessarily have an
1536 * associated socket (e.g. mgmt_pair_device).
1537 */
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001538 if (hcon->out && hcon->type == LE_LINK)
1539 smp_conn_security(hcon, hcon->pending_sec_level);
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03001540
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001541 mutex_lock(&conn->chan_lock);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001542
Johan Hedberg44f3b0f2013-04-29 19:35:45 +03001543 if (hcon->type == LE_LINK)
1544 l2cap_le_conn_ready(conn);
1545
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001546 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03001547
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001548 l2cap_chan_lock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001549
Johan Hedberg2338a7e2014-01-24 10:35:40 +02001550 if (chan->scid == L2CAP_CID_A2MP) {
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001551 l2cap_chan_unlock(chan);
1552 continue;
1553 }
1554
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001555 if (hcon->type == LE_LINK) {
Johan Hedbergf1496de2013-05-13 14:15:56 +03001556 l2cap_le_start(chan);
Vinicius Costa Gomes63128452011-06-17 22:46:26 -03001557 } else if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Gustavo Padovan74e75742013-10-15 19:24:51 -03001558 l2cap_chan_ready(chan);
Anderson Brigliab501d6a2011-06-07 18:46:31 -03001559
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001560 } else if (chan->state == BT_CONNECT) {
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001561 l2cap_do_start(chan);
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001562 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001563
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001564 l2cap_chan_unlock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001565 }
1566
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001567 mutex_unlock(&conn->chan_lock);
Johan Hedberg61a939c2014-01-17 20:45:11 +02001568
1569 queue_work(hcon->hdev->workqueue, &conn->pending_rx_work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001570}
1571
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001572/* Notify sockets that we cannot guaranty reliability anymore */
1573static void l2cap_conn_unreliable(struct l2cap_conn *conn, int err)
1574{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001575 struct l2cap_chan *chan;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001576
1577 BT_DBG("conn %p", conn);
1578
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001579 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001580
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001581 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +03001582 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo Padovan1d8b1fd2012-10-06 11:34:52 +01001583 l2cap_chan_set_err(chan, err);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001584 }
1585
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001586 mutex_unlock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001587}
1588
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001589static void l2cap_info_timeout(struct work_struct *work)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001590{
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001591 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001592 info_timer.work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001593
Marcel Holtmann984947d2009-02-06 23:35:19 +01001594 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01001595 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01001596
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001597 l2cap_conn_start(conn);
1598}
1599
David Herrmann2c8e1412013-04-06 20:28:45 +02001600/*
1601 * l2cap_user
1602 * External modules can register l2cap_user objects on l2cap_conn. The ->probe
1603 * callback is called during registration. The ->remove callback is called
1604 * during unregistration.
1605 * An l2cap_user object can either be explicitly unregistered or when the
1606 * underlying l2cap_conn object is deleted. This guarantees that l2cap->hcon,
1607 * l2cap->hchan, .. are valid as long as the remove callback hasn't been called.
1608 * External modules must own a reference to the l2cap_conn object if they intend
1609 * to call l2cap_unregister_user(). The l2cap_conn object might get destroyed at
1610 * any time if they don't.
1611 */
1612
1613int l2cap_register_user(struct l2cap_conn *conn, struct l2cap_user *user)
1614{
1615 struct hci_dev *hdev = conn->hcon->hdev;
1616 int ret;
1617
1618 /* We need to check whether l2cap_conn is registered. If it is not, we
1619 * must not register the l2cap_user. l2cap_conn_del() is unregisters
1620 * l2cap_conn objects, but doesn't provide its own locking. Instead, it
1621 * relies on the parent hci_conn object to be locked. This itself relies
1622 * on the hci_dev object to be locked. So we must lock the hci device
1623 * here, too. */
1624
1625 hci_dev_lock(hdev);
1626
1627 if (user->list.next || user->list.prev) {
1628 ret = -EINVAL;
1629 goto out_unlock;
1630 }
1631
1632 /* conn->hchan is NULL after l2cap_conn_del() was called */
1633 if (!conn->hchan) {
1634 ret = -ENODEV;
1635 goto out_unlock;
1636 }
1637
1638 ret = user->probe(conn, user);
1639 if (ret)
1640 goto out_unlock;
1641
1642 list_add(&user->list, &conn->users);
1643 ret = 0;
1644
1645out_unlock:
1646 hci_dev_unlock(hdev);
1647 return ret;
1648}
1649EXPORT_SYMBOL(l2cap_register_user);
1650
1651void l2cap_unregister_user(struct l2cap_conn *conn, struct l2cap_user *user)
1652{
1653 struct hci_dev *hdev = conn->hcon->hdev;
1654
1655 hci_dev_lock(hdev);
1656
1657 if (!user->list.next || !user->list.prev)
1658 goto out_unlock;
1659
1660 list_del(&user->list);
1661 user->list.next = NULL;
1662 user->list.prev = NULL;
1663 user->remove(conn, user);
1664
1665out_unlock:
1666 hci_dev_unlock(hdev);
1667}
1668EXPORT_SYMBOL(l2cap_unregister_user);
1669
1670static void l2cap_unregister_all_users(struct l2cap_conn *conn)
1671{
1672 struct l2cap_user *user;
1673
1674 while (!list_empty(&conn->users)) {
1675 user = list_first_entry(&conn->users, struct l2cap_user, list);
1676 list_del(&user->list);
1677 user->list.next = NULL;
1678 user->list.prev = NULL;
1679 user->remove(conn, user);
1680 }
1681}
1682
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001683static void l2cap_conn_del(struct hci_conn *hcon, int err)
1684{
1685 struct l2cap_conn *conn = hcon->l2cap_data;
1686 struct l2cap_chan *chan, *l;
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001687
1688 if (!conn)
1689 return;
1690
1691 BT_DBG("hcon %p conn %p, err %d", hcon, conn, err);
1692
1693 kfree_skb(conn->rx_skb);
1694
Johan Hedberg61a939c2014-01-17 20:45:11 +02001695 skb_queue_purge(&conn->pending_rx);
Jukka Taimisto7ab56c32014-06-12 10:15:13 +00001696
1697 /* We can not call flush_work(&conn->pending_rx_work) here since we
1698 * might block if we are running on a worker from the same workqueue
1699 * pending_rx_work is waiting on.
1700 */
1701 if (work_pending(&conn->pending_rx_work))
1702 cancel_work_sync(&conn->pending_rx_work);
Johan Hedberg61a939c2014-01-17 20:45:11 +02001703
David Herrmann2c8e1412013-04-06 20:28:45 +02001704 l2cap_unregister_all_users(conn);
1705
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001706 mutex_lock(&conn->chan_lock);
1707
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001708 /* Kill channels */
1709 list_for_each_entry_safe(chan, l, &conn->chan_l, list) {
Mat Martineau61d6ef32012-04-27 16:50:50 -07001710 l2cap_chan_hold(chan);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001711 l2cap_chan_lock(chan);
1712
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001713 l2cap_chan_del(chan, err);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001714
1715 l2cap_chan_unlock(chan);
1716
Gustavo Padovan80b98022012-05-27 22:27:51 -03001717 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07001718 l2cap_chan_put(chan);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001719 }
1720
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001721 mutex_unlock(&conn->chan_lock);
1722
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001723 hci_chan_del(conn->hchan);
1724
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001725 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT)
Ulisses Furquim127074b2012-01-30 18:26:29 -02001726 cancel_delayed_work_sync(&conn->info_timer);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001727
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001728 if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags)) {
Ulisses Furquim127074b2012-01-30 18:26:29 -02001729 cancel_delayed_work_sync(&conn->security_timer);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001730 smp_chan_destroy(conn);
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001731 }
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001732
1733 hcon->l2cap_data = NULL;
David Herrmann9c903e32013-04-06 20:28:44 +02001734 conn->hchan = NULL;
1735 l2cap_conn_put(conn);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001736}
1737
Gustavo F. Padovan6c9d42a2011-12-20 10:57:27 -02001738static void security_timeout(struct work_struct *work)
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001739{
Gustavo F. Padovan6c9d42a2011-12-20 10:57:27 -02001740 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001741 security_timer.work);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001742
Johan Hedbergd06cc412012-06-06 18:44:11 +08001743 BT_DBG("conn %p", conn);
1744
1745 if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags)) {
1746 smp_chan_destroy(conn);
1747 l2cap_conn_del(conn->hcon, ETIMEDOUT);
1748 }
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001749}
1750
David Herrmann9c903e32013-04-06 20:28:44 +02001751static void l2cap_conn_free(struct kref *ref)
1752{
1753 struct l2cap_conn *conn = container_of(ref, struct l2cap_conn, ref);
1754
1755 hci_conn_put(conn->hcon);
1756 kfree(conn);
1757}
1758
1759void l2cap_conn_get(struct l2cap_conn *conn)
1760{
1761 kref_get(&conn->ref);
1762}
1763EXPORT_SYMBOL(l2cap_conn_get);
1764
1765void l2cap_conn_put(struct l2cap_conn *conn)
1766{
1767 kref_put(&conn->ref, l2cap_conn_free);
1768}
1769EXPORT_SYMBOL(l2cap_conn_put);
1770
Linus Torvalds1da177e2005-04-16 15:20:36 -07001771/* ---- Socket interface ---- */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001772
Ido Yarivc2287682012-04-20 15:46:07 -03001773/* Find socket with psm and source / destination bdaddr.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001774 * Returns closest match.
1775 */
Ido Yarivc2287682012-04-20 15:46:07 -03001776static struct l2cap_chan *l2cap_global_chan_by_psm(int state, __le16 psm,
1777 bdaddr_t *src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001778 bdaddr_t *dst,
1779 u8 link_type)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001780{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001781 struct l2cap_chan *c, *c1 = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001782
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001783 read_lock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001784
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001785 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001786 if (state && c->state != state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001787 continue;
1788
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001789 if (link_type == ACL_LINK && c->src_type != BDADDR_BREDR)
1790 continue;
1791
1792 if (link_type == LE_LINK && c->src_type == BDADDR_BREDR)
1793 continue;
1794
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001795 if (c->psm == psm) {
Ido Yarivc2287682012-04-20 15:46:07 -03001796 int src_match, dst_match;
1797 int src_any, dst_any;
1798
Linus Torvalds1da177e2005-04-16 15:20:36 -07001799 /* Exact match. */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001800 src_match = !bacmp(&c->src, src);
1801 dst_match = !bacmp(&c->dst, dst);
Ido Yarivc2287682012-04-20 15:46:07 -03001802 if (src_match && dst_match) {
Johan Hedberga24cce12014-08-07 22:56:42 +03001803 l2cap_chan_hold(c);
Johannes Berga7567b22011-06-01 08:29:54 +02001804 read_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001805 return c;
1806 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001807
1808 /* Closest match */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001809 src_any = !bacmp(&c->src, BDADDR_ANY);
1810 dst_any = !bacmp(&c->dst, BDADDR_ANY);
Ido Yarivc2287682012-04-20 15:46:07 -03001811 if ((src_match && dst_any) || (src_any && dst_match) ||
1812 (src_any && dst_any))
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001813 c1 = c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001814 }
1815 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001816
Johan Hedberga24cce12014-08-07 22:56:42 +03001817 if (c1)
1818 l2cap_chan_hold(c1);
1819
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001820 read_unlock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001821
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001822 return c1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001823}
1824
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001825static void l2cap_monitor_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001826{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001827 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001828 monitor_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001829
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03001830 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001831
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001832 l2cap_chan_lock(chan);
1833
Mat Martineau80909e02012-05-17 20:53:50 -07001834 if (!chan->conn) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001835 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001836 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001837 return;
1838 }
1839
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001840 l2cap_tx(chan, NULL, NULL, L2CAP_EV_MONITOR_TO);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001841
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001842 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001843 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001844}
1845
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001846static void l2cap_retrans_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001847{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001848 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001849 retrans_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001850
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03001851 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001852
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001853 l2cap_chan_lock(chan);
1854
Mat Martineau80909e02012-05-17 20:53:50 -07001855 if (!chan->conn) {
1856 l2cap_chan_unlock(chan);
1857 l2cap_chan_put(chan);
1858 return;
1859 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001860
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001861 l2cap_tx(chan, NULL, NULL, L2CAP_EV_RETRANS_TO);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001862 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001863 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001864}
1865
Gustavo Padovand6603662012-05-21 13:58:22 -03001866static void l2cap_streaming_send(struct l2cap_chan *chan,
1867 struct sk_buff_head *skbs)
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001868{
Gustavo F. Padovanccbb84a2010-08-30 18:44:44 -03001869 struct sk_buff *skb;
Mat Martineau37339372012-05-17 20:53:33 -07001870 struct l2cap_ctrl *control;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001871
Mat Martineau37339372012-05-17 20:53:33 -07001872 BT_DBG("chan %p, skbs %p", chan, skbs);
1873
Mat Martineaub99e13a2012-10-23 15:24:19 -07001874 if (__chan_is_moving(chan))
1875 return;
1876
Mat Martineau37339372012-05-17 20:53:33 -07001877 skb_queue_splice_tail_init(skbs, &chan->tx_q);
1878
1879 while (!skb_queue_empty(&chan->tx_q)) {
1880
1881 skb = skb_dequeue(&chan->tx_q);
1882
1883 bt_cb(skb)->control.retries = 1;
1884 control = &bt_cb(skb)->control;
1885
1886 control->reqseq = 0;
1887 control->txseq = chan->next_tx_seq;
1888
1889 __pack_control(chan, control, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001890
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001891 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau37339372012-05-17 20:53:33 -07001892 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1893 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001894 }
1895
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001896 l2cap_do_send(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001897
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001898 BT_DBG("Sent txseq %u", control->txseq);
Mat Martineau37339372012-05-17 20:53:33 -07001899
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001900 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau37339372012-05-17 20:53:33 -07001901 chan->frames_sent++;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001902 }
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001903}
1904
Szymon Janc67c9e842011-07-28 16:24:33 +02001905static int l2cap_ertm_send(struct l2cap_chan *chan)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001906{
1907 struct sk_buff *skb, *tx_skb;
Mat Martineau18a48e72012-05-17 20:53:34 -07001908 struct l2cap_ctrl *control;
1909 int sent = 0;
1910
1911 BT_DBG("chan %p", chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001912
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001913 if (chan->state != BT_CONNECTED)
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001914 return -ENOTCONN;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001915
Mat Martineau94122bb2012-05-02 09:42:02 -07001916 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1917 return 0;
1918
Mat Martineaub99e13a2012-10-23 15:24:19 -07001919 if (__chan_is_moving(chan))
1920 return 0;
1921
Mat Martineau18a48e72012-05-17 20:53:34 -07001922 while (chan->tx_send_head &&
1923 chan->unacked_frames < chan->remote_tx_win &&
1924 chan->tx_state == L2CAP_TX_STATE_XMIT) {
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001925
Mat Martineau18a48e72012-05-17 20:53:34 -07001926 skb = chan->tx_send_head;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001927
Mat Martineau18a48e72012-05-17 20:53:34 -07001928 bt_cb(skb)->control.retries = 1;
1929 control = &bt_cb(skb)->control;
Gustavo F. Padovan95ffa972010-06-18 20:37:33 -03001930
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001931 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
Mat Martineau18a48e72012-05-17 20:53:34 -07001932 control->final = 1;
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001933
Mat Martineau18a48e72012-05-17 20:53:34 -07001934 control->reqseq = chan->buffer_seq;
1935 chan->last_acked_seq = chan->buffer_seq;
1936 control->txseq = chan->next_tx_seq;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001937
Mat Martineau18a48e72012-05-17 20:53:34 -07001938 __pack_control(chan, control, skb);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001939
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001940 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau18a48e72012-05-17 20:53:34 -07001941 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1942 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001943 }
1944
Mat Martineau18a48e72012-05-17 20:53:34 -07001945 /* Clone after data has been modified. Data is assumed to be
1946 read-only (for locking purposes) on cloned sk_buffs.
1947 */
1948 tx_skb = skb_clone(skb, GFP_KERNEL);
1949
1950 if (!tx_skb)
1951 break;
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -03001952
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03001953 __set_retrans_timer(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001954
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001955 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau18a48e72012-05-17 20:53:34 -07001956 chan->unacked_frames++;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03001957 chan->frames_sent++;
Mat Martineau18a48e72012-05-17 20:53:34 -07001958 sent++;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001959
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001960 if (skb_queue_is_last(&chan->tx_q, skb))
1961 chan->tx_send_head = NULL;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001962 else
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001963 chan->tx_send_head = skb_queue_next(&chan->tx_q, skb);
Mat Martineau18a48e72012-05-17 20:53:34 -07001964
1965 l2cap_do_send(chan, tx_skb);
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001966 BT_DBG("Sent txseq %u", control->txseq);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001967 }
1968
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001969 BT_DBG("Sent %d, %u unacked, %u in ERTM queue", sent,
1970 chan->unacked_frames, skb_queue_len(&chan->tx_q));
Mat Martineau18a48e72012-05-17 20:53:34 -07001971
1972 return sent;
Gustavo F. Padovan9e917af2010-05-01 16:15:37 -03001973}
1974
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001975static void l2cap_ertm_resend(struct l2cap_chan *chan)
1976{
1977 struct l2cap_ctrl control;
1978 struct sk_buff *skb;
1979 struct sk_buff *tx_skb;
1980 u16 seq;
1981
1982 BT_DBG("chan %p", chan);
1983
1984 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1985 return;
1986
Mat Martineaub99e13a2012-10-23 15:24:19 -07001987 if (__chan_is_moving(chan))
1988 return;
1989
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001990 while (chan->retrans_list.head != L2CAP_SEQ_LIST_CLEAR) {
1991 seq = l2cap_seq_list_pop(&chan->retrans_list);
1992
1993 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, seq);
1994 if (!skb) {
1995 BT_DBG("Error: Can't retransmit seq %d, frame missing",
Gustavo Padovan2d792812012-10-06 10:07:01 +01001996 seq);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001997 continue;
1998 }
1999
2000 bt_cb(skb)->control.retries++;
2001 control = bt_cb(skb)->control;
2002
2003 if (chan->max_tx != 0 &&
2004 bt_cb(skb)->control.retries > chan->max_tx) {
2005 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02002006 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002007 l2cap_seq_list_clear(&chan->retrans_list);
2008 break;
2009 }
2010
2011 control.reqseq = chan->buffer_seq;
2012 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
2013 control.final = 1;
2014 else
2015 control.final = 0;
2016
2017 if (skb_cloned(skb)) {
2018 /* Cloned sk_buffs are read-only, so we need a
2019 * writeable copy
2020 */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002021 tx_skb = skb_copy(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002022 } else {
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002023 tx_skb = skb_clone(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002024 }
2025
2026 if (!tx_skb) {
2027 l2cap_seq_list_clear(&chan->retrans_list);
2028 break;
2029 }
2030
2031 /* Update skb contents */
2032 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
2033 put_unaligned_le32(__pack_extended_control(&control),
2034 tx_skb->data + L2CAP_HDR_SIZE);
2035 } else {
2036 put_unaligned_le16(__pack_enhanced_control(&control),
2037 tx_skb->data + L2CAP_HDR_SIZE);
2038 }
2039
2040 if (chan->fcs == L2CAP_FCS_CRC16) {
2041 u16 fcs = crc16(0, (u8 *) tx_skb->data, tx_skb->len);
2042 put_unaligned_le16(fcs, skb_put(tx_skb,
2043 L2CAP_FCS_SIZE));
2044 }
2045
2046 l2cap_do_send(chan, tx_skb);
2047
2048 BT_DBG("Resent txseq %d", control.txseq);
2049
2050 chan->last_acked_seq = chan->buffer_seq;
2051 }
2052}
2053
Mat Martineauf80842a2012-05-17 20:53:46 -07002054static void l2cap_retransmit(struct l2cap_chan *chan,
2055 struct l2cap_ctrl *control)
2056{
2057 BT_DBG("chan %p, control %p", chan, control);
2058
2059 l2cap_seq_list_append(&chan->retrans_list, control->reqseq);
2060 l2cap_ertm_resend(chan);
2061}
2062
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002063static void l2cap_retransmit_all(struct l2cap_chan *chan,
2064 struct l2cap_ctrl *control)
2065{
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002066 struct sk_buff *skb;
2067
2068 BT_DBG("chan %p, control %p", chan, control);
2069
2070 if (control->poll)
2071 set_bit(CONN_SEND_FBIT, &chan->conn_state);
2072
2073 l2cap_seq_list_clear(&chan->retrans_list);
2074
2075 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
2076 return;
2077
2078 if (chan->unacked_frames) {
2079 skb_queue_walk(&chan->tx_q, skb) {
2080 if (bt_cb(skb)->control.txseq == control->reqseq ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01002081 skb == chan->tx_send_head)
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002082 break;
2083 }
2084
2085 skb_queue_walk_from(&chan->tx_q, skb) {
2086 if (skb == chan->tx_send_head)
2087 break;
2088
2089 l2cap_seq_list_append(&chan->retrans_list,
2090 bt_cb(skb)->control.txseq);
2091 }
2092
2093 l2cap_ertm_resend(chan);
2094 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002095}
2096
Szymon Jancb17e73b2012-01-11 10:59:47 +01002097static void l2cap_send_ack(struct l2cap_chan *chan)
2098{
Mat Martineau0a0aba42012-05-17 20:53:39 -07002099 struct l2cap_ctrl control;
2100 u16 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
2101 chan->last_acked_seq);
2102 int threshold;
2103
2104 BT_DBG("chan %p last_acked_seq %d buffer_seq %d",
2105 chan, chan->last_acked_seq, chan->buffer_seq);
2106
2107 memset(&control, 0, sizeof(control));
2108 control.sframe = 1;
2109
2110 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
2111 chan->rx_state == L2CAP_RX_STATE_RECV) {
2112 __clear_ack_timer(chan);
2113 control.super = L2CAP_SUPER_RNR;
2114 control.reqseq = chan->buffer_seq;
2115 l2cap_send_sframe(chan, &control);
2116 } else {
2117 if (!test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) {
2118 l2cap_ertm_send(chan);
2119 /* If any i-frames were sent, they included an ack */
2120 if (chan->buffer_seq == chan->last_acked_seq)
2121 frames_to_ack = 0;
2122 }
2123
Mat Martineauc20f8e32012-07-10 05:47:07 -07002124 /* Ack now if the window is 3/4ths full.
Mat Martineau0a0aba42012-05-17 20:53:39 -07002125 * Calculate without mul or div
2126 */
Mat Martineauc20f8e32012-07-10 05:47:07 -07002127 threshold = chan->ack_win;
Mat Martineau0a0aba42012-05-17 20:53:39 -07002128 threshold += threshold << 1;
2129 threshold >>= 2;
2130
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002131 BT_DBG("frames_to_ack %u, threshold %d", frames_to_ack,
Mat Martineau0a0aba42012-05-17 20:53:39 -07002132 threshold);
2133
2134 if (frames_to_ack >= threshold) {
2135 __clear_ack_timer(chan);
2136 control.super = L2CAP_SUPER_RR;
2137 control.reqseq = chan->buffer_seq;
2138 l2cap_send_sframe(chan, &control);
2139 frames_to_ack = 0;
2140 }
2141
2142 if (frames_to_ack)
2143 __set_ack_timer(chan);
2144 }
Szymon Jancb17e73b2012-01-11 10:59:47 +01002145}
2146
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002147static inline int l2cap_skbuff_fromiovec(struct l2cap_chan *chan,
2148 struct msghdr *msg, int len,
2149 int count, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002150{
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002151 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002152 struct sk_buff **frag;
Gustavo Padovan90338942012-04-06 20:15:47 -03002153 int sent = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002154
Jukka Rissanen04988782014-06-18 16:37:07 +03002155 if (chan->ops->memcpy_fromiovec(chan, skb_put(skb, count),
2156 msg->msg_iov, count))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002157 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002158
2159 sent += count;
2160 len -= count;
2161
2162 /* Continuation fragments (no L2CAP header) */
2163 frag = &skb_shinfo(skb)->frag_list;
2164 while (len) {
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002165 struct sk_buff *tmp;
2166
Linus Torvalds1da177e2005-04-16 15:20:36 -07002167 count = min_t(unsigned int, conn->mtu, len);
2168
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002169 tmp = chan->ops->alloc_skb(chan, 0, count,
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002170 msg->msg_flags & MSG_DONTWAIT);
2171 if (IS_ERR(tmp))
2172 return PTR_ERR(tmp);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002173
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002174 *frag = tmp;
2175
Jukka Rissanen04988782014-06-18 16:37:07 +03002176 if (chan->ops->memcpy_fromiovec(chan, skb_put(*frag, count),
2177 msg->msg_iov, count))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002178 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002179
2180 sent += count;
2181 len -= count;
2182
Gustavo Padovan2d0ed3d2012-05-11 13:16:12 -03002183 skb->len += (*frag)->len;
2184 skb->data_len += (*frag)->len;
2185
Linus Torvalds1da177e2005-04-16 15:20:36 -07002186 frag = &(*frag)->next;
2187 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002188
2189 return sent;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002190}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002191
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002192static struct sk_buff *l2cap_create_connless_pdu(struct l2cap_chan *chan,
Marcel Holtmann8d463212014-06-05 15:22:51 +02002193 struct msghdr *msg, size_t len)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002194{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002195 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002196 struct sk_buff *skb;
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002197 int err, count, hlen = L2CAP_HDR_SIZE + L2CAP_PSMLEN_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002198 struct l2cap_hdr *lh;
2199
Marcel Holtmann8d463212014-06-05 15:22:51 +02002200 BT_DBG("chan %p psm 0x%2.2x len %zu", chan,
2201 __le16_to_cpu(chan->psm), len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002202
2203 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002204
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002205 skb = chan->ops->alloc_skb(chan, hlen, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002206 msg->msg_flags & MSG_DONTWAIT);
2207 if (IS_ERR(skb))
2208 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002209
2210 /* Create L2CAP header */
2211 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002212 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenkodaf6a78c2012-05-03 10:55:52 +03002213 lh->len = cpu_to_le16(len + L2CAP_PSMLEN_SIZE);
Marcel Holtmann43b1b8d2013-10-12 06:01:26 -07002214 put_unaligned(chan->psm, (__le16 *) skb_put(skb, L2CAP_PSMLEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002215
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002216 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002217 if (unlikely(err < 0)) {
2218 kfree_skb(skb);
2219 return ERR_PTR(err);
2220 }
2221 return skb;
2222}
2223
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002224static struct sk_buff *l2cap_create_basic_pdu(struct l2cap_chan *chan,
Marcel Holtmann8d463212014-06-05 15:22:51 +02002225 struct msghdr *msg, size_t len)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002226{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002227 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002228 struct sk_buff *skb;
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002229 int err, count;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002230 struct l2cap_hdr *lh;
2231
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002232 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002233
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002234 count = min_t(unsigned int, (conn->mtu - L2CAP_HDR_SIZE), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002235
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002236 skb = chan->ops->alloc_skb(chan, L2CAP_HDR_SIZE, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002237 msg->msg_flags & MSG_DONTWAIT);
2238 if (IS_ERR(skb))
2239 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002240
2241 /* Create L2CAP header */
2242 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002243 lh->cid = cpu_to_le16(chan->dcid);
Gustavo Padovan6ff9b5e2012-05-02 11:56:17 -03002244 lh->len = cpu_to_le16(len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002245
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002246 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002247 if (unlikely(err < 0)) {
2248 kfree_skb(skb);
2249 return ERR_PTR(err);
2250 }
2251 return skb;
2252}
2253
Luiz Augusto von Dentzab0ff762011-09-12 20:00:50 +03002254static struct sk_buff *l2cap_create_iframe_pdu(struct l2cap_chan *chan,
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002255 struct msghdr *msg, size_t len,
2256 u16 sdulen)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002257{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002258 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002259 struct sk_buff *skb;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002260 int err, count, hlen;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002261 struct l2cap_hdr *lh;
2262
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002263 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002264
Gustavo F. Padovan0ee0d202010-05-01 16:15:41 -03002265 if (!conn)
2266 return ERR_PTR(-ENOTCONN);
2267
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002268 hlen = __ertm_hdr_size(chan);
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002269
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002270 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002271 hlen += L2CAP_SDULEN_SIZE;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002272
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03002273 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002274 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03002275
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002276 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002277
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002278 skb = chan->ops->alloc_skb(chan, hlen, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002279 msg->msg_flags & MSG_DONTWAIT);
2280 if (IS_ERR(skb))
2281 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002282
2283 /* Create L2CAP header */
2284 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002285 lh->cid = cpu_to_le16(chan->dcid);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002286 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002287
Mat Martineau18a48e72012-05-17 20:53:34 -07002288 /* Control header is populated later */
2289 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
2290 put_unaligned_le32(0, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
2291 else
2292 put_unaligned_le16(0, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002293
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002294 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002295 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002296
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002297 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002298 if (unlikely(err < 0)) {
2299 kfree_skb(skb);
2300 return ERR_PTR(err);
2301 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03002302
Mat Martineau18a48e72012-05-17 20:53:34 -07002303 bt_cb(skb)->control.fcs = chan->fcs;
Mat Martineau3ce35142012-04-25 16:36:14 -07002304 bt_cb(skb)->control.retries = 0;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002305 return skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002306}
2307
Mat Martineau94122bb2012-05-02 09:42:02 -07002308static int l2cap_segment_sdu(struct l2cap_chan *chan,
2309 struct sk_buff_head *seg_queue,
2310 struct msghdr *msg, size_t len)
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002311{
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002312 struct sk_buff *skb;
Mat Martineau94122bb2012-05-02 09:42:02 -07002313 u16 sdu_len;
2314 size_t pdu_len;
Mat Martineau94122bb2012-05-02 09:42:02 -07002315 u8 sar;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002316
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002317 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002318
Mat Martineau94122bb2012-05-02 09:42:02 -07002319 /* It is critical that ERTM PDUs fit in a single HCI fragment,
2320 * so fragmented skbs are not used. The HCI layer's handling
2321 * of fragmented skbs is not compatible with ERTM's queueing.
2322 */
2323
2324 /* PDU size is derived from the HCI MTU */
2325 pdu_len = chan->conn->mtu;
2326
Mat Martineaua5495742012-10-23 15:24:21 -07002327 /* Constrain PDU size for BR/EDR connections */
2328 if (!chan->hs_hcon)
2329 pdu_len = min_t(size_t, pdu_len, L2CAP_BREDR_MAX_PAYLOAD);
Mat Martineau94122bb2012-05-02 09:42:02 -07002330
2331 /* Adjust for largest possible L2CAP overhead. */
Gustavo Padovan35d401d2012-05-25 18:57:05 -03002332 if (chan->fcs)
2333 pdu_len -= L2CAP_FCS_SIZE;
2334
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002335 pdu_len -= __ertm_hdr_size(chan);
Mat Martineau94122bb2012-05-02 09:42:02 -07002336
2337 /* Remote device may have requested smaller PDUs */
2338 pdu_len = min_t(size_t, pdu_len, chan->remote_mps);
2339
2340 if (len <= pdu_len) {
2341 sar = L2CAP_SAR_UNSEGMENTED;
2342 sdu_len = 0;
2343 pdu_len = len;
2344 } else {
2345 sar = L2CAP_SAR_START;
2346 sdu_len = len;
2347 pdu_len -= L2CAP_SDULEN_SIZE;
2348 }
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002349
2350 while (len > 0) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002351 skb = l2cap_create_iframe_pdu(chan, msg, pdu_len, sdu_len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002352
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002353 if (IS_ERR(skb)) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002354 __skb_queue_purge(seg_queue);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002355 return PTR_ERR(skb);
2356 }
2357
Mat Martineau94122bb2012-05-02 09:42:02 -07002358 bt_cb(skb)->control.sar = sar;
2359 __skb_queue_tail(seg_queue, skb);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002360
Mat Martineau94122bb2012-05-02 09:42:02 -07002361 len -= pdu_len;
2362 if (sdu_len) {
2363 sdu_len = 0;
2364 pdu_len += L2CAP_SDULEN_SIZE;
2365 }
2366
2367 if (len <= pdu_len) {
2368 sar = L2CAP_SAR_END;
2369 pdu_len = len;
2370 } else {
2371 sar = L2CAP_SAR_CONTINUE;
2372 }
2373 }
2374
Gustavo Padovanf0f62792012-05-29 13:29:17 -03002375 return 0;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002376}
2377
Johan Hedberg177f8f22013-05-31 17:54:51 +03002378static struct sk_buff *l2cap_create_le_flowctl_pdu(struct l2cap_chan *chan,
2379 struct msghdr *msg,
2380 size_t len, u16 sdulen)
2381{
2382 struct l2cap_conn *conn = chan->conn;
2383 struct sk_buff *skb;
2384 int err, count, hlen;
2385 struct l2cap_hdr *lh;
2386
2387 BT_DBG("chan %p len %zu", chan, len);
2388
2389 if (!conn)
2390 return ERR_PTR(-ENOTCONN);
2391
2392 hlen = L2CAP_HDR_SIZE;
2393
2394 if (sdulen)
2395 hlen += L2CAP_SDULEN_SIZE;
2396
2397 count = min_t(unsigned int, (conn->mtu - hlen), len);
2398
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002399 skb = chan->ops->alloc_skb(chan, hlen, count,
Johan Hedberg177f8f22013-05-31 17:54:51 +03002400 msg->msg_flags & MSG_DONTWAIT);
2401 if (IS_ERR(skb))
2402 return skb;
2403
2404 /* Create L2CAP header */
2405 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
2406 lh->cid = cpu_to_le16(chan->dcid);
2407 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
2408
2409 if (sdulen)
2410 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
2411
2412 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
2413 if (unlikely(err < 0)) {
2414 kfree_skb(skb);
2415 return ERR_PTR(err);
2416 }
2417
2418 return skb;
2419}
2420
2421static int l2cap_segment_le_sdu(struct l2cap_chan *chan,
2422 struct sk_buff_head *seg_queue,
2423 struct msghdr *msg, size_t len)
2424{
2425 struct sk_buff *skb;
2426 size_t pdu_len;
2427 u16 sdu_len;
2428
2429 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
2430
2431 pdu_len = chan->conn->mtu - L2CAP_HDR_SIZE;
2432
2433 pdu_len = min_t(size_t, pdu_len, chan->remote_mps);
2434
2435 sdu_len = len;
2436 pdu_len -= L2CAP_SDULEN_SIZE;
2437
2438 while (len > 0) {
2439 if (len <= pdu_len)
2440 pdu_len = len;
2441
2442 skb = l2cap_create_le_flowctl_pdu(chan, msg, pdu_len, sdu_len);
2443 if (IS_ERR(skb)) {
2444 __skb_queue_purge(seg_queue);
2445 return PTR_ERR(skb);
2446 }
2447
2448 __skb_queue_tail(seg_queue, skb);
2449
2450 len -= pdu_len;
2451
2452 if (sdu_len) {
2453 sdu_len = 0;
2454 pdu_len += L2CAP_SDULEN_SIZE;
2455 }
2456 }
2457
2458 return 0;
2459}
2460
Marcel Holtmann8d463212014-06-05 15:22:51 +02002461int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002462{
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002463 struct sk_buff *skb;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002464 int err;
Mat Martineau94122bb2012-05-02 09:42:02 -07002465 struct sk_buff_head seg_queue;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002466
Seung-Woo Kim31e8ce82013-11-05 18:46:33 +09002467 if (!chan->conn)
2468 return -ENOTCONN;
2469
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002470 /* Connectionless channel */
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002471 if (chan->chan_type == L2CAP_CHAN_CONN_LESS) {
Marcel Holtmann8d463212014-06-05 15:22:51 +02002472 skb = l2cap_create_connless_pdu(chan, msg, len);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002473 if (IS_ERR(skb))
2474 return PTR_ERR(skb);
2475
Andrzej Kaczmarekede81a22014-02-25 17:16:22 +01002476 /* Channel lock is released before requesting new skb and then
2477 * reacquired thus we need to recheck channel state.
2478 */
2479 if (chan->state != BT_CONNECTED) {
2480 kfree_skb(skb);
2481 return -ENOTCONN;
2482 }
2483
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002484 l2cap_do_send(chan, skb);
2485 return len;
2486 }
2487
2488 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03002489 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedberg177f8f22013-05-31 17:54:51 +03002490 /* Check outgoing MTU */
2491 if (len > chan->omtu)
2492 return -EMSGSIZE;
2493
Johan Hedbergfad5fc892013-12-05 09:45:01 +02002494 if (!chan->tx_credits)
2495 return -EAGAIN;
2496
Johan Hedberg177f8f22013-05-31 17:54:51 +03002497 __skb_queue_head_init(&seg_queue);
2498
2499 err = l2cap_segment_le_sdu(chan, &seg_queue, msg, len);
2500
2501 if (chan->state != BT_CONNECTED) {
2502 __skb_queue_purge(&seg_queue);
2503 err = -ENOTCONN;
2504 }
2505
2506 if (err)
2507 return err;
2508
2509 skb_queue_splice_tail_init(&seg_queue, &chan->tx_q);
2510
2511 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
2512 l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
2513 chan->tx_credits--;
2514 }
2515
2516 if (!chan->tx_credits)
2517 chan->ops->suspend(chan);
2518
2519 err = len;
2520
2521 break;
2522
Johan Hedbergfad5fc892013-12-05 09:45:01 +02002523 case L2CAP_MODE_BASIC:
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002524 /* Check outgoing MTU */
2525 if (len > chan->omtu)
2526 return -EMSGSIZE;
2527
2528 /* Create a basic PDU */
Marcel Holtmann8d463212014-06-05 15:22:51 +02002529 skb = l2cap_create_basic_pdu(chan, msg, len);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002530 if (IS_ERR(skb))
2531 return PTR_ERR(skb);
2532
Andrzej Kaczmarekede81a22014-02-25 17:16:22 +01002533 /* Channel lock is released before requesting new skb and then
2534 * reacquired thus we need to recheck channel state.
2535 */
2536 if (chan->state != BT_CONNECTED) {
2537 kfree_skb(skb);
2538 return -ENOTCONN;
2539 }
2540
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002541 l2cap_do_send(chan, skb);
2542 err = len;
2543 break;
2544
2545 case L2CAP_MODE_ERTM:
2546 case L2CAP_MODE_STREAMING:
Mat Martineau94122bb2012-05-02 09:42:02 -07002547 /* Check outgoing MTU */
2548 if (len > chan->omtu) {
2549 err = -EMSGSIZE;
2550 break;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002551 }
2552
Mat Martineau94122bb2012-05-02 09:42:02 -07002553 __skb_queue_head_init(&seg_queue);
2554
2555 /* Do segmentation before calling in to the state machine,
2556 * since it's possible to block while waiting for memory
2557 * allocation.
2558 */
2559 err = l2cap_segment_sdu(chan, &seg_queue, msg, len);
2560
2561 /* The channel could have been closed while segmenting,
2562 * check that it is still connected.
2563 */
2564 if (chan->state != BT_CONNECTED) {
2565 __skb_queue_purge(&seg_queue);
2566 err = -ENOTCONN;
2567 }
2568
2569 if (err)
2570 break;
2571
Mat Martineau37339372012-05-17 20:53:33 -07002572 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo Padovand6603662012-05-21 13:58:22 -03002573 l2cap_tx(chan, NULL, &seg_queue, L2CAP_EV_DATA_REQUEST);
Mat Martineau37339372012-05-17 20:53:33 -07002574 else
Gustavo Padovand6603662012-05-21 13:58:22 -03002575 l2cap_streaming_send(chan, &seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002576
Gustavo Padovand6603662012-05-21 13:58:22 -03002577 err = len;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002578
Mat Martineau94122bb2012-05-02 09:42:02 -07002579 /* If the skbs were not queued for sending, they'll still be in
2580 * seg_queue and need to be purged.
2581 */
2582 __skb_queue_purge(&seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002583 break;
2584
2585 default:
2586 BT_DBG("bad state %1.1x", chan->mode);
2587 err = -EBADFD;
2588 }
2589
2590 return err;
2591}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +03002592EXPORT_SYMBOL_GPL(l2cap_chan_send);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002593
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002594static void l2cap_send_srej(struct l2cap_chan *chan, u16 txseq)
2595{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002596 struct l2cap_ctrl control;
2597 u16 seq;
2598
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002599 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002600
2601 memset(&control, 0, sizeof(control));
2602 control.sframe = 1;
2603 control.super = L2CAP_SUPER_SREJ;
2604
2605 for (seq = chan->expected_tx_seq; seq != txseq;
2606 seq = __next_seq(chan, seq)) {
2607 if (!l2cap_ertm_seq_in_queue(&chan->srej_q, seq)) {
2608 control.reqseq = seq;
2609 l2cap_send_sframe(chan, &control);
2610 l2cap_seq_list_append(&chan->srej_list, seq);
2611 }
2612 }
2613
2614 chan->expected_tx_seq = __next_seq(chan, txseq);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002615}
2616
2617static void l2cap_send_srej_tail(struct l2cap_chan *chan)
2618{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002619 struct l2cap_ctrl control;
2620
2621 BT_DBG("chan %p", chan);
2622
2623 if (chan->srej_list.tail == L2CAP_SEQ_LIST_CLEAR)
2624 return;
2625
2626 memset(&control, 0, sizeof(control));
2627 control.sframe = 1;
2628 control.super = L2CAP_SUPER_SREJ;
2629 control.reqseq = chan->srej_list.tail;
2630 l2cap_send_sframe(chan, &control);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002631}
2632
2633static void l2cap_send_srej_list(struct l2cap_chan *chan, u16 txseq)
2634{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002635 struct l2cap_ctrl control;
2636 u16 initial_head;
2637 u16 seq;
2638
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002639 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002640
2641 memset(&control, 0, sizeof(control));
2642 control.sframe = 1;
2643 control.super = L2CAP_SUPER_SREJ;
2644
2645 /* Capture initial list head to allow only one pass through the list. */
2646 initial_head = chan->srej_list.head;
2647
2648 do {
2649 seq = l2cap_seq_list_pop(&chan->srej_list);
2650 if (seq == txseq || seq == L2CAP_SEQ_LIST_CLEAR)
2651 break;
2652
2653 control.reqseq = seq;
2654 l2cap_send_sframe(chan, &control);
2655 l2cap_seq_list_append(&chan->srej_list, seq);
2656 } while (chan->srej_list.head != initial_head);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002657}
2658
Mat Martineau608bcc62012-05-17 20:53:32 -07002659static void l2cap_process_reqseq(struct l2cap_chan *chan, u16 reqseq)
2660{
2661 struct sk_buff *acked_skb;
2662 u16 ackseq;
2663
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002664 BT_DBG("chan %p, reqseq %u", chan, reqseq);
Mat Martineau608bcc62012-05-17 20:53:32 -07002665
2666 if (chan->unacked_frames == 0 || reqseq == chan->expected_ack_seq)
2667 return;
2668
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002669 BT_DBG("expected_ack_seq %u, unacked_frames %u",
Mat Martineau608bcc62012-05-17 20:53:32 -07002670 chan->expected_ack_seq, chan->unacked_frames);
2671
2672 for (ackseq = chan->expected_ack_seq; ackseq != reqseq;
2673 ackseq = __next_seq(chan, ackseq)) {
2674
2675 acked_skb = l2cap_ertm_seq_in_queue(&chan->tx_q, ackseq);
2676 if (acked_skb) {
2677 skb_unlink(acked_skb, &chan->tx_q);
2678 kfree_skb(acked_skb);
2679 chan->unacked_frames--;
2680 }
2681 }
2682
2683 chan->expected_ack_seq = reqseq;
2684
2685 if (chan->unacked_frames == 0)
2686 __clear_retrans_timer(chan);
2687
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002688 BT_DBG("unacked_frames %u", chan->unacked_frames);
Mat Martineau608bcc62012-05-17 20:53:32 -07002689}
2690
2691static void l2cap_abort_rx_srej_sent(struct l2cap_chan *chan)
2692{
2693 BT_DBG("chan %p", chan);
2694
2695 chan->expected_tx_seq = chan->buffer_seq;
2696 l2cap_seq_list_clear(&chan->srej_list);
2697 skb_queue_purge(&chan->srej_q);
2698 chan->rx_state = L2CAP_RX_STATE_RECV;
2699}
2700
Gustavo Padovand6603662012-05-21 13:58:22 -03002701static void l2cap_tx_state_xmit(struct l2cap_chan *chan,
2702 struct l2cap_ctrl *control,
2703 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002704{
Mat Martineau608bcc62012-05-17 20:53:32 -07002705 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2706 event);
2707
2708 switch (event) {
2709 case L2CAP_EV_DATA_REQUEST:
2710 if (chan->tx_send_head == NULL)
2711 chan->tx_send_head = skb_peek(skbs);
2712
2713 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2714 l2cap_ertm_send(chan);
2715 break;
2716 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2717 BT_DBG("Enter LOCAL_BUSY");
2718 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2719
2720 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2721 /* The SREJ_SENT state must be aborted if we are to
2722 * enter the LOCAL_BUSY state.
2723 */
2724 l2cap_abort_rx_srej_sent(chan);
2725 }
2726
2727 l2cap_send_ack(chan);
2728
2729 break;
2730 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2731 BT_DBG("Exit LOCAL_BUSY");
2732 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2733
2734 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2735 struct l2cap_ctrl local_control;
2736
2737 memset(&local_control, 0, sizeof(local_control));
2738 local_control.sframe = 1;
2739 local_control.super = L2CAP_SUPER_RR;
2740 local_control.poll = 1;
2741 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002742 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002743
2744 chan->retry_count = 1;
2745 __set_monitor_timer(chan);
2746 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2747 }
2748 break;
2749 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2750 l2cap_process_reqseq(chan, control->reqseq);
2751 break;
2752 case L2CAP_EV_EXPLICIT_POLL:
2753 l2cap_send_rr_or_rnr(chan, 1);
2754 chan->retry_count = 1;
2755 __set_monitor_timer(chan);
2756 __clear_ack_timer(chan);
2757 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2758 break;
2759 case L2CAP_EV_RETRANS_TO:
2760 l2cap_send_rr_or_rnr(chan, 1);
2761 chan->retry_count = 1;
2762 __set_monitor_timer(chan);
2763 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2764 break;
2765 case L2CAP_EV_RECV_FBIT:
2766 /* Nothing to process */
2767 break;
2768 default:
2769 break;
2770 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002771}
2772
Gustavo Padovand6603662012-05-21 13:58:22 -03002773static void l2cap_tx_state_wait_f(struct l2cap_chan *chan,
2774 struct l2cap_ctrl *control,
2775 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002776{
Mat Martineau608bcc62012-05-17 20:53:32 -07002777 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2778 event);
2779
2780 switch (event) {
2781 case L2CAP_EV_DATA_REQUEST:
2782 if (chan->tx_send_head == NULL)
2783 chan->tx_send_head = skb_peek(skbs);
2784 /* Queue data, but don't send. */
2785 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2786 break;
2787 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2788 BT_DBG("Enter LOCAL_BUSY");
2789 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2790
2791 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2792 /* The SREJ_SENT state must be aborted if we are to
2793 * enter the LOCAL_BUSY state.
2794 */
2795 l2cap_abort_rx_srej_sent(chan);
2796 }
2797
2798 l2cap_send_ack(chan);
2799
2800 break;
2801 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2802 BT_DBG("Exit LOCAL_BUSY");
2803 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2804
2805 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2806 struct l2cap_ctrl local_control;
2807 memset(&local_control, 0, sizeof(local_control));
2808 local_control.sframe = 1;
2809 local_control.super = L2CAP_SUPER_RR;
2810 local_control.poll = 1;
2811 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002812 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002813
2814 chan->retry_count = 1;
2815 __set_monitor_timer(chan);
2816 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2817 }
2818 break;
2819 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2820 l2cap_process_reqseq(chan, control->reqseq);
2821
2822 /* Fall through */
2823
2824 case L2CAP_EV_RECV_FBIT:
2825 if (control && control->final) {
2826 __clear_monitor_timer(chan);
2827 if (chan->unacked_frames > 0)
2828 __set_retrans_timer(chan);
2829 chan->retry_count = 0;
2830 chan->tx_state = L2CAP_TX_STATE_XMIT;
2831 BT_DBG("recv fbit tx_state 0x2.2%x", chan->tx_state);
2832 }
2833 break;
2834 case L2CAP_EV_EXPLICIT_POLL:
2835 /* Ignore */
2836 break;
2837 case L2CAP_EV_MONITOR_TO:
2838 if (chan->max_tx == 0 || chan->retry_count < chan->max_tx) {
2839 l2cap_send_rr_or_rnr(chan, 1);
2840 __set_monitor_timer(chan);
2841 chan->retry_count++;
2842 } else {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02002843 l2cap_send_disconn_req(chan, ECONNABORTED);
Mat Martineau608bcc62012-05-17 20:53:32 -07002844 }
2845 break;
2846 default:
2847 break;
2848 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002849}
2850
Gustavo Padovand6603662012-05-21 13:58:22 -03002851static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
2852 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002853{
Mat Martineau608bcc62012-05-17 20:53:32 -07002854 BT_DBG("chan %p, control %p, skbs %p, event %d, state %d",
2855 chan, control, skbs, event, chan->tx_state);
2856
2857 switch (chan->tx_state) {
2858 case L2CAP_TX_STATE_XMIT:
Gustavo Padovand6603662012-05-21 13:58:22 -03002859 l2cap_tx_state_xmit(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002860 break;
2861 case L2CAP_TX_STATE_WAIT_F:
Gustavo Padovand6603662012-05-21 13:58:22 -03002862 l2cap_tx_state_wait_f(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002863 break;
2864 default:
2865 /* Ignore event */
2866 break;
2867 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002868}
2869
Mat Martineau4b51dae92012-05-17 20:53:37 -07002870static void l2cap_pass_to_tx(struct l2cap_chan *chan,
2871 struct l2cap_ctrl *control)
2872{
2873 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002874 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_REQSEQ_AND_FBIT);
Mat Martineau4b51dae92012-05-17 20:53:37 -07002875}
2876
Mat Martineauf80842a2012-05-17 20:53:46 -07002877static void l2cap_pass_to_tx_fbit(struct l2cap_chan *chan,
2878 struct l2cap_ctrl *control)
2879{
2880 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002881 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_FBIT);
Mat Martineauf80842a2012-05-17 20:53:46 -07002882}
2883
Linus Torvalds1da177e2005-04-16 15:20:36 -07002884/* Copy frame to all raw sockets on that connection */
2885static void l2cap_raw_recv(struct l2cap_conn *conn, struct sk_buff *skb)
2886{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002887 struct sk_buff *nskb;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03002888 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002889
2890 BT_DBG("conn %p", conn);
2891
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002892 mutex_lock(&conn->chan_lock);
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002893
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002894 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002895 if (chan->chan_type != L2CAP_CHAN_RAW)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002896 continue;
2897
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002898 /* Don't send frame to the channel it came from */
2899 if (bt_cb(skb)->chan == chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002900 continue;
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002901
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002902 nskb = skb_clone(skb, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03002903 if (!nskb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002904 continue;
Gustavo Padovan80b98022012-05-27 22:27:51 -03002905 if (chan->ops->recv(chan, nskb))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002906 kfree_skb(nskb);
2907 }
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002908
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002909 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002910}
2911
2912/* ---- L2CAP signalling commands ---- */
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002913static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn, u8 code,
2914 u8 ident, u16 dlen, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002915{
2916 struct sk_buff *skb, **frag;
2917 struct l2cap_cmd_hdr *cmd;
2918 struct l2cap_hdr *lh;
2919 int len, count;
2920
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002921 BT_DBG("conn %p, code 0x%2.2x, ident 0x%2.2x, len %u",
2922 conn, code, ident, dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002923
Anderson Lizardo300b9622013-06-02 16:30:40 -04002924 if (conn->mtu < L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE)
2925 return NULL;
2926
Linus Torvalds1da177e2005-04-16 15:20:36 -07002927 len = L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE + dlen;
2928 count = min_t(unsigned int, conn->mtu, len);
2929
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002930 skb = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002931 if (!skb)
2932 return NULL;
2933
2934 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002935 lh->len = cpu_to_le16(L2CAP_CMD_HDR_SIZE + dlen);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002936
2937 if (conn->hcon->type == LE_LINK)
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002938 lh->cid = cpu_to_le16(L2CAP_CID_LE_SIGNALING);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002939 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002940 lh->cid = cpu_to_le16(L2CAP_CID_SIGNALING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002941
2942 cmd = (struct l2cap_cmd_hdr *) skb_put(skb, L2CAP_CMD_HDR_SIZE);
2943 cmd->code = code;
2944 cmd->ident = ident;
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002945 cmd->len = cpu_to_le16(dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002946
2947 if (dlen) {
2948 count -= L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE;
2949 memcpy(skb_put(skb, count), data, count);
2950 data += count;
2951 }
2952
2953 len -= skb->len;
2954
2955 /* Continuation fragments (no L2CAP header) */
2956 frag = &skb_shinfo(skb)->frag_list;
2957 while (len) {
2958 count = min_t(unsigned int, conn->mtu, len);
2959
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002960 *frag = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002961 if (!*frag)
2962 goto fail;
2963
2964 memcpy(skb_put(*frag, count), data, count);
2965
2966 len -= count;
2967 data += count;
2968
2969 frag = &(*frag)->next;
2970 }
2971
2972 return skb;
2973
2974fail:
2975 kfree_skb(skb);
2976 return NULL;
2977}
2978
Gustavo Padovan2d792812012-10-06 10:07:01 +01002979static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen,
2980 unsigned long *val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002981{
2982 struct l2cap_conf_opt *opt = *ptr;
2983 int len;
2984
2985 len = L2CAP_CONF_OPT_SIZE + opt->len;
2986 *ptr += len;
2987
2988 *type = opt->type;
2989 *olen = opt->len;
2990
2991 switch (opt->len) {
2992 case 1:
2993 *val = *((u8 *) opt->val);
2994 break;
2995
2996 case 2:
steven miaobfaaeb32010-10-16 18:29:47 -04002997 *val = get_unaligned_le16(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002998 break;
2999
3000 case 4:
steven miaobfaaeb32010-10-16 18:29:47 -04003001 *val = get_unaligned_le32(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003002 break;
3003
3004 default:
3005 *val = (unsigned long) opt->val;
3006 break;
3007 }
3008
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03003009 BT_DBG("type 0x%2.2x len %u val 0x%lx", *type, opt->len, *val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003010 return len;
3011}
3012
Linus Torvalds1da177e2005-04-16 15:20:36 -07003013static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val)
3014{
3015 struct l2cap_conf_opt *opt = *ptr;
3016
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03003017 BT_DBG("type 0x%2.2x len %u val 0x%lx", type, len, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003018
3019 opt->type = type;
3020 opt->len = len;
3021
3022 switch (len) {
3023 case 1:
3024 *((u8 *) opt->val) = val;
3025 break;
3026
3027 case 2:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02003028 put_unaligned_le16(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003029 break;
3030
3031 case 4:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02003032 put_unaligned_le32(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003033 break;
3034
3035 default:
3036 memcpy(opt->val, (void *) val, len);
3037 break;
3038 }
3039
3040 *ptr += L2CAP_CONF_OPT_SIZE + len;
3041}
3042
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003043static void l2cap_add_opt_efs(void **ptr, struct l2cap_chan *chan)
3044{
3045 struct l2cap_conf_efs efs;
3046
Szymon Janc1ec918c2011-11-16 09:32:21 +01003047 switch (chan->mode) {
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003048 case L2CAP_MODE_ERTM:
3049 efs.id = chan->local_id;
3050 efs.stype = chan->local_stype;
3051 efs.msdu = cpu_to_le16(chan->local_msdu);
3052 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003053 efs.acc_lat = cpu_to_le32(L2CAP_DEFAULT_ACC_LAT);
3054 efs.flush_to = cpu_to_le32(L2CAP_EFS_DEFAULT_FLUSH_TO);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003055 break;
3056
3057 case L2CAP_MODE_STREAMING:
3058 efs.id = 1;
3059 efs.stype = L2CAP_SERV_BESTEFFORT;
3060 efs.msdu = cpu_to_le16(chan->local_msdu);
3061 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
3062 efs.acc_lat = 0;
3063 efs.flush_to = 0;
3064 break;
3065
3066 default:
3067 return;
3068 }
3069
3070 l2cap_add_conf_opt(ptr, L2CAP_CONF_EFS, sizeof(efs),
Andrei Emeltchenko8936fa62012-10-08 11:14:41 +03003071 (unsigned long) &efs);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003072}
3073
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003074static void l2cap_ack_timeout(struct work_struct *work)
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003075{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003076 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau03625202012-05-17 20:53:51 -07003077 ack_timer.work);
3078 u16 frames_to_ack;
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003079
Gustavo F. Padovan2fb9b3d2011-12-22 16:56:05 -02003080 BT_DBG("chan %p", chan);
3081
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003082 l2cap_chan_lock(chan);
3083
Mat Martineau03625202012-05-17 20:53:51 -07003084 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
3085 chan->last_acked_seq);
3086
3087 if (frames_to_ack)
3088 l2cap_send_rr_or_rnr(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003089
3090 l2cap_chan_unlock(chan);
Szymon Janc09bfb2e2012-01-11 10:59:49 +01003091 l2cap_chan_put(chan);
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003092}
3093
Andrei Emeltchenko466f8002012-05-29 13:59:01 +03003094int l2cap_ertm_init(struct l2cap_chan *chan)
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003095{
Mat Martineau3c588192012-04-11 10:48:42 -07003096 int err;
3097
Mat Martineau105bdf92012-04-27 16:50:48 -07003098 chan->next_tx_seq = 0;
3099 chan->expected_tx_seq = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003100 chan->expected_ack_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003101 chan->unacked_frames = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003102 chan->buffer_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003103 chan->frames_sent = 0;
Mat Martineau105bdf92012-04-27 16:50:48 -07003104 chan->last_acked_seq = 0;
3105 chan->sdu = NULL;
3106 chan->sdu_last_frag = NULL;
3107 chan->sdu_len = 0;
3108
Mat Martineaud34c34f2012-05-14 14:49:27 -07003109 skb_queue_head_init(&chan->tx_q);
3110
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003111 chan->local_amp_id = AMP_ID_BREDR;
3112 chan->move_id = AMP_ID_BREDR;
Mat Martineau08333282012-10-23 15:24:06 -07003113 chan->move_state = L2CAP_MOVE_STABLE;
3114 chan->move_role = L2CAP_MOVE_ROLE_NONE;
3115
Mat Martineau105bdf92012-04-27 16:50:48 -07003116 if (chan->mode != L2CAP_MODE_ERTM)
3117 return 0;
3118
3119 chan->rx_state = L2CAP_RX_STATE_RECV;
3120 chan->tx_state = L2CAP_TX_STATE_XMIT;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003121
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003122 INIT_DELAYED_WORK(&chan->retrans_timer, l2cap_retrans_timeout);
3123 INIT_DELAYED_WORK(&chan->monitor_timer, l2cap_monitor_timeout);
3124 INIT_DELAYED_WORK(&chan->ack_timer, l2cap_ack_timeout);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003125
Gustavo F. Padovanf1c67752011-03-25 20:36:10 -03003126 skb_queue_head_init(&chan->srej_q);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03003127
Mat Martineau3c588192012-04-11 10:48:42 -07003128 err = l2cap_seq_list_init(&chan->srej_list, chan->tx_win);
3129 if (err < 0)
3130 return err;
3131
Mat Martineau9dc9aff2012-05-17 16:20:14 -07003132 err = l2cap_seq_list_init(&chan->retrans_list, chan->remote_tx_win);
3133 if (err < 0)
3134 l2cap_seq_list_free(&chan->srej_list);
3135
3136 return err;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003137}
3138
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003139static inline __u8 l2cap_select_mode(__u8 mode, __u16 remote_feat_mask)
3140{
3141 switch (mode) {
3142 case L2CAP_MODE_STREAMING:
3143 case L2CAP_MODE_ERTM:
3144 if (l2cap_mode_supported(mode, remote_feat_mask))
3145 return mode;
3146 /* fall through */
3147 default:
3148 return L2CAP_MODE_BASIC;
3149 }
3150}
3151
Marcel Holtmann848566b2013-10-01 22:59:22 -07003152static inline bool __l2cap_ews_supported(struct l2cap_conn *conn)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003153{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003154 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003155}
3156
Marcel Holtmann848566b2013-10-01 22:59:22 -07003157static inline bool __l2cap_efs_supported(struct l2cap_conn *conn)
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003158{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003159 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_FLOW;
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003160}
3161
Mat Martineau36c86c82012-10-23 15:24:20 -07003162static void __l2cap_set_ertm_timeouts(struct l2cap_chan *chan,
3163 struct l2cap_conf_rfc *rfc)
3164{
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003165 if (chan->local_amp_id != AMP_ID_BREDR && chan->hs_hcon) {
Mat Martineau36c86c82012-10-23 15:24:20 -07003166 u64 ertm_to = chan->hs_hcon->hdev->amp_be_flush_to;
3167
3168 /* Class 1 devices have must have ERTM timeouts
3169 * exceeding the Link Supervision Timeout. The
3170 * default Link Supervision Timeout for AMP
3171 * controllers is 10 seconds.
3172 *
3173 * Class 1 devices use 0xffffffff for their
3174 * best-effort flush timeout, so the clamping logic
3175 * will result in a timeout that meets the above
3176 * requirement. ERTM timeouts are 16-bit values, so
3177 * the maximum timeout is 65.535 seconds.
3178 */
3179
3180 /* Convert timeout to milliseconds and round */
3181 ertm_to = DIV_ROUND_UP_ULL(ertm_to, 1000);
3182
3183 /* This is the recommended formula for class 2 devices
3184 * that start ERTM timers when packets are sent to the
3185 * controller.
3186 */
3187 ertm_to = 3 * ertm_to + 500;
3188
3189 if (ertm_to > 0xffff)
3190 ertm_to = 0xffff;
3191
3192 rfc->retrans_timeout = cpu_to_le16((u16) ertm_to);
3193 rfc->monitor_timeout = rfc->retrans_timeout;
3194 } else {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003195 rfc->retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO);
3196 rfc->monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO);
Mat Martineau36c86c82012-10-23 15:24:20 -07003197 }
3198}
3199
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003200static inline void l2cap_txwin_setup(struct l2cap_chan *chan)
3201{
3202 if (chan->tx_win > L2CAP_DEFAULT_TX_WINDOW &&
Marcel Holtmann848566b2013-10-01 22:59:22 -07003203 __l2cap_ews_supported(chan->conn)) {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003204 /* use extended control field */
3205 set_bit(FLAG_EXT_CTRL, &chan->flags);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003206 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
3207 } else {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003208 chan->tx_win = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003209 L2CAP_DEFAULT_TX_WINDOW);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003210 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
3211 }
Mat Martineauc20f8e32012-07-10 05:47:07 -07003212 chan->ack_win = chan->tx_win;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003213}
3214
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003215static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003216{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003217 struct l2cap_conf_req *req = data;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003218 struct l2cap_conf_rfc rfc = { .mode = chan->mode };
Linus Torvalds1da177e2005-04-16 15:20:36 -07003219 void *ptr = req->data;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003220 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003221
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03003222 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003223
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003224 if (chan->num_conf_req || chan->num_conf_rsp)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003225 goto done;
3226
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003227 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003228 case L2CAP_MODE_STREAMING:
3229 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003230 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state))
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003231 break;
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003232
Marcel Holtmann848566b2013-10-01 22:59:22 -07003233 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003234 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3235
Gustavo F. Padovan2ba13ed2010-06-09 16:39:05 -03003236 /* fall through */
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003237 default:
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003238 chan->mode = l2cap_select_mode(rfc.mode, chan->conn->feat_mask);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003239 break;
3240 }
3241
3242done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003243 if (chan->imtu != L2CAP_DEFAULT_MTU)
3244 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovan7990681c2011-01-24 16:01:43 -02003245
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003246 switch (chan->mode) {
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003247 case L2CAP_MODE_BASIC:
Marcel Holtmann6fea7ad2014-07-09 11:53:35 +02003248 if (disable_ertm)
3249 break;
3250
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003251 if (!(chan->conn->feat_mask & L2CAP_FEAT_ERTM) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003252 !(chan->conn->feat_mask & L2CAP_FEAT_STREAMING))
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003253 break;
3254
Gustavo F. Padovan62547752010-06-08 20:05:31 -03003255 rfc.mode = L2CAP_MODE_BASIC;
3256 rfc.txwin_size = 0;
3257 rfc.max_transmit = 0;
3258 rfc.retrans_timeout = 0;
3259 rfc.monitor_timeout = 0;
3260 rfc.max_pdu_size = 0;
3261
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003262 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003263 (unsigned long) &rfc);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003264 break;
3265
3266 case L2CAP_MODE_ERTM:
3267 rfc.mode = L2CAP_MODE_ERTM;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003268 rfc.max_transmit = chan->max_tx;
Mat Martineau36c86c82012-10-23 15:24:20 -07003269
3270 __l2cap_set_ertm_timeouts(chan, &rfc);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003271
3272 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003273 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3274 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003275 rfc.max_pdu_size = cpu_to_le16(size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003276
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003277 l2cap_txwin_setup(chan);
3278
3279 rfc.txwin_size = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003280 L2CAP_DEFAULT_TX_WINDOW);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003281
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003282 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003283 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003284
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003285 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3286 l2cap_add_opt_efs(&ptr, chan);
3287
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003288 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3289 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003290 chan->tx_win);
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003291
3292 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3293 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003294 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003295 chan->fcs = L2CAP_FCS_NONE;
3296 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3297 chan->fcs);
3298 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003299 break;
3300
3301 case L2CAP_MODE_STREAMING:
Mat Martineau273759e2012-05-17 20:53:53 -07003302 l2cap_txwin_setup(chan);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003303 rfc.mode = L2CAP_MODE_STREAMING;
3304 rfc.txwin_size = 0;
3305 rfc.max_transmit = 0;
3306 rfc.retrans_timeout = 0;
3307 rfc.monitor_timeout = 0;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003308
3309 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003310 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3311 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003312 rfc.max_pdu_size = cpu_to_le16(size);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003313
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003314 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003315 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003316
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003317 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3318 l2cap_add_opt_efs(&ptr, chan);
3319
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003320 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3321 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003322 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003323 chan->fcs = L2CAP_FCS_NONE;
3324 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3325 chan->fcs);
3326 }
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003327 break;
3328 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003329
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003330 req->dcid = cpu_to_le16(chan->dcid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003331 req->flags = cpu_to_le16(0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003332
3333 return ptr - data;
3334}
3335
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003336static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003337{
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003338 struct l2cap_conf_rsp *rsp = data;
3339 void *ptr = rsp->data;
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003340 void *req = chan->conf_req;
3341 int len = chan->conf_len;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003342 int type, hint, olen;
3343 unsigned long val;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003344 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003345 struct l2cap_conf_efs efs;
3346 u8 remote_efs = 0;
Marcel Holtmann861d6882007-10-20 13:37:06 +02003347 u16 mtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003348 u16 result = L2CAP_CONF_SUCCESS;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003349 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003350
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003351 BT_DBG("chan %p", chan);
Marcel Holtmann820ae1b2006-11-18 22:15:00 +01003352
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003353 while (len >= L2CAP_CONF_OPT_SIZE) {
3354 len -= l2cap_get_conf_opt(&req, &type, &olen, &val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003355
Gustavo F. Padovan589d2742009-04-20 01:31:07 -03003356 hint = type & L2CAP_CONF_HINT;
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07003357 type &= L2CAP_CONF_MASK;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003358
3359 switch (type) {
3360 case L2CAP_CONF_MTU:
Marcel Holtmann861d6882007-10-20 13:37:06 +02003361 mtu = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003362 break;
3363
3364 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003365 chan->flush_to = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003366 break;
3367
3368 case L2CAP_CONF_QOS:
3369 break;
3370
Marcel Holtmann6464f352007-10-20 13:39:51 +02003371 case L2CAP_CONF_RFC:
3372 if (olen == sizeof(rfc))
3373 memcpy(&rfc, (void *) val, olen);
3374 break;
3375
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003376 case L2CAP_CONF_FCS:
3377 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003378 set_bit(CONF_RECV_NO_FCS, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003379 break;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003380
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003381 case L2CAP_CONF_EFS:
3382 remote_efs = 1;
3383 if (olen == sizeof(efs))
3384 memcpy(&efs, (void *) val, olen);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003385 break;
3386
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003387 case L2CAP_CONF_EWS:
Marcel Holtmann848566b2013-10-01 22:59:22 -07003388 if (!chan->conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003389 return -ECONNREFUSED;
3390
3391 set_bit(FLAG_EXT_CTRL, &chan->flags);
3392 set_bit(CONF_EWS_RECV, &chan->conf_state);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003393 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003394 chan->remote_tx_win = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003395 break;
3396
3397 default:
3398 if (hint)
3399 break;
3400
3401 result = L2CAP_CONF_UNKNOWN;
3402 *((u8 *) ptr++) = type;
3403 break;
3404 }
3405 }
3406
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003407 if (chan->num_conf_rsp || chan->num_conf_req > 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003408 goto done;
3409
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003410 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003411 case L2CAP_MODE_STREAMING:
3412 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003413 if (!test_bit(CONF_STATE2_DEVICE, &chan->conf_state)) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003414 chan->mode = l2cap_select_mode(rfc.mode,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003415 chan->conn->feat_mask);
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003416 break;
3417 }
3418
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003419 if (remote_efs) {
Marcel Holtmann848566b2013-10-01 22:59:22 -07003420 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003421 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3422 else
3423 return -ECONNREFUSED;
3424 }
3425
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003426 if (chan->mode != rfc.mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003427 return -ECONNREFUSED;
Gustavo F. Padovan742e5192010-06-08 19:09:48 -03003428
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003429 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003430 }
3431
3432done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003433 if (chan->mode != rfc.mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003434 result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003435 rfc.mode = chan->mode;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003436
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003437 if (chan->num_conf_rsp == 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003438 return -ECONNREFUSED;
3439
Gustavo Padovan2d792812012-10-06 10:07:01 +01003440 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3441 (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003442 }
3443
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003444 if (result == L2CAP_CONF_SUCCESS) {
3445 /* Configure output options and let the other side know
3446 * which ones we don't like. */
3447
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003448 if (mtu < L2CAP_DEFAULT_MIN_MTU)
3449 result = L2CAP_CONF_UNACCEPT;
3450 else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003451 chan->omtu = mtu;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003452 set_bit(CONF_MTU_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003453 }
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003454 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->omtu);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003455
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003456 if (remote_efs) {
3457 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003458 efs.stype != L2CAP_SERV_NOTRAFIC &&
3459 efs.stype != chan->local_stype) {
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003460
3461 result = L2CAP_CONF_UNACCEPT;
3462
3463 if (chan->num_conf_req >= 1)
3464 return -ECONNREFUSED;
3465
3466 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003467 sizeof(efs),
3468 (unsigned long) &efs);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003469 } else {
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003470 /* Send PENDING Conf Rsp */
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003471 result = L2CAP_CONF_PENDING;
3472 set_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003473 }
3474 }
3475
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003476 switch (rfc.mode) {
3477 case L2CAP_MODE_BASIC:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003478 chan->fcs = L2CAP_FCS_NONE;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003479 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003480 break;
3481
3482 case L2CAP_MODE_ERTM:
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003483 if (!test_bit(CONF_EWS_RECV, &chan->conf_state))
3484 chan->remote_tx_win = rfc.txwin_size;
3485 else
3486 rfc.txwin_size = L2CAP_DEFAULT_TX_WINDOW;
3487
Gustavo F. Padovan2c03a7a2011-03-25 20:15:28 -03003488 chan->remote_max_tx = rfc.max_transmit;
Mat Martineau86b1b262010-08-05 15:54:22 -07003489
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003490 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003491 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3492 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003493 rfc.max_pdu_size = cpu_to_le16(size);
3494 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003495
Mat Martineau36c86c82012-10-23 15:24:20 -07003496 __l2cap_set_ertm_timeouts(chan, &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003497
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003498 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003499
3500 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003501 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003502
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003503 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3504 chan->remote_id = efs.id;
3505 chan->remote_stype = efs.stype;
3506 chan->remote_msdu = le16_to_cpu(efs.msdu);
3507 chan->remote_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003508 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003509 chan->remote_acc_lat =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003510 le32_to_cpu(efs.acc_lat);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003511 chan->remote_sdu_itime =
3512 le32_to_cpu(efs.sdu_itime);
3513 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003514 sizeof(efs),
3515 (unsigned long) &efs);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003516 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003517 break;
3518
3519 case L2CAP_MODE_STREAMING:
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003520 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003521 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3522 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003523 rfc.max_pdu_size = cpu_to_le16(size);
3524 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003525
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003526 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003527
Gustavo Padovan2d792812012-10-06 10:07:01 +01003528 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3529 (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003530
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003531 break;
3532
3533 default:
Marcel Holtmann6464f352007-10-20 13:39:51 +02003534 result = L2CAP_CONF_UNACCEPT;
3535
3536 memset(&rfc, 0, sizeof(rfc));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003537 rfc.mode = chan->mode;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003538 }
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003539
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003540 if (result == L2CAP_CONF_SUCCESS)
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003541 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003542 }
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003543 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003544 rsp->result = cpu_to_le16(result);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003545 rsp->flags = cpu_to_le16(0);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003546
3547 return ptr - data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003548}
3549
Gustavo Padovan2d792812012-10-06 10:07:01 +01003550static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len,
3551 void *data, u16 *result)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003552{
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003553 struct l2cap_conf_req *req = data;
3554 void *ptr = req->data;
3555 int type, olen;
3556 unsigned long val;
Mat Martineau36e999a2011-12-08 17:23:21 -08003557 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003558 struct l2cap_conf_efs efs;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003559
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003560 BT_DBG("chan %p, rsp %p, len %d, req %p", chan, rsp, len, data);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003561
3562 while (len >= L2CAP_CONF_OPT_SIZE) {
3563 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3564
3565 switch (type) {
3566 case L2CAP_CONF_MTU:
3567 if (val < L2CAP_DEFAULT_MIN_MTU) {
3568 *result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003569 chan->imtu = L2CAP_DEFAULT_MIN_MTU;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003570 } else
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003571 chan->imtu = val;
3572 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003573 break;
3574
3575 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003576 chan->flush_to = val;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003577 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003578 2, chan->flush_to);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003579 break;
3580
3581 case L2CAP_CONF_RFC:
3582 if (olen == sizeof(rfc))
3583 memcpy(&rfc, (void *)val, olen);
3584
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003585 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003586 rfc.mode != chan->mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003587 return -ECONNREFUSED;
3588
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003589 chan->fcs = 0;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003590
3591 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003592 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003593 break;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003594
3595 case L2CAP_CONF_EWS:
Mat Martineauc20f8e32012-07-10 05:47:07 -07003596 chan->ack_win = min_t(u16, val, chan->ack_win);
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003597 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Mat Martineauc20f8e32012-07-10 05:47:07 -07003598 chan->tx_win);
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003599 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003600
3601 case L2CAP_CONF_EFS:
3602 if (olen == sizeof(efs))
3603 memcpy(&efs, (void *)val, olen);
3604
3605 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003606 efs.stype != L2CAP_SERV_NOTRAFIC &&
3607 efs.stype != chan->local_stype)
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003608 return -ECONNREFUSED;
3609
Gustavo Padovan2d792812012-10-06 10:07:01 +01003610 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS, sizeof(efs),
3611 (unsigned long) &efs);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003612 break;
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003613
3614 case L2CAP_CONF_FCS:
3615 if (*result == L2CAP_CONF_PENDING)
3616 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003617 set_bit(CONF_RECV_NO_FCS,
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003618 &chan->conf_state);
3619 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003620 }
3621 }
3622
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003623 if (chan->mode == L2CAP_MODE_BASIC && chan->mode != rfc.mode)
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003624 return -ECONNREFUSED;
3625
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003626 chan->mode = rfc.mode;
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003627
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003628 if (*result == L2CAP_CONF_SUCCESS || *result == L2CAP_CONF_PENDING) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003629 switch (rfc.mode) {
3630 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003631 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3632 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
3633 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003634 if (!test_bit(FLAG_EXT_CTRL, &chan->flags))
3635 chan->ack_win = min_t(u16, chan->ack_win,
3636 rfc.txwin_size);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003637
3638 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3639 chan->local_msdu = le16_to_cpu(efs.msdu);
3640 chan->local_sdu_itime =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003641 le32_to_cpu(efs.sdu_itime);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003642 chan->local_acc_lat = le32_to_cpu(efs.acc_lat);
3643 chan->local_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003644 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003645 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003646 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003647
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003648 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003649 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003650 }
3651 }
3652
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003653 req->dcid = cpu_to_le16(chan->dcid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003654 req->flags = cpu_to_le16(0);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003655
3656 return ptr - data;
3657}
3658
Gustavo Padovan2d792812012-10-06 10:07:01 +01003659static int l2cap_build_conf_rsp(struct l2cap_chan *chan, void *data,
3660 u16 result, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003661{
3662 struct l2cap_conf_rsp *rsp = data;
3663 void *ptr = rsp->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003664
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003665 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003666
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003667 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003668 rsp->result = cpu_to_le16(result);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003669 rsp->flags = cpu_to_le16(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003670
3671 return ptr - data;
3672}
3673
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003674void __l2cap_le_connect_rsp_defer(struct l2cap_chan *chan)
3675{
3676 struct l2cap_le_conn_rsp rsp;
3677 struct l2cap_conn *conn = chan->conn;
3678
3679 BT_DBG("chan %p", chan);
3680
3681 rsp.dcid = cpu_to_le16(chan->scid);
3682 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02003683 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03003684 rsp.credits = cpu_to_le16(chan->rx_credits);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003685 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003686
3687 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp),
3688 &rsp);
3689}
3690
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003691void __l2cap_connect_rsp_defer(struct l2cap_chan *chan)
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003692{
3693 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003694 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003695 u8 buf[128];
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003696 u8 rsp_code;
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003697
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003698 rsp.scid = cpu_to_le16(chan->dcid);
3699 rsp.dcid = cpu_to_le16(chan->scid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003700 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
3701 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003702
3703 if (chan->hs_hcon)
3704 rsp_code = L2CAP_CREATE_CHAN_RSP;
3705 else
3706 rsp_code = L2CAP_CONN_RSP;
3707
3708 BT_DBG("chan %p rsp_code %u", chan, rsp_code);
3709
3710 l2cap_send_cmd(conn, chan->ident, rsp_code, sizeof(rsp), &rsp);
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003711
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003712 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003713 return;
3714
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003715 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003716 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003717 chan->num_conf_req++;
3718}
3719
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003720static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len)
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003721{
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003722 int type, olen;
3723 unsigned long val;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003724 /* Use sane default values in case a misbehaving remote device
3725 * did not send an RFC or extended window size option.
3726 */
3727 u16 txwin_ext = chan->ack_win;
3728 struct l2cap_conf_rfc rfc = {
3729 .mode = chan->mode,
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003730 .retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO),
3731 .monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO),
Mat Martineauc20f8e32012-07-10 05:47:07 -07003732 .max_pdu_size = cpu_to_le16(chan->imtu),
3733 .txwin_size = min_t(u16, chan->ack_win, L2CAP_DEFAULT_TX_WINDOW),
3734 };
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003735
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003736 BT_DBG("chan %p, rsp %p, len %d", chan, rsp, len);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003737
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003738 if ((chan->mode != L2CAP_MODE_ERTM) && (chan->mode != L2CAP_MODE_STREAMING))
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003739 return;
3740
3741 while (len >= L2CAP_CONF_OPT_SIZE) {
3742 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3743
Mat Martineauc20f8e32012-07-10 05:47:07 -07003744 switch (type) {
3745 case L2CAP_CONF_RFC:
3746 if (olen == sizeof(rfc))
3747 memcpy(&rfc, (void *)val, olen);
Szymon Janc8f321f82012-06-08 11:33:33 +02003748 break;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003749 case L2CAP_CONF_EWS:
3750 txwin_ext = val;
3751 break;
3752 }
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003753 }
3754
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003755 switch (rfc.mode) {
3756 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003757 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3758 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003759 chan->mps = le16_to_cpu(rfc.max_pdu_size);
3760 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3761 chan->ack_win = min_t(u16, chan->ack_win, txwin_ext);
3762 else
3763 chan->ack_win = min_t(u16, chan->ack_win,
3764 rfc.txwin_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003765 break;
3766 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003767 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003768 }
3769}
3770
Gustavo Padovan2d792812012-10-06 10:07:01 +01003771static inline int l2cap_command_rej(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003772 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3773 u8 *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003774{
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003775 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003776
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003777 if (cmd_len < sizeof(*rej))
3778 return -EPROTO;
3779
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003780 if (rej->reason != L2CAP_REJ_NOT_UNDERSTOOD)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003781 return 0;
3782
3783 if ((conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003784 cmd->ident == conn->info_ident) {
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02003785 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann984947d2009-02-06 23:35:19 +01003786
3787 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01003788 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01003789
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003790 l2cap_conn_start(conn);
3791 }
3792
3793 return 0;
3794}
3795
Mat Martineau17009152012-10-23 15:24:07 -07003796static struct l2cap_chan *l2cap_connect(struct l2cap_conn *conn,
3797 struct l2cap_cmd_hdr *cmd,
3798 u8 *data, u8 rsp_code, u8 amp_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003799{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003800 struct l2cap_conn_req *req = (struct l2cap_conn_req *) data;
3801 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003802 struct l2cap_chan *chan = NULL, *pchan;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003803 int result, status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003804
3805 u16 dcid = 0, scid = __le16_to_cpu(req->scid);
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003806 __le16 psm = req->psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003807
Andrei Emeltchenko097db762012-03-09 14:16:17 +02003808 BT_DBG("psm 0x%2.2x scid 0x%4.4x", __le16_to_cpu(psm), scid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003809
3810 /* Check if we have socket listening on psm */
Marcel Holtmann6f59b902013-10-13 05:24:01 -07003811 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03003812 &conn->hcon->dst, ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003813 if (!pchan) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003814 result = L2CAP_CR_BAD_PSM;
3815 goto sendresp;
3816 }
3817
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003818 mutex_lock(&conn->chan_lock);
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003819 l2cap_chan_lock(pchan);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00003820
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003821 /* Check if the ACL is secure enough (if not SDP) */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003822 if (psm != cpu_to_le16(L2CAP_PSM_SDP) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003823 !hci_conn_check_link_mode(conn->hcon)) {
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02003824 conn->disc_reason = HCI_ERROR_AUTH_FAILURE;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003825 result = L2CAP_CR_SEC_BLOCK;
3826 goto response;
3827 }
3828
Linus Torvalds1da177e2005-04-16 15:20:36 -07003829 result = L2CAP_CR_NO_MEM;
3830
Gustavo Padovan2dfa1002012-05-27 22:27:58 -03003831 /* Check if we already have channel with that dcid */
3832 if (__l2cap_get_chan_by_dcid(conn, scid))
3833 goto response;
3834
Gustavo Padovan80b98022012-05-27 22:27:51 -03003835 chan = pchan->ops->new_connection(pchan);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03003836 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003837 goto response;
3838
Syam Sidhardhan330b6c12013-08-06 01:59:12 +09003839 /* For certain devices (ex: HID mouse), support for authentication,
3840 * pairing and bonding is optional. For such devices, inorder to avoid
3841 * the ACL alive for too long after L2CAP disconnection, reset the ACL
3842 * disc_timeout back to HCI_DISCONN_TIMEOUT during L2CAP connect.
3843 */
3844 conn->hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
3845
Marcel Holtmann7eafc592013-10-13 08:12:47 -07003846 bacpy(&chan->src, &conn->hcon->src);
3847 bacpy(&chan->dst, &conn->hcon->dst);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -07003848 chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type);
3849 chan->dst_type = bdaddr_type(conn->hcon, conn->hcon->dst_type);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003850 chan->psm = psm;
3851 chan->dcid = scid;
Mat Martineau17009152012-10-23 15:24:07 -07003852 chan->local_amp_id = amp_id;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003853
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003854 __l2cap_chan_add(conn, chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003855
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003856 dcid = chan->scid;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003857
Gustavo Padovan8d836d72013-10-15 19:24:47 -03003858 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003859
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003860 chan->ident = cmd->ident;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003861
Marcel Holtmann984947d2009-02-06 23:35:19 +01003862 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) {
Johan Hedberge7cafc42014-07-17 15:35:38 +03003863 if (l2cap_chan_check_security(chan, false)) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07003864 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003865 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003866 result = L2CAP_CR_PEND;
3867 status = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08003868 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003869 } else {
Mat Martineau17009152012-10-23 15:24:07 -07003870 /* Force pending result for AMP controllers.
3871 * The connection will succeed after the
3872 * physical link is up.
3873 */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003874 if (amp_id == AMP_ID_BREDR) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003875 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau17009152012-10-23 15:24:07 -07003876 result = L2CAP_CR_SUCCESS;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003877 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003878 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003879 result = L2CAP_CR_PEND;
Mat Martineau17009152012-10-23 15:24:07 -07003880 }
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003881 status = L2CAP_CS_NO_INFO;
3882 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003883 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003884 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003885 result = L2CAP_CR_PEND;
3886 status = L2CAP_CS_AUTHEN_PEND;
3887 }
3888 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003889 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003890 result = L2CAP_CR_PEND;
3891 status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003892 }
3893
Linus Torvalds1da177e2005-04-16 15:20:36 -07003894response:
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003895 l2cap_chan_unlock(pchan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003896 mutex_unlock(&conn->chan_lock);
Johan Hedberga24cce12014-08-07 22:56:42 +03003897 l2cap_chan_put(pchan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003898
3899sendresp:
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003900 rsp.scid = cpu_to_le16(scid);
3901 rsp.dcid = cpu_to_le16(dcid);
3902 rsp.result = cpu_to_le16(result);
3903 rsp.status = cpu_to_le16(status);
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003904 l2cap_send_cmd(conn, cmd->ident, rsp_code, sizeof(rsp), &rsp);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003905
3906 if (result == L2CAP_CR_PEND && status == L2CAP_CS_NO_INFO) {
3907 struct l2cap_info_req info;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003908 info.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003909
3910 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
3911 conn->info_ident = l2cap_get_ident(conn);
3912
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08003913 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003914
Gustavo Padovan2d792812012-10-06 10:07:01 +01003915 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
3916 sizeof(info), &info);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003917 }
3918
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003919 if (chan && !test_bit(CONF_REQ_SENT, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003920 result == L2CAP_CR_SUCCESS) {
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003921 u8 buf[128];
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003922 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003923 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003924 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003925 chan->num_conf_req++;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003926 }
Mat Martineau17009152012-10-23 15:24:07 -07003927
3928 return chan;
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003929}
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003930
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003931static int l2cap_connect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003932 struct l2cap_cmd_hdr *cmd, u16 cmd_len, u8 *data)
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003933{
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303934 struct hci_dev *hdev = conn->hcon->hdev;
3935 struct hci_conn *hcon = conn->hcon;
3936
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003937 if (cmd_len < sizeof(struct l2cap_conn_req))
3938 return -EPROTO;
3939
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303940 hci_dev_lock(hdev);
3941 if (test_bit(HCI_MGMT, &hdev->dev_flags) &&
3942 !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &hcon->flags))
3943 mgmt_device_connected(hdev, &hcon->dst, hcon->type,
3944 hcon->dst_type, 0, NULL, 0,
3945 hcon->dev_class);
3946 hci_dev_unlock(hdev);
3947
Gustavo Padovan300229f2012-10-12 19:40:40 +08003948 l2cap_connect(conn, cmd, data, L2CAP_CONN_RSP, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003949 return 0;
3950}
3951
Mat Martineau5909cf32012-10-23 15:24:08 -07003952static int l2cap_connect_create_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003953 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3954 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003955{
3956 struct l2cap_conn_rsp *rsp = (struct l2cap_conn_rsp *) data;
3957 u16 scid, dcid, result, status;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003958 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003959 u8 req[128];
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003960 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003961
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003962 if (cmd_len < sizeof(*rsp))
3963 return -EPROTO;
3964
Linus Torvalds1da177e2005-04-16 15:20:36 -07003965 scid = __le16_to_cpu(rsp->scid);
3966 dcid = __le16_to_cpu(rsp->dcid);
3967 result = __le16_to_cpu(rsp->result);
3968 status = __le16_to_cpu(rsp->status);
3969
Andrei Emeltchenko1b009c92012-02-21 12:54:54 +02003970 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 +01003971 dcid, scid, result, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003972
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003973 mutex_lock(&conn->chan_lock);
3974
Linus Torvalds1da177e2005-04-16 15:20:36 -07003975 if (scid) {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003976 chan = __l2cap_get_chan_by_scid(conn, scid);
3977 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003978 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003979 goto unlock;
3980 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003981 } else {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003982 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
3983 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003984 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003985 goto unlock;
3986 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003987 }
3988
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003989 err = 0;
3990
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003991 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003992
Linus Torvalds1da177e2005-04-16 15:20:36 -07003993 switch (result) {
3994 case L2CAP_CR_SUCCESS:
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03003995 l2cap_state_change(chan, BT_CONFIG);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003996 chan->ident = 0;
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003997 chan->dcid = dcid;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003998 clear_bit(CONF_CONNECT_PEND, &chan->conf_state);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01003999
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004000 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03004001 break;
4002
Linus Torvalds1da177e2005-04-16 15:20:36 -07004003 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004004 l2cap_build_conf_req(chan, req), req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004005 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004006 break;
4007
4008 case L2CAP_CR_PEND:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004009 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004010 break;
4011
4012 default:
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004013 l2cap_chan_del(chan, ECONNREFUSED);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004014 break;
4015 }
4016
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004017 l2cap_chan_unlock(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004018
4019unlock:
4020 mutex_unlock(&conn->chan_lock);
4021
4022 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004023}
4024
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004025static inline void set_default_fcs(struct l2cap_chan *chan)
Mat Martineau8c462b62010-08-24 15:35:42 -07004026{
4027 /* FCS is enabled only in ERTM or streaming mode, if one or both
4028 * sides request it.
4029 */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03004030 if (chan->mode != L2CAP_MODE_ERTM && chan->mode != L2CAP_MODE_STREAMING)
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004031 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02004032 else if (!test_bit(CONF_RECV_NO_FCS, &chan->conf_state))
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004033 chan->fcs = L2CAP_FCS_CRC16;
Mat Martineau8c462b62010-08-24 15:35:42 -07004034}
4035
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03004036static void l2cap_send_efs_conf_rsp(struct l2cap_chan *chan, void *data,
4037 u8 ident, u16 flags)
4038{
4039 struct l2cap_conn *conn = chan->conn;
4040
4041 BT_DBG("conn %p chan %p ident %d flags 0x%4.4x", conn, chan, ident,
4042 flags);
4043
4044 clear_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
4045 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
4046
4047 l2cap_send_cmd(conn, ident, L2CAP_CONF_RSP,
4048 l2cap_build_conf_rsp(chan, data,
4049 L2CAP_CONF_SUCCESS, flags), data);
4050}
4051
Johan Hedberg662d6522013-10-16 11:20:47 +03004052static void cmd_reject_invalid_cid(struct l2cap_conn *conn, u8 ident,
4053 u16 scid, u16 dcid)
4054{
4055 struct l2cap_cmd_rej_cid rej;
4056
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004057 rej.reason = cpu_to_le16(L2CAP_REJ_INVALID_CID);
Johan Hedberg662d6522013-10-16 11:20:47 +03004058 rej.scid = __cpu_to_le16(scid);
4059 rej.dcid = __cpu_to_le16(dcid);
4060
4061 l2cap_send_cmd(conn, ident, L2CAP_COMMAND_REJ, sizeof(rej), &rej);
4062}
4063
Gustavo Padovan2d792812012-10-06 10:07:01 +01004064static inline int l2cap_config_req(struct l2cap_conn *conn,
4065 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4066 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004067{
4068 struct l2cap_conf_req *req = (struct l2cap_conf_req *) data;
4069 u16 dcid, flags;
4070 u8 rsp[64];
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004071 struct l2cap_chan *chan;
Mat Martineau3c588192012-04-11 10:48:42 -07004072 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004073
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004074 if (cmd_len < sizeof(*req))
4075 return -EPROTO;
4076
Linus Torvalds1da177e2005-04-16 15:20:36 -07004077 dcid = __le16_to_cpu(req->dcid);
4078 flags = __le16_to_cpu(req->flags);
4079
4080 BT_DBG("dcid 0x%4.4x flags 0x%2.2x", dcid, flags);
4081
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004082 chan = l2cap_get_chan_by_scid(conn, dcid);
Johan Hedberg662d6522013-10-16 11:20:47 +03004083 if (!chan) {
4084 cmd_reject_invalid_cid(conn, cmd->ident, dcid, 0);
4085 return 0;
4086 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004087
David S. Miller033b1142011-07-21 13:38:42 -07004088 if (chan->state != BT_CONFIG && chan->state != BT_CONNECT2) {
Johan Hedberg662d6522013-10-16 11:20:47 +03004089 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4090 chan->dcid);
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004091 goto unlock;
Gustavo F. Padovandf6bd742010-06-14 02:26:15 -03004092 }
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004093
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004094 /* Reject if config buffer is too small. */
Al Viro88219a02007-07-29 00:17:25 -07004095 len = cmd_len - sizeof(*req);
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004096 if (chan->conf_len + len > sizeof(chan->conf_req)) {
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004097 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004098 l2cap_build_conf_rsp(chan, rsp,
4099 L2CAP_CONF_REJECT, flags), rsp);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004100 goto unlock;
4101 }
4102
4103 /* Store config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004104 memcpy(chan->conf_req + chan->conf_len, req->data, len);
4105 chan->conf_len += len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004106
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004107 if (flags & L2CAP_CONF_FLAG_CONTINUATION) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004108 /* Incomplete config. Send empty response. */
4109 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004110 l2cap_build_conf_rsp(chan, rsp,
4111 L2CAP_CONF_SUCCESS, flags), rsp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004112 goto unlock;
4113 }
4114
4115 /* Complete config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004116 len = l2cap_parse_conf_req(chan, rsp);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004117 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004118 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004119 goto unlock;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004120 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004121
Mat Martineau1500109b2012-10-23 15:24:15 -07004122 chan->ident = cmd->ident;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004123 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004124 chan->num_conf_rsp++;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004125
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004126 /* Reset config buffer. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004127 chan->conf_len = 0;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004128
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004129 if (!test_bit(CONF_OUTPUT_DONE, &chan->conf_state))
Marcel Holtmann876d9482007-10-20 13:35:42 +02004130 goto unlock;
4131
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004132 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004133 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004134
Mat Martineau105bdf92012-04-27 16:50:48 -07004135 if (chan->mode == L2CAP_MODE_ERTM ||
4136 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004137 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004138
Mat Martineau3c588192012-04-11 10:48:42 -07004139 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004140 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004141 else
4142 l2cap_chan_ready(chan);
4143
Marcel Holtmann876d9482007-10-20 13:35:42 +02004144 goto unlock;
4145 }
4146
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004147 if (!test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02004148 u8 buf[64];
Linus Torvalds1da177e2005-04-16 15:20:36 -07004149 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004150 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004151 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004152 }
4153
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004154 /* Got Conf Rsp PENDING from remote side and asume we sent
4155 Conf Rsp PENDING in the code above */
4156 if (test_bit(CONF_REM_CONF_PEND, &chan->conf_state) &&
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03004157 test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004158
4159 /* check compatibility */
4160
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004161 /* Send rsp for BR/EDR channel */
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004162 if (!chan->hs_hcon)
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004163 l2cap_send_efs_conf_rsp(chan, rsp, cmd->ident, flags);
4164 else
4165 chan->ident = cmd->ident;
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004166 }
4167
Linus Torvalds1da177e2005-04-16 15:20:36 -07004168unlock:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004169 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004170 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004171}
4172
Gustavo Padovan2d792812012-10-06 10:07:01 +01004173static inline int l2cap_config_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004174 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4175 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004176{
4177 struct l2cap_conf_rsp *rsp = (struct l2cap_conf_rsp *)data;
4178 u16 scid, flags, result;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004179 struct l2cap_chan *chan;
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004180 int len = cmd_len - sizeof(*rsp);
Mat Martineau3c588192012-04-11 10:48:42 -07004181 int err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004182
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004183 if (cmd_len < sizeof(*rsp))
4184 return -EPROTO;
4185
Linus Torvalds1da177e2005-04-16 15:20:36 -07004186 scid = __le16_to_cpu(rsp->scid);
4187 flags = __le16_to_cpu(rsp->flags);
4188 result = __le16_to_cpu(rsp->result);
4189
Andrei Emeltchenko61386cb2012-03-12 12:13:07 +02004190 BT_DBG("scid 0x%4.4x flags 0x%2.2x result 0x%2.2x len %d", scid, flags,
4191 result, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004192
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004193 chan = l2cap_get_chan_by_scid(conn, scid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004194 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004195 return 0;
4196
4197 switch (result) {
4198 case L2CAP_CONF_SUCCESS:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004199 l2cap_conf_rfc_get(chan, rsp->data, len);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004200 clear_bit(CONF_REM_CONF_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004201 break;
4202
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004203 case L2CAP_CONF_PENDING:
4204 set_bit(CONF_REM_CONF_PEND, &chan->conf_state);
4205
4206 if (test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
4207 char buf[64];
4208
4209 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004210 buf, &result);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004211 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004212 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004213 goto done;
4214 }
4215
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004216 if (!chan->hs_hcon) {
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004217 l2cap_send_efs_conf_rsp(chan, buf, cmd->ident,
4218 0);
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02004219 } else {
4220 if (l2cap_check_efs(chan)) {
4221 amp_create_logical_link(chan);
4222 chan->ident = cmd->ident;
4223 }
4224 }
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004225 }
4226 goto done;
4227
Linus Torvalds1da177e2005-04-16 15:20:36 -07004228 case L2CAP_CONF_UNACCEPT:
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004229 if (chan->num_conf_rsp <= L2CAP_CONF_MAX_CONF_RSP) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004230 char req[64];
4231
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004232 if (len > sizeof(req) - sizeof(struct l2cap_conf_req)) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004233 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004234 goto done;
4235 }
4236
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004237 /* throw out any old stored conf requests */
4238 result = L2CAP_CONF_SUCCESS;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03004239 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004240 req, &result);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004241 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004242 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004243 goto done;
4244 }
4245
4246 l2cap_send_cmd(conn, l2cap_get_ident(conn),
Gustavo Padovan2d792812012-10-06 10:07:01 +01004247 L2CAP_CONF_REQ, len, req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004248 chan->num_conf_req++;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004249 if (result != L2CAP_CONF_SUCCESS)
4250 goto done;
4251 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004252 }
4253
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09004254 default:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004255 l2cap_chan_set_err(chan, ECONNRESET);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +02004256
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08004257 __set_chan_timer(chan, L2CAP_DISC_REJ_TIMEOUT);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004258 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004259 goto done;
4260 }
4261
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004262 if (flags & L2CAP_CONF_FLAG_CONTINUATION)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004263 goto done;
4264
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004265 set_bit(CONF_INPUT_DONE, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004266
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004267 if (test_bit(CONF_OUTPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004268 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004269
Mat Martineau105bdf92012-04-27 16:50:48 -07004270 if (chan->mode == L2CAP_MODE_ERTM ||
4271 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004272 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004273
Mat Martineau3c588192012-04-11 10:48:42 -07004274 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004275 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004276 else
4277 l2cap_chan_ready(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004278 }
4279
4280done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004281 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004282 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004283}
4284
Gustavo Padovan2d792812012-10-06 10:07:01 +01004285static inline int l2cap_disconnect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004286 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4287 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004288{
4289 struct l2cap_disconn_req *req = (struct l2cap_disconn_req *) data;
4290 struct l2cap_disconn_rsp rsp;
4291 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004292 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004293
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004294 if (cmd_len != sizeof(*req))
4295 return -EPROTO;
4296
Linus Torvalds1da177e2005-04-16 15:20:36 -07004297 scid = __le16_to_cpu(req->scid);
4298 dcid = __le16_to_cpu(req->dcid);
4299
4300 BT_DBG("scid 0x%4.4x dcid 0x%4.4x", scid, dcid);
4301
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004302 mutex_lock(&conn->chan_lock);
4303
4304 chan = __l2cap_get_chan_by_scid(conn, dcid);
4305 if (!chan) {
4306 mutex_unlock(&conn->chan_lock);
Johan Hedberg662d6522013-10-16 11:20:47 +03004307 cmd_reject_invalid_cid(conn, cmd->ident, dcid, scid);
4308 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004309 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004310
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004311 l2cap_chan_lock(chan);
4312
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03004313 rsp.dcid = cpu_to_le16(chan->scid);
4314 rsp.scid = cpu_to_le16(chan->dcid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004315 l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp);
4316
Gustavo Padovan5ec1bbe2013-10-15 19:24:48 -03004317 chan->ops->set_shutdown(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004318
Mat Martineau61d6ef32012-04-27 16:50:50 -07004319 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004320 l2cap_chan_del(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004321
4322 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004323
Gustavo Padovan80b98022012-05-27 22:27:51 -03004324 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004325 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004326
4327 mutex_unlock(&conn->chan_lock);
4328
Linus Torvalds1da177e2005-04-16 15:20:36 -07004329 return 0;
4330}
4331
Gustavo Padovan2d792812012-10-06 10:07:01 +01004332static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004333 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4334 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004335{
4336 struct l2cap_disconn_rsp *rsp = (struct l2cap_disconn_rsp *) data;
4337 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004338 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004339
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004340 if (cmd_len != sizeof(*rsp))
4341 return -EPROTO;
4342
Linus Torvalds1da177e2005-04-16 15:20:36 -07004343 scid = __le16_to_cpu(rsp->scid);
4344 dcid = __le16_to_cpu(rsp->dcid);
4345
4346 BT_DBG("dcid 0x%4.4x scid 0x%4.4x", dcid, scid);
4347
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004348 mutex_lock(&conn->chan_lock);
4349
4350 chan = __l2cap_get_chan_by_scid(conn, scid);
4351 if (!chan) {
4352 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004353 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004354 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004355
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004356 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004357
Mat Martineau61d6ef32012-04-27 16:50:50 -07004358 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004359 l2cap_chan_del(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004360
4361 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004362
Gustavo Padovan80b98022012-05-27 22:27:51 -03004363 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004364 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004365
4366 mutex_unlock(&conn->chan_lock);
4367
Linus Torvalds1da177e2005-04-16 15:20:36 -07004368 return 0;
4369}
4370
Gustavo Padovan2d792812012-10-06 10:07:01 +01004371static inline int l2cap_information_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004372 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4373 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004374{
4375 struct l2cap_info_req *req = (struct l2cap_info_req *) data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004376 u16 type;
4377
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004378 if (cmd_len != sizeof(*req))
4379 return -EPROTO;
4380
Linus Torvalds1da177e2005-04-16 15:20:36 -07004381 type = __le16_to_cpu(req->type);
4382
4383 BT_DBG("type 0x%4.4x", type);
4384
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004385 if (type == L2CAP_IT_FEAT_MASK) {
4386 u8 buf[8];
Marcel Holtmann44dd46d2009-05-02 19:09:01 -07004387 u32 feat_mask = l2cap_feat_mask;
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004388 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004389 rsp->type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
4390 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03004391 if (!disable_ertm)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004392 feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING
Gustavo Padovan2d792812012-10-06 10:07:01 +01004393 | L2CAP_FEAT_FCS;
Marcel Holtmann848566b2013-10-01 22:59:22 -07004394 if (conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03004395 feat_mask |= L2CAP_FEAT_EXT_FLOW
Gustavo Padovan2d792812012-10-06 10:07:01 +01004396 | L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenkoa5fd6f32011-09-16 16:26:32 +03004397
Gustavo F. Padovan1b7bf4e2009-08-24 00:45:20 -03004398 put_unaligned_le32(feat_mask, rsp->data);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004399 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4400 buf);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004401 } else if (type == L2CAP_IT_FIXED_CHAN) {
4402 u8 buf[12];
4403 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Mat Martineau50a147c2011-11-02 16:18:34 -07004404
Marcel Holtmann848566b2013-10-01 22:59:22 -07004405 if (conn->hs_enabled)
Mat Martineau50a147c2011-11-02 16:18:34 -07004406 l2cap_fixed_chan[0] |= L2CAP_FC_A2MP;
4407 else
4408 l2cap_fixed_chan[0] &= ~L2CAP_FC_A2MP;
4409
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004410 rsp->type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
4411 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Andrei Emeltchenkoc6337ea2011-10-20 17:02:44 +03004412 memcpy(rsp->data, l2cap_fixed_chan, sizeof(l2cap_fixed_chan));
Gustavo Padovan2d792812012-10-06 10:07:01 +01004413 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4414 buf);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004415 } else {
4416 struct l2cap_info_rsp rsp;
4417 rsp.type = cpu_to_le16(type);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004418 rsp.result = cpu_to_le16(L2CAP_IR_NOTSUPP);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004419 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(rsp),
4420 &rsp);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004421 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004422
4423 return 0;
4424}
4425
Gustavo Padovan2d792812012-10-06 10:07:01 +01004426static inline int l2cap_information_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004427 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4428 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004429{
4430 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) data;
4431 u16 type, result;
4432
Jaganath Kanakkassery3f6fa3d2013-06-21 19:55:11 +05304433 if (cmd_len < sizeof(*rsp))
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004434 return -EPROTO;
4435
Linus Torvalds1da177e2005-04-16 15:20:36 -07004436 type = __le16_to_cpu(rsp->type);
4437 result = __le16_to_cpu(rsp->result);
4438
4439 BT_DBG("type 0x%4.4x result 0x%2.2x", type, result);
4440
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004441 /* L2CAP Info req/rsp are unbound to channels, add extra checks */
4442 if (cmd->ident != conn->info_ident ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01004443 conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004444 return 0;
4445
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02004446 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004447
Ville Tervoadb08ed2010-08-04 09:43:33 +03004448 if (result != L2CAP_IR_SUCCESS) {
4449 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4450 conn->info_ident = 0;
4451
4452 l2cap_conn_start(conn);
4453
4454 return 0;
4455 }
4456
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004457 switch (type) {
4458 case L2CAP_IT_FEAT_MASK:
Harvey Harrison83985312008-05-02 16:25:46 -07004459 conn->feat_mask = get_unaligned_le32(rsp->data);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004460
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07004461 if (conn->feat_mask & L2CAP_FEAT_FIXED_CHAN) {
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004462 struct l2cap_info_req req;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004463 req.type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004464
4465 conn->info_ident = l2cap_get_ident(conn);
4466
4467 l2cap_send_cmd(conn, conn->info_ident,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004468 L2CAP_INFO_REQ, sizeof(req), &req);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004469 } else {
4470 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4471 conn->info_ident = 0;
4472
4473 l2cap_conn_start(conn);
4474 }
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004475 break;
4476
4477 case L2CAP_IT_FIXED_CHAN:
4478 conn->fixed_chan_mask = rsp->data[0];
Marcel Holtmann984947d2009-02-06 23:35:19 +01004479 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004480 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004481
4482 l2cap_conn_start(conn);
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004483 break;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004484 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004485
Linus Torvalds1da177e2005-04-16 15:20:36 -07004486 return 0;
4487}
4488
Mat Martineau17009152012-10-23 15:24:07 -07004489static int l2cap_create_channel_req(struct l2cap_conn *conn,
4490 struct l2cap_cmd_hdr *cmd,
4491 u16 cmd_len, void *data)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004492{
4493 struct l2cap_create_chan_req *req = data;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004494 struct l2cap_create_chan_rsp rsp;
Mat Martineau17009152012-10-23 15:24:07 -07004495 struct l2cap_chan *chan;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004496 struct hci_dev *hdev;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004497 u16 psm, scid;
4498
4499 if (cmd_len != sizeof(*req))
4500 return -EPROTO;
4501
Marcel Holtmann848566b2013-10-01 22:59:22 -07004502 if (!conn->hs_enabled)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004503 return -EINVAL;
4504
4505 psm = le16_to_cpu(req->psm);
4506 scid = le16_to_cpu(req->scid);
4507
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004508 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 -07004509
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004510 /* For controller id 0 make BR/EDR connection */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004511 if (req->amp_id == AMP_ID_BREDR) {
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004512 l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4513 req->amp_id);
4514 return 0;
4515 }
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004516
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004517 /* Validate AMP controller id */
4518 hdev = hci_dev_get(req->amp_id);
4519 if (!hdev)
4520 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004521
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004522 if (hdev->dev_type != HCI_AMP || !test_bit(HCI_UP, &hdev->flags)) {
Mat Martineau17009152012-10-23 15:24:07 -07004523 hci_dev_put(hdev);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004524 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004525 }
4526
4527 chan = l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4528 req->amp_id);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004529 if (chan) {
4530 struct amp_mgr *mgr = conn->hcon->amp_mgr;
4531 struct hci_conn *hs_hcon;
4532
Marcel Holtmann98e0f7e2013-10-13 02:23:40 -07004533 hs_hcon = hci_conn_hash_lookup_ba(hdev, AMP_LINK,
4534 &conn->hcon->dst);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004535 if (!hs_hcon) {
4536 hci_dev_put(hdev);
Johan Hedberg662d6522013-10-16 11:20:47 +03004537 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4538 chan->dcid);
4539 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004540 }
4541
4542 BT_DBG("mgr %p bredr_chan %p hs_hcon %p", mgr, chan, hs_hcon);
4543
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004544 mgr->bredr_chan = chan;
4545 chan->hs_hcon = hs_hcon;
Andrei Emeltchenkofd45bf42012-11-20 17:16:22 +02004546 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004547 conn->mtu = hdev->block_mtu;
4548 }
4549
4550 hci_dev_put(hdev);
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004551
4552 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004553
4554error:
4555 rsp.dcid = 0;
4556 rsp.scid = cpu_to_le16(scid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004557 rsp.result = cpu_to_le16(L2CAP_CR_BAD_AMP);
4558 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004559
4560 l2cap_send_cmd(conn, cmd->ident, L2CAP_CREATE_CHAN_RSP,
4561 sizeof(rsp), &rsp);
4562
Johan Hedbergdc280802013-09-16 13:05:13 +03004563 return 0;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004564}
4565
Mat Martineau8eb200b2012-10-23 15:24:17 -07004566static void l2cap_send_move_chan_req(struct l2cap_chan *chan, u8 dest_amp_id)
4567{
4568 struct l2cap_move_chan_req req;
4569 u8 ident;
4570
4571 BT_DBG("chan %p, dest_amp_id %d", chan, dest_amp_id);
4572
4573 ident = l2cap_get_ident(chan->conn);
4574 chan->ident = ident;
4575
4576 req.icid = cpu_to_le16(chan->scid);
4577 req.dest_amp_id = dest_amp_id;
4578
4579 l2cap_send_cmd(chan->conn, ident, L2CAP_MOVE_CHAN_REQ, sizeof(req),
4580 &req);
4581
4582 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4583}
4584
Mat Martineau1500109b2012-10-23 15:24:15 -07004585static void l2cap_send_move_chan_rsp(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004586{
4587 struct l2cap_move_chan_rsp rsp;
4588
Mat Martineau1500109b2012-10-23 15:24:15 -07004589 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004590
Mat Martineau1500109b2012-10-23 15:24:15 -07004591 rsp.icid = cpu_to_le16(chan->dcid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004592 rsp.result = cpu_to_le16(result);
4593
Mat Martineau1500109b2012-10-23 15:24:15 -07004594 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_RSP,
4595 sizeof(rsp), &rsp);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004596}
4597
Mat Martineau5b155ef2012-10-23 15:24:14 -07004598static void l2cap_send_move_chan_cfm(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004599{
4600 struct l2cap_move_chan_cfm cfm;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004601
Mat Martineau5b155ef2012-10-23 15:24:14 -07004602 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004603
Mat Martineau5b155ef2012-10-23 15:24:14 -07004604 chan->ident = l2cap_get_ident(chan->conn);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004605
Mat Martineau5b155ef2012-10-23 15:24:14 -07004606 cfm.icid = cpu_to_le16(chan->scid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004607 cfm.result = cpu_to_le16(result);
4608
Mat Martineau5b155ef2012-10-23 15:24:14 -07004609 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_CFM,
4610 sizeof(cfm), &cfm);
4611
4612 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4613}
4614
4615static void l2cap_send_move_chan_cfm_icid(struct l2cap_conn *conn, u16 icid)
4616{
4617 struct l2cap_move_chan_cfm cfm;
4618
4619 BT_DBG("conn %p, icid 0x%4.4x", conn, icid);
4620
4621 cfm.icid = cpu_to_le16(icid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004622 cfm.result = cpu_to_le16(L2CAP_MC_UNCONFIRMED);
Mat Martineau5b155ef2012-10-23 15:24:14 -07004623
4624 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_MOVE_CHAN_CFM,
4625 sizeof(cfm), &cfm);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004626}
4627
4628static void l2cap_send_move_chan_cfm_rsp(struct l2cap_conn *conn, u8 ident,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004629 u16 icid)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004630{
4631 struct l2cap_move_chan_cfm_rsp rsp;
4632
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004633 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004634
4635 rsp.icid = cpu_to_le16(icid);
4636 l2cap_send_cmd(conn, ident, L2CAP_MOVE_CHAN_CFM_RSP, sizeof(rsp), &rsp);
4637}
4638
Mat Martineau5f3847a2012-10-23 15:24:12 -07004639static void __release_logical_link(struct l2cap_chan *chan)
4640{
4641 chan->hs_hchan = NULL;
4642 chan->hs_hcon = NULL;
4643
4644 /* Placeholder - release the logical link */
4645}
4646
Mat Martineau1500109b2012-10-23 15:24:15 -07004647static void l2cap_logical_fail(struct l2cap_chan *chan)
4648{
4649 /* Logical link setup failed */
4650 if (chan->state != BT_CONNECTED) {
4651 /* Create channel failure, disconnect */
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004652 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineau1500109b2012-10-23 15:24:15 -07004653 return;
4654 }
4655
4656 switch (chan->move_role) {
4657 case L2CAP_MOVE_ROLE_RESPONDER:
4658 l2cap_move_done(chan);
4659 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_SUPP);
4660 break;
4661 case L2CAP_MOVE_ROLE_INITIATOR:
4662 if (chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_COMP ||
4663 chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_CFM) {
4664 /* Remote has only sent pending or
4665 * success responses, clean up
4666 */
4667 l2cap_move_done(chan);
4668 }
4669
4670 /* Other amp move states imply that the move
4671 * has already aborted
4672 */
4673 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
4674 break;
4675 }
4676}
4677
4678static void l2cap_logical_finish_create(struct l2cap_chan *chan,
4679 struct hci_chan *hchan)
4680{
4681 struct l2cap_conf_rsp rsp;
Mat Martineau1500109b2012-10-23 15:24:15 -07004682
Andrei Emeltchenko336178a2012-10-31 15:46:27 +02004683 chan->hs_hchan = hchan;
Mat Martineau1500109b2012-10-23 15:24:15 -07004684 chan->hs_hcon->l2cap_data = chan->conn;
4685
Andrei Emeltchenko35ba9562012-10-25 15:20:43 +03004686 l2cap_send_efs_conf_rsp(chan, &rsp, chan->ident, 0);
Mat Martineau1500109b2012-10-23 15:24:15 -07004687
4688 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Andrei Emeltchenkofe79c6f2012-10-25 15:20:42 +03004689 int err;
Mat Martineau1500109b2012-10-23 15:24:15 -07004690
4691 set_default_fcs(chan);
4692
4693 err = l2cap_ertm_init(chan);
4694 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004695 l2cap_send_disconn_req(chan, -err);
Mat Martineau1500109b2012-10-23 15:24:15 -07004696 else
4697 l2cap_chan_ready(chan);
4698 }
4699}
4700
4701static void l2cap_logical_finish_move(struct l2cap_chan *chan,
4702 struct hci_chan *hchan)
4703{
4704 chan->hs_hcon = hchan->conn;
4705 chan->hs_hcon->l2cap_data = chan->conn;
4706
4707 BT_DBG("move_state %d", chan->move_state);
4708
4709 switch (chan->move_state) {
4710 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
4711 /* Move confirm will be sent after a success
4712 * response is received
4713 */
4714 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4715 break;
4716 case L2CAP_MOVE_WAIT_LOGICAL_CFM:
4717 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4718 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4719 } else if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
4720 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
4721 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
4722 } else if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4723 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4724 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4725 }
4726 break;
4727 default:
4728 /* Move was not in expected state, free the channel */
4729 __release_logical_link(chan);
4730
4731 chan->move_state = L2CAP_MOVE_STABLE;
4732 }
4733}
4734
4735/* Call with chan locked */
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004736void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan,
4737 u8 status)
Mat Martineau5b155ef2012-10-23 15:24:14 -07004738{
Mat Martineau1500109b2012-10-23 15:24:15 -07004739 BT_DBG("chan %p, hchan %p, status %d", chan, hchan, status);
4740
4741 if (status) {
4742 l2cap_logical_fail(chan);
4743 __release_logical_link(chan);
4744 return;
4745 }
4746
4747 if (chan->state != BT_CONNECTED) {
4748 /* Ignore logical link if channel is on BR/EDR */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004749 if (chan->local_amp_id != AMP_ID_BREDR)
Mat Martineau1500109b2012-10-23 15:24:15 -07004750 l2cap_logical_finish_create(chan, hchan);
4751 } else {
4752 l2cap_logical_finish_move(chan, hchan);
4753 }
Mat Martineau5b155ef2012-10-23 15:24:14 -07004754}
4755
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004756void l2cap_move_start(struct l2cap_chan *chan)
4757{
4758 BT_DBG("chan %p", chan);
4759
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004760 if (chan->local_amp_id == AMP_ID_BREDR) {
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004761 if (chan->chan_policy != BT_CHANNEL_POLICY_AMP_PREFERRED)
4762 return;
4763 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4764 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4765 /* Placeholder - start physical link setup */
4766 } else {
4767 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4768 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4769 chan->move_id = 0;
4770 l2cap_move_setup(chan);
4771 l2cap_send_move_chan_req(chan, 0);
4772 }
4773}
4774
Mat Martineau8eb200b2012-10-23 15:24:17 -07004775static void l2cap_do_create(struct l2cap_chan *chan, int result,
4776 u8 local_amp_id, u8 remote_amp_id)
4777{
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004778 BT_DBG("chan %p state %s %u -> %u", chan, state_to_string(chan->state),
4779 local_amp_id, remote_amp_id);
4780
Andrei Emeltchenko12d6cc62012-11-14 17:39:31 +02004781 chan->fcs = L2CAP_FCS_NONE;
4782
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004783 /* Outgoing channel on AMP */
4784 if (chan->state == BT_CONNECT) {
4785 if (result == L2CAP_CR_SUCCESS) {
4786 chan->local_amp_id = local_amp_id;
4787 l2cap_send_create_chan_req(chan, remote_amp_id);
4788 } else {
4789 /* Revert to BR/EDR connect */
4790 l2cap_send_conn_req(chan);
4791 }
4792
4793 return;
4794 }
4795
4796 /* Incoming channel on AMP */
4797 if (__l2cap_no_conn_pending(chan)) {
Mat Martineau8eb200b2012-10-23 15:24:17 -07004798 struct l2cap_conn_rsp rsp;
4799 char buf[128];
4800 rsp.scid = cpu_to_le16(chan->dcid);
4801 rsp.dcid = cpu_to_le16(chan->scid);
4802
Mat Martineau8eb200b2012-10-23 15:24:17 -07004803 if (result == L2CAP_CR_SUCCESS) {
4804 /* Send successful response */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004805 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
4806 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004807 } else {
4808 /* Send negative response */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004809 rsp.result = cpu_to_le16(L2CAP_CR_NO_MEM);
4810 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004811 }
4812
4813 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_RSP,
4814 sizeof(rsp), &rsp);
4815
4816 if (result == L2CAP_CR_SUCCESS) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02004817 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004818 set_bit(CONF_REQ_SENT, &chan->conf_state);
4819 l2cap_send_cmd(chan->conn, l2cap_get_ident(chan->conn),
4820 L2CAP_CONF_REQ,
4821 l2cap_build_conf_req(chan, buf), buf);
4822 chan->num_conf_req++;
4823 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004824 }
4825}
4826
4827static void l2cap_do_move_initiate(struct l2cap_chan *chan, u8 local_amp_id,
4828 u8 remote_amp_id)
4829{
4830 l2cap_move_setup(chan);
4831 chan->move_id = local_amp_id;
4832 chan->move_state = L2CAP_MOVE_WAIT_RSP;
4833
4834 l2cap_send_move_chan_req(chan, remote_amp_id);
4835}
4836
4837static void l2cap_do_move_respond(struct l2cap_chan *chan, int result)
4838{
4839 struct hci_chan *hchan = NULL;
4840
4841 /* Placeholder - get hci_chan for logical link */
4842
4843 if (hchan) {
4844 if (hchan->state == BT_CONNECTED) {
4845 /* Logical link is ready to go */
4846 chan->hs_hcon = hchan->conn;
4847 chan->hs_hcon->l2cap_data = chan->conn;
4848 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4849 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4850
4851 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
4852 } else {
4853 /* Wait for logical link to be ready */
4854 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4855 }
4856 } else {
4857 /* Logical link not available */
4858 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_ALLOWED);
4859 }
4860}
4861
4862static void l2cap_do_move_cancel(struct l2cap_chan *chan, int result)
4863{
4864 if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4865 u8 rsp_result;
4866 if (result == -EINVAL)
4867 rsp_result = L2CAP_MR_BAD_ID;
4868 else
4869 rsp_result = L2CAP_MR_NOT_ALLOWED;
4870
4871 l2cap_send_move_chan_rsp(chan, rsp_result);
4872 }
4873
4874 chan->move_role = L2CAP_MOVE_ROLE_NONE;
4875 chan->move_state = L2CAP_MOVE_STABLE;
4876
4877 /* Restart data transmission */
4878 l2cap_ertm_send(chan);
4879}
4880
Andrei Emeltchenkoa514b172012-11-14 17:39:30 +02004881/* Invoke with locked chan */
4882void __l2cap_physical_cfm(struct l2cap_chan *chan, int result)
Mat Martineau8eb200b2012-10-23 15:24:17 -07004883{
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004884 u8 local_amp_id = chan->local_amp_id;
Andrei Emeltchenkofffadc02012-11-01 15:37:03 +02004885 u8 remote_amp_id = chan->remote_amp_id;
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004886
Mat Martineau8eb200b2012-10-23 15:24:17 -07004887 BT_DBG("chan %p, result %d, local_amp_id %d, remote_amp_id %d",
4888 chan, result, local_amp_id, remote_amp_id);
4889
Mat Martineau8eb200b2012-10-23 15:24:17 -07004890 if (chan->state == BT_DISCONN || chan->state == BT_CLOSED) {
4891 l2cap_chan_unlock(chan);
4892 return;
4893 }
4894
4895 if (chan->state != BT_CONNECTED) {
4896 l2cap_do_create(chan, result, local_amp_id, remote_amp_id);
4897 } else if (result != L2CAP_MR_SUCCESS) {
4898 l2cap_do_move_cancel(chan, result);
4899 } else {
4900 switch (chan->move_role) {
4901 case L2CAP_MOVE_ROLE_INITIATOR:
4902 l2cap_do_move_initiate(chan, local_amp_id,
4903 remote_amp_id);
4904 break;
4905 case L2CAP_MOVE_ROLE_RESPONDER:
4906 l2cap_do_move_respond(chan, result);
4907 break;
4908 default:
4909 l2cap_do_move_cancel(chan, result);
4910 break;
4911 }
4912 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004913}
4914
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004915static inline int l2cap_move_channel_req(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004916 struct l2cap_cmd_hdr *cmd,
4917 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004918{
4919 struct l2cap_move_chan_req *req = data;
Mat Martineau1500109b2012-10-23 15:24:15 -07004920 struct l2cap_move_chan_rsp rsp;
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004921 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004922 u16 icid = 0;
4923 u16 result = L2CAP_MR_NOT_ALLOWED;
4924
4925 if (cmd_len != sizeof(*req))
4926 return -EPROTO;
4927
4928 icid = le16_to_cpu(req->icid);
4929
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004930 BT_DBG("icid 0x%4.4x, dest_amp_id %d", icid, req->dest_amp_id);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004931
Marcel Holtmann848566b2013-10-01 22:59:22 -07004932 if (!conn->hs_enabled)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004933 return -EINVAL;
4934
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004935 chan = l2cap_get_chan_by_dcid(conn, icid);
4936 if (!chan) {
Mat Martineau1500109b2012-10-23 15:24:15 -07004937 rsp.icid = cpu_to_le16(icid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004938 rsp.result = cpu_to_le16(L2CAP_MR_NOT_ALLOWED);
Mat Martineau1500109b2012-10-23 15:24:15 -07004939 l2cap_send_cmd(conn, cmd->ident, L2CAP_MOVE_CHAN_RSP,
4940 sizeof(rsp), &rsp);
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004941 return 0;
4942 }
4943
Mat Martineau1500109b2012-10-23 15:24:15 -07004944 chan->ident = cmd->ident;
4945
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004946 if (chan->scid < L2CAP_CID_DYN_START ||
4947 chan->chan_policy == BT_CHANNEL_POLICY_BREDR_ONLY ||
4948 (chan->mode != L2CAP_MODE_ERTM &&
4949 chan->mode != L2CAP_MODE_STREAMING)) {
4950 result = L2CAP_MR_NOT_ALLOWED;
4951 goto send_move_response;
4952 }
4953
4954 if (chan->local_amp_id == req->dest_amp_id) {
4955 result = L2CAP_MR_SAME_ID;
4956 goto send_move_response;
4957 }
4958
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004959 if (req->dest_amp_id != AMP_ID_BREDR) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004960 struct hci_dev *hdev;
4961 hdev = hci_dev_get(req->dest_amp_id);
4962 if (!hdev || hdev->dev_type != HCI_AMP ||
4963 !test_bit(HCI_UP, &hdev->flags)) {
4964 if (hdev)
4965 hci_dev_put(hdev);
4966
4967 result = L2CAP_MR_BAD_ID;
4968 goto send_move_response;
4969 }
4970 hci_dev_put(hdev);
4971 }
4972
4973 /* Detect a move collision. Only send a collision response
4974 * if this side has "lost", otherwise proceed with the move.
4975 * The winner has the larger bd_addr.
4976 */
4977 if ((__chan_is_moving(chan) ||
4978 chan->move_role != L2CAP_MOVE_ROLE_NONE) &&
Marcel Holtmann6f59b902013-10-13 05:24:01 -07004979 bacmp(&conn->hcon->src, &conn->hcon->dst) > 0) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004980 result = L2CAP_MR_COLLISION;
4981 goto send_move_response;
4982 }
4983
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004984 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
4985 l2cap_move_setup(chan);
4986 chan->move_id = req->dest_amp_id;
4987 icid = chan->dcid;
4988
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004989 if (req->dest_amp_id == AMP_ID_BREDR) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004990 /* Moving to BR/EDR */
4991 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4992 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4993 result = L2CAP_MR_PEND;
4994 } else {
4995 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4996 result = L2CAP_MR_SUCCESS;
4997 }
4998 } else {
4999 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
5000 /* Placeholder - uncomment when amp functions are available */
5001 /*amp_accept_physical(chan, req->dest_amp_id);*/
5002 result = L2CAP_MR_PEND;
5003 }
5004
5005send_move_response:
Mat Martineau1500109b2012-10-23 15:24:15 -07005006 l2cap_send_move_chan_rsp(chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005007
Mat Martineau02b0fbb2012-10-23 15:24:10 -07005008 l2cap_chan_unlock(chan);
5009
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005010 return 0;
5011}
5012
Mat Martineau5b155ef2012-10-23 15:24:14 -07005013static void l2cap_move_continue(struct l2cap_conn *conn, u16 icid, u16 result)
5014{
5015 struct l2cap_chan *chan;
5016 struct hci_chan *hchan = NULL;
5017
5018 chan = l2cap_get_chan_by_scid(conn, icid);
5019 if (!chan) {
5020 l2cap_send_move_chan_cfm_icid(conn, icid);
5021 return;
5022 }
5023
5024 __clear_chan_timer(chan);
5025 if (result == L2CAP_MR_PEND)
5026 __set_chan_timer(chan, L2CAP_MOVE_ERTX_TIMEOUT);
5027
5028 switch (chan->move_state) {
5029 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
5030 /* Move confirm will be sent when logical link
5031 * is complete.
5032 */
5033 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
5034 break;
5035 case L2CAP_MOVE_WAIT_RSP_SUCCESS:
5036 if (result == L2CAP_MR_PEND) {
5037 break;
5038 } else if (test_bit(CONN_LOCAL_BUSY,
5039 &chan->conn_state)) {
5040 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
5041 } else {
5042 /* Logical link is up or moving to BR/EDR,
5043 * proceed with move
5044 */
5045 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
5046 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
5047 }
5048 break;
5049 case L2CAP_MOVE_WAIT_RSP:
5050 /* Moving to AMP */
5051 if (result == L2CAP_MR_SUCCESS) {
5052 /* Remote is ready, send confirm immediately
5053 * after logical link is ready
5054 */
5055 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
5056 } else {
5057 /* Both logical link and move success
5058 * are required to confirm
5059 */
5060 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_COMP;
5061 }
5062
5063 /* Placeholder - get hci_chan for logical link */
5064 if (!hchan) {
5065 /* Logical link not available */
5066 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5067 break;
5068 }
5069
5070 /* If the logical link is not yet connected, do not
5071 * send confirmation.
5072 */
5073 if (hchan->state != BT_CONNECTED)
5074 break;
5075
5076 /* Logical link is already ready to go */
5077
5078 chan->hs_hcon = hchan->conn;
5079 chan->hs_hcon->l2cap_data = chan->conn;
5080
5081 if (result == L2CAP_MR_SUCCESS) {
5082 /* Can confirm now */
5083 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
5084 } else {
5085 /* Now only need move success
5086 * to confirm
5087 */
5088 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
5089 }
5090
5091 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
5092 break;
5093 default:
5094 /* Any other amp move state means the move failed. */
5095 chan->move_id = chan->local_amp_id;
5096 l2cap_move_done(chan);
5097 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5098 }
5099
5100 l2cap_chan_unlock(chan);
5101}
5102
5103static void l2cap_move_fail(struct l2cap_conn *conn, u8 ident, u16 icid,
5104 u16 result)
5105{
5106 struct l2cap_chan *chan;
5107
5108 chan = l2cap_get_chan_by_ident(conn, ident);
5109 if (!chan) {
5110 /* Could not locate channel, icid is best guess */
5111 l2cap_send_move_chan_cfm_icid(conn, icid);
5112 return;
5113 }
5114
5115 __clear_chan_timer(chan);
5116
5117 if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
5118 if (result == L2CAP_MR_COLLISION) {
5119 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
5120 } else {
5121 /* Cleanup - cancel move */
5122 chan->move_id = chan->local_amp_id;
5123 l2cap_move_done(chan);
5124 }
5125 }
5126
5127 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5128
5129 l2cap_chan_unlock(chan);
5130}
5131
5132static int l2cap_move_channel_rsp(struct l2cap_conn *conn,
5133 struct l2cap_cmd_hdr *cmd,
5134 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005135{
5136 struct l2cap_move_chan_rsp *rsp = data;
5137 u16 icid, result;
5138
5139 if (cmd_len != sizeof(*rsp))
5140 return -EPROTO;
5141
5142 icid = le16_to_cpu(rsp->icid);
5143 result = le16_to_cpu(rsp->result);
5144
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005145 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005146
Mat Martineau5b155ef2012-10-23 15:24:14 -07005147 if (result == L2CAP_MR_SUCCESS || result == L2CAP_MR_PEND)
5148 l2cap_move_continue(conn, icid, result);
5149 else
5150 l2cap_move_fail(conn, cmd->ident, icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005151
5152 return 0;
5153}
5154
Mat Martineau5f3847a2012-10-23 15:24:12 -07005155static int l2cap_move_channel_confirm(struct l2cap_conn *conn,
5156 struct l2cap_cmd_hdr *cmd,
5157 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005158{
5159 struct l2cap_move_chan_cfm *cfm = data;
Mat Martineau5f3847a2012-10-23 15:24:12 -07005160 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005161 u16 icid, result;
5162
5163 if (cmd_len != sizeof(*cfm))
5164 return -EPROTO;
5165
5166 icid = le16_to_cpu(cfm->icid);
5167 result = le16_to_cpu(cfm->result);
5168
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005169 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005170
Mat Martineau5f3847a2012-10-23 15:24:12 -07005171 chan = l2cap_get_chan_by_dcid(conn, icid);
5172 if (!chan) {
5173 /* Spec requires a response even if the icid was not found */
5174 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5175 return 0;
5176 }
5177
5178 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM) {
5179 if (result == L2CAP_MC_CONFIRMED) {
5180 chan->local_amp_id = chan->move_id;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005181 if (chan->local_amp_id == AMP_ID_BREDR)
Mat Martineau5f3847a2012-10-23 15:24:12 -07005182 __release_logical_link(chan);
5183 } else {
5184 chan->move_id = chan->local_amp_id;
5185 }
5186
5187 l2cap_move_done(chan);
5188 }
5189
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005190 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5191
Mat Martineau5f3847a2012-10-23 15:24:12 -07005192 l2cap_chan_unlock(chan);
5193
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005194 return 0;
5195}
5196
5197static inline int l2cap_move_channel_confirm_rsp(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005198 struct l2cap_cmd_hdr *cmd,
5199 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005200{
5201 struct l2cap_move_chan_cfm_rsp *rsp = data;
Mat Martineau3fd71a02012-10-23 15:24:16 -07005202 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005203 u16 icid;
5204
5205 if (cmd_len != sizeof(*rsp))
5206 return -EPROTO;
5207
5208 icid = le16_to_cpu(rsp->icid);
5209
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005210 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005211
Mat Martineau3fd71a02012-10-23 15:24:16 -07005212 chan = l2cap_get_chan_by_scid(conn, icid);
5213 if (!chan)
5214 return 0;
5215
5216 __clear_chan_timer(chan);
5217
5218 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM_RSP) {
5219 chan->local_amp_id = chan->move_id;
5220
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005221 if (chan->local_amp_id == AMP_ID_BREDR && chan->hs_hchan)
Mat Martineau3fd71a02012-10-23 15:24:16 -07005222 __release_logical_link(chan);
5223
5224 l2cap_move_done(chan);
5225 }
5226
5227 l2cap_chan_unlock(chan);
5228
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005229 return 0;
5230}
5231
Claudio Takahaside731152011-02-11 19:28:55 -02005232static inline int l2cap_conn_param_update_req(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005233 struct l2cap_cmd_hdr *cmd,
Johan Hedberg203e6392013-05-15 10:07:15 +03005234 u16 cmd_len, u8 *data)
Claudio Takahaside731152011-02-11 19:28:55 -02005235{
5236 struct hci_conn *hcon = conn->hcon;
5237 struct l2cap_conn_param_update_req *req;
5238 struct l2cap_conn_param_update_rsp rsp;
Johan Hedberg203e6392013-05-15 10:07:15 +03005239 u16 min, max, latency, to_multiplier;
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005240 int err;
Claudio Takahaside731152011-02-11 19:28:55 -02005241
Johan Hedberg40bef302014-07-16 11:42:27 +03005242 if (hcon->role != HCI_ROLE_MASTER)
Claudio Takahaside731152011-02-11 19:28:55 -02005243 return -EINVAL;
5244
Claudio Takahaside731152011-02-11 19:28:55 -02005245 if (cmd_len != sizeof(struct l2cap_conn_param_update_req))
5246 return -EPROTO;
5247
5248 req = (struct l2cap_conn_param_update_req *) data;
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03005249 min = __le16_to_cpu(req->min);
5250 max = __le16_to_cpu(req->max);
Claudio Takahaside731152011-02-11 19:28:55 -02005251 latency = __le16_to_cpu(req->latency);
5252 to_multiplier = __le16_to_cpu(req->to_multiplier);
5253
5254 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 +01005255 min, max, latency, to_multiplier);
Claudio Takahaside731152011-02-11 19:28:55 -02005256
5257 memset(&rsp, 0, sizeof(rsp));
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005258
Andre Guedesd4905f22014-06-25 21:52:52 -03005259 err = hci_check_conn_params(min, max, latency, to_multiplier);
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005260 if (err)
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005261 rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_REJECTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005262 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005263 rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_ACCEPTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005264
5265 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONN_PARAM_UPDATE_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005266 sizeof(rsp), &rsp);
Claudio Takahaside731152011-02-11 19:28:55 -02005267
Andre Guedesffb5a8272014-07-01 18:10:11 -03005268 if (!err) {
Johan Hedbergf4869e22014-07-02 17:37:32 +03005269 u8 store_hint;
Andre Guedesffb5a8272014-07-01 18:10:11 -03005270
Johan Hedbergf4869e22014-07-02 17:37:32 +03005271 store_hint = hci_le_conn_update(hcon, min, max, latency,
5272 to_multiplier);
5273 mgmt_new_conn_param(hcon->hdev, &hcon->dst, hcon->dst_type,
5274 store_hint, min, max, latency,
5275 to_multiplier);
5276
Andre Guedesffb5a8272014-07-01 18:10:11 -03005277 }
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005278
Claudio Takahaside731152011-02-11 19:28:55 -02005279 return 0;
5280}
5281
Johan Hedbergf1496de2013-05-13 14:15:56 +03005282static int l2cap_le_connect_rsp(struct l2cap_conn *conn,
5283 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5284 u8 *data)
5285{
5286 struct l2cap_le_conn_rsp *rsp = (struct l2cap_le_conn_rsp *) data;
5287 u16 dcid, mtu, mps, credits, result;
5288 struct l2cap_chan *chan;
5289 int err;
5290
5291 if (cmd_len < sizeof(*rsp))
5292 return -EPROTO;
5293
5294 dcid = __le16_to_cpu(rsp->dcid);
5295 mtu = __le16_to_cpu(rsp->mtu);
5296 mps = __le16_to_cpu(rsp->mps);
5297 credits = __le16_to_cpu(rsp->credits);
5298 result = __le16_to_cpu(rsp->result);
5299
5300 if (result == L2CAP_CR_SUCCESS && (mtu < 23 || mps < 23))
5301 return -EPROTO;
5302
5303 BT_DBG("dcid 0x%4.4x mtu %u mps %u credits %u result 0x%2.2x",
5304 dcid, mtu, mps, credits, result);
5305
5306 mutex_lock(&conn->chan_lock);
5307
5308 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5309 if (!chan) {
5310 err = -EBADSLT;
5311 goto unlock;
5312 }
5313
5314 err = 0;
5315
5316 l2cap_chan_lock(chan);
5317
5318 switch (result) {
5319 case L2CAP_CR_SUCCESS:
5320 chan->ident = 0;
5321 chan->dcid = dcid;
5322 chan->omtu = mtu;
5323 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005324 chan->tx_credits = credits;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005325 l2cap_chan_ready(chan);
5326 break;
5327
5328 default:
5329 l2cap_chan_del(chan, ECONNREFUSED);
5330 break;
5331 }
5332
5333 l2cap_chan_unlock(chan);
5334
5335unlock:
5336 mutex_unlock(&conn->chan_lock);
5337
5338 return err;
5339}
5340
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005341static inline int l2cap_bredr_sig_cmd(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005342 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5343 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005344{
5345 int err = 0;
5346
5347 switch (cmd->code) {
5348 case L2CAP_COMMAND_REJ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005349 l2cap_command_rej(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005350 break;
5351
5352 case L2CAP_CONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005353 err = l2cap_connect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005354 break;
5355
5356 case L2CAP_CONN_RSP:
Mat Martineauf5a25982012-10-11 17:48:21 +03005357 case L2CAP_CREATE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005358 l2cap_connect_create_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005359 break;
5360
5361 case L2CAP_CONF_REQ:
5362 err = l2cap_config_req(conn, cmd, cmd_len, data);
5363 break;
5364
5365 case L2CAP_CONF_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005366 l2cap_config_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005367 break;
5368
5369 case L2CAP_DISCONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005370 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005371 break;
5372
5373 case L2CAP_DISCONN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005374 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005375 break;
5376
5377 case L2CAP_ECHO_REQ:
5378 l2cap_send_cmd(conn, cmd->ident, L2CAP_ECHO_RSP, cmd_len, data);
5379 break;
5380
5381 case L2CAP_ECHO_RSP:
5382 break;
5383
5384 case L2CAP_INFO_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005385 err = l2cap_information_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005386 break;
5387
5388 case L2CAP_INFO_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005389 l2cap_information_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005390 break;
5391
Mat Martineauf94ff6f2011-11-02 16:18:32 -07005392 case L2CAP_CREATE_CHAN_REQ:
5393 err = l2cap_create_channel_req(conn, cmd, cmd_len, data);
5394 break;
5395
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005396 case L2CAP_MOVE_CHAN_REQ:
5397 err = l2cap_move_channel_req(conn, cmd, cmd_len, data);
5398 break;
5399
5400 case L2CAP_MOVE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005401 l2cap_move_channel_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005402 break;
5403
5404 case L2CAP_MOVE_CHAN_CFM:
5405 err = l2cap_move_channel_confirm(conn, cmd, cmd_len, data);
5406 break;
5407
5408 case L2CAP_MOVE_CHAN_CFM_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005409 l2cap_move_channel_confirm_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005410 break;
5411
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005412 default:
5413 BT_ERR("Unknown BR/EDR signaling command 0x%2.2x", cmd->code);
5414 err = -EINVAL;
5415 break;
5416 }
5417
5418 return err;
5419}
5420
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005421static int l2cap_le_connect_req(struct l2cap_conn *conn,
5422 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5423 u8 *data)
5424{
5425 struct l2cap_le_conn_req *req = (struct l2cap_le_conn_req *) data;
5426 struct l2cap_le_conn_rsp rsp;
5427 struct l2cap_chan *chan, *pchan;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005428 u16 dcid, scid, credits, mtu, mps;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005429 __le16 psm;
5430 u8 result;
5431
5432 if (cmd_len != sizeof(*req))
5433 return -EPROTO;
5434
5435 scid = __le16_to_cpu(req->scid);
5436 mtu = __le16_to_cpu(req->mtu);
5437 mps = __le16_to_cpu(req->mps);
5438 psm = req->psm;
5439 dcid = 0;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005440 credits = 0;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005441
5442 if (mtu < 23 || mps < 23)
5443 return -EPROTO;
5444
5445 BT_DBG("psm 0x%2.2x scid 0x%4.4x mtu %u mps %u", __le16_to_cpu(psm),
5446 scid, mtu, mps);
5447
5448 /* Check if we have socket listening on psm */
5449 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
5450 &conn->hcon->dst, LE_LINK);
5451 if (!pchan) {
5452 result = L2CAP_CR_BAD_PSM;
5453 chan = NULL;
5454 goto response;
5455 }
5456
5457 mutex_lock(&conn->chan_lock);
5458 l2cap_chan_lock(pchan);
5459
5460 if (!smp_sufficient_security(conn->hcon, pchan->sec_level)) {
5461 result = L2CAP_CR_AUTHENTICATION;
5462 chan = NULL;
5463 goto response_unlock;
5464 }
5465
5466 /* Check if we already have channel with that dcid */
5467 if (__l2cap_get_chan_by_dcid(conn, scid)) {
5468 result = L2CAP_CR_NO_MEM;
5469 chan = NULL;
5470 goto response_unlock;
5471 }
5472
5473 chan = pchan->ops->new_connection(pchan);
5474 if (!chan) {
5475 result = L2CAP_CR_NO_MEM;
5476 goto response_unlock;
5477 }
5478
Johan Hedberg0ce43ce2013-12-05 14:55:33 +02005479 l2cap_le_flowctl_init(chan);
5480
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005481 bacpy(&chan->src, &conn->hcon->src);
5482 bacpy(&chan->dst, &conn->hcon->dst);
5483 chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type);
5484 chan->dst_type = bdaddr_type(conn->hcon, conn->hcon->dst_type);
5485 chan->psm = psm;
5486 chan->dcid = scid;
5487 chan->omtu = mtu;
5488 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005489 chan->tx_credits = __le16_to_cpu(req->credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005490
5491 __l2cap_chan_add(conn, chan);
5492 dcid = chan->scid;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005493 credits = chan->rx_credits;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005494
5495 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
5496
5497 chan->ident = cmd->ident;
5498
5499 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
5500 l2cap_state_change(chan, BT_CONNECT2);
5501 result = L2CAP_CR_PEND;
5502 chan->ops->defer(chan);
5503 } else {
5504 l2cap_chan_ready(chan);
5505 result = L2CAP_CR_SUCCESS;
5506 }
5507
5508response_unlock:
5509 l2cap_chan_unlock(pchan);
5510 mutex_unlock(&conn->chan_lock);
Johan Hedberga24cce12014-08-07 22:56:42 +03005511 l2cap_chan_put(pchan);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005512
5513 if (result == L2CAP_CR_PEND)
5514 return 0;
5515
5516response:
5517 if (chan) {
5518 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02005519 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005520 } else {
5521 rsp.mtu = 0;
5522 rsp.mps = 0;
5523 }
5524
5525 rsp.dcid = cpu_to_le16(dcid);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005526 rsp.credits = cpu_to_le16(credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005527 rsp.result = cpu_to_le16(result);
5528
5529 l2cap_send_cmd(conn, cmd->ident, L2CAP_LE_CONN_RSP, sizeof(rsp), &rsp);
5530
5531 return 0;
5532}
5533
Johan Hedbergfad5fc892013-12-05 09:45:01 +02005534static inline int l2cap_le_credits(struct l2cap_conn *conn,
5535 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5536 u8 *data)
5537{
5538 struct l2cap_le_credits *pkt;
5539 struct l2cap_chan *chan;
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005540 u16 cid, credits, max_credits;
Johan Hedbergfad5fc892013-12-05 09:45:01 +02005541
5542 if (cmd_len != sizeof(*pkt))
5543 return -EPROTO;
5544
5545 pkt = (struct l2cap_le_credits *) data;
5546 cid = __le16_to_cpu(pkt->cid);
5547 credits = __le16_to_cpu(pkt->credits);
5548
5549 BT_DBG("cid 0x%4.4x credits 0x%4.4x", cid, credits);
5550
5551 chan = l2cap_get_chan_by_dcid(conn, cid);
5552 if (!chan)
5553 return -EBADSLT;
5554
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005555 max_credits = LE_FLOWCTL_MAX_CREDITS - chan->tx_credits;
5556 if (credits > max_credits) {
5557 BT_ERR("LE credits overflow");
5558 l2cap_send_disconn_req(chan, ECONNRESET);
5559
5560 /* Return 0 so that we don't trigger an unnecessary
5561 * command reject packet.
5562 */
5563 return 0;
5564 }
5565
Johan Hedbergfad5fc892013-12-05 09:45:01 +02005566 chan->tx_credits += credits;
5567
5568 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
5569 l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
5570 chan->tx_credits--;
5571 }
5572
5573 if (chan->tx_credits)
5574 chan->ops->resume(chan);
5575
5576 l2cap_chan_unlock(chan);
5577
5578 return 0;
5579}
5580
Johan Hedberg71fb4192013-12-10 10:52:48 +02005581static inline int l2cap_le_command_rej(struct l2cap_conn *conn,
5582 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5583 u8 *data)
5584{
5585 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
5586 struct l2cap_chan *chan;
5587
5588 if (cmd_len < sizeof(*rej))
5589 return -EPROTO;
5590
5591 mutex_lock(&conn->chan_lock);
5592
5593 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5594 if (!chan)
5595 goto done;
5596
5597 l2cap_chan_lock(chan);
5598 l2cap_chan_del(chan, ECONNREFUSED);
5599 l2cap_chan_unlock(chan);
5600
5601done:
5602 mutex_unlock(&conn->chan_lock);
5603 return 0;
5604}
5605
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005606static inline int l2cap_le_sig_cmd(struct l2cap_conn *conn,
Johan Hedberg203e6392013-05-15 10:07:15 +03005607 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5608 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005609{
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005610 int err = 0;
5611
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005612 switch (cmd->code) {
5613 case L2CAP_COMMAND_REJ:
Johan Hedberg71fb4192013-12-10 10:52:48 +02005614 l2cap_le_command_rej(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005615 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005616
5617 case L2CAP_CONN_PARAM_UPDATE_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005618 err = l2cap_conn_param_update_req(conn, cmd, cmd_len, data);
5619 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005620
5621 case L2CAP_CONN_PARAM_UPDATE_RSP:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005622 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005623
Johan Hedbergf1496de2013-05-13 14:15:56 +03005624 case L2CAP_LE_CONN_RSP:
5625 l2cap_le_connect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005626 break;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005627
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005628 case L2CAP_LE_CONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005629 err = l2cap_le_connect_req(conn, cmd, cmd_len, data);
5630 break;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005631
Johan Hedbergfad5fc892013-12-05 09:45:01 +02005632 case L2CAP_LE_CREDITS:
5633 err = l2cap_le_credits(conn, cmd, cmd_len, data);
5634 break;
5635
Johan Hedberg3defe012013-05-15 10:16:06 +03005636 case L2CAP_DISCONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005637 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
5638 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005639
5640 case L2CAP_DISCONN_RSP:
5641 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005642 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005643
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005644 default:
5645 BT_ERR("Unknown LE signaling command 0x%2.2x", cmd->code);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005646 err = -EINVAL;
5647 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005648 }
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005649
5650 return err;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005651}
5652
Johan Hedbergc5623552013-04-29 19:35:33 +03005653static inline void l2cap_le_sig_channel(struct l2cap_conn *conn,
5654 struct sk_buff *skb)
5655{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005656 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005657 struct l2cap_cmd_hdr *cmd;
5658 u16 len;
Johan Hedbergc5623552013-04-29 19:35:33 +03005659 int err;
5660
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005661 if (hcon->type != LE_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005662 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005663
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005664 if (skb->len < L2CAP_CMD_HDR_SIZE)
5665 goto drop;
Johan Hedbergc5623552013-04-29 19:35:33 +03005666
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005667 cmd = (void *) skb->data;
5668 skb_pull(skb, L2CAP_CMD_HDR_SIZE);
Johan Hedbergc5623552013-04-29 19:35:33 +03005669
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005670 len = le16_to_cpu(cmd->len);
Johan Hedbergc5623552013-04-29 19:35:33 +03005671
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005672 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd->code, len, cmd->ident);
Johan Hedbergc5623552013-04-29 19:35:33 +03005673
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005674 if (len != skb->len || !cmd->ident) {
5675 BT_DBG("corrupted command");
5676 goto drop;
5677 }
Johan Hedbergc5623552013-04-29 19:35:33 +03005678
Johan Hedberg203e6392013-05-15 10:07:15 +03005679 err = l2cap_le_sig_cmd(conn, cmd, len, skb->data);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005680 if (err) {
5681 struct l2cap_cmd_rej_unk rej;
Johan Hedbergc5623552013-04-29 19:35:33 +03005682
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005683 BT_ERR("Wrong link type (%d)", err);
Johan Hedbergc5623552013-04-29 19:35:33 +03005684
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005685 rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005686 l2cap_send_cmd(conn, cmd->ident, L2CAP_COMMAND_REJ,
5687 sizeof(rej), &rej);
Johan Hedbergc5623552013-04-29 19:35:33 +03005688 }
5689
Marcel Holtmann3b166292013-10-02 08:28:21 -07005690drop:
Johan Hedbergc5623552013-04-29 19:35:33 +03005691 kfree_skb(skb);
5692}
5693
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005694static inline void l2cap_sig_channel(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005695 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005696{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005697 struct hci_conn *hcon = conn->hcon;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005698 u8 *data = skb->data;
5699 int len = skb->len;
5700 struct l2cap_cmd_hdr cmd;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005701 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005702
5703 l2cap_raw_recv(conn, skb);
5704
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005705 if (hcon->type != ACL_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005706 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005707
Linus Torvalds1da177e2005-04-16 15:20:36 -07005708 while (len >= L2CAP_CMD_HDR_SIZE) {
Al Viro88219a02007-07-29 00:17:25 -07005709 u16 cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005710 memcpy(&cmd, data, L2CAP_CMD_HDR_SIZE);
5711 data += L2CAP_CMD_HDR_SIZE;
5712 len -= L2CAP_CMD_HDR_SIZE;
5713
Al Viro88219a02007-07-29 00:17:25 -07005714 cmd_len = le16_to_cpu(cmd.len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005715
Gustavo Padovan2d792812012-10-06 10:07:01 +01005716 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd.code, cmd_len,
5717 cmd.ident);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005718
Al Viro88219a02007-07-29 00:17:25 -07005719 if (cmd_len > len || !cmd.ident) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005720 BT_DBG("corrupted command");
5721 break;
5722 }
5723
Johan Hedbergc5623552013-04-29 19:35:33 +03005724 err = l2cap_bredr_sig_cmd(conn, &cmd, cmd_len, data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005725 if (err) {
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03005726 struct l2cap_cmd_rej_unk rej;
Gustavo F. Padovan2c6d1a22011-03-23 14:38:32 -03005727
5728 BT_ERR("Wrong link type (%d)", err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005729
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005730 rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Gustavo Padovan2d792812012-10-06 10:07:01 +01005731 l2cap_send_cmd(conn, cmd.ident, L2CAP_COMMAND_REJ,
5732 sizeof(rej), &rej);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005733 }
5734
Al Viro88219a02007-07-29 00:17:25 -07005735 data += cmd_len;
5736 len -= cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005737 }
5738
Marcel Holtmann3b166292013-10-02 08:28:21 -07005739drop:
Linus Torvalds1da177e2005-04-16 15:20:36 -07005740 kfree_skb(skb);
5741}
5742
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005743static int l2cap_check_fcs(struct l2cap_chan *chan, struct sk_buff *skb)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005744{
5745 u16 our_fcs, rcv_fcs;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03005746 int hdr_size;
5747
5748 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
5749 hdr_size = L2CAP_EXT_HDR_SIZE;
5750 else
5751 hdr_size = L2CAP_ENH_HDR_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005752
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005753 if (chan->fcs == L2CAP_FCS_CRC16) {
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005754 skb_trim(skb, skb->len - L2CAP_FCS_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005755 rcv_fcs = get_unaligned_le16(skb->data + skb->len);
5756 our_fcs = crc16(0, skb->data - hdr_size, skb->len + hdr_size);
5757
5758 if (our_fcs != rcv_fcs)
João Paulo Rechi Vita7a560e52010-06-22 13:56:27 -03005759 return -EBADMSG;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005760 }
5761 return 0;
5762}
5763
Mat Martineau6ea00482012-05-17 20:53:52 -07005764static void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan)
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005765{
Mat Martineaue31f7632012-05-17 20:53:41 -07005766 struct l2cap_ctrl control;
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005767
Mat Martineaue31f7632012-05-17 20:53:41 -07005768 BT_DBG("chan %p", chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005769
Mat Martineaue31f7632012-05-17 20:53:41 -07005770 memset(&control, 0, sizeof(control));
5771 control.sframe = 1;
5772 control.final = 1;
5773 control.reqseq = chan->buffer_seq;
5774 set_bit(CONN_SEND_FBIT, &chan->conn_state);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005775
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005776 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
Mat Martineaue31f7632012-05-17 20:53:41 -07005777 control.super = L2CAP_SUPER_RNR;
5778 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005779 }
5780
Mat Martineaue31f7632012-05-17 20:53:41 -07005781 if (test_and_clear_bit(CONN_REMOTE_BUSY, &chan->conn_state) &&
5782 chan->unacked_frames > 0)
5783 __set_retrans_timer(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005784
Mat Martineaue31f7632012-05-17 20:53:41 -07005785 /* Send pending iframes */
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03005786 l2cap_ertm_send(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005787
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005788 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
Mat Martineaue31f7632012-05-17 20:53:41 -07005789 test_bit(CONN_SEND_FBIT, &chan->conn_state)) {
5790 /* F-bit wasn't sent in an s-frame or i-frame yet, so
5791 * send it now.
5792 */
5793 control.super = L2CAP_SUPER_RR;
5794 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005795 }
5796}
5797
Gustavo Padovan2d792812012-10-06 10:07:01 +01005798static void append_skb_frag(struct sk_buff *skb, struct sk_buff *new_frag,
5799 struct sk_buff **last_frag)
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005800{
Mat Martineau84084a32011-07-22 14:54:00 -07005801 /* skb->len reflects data in skb as well as all fragments
5802 * skb->data_len reflects only data in fragments
5803 */
5804 if (!skb_has_frag_list(skb))
5805 skb_shinfo(skb)->frag_list = new_frag;
5806
5807 new_frag->next = NULL;
5808
5809 (*last_frag)->next = new_frag;
5810 *last_frag = new_frag;
5811
5812 skb->len += new_frag->len;
5813 skb->data_len += new_frag->len;
5814 skb->truesize += new_frag->truesize;
5815}
5816
Mat Martineau4b51dae92012-05-17 20:53:37 -07005817static int l2cap_reassemble_sdu(struct l2cap_chan *chan, struct sk_buff *skb,
5818 struct l2cap_ctrl *control)
Mat Martineau84084a32011-07-22 14:54:00 -07005819{
5820 int err = -EINVAL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005821
Mat Martineau4b51dae92012-05-17 20:53:37 -07005822 switch (control->sar) {
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005823 case L2CAP_SAR_UNSEGMENTED:
Mat Martineau84084a32011-07-22 14:54:00 -07005824 if (chan->sdu)
5825 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005826
Gustavo Padovan80b98022012-05-27 22:27:51 -03005827 err = chan->ops->recv(chan, skb);
Mat Martineau84084a32011-07-22 14:54:00 -07005828 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005829
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005830 case L2CAP_SAR_START:
Mat Martineau84084a32011-07-22 14:54:00 -07005831 if (chan->sdu)
5832 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005833
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005834 chan->sdu_len = get_unaligned_le16(skb->data);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005835 skb_pull(skb, L2CAP_SDULEN_SIZE);
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005836
Mat Martineau84084a32011-07-22 14:54:00 -07005837 if (chan->sdu_len > chan->imtu) {
5838 err = -EMSGSIZE;
5839 break;
5840 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005841
Mat Martineau84084a32011-07-22 14:54:00 -07005842 if (skb->len >= chan->sdu_len)
5843 break;
5844
5845 chan->sdu = skb;
5846 chan->sdu_last_frag = skb;
5847
5848 skb = NULL;
5849 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005850 break;
5851
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005852 case L2CAP_SAR_CONTINUE:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005853 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005854 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005855
Mat Martineau84084a32011-07-22 14:54:00 -07005856 append_skb_frag(chan->sdu, skb,
5857 &chan->sdu_last_frag);
5858 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005859
Mat Martineau84084a32011-07-22 14:54:00 -07005860 if (chan->sdu->len >= chan->sdu_len)
5861 break;
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005862
Mat Martineau84084a32011-07-22 14:54:00 -07005863 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005864 break;
5865
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005866 case L2CAP_SAR_END:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005867 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005868 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005869
Mat Martineau84084a32011-07-22 14:54:00 -07005870 append_skb_frag(chan->sdu, skb,
5871 &chan->sdu_last_frag);
5872 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005873
Mat Martineau84084a32011-07-22 14:54:00 -07005874 if (chan->sdu->len != chan->sdu_len)
5875 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005876
Gustavo Padovan80b98022012-05-27 22:27:51 -03005877 err = chan->ops->recv(chan, chan->sdu);
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005878
Mat Martineau84084a32011-07-22 14:54:00 -07005879 if (!err) {
5880 /* Reassembly complete */
5881 chan->sdu = NULL;
5882 chan->sdu_last_frag = NULL;
5883 chan->sdu_len = 0;
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005884 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005885 break;
5886 }
5887
Mat Martineau84084a32011-07-22 14:54:00 -07005888 if (err) {
5889 kfree_skb(skb);
5890 kfree_skb(chan->sdu);
5891 chan->sdu = NULL;
5892 chan->sdu_last_frag = NULL;
5893 chan->sdu_len = 0;
5894 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005895
Mat Martineau84084a32011-07-22 14:54:00 -07005896 return err;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005897}
5898
Mat Martineau32b32732012-10-23 15:24:11 -07005899static int l2cap_resegment(struct l2cap_chan *chan)
5900{
5901 /* Placeholder */
5902 return 0;
5903}
5904
Mat Martineaue3281402011-07-07 09:39:02 -07005905void l2cap_chan_busy(struct l2cap_chan *chan, int busy)
Gustavo F. Padovan712132e2010-06-21 19:39:50 -03005906{
Mat Martineau61aa4f52012-05-17 20:53:40 -07005907 u8 event;
5908
5909 if (chan->mode != L2CAP_MODE_ERTM)
5910 return;
5911
5912 event = busy ? L2CAP_EV_LOCAL_BUSY_DETECTED : L2CAP_EV_LOCAL_BUSY_CLEAR;
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03005913 l2cap_tx(chan, NULL, NULL, event);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005914}
5915
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005916static int l2cap_rx_queued_iframes(struct l2cap_chan *chan)
5917{
Mat Martineau63838722012-05-17 20:53:45 -07005918 int err = 0;
5919 /* Pass sequential frames to l2cap_reassemble_sdu()
5920 * until a gap is encountered.
5921 */
5922
5923 BT_DBG("chan %p", chan);
5924
5925 while (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
5926 struct sk_buff *skb;
5927 BT_DBG("Searching for skb with txseq %d (queue len %d)",
5928 chan->buffer_seq, skb_queue_len(&chan->srej_q));
5929
5930 skb = l2cap_ertm_seq_in_queue(&chan->srej_q, chan->buffer_seq);
5931
5932 if (!skb)
5933 break;
5934
5935 skb_unlink(skb, &chan->srej_q);
5936 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
5937 err = l2cap_reassemble_sdu(chan, skb, &bt_cb(skb)->control);
5938 if (err)
5939 break;
5940 }
5941
5942 if (skb_queue_empty(&chan->srej_q)) {
5943 chan->rx_state = L2CAP_RX_STATE_RECV;
5944 l2cap_send_ack(chan);
5945 }
5946
5947 return err;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005948}
5949
5950static void l2cap_handle_srej(struct l2cap_chan *chan,
5951 struct l2cap_ctrl *control)
5952{
Mat Martineauf80842a2012-05-17 20:53:46 -07005953 struct sk_buff *skb;
5954
5955 BT_DBG("chan %p, control %p", chan, control);
5956
5957 if (control->reqseq == chan->next_tx_seq) {
5958 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005959 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005960 return;
5961 }
5962
5963 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
5964
5965 if (skb == NULL) {
5966 BT_DBG("Seq %d not available for retransmission",
5967 control->reqseq);
5968 return;
5969 }
5970
5971 if (chan->max_tx != 0 && bt_cb(skb)->control.retries >= chan->max_tx) {
5972 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005973 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005974 return;
5975 }
5976
5977 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
5978
5979 if (control->poll) {
5980 l2cap_pass_to_tx(chan, control);
5981
5982 set_bit(CONN_SEND_FBIT, &chan->conn_state);
5983 l2cap_retransmit(chan, control);
5984 l2cap_ertm_send(chan);
5985
5986 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5987 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5988 chan->srej_save_reqseq = control->reqseq;
5989 }
5990 } else {
5991 l2cap_pass_to_tx_fbit(chan, control);
5992
5993 if (control->final) {
5994 if (chan->srej_save_reqseq != control->reqseq ||
5995 !test_and_clear_bit(CONN_SREJ_ACT,
5996 &chan->conn_state))
5997 l2cap_retransmit(chan, control);
5998 } else {
5999 l2cap_retransmit(chan, control);
6000 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
6001 set_bit(CONN_SREJ_ACT, &chan->conn_state);
6002 chan->srej_save_reqseq = control->reqseq;
6003 }
6004 }
6005 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006006}
6007
6008static void l2cap_handle_rej(struct l2cap_chan *chan,
6009 struct l2cap_ctrl *control)
6010{
Mat Martineaufcd289d2012-05-17 20:53:47 -07006011 struct sk_buff *skb;
6012
6013 BT_DBG("chan %p, control %p", chan, control);
6014
6015 if (control->reqseq == chan->next_tx_seq) {
6016 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006017 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07006018 return;
6019 }
6020
6021 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
6022
6023 if (chan->max_tx && skb &&
6024 bt_cb(skb)->control.retries >= chan->max_tx) {
6025 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006026 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07006027 return;
6028 }
6029
6030 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6031
6032 l2cap_pass_to_tx(chan, control);
6033
6034 if (control->final) {
6035 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state))
6036 l2cap_retransmit_all(chan, control);
6037 } else {
6038 l2cap_retransmit_all(chan, control);
6039 l2cap_ertm_send(chan);
6040 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F)
6041 set_bit(CONN_REJ_ACT, &chan->conn_state);
6042 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006043}
6044
Mat Martineau4b51dae92012-05-17 20:53:37 -07006045static u8 l2cap_classify_txseq(struct l2cap_chan *chan, u16 txseq)
6046{
6047 BT_DBG("chan %p, txseq %d", chan, txseq);
6048
6049 BT_DBG("last_acked_seq %d, expected_tx_seq %d", chan->last_acked_seq,
6050 chan->expected_tx_seq);
6051
6052 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
6053 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
Gustavo Padovan2d792812012-10-06 10:07:01 +01006054 chan->tx_win) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07006055 /* See notes below regarding "double poll" and
6056 * invalid packets.
6057 */
6058 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
6059 BT_DBG("Invalid/Ignore - after SREJ");
6060 return L2CAP_TXSEQ_INVALID_IGNORE;
6061 } else {
6062 BT_DBG("Invalid - in window after SREJ sent");
6063 return L2CAP_TXSEQ_INVALID;
6064 }
6065 }
6066
6067 if (chan->srej_list.head == txseq) {
6068 BT_DBG("Expected SREJ");
6069 return L2CAP_TXSEQ_EXPECTED_SREJ;
6070 }
6071
6072 if (l2cap_ertm_seq_in_queue(&chan->srej_q, txseq)) {
6073 BT_DBG("Duplicate SREJ - txseq already stored");
6074 return L2CAP_TXSEQ_DUPLICATE_SREJ;
6075 }
6076
6077 if (l2cap_seq_list_contains(&chan->srej_list, txseq)) {
6078 BT_DBG("Unexpected SREJ - not requested");
6079 return L2CAP_TXSEQ_UNEXPECTED_SREJ;
6080 }
6081 }
6082
6083 if (chan->expected_tx_seq == txseq) {
6084 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
6085 chan->tx_win) {
6086 BT_DBG("Invalid - txseq outside tx window");
6087 return L2CAP_TXSEQ_INVALID;
6088 } else {
6089 BT_DBG("Expected");
6090 return L2CAP_TXSEQ_EXPECTED;
6091 }
6092 }
6093
6094 if (__seq_offset(chan, txseq, chan->last_acked_seq) <
Gustavo Padovan2d792812012-10-06 10:07:01 +01006095 __seq_offset(chan, chan->expected_tx_seq, chan->last_acked_seq)) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07006096 BT_DBG("Duplicate - expected_tx_seq later than txseq");
6097 return L2CAP_TXSEQ_DUPLICATE;
6098 }
6099
6100 if (__seq_offset(chan, txseq, chan->last_acked_seq) >= chan->tx_win) {
6101 /* A source of invalid packets is a "double poll" condition,
6102 * where delays cause us to send multiple poll packets. If
6103 * the remote stack receives and processes both polls,
6104 * sequence numbers can wrap around in such a way that a
6105 * resent frame has a sequence number that looks like new data
6106 * with a sequence gap. This would trigger an erroneous SREJ
6107 * request.
6108 *
6109 * Fortunately, this is impossible with a tx window that's
6110 * less than half of the maximum sequence number, which allows
6111 * invalid frames to be safely ignored.
6112 *
6113 * With tx window sizes greater than half of the tx window
6114 * maximum, the frame is invalid and cannot be ignored. This
6115 * causes a disconnect.
6116 */
6117
6118 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
6119 BT_DBG("Invalid/Ignore - txseq outside tx window");
6120 return L2CAP_TXSEQ_INVALID_IGNORE;
6121 } else {
6122 BT_DBG("Invalid - txseq outside tx window");
6123 return L2CAP_TXSEQ_INVALID;
6124 }
6125 } else {
6126 BT_DBG("Unexpected - txseq indicates missing frames");
6127 return L2CAP_TXSEQ_UNEXPECTED;
6128 }
6129}
6130
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006131static int l2cap_rx_state_recv(struct l2cap_chan *chan,
6132 struct l2cap_ctrl *control,
6133 struct sk_buff *skb, u8 event)
6134{
6135 int err = 0;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006136 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006137
6138 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6139 event);
6140
6141 switch (event) {
6142 case L2CAP_EV_RECV_IFRAME:
6143 switch (l2cap_classify_txseq(chan, control->txseq)) {
6144 case L2CAP_TXSEQ_EXPECTED:
6145 l2cap_pass_to_tx(chan, control);
6146
6147 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6148 BT_DBG("Busy, discarding expected seq %d",
6149 control->txseq);
6150 break;
6151 }
6152
6153 chan->expected_tx_seq = __next_seq(chan,
6154 control->txseq);
6155
6156 chan->buffer_seq = chan->expected_tx_seq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006157 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006158
6159 err = l2cap_reassemble_sdu(chan, skb, control);
6160 if (err)
6161 break;
6162
6163 if (control->final) {
6164 if (!test_and_clear_bit(CONN_REJ_ACT,
6165 &chan->conn_state)) {
6166 control->final = 0;
6167 l2cap_retransmit_all(chan, control);
6168 l2cap_ertm_send(chan);
6169 }
6170 }
6171
6172 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
6173 l2cap_send_ack(chan);
6174 break;
6175 case L2CAP_TXSEQ_UNEXPECTED:
6176 l2cap_pass_to_tx(chan, control);
6177
6178 /* Can't issue SREJ frames in the local busy state.
6179 * Drop this frame, it will be seen as missing
6180 * when local busy is exited.
6181 */
6182 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6183 BT_DBG("Busy, discarding unexpected seq %d",
6184 control->txseq);
6185 break;
6186 }
6187
6188 /* There was a gap in the sequence, so an SREJ
6189 * must be sent for each missing frame. The
6190 * current frame is stored for later use.
6191 */
6192 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006193 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006194 BT_DBG("Queued %p (queue len %d)", skb,
6195 skb_queue_len(&chan->srej_q));
6196
6197 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
6198 l2cap_seq_list_clear(&chan->srej_list);
6199 l2cap_send_srej(chan, control->txseq);
6200
6201 chan->rx_state = L2CAP_RX_STATE_SREJ_SENT;
6202 break;
6203 case L2CAP_TXSEQ_DUPLICATE:
6204 l2cap_pass_to_tx(chan, control);
6205 break;
6206 case L2CAP_TXSEQ_INVALID_IGNORE:
6207 break;
6208 case L2CAP_TXSEQ_INVALID:
6209 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006210 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006211 break;
6212 }
6213 break;
6214 case L2CAP_EV_RECV_RR:
6215 l2cap_pass_to_tx(chan, control);
6216 if (control->final) {
6217 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6218
Mat Martineaue6a3ee62012-10-23 15:24:22 -07006219 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state) &&
6220 !__chan_is_moving(chan)) {
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006221 control->final = 0;
6222 l2cap_retransmit_all(chan, control);
6223 }
6224
6225 l2cap_ertm_send(chan);
6226 } else if (control->poll) {
6227 l2cap_send_i_or_rr_or_rnr(chan);
6228 } else {
6229 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6230 &chan->conn_state) &&
6231 chan->unacked_frames)
6232 __set_retrans_timer(chan);
6233
6234 l2cap_ertm_send(chan);
6235 }
6236 break;
6237 case L2CAP_EV_RECV_RNR:
6238 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6239 l2cap_pass_to_tx(chan, control);
6240 if (control && control->poll) {
6241 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6242 l2cap_send_rr_or_rnr(chan, 0);
6243 }
6244 __clear_retrans_timer(chan);
6245 l2cap_seq_list_clear(&chan->retrans_list);
6246 break;
6247 case L2CAP_EV_RECV_REJ:
6248 l2cap_handle_rej(chan, control);
6249 break;
6250 case L2CAP_EV_RECV_SREJ:
6251 l2cap_handle_srej(chan, control);
6252 break;
6253 default:
6254 break;
6255 }
6256
6257 if (skb && !skb_in_use) {
6258 BT_DBG("Freeing %p", skb);
6259 kfree_skb(skb);
6260 }
6261
6262 return err;
6263}
6264
6265static int l2cap_rx_state_srej_sent(struct l2cap_chan *chan,
6266 struct l2cap_ctrl *control,
6267 struct sk_buff *skb, u8 event)
6268{
6269 int err = 0;
6270 u16 txseq = control->txseq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006271 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006272
6273 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6274 event);
6275
6276 switch (event) {
6277 case L2CAP_EV_RECV_IFRAME:
6278 switch (l2cap_classify_txseq(chan, txseq)) {
6279 case L2CAP_TXSEQ_EXPECTED:
6280 /* Keep frame for reassembly later */
6281 l2cap_pass_to_tx(chan, control);
6282 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006283 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006284 BT_DBG("Queued %p (queue len %d)", skb,
6285 skb_queue_len(&chan->srej_q));
6286
6287 chan->expected_tx_seq = __next_seq(chan, txseq);
6288 break;
6289 case L2CAP_TXSEQ_EXPECTED_SREJ:
6290 l2cap_seq_list_pop(&chan->srej_list);
6291
6292 l2cap_pass_to_tx(chan, control);
6293 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006294 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006295 BT_DBG("Queued %p (queue len %d)", skb,
6296 skb_queue_len(&chan->srej_q));
6297
6298 err = l2cap_rx_queued_iframes(chan);
6299 if (err)
6300 break;
6301
6302 break;
6303 case L2CAP_TXSEQ_UNEXPECTED:
6304 /* Got a frame that can't be reassembled yet.
6305 * Save it for later, and send SREJs to cover
6306 * the missing frames.
6307 */
6308 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006309 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006310 BT_DBG("Queued %p (queue len %d)", skb,
6311 skb_queue_len(&chan->srej_q));
6312
6313 l2cap_pass_to_tx(chan, control);
6314 l2cap_send_srej(chan, control->txseq);
6315 break;
6316 case L2CAP_TXSEQ_UNEXPECTED_SREJ:
6317 /* This frame was requested with an SREJ, but
6318 * some expected retransmitted frames are
6319 * missing. Request retransmission of missing
6320 * SREJ'd frames.
6321 */
6322 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006323 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006324 BT_DBG("Queued %p (queue len %d)", skb,
6325 skb_queue_len(&chan->srej_q));
6326
6327 l2cap_pass_to_tx(chan, control);
6328 l2cap_send_srej_list(chan, control->txseq);
6329 break;
6330 case L2CAP_TXSEQ_DUPLICATE_SREJ:
6331 /* We've already queued this frame. Drop this copy. */
6332 l2cap_pass_to_tx(chan, control);
6333 break;
6334 case L2CAP_TXSEQ_DUPLICATE:
6335 /* Expecting a later sequence number, so this frame
6336 * was already received. Ignore it completely.
6337 */
6338 break;
6339 case L2CAP_TXSEQ_INVALID_IGNORE:
6340 break;
6341 case L2CAP_TXSEQ_INVALID:
6342 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006343 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006344 break;
6345 }
6346 break;
6347 case L2CAP_EV_RECV_RR:
6348 l2cap_pass_to_tx(chan, control);
6349 if (control->final) {
6350 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6351
6352 if (!test_and_clear_bit(CONN_REJ_ACT,
6353 &chan->conn_state)) {
6354 control->final = 0;
6355 l2cap_retransmit_all(chan, control);
6356 }
6357
6358 l2cap_ertm_send(chan);
6359 } else if (control->poll) {
6360 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6361 &chan->conn_state) &&
6362 chan->unacked_frames) {
6363 __set_retrans_timer(chan);
6364 }
6365
6366 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6367 l2cap_send_srej_tail(chan);
6368 } else {
6369 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6370 &chan->conn_state) &&
6371 chan->unacked_frames)
6372 __set_retrans_timer(chan);
6373
6374 l2cap_send_ack(chan);
6375 }
6376 break;
6377 case L2CAP_EV_RECV_RNR:
6378 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6379 l2cap_pass_to_tx(chan, control);
6380 if (control->poll) {
6381 l2cap_send_srej_tail(chan);
6382 } else {
6383 struct l2cap_ctrl rr_control;
6384 memset(&rr_control, 0, sizeof(rr_control));
6385 rr_control.sframe = 1;
6386 rr_control.super = L2CAP_SUPER_RR;
6387 rr_control.reqseq = chan->buffer_seq;
6388 l2cap_send_sframe(chan, &rr_control);
6389 }
6390
6391 break;
6392 case L2CAP_EV_RECV_REJ:
6393 l2cap_handle_rej(chan, control);
6394 break;
6395 case L2CAP_EV_RECV_SREJ:
6396 l2cap_handle_srej(chan, control);
6397 break;
6398 }
6399
6400 if (skb && !skb_in_use) {
6401 BT_DBG("Freeing %p", skb);
6402 kfree_skb(skb);
6403 }
6404
6405 return err;
6406}
6407
Mat Martineau32b32732012-10-23 15:24:11 -07006408static int l2cap_finish_move(struct l2cap_chan *chan)
6409{
6410 BT_DBG("chan %p", chan);
6411
6412 chan->rx_state = L2CAP_RX_STATE_RECV;
6413
6414 if (chan->hs_hcon)
6415 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6416 else
6417 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6418
6419 return l2cap_resegment(chan);
6420}
6421
6422static int l2cap_rx_state_wait_p(struct l2cap_chan *chan,
6423 struct l2cap_ctrl *control,
6424 struct sk_buff *skb, u8 event)
6425{
6426 int err;
6427
6428 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6429 event);
6430
6431 if (!control->poll)
6432 return -EPROTO;
6433
6434 l2cap_process_reqseq(chan, control->reqseq);
6435
6436 if (!skb_queue_empty(&chan->tx_q))
6437 chan->tx_send_head = skb_peek(&chan->tx_q);
6438 else
6439 chan->tx_send_head = NULL;
6440
6441 /* Rewind next_tx_seq to the point expected
6442 * by the receiver.
6443 */
6444 chan->next_tx_seq = control->reqseq;
6445 chan->unacked_frames = 0;
6446
6447 err = l2cap_finish_move(chan);
6448 if (err)
6449 return err;
6450
6451 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6452 l2cap_send_i_or_rr_or_rnr(chan);
6453
6454 if (event == L2CAP_EV_RECV_IFRAME)
6455 return -EPROTO;
6456
6457 return l2cap_rx_state_recv(chan, control, NULL, event);
6458}
6459
6460static int l2cap_rx_state_wait_f(struct l2cap_chan *chan,
6461 struct l2cap_ctrl *control,
6462 struct sk_buff *skb, u8 event)
6463{
6464 int err;
6465
6466 if (!control->final)
6467 return -EPROTO;
6468
6469 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6470
6471 chan->rx_state = L2CAP_RX_STATE_RECV;
6472 l2cap_process_reqseq(chan, control->reqseq);
6473
6474 if (!skb_queue_empty(&chan->tx_q))
6475 chan->tx_send_head = skb_peek(&chan->tx_q);
6476 else
6477 chan->tx_send_head = NULL;
6478
6479 /* Rewind next_tx_seq to the point expected
6480 * by the receiver.
6481 */
6482 chan->next_tx_seq = control->reqseq;
6483 chan->unacked_frames = 0;
6484
6485 if (chan->hs_hcon)
6486 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6487 else
6488 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6489
6490 err = l2cap_resegment(chan);
6491
6492 if (!err)
6493 err = l2cap_rx_state_recv(chan, control, skb, event);
6494
6495 return err;
6496}
6497
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006498static bool __valid_reqseq(struct l2cap_chan *chan, u16 reqseq)
6499{
6500 /* Make sure reqseq is for a packet that has been sent but not acked */
6501 u16 unacked;
6502
6503 unacked = __seq_offset(chan, chan->next_tx_seq, chan->expected_ack_seq);
6504 return __seq_offset(chan, chan->next_tx_seq, reqseq) <= unacked;
6505}
6506
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006507static int l2cap_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6508 struct sk_buff *skb, u8 event)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006509{
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006510 int err = 0;
6511
6512 BT_DBG("chan %p, control %p, skb %p, event %d, state %d", chan,
6513 control, skb, event, chan->rx_state);
6514
6515 if (__valid_reqseq(chan, control->reqseq)) {
6516 switch (chan->rx_state) {
6517 case L2CAP_RX_STATE_RECV:
6518 err = l2cap_rx_state_recv(chan, control, skb, event);
6519 break;
6520 case L2CAP_RX_STATE_SREJ_SENT:
6521 err = l2cap_rx_state_srej_sent(chan, control, skb,
6522 event);
6523 break;
Mat Martineau32b32732012-10-23 15:24:11 -07006524 case L2CAP_RX_STATE_WAIT_P:
6525 err = l2cap_rx_state_wait_p(chan, control, skb, event);
6526 break;
6527 case L2CAP_RX_STATE_WAIT_F:
6528 err = l2cap_rx_state_wait_f(chan, control, skb, event);
6529 break;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006530 default:
6531 /* shut it down */
6532 break;
6533 }
6534 } else {
6535 BT_DBG("Invalid reqseq %d (next_tx_seq %d, expected_ack_seq %d",
6536 control->reqseq, chan->next_tx_seq,
6537 chan->expected_ack_seq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006538 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006539 }
6540
6541 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006542}
6543
6544static int l2cap_stream_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6545 struct sk_buff *skb)
6546{
Mat Martineau4b51dae92012-05-17 20:53:37 -07006547 int err = 0;
6548
6549 BT_DBG("chan %p, control %p, skb %p, state %d", chan, control, skb,
6550 chan->rx_state);
6551
6552 if (l2cap_classify_txseq(chan, control->txseq) ==
6553 L2CAP_TXSEQ_EXPECTED) {
6554 l2cap_pass_to_tx(chan, control);
6555
6556 BT_DBG("buffer_seq %d->%d", chan->buffer_seq,
6557 __next_seq(chan, chan->buffer_seq));
6558
6559 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
6560
6561 l2cap_reassemble_sdu(chan, skb, control);
6562 } else {
6563 if (chan->sdu) {
6564 kfree_skb(chan->sdu);
6565 chan->sdu = NULL;
6566 }
6567 chan->sdu_last_frag = NULL;
6568 chan->sdu_len = 0;
6569
6570 if (skb) {
6571 BT_DBG("Freeing %p", skb);
6572 kfree_skb(skb);
6573 }
6574 }
6575
6576 chan->last_acked_seq = control->txseq;
6577 chan->expected_tx_seq = __next_seq(chan, control->txseq);
6578
6579 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006580}
6581
6582static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6583{
6584 struct l2cap_ctrl *control = &bt_cb(skb)->control;
6585 u16 len;
6586 u8 event;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006587
Mat Martineaub76bbd62012-04-11 10:48:43 -07006588 __unpack_control(chan, skb);
6589
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006590 len = skb->len;
6591
6592 /*
6593 * We can just drop the corrupted I-frame here.
6594 * Receiver will miss it and start proper recovery
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006595 * procedures and ask for retransmission.
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006596 */
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006597 if (l2cap_check_fcs(chan, skb))
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006598 goto drop;
6599
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006600 if (!control->sframe && control->sar == L2CAP_SAR_START)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006601 len -= L2CAP_SDULEN_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006602
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006603 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006604 len -= L2CAP_FCS_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006605
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006606 if (len > chan->mps) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006607 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006608 goto drop;
6609 }
6610
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006611 if (!control->sframe) {
6612 int err;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006613
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006614 BT_DBG("iframe sar %d, reqseq %d, final %d, txseq %d",
6615 control->sar, control->reqseq, control->final,
6616 control->txseq);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03006617
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006618 /* Validate F-bit - F=0 always valid, F=1 only
6619 * valid in TX WAIT_F
6620 */
6621 if (control->final && chan->tx_state != L2CAP_TX_STATE_WAIT_F)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006622 goto drop;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006623
6624 if (chan->mode != L2CAP_MODE_STREAMING) {
6625 event = L2CAP_EV_RECV_IFRAME;
6626 err = l2cap_rx(chan, control, skb, event);
6627 } else {
6628 err = l2cap_stream_rx(chan, control, skb);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006629 }
6630
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006631 if (err)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006632 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006633 } else {
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006634 const u8 rx_func_to_event[4] = {
6635 L2CAP_EV_RECV_RR, L2CAP_EV_RECV_REJ,
6636 L2CAP_EV_RECV_RNR, L2CAP_EV_RECV_SREJ
6637 };
6638
6639 /* Only I-frames are expected in streaming mode */
6640 if (chan->mode == L2CAP_MODE_STREAMING)
6641 goto drop;
6642
6643 BT_DBG("sframe reqseq %d, final %d, poll %d, super %d",
6644 control->reqseq, control->final, control->poll,
6645 control->super);
6646
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006647 if (len != 0) {
Andrei Emeltchenko1bb166e2012-11-20 17:16:21 +02006648 BT_ERR("Trailing bytes: %d in sframe", len);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006649 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006650 goto drop;
6651 }
6652
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006653 /* Validate F and P bits */
6654 if (control->final && (control->poll ||
6655 chan->tx_state != L2CAP_TX_STATE_WAIT_F))
6656 goto drop;
6657
6658 event = rx_func_to_event[control->super];
6659 if (l2cap_rx(chan, control, skb, event))
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006660 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006661 }
6662
6663 return 0;
6664
6665drop:
6666 kfree_skb(skb);
6667 return 0;
6668}
6669
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006670static void l2cap_chan_le_send_credits(struct l2cap_chan *chan)
6671{
6672 struct l2cap_conn *conn = chan->conn;
6673 struct l2cap_le_credits pkt;
6674 u16 return_credits;
6675
6676 /* We return more credits to the sender only after the amount of
6677 * credits falls below half of the initial amount.
6678 */
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02006679 if (chan->rx_credits >= (le_max_credits + 1) / 2)
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006680 return;
6681
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02006682 return_credits = le_max_credits - chan->rx_credits;
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006683
6684 BT_DBG("chan %p returning %u credits to sender", chan, return_credits);
6685
6686 chan->rx_credits += return_credits;
6687
6688 pkt.cid = cpu_to_le16(chan->scid);
6689 pkt.credits = cpu_to_le16(return_credits);
6690
6691 chan->ident = l2cap_get_ident(conn);
6692
6693 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CREDITS, sizeof(pkt), &pkt);
6694}
6695
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006696static int l2cap_le_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6697{
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006698 int err;
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006699
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006700 if (!chan->rx_credits) {
6701 BT_ERR("No credits to receive LE L2CAP data");
Johan Hedbergdfd97742014-01-27 15:11:34 -08006702 l2cap_send_disconn_req(chan, ECONNRESET);
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006703 return -ENOBUFS;
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006704 }
6705
6706 if (chan->imtu < skb->len) {
6707 BT_ERR("Too big LE L2CAP PDU");
6708 return -ENOBUFS;
6709 }
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006710
6711 chan->rx_credits--;
6712 BT_DBG("rx_credits %u -> %u", chan->rx_credits + 1, chan->rx_credits);
6713
6714 l2cap_chan_le_send_credits(chan);
6715
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006716 err = 0;
6717
6718 if (!chan->sdu) {
6719 u16 sdu_len;
6720
6721 sdu_len = get_unaligned_le16(skb->data);
6722 skb_pull(skb, L2CAP_SDULEN_SIZE);
6723
6724 BT_DBG("Start of new SDU. sdu_len %u skb->len %u imtu %u",
6725 sdu_len, skb->len, chan->imtu);
6726
6727 if (sdu_len > chan->imtu) {
6728 BT_ERR("Too big LE L2CAP SDU length received");
6729 err = -EMSGSIZE;
6730 goto failed;
6731 }
6732
6733 if (skb->len > sdu_len) {
6734 BT_ERR("Too much LE L2CAP data received");
6735 err = -EINVAL;
6736 goto failed;
6737 }
6738
6739 if (skb->len == sdu_len)
6740 return chan->ops->recv(chan, skb);
6741
6742 chan->sdu = skb;
6743 chan->sdu_len = sdu_len;
6744 chan->sdu_last_frag = skb;
6745
6746 return 0;
6747 }
6748
6749 BT_DBG("SDU fragment. chan->sdu->len %u skb->len %u chan->sdu_len %u",
6750 chan->sdu->len, skb->len, chan->sdu_len);
6751
6752 if (chan->sdu->len + skb->len > chan->sdu_len) {
6753 BT_ERR("Too much LE L2CAP data received");
6754 err = -EINVAL;
6755 goto failed;
6756 }
6757
6758 append_skb_frag(chan->sdu, skb, &chan->sdu_last_frag);
6759 skb = NULL;
6760
6761 if (chan->sdu->len == chan->sdu_len) {
6762 err = chan->ops->recv(chan, chan->sdu);
6763 if (!err) {
6764 chan->sdu = NULL;
6765 chan->sdu_last_frag = NULL;
6766 chan->sdu_len = 0;
6767 }
6768 }
6769
6770failed:
6771 if (err) {
6772 kfree_skb(skb);
6773 kfree_skb(chan->sdu);
6774 chan->sdu = NULL;
6775 chan->sdu_last_frag = NULL;
6776 chan->sdu_len = 0;
6777 }
6778
6779 /* We can't return an error here since we took care of the skb
6780 * freeing internally. An error return would cause the caller to
6781 * do a double-free of the skb.
6782 */
6783 return 0;
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006784}
6785
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006786static void l2cap_data_channel(struct l2cap_conn *conn, u16 cid,
6787 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006788{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006789 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006790
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03006791 chan = l2cap_get_chan_by_scid(conn, cid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006792 if (!chan) {
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006793 if (cid == L2CAP_CID_A2MP) {
6794 chan = a2mp_channel_create(conn, skb);
6795 if (!chan) {
6796 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006797 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006798 }
6799
6800 l2cap_chan_lock(chan);
6801 } else {
6802 BT_DBG("unknown cid 0x%4.4x", cid);
6803 /* Drop packet and return */
6804 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006805 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006806 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006807 }
6808
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03006809 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006810
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03006811 if (chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006812 goto drop;
6813
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006814 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03006815 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006816 if (l2cap_le_data_rcv(chan, skb) < 0)
6817 goto drop;
6818
6819 goto done;
6820
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006821 case L2CAP_MODE_BASIC:
6822 /* If socket recv buffers overflows we drop data here
6823 * which is *bad* because L2CAP has to be reliable.
6824 * But we don't have any other choice. L2CAP doesn't
6825 * provide flow control mechanism. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07006826
Szymon Janc2c96e032014-02-18 20:48:34 +01006827 if (chan->imtu < skb->len) {
6828 BT_ERR("Dropping L2CAP data: receive buffer overflow");
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006829 goto drop;
Szymon Janc2c96e032014-02-18 20:48:34 +01006830 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006831
Gustavo Padovan80b98022012-05-27 22:27:51 -03006832 if (!chan->ops->recv(chan, skb))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006833 goto done;
6834 break;
6835
6836 case L2CAP_MODE_ERTM:
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006837 case L2CAP_MODE_STREAMING:
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006838 l2cap_data_rcv(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006839 goto done;
6840
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006841 default:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006842 BT_DBG("chan %p: bad mode 0x%2.2x", chan, chan->mode);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006843 break;
6844 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006845
6846drop:
6847 kfree_skb(skb);
6848
6849done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006850 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006851}
6852
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006853static void l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm,
6854 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006855{
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006856 struct hci_conn *hcon = conn->hcon;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006857 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006858
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006859 if (hcon->type != ACL_LINK)
Johan Hedberga24cce12014-08-07 22:56:42 +03006860 goto free_skb;
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006861
Johan Hedbergbf20fd42013-05-14 13:23:13 +03006862 chan = l2cap_global_chan_by_psm(0, psm, &hcon->src, &hcon->dst,
6863 ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006864 if (!chan)
Johan Hedberga24cce12014-08-07 22:56:42 +03006865 goto free_skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006866
Andrei Emeltchenko5b4ceda2012-02-24 16:35:32 +02006867 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006868
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03006869 if (chan->state != BT_BOUND && chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006870 goto drop;
6871
Vinicius Costa Gomese13e21d2011-06-17 22:46:27 -03006872 if (chan->imtu < skb->len)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006873 goto drop;
6874
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006875 /* Store remote BD_ADDR and PSM for msg_name */
Marcel Holtmann06ae3312013-10-18 03:43:00 -07006876 bacpy(&bt_cb(skb)->bdaddr, &hcon->dst);
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006877 bt_cb(skb)->psm = psm;
6878
Johan Hedberga24cce12014-08-07 22:56:42 +03006879 if (!chan->ops->recv(chan, skb)) {
6880 l2cap_chan_put(chan);
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006881 return;
Johan Hedberga24cce12014-08-07 22:56:42 +03006882 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006883
6884drop:
Johan Hedberga24cce12014-08-07 22:56:42 +03006885 l2cap_chan_put(chan);
6886free_skb:
Linus Torvalds1da177e2005-04-16 15:20:36 -07006887 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006888}
6889
Marcel Holtmann72f78352013-04-23 00:59:00 -07006890static void l2cap_att_channel(struct l2cap_conn *conn,
Andrei Emeltchenko6810fca2012-05-31 11:18:57 +03006891 struct sk_buff *skb)
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006892{
Marcel Holtmannb99707d2013-10-03 02:54:11 -07006893 struct hci_conn *hcon = conn->hcon;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006894 struct l2cap_chan *chan;
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006895
Marcel Holtmannb99707d2013-10-03 02:54:11 -07006896 if (hcon->type != LE_LINK)
Johan Hedberga24cce12014-08-07 22:56:42 +03006897 goto free_skb;
Marcel Holtmannb99707d2013-10-03 02:54:11 -07006898
Johan Hedbergaf1c0132013-04-29 19:35:42 +03006899 chan = l2cap_global_chan_by_scid(BT_CONNECTED, L2CAP_CID_ATT,
Marcel Holtmann06ae3312013-10-18 03:43:00 -07006900 &hcon->src, &hcon->dst);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006901 if (!chan)
Johan Hedberga24cce12014-08-07 22:56:42 +03006902 goto free_skb;
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006903
Andrei Emeltchenko5b4ceda2012-02-24 16:35:32 +02006904 BT_DBG("chan %p, len %d", chan, skb->len);
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006905
Vinicius Costa Gomese13e21d2011-06-17 22:46:27 -03006906 if (chan->imtu < skb->len)
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006907 goto drop;
6908
Johan Hedberga24cce12014-08-07 22:56:42 +03006909 if (!chan->ops->recv(chan, skb)) {
6910 l2cap_chan_put(chan);
Andrei Emeltchenko6810fca2012-05-31 11:18:57 +03006911 return;
Johan Hedberga24cce12014-08-07 22:56:42 +03006912 }
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006913
6914drop:
Johan Hedberga24cce12014-08-07 22:56:42 +03006915 l2cap_chan_put(chan);
6916free_skb:
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006917 kfree_skb(skb);
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006918}
6919
Linus Torvalds1da177e2005-04-16 15:20:36 -07006920static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb)
6921{
6922 struct l2cap_hdr *lh = (void *) skb->data;
Johan Hedberg61a939c2014-01-17 20:45:11 +02006923 struct hci_conn *hcon = conn->hcon;
Al Viro8e036fc2007-07-29 00:16:36 -07006924 u16 cid, len;
6925 __le16 psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006926
Johan Hedberg61a939c2014-01-17 20:45:11 +02006927 if (hcon->state != BT_CONNECTED) {
6928 BT_DBG("queueing pending rx skb");
6929 skb_queue_tail(&conn->pending_rx, skb);
6930 return;
6931 }
6932
Linus Torvalds1da177e2005-04-16 15:20:36 -07006933 skb_pull(skb, L2CAP_HDR_SIZE);
6934 cid = __le16_to_cpu(lh->cid);
6935 len = __le16_to_cpu(lh->len);
6936
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006937 if (len != skb->len) {
6938 kfree_skb(skb);
6939 return;
6940 }
6941
Johan Hedberg9e1d7e12014-07-06 11:03:36 +03006942 /* Since we can't actively block incoming LE connections we must
6943 * at least ensure that we ignore incoming data from them.
6944 */
6945 if (hcon->type == LE_LINK &&
Johan Hedbergdcc36c12014-07-09 12:59:13 +03006946 hci_bdaddr_list_lookup(&hcon->hdev->blacklist, &hcon->dst,
6947 bdaddr_type(hcon, hcon->dst_type))) {
Johan Hedberge4931502014-07-02 09:36:21 +03006948 kfree_skb(skb);
6949 return;
6950 }
6951
Linus Torvalds1da177e2005-04-16 15:20:36 -07006952 BT_DBG("len %d, cid 0x%4.4x", len, cid);
6953
6954 switch (cid) {
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006955 case L2CAP_CID_SIGNALING:
Linus Torvalds1da177e2005-04-16 15:20:36 -07006956 l2cap_sig_channel(conn, skb);
6957 break;
6958
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006959 case L2CAP_CID_CONN_LESS:
Andrei Emeltchenko097db762012-03-09 14:16:17 +02006960 psm = get_unaligned((__le16 *) skb->data);
Andrei Emeltchenko0181a702012-05-29 10:04:05 +03006961 skb_pull(skb, L2CAP_PSMLEN_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006962 l2cap_conless_channel(conn, psm, skb);
6963 break;
6964
Johan Hedberg073d1cf2013-04-29 19:35:35 +03006965 case L2CAP_CID_ATT:
Marcel Holtmann72f78352013-04-23 00:59:00 -07006966 l2cap_att_channel(conn, skb);
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006967 break;
6968
Marcel Holtmanna2877622013-10-02 23:46:54 -07006969 case L2CAP_CID_LE_SIGNALING:
6970 l2cap_le_sig_channel(conn, skb);
6971 break;
6972
Anderson Brigliab501d6a2011-06-07 18:46:31 -03006973 case L2CAP_CID_SMP:
6974 if (smp_sig_channel(conn, skb))
6975 l2cap_conn_del(conn->hcon, EACCES);
6976 break;
6977
Linus Torvalds1da177e2005-04-16 15:20:36 -07006978 default:
6979 l2cap_data_channel(conn, cid, skb);
6980 break;
6981 }
6982}
6983
Johan Hedberg61a939c2014-01-17 20:45:11 +02006984static void process_pending_rx(struct work_struct *work)
6985{
6986 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
6987 pending_rx_work);
6988 struct sk_buff *skb;
6989
6990 BT_DBG("");
6991
6992 while ((skb = skb_dequeue(&conn->pending_rx)))
6993 l2cap_recv_frame(conn, skb);
6994}
6995
Johan Hedberg162b49e2014-01-17 20:45:10 +02006996static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon)
6997{
6998 struct l2cap_conn *conn = hcon->l2cap_data;
6999 struct hci_chan *hchan;
7000
7001 if (conn)
7002 return conn;
7003
7004 hchan = hci_chan_create(hcon);
7005 if (!hchan)
7006 return NULL;
7007
Johan Hedberg27f70f32014-07-21 10:50:06 +03007008 conn = kzalloc(sizeof(*conn), GFP_KERNEL);
Johan Hedberg162b49e2014-01-17 20:45:10 +02007009 if (!conn) {
7010 hci_chan_del(hchan);
7011 return NULL;
7012 }
7013
7014 kref_init(&conn->ref);
7015 hcon->l2cap_data = conn;
7016 conn->hcon = hcon;
7017 hci_conn_get(conn->hcon);
7018 conn->hchan = hchan;
7019
7020 BT_DBG("hcon %p conn %p hchan %p", hcon, conn, hchan);
7021
7022 switch (hcon->type) {
7023 case LE_LINK:
7024 if (hcon->hdev->le_mtu) {
7025 conn->mtu = hcon->hdev->le_mtu;
7026 break;
7027 }
7028 /* fall through */
7029 default:
7030 conn->mtu = hcon->hdev->acl_mtu;
7031 break;
7032 }
7033
7034 conn->feat_mask = 0;
7035
7036 if (hcon->type == ACL_LINK)
7037 conn->hs_enabled = test_bit(HCI_HS_ENABLED,
7038 &hcon->hdev->dev_flags);
7039
Marcel Holtmann5a54e7c2014-07-13 20:50:15 +02007040 mutex_init(&conn->ident_lock);
Johan Hedberg162b49e2014-01-17 20:45:10 +02007041 mutex_init(&conn->chan_lock);
7042
7043 INIT_LIST_HEAD(&conn->chan_l);
7044 INIT_LIST_HEAD(&conn->users);
7045
7046 if (hcon->type == LE_LINK)
7047 INIT_DELAYED_WORK(&conn->security_timer, security_timeout);
7048 else
7049 INIT_DELAYED_WORK(&conn->info_timer, l2cap_info_timeout);
7050
Johan Hedberg61a939c2014-01-17 20:45:11 +02007051 skb_queue_head_init(&conn->pending_rx);
7052 INIT_WORK(&conn->pending_rx_work, process_pending_rx);
7053
Johan Hedberg162b49e2014-01-17 20:45:10 +02007054 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
7055
7056 return conn;
7057}
7058
7059static bool is_valid_psm(u16 psm, u8 dst_type) {
7060 if (!psm)
7061 return false;
7062
7063 if (bdaddr_type_is_le(dst_type))
7064 return (psm <= 0x00ff);
7065
7066 /* PSM must be odd and lsb of upper byte must be 0 */
7067 return ((psm & 0x0101) == 0x0001);
7068}
7069
7070int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
7071 bdaddr_t *dst, u8 dst_type)
7072{
7073 struct l2cap_conn *conn;
7074 struct hci_conn *hcon;
7075 struct hci_dev *hdev;
Johan Hedberg162b49e2014-01-17 20:45:10 +02007076 int err;
7077
7078 BT_DBG("%pMR -> %pMR (type %u) psm 0x%2.2x", &chan->src, dst,
7079 dst_type, __le16_to_cpu(psm));
7080
7081 hdev = hci_get_route(dst, &chan->src);
7082 if (!hdev)
7083 return -EHOSTUNREACH;
7084
7085 hci_dev_lock(hdev);
7086
7087 l2cap_chan_lock(chan);
7088
7089 if (!is_valid_psm(__le16_to_cpu(psm), dst_type) && !cid &&
7090 chan->chan_type != L2CAP_CHAN_RAW) {
7091 err = -EINVAL;
7092 goto done;
7093 }
7094
Johan Hedberg21626e62014-01-24 10:35:41 +02007095 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED && !psm) {
7096 err = -EINVAL;
7097 goto done;
7098 }
7099
7100 if (chan->chan_type == L2CAP_CHAN_FIXED && !cid) {
Johan Hedberg162b49e2014-01-17 20:45:10 +02007101 err = -EINVAL;
7102 goto done;
7103 }
7104
7105 switch (chan->mode) {
7106 case L2CAP_MODE_BASIC:
7107 break;
7108 case L2CAP_MODE_LE_FLOWCTL:
7109 l2cap_le_flowctl_init(chan);
7110 break;
7111 case L2CAP_MODE_ERTM:
7112 case L2CAP_MODE_STREAMING:
7113 if (!disable_ertm)
7114 break;
7115 /* fall through */
7116 default:
Johan Hedbergbeb19e42014-07-18 11:15:26 +03007117 err = -EOPNOTSUPP;
Johan Hedberg162b49e2014-01-17 20:45:10 +02007118 goto done;
7119 }
7120
7121 switch (chan->state) {
7122 case BT_CONNECT:
7123 case BT_CONNECT2:
7124 case BT_CONFIG:
7125 /* Already connecting */
7126 err = 0;
7127 goto done;
7128
7129 case BT_CONNECTED:
7130 /* Already connected */
7131 err = -EISCONN;
7132 goto done;
7133
7134 case BT_OPEN:
7135 case BT_BOUND:
7136 /* Can connect */
7137 break;
7138
7139 default:
7140 err = -EBADFD;
7141 goto done;
7142 }
7143
7144 /* Set destination address and psm */
7145 bacpy(&chan->dst, dst);
7146 chan->dst_type = dst_type;
7147
7148 chan->psm = psm;
7149 chan->dcid = cid;
7150
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007151 if (bdaddr_type_is_le(dst_type)) {
Johan Hedberge804d252014-07-16 11:42:28 +03007152 u8 role;
Johan Hedbergcdd62752014-07-07 15:02:28 +03007153
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007154 /* Convert from L2CAP channel address type to HCI address type
7155 */
7156 if (dst_type == BDADDR_LE_PUBLIC)
7157 dst_type = ADDR_LE_DEV_PUBLIC;
7158 else
7159 dst_type = ADDR_LE_DEV_RANDOM;
7160
Johan Hedberge804d252014-07-16 11:42:28 +03007161 if (test_bit(HCI_ADVERTISING, &hdev->dev_flags))
7162 role = HCI_ROLE_SLAVE;
7163 else
7164 role = HCI_ROLE_MASTER;
Johan Hedbergcdd62752014-07-07 15:02:28 +03007165
Andre Guedes04a6c582014-02-26 20:21:44 -03007166 hcon = hci_connect_le(hdev, dst, dst_type, chan->sec_level,
Johan Hedberge804d252014-07-16 11:42:28 +03007167 HCI_LE_CONN_TIMEOUT, role);
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007168 } else {
Johan Hedbergd93375a2014-07-07 15:02:27 +03007169 u8 auth_type = l2cap_get_auth_type(chan);
Andre Guedes04a6c582014-02-26 20:21:44 -03007170 hcon = hci_connect_acl(hdev, dst, chan->sec_level, auth_type);
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007171 }
Johan Hedberg162b49e2014-01-17 20:45:10 +02007172
7173 if (IS_ERR(hcon)) {
7174 err = PTR_ERR(hcon);
7175 goto done;
7176 }
7177
7178 conn = l2cap_conn_add(hcon);
7179 if (!conn) {
7180 hci_conn_drop(hcon);
7181 err = -ENOMEM;
7182 goto done;
7183 }
7184
7185 if (cid && __l2cap_get_chan_by_dcid(conn, cid)) {
7186 hci_conn_drop(hcon);
7187 err = -EBUSY;
7188 goto done;
7189 }
7190
7191 /* Update source addr of the socket */
7192 bacpy(&chan->src, &hcon->src);
7193 chan->src_type = bdaddr_type(hcon, hcon->src_type);
7194
7195 l2cap_chan_unlock(chan);
7196 l2cap_chan_add(conn, chan);
7197 l2cap_chan_lock(chan);
7198
7199 /* l2cap_chan_add takes its own ref so we can drop this one */
7200 hci_conn_drop(hcon);
7201
7202 l2cap_state_change(chan, BT_CONNECT);
7203 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
7204
Johan Hedberg61202e42014-01-28 15:16:48 -08007205 /* Release chan->sport so that it can be reused by other
7206 * sockets (as it's only used for listening sockets).
7207 */
7208 write_lock(&chan_list_lock);
7209 chan->sport = 0;
7210 write_unlock(&chan_list_lock);
7211
Johan Hedberg162b49e2014-01-17 20:45:10 +02007212 if (hcon->state == BT_CONNECTED) {
7213 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
7214 __clear_chan_timer(chan);
Johan Hedberge7cafc42014-07-17 15:35:38 +03007215 if (l2cap_chan_check_security(chan, true))
Johan Hedberg162b49e2014-01-17 20:45:10 +02007216 l2cap_state_change(chan, BT_CONNECTED);
7217 } else
7218 l2cap_do_start(chan);
7219 }
7220
7221 err = 0;
7222
7223done:
7224 l2cap_chan_unlock(chan);
7225 hci_dev_unlock(hdev);
7226 hci_dev_put(hdev);
7227 return err;
7228}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +03007229EXPORT_SYMBOL_GPL(l2cap_chan_connect);
Johan Hedberg162b49e2014-01-17 20:45:10 +02007230
Linus Torvalds1da177e2005-04-16 15:20:36 -07007231/* ---- L2CAP interface with lower layer (HCI) ---- */
7232
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007233int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007234{
7235 int exact = 0, lm1 = 0, lm2 = 0;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007236 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007237
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03007238 BT_DBG("hdev %s, bdaddr %pMR", hdev->name, bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007239
7240 /* Find listening sockets and check their link_mode */
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007241 read_lock(&chan_list_lock);
7242 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03007243 if (c->state != BT_LISTEN)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007244 continue;
7245
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007246 if (!bacmp(&c->src, &hdev->bdaddr)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007247 lm1 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03007248 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007249 lm1 |= HCI_LM_MASTER;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007250 exact++;
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007251 } else if (!bacmp(&c->src, BDADDR_ANY)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007252 lm2 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03007253 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007254 lm2 |= HCI_LM_MASTER;
7255 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007256 }
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007257 read_unlock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007258
7259 return exact ? lm1 : lm2;
7260}
7261
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03007262void l2cap_connect_cfm(struct hci_conn *hcon, u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007263{
Marcel Holtmann01394182006-07-03 10:02:46 +02007264 struct l2cap_conn *conn;
7265
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03007266 BT_DBG("hcon %p bdaddr %pMR status %d", hcon, &hcon->dst, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007267
Linus Torvalds1da177e2005-04-16 15:20:36 -07007268 if (!status) {
Claudio Takahasibaf43252013-04-11 13:55:50 -03007269 conn = l2cap_conn_add(hcon);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007270 if (conn)
7271 l2cap_conn_ready(conn);
Andrei Emeltchenkoba6fc312012-10-31 15:46:26 +02007272 } else {
Joe Perchese1750722011-06-29 18:18:29 -07007273 l2cap_conn_del(hcon, bt_to_errno(status));
Andrei Emeltchenkoba6fc312012-10-31 15:46:26 +02007274 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007275}
7276
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007277int l2cap_disconn_ind(struct hci_conn *hcon)
Marcel Holtmann2950f212009-02-12 14:02:50 +01007278{
7279 struct l2cap_conn *conn = hcon->l2cap_data;
7280
7281 BT_DBG("hcon %p", hcon);
7282
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007283 if (!conn)
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02007284 return HCI_ERROR_REMOTE_USER_TERM;
Marcel Holtmann2950f212009-02-12 14:02:50 +01007285 return conn->disc_reason;
7286}
7287
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03007288void l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007289{
7290 BT_DBG("hcon %p reason %d", hcon, reason);
7291
Joe Perchese1750722011-06-29 18:18:29 -07007292 l2cap_conn_del(hcon, bt_to_errno(reason));
Linus Torvalds1da177e2005-04-16 15:20:36 -07007293}
7294
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007295static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt)
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007296{
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03007297 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED)
Marcel Holtmann255c7602009-02-04 21:07:19 +01007298 return;
7299
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007300 if (encrypt == 0x00) {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007301 if (chan->sec_level == BT_SECURITY_MEDIUM) {
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007302 __set_chan_timer(chan, L2CAP_ENC_TIMEOUT);
Marcel Holtmann7d513e92014-01-15 22:37:40 -08007303 } else if (chan->sec_level == BT_SECURITY_HIGH ||
7304 chan->sec_level == BT_SECURITY_FIPS)
Gustavo F. Padovan0f852722011-05-04 19:42:50 -03007305 l2cap_chan_close(chan, ECONNREFUSED);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007306 } else {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007307 if (chan->sec_level == BT_SECURITY_MEDIUM)
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -03007308 __clear_chan_timer(chan);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007309 }
7310}
7311
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007312int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007313{
Marcel Holtmann40be4922008-07-14 20:13:50 +02007314 struct l2cap_conn *conn = hcon->l2cap_data;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03007315 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007316
Marcel Holtmann01394182006-07-03 10:02:46 +02007317 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007318 return 0;
Marcel Holtmann01394182006-07-03 10:02:46 +02007319
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03007320 BT_DBG("conn %p status 0x%2.2x encrypt %u", conn, status, encrypt);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007321
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03007322 if (hcon->type == LE_LINK) {
Hemant Gupta35d4adcc2012-04-18 14:46:26 +05307323 if (!status && encrypt)
Johan Hedberg4bd6d382014-02-26 23:33:45 +02007324 smp_distribute_keys(conn);
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02007325 cancel_delayed_work(&conn->security_timer);
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03007326 }
7327
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007328 mutex_lock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007329
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007330 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007331 l2cap_chan_lock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007332
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03007333 BT_DBG("chan %p scid 0x%4.4x state %s", chan, chan->scid,
7334 state_to_string(chan->state));
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007335
Johan Hedberg2338a7e2014-01-24 10:35:40 +02007336 if (chan->scid == L2CAP_CID_A2MP) {
Andrei Emeltchenko78eb2f92012-07-19 17:03:47 +03007337 l2cap_chan_unlock(chan);
7338 continue;
7339 }
7340
Johan Hedberg073d1cf2013-04-29 19:35:35 +03007341 if (chan->scid == L2CAP_CID_ATT) {
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007342 if (!status && encrypt) {
7343 chan->sec_level = hcon->sec_level;
Andrei Emeltchenkocf4cd002012-02-06 15:03:59 +02007344 l2cap_chan_ready(chan);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007345 }
7346
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007347 l2cap_chan_unlock(chan);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007348 continue;
7349 }
7350
Andrei Emeltchenko96eff462012-11-15 18:14:53 +02007351 if (!__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007352 l2cap_chan_unlock(chan);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01007353 continue;
7354 }
7355
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03007356 if (!status && (chan->state == BT_CONNECTED ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01007357 chan->state == BT_CONFIG)) {
Marcel Holtmannd97c8992013-10-14 02:53:54 -07007358 chan->ops->resume(chan);
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007359 l2cap_check_encryption(chan, encrypt);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007360 l2cap_chan_unlock(chan);
Marcel Holtmann9719f8a2008-07-14 20:13:45 +02007361 continue;
7362 }
7363
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03007364 if (chan->state == BT_CONNECT) {
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007365 if (!status)
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03007366 l2cap_start_connection(chan);
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007367 else
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007368 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03007369 } else if (chan->state == BT_CONNECT2) {
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007370 struct l2cap_conn_rsp rsp;
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007371 __u16 res, stat;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007372
7373 if (!status) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07007374 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007375 res = L2CAP_CR_PEND;
7376 stat = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08007377 chan->ops->defer(chan);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007378 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007379 l2cap_state_change(chan, BT_CONFIG);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007380 res = L2CAP_CR_SUCCESS;
7381 stat = L2CAP_CS_NO_INFO;
7382 }
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007383 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007384 l2cap_state_change(chan, BT_DISCONN);
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007385 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007386 res = L2CAP_CR_SEC_BLOCK;
7387 stat = L2CAP_CS_NO_INFO;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007388 }
7389
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03007390 rsp.scid = cpu_to_le16(chan->dcid);
7391 rsp.dcid = cpu_to_le16(chan->scid);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007392 rsp.result = cpu_to_le16(res);
7393 rsp.status = cpu_to_le16(stat);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03007394 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01007395 sizeof(rsp), &rsp);
Mat Martineau2d369352012-05-23 14:59:30 -07007396
7397 if (!test_bit(CONF_REQ_SENT, &chan->conf_state) &&
7398 res == L2CAP_CR_SUCCESS) {
7399 char buf[128];
7400 set_bit(CONF_REQ_SENT, &chan->conf_state);
7401 l2cap_send_cmd(conn, l2cap_get_ident(conn),
7402 L2CAP_CONF_REQ,
7403 l2cap_build_conf_req(chan, buf),
7404 buf);
7405 chan->num_conf_req++;
7406 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007407 }
7408
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007409 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007410 }
7411
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007412 mutex_unlock(&conn->chan_lock);
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007413
Linus Torvalds1da177e2005-04-16 15:20:36 -07007414 return 0;
7415}
7416
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007417int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007418{
7419 struct l2cap_conn *conn = hcon->l2cap_data;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007420 struct l2cap_hdr *hdr;
7421 int len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007422
Andrei Emeltchenko1d13a252012-10-15 11:58:41 +03007423 /* For AMP controller do not create l2cap conn */
7424 if (!conn && hcon->hdev->dev_type != HCI_BREDR)
7425 goto drop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007426
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007427 if (!conn)
Claudio Takahasibaf43252013-04-11 13:55:50 -03007428 conn = l2cap_conn_add(hcon);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007429
7430 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007431 goto drop;
7432
7433 BT_DBG("conn %p len %d flags 0x%x", conn, skb->len, flags);
7434
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007435 switch (flags) {
7436 case ACL_START:
7437 case ACL_START_NO_FLUSH:
7438 case ACL_COMPLETE:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007439 if (conn->rx_len) {
7440 BT_ERR("Unexpected start frame (len %d)", skb->len);
7441 kfree_skb(conn->rx_skb);
7442 conn->rx_skb = NULL;
7443 conn->rx_len = 0;
7444 l2cap_conn_unreliable(conn, ECOMM);
7445 }
7446
Andrei Emeltchenkoaae7fe22010-09-15 14:28:43 +03007447 /* Start fragment always begin with Basic L2CAP header */
7448 if (skb->len < L2CAP_HDR_SIZE) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07007449 BT_ERR("Frame is too short (len %d)", skb->len);
7450 l2cap_conn_unreliable(conn, ECOMM);
7451 goto drop;
7452 }
7453
7454 hdr = (struct l2cap_hdr *) skb->data;
7455 len = __le16_to_cpu(hdr->len) + L2CAP_HDR_SIZE;
7456
7457 if (len == skb->len) {
7458 /* Complete frame received */
7459 l2cap_recv_frame(conn, skb);
7460 return 0;
7461 }
7462
7463 BT_DBG("Start: total len %d, frag len %d", len, skb->len);
7464
7465 if (skb->len > len) {
7466 BT_ERR("Frame is too long (len %d, expected len %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007467 skb->len, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007468 l2cap_conn_unreliable(conn, ECOMM);
7469 goto drop;
7470 }
7471
7472 /* Allocate skb for the complete frame (with header) */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03007473 conn->rx_skb = bt_skb_alloc(len, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03007474 if (!conn->rx_skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007475 goto drop;
7476
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007477 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007478 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007479 conn->rx_len = len - skb->len;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007480 break;
7481
7482 case ACL_CONT:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007483 BT_DBG("Cont: frag len %d (expecting %d)", skb->len, conn->rx_len);
7484
7485 if (!conn->rx_len) {
7486 BT_ERR("Unexpected continuation frame (len %d)", skb->len);
7487 l2cap_conn_unreliable(conn, ECOMM);
7488 goto drop;
7489 }
7490
7491 if (skb->len > conn->rx_len) {
7492 BT_ERR("Fragment is too long (len %d, expected %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007493 skb->len, conn->rx_len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007494 kfree_skb(conn->rx_skb);
7495 conn->rx_skb = NULL;
7496 conn->rx_len = 0;
7497 l2cap_conn_unreliable(conn, ECOMM);
7498 goto drop;
7499 }
7500
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007501 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007502 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007503 conn->rx_len -= skb->len;
7504
7505 if (!conn->rx_len) {
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007506 /* Complete frame received. l2cap_recv_frame
7507 * takes ownership of the skb so set the global
7508 * rx_skb pointer to NULL first.
7509 */
7510 struct sk_buff *rx_skb = conn->rx_skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007511 conn->rx_skb = NULL;
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007512 l2cap_recv_frame(conn, rx_skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007513 }
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007514 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007515 }
7516
7517drop:
7518 kfree_skb(skb);
7519 return 0;
7520}
7521
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007522static int l2cap_debugfs_show(struct seq_file *f, void *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007523{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007524 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007525
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007526 read_lock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007527
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007528 list_for_each_entry(c, &chan_list, global_l) {
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03007529 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 -07007530 &c->src, &c->dst,
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03007531 c->state, __le16_to_cpu(c->psm),
7532 c->scid, c->dcid, c->imtu, c->omtu,
7533 c->sec_level, c->mode);
Andrei Emeltchenko61e1b4b2012-01-19 11:19:50 +02007534 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007535
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007536 read_unlock(&chan_list_lock);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007537
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007538 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007539}
7540
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007541static int l2cap_debugfs_open(struct inode *inode, struct file *file)
7542{
7543 return single_open(file, l2cap_debugfs_show, inode->i_private);
7544}
7545
7546static const struct file_operations l2cap_debugfs_fops = {
7547 .open = l2cap_debugfs_open,
7548 .read = seq_read,
7549 .llseek = seq_lseek,
7550 .release = single_release,
7551};
7552
7553static struct dentry *l2cap_debugfs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007554
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007555int __init l2cap_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007556{
7557 int err;
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007558
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007559 err = l2cap_init_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007560 if (err < 0)
7561 return err;
7562
Marcel Holtmann1120e4b2013-10-17 17:24:16 -07007563 if (IS_ERR_OR_NULL(bt_debugfs))
7564 return 0;
7565
7566 l2cap_debugfs = debugfs_create_file("l2cap", 0444, bt_debugfs,
7567 NULL, &l2cap_debugfs_fops);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007568
Samuel Ortiz40b93972014-05-14 17:53:35 +02007569 debugfs_create_u16("l2cap_le_max_credits", 0644, bt_debugfs,
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02007570 &le_max_credits);
Samuel Ortiz40b93972014-05-14 17:53:35 +02007571 debugfs_create_u16("l2cap_le_default_mps", 0644, bt_debugfs,
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02007572 &le_default_mps);
7573
Linus Torvalds1da177e2005-04-16 15:20:36 -07007574 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007575}
7576
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007577void l2cap_exit(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007578{
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007579 debugfs_remove(l2cap_debugfs);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007580 l2cap_cleanup_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007581}
7582
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03007583module_param(disable_ertm, bool, 0644);
7584MODULE_PARM_DESC(disable_ertm, "Disable enhanced retransmission mode");