blob: a6559225bb500025509f5fd1d557b72ac0cefdf0 [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
Johan Hedberg14824302014-08-07 22:56:50 +0300213 /* Override the defaults (which are for conn-oriented) */
214 chan->omtu = L2CAP_DEFAULT_MTU;
215 chan->chan_type = L2CAP_CHAN_FIXED;
216
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300217 chan->scid = scid;
218
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200219 write_unlock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300220
221 return 0;
222}
223
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300224static u16 l2cap_alloc_cid(struct l2cap_conn *conn)
Marcel Holtmann01394182006-07-03 10:02:46 +0200225{
Johan Hedberge77af752013-10-08 10:31:00 +0200226 u16 cid, dyn_end;
Marcel Holtmann01394182006-07-03 10:02:46 +0200227
Johan Hedberge77af752013-10-08 10:31:00 +0200228 if (conn->hcon->type == LE_LINK)
229 dyn_end = L2CAP_CID_LE_DYN_END;
230 else
231 dyn_end = L2CAP_CID_DYN_END;
232
233 for (cid = L2CAP_CID_DYN_START; cid < dyn_end; cid++) {
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300234 if (!__l2cap_get_chan_by_scid(conn, cid))
Marcel Holtmann01394182006-07-03 10:02:46 +0200235 return cid;
236 }
237
238 return 0;
239}
240
Gustavo Padovanf93fa272013-10-21 14:21:40 -0200241static void l2cap_state_change(struct l2cap_chan *chan, int state)
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300242{
Andrei Emeltchenko42d2d872012-02-17 11:40:57 +0200243 BT_DBG("chan %p %s -> %s", chan, state_to_string(chan->state),
Gustavo Padovan2d792812012-10-06 10:07:01 +0100244 state_to_string(state));
Gustavo F. Padovanbadaaa02011-11-23 20:11:46 -0200245
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300246 chan->state = state;
Gustavo Padovan53f52122013-10-15 19:24:45 -0300247 chan->ops->state_change(chan, state, 0);
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300248}
249
Gustavo Padovanf8e73012013-10-15 19:24:46 -0300250static inline void l2cap_state_change_and_error(struct l2cap_chan *chan,
251 int state, int err)
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +0200252{
Gustavo Padovanf8e73012013-10-15 19:24:46 -0300253 chan->state = state;
Gustavo Padovan53f52122013-10-15 19:24:45 -0300254 chan->ops->state_change(chan, chan->state, err);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +0200255}
256
257static inline void l2cap_chan_set_err(struct l2cap_chan *chan, int err)
258{
Gustavo Padovanf8e73012013-10-15 19:24:46 -0300259 chan->ops->state_change(chan, chan->state, err);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +0200260}
261
Mat Martineau4239d162012-05-17 20:53:49 -0700262static void __set_retrans_timer(struct l2cap_chan *chan)
263{
264 if (!delayed_work_pending(&chan->monitor_timer) &&
265 chan->retrans_timeout) {
266 l2cap_set_timer(chan, &chan->retrans_timer,
267 msecs_to_jiffies(chan->retrans_timeout));
268 }
269}
270
271static void __set_monitor_timer(struct l2cap_chan *chan)
272{
273 __clear_retrans_timer(chan);
274 if (chan->monitor_timeout) {
275 l2cap_set_timer(chan, &chan->monitor_timer,
276 msecs_to_jiffies(chan->monitor_timeout));
277 }
278}
279
Mat Martineau608bcc62012-05-17 20:53:32 -0700280static struct sk_buff *l2cap_ertm_seq_in_queue(struct sk_buff_head *head,
281 u16 seq)
282{
283 struct sk_buff *skb;
284
285 skb_queue_walk(head, skb) {
286 if (bt_cb(skb)->control.txseq == seq)
287 return skb;
288 }
289
290 return NULL;
291}
292
Mat Martineau3c588192012-04-11 10:48:42 -0700293/* ---- L2CAP sequence number lists ---- */
294
295/* For ERTM, ordered lists of sequence numbers must be tracked for
296 * SREJ requests that are received and for frames that are to be
297 * retransmitted. These seq_list functions implement a singly-linked
298 * list in an array, where membership in the list can also be checked
299 * in constant time. Items can also be added to the tail of the list
300 * and removed from the head in constant time, without further memory
301 * allocs or frees.
302 */
303
304static int l2cap_seq_list_init(struct l2cap_seq_list *seq_list, u16 size)
305{
306 size_t alloc_size, i;
307
308 /* Allocated size is a power of 2 to map sequence numbers
309 * (which may be up to 14 bits) in to a smaller array that is
310 * sized for the negotiated ERTM transmit windows.
311 */
312 alloc_size = roundup_pow_of_two(size);
313
314 seq_list->list = kmalloc(sizeof(u16) * alloc_size, GFP_KERNEL);
315 if (!seq_list->list)
316 return -ENOMEM;
317
318 seq_list->mask = alloc_size - 1;
319 seq_list->head = L2CAP_SEQ_LIST_CLEAR;
320 seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
321 for (i = 0; i < alloc_size; i++)
322 seq_list->list[i] = L2CAP_SEQ_LIST_CLEAR;
323
324 return 0;
325}
326
327static inline void l2cap_seq_list_free(struct l2cap_seq_list *seq_list)
328{
329 kfree(seq_list->list);
330}
331
332static inline bool l2cap_seq_list_contains(struct l2cap_seq_list *seq_list,
333 u16 seq)
334{
335 /* Constant-time check for list membership */
336 return seq_list->list[seq & seq_list->mask] != L2CAP_SEQ_LIST_CLEAR;
337}
338
Mat Martineau3c588192012-04-11 10:48:42 -0700339static inline u16 l2cap_seq_list_pop(struct l2cap_seq_list *seq_list)
340{
Johan Hedberg03a0c5d2014-01-18 21:32:59 +0200341 u16 seq = seq_list->head;
342 u16 mask = seq_list->mask;
343
344 seq_list->head = seq_list->list[seq & mask];
345 seq_list->list[seq & mask] = L2CAP_SEQ_LIST_CLEAR;
346
347 if (seq_list->head == L2CAP_SEQ_LIST_TAIL) {
348 seq_list->head = L2CAP_SEQ_LIST_CLEAR;
349 seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
350 }
351
352 return seq;
Mat Martineau3c588192012-04-11 10:48:42 -0700353}
354
355static void l2cap_seq_list_clear(struct l2cap_seq_list *seq_list)
356{
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300357 u16 i;
Mat Martineau3c588192012-04-11 10:48:42 -0700358
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300359 if (seq_list->head == L2CAP_SEQ_LIST_CLEAR)
360 return;
361
362 for (i = 0; i <= seq_list->mask; i++)
363 seq_list->list[i] = L2CAP_SEQ_LIST_CLEAR;
364
365 seq_list->head = L2CAP_SEQ_LIST_CLEAR;
366 seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
Mat Martineau3c588192012-04-11 10:48:42 -0700367}
368
369static void l2cap_seq_list_append(struct l2cap_seq_list *seq_list, u16 seq)
370{
371 u16 mask = seq_list->mask;
372
373 /* All appends happen in constant time */
374
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300375 if (seq_list->list[seq & mask] != L2CAP_SEQ_LIST_CLEAR)
376 return;
Mat Martineau3c588192012-04-11 10:48:42 -0700377
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300378 if (seq_list->tail == L2CAP_SEQ_LIST_CLEAR)
379 seq_list->head = seq;
380 else
381 seq_list->list[seq_list->tail & mask] = seq;
382
383 seq_list->tail = seq;
384 seq_list->list[seq & mask] = L2CAP_SEQ_LIST_TAIL;
Mat Martineau3c588192012-04-11 10:48:42 -0700385}
386
Gustavo F. Padovan721c4182011-06-23 19:29:58 -0300387static void l2cap_chan_timeout(struct work_struct *work)
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300388{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -0300389 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100390 chan_timer.work);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200391 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300392 int reason;
393
Andrei Emeltchenkoe05dcc32012-02-17 11:40:56 +0200394 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300395
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200396 mutex_lock(&conn->chan_lock);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200397 l2cap_chan_lock(chan);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300398
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300399 if (chan->state == BT_CONNECTED || chan->state == BT_CONFIG)
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300400 reason = ECONNREFUSED;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300401 else if (chan->state == BT_CONNECT &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100402 chan->sec_level != BT_SECURITY_SDP)
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300403 reason = ECONNREFUSED;
404 else
405 reason = ETIMEDOUT;
406
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300407 l2cap_chan_close(chan, reason);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300408
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200409 l2cap_chan_unlock(chan);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300410
Gustavo Padovan80b98022012-05-27 22:27:51 -0300411 chan->ops->close(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200412 mutex_unlock(&conn->chan_lock);
413
Ulisses Furquim371fd832011-12-21 20:02:36 -0200414 l2cap_chan_put(chan);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300415}
416
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -0300417struct l2cap_chan *l2cap_chan_create(void)
Marcel Holtmann01394182006-07-03 10:02:46 +0200418{
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300419 struct l2cap_chan *chan;
Marcel Holtmann01394182006-07-03 10:02:46 +0200420
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300421 chan = kzalloc(sizeof(*chan), GFP_ATOMIC);
422 if (!chan)
423 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200424
Andrei Emeltchenkoc03b3552012-02-21 12:54:56 +0200425 mutex_init(&chan->lock);
426
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200427 write_lock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300428 list_add(&chan->global_l, &chan_list);
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200429 write_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300430
Gustavo F. Padovan721c4182011-06-23 19:29:58 -0300431 INIT_DELAYED_WORK(&chan->chan_timer, l2cap_chan_timeout);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300432
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300433 chan->state = BT_OPEN;
434
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530435 kref_init(&chan->kref);
Gustavo F. Padovan71ba0e52011-05-17 14:34:52 -0300436
Mat Martineau28270112012-05-17 21:14:09 -0700437 /* This flag is cleared in l2cap_chan_ready() */
438 set_bit(CONF_NOT_COMPLETE, &chan->conf_state);
439
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -0300440 BT_DBG("chan %p", chan);
Szymon Jancabc545b2011-11-03 16:05:44 +0100441
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300442 return chan;
Marcel Holtmann01394182006-07-03 10:02:46 +0200443}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300444EXPORT_SYMBOL_GPL(l2cap_chan_create);
Marcel Holtmann01394182006-07-03 10:02:46 +0200445
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530446static void l2cap_chan_destroy(struct kref *kref)
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300447{
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530448 struct l2cap_chan *chan = container_of(kref, struct l2cap_chan, kref);
449
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +0530450 BT_DBG("chan %p", chan);
451
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200452 write_lock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300453 list_del(&chan->global_l);
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200454 write_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300455
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +0530456 kfree(chan);
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300457}
458
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530459void l2cap_chan_hold(struct l2cap_chan *c)
460{
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530461 BT_DBG("chan %p orig refcnt %d", c, atomic_read(&c->kref.refcount));
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530462
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530463 kref_get(&c->kref);
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530464}
465
466void l2cap_chan_put(struct l2cap_chan *c)
467{
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530468 BT_DBG("chan %p orig refcnt %d", c, atomic_read(&c->kref.refcount));
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530469
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530470 kref_put(&c->kref, l2cap_chan_destroy);
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530471}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300472EXPORT_SYMBOL_GPL(l2cap_chan_put);
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530473
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300474void l2cap_chan_set_defaults(struct l2cap_chan *chan)
475{
476 chan->fcs = L2CAP_FCS_CRC16;
477 chan->max_tx = L2CAP_DEFAULT_MAX_TX;
478 chan->tx_win = L2CAP_DEFAULT_TX_WINDOW;
479 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
Jukka Rissanen6a5e8162014-05-28 14:43:04 +0300480 chan->remote_max_tx = chan->max_tx;
481 chan->remote_tx_win = chan->tx_win;
Mat Martineauc20f8e32012-07-10 05:47:07 -0700482 chan->ack_win = L2CAP_DEFAULT_TX_WINDOW;
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300483 chan->sec_level = BT_SECURITY_LOW;
Jukka Rissanen6a5e8162014-05-28 14:43:04 +0300484 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
485 chan->retrans_timeout = L2CAP_DEFAULT_RETRANS_TO;
486 chan->monitor_timeout = L2CAP_DEFAULT_MONITOR_TO;
487 chan->conf_state = 0;
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300488
489 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
490}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300491EXPORT_SYMBOL_GPL(l2cap_chan_set_defaults);
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300492
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200493static void l2cap_le_flowctl_init(struct l2cap_chan *chan)
Johan Hedberg38319712013-05-17 12:49:23 +0300494{
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200495 chan->sdu = NULL;
496 chan->sdu_last_frag = NULL;
497 chan->sdu_len = 0;
Johan Hedberg0cd75f72013-05-17 13:09:05 +0300498 chan->tx_credits = 0;
Johan Hedbergf15b8ec2013-12-03 15:08:25 +0200499 chan->rx_credits = le_max_credits;
Johan Hedbergd1d79412014-01-27 15:11:33 -0800500 chan->mps = min_t(u16, chan->imtu, le_default_mps);
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200501
502 skb_queue_head_init(&chan->tx_q);
Johan Hedberg38319712013-05-17 12:49:23 +0300503}
504
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +0300505void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
Marcel Holtmann01394182006-07-03 10:02:46 +0200506{
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -0300507 BT_DBG("conn %p, psm 0x%2.2x, dcid 0x%4.4x", conn,
Andrei Emeltchenko097db762012-03-09 14:16:17 +0200508 __le16_to_cpu(chan->psm), chan->dcid);
Marcel Holtmann01394182006-07-03 10:02:46 +0200509
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +0200510 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
Marcel Holtmann2950f212009-02-12 14:02:50 +0100511
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300512 chan->conn = conn;
Marcel Holtmann01394182006-07-03 10:02:46 +0200513
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200514 switch (chan->chan_type) {
515 case L2CAP_CHAN_CONN_ORIENTED:
Johan Hedberg21626e62014-01-24 10:35:41 +0200516 /* Alloc CID for connection-oriented socket */
517 chan->scid = l2cap_alloc_cid(conn);
518 if (conn->hcon->type == ACL_LINK)
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300519 chan->omtu = L2CAP_DEFAULT_MTU;
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200520 break;
521
522 case L2CAP_CHAN_CONN_LESS:
Marcel Holtmann01394182006-07-03 10:02:46 +0200523 /* Connectionless socket */
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300524 chan->scid = L2CAP_CID_CONN_LESS;
525 chan->dcid = L2CAP_CID_CONN_LESS;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300526 chan->omtu = L2CAP_DEFAULT_MTU;
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200527 break;
528
Johan Hedberg2338a7e2014-01-24 10:35:40 +0200529 case L2CAP_CHAN_FIXED:
530 /* Caller will set CID and CID specific MTU values */
Andrei Emeltchenko416fa752012-05-29 13:59:16 +0300531 break;
532
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200533 default:
Marcel Holtmann01394182006-07-03 10:02:46 +0200534 /* Raw socket can send/recv signalling messages only */
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300535 chan->scid = L2CAP_CID_SIGNALING;
536 chan->dcid = L2CAP_CID_SIGNALING;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300537 chan->omtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann01394182006-07-03 10:02:46 +0200538 }
539
Andrei Emeltchenko8f7975b2011-10-13 16:18:54 +0300540 chan->local_id = L2CAP_BESTEFFORT_ID;
541 chan->local_stype = L2CAP_SERV_BESTEFFORT;
542 chan->local_msdu = L2CAP_DEFAULT_MAX_SDU_SIZE;
543 chan->local_sdu_itime = L2CAP_DEFAULT_SDU_ITIME;
544 chan->local_acc_lat = L2CAP_DEFAULT_ACC_LAT;
Andrei Emeltchenko8936fa62012-10-08 11:14:41 +0300545 chan->local_flush_to = L2CAP_EFS_DEFAULT_FLUSH_TO;
Andrei Emeltchenko8f7975b2011-10-13 16:18:54 +0300546
Ulisses Furquim371fd832011-12-21 20:02:36 -0200547 l2cap_chan_hold(chan);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300548
Johan Hedbergc16900c2014-08-15 21:17:06 +0300549 /* Only keep a reference for fixed channels if they requested it */
550 if (chan->chan_type != L2CAP_CHAN_FIXED ||
551 test_bit(FLAG_HOLD_HCI_CONN, &chan->flags))
552 hci_conn_hold(conn->hcon);
Johan Hedberg5ee98912013-04-29 19:35:43 +0300553
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200554 list_add(&chan->list, &conn->chan_l);
Andrei Emeltchenko643162a2012-02-22 17:11:55 +0200555}
556
Andrei Emeltchenko466f8002012-05-29 13:59:01 +0300557void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
Andrei Emeltchenko643162a2012-02-22 17:11:55 +0200558{
559 mutex_lock(&conn->chan_lock);
560 __l2cap_chan_add(conn, chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200561 mutex_unlock(&conn->chan_lock);
Marcel Holtmann01394182006-07-03 10:02:46 +0200562}
563
Andrei Emeltchenko466f8002012-05-29 13:59:01 +0300564void l2cap_chan_del(struct l2cap_chan *chan, int err)
Marcel Holtmann01394182006-07-03 10:02:46 +0200565{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300566 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann01394182006-07-03 10:02:46 +0200567
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -0300568 __clear_chan_timer(chan);
Marcel Holtmann01394182006-07-03 10:02:46 +0200569
Gustavo F. Padovan49208c92011-04-04 15:59:54 -0300570 BT_DBG("chan %p, conn %p, err %d", chan, conn, err);
Marcel Holtmann01394182006-07-03 10:02:46 +0200571
Johan Hedberg72847ce2014-08-08 09:28:03 +0300572 chan->ops->teardown(chan, err);
573
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900574 if (conn) {
Andrei Emeltchenko56f60982012-10-15 11:58:44 +0300575 struct amp_mgr *mgr = conn->hcon->amp_mgr;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300576 /* Delete from channel list */
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200577 list_del(&chan->list);
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -0200578
Ulisses Furquim371fd832011-12-21 20:02:36 -0200579 l2cap_chan_put(chan);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300580
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300581 chan->conn = NULL;
Andrei Emeltchenko3cabbfd2012-05-31 11:01:37 +0300582
Johan Hedbergc16900c2014-08-15 21:17:06 +0300583 /* Reference was only held for non-fixed channels or
584 * fixed channels that explicitly requested it using the
585 * FLAG_HOLD_HCI_CONN flag.
586 */
587 if (chan->chan_type != L2CAP_CHAN_FIXED ||
588 test_bit(FLAG_HOLD_HCI_CONN, &chan->flags))
David Herrmann76a68ba2013-04-06 20:28:37 +0200589 hci_conn_drop(conn->hcon);
Andrei Emeltchenko56f60982012-10-15 11:58:44 +0300590
591 if (mgr && mgr->bredr_chan == chan)
592 mgr->bredr_chan = NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200593 }
594
Andrei Emeltchenko419e08c2012-10-31 15:46:34 +0200595 if (chan->hs_hchan) {
596 struct hci_chan *hs_hchan = chan->hs_hchan;
597
598 BT_DBG("chan %p disconnect hs_hchan %p", chan, hs_hchan);
599 amp_disconnect_logical_link(hs_hchan);
600 }
601
Mat Martineau28270112012-05-17 21:14:09 -0700602 if (test_bit(CONF_NOT_COMPLETE, &chan->conf_state))
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300603 return;
Gustavo F. Padovan2ead70b2011-04-01 15:13:36 -0300604
Gustavo Padovanee556f62012-05-18 20:22:38 -0300605 switch(chan->mode) {
606 case L2CAP_MODE_BASIC:
607 break;
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300608
Johan Hedberg38319712013-05-17 12:49:23 +0300609 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedberg177f8f22013-05-31 17:54:51 +0300610 skb_queue_purge(&chan->tx_q);
Johan Hedberg38319712013-05-17 12:49:23 +0300611 break;
612
Gustavo Padovanee556f62012-05-18 20:22:38 -0300613 case L2CAP_MODE_ERTM:
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -0300614 __clear_retrans_timer(chan);
615 __clear_monitor_timer(chan);
616 __clear_ack_timer(chan);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300617
Gustavo F. Padovanf1c67752011-03-25 20:36:10 -0300618 skb_queue_purge(&chan->srej_q);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300619
Mat Martineau3c588192012-04-11 10:48:42 -0700620 l2cap_seq_list_free(&chan->srej_list);
621 l2cap_seq_list_free(&chan->retrans_list);
Gustavo Padovanee556f62012-05-18 20:22:38 -0300622
623 /* fall through */
624
625 case L2CAP_MODE_STREAMING:
626 skb_queue_purge(&chan->tx_q);
627 break;
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300628 }
Gustavo Padovanee556f62012-05-18 20:22:38 -0300629
630 return;
Marcel Holtmann01394182006-07-03 10:02:46 +0200631}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300632EXPORT_SYMBOL_GPL(l2cap_chan_del);
Marcel Holtmann01394182006-07-03 10:02:46 +0200633
Johan Hedberg387a33e2014-02-18 21:41:33 +0200634void l2cap_conn_update_id_addr(struct hci_conn *hcon)
635{
636 struct l2cap_conn *conn = hcon->l2cap_data;
637 struct l2cap_chan *chan;
638
639 mutex_lock(&conn->chan_lock);
640
641 list_for_each_entry(chan, &conn->chan_l, list) {
642 l2cap_chan_lock(chan);
643 bacpy(&chan->dst, &hcon->dst);
644 chan->dst_type = bdaddr_type(hcon, hcon->dst_type);
645 l2cap_chan_unlock(chan);
646 }
647
648 mutex_unlock(&conn->chan_lock);
649}
650
Johan Hedberg27e2d4c2013-05-14 13:27:21 +0300651static void l2cap_chan_le_connect_reject(struct l2cap_chan *chan)
652{
653 struct l2cap_conn *conn = chan->conn;
654 struct l2cap_le_conn_rsp rsp;
655 u16 result;
656
657 if (test_bit(FLAG_DEFER_SETUP, &chan->flags))
658 result = L2CAP_CR_AUTHORIZATION;
659 else
660 result = L2CAP_CR_BAD_PSM;
661
662 l2cap_state_change(chan, BT_DISCONN);
663
664 rsp.dcid = cpu_to_le16(chan->scid);
665 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +0200666 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +0300667 rsp.credits = cpu_to_le16(chan->rx_credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +0300668 rsp.result = cpu_to_le16(result);
669
670 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp),
671 &rsp);
672}
673
Johan Hedberg791d60f2013-05-14 22:24:44 +0300674static void l2cap_chan_connect_reject(struct l2cap_chan *chan)
675{
676 struct l2cap_conn *conn = chan->conn;
677 struct l2cap_conn_rsp rsp;
678 u16 result;
679
680 if (test_bit(FLAG_DEFER_SETUP, &chan->flags))
681 result = L2CAP_CR_SEC_BLOCK;
682 else
683 result = L2CAP_CR_BAD_PSM;
684
685 l2cap_state_change(chan, BT_DISCONN);
686
687 rsp.scid = cpu_to_le16(chan->dcid);
688 rsp.dcid = cpu_to_le16(chan->scid);
689 rsp.result = cpu_to_le16(result);
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700690 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Johan Hedberg791d60f2013-05-14 22:24:44 +0300691
692 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, sizeof(rsp), &rsp);
693}
694
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300695void l2cap_chan_close(struct l2cap_chan *chan, int reason)
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300696{
697 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300698
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700699 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300700
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300701 switch (chan->state) {
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300702 case BT_LISTEN:
Gustavo Padovanb699ec02012-10-06 11:51:54 +0100703 chan->ops->teardown(chan, 0);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300704 break;
705
706 case BT_CONNECTED:
707 case BT_CONFIG:
Johan Hedberg7b25c9b2014-01-28 15:28:04 -0800708 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED) {
Gustavo Padovan8d836d72013-10-15 19:24:47 -0300709 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +0200710 l2cap_send_disconn_req(chan, reason);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300711 } else
712 l2cap_chan_del(chan, reason);
713 break;
714
715 case BT_CONNECT2:
Johan Hedberg791d60f2013-05-14 22:24:44 +0300716 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED) {
717 if (conn->hcon->type == ACL_LINK)
718 l2cap_chan_connect_reject(chan);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +0300719 else if (conn->hcon->type == LE_LINK)
720 l2cap_chan_le_connect_reject(chan);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300721 }
722
723 l2cap_chan_del(chan, reason);
724 break;
725
726 case BT_CONNECT:
727 case BT_DISCONN:
728 l2cap_chan_del(chan, reason);
729 break;
730
731 default:
Gustavo Padovanb699ec02012-10-06 11:51:54 +0100732 chan->ops->teardown(chan, 0);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300733 break;
734 }
735}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300736EXPORT_SYMBOL(l2cap_chan_close);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300737
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300738static inline u8 l2cap_get_auth_type(struct l2cap_chan *chan)
Johan Hedberg8556edd32011-01-19 12:06:50 +0530739{
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700740 switch (chan->chan_type) {
741 case L2CAP_CHAN_RAW:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300742 switch (chan->sec_level) {
Johan Hedberg8556edd32011-01-19 12:06:50 +0530743 case BT_SECURITY_HIGH:
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800744 case BT_SECURITY_FIPS:
Johan Hedberg8556edd32011-01-19 12:06:50 +0530745 return HCI_AT_DEDICATED_BONDING_MITM;
746 case BT_SECURITY_MEDIUM:
747 return HCI_AT_DEDICATED_BONDING;
748 default:
749 return HCI_AT_NO_BONDING;
750 }
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700751 break;
Marcel Holtmann3124b842013-10-12 07:19:32 -0700752 case L2CAP_CHAN_CONN_LESS:
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700753 if (chan->psm == cpu_to_le16(L2CAP_PSM_3DSP)) {
Marcel Holtmann3124b842013-10-12 07:19:32 -0700754 if (chan->sec_level == BT_SECURITY_LOW)
755 chan->sec_level = BT_SECURITY_SDP;
756 }
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800757 if (chan->sec_level == BT_SECURITY_HIGH ||
758 chan->sec_level == BT_SECURITY_FIPS)
Marcel Holtmann3124b842013-10-12 07:19:32 -0700759 return HCI_AT_NO_BONDING_MITM;
760 else
761 return HCI_AT_NO_BONDING;
762 break;
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700763 case L2CAP_CHAN_CONN_ORIENTED:
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700764 if (chan->psm == cpu_to_le16(L2CAP_PSM_SDP)) {
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700765 if (chan->sec_level == BT_SECURITY_LOW)
766 chan->sec_level = BT_SECURITY_SDP;
Johan Hedberg8556edd32011-01-19 12:06:50 +0530767
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800768 if (chan->sec_level == BT_SECURITY_HIGH ||
769 chan->sec_level == BT_SECURITY_FIPS)
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700770 return HCI_AT_NO_BONDING_MITM;
771 else
772 return HCI_AT_NO_BONDING;
773 }
774 /* fall through */
775 default:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300776 switch (chan->sec_level) {
Johan Hedberg8556edd32011-01-19 12:06:50 +0530777 case BT_SECURITY_HIGH:
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800778 case BT_SECURITY_FIPS:
Johan Hedberg8556edd32011-01-19 12:06:50 +0530779 return HCI_AT_GENERAL_BONDING_MITM;
780 case BT_SECURITY_MEDIUM:
781 return HCI_AT_GENERAL_BONDING;
782 default:
783 return HCI_AT_NO_BONDING;
784 }
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700785 break;
Johan Hedberg8556edd32011-01-19 12:06:50 +0530786 }
787}
788
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200789/* Service level security */
Johan Hedberge7cafc42014-07-17 15:35:38 +0300790int l2cap_chan_check_security(struct l2cap_chan *chan, bool initiator)
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200791{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300792 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100793 __u8 auth_type;
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200794
Johan Hedberga17de2f2013-05-14 13:25:37 +0300795 if (conn->hcon->type == LE_LINK)
796 return smp_conn_security(conn->hcon, chan->sec_level);
797
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300798 auth_type = l2cap_get_auth_type(chan);
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100799
Johan Hedberge7cafc42014-07-17 15:35:38 +0300800 return hci_conn_security(conn->hcon, chan->sec_level, auth_type,
801 initiator);
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200802}
803
Johannes Bergb5ad8b72011-06-01 08:54:45 +0200804static u8 l2cap_get_ident(struct l2cap_conn *conn)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200805{
806 u8 id;
807
808 /* Get next available identificator.
809 * 1 - 128 are used by kernel.
810 * 129 - 199 are reserved.
811 * 200 - 254 are used by utilities like l2ping, etc.
812 */
813
Marcel Holtmann5a54e7c2014-07-13 20:50:15 +0200814 mutex_lock(&conn->ident_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200815
816 if (++conn->tx_ident > 128)
817 conn->tx_ident = 1;
818
819 id = conn->tx_ident;
820
Marcel Holtmann5a54e7c2014-07-13 20:50:15 +0200821 mutex_unlock(&conn->ident_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200822
823 return id;
824}
825
Gustavo Padovan2d792812012-10-06 10:07:01 +0100826static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len,
827 void *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200828{
829 struct sk_buff *skb = l2cap_build_cmd(conn, code, ident, len, data);
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +0200830 u8 flags;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200831
832 BT_DBG("code 0x%2.2x", code);
833
834 if (!skb)
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -0300835 return;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200836
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +0200837 if (lmp_no_flush_capable(conn->hcon->hdev))
838 flags = ACL_START_NO_FLUSH;
839 else
840 flags = ACL_START;
841
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700842 bt_cb(skb)->force_active = BT_POWER_FORCE_ACTIVE_ON;
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +0200843 skb->priority = HCI_PRIO_MAX;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700844
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200845 hci_send_acl(conn->hchan, skb, flags);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200846}
847
Mat Martineau02b0fbb2012-10-23 15:24:10 -0700848static bool __chan_is_moving(struct l2cap_chan *chan)
849{
850 return chan->move_state != L2CAP_MOVE_STABLE &&
851 chan->move_state != L2CAP_MOVE_WAIT_PREPARE;
852}
853
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200854static void l2cap_do_send(struct l2cap_chan *chan, struct sk_buff *skb)
855{
856 struct hci_conn *hcon = chan->conn->hcon;
857 u16 flags;
858
859 BT_DBG("chan %p, skb %p len %d priority %u", chan, skb, skb->len,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100860 skb->priority);
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200861
Mat Martineaud5f8a752012-10-23 15:24:18 -0700862 if (chan->hs_hcon && !__chan_is_moving(chan)) {
863 if (chan->hs_hchan)
864 hci_send_acl(chan->hs_hchan, skb, ACL_COMPLETE);
865 else
866 kfree_skb(skb);
867
868 return;
869 }
870
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200871 if (!test_bit(FLAG_FLUSHABLE, &chan->flags) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100872 lmp_no_flush_capable(hcon->hdev))
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200873 flags = ACL_START_NO_FLUSH;
874 else
875 flags = ACL_START;
876
877 bt_cb(skb)->force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
878 hci_send_acl(chan->conn->hchan, skb, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700879}
880
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700881static void __unpack_enhanced_control(u16 enh, struct l2cap_ctrl *control)
882{
883 control->reqseq = (enh & L2CAP_CTRL_REQSEQ) >> L2CAP_CTRL_REQSEQ_SHIFT;
884 control->final = (enh & L2CAP_CTRL_FINAL) >> L2CAP_CTRL_FINAL_SHIFT;
885
886 if (enh & L2CAP_CTRL_FRAME_TYPE) {
887 /* S-Frame */
888 control->sframe = 1;
889 control->poll = (enh & L2CAP_CTRL_POLL) >> L2CAP_CTRL_POLL_SHIFT;
890 control->super = (enh & L2CAP_CTRL_SUPERVISE) >> L2CAP_CTRL_SUPER_SHIFT;
891
892 control->sar = 0;
893 control->txseq = 0;
894 } else {
895 /* I-Frame */
896 control->sframe = 0;
897 control->sar = (enh & L2CAP_CTRL_SAR) >> L2CAP_CTRL_SAR_SHIFT;
898 control->txseq = (enh & L2CAP_CTRL_TXSEQ) >> L2CAP_CTRL_TXSEQ_SHIFT;
899
900 control->poll = 0;
901 control->super = 0;
902 }
903}
904
905static void __unpack_extended_control(u32 ext, struct l2cap_ctrl *control)
906{
907 control->reqseq = (ext & L2CAP_EXT_CTRL_REQSEQ) >> L2CAP_EXT_CTRL_REQSEQ_SHIFT;
908 control->final = (ext & L2CAP_EXT_CTRL_FINAL) >> L2CAP_EXT_CTRL_FINAL_SHIFT;
909
910 if (ext & L2CAP_EXT_CTRL_FRAME_TYPE) {
911 /* S-Frame */
912 control->sframe = 1;
913 control->poll = (ext & L2CAP_EXT_CTRL_POLL) >> L2CAP_EXT_CTRL_POLL_SHIFT;
914 control->super = (ext & L2CAP_EXT_CTRL_SUPERVISE) >> L2CAP_EXT_CTRL_SUPER_SHIFT;
915
916 control->sar = 0;
917 control->txseq = 0;
918 } else {
919 /* I-Frame */
920 control->sframe = 0;
921 control->sar = (ext & L2CAP_EXT_CTRL_SAR) >> L2CAP_EXT_CTRL_SAR_SHIFT;
922 control->txseq = (ext & L2CAP_EXT_CTRL_TXSEQ) >> L2CAP_EXT_CTRL_TXSEQ_SHIFT;
923
924 control->poll = 0;
925 control->super = 0;
926 }
927}
928
929static inline void __unpack_control(struct l2cap_chan *chan,
930 struct sk_buff *skb)
931{
932 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
933 __unpack_extended_control(get_unaligned_le32(skb->data),
934 &bt_cb(skb)->control);
Mat Martineaucec8ab6e2012-05-17 20:53:36 -0700935 skb_pull(skb, L2CAP_EXT_CTRL_SIZE);
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700936 } else {
937 __unpack_enhanced_control(get_unaligned_le16(skb->data),
938 &bt_cb(skb)->control);
Mat Martineaucec8ab6e2012-05-17 20:53:36 -0700939 skb_pull(skb, L2CAP_ENH_CTRL_SIZE);
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700940 }
941}
942
943static u32 __pack_extended_control(struct l2cap_ctrl *control)
944{
945 u32 packed;
946
947 packed = control->reqseq << L2CAP_EXT_CTRL_REQSEQ_SHIFT;
948 packed |= control->final << L2CAP_EXT_CTRL_FINAL_SHIFT;
949
950 if (control->sframe) {
951 packed |= control->poll << L2CAP_EXT_CTRL_POLL_SHIFT;
952 packed |= control->super << L2CAP_EXT_CTRL_SUPER_SHIFT;
953 packed |= L2CAP_EXT_CTRL_FRAME_TYPE;
954 } else {
955 packed |= control->sar << L2CAP_EXT_CTRL_SAR_SHIFT;
956 packed |= control->txseq << L2CAP_EXT_CTRL_TXSEQ_SHIFT;
957 }
958
959 return packed;
960}
961
962static u16 __pack_enhanced_control(struct l2cap_ctrl *control)
963{
964 u16 packed;
965
966 packed = control->reqseq << L2CAP_CTRL_REQSEQ_SHIFT;
967 packed |= control->final << L2CAP_CTRL_FINAL_SHIFT;
968
969 if (control->sframe) {
970 packed |= control->poll << L2CAP_CTRL_POLL_SHIFT;
971 packed |= control->super << L2CAP_CTRL_SUPER_SHIFT;
972 packed |= L2CAP_CTRL_FRAME_TYPE;
973 } else {
974 packed |= control->sar << L2CAP_CTRL_SAR_SHIFT;
975 packed |= control->txseq << L2CAP_CTRL_TXSEQ_SHIFT;
976 }
977
978 return packed;
979}
980
981static inline void __pack_control(struct l2cap_chan *chan,
982 struct l2cap_ctrl *control,
983 struct sk_buff *skb)
984{
985 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
986 put_unaligned_le32(__pack_extended_control(control),
987 skb->data + L2CAP_HDR_SIZE);
988 } else {
989 put_unaligned_le16(__pack_enhanced_control(control),
990 skb->data + L2CAP_HDR_SIZE);
991 }
992}
993
Gustavo Padovanba7aa642012-05-29 13:29:16 -0300994static inline unsigned int __ertm_hdr_size(struct l2cap_chan *chan)
995{
996 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
997 return L2CAP_EXT_HDR_SIZE;
998 else
999 return L2CAP_ENH_HDR_SIZE;
1000}
1001
Mat Martineaua67d7f62012-05-17 20:53:35 -07001002static struct sk_buff *l2cap_create_sframe_pdu(struct l2cap_chan *chan,
1003 u32 control)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001004{
1005 struct sk_buff *skb;
1006 struct l2cap_hdr *lh;
Gustavo Padovanba7aa642012-05-29 13:29:16 -03001007 int hlen = __ertm_hdr_size(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001008
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001009 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03001010 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001011
Mat Martineaua67d7f62012-05-17 20:53:35 -07001012 skb = bt_skb_alloc(hlen, GFP_KERNEL);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001013
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001014 if (!skb)
Mat Martineaua67d7f62012-05-17 20:53:35 -07001015 return ERR_PTR(-ENOMEM);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001016
1017 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001018 lh->len = cpu_to_le16(hlen - L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001019 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03001020
Mat Martineaua67d7f62012-05-17 20:53:35 -07001021 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
1022 put_unaligned_le32(control, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
1023 else
1024 put_unaligned_le16(control, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001025
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001026 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineaua67d7f62012-05-17 20:53:35 -07001027 u16 fcs = crc16(0, (u8 *)skb->data, skb->len);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03001028 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001029 }
1030
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001031 skb->priority = HCI_PRIO_MAX;
Mat Martineaua67d7f62012-05-17 20:53:35 -07001032 return skb;
1033}
1034
1035static void l2cap_send_sframe(struct l2cap_chan *chan,
1036 struct l2cap_ctrl *control)
1037{
1038 struct sk_buff *skb;
1039 u32 control_field;
1040
1041 BT_DBG("chan %p, control %p", chan, control);
1042
1043 if (!control->sframe)
1044 return;
1045
Mat Martineaub99e13a2012-10-23 15:24:19 -07001046 if (__chan_is_moving(chan))
1047 return;
1048
Mat Martineaua67d7f62012-05-17 20:53:35 -07001049 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state) &&
1050 !control->poll)
1051 control->final = 1;
1052
1053 if (control->super == L2CAP_SUPER_RR)
1054 clear_bit(CONN_RNR_SENT, &chan->conn_state);
1055 else if (control->super == L2CAP_SUPER_RNR)
1056 set_bit(CONN_RNR_SENT, &chan->conn_state);
1057
1058 if (control->super != L2CAP_SUPER_SREJ) {
1059 chan->last_acked_seq = control->reqseq;
1060 __clear_ack_timer(chan);
1061 }
1062
1063 BT_DBG("reqseq %d, final %d, poll %d, super %d", control->reqseq,
1064 control->final, control->poll, control->super);
1065
1066 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
1067 control_field = __pack_extended_control(control);
1068 else
1069 control_field = __pack_enhanced_control(control);
1070
1071 skb = l2cap_create_sframe_pdu(chan, control_field);
1072 if (!IS_ERR(skb))
1073 l2cap_do_send(chan, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001074}
1075
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001076static void l2cap_send_rr_or_rnr(struct l2cap_chan *chan, bool poll)
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001077{
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001078 struct l2cap_ctrl control;
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001079
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001080 BT_DBG("chan %p, poll %d", chan, poll);
1081
1082 memset(&control, 0, sizeof(control));
1083 control.sframe = 1;
1084 control.poll = poll;
1085
1086 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
1087 control.super = L2CAP_SUPER_RNR;
1088 else
1089 control.super = L2CAP_SUPER_RR;
1090
1091 control.reqseq = chan->buffer_seq;
1092 l2cap_send_sframe(chan, &control);
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001093}
1094
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001095static inline int __l2cap_no_conn_pending(struct l2cap_chan *chan)
Andrei Emeltchenkoe501d052010-07-08 12:14:41 +03001096{
Johan Hedberg5ff6f342014-08-07 22:56:43 +03001097 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED)
1098 return true;
1099
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001100 return !test_bit(CONF_CONNECT_PEND, &chan->conf_state);
Andrei Emeltchenkoe501d052010-07-08 12:14:41 +03001101}
1102
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001103static bool __amp_capable(struct l2cap_chan *chan)
1104{
1105 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann1df7b172013-10-05 11:47:49 -07001106 struct hci_dev *hdev;
1107 bool amp_available = false;
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001108
Marcel Holtmann1df7b172013-10-05 11:47:49 -07001109 if (!conn->hs_enabled)
1110 return false;
1111
1112 if (!(conn->fixed_chan_mask & L2CAP_FC_A2MP))
1113 return false;
1114
1115 read_lock(&hci_dev_list_lock);
1116 list_for_each_entry(hdev, &hci_dev_list, list) {
1117 if (hdev->amp_type != AMP_TYPE_BREDR &&
1118 test_bit(HCI_UP, &hdev->flags)) {
1119 amp_available = true;
1120 break;
1121 }
1122 }
1123 read_unlock(&hci_dev_list_lock);
1124
1125 if (chan->chan_policy == BT_CHANNEL_POLICY_AMP_PREFERRED)
1126 return amp_available;
Marcel Holtmann848566b2013-10-01 22:59:22 -07001127
1128 return false;
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001129}
1130
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02001131static bool l2cap_check_efs(struct l2cap_chan *chan)
1132{
1133 /* Check EFS parameters */
1134 return true;
1135}
1136
Andrei Emeltchenko2766be42012-09-27 17:26:21 +03001137void l2cap_send_conn_req(struct l2cap_chan *chan)
Andrei Emeltchenko9b27f352012-02-24 16:00:00 +02001138{
1139 struct l2cap_conn *conn = chan->conn;
1140 struct l2cap_conn_req req;
1141
1142 req.scid = cpu_to_le16(chan->scid);
1143 req.psm = chan->psm;
1144
1145 chan->ident = l2cap_get_ident(conn);
1146
1147 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
1148
1149 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_REQ, sizeof(req), &req);
1150}
1151
Mat Martineau8eb200b2012-10-23 15:24:17 -07001152static void l2cap_send_create_chan_req(struct l2cap_chan *chan, u8 amp_id)
1153{
1154 struct l2cap_create_chan_req req;
1155 req.scid = cpu_to_le16(chan->scid);
1156 req.psm = chan->psm;
1157 req.amp_id = amp_id;
1158
1159 chan->ident = l2cap_get_ident(chan->conn);
1160
1161 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_REQ,
1162 sizeof(req), &req);
1163}
1164
Mat Martineau02b0fbb2012-10-23 15:24:10 -07001165static void l2cap_move_setup(struct l2cap_chan *chan)
1166{
1167 struct sk_buff *skb;
1168
1169 BT_DBG("chan %p", chan);
1170
1171 if (chan->mode != L2CAP_MODE_ERTM)
1172 return;
1173
1174 __clear_retrans_timer(chan);
1175 __clear_monitor_timer(chan);
1176 __clear_ack_timer(chan);
1177
1178 chan->retry_count = 0;
1179 skb_queue_walk(&chan->tx_q, skb) {
1180 if (bt_cb(skb)->control.retries)
1181 bt_cb(skb)->control.retries = 1;
1182 else
1183 break;
1184 }
1185
1186 chan->expected_tx_seq = chan->buffer_seq;
1187
1188 clear_bit(CONN_REJ_ACT, &chan->conn_state);
1189 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
1190 l2cap_seq_list_clear(&chan->retrans_list);
1191 l2cap_seq_list_clear(&chan->srej_list);
1192 skb_queue_purge(&chan->srej_q);
1193
1194 chan->tx_state = L2CAP_TX_STATE_XMIT;
1195 chan->rx_state = L2CAP_RX_STATE_MOVE;
1196
1197 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
1198}
1199
Mat Martineau5f3847a2012-10-23 15:24:12 -07001200static void l2cap_move_done(struct l2cap_chan *chan)
1201{
1202 u8 move_role = chan->move_role;
1203 BT_DBG("chan %p", chan);
1204
1205 chan->move_state = L2CAP_MOVE_STABLE;
1206 chan->move_role = L2CAP_MOVE_ROLE_NONE;
1207
1208 if (chan->mode != L2CAP_MODE_ERTM)
1209 return;
1210
1211 switch (move_role) {
1212 case L2CAP_MOVE_ROLE_INITIATOR:
1213 l2cap_tx(chan, NULL, NULL, L2CAP_EV_EXPLICIT_POLL);
1214 chan->rx_state = L2CAP_RX_STATE_WAIT_F;
1215 break;
1216 case L2CAP_MOVE_ROLE_RESPONDER:
1217 chan->rx_state = L2CAP_RX_STATE_WAIT_P;
1218 break;
1219 }
1220}
1221
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001222static void l2cap_chan_ready(struct l2cap_chan *chan)
1223{
Mat Martineau28270112012-05-17 21:14:09 -07001224 /* This clears all conf flags, including CONF_NOT_COMPLETE */
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001225 chan->conf_state = 0;
1226 __clear_chan_timer(chan);
1227
Johan Hedberg0ce43ce2013-12-05 14:55:33 +02001228 if (chan->mode == L2CAP_MODE_LE_FLOWCTL && !chan->tx_credits)
1229 chan->ops->suspend(chan);
Johan Hedberg177f8f22013-05-31 17:54:51 +03001230
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001231 chan->state = BT_CONNECTED;
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001232
Andrei Emeltchenkofd83e2c2012-05-30 09:55:32 +03001233 chan->ops->ready(chan);
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001234}
1235
Johan Hedbergf1496de2013-05-13 14:15:56 +03001236static void l2cap_le_connect(struct l2cap_chan *chan)
1237{
1238 struct l2cap_conn *conn = chan->conn;
1239 struct l2cap_le_conn_req req;
1240
Johan Hedberg595177f2013-12-02 22:12:22 +02001241 if (test_and_set_bit(FLAG_LE_CONN_REQ_SENT, &chan->flags))
1242 return;
1243
Johan Hedbergf1496de2013-05-13 14:15:56 +03001244 req.psm = chan->psm;
1245 req.scid = cpu_to_le16(chan->scid);
1246 req.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02001247 req.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03001248 req.credits = cpu_to_le16(chan->rx_credits);
Johan Hedbergf1496de2013-05-13 14:15:56 +03001249
1250 chan->ident = l2cap_get_ident(conn);
1251
1252 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_REQ,
1253 sizeof(req), &req);
1254}
1255
1256static void l2cap_le_start(struct l2cap_chan *chan)
1257{
1258 struct l2cap_conn *conn = chan->conn;
1259
1260 if (!smp_conn_security(conn->hcon, chan->sec_level))
1261 return;
1262
1263 if (!chan->psm) {
1264 l2cap_chan_ready(chan);
1265 return;
1266 }
1267
1268 if (chan->state == BT_CONNECT)
1269 l2cap_le_connect(chan);
1270}
1271
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001272static void l2cap_start_connection(struct l2cap_chan *chan)
1273{
1274 if (__amp_capable(chan)) {
1275 BT_DBG("chan %p AMP capable: discover AMPs", chan);
1276 a2mp_discover_amp(chan);
Johan Hedbergf1496de2013-05-13 14:15:56 +03001277 } else if (chan->conn->hcon->type == LE_LINK) {
1278 l2cap_le_start(chan);
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001279 } else {
1280 l2cap_send_conn_req(chan);
1281 }
1282}
1283
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001284static void l2cap_do_start(struct l2cap_chan *chan)
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001285{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03001286 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001287
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001288 if (conn->hcon->type == LE_LINK) {
Johan Hedberg96ac34f2013-05-13 11:15:07 +03001289 l2cap_le_start(chan);
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001290 return;
1291 }
1292
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001293 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) {
Marcel Holtmann984947d2009-02-06 23:35:19 +01001294 if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE))
1295 return;
1296
Johan Hedberge7cafc42014-07-17 15:35:38 +03001297 if (l2cap_chan_check_security(chan, true) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01001298 __l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001299 l2cap_start_connection(chan);
1300 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001301 } else {
1302 struct l2cap_info_req req;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001303 req.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001304
1305 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
1306 conn->info_ident = l2cap_get_ident(conn);
1307
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08001308 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001309
Gustavo Padovan2d792812012-10-06 10:07:01 +01001310 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
1311 sizeof(req), &req);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001312 }
1313}
1314
Gustavo F. Padovancf6c2c02010-06-07 20:54:45 -03001315static inline int l2cap_mode_supported(__u8 mode, __u32 feat_mask)
1316{
1317 u32 local_feat_mask = l2cap_feat_mask;
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03001318 if (!disable_ertm)
Gustavo F. Padovancf6c2c02010-06-07 20:54:45 -03001319 local_feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING;
1320
1321 switch (mode) {
1322 case L2CAP_MODE_ERTM:
1323 return L2CAP_FEAT_ERTM & feat_mask & local_feat_mask;
1324 case L2CAP_MODE_STREAMING:
1325 return L2CAP_FEAT_STREAMING & feat_mask & local_feat_mask;
1326 default:
1327 return 0x00;
1328 }
1329}
1330
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001331static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err)
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001332{
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001333 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001334 struct l2cap_disconn_req req;
1335
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001336 if (!conn)
1337 return;
1338
Andrei Emeltchenkoaad3d0e2012-09-06 15:05:42 +03001339 if (chan->mode == L2CAP_MODE_ERTM && chan->state == BT_CONNECTED) {
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03001340 __clear_retrans_timer(chan);
1341 __clear_monitor_timer(chan);
1342 __clear_ack_timer(chan);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001343 }
1344
Johan Hedberg2338a7e2014-01-24 10:35:40 +02001345 if (chan->scid == L2CAP_CID_A2MP) {
Gustavo Padovand1177732012-10-06 11:47:38 +01001346 l2cap_state_change(chan, BT_DISCONN);
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001347 return;
1348 }
1349
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001350 req.dcid = cpu_to_le16(chan->dcid);
1351 req.scid = cpu_to_le16(chan->scid);
Gustavo Padovan2d792812012-10-06 10:07:01 +01001352 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_DISCONN_REQ,
1353 sizeof(req), &req);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001354
Gustavo Padovanf8e73012013-10-15 19:24:46 -03001355 l2cap_state_change_and_error(chan, BT_DISCONN, err);
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001356}
1357
Linus Torvalds1da177e2005-04-16 15:20:36 -07001358/* ---- L2CAP connections ---- */
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001359static void l2cap_conn_start(struct l2cap_conn *conn)
1360{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001361 struct l2cap_chan *chan, *tmp;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001362
1363 BT_DBG("conn %p", conn);
1364
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001365 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001366
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001367 list_for_each_entry_safe(chan, tmp, &conn->chan_l, list) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001368 l2cap_chan_lock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001369
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001370 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001371 l2cap_chan_unlock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001372 continue;
1373 }
1374
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001375 if (chan->state == BT_CONNECT) {
Johan Hedberge7cafc42014-07-17 15:35:38 +03001376 if (!l2cap_chan_check_security(chan, true) ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01001377 !__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001378 l2cap_chan_unlock(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001379 continue;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02001380 }
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001381
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001382 if (!l2cap_mode_supported(chan->mode, conn->feat_mask)
Gustavo Padovan2d792812012-10-06 10:07:01 +01001383 && test_bit(CONF_STATE2_DEVICE,
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001384 &chan->conf_state)) {
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001385 l2cap_chan_close(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001386 l2cap_chan_unlock(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001387 continue;
1388 }
1389
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001390 l2cap_start_connection(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001391
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001392 } else if (chan->state == BT_CONNECT2) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001393 struct l2cap_conn_rsp rsp;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001394 char buf[128];
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001395 rsp.scid = cpu_to_le16(chan->dcid);
1396 rsp.dcid = cpu_to_le16(chan->scid);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001397
Johan Hedberge7cafc42014-07-17 15:35:38 +03001398 if (l2cap_chan_check_security(chan, false)) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07001399 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001400 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
1401 rsp.status = cpu_to_le16(L2CAP_CS_AUTHOR_PEND);
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001402 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001403
1404 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001405 l2cap_state_change(chan, BT_CONFIG);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001406 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
1407 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001408 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001409 } else {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001410 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
1411 rsp.status = cpu_to_le16(L2CAP_CS_AUTHEN_PEND);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001412 }
1413
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001414 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001415 sizeof(rsp), &rsp);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001416
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001417 if (test_bit(CONF_REQ_SENT, &chan->conf_state) ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01001418 rsp.result != L2CAP_CR_SUCCESS) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001419 l2cap_chan_unlock(chan);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001420 continue;
1421 }
1422
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001423 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001424 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001425 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03001426 chan->num_conf_req++;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001427 }
1428
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001429 l2cap_chan_unlock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001430 }
1431
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001432 mutex_unlock(&conn->chan_lock);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001433}
1434
Ville Tervob62f3282011-02-10 22:38:50 -03001435static void l2cap_le_conn_ready(struct l2cap_conn *conn)
1436{
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001437 struct hci_conn *hcon = conn->hcon;
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001438 struct hci_dev *hdev = hcon->hdev;
Ville Tervob62f3282011-02-10 22:38:50 -03001439
Johan Hedberge760ec12014-08-07 22:56:47 +03001440 BT_DBG("%s conn %p", hdev->name, conn);
Ville Tervob62f3282011-02-10 22:38:50 -03001441
Johan Hedberge760ec12014-08-07 22:56:47 +03001442 /* For outgoing pairing which doesn't necessarily have an
1443 * associated socket (e.g. mgmt_pair_device).
1444 */
1445 if (hcon->out)
1446 smp_conn_security(hcon, hcon->pending_sec_level);
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001447
Marcel Holtmann80afeb62014-06-23 12:18:51 +02001448 /* For LE slave connections, make sure the connection interval
1449 * is in the range of the minium and maximum interval that has
1450 * been configured for this connection. If not, then trigger
1451 * the connection update procedure.
1452 */
Johan Hedberg40bef302014-07-16 11:42:27 +03001453 if (hcon->role == HCI_ROLE_SLAVE &&
Marcel Holtmann80afeb62014-06-23 12:18:51 +02001454 (hcon->le_conn_interval < hcon->le_conn_min_interval ||
1455 hcon->le_conn_interval > hcon->le_conn_max_interval)) {
1456 struct l2cap_conn_param_update_req req;
1457
1458 req.min = cpu_to_le16(hcon->le_conn_min_interval);
1459 req.max = cpu_to_le16(hcon->le_conn_max_interval);
1460 req.latency = cpu_to_le16(hcon->le_conn_latency);
1461 req.to_multiplier = cpu_to_le16(hcon->le_supv_timeout);
1462
1463 l2cap_send_cmd(conn, l2cap_get_ident(conn),
1464 L2CAP_CONN_PARAM_UPDATE_REQ, sizeof(req), &req);
1465 }
Ville Tervob62f3282011-02-10 22:38:50 -03001466}
1467
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001468static void l2cap_conn_ready(struct l2cap_conn *conn)
1469{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001470 struct l2cap_chan *chan;
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001471 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001472
1473 BT_DBG("conn %p", conn);
1474
Johan Hedberge760ec12014-08-07 22:56:47 +03001475 mutex_lock(&conn->chan_lock);
1476
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001477 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03001478
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001479 l2cap_chan_lock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001480
Johan Hedberg2338a7e2014-01-24 10:35:40 +02001481 if (chan->scid == L2CAP_CID_A2MP) {
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001482 l2cap_chan_unlock(chan);
1483 continue;
1484 }
1485
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001486 if (hcon->type == LE_LINK) {
Johan Hedbergf1496de2013-05-13 14:15:56 +03001487 l2cap_le_start(chan);
Vinicius Costa Gomes63128452011-06-17 22:46:26 -03001488 } else if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Gustavo Padovan74e75742013-10-15 19:24:51 -03001489 l2cap_chan_ready(chan);
Anderson Brigliab501d6a2011-06-07 18:46:31 -03001490
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001491 } else if (chan->state == BT_CONNECT) {
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001492 l2cap_do_start(chan);
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001493 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001494
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001495 l2cap_chan_unlock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001496 }
1497
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001498 mutex_unlock(&conn->chan_lock);
Johan Hedberg61a939c2014-01-17 20:45:11 +02001499
Johan Hedberg79a05722014-08-08 09:28:04 +03001500 if (hcon->type == LE_LINK)
1501 l2cap_le_conn_ready(conn);
1502
Johan Hedberg61a939c2014-01-17 20:45:11 +02001503 queue_work(hcon->hdev->workqueue, &conn->pending_rx_work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001504}
1505
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001506/* Notify sockets that we cannot guaranty reliability anymore */
1507static void l2cap_conn_unreliable(struct l2cap_conn *conn, int err)
1508{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001509 struct l2cap_chan *chan;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001510
1511 BT_DBG("conn %p", conn);
1512
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001513 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001514
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001515 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +03001516 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo Padovan1d8b1fd2012-10-06 11:34:52 +01001517 l2cap_chan_set_err(chan, err);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001518 }
1519
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001520 mutex_unlock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001521}
1522
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001523static void l2cap_info_timeout(struct work_struct *work)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001524{
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001525 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001526 info_timer.work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001527
Marcel Holtmann984947d2009-02-06 23:35:19 +01001528 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01001529 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01001530
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001531 l2cap_conn_start(conn);
1532}
1533
David Herrmann2c8e1412013-04-06 20:28:45 +02001534/*
1535 * l2cap_user
1536 * External modules can register l2cap_user objects on l2cap_conn. The ->probe
1537 * callback is called during registration. The ->remove callback is called
1538 * during unregistration.
1539 * An l2cap_user object can either be explicitly unregistered or when the
1540 * underlying l2cap_conn object is deleted. This guarantees that l2cap->hcon,
1541 * l2cap->hchan, .. are valid as long as the remove callback hasn't been called.
1542 * External modules must own a reference to the l2cap_conn object if they intend
1543 * to call l2cap_unregister_user(). The l2cap_conn object might get destroyed at
1544 * any time if they don't.
1545 */
1546
1547int l2cap_register_user(struct l2cap_conn *conn, struct l2cap_user *user)
1548{
1549 struct hci_dev *hdev = conn->hcon->hdev;
1550 int ret;
1551
1552 /* We need to check whether l2cap_conn is registered. If it is not, we
1553 * must not register the l2cap_user. l2cap_conn_del() is unregisters
1554 * l2cap_conn objects, but doesn't provide its own locking. Instead, it
1555 * relies on the parent hci_conn object to be locked. This itself relies
1556 * on the hci_dev object to be locked. So we must lock the hci device
1557 * here, too. */
1558
1559 hci_dev_lock(hdev);
1560
1561 if (user->list.next || user->list.prev) {
1562 ret = -EINVAL;
1563 goto out_unlock;
1564 }
1565
1566 /* conn->hchan is NULL after l2cap_conn_del() was called */
1567 if (!conn->hchan) {
1568 ret = -ENODEV;
1569 goto out_unlock;
1570 }
1571
1572 ret = user->probe(conn, user);
1573 if (ret)
1574 goto out_unlock;
1575
1576 list_add(&user->list, &conn->users);
1577 ret = 0;
1578
1579out_unlock:
1580 hci_dev_unlock(hdev);
1581 return ret;
1582}
1583EXPORT_SYMBOL(l2cap_register_user);
1584
1585void l2cap_unregister_user(struct l2cap_conn *conn, struct l2cap_user *user)
1586{
1587 struct hci_dev *hdev = conn->hcon->hdev;
1588
1589 hci_dev_lock(hdev);
1590
1591 if (!user->list.next || !user->list.prev)
1592 goto out_unlock;
1593
1594 list_del(&user->list);
1595 user->list.next = NULL;
1596 user->list.prev = NULL;
1597 user->remove(conn, user);
1598
1599out_unlock:
1600 hci_dev_unlock(hdev);
1601}
1602EXPORT_SYMBOL(l2cap_unregister_user);
1603
1604static void l2cap_unregister_all_users(struct l2cap_conn *conn)
1605{
1606 struct l2cap_user *user;
1607
1608 while (!list_empty(&conn->users)) {
1609 user = list_first_entry(&conn->users, struct l2cap_user, list);
1610 list_del(&user->list);
1611 user->list.next = NULL;
1612 user->list.prev = NULL;
1613 user->remove(conn, user);
1614 }
1615}
1616
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001617static void l2cap_conn_del(struct hci_conn *hcon, int err)
1618{
1619 struct l2cap_conn *conn = hcon->l2cap_data;
1620 struct l2cap_chan *chan, *l;
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001621
1622 if (!conn)
1623 return;
1624
1625 BT_DBG("hcon %p conn %p, err %d", hcon, conn, err);
1626
1627 kfree_skb(conn->rx_skb);
1628
Johan Hedberg61a939c2014-01-17 20:45:11 +02001629 skb_queue_purge(&conn->pending_rx);
Jukka Taimisto7ab56c32014-06-12 10:15:13 +00001630
1631 /* We can not call flush_work(&conn->pending_rx_work) here since we
1632 * might block if we are running on a worker from the same workqueue
1633 * pending_rx_work is waiting on.
1634 */
1635 if (work_pending(&conn->pending_rx_work))
1636 cancel_work_sync(&conn->pending_rx_work);
Johan Hedberg61a939c2014-01-17 20:45:11 +02001637
Johan Hedbergdec5b492014-08-11 22:06:37 +03001638 if (work_pending(&conn->disconn_work))
1639 cancel_work_sync(&conn->disconn_work);
1640
David Herrmann2c8e1412013-04-06 20:28:45 +02001641 l2cap_unregister_all_users(conn);
1642
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001643 mutex_lock(&conn->chan_lock);
1644
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001645 /* Kill channels */
1646 list_for_each_entry_safe(chan, l, &conn->chan_l, list) {
Mat Martineau61d6ef32012-04-27 16:50:50 -07001647 l2cap_chan_hold(chan);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001648 l2cap_chan_lock(chan);
1649
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001650 l2cap_chan_del(chan, err);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001651
1652 l2cap_chan_unlock(chan);
1653
Gustavo Padovan80b98022012-05-27 22:27:51 -03001654 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07001655 l2cap_chan_put(chan);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001656 }
1657
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001658 mutex_unlock(&conn->chan_lock);
1659
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001660 hci_chan_del(conn->hchan);
1661
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001662 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT)
Ulisses Furquim127074b2012-01-30 18:26:29 -02001663 cancel_delayed_work_sync(&conn->info_timer);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001664
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001665 hcon->l2cap_data = NULL;
David Herrmann9c903e32013-04-06 20:28:44 +02001666 conn->hchan = NULL;
1667 l2cap_conn_put(conn);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001668}
1669
Johan Hedbergdec5b492014-08-11 22:06:37 +03001670static void disconn_work(struct work_struct *work)
1671{
1672 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
1673 disconn_work);
1674
1675 BT_DBG("conn %p", conn);
1676
1677 l2cap_conn_del(conn->hcon, conn->disconn_err);
1678}
1679
1680void l2cap_conn_shutdown(struct l2cap_conn *conn, int err)
1681{
1682 struct hci_dev *hdev = conn->hcon->hdev;
1683
1684 BT_DBG("conn %p err %d", conn, err);
1685
1686 conn->disconn_err = err;
1687 queue_work(hdev->workqueue, &conn->disconn_work);
1688}
1689
David Herrmann9c903e32013-04-06 20:28:44 +02001690static void l2cap_conn_free(struct kref *ref)
1691{
1692 struct l2cap_conn *conn = container_of(ref, struct l2cap_conn, ref);
1693
1694 hci_conn_put(conn->hcon);
1695 kfree(conn);
1696}
1697
1698void l2cap_conn_get(struct l2cap_conn *conn)
1699{
1700 kref_get(&conn->ref);
1701}
1702EXPORT_SYMBOL(l2cap_conn_get);
1703
1704void l2cap_conn_put(struct l2cap_conn *conn)
1705{
1706 kref_put(&conn->ref, l2cap_conn_free);
1707}
1708EXPORT_SYMBOL(l2cap_conn_put);
1709
Linus Torvalds1da177e2005-04-16 15:20:36 -07001710/* ---- Socket interface ---- */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001711
Ido Yarivc2287682012-04-20 15:46:07 -03001712/* Find socket with psm and source / destination bdaddr.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001713 * Returns closest match.
1714 */
Ido Yarivc2287682012-04-20 15:46:07 -03001715static struct l2cap_chan *l2cap_global_chan_by_psm(int state, __le16 psm,
1716 bdaddr_t *src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001717 bdaddr_t *dst,
1718 u8 link_type)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001719{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001720 struct l2cap_chan *c, *c1 = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001721
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001722 read_lock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001723
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001724 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001725 if (state && c->state != state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001726 continue;
1727
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001728 if (link_type == ACL_LINK && c->src_type != BDADDR_BREDR)
1729 continue;
1730
1731 if (link_type == LE_LINK && c->src_type == BDADDR_BREDR)
1732 continue;
1733
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001734 if (c->psm == psm) {
Ido Yarivc2287682012-04-20 15:46:07 -03001735 int src_match, dst_match;
1736 int src_any, dst_any;
1737
Linus Torvalds1da177e2005-04-16 15:20:36 -07001738 /* Exact match. */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001739 src_match = !bacmp(&c->src, src);
1740 dst_match = !bacmp(&c->dst, dst);
Ido Yarivc2287682012-04-20 15:46:07 -03001741 if (src_match && dst_match) {
Johan Hedberga24cce12014-08-07 22:56:42 +03001742 l2cap_chan_hold(c);
Johannes Berga7567b22011-06-01 08:29:54 +02001743 read_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001744 return c;
1745 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001746
1747 /* Closest match */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001748 src_any = !bacmp(&c->src, BDADDR_ANY);
1749 dst_any = !bacmp(&c->dst, BDADDR_ANY);
Ido Yarivc2287682012-04-20 15:46:07 -03001750 if ((src_match && dst_any) || (src_any && dst_match) ||
1751 (src_any && dst_any))
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001752 c1 = c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001753 }
1754 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001755
Johan Hedberga24cce12014-08-07 22:56:42 +03001756 if (c1)
1757 l2cap_chan_hold(c1);
1758
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001759 read_unlock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001760
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001761 return c1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001762}
1763
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001764static void l2cap_monitor_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001765{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001766 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001767 monitor_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001768
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03001769 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001770
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001771 l2cap_chan_lock(chan);
1772
Mat Martineau80909e02012-05-17 20:53:50 -07001773 if (!chan->conn) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001774 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001775 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001776 return;
1777 }
1778
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001779 l2cap_tx(chan, NULL, NULL, L2CAP_EV_MONITOR_TO);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001780
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001781 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001782 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001783}
1784
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001785static void l2cap_retrans_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001786{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001787 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001788 retrans_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001789
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03001790 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001791
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001792 l2cap_chan_lock(chan);
1793
Mat Martineau80909e02012-05-17 20:53:50 -07001794 if (!chan->conn) {
1795 l2cap_chan_unlock(chan);
1796 l2cap_chan_put(chan);
1797 return;
1798 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001799
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001800 l2cap_tx(chan, NULL, NULL, L2CAP_EV_RETRANS_TO);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001801 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001802 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001803}
1804
Gustavo Padovand6603662012-05-21 13:58:22 -03001805static void l2cap_streaming_send(struct l2cap_chan *chan,
1806 struct sk_buff_head *skbs)
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001807{
Gustavo F. Padovanccbb84a2010-08-30 18:44:44 -03001808 struct sk_buff *skb;
Mat Martineau37339372012-05-17 20:53:33 -07001809 struct l2cap_ctrl *control;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001810
Mat Martineau37339372012-05-17 20:53:33 -07001811 BT_DBG("chan %p, skbs %p", chan, skbs);
1812
Mat Martineaub99e13a2012-10-23 15:24:19 -07001813 if (__chan_is_moving(chan))
1814 return;
1815
Mat Martineau37339372012-05-17 20:53:33 -07001816 skb_queue_splice_tail_init(skbs, &chan->tx_q);
1817
1818 while (!skb_queue_empty(&chan->tx_q)) {
1819
1820 skb = skb_dequeue(&chan->tx_q);
1821
1822 bt_cb(skb)->control.retries = 1;
1823 control = &bt_cb(skb)->control;
1824
1825 control->reqseq = 0;
1826 control->txseq = chan->next_tx_seq;
1827
1828 __pack_control(chan, control, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001829
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001830 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau37339372012-05-17 20:53:33 -07001831 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1832 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001833 }
1834
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001835 l2cap_do_send(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001836
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001837 BT_DBG("Sent txseq %u", control->txseq);
Mat Martineau37339372012-05-17 20:53:33 -07001838
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001839 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau37339372012-05-17 20:53:33 -07001840 chan->frames_sent++;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001841 }
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001842}
1843
Szymon Janc67c9e842011-07-28 16:24:33 +02001844static int l2cap_ertm_send(struct l2cap_chan *chan)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001845{
1846 struct sk_buff *skb, *tx_skb;
Mat Martineau18a48e72012-05-17 20:53:34 -07001847 struct l2cap_ctrl *control;
1848 int sent = 0;
1849
1850 BT_DBG("chan %p", chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001851
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001852 if (chan->state != BT_CONNECTED)
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001853 return -ENOTCONN;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001854
Mat Martineau94122bb2012-05-02 09:42:02 -07001855 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1856 return 0;
1857
Mat Martineaub99e13a2012-10-23 15:24:19 -07001858 if (__chan_is_moving(chan))
1859 return 0;
1860
Mat Martineau18a48e72012-05-17 20:53:34 -07001861 while (chan->tx_send_head &&
1862 chan->unacked_frames < chan->remote_tx_win &&
1863 chan->tx_state == L2CAP_TX_STATE_XMIT) {
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001864
Mat Martineau18a48e72012-05-17 20:53:34 -07001865 skb = chan->tx_send_head;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001866
Mat Martineau18a48e72012-05-17 20:53:34 -07001867 bt_cb(skb)->control.retries = 1;
1868 control = &bt_cb(skb)->control;
Gustavo F. Padovan95ffa972010-06-18 20:37:33 -03001869
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001870 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
Mat Martineau18a48e72012-05-17 20:53:34 -07001871 control->final = 1;
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001872
Mat Martineau18a48e72012-05-17 20:53:34 -07001873 control->reqseq = chan->buffer_seq;
1874 chan->last_acked_seq = chan->buffer_seq;
1875 control->txseq = chan->next_tx_seq;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001876
Mat Martineau18a48e72012-05-17 20:53:34 -07001877 __pack_control(chan, control, skb);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001878
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001879 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau18a48e72012-05-17 20:53:34 -07001880 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1881 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001882 }
1883
Mat Martineau18a48e72012-05-17 20:53:34 -07001884 /* Clone after data has been modified. Data is assumed to be
1885 read-only (for locking purposes) on cloned sk_buffs.
1886 */
1887 tx_skb = skb_clone(skb, GFP_KERNEL);
1888
1889 if (!tx_skb)
1890 break;
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -03001891
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03001892 __set_retrans_timer(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001893
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001894 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau18a48e72012-05-17 20:53:34 -07001895 chan->unacked_frames++;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03001896 chan->frames_sent++;
Mat Martineau18a48e72012-05-17 20:53:34 -07001897 sent++;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001898
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001899 if (skb_queue_is_last(&chan->tx_q, skb))
1900 chan->tx_send_head = NULL;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001901 else
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001902 chan->tx_send_head = skb_queue_next(&chan->tx_q, skb);
Mat Martineau18a48e72012-05-17 20:53:34 -07001903
1904 l2cap_do_send(chan, tx_skb);
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001905 BT_DBG("Sent txseq %u", control->txseq);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001906 }
1907
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001908 BT_DBG("Sent %d, %u unacked, %u in ERTM queue", sent,
1909 chan->unacked_frames, skb_queue_len(&chan->tx_q));
Mat Martineau18a48e72012-05-17 20:53:34 -07001910
1911 return sent;
Gustavo F. Padovan9e917af2010-05-01 16:15:37 -03001912}
1913
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001914static void l2cap_ertm_resend(struct l2cap_chan *chan)
1915{
1916 struct l2cap_ctrl control;
1917 struct sk_buff *skb;
1918 struct sk_buff *tx_skb;
1919 u16 seq;
1920
1921 BT_DBG("chan %p", chan);
1922
1923 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1924 return;
1925
Mat Martineaub99e13a2012-10-23 15:24:19 -07001926 if (__chan_is_moving(chan))
1927 return;
1928
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001929 while (chan->retrans_list.head != L2CAP_SEQ_LIST_CLEAR) {
1930 seq = l2cap_seq_list_pop(&chan->retrans_list);
1931
1932 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, seq);
1933 if (!skb) {
1934 BT_DBG("Error: Can't retransmit seq %d, frame missing",
Gustavo Padovan2d792812012-10-06 10:07:01 +01001935 seq);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001936 continue;
1937 }
1938
1939 bt_cb(skb)->control.retries++;
1940 control = bt_cb(skb)->control;
1941
1942 if (chan->max_tx != 0 &&
1943 bt_cb(skb)->control.retries > chan->max_tx) {
1944 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001945 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001946 l2cap_seq_list_clear(&chan->retrans_list);
1947 break;
1948 }
1949
1950 control.reqseq = chan->buffer_seq;
1951 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
1952 control.final = 1;
1953 else
1954 control.final = 0;
1955
1956 if (skb_cloned(skb)) {
1957 /* Cloned sk_buffs are read-only, so we need a
1958 * writeable copy
1959 */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03001960 tx_skb = skb_copy(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001961 } else {
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03001962 tx_skb = skb_clone(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001963 }
1964
1965 if (!tx_skb) {
1966 l2cap_seq_list_clear(&chan->retrans_list);
1967 break;
1968 }
1969
1970 /* Update skb contents */
1971 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
1972 put_unaligned_le32(__pack_extended_control(&control),
1973 tx_skb->data + L2CAP_HDR_SIZE);
1974 } else {
1975 put_unaligned_le16(__pack_enhanced_control(&control),
1976 tx_skb->data + L2CAP_HDR_SIZE);
1977 }
1978
Lukasz Rymanowski13cac152014-08-14 09:35:34 +02001979 /* Update FCS */
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001980 if (chan->fcs == L2CAP_FCS_CRC16) {
Lukasz Rymanowski13cac152014-08-14 09:35:34 +02001981 u16 fcs = crc16(0, (u8 *) tx_skb->data,
1982 tx_skb->len - L2CAP_FCS_SIZE);
1983 put_unaligned_le16(fcs, skb_tail_pointer(tx_skb) -
1984 L2CAP_FCS_SIZE);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001985 }
1986
1987 l2cap_do_send(chan, tx_skb);
1988
1989 BT_DBG("Resent txseq %d", control.txseq);
1990
1991 chan->last_acked_seq = chan->buffer_seq;
1992 }
1993}
1994
Mat Martineauf80842a2012-05-17 20:53:46 -07001995static void l2cap_retransmit(struct l2cap_chan *chan,
1996 struct l2cap_ctrl *control)
1997{
1998 BT_DBG("chan %p, control %p", chan, control);
1999
2000 l2cap_seq_list_append(&chan->retrans_list, control->reqseq);
2001 l2cap_ertm_resend(chan);
2002}
2003
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002004static void l2cap_retransmit_all(struct l2cap_chan *chan,
2005 struct l2cap_ctrl *control)
2006{
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002007 struct sk_buff *skb;
2008
2009 BT_DBG("chan %p, control %p", chan, control);
2010
2011 if (control->poll)
2012 set_bit(CONN_SEND_FBIT, &chan->conn_state);
2013
2014 l2cap_seq_list_clear(&chan->retrans_list);
2015
2016 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
2017 return;
2018
2019 if (chan->unacked_frames) {
2020 skb_queue_walk(&chan->tx_q, skb) {
2021 if (bt_cb(skb)->control.txseq == control->reqseq ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01002022 skb == chan->tx_send_head)
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002023 break;
2024 }
2025
2026 skb_queue_walk_from(&chan->tx_q, skb) {
2027 if (skb == chan->tx_send_head)
2028 break;
2029
2030 l2cap_seq_list_append(&chan->retrans_list,
2031 bt_cb(skb)->control.txseq);
2032 }
2033
2034 l2cap_ertm_resend(chan);
2035 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002036}
2037
Szymon Jancb17e73b2012-01-11 10:59:47 +01002038static void l2cap_send_ack(struct l2cap_chan *chan)
2039{
Mat Martineau0a0aba42012-05-17 20:53:39 -07002040 struct l2cap_ctrl control;
2041 u16 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
2042 chan->last_acked_seq);
2043 int threshold;
2044
2045 BT_DBG("chan %p last_acked_seq %d buffer_seq %d",
2046 chan, chan->last_acked_seq, chan->buffer_seq);
2047
2048 memset(&control, 0, sizeof(control));
2049 control.sframe = 1;
2050
2051 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
2052 chan->rx_state == L2CAP_RX_STATE_RECV) {
2053 __clear_ack_timer(chan);
2054 control.super = L2CAP_SUPER_RNR;
2055 control.reqseq = chan->buffer_seq;
2056 l2cap_send_sframe(chan, &control);
2057 } else {
2058 if (!test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) {
2059 l2cap_ertm_send(chan);
2060 /* If any i-frames were sent, they included an ack */
2061 if (chan->buffer_seq == chan->last_acked_seq)
2062 frames_to_ack = 0;
2063 }
2064
Mat Martineauc20f8e32012-07-10 05:47:07 -07002065 /* Ack now if the window is 3/4ths full.
Mat Martineau0a0aba42012-05-17 20:53:39 -07002066 * Calculate without mul or div
2067 */
Mat Martineauc20f8e32012-07-10 05:47:07 -07002068 threshold = chan->ack_win;
Mat Martineau0a0aba42012-05-17 20:53:39 -07002069 threshold += threshold << 1;
2070 threshold >>= 2;
2071
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002072 BT_DBG("frames_to_ack %u, threshold %d", frames_to_ack,
Mat Martineau0a0aba42012-05-17 20:53:39 -07002073 threshold);
2074
2075 if (frames_to_ack >= threshold) {
2076 __clear_ack_timer(chan);
2077 control.super = L2CAP_SUPER_RR;
2078 control.reqseq = chan->buffer_seq;
2079 l2cap_send_sframe(chan, &control);
2080 frames_to_ack = 0;
2081 }
2082
2083 if (frames_to_ack)
2084 __set_ack_timer(chan);
2085 }
Szymon Jancb17e73b2012-01-11 10:59:47 +01002086}
2087
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002088static inline int l2cap_skbuff_fromiovec(struct l2cap_chan *chan,
2089 struct msghdr *msg, int len,
2090 int count, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002091{
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002092 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002093 struct sk_buff **frag;
Gustavo Padovan90338942012-04-06 20:15:47 -03002094 int sent = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002095
Jukka Rissanen04988782014-06-18 16:37:07 +03002096 if (chan->ops->memcpy_fromiovec(chan, skb_put(skb, count),
2097 msg->msg_iov, count))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002098 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002099
2100 sent += count;
2101 len -= count;
2102
2103 /* Continuation fragments (no L2CAP header) */
2104 frag = &skb_shinfo(skb)->frag_list;
2105 while (len) {
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002106 struct sk_buff *tmp;
2107
Linus Torvalds1da177e2005-04-16 15:20:36 -07002108 count = min_t(unsigned int, conn->mtu, len);
2109
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002110 tmp = chan->ops->alloc_skb(chan, 0, count,
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002111 msg->msg_flags & MSG_DONTWAIT);
2112 if (IS_ERR(tmp))
2113 return PTR_ERR(tmp);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002114
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002115 *frag = tmp;
2116
Jukka Rissanen04988782014-06-18 16:37:07 +03002117 if (chan->ops->memcpy_fromiovec(chan, skb_put(*frag, count),
2118 msg->msg_iov, count))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002119 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002120
2121 sent += count;
2122 len -= count;
2123
Gustavo Padovan2d0ed3d2012-05-11 13:16:12 -03002124 skb->len += (*frag)->len;
2125 skb->data_len += (*frag)->len;
2126
Linus Torvalds1da177e2005-04-16 15:20:36 -07002127 frag = &(*frag)->next;
2128 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002129
2130 return sent;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002131}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002132
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002133static struct sk_buff *l2cap_create_connless_pdu(struct l2cap_chan *chan,
Marcel Holtmann8d463212014-06-05 15:22:51 +02002134 struct msghdr *msg, size_t len)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002135{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002136 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002137 struct sk_buff *skb;
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002138 int err, count, hlen = L2CAP_HDR_SIZE + L2CAP_PSMLEN_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002139 struct l2cap_hdr *lh;
2140
Marcel Holtmann8d463212014-06-05 15:22:51 +02002141 BT_DBG("chan %p psm 0x%2.2x len %zu", chan,
2142 __le16_to_cpu(chan->psm), len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002143
2144 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002145
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002146 skb = chan->ops->alloc_skb(chan, hlen, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002147 msg->msg_flags & MSG_DONTWAIT);
2148 if (IS_ERR(skb))
2149 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002150
2151 /* Create L2CAP header */
2152 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002153 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenkodaf6a78c2012-05-03 10:55:52 +03002154 lh->len = cpu_to_le16(len + L2CAP_PSMLEN_SIZE);
Marcel Holtmann43b1b8d2013-10-12 06:01:26 -07002155 put_unaligned(chan->psm, (__le16 *) skb_put(skb, L2CAP_PSMLEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002156
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002157 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002158 if (unlikely(err < 0)) {
2159 kfree_skb(skb);
2160 return ERR_PTR(err);
2161 }
2162 return skb;
2163}
2164
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002165static struct sk_buff *l2cap_create_basic_pdu(struct l2cap_chan *chan,
Marcel Holtmann8d463212014-06-05 15:22:51 +02002166 struct msghdr *msg, size_t len)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002167{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002168 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002169 struct sk_buff *skb;
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002170 int err, count;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002171 struct l2cap_hdr *lh;
2172
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002173 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002174
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002175 count = min_t(unsigned int, (conn->mtu - L2CAP_HDR_SIZE), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002176
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002177 skb = chan->ops->alloc_skb(chan, L2CAP_HDR_SIZE, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002178 msg->msg_flags & MSG_DONTWAIT);
2179 if (IS_ERR(skb))
2180 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002181
2182 /* Create L2CAP header */
2183 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002184 lh->cid = cpu_to_le16(chan->dcid);
Gustavo Padovan6ff9b5e2012-05-02 11:56:17 -03002185 lh->len = cpu_to_le16(len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002186
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002187 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002188 if (unlikely(err < 0)) {
2189 kfree_skb(skb);
2190 return ERR_PTR(err);
2191 }
2192 return skb;
2193}
2194
Luiz Augusto von Dentzab0ff762011-09-12 20:00:50 +03002195static struct sk_buff *l2cap_create_iframe_pdu(struct l2cap_chan *chan,
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002196 struct msghdr *msg, size_t len,
2197 u16 sdulen)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002198{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002199 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002200 struct sk_buff *skb;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002201 int err, count, hlen;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002202 struct l2cap_hdr *lh;
2203
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002204 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002205
Gustavo F. Padovan0ee0d202010-05-01 16:15:41 -03002206 if (!conn)
2207 return ERR_PTR(-ENOTCONN);
2208
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002209 hlen = __ertm_hdr_size(chan);
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002210
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002211 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002212 hlen += L2CAP_SDULEN_SIZE;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002213
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03002214 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002215 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03002216
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002217 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002218
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002219 skb = chan->ops->alloc_skb(chan, hlen, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002220 msg->msg_flags & MSG_DONTWAIT);
2221 if (IS_ERR(skb))
2222 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002223
2224 /* Create L2CAP header */
2225 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002226 lh->cid = cpu_to_le16(chan->dcid);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002227 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002228
Mat Martineau18a48e72012-05-17 20:53:34 -07002229 /* Control header is populated later */
2230 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
2231 put_unaligned_le32(0, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
2232 else
2233 put_unaligned_le16(0, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002234
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002235 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002236 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002237
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002238 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002239 if (unlikely(err < 0)) {
2240 kfree_skb(skb);
2241 return ERR_PTR(err);
2242 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03002243
Mat Martineau18a48e72012-05-17 20:53:34 -07002244 bt_cb(skb)->control.fcs = chan->fcs;
Mat Martineau3ce35142012-04-25 16:36:14 -07002245 bt_cb(skb)->control.retries = 0;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002246 return skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002247}
2248
Mat Martineau94122bb2012-05-02 09:42:02 -07002249static int l2cap_segment_sdu(struct l2cap_chan *chan,
2250 struct sk_buff_head *seg_queue,
2251 struct msghdr *msg, size_t len)
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002252{
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002253 struct sk_buff *skb;
Mat Martineau94122bb2012-05-02 09:42:02 -07002254 u16 sdu_len;
2255 size_t pdu_len;
Mat Martineau94122bb2012-05-02 09:42:02 -07002256 u8 sar;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002257
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002258 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002259
Mat Martineau94122bb2012-05-02 09:42:02 -07002260 /* It is critical that ERTM PDUs fit in a single HCI fragment,
2261 * so fragmented skbs are not used. The HCI layer's handling
2262 * of fragmented skbs is not compatible with ERTM's queueing.
2263 */
2264
2265 /* PDU size is derived from the HCI MTU */
2266 pdu_len = chan->conn->mtu;
2267
Mat Martineaua5495742012-10-23 15:24:21 -07002268 /* Constrain PDU size for BR/EDR connections */
2269 if (!chan->hs_hcon)
2270 pdu_len = min_t(size_t, pdu_len, L2CAP_BREDR_MAX_PAYLOAD);
Mat Martineau94122bb2012-05-02 09:42:02 -07002271
2272 /* Adjust for largest possible L2CAP overhead. */
Gustavo Padovan35d401d2012-05-25 18:57:05 -03002273 if (chan->fcs)
2274 pdu_len -= L2CAP_FCS_SIZE;
2275
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002276 pdu_len -= __ertm_hdr_size(chan);
Mat Martineau94122bb2012-05-02 09:42:02 -07002277
2278 /* Remote device may have requested smaller PDUs */
2279 pdu_len = min_t(size_t, pdu_len, chan->remote_mps);
2280
2281 if (len <= pdu_len) {
2282 sar = L2CAP_SAR_UNSEGMENTED;
2283 sdu_len = 0;
2284 pdu_len = len;
2285 } else {
2286 sar = L2CAP_SAR_START;
2287 sdu_len = len;
Mat Martineau94122bb2012-05-02 09:42:02 -07002288 }
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002289
2290 while (len > 0) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002291 skb = l2cap_create_iframe_pdu(chan, msg, pdu_len, sdu_len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002292
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002293 if (IS_ERR(skb)) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002294 __skb_queue_purge(seg_queue);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002295 return PTR_ERR(skb);
2296 }
2297
Mat Martineau94122bb2012-05-02 09:42:02 -07002298 bt_cb(skb)->control.sar = sar;
2299 __skb_queue_tail(seg_queue, skb);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002300
Mat Martineau94122bb2012-05-02 09:42:02 -07002301 len -= pdu_len;
Lukasz Rymanowski069cb272014-08-13 16:01:41 +02002302 if (sdu_len)
Mat Martineau94122bb2012-05-02 09:42:02 -07002303 sdu_len = 0;
Mat Martineau94122bb2012-05-02 09:42:02 -07002304
2305 if (len <= pdu_len) {
2306 sar = L2CAP_SAR_END;
2307 pdu_len = len;
2308 } else {
2309 sar = L2CAP_SAR_CONTINUE;
2310 }
2311 }
2312
Gustavo Padovanf0f62792012-05-29 13:29:17 -03002313 return 0;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002314}
2315
Johan Hedberg177f8f22013-05-31 17:54:51 +03002316static struct sk_buff *l2cap_create_le_flowctl_pdu(struct l2cap_chan *chan,
2317 struct msghdr *msg,
2318 size_t len, u16 sdulen)
2319{
2320 struct l2cap_conn *conn = chan->conn;
2321 struct sk_buff *skb;
2322 int err, count, hlen;
2323 struct l2cap_hdr *lh;
2324
2325 BT_DBG("chan %p len %zu", chan, len);
2326
2327 if (!conn)
2328 return ERR_PTR(-ENOTCONN);
2329
2330 hlen = L2CAP_HDR_SIZE;
2331
2332 if (sdulen)
2333 hlen += L2CAP_SDULEN_SIZE;
2334
2335 count = min_t(unsigned int, (conn->mtu - hlen), len);
2336
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002337 skb = chan->ops->alloc_skb(chan, hlen, count,
Johan Hedberg177f8f22013-05-31 17:54:51 +03002338 msg->msg_flags & MSG_DONTWAIT);
2339 if (IS_ERR(skb))
2340 return skb;
2341
2342 /* Create L2CAP header */
2343 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
2344 lh->cid = cpu_to_le16(chan->dcid);
2345 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
2346
2347 if (sdulen)
2348 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
2349
2350 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
2351 if (unlikely(err < 0)) {
2352 kfree_skb(skb);
2353 return ERR_PTR(err);
2354 }
2355
2356 return skb;
2357}
2358
2359static int l2cap_segment_le_sdu(struct l2cap_chan *chan,
2360 struct sk_buff_head *seg_queue,
2361 struct msghdr *msg, size_t len)
2362{
2363 struct sk_buff *skb;
2364 size_t pdu_len;
2365 u16 sdu_len;
2366
2367 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
2368
Johan Hedberg177f8f22013-05-31 17:54:51 +03002369 sdu_len = len;
Johan Hedberg72c6fb92014-08-15 21:06:51 +03002370 pdu_len = chan->remote_mps - L2CAP_SDULEN_SIZE;
Johan Hedberg177f8f22013-05-31 17:54:51 +03002371
2372 while (len > 0) {
2373 if (len <= pdu_len)
2374 pdu_len = len;
2375
2376 skb = l2cap_create_le_flowctl_pdu(chan, msg, pdu_len, sdu_len);
2377 if (IS_ERR(skb)) {
2378 __skb_queue_purge(seg_queue);
2379 return PTR_ERR(skb);
2380 }
2381
2382 __skb_queue_tail(seg_queue, skb);
2383
2384 len -= pdu_len;
2385
2386 if (sdu_len) {
2387 sdu_len = 0;
2388 pdu_len += L2CAP_SDULEN_SIZE;
2389 }
2390 }
2391
2392 return 0;
2393}
2394
Marcel Holtmann8d463212014-06-05 15:22:51 +02002395int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002396{
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002397 struct sk_buff *skb;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002398 int err;
Mat Martineau94122bb2012-05-02 09:42:02 -07002399 struct sk_buff_head seg_queue;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002400
Seung-Woo Kim31e8ce82013-11-05 18:46:33 +09002401 if (!chan->conn)
2402 return -ENOTCONN;
2403
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002404 /* Connectionless channel */
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002405 if (chan->chan_type == L2CAP_CHAN_CONN_LESS) {
Marcel Holtmann8d463212014-06-05 15:22:51 +02002406 skb = l2cap_create_connless_pdu(chan, msg, len);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002407 if (IS_ERR(skb))
2408 return PTR_ERR(skb);
2409
Andrzej Kaczmarekede81a22014-02-25 17:16:22 +01002410 /* Channel lock is released before requesting new skb and then
2411 * reacquired thus we need to recheck channel state.
2412 */
2413 if (chan->state != BT_CONNECTED) {
2414 kfree_skb(skb);
2415 return -ENOTCONN;
2416 }
2417
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002418 l2cap_do_send(chan, skb);
2419 return len;
2420 }
2421
2422 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03002423 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedberg177f8f22013-05-31 17:54:51 +03002424 /* Check outgoing MTU */
2425 if (len > chan->omtu)
2426 return -EMSGSIZE;
2427
Johan Hedbergfad5fc892013-12-05 09:45:01 +02002428 if (!chan->tx_credits)
2429 return -EAGAIN;
2430
Johan Hedberg177f8f22013-05-31 17:54:51 +03002431 __skb_queue_head_init(&seg_queue);
2432
2433 err = l2cap_segment_le_sdu(chan, &seg_queue, msg, len);
2434
2435 if (chan->state != BT_CONNECTED) {
2436 __skb_queue_purge(&seg_queue);
2437 err = -ENOTCONN;
2438 }
2439
2440 if (err)
2441 return err;
2442
2443 skb_queue_splice_tail_init(&seg_queue, &chan->tx_q);
2444
2445 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
2446 l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
2447 chan->tx_credits--;
2448 }
2449
2450 if (!chan->tx_credits)
2451 chan->ops->suspend(chan);
2452
2453 err = len;
2454
2455 break;
2456
Johan Hedbergfad5fc892013-12-05 09:45:01 +02002457 case L2CAP_MODE_BASIC:
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002458 /* Check outgoing MTU */
2459 if (len > chan->omtu)
2460 return -EMSGSIZE;
2461
2462 /* Create a basic PDU */
Marcel Holtmann8d463212014-06-05 15:22:51 +02002463 skb = l2cap_create_basic_pdu(chan, msg, len);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002464 if (IS_ERR(skb))
2465 return PTR_ERR(skb);
2466
Andrzej Kaczmarekede81a22014-02-25 17:16:22 +01002467 /* Channel lock is released before requesting new skb and then
2468 * reacquired thus we need to recheck channel state.
2469 */
2470 if (chan->state != BT_CONNECTED) {
2471 kfree_skb(skb);
2472 return -ENOTCONN;
2473 }
2474
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002475 l2cap_do_send(chan, skb);
2476 err = len;
2477 break;
2478
2479 case L2CAP_MODE_ERTM:
2480 case L2CAP_MODE_STREAMING:
Mat Martineau94122bb2012-05-02 09:42:02 -07002481 /* Check outgoing MTU */
2482 if (len > chan->omtu) {
2483 err = -EMSGSIZE;
2484 break;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002485 }
2486
Mat Martineau94122bb2012-05-02 09:42:02 -07002487 __skb_queue_head_init(&seg_queue);
2488
2489 /* Do segmentation before calling in to the state machine,
2490 * since it's possible to block while waiting for memory
2491 * allocation.
2492 */
2493 err = l2cap_segment_sdu(chan, &seg_queue, msg, len);
2494
2495 /* The channel could have been closed while segmenting,
2496 * check that it is still connected.
2497 */
2498 if (chan->state != BT_CONNECTED) {
2499 __skb_queue_purge(&seg_queue);
2500 err = -ENOTCONN;
2501 }
2502
2503 if (err)
2504 break;
2505
Mat Martineau37339372012-05-17 20:53:33 -07002506 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo Padovand6603662012-05-21 13:58:22 -03002507 l2cap_tx(chan, NULL, &seg_queue, L2CAP_EV_DATA_REQUEST);
Mat Martineau37339372012-05-17 20:53:33 -07002508 else
Gustavo Padovand6603662012-05-21 13:58:22 -03002509 l2cap_streaming_send(chan, &seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002510
Gustavo Padovand6603662012-05-21 13:58:22 -03002511 err = len;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002512
Mat Martineau94122bb2012-05-02 09:42:02 -07002513 /* If the skbs were not queued for sending, they'll still be in
2514 * seg_queue and need to be purged.
2515 */
2516 __skb_queue_purge(&seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002517 break;
2518
2519 default:
2520 BT_DBG("bad state %1.1x", chan->mode);
2521 err = -EBADFD;
2522 }
2523
2524 return err;
2525}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +03002526EXPORT_SYMBOL_GPL(l2cap_chan_send);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002527
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002528static void l2cap_send_srej(struct l2cap_chan *chan, u16 txseq)
2529{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002530 struct l2cap_ctrl control;
2531 u16 seq;
2532
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002533 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002534
2535 memset(&control, 0, sizeof(control));
2536 control.sframe = 1;
2537 control.super = L2CAP_SUPER_SREJ;
2538
2539 for (seq = chan->expected_tx_seq; seq != txseq;
2540 seq = __next_seq(chan, seq)) {
2541 if (!l2cap_ertm_seq_in_queue(&chan->srej_q, seq)) {
2542 control.reqseq = seq;
2543 l2cap_send_sframe(chan, &control);
2544 l2cap_seq_list_append(&chan->srej_list, seq);
2545 }
2546 }
2547
2548 chan->expected_tx_seq = __next_seq(chan, txseq);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002549}
2550
2551static void l2cap_send_srej_tail(struct l2cap_chan *chan)
2552{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002553 struct l2cap_ctrl control;
2554
2555 BT_DBG("chan %p", chan);
2556
2557 if (chan->srej_list.tail == L2CAP_SEQ_LIST_CLEAR)
2558 return;
2559
2560 memset(&control, 0, sizeof(control));
2561 control.sframe = 1;
2562 control.super = L2CAP_SUPER_SREJ;
2563 control.reqseq = chan->srej_list.tail;
2564 l2cap_send_sframe(chan, &control);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002565}
2566
2567static void l2cap_send_srej_list(struct l2cap_chan *chan, u16 txseq)
2568{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002569 struct l2cap_ctrl control;
2570 u16 initial_head;
2571 u16 seq;
2572
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002573 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002574
2575 memset(&control, 0, sizeof(control));
2576 control.sframe = 1;
2577 control.super = L2CAP_SUPER_SREJ;
2578
2579 /* Capture initial list head to allow only one pass through the list. */
2580 initial_head = chan->srej_list.head;
2581
2582 do {
2583 seq = l2cap_seq_list_pop(&chan->srej_list);
2584 if (seq == txseq || seq == L2CAP_SEQ_LIST_CLEAR)
2585 break;
2586
2587 control.reqseq = seq;
2588 l2cap_send_sframe(chan, &control);
2589 l2cap_seq_list_append(&chan->srej_list, seq);
2590 } while (chan->srej_list.head != initial_head);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002591}
2592
Mat Martineau608bcc62012-05-17 20:53:32 -07002593static void l2cap_process_reqseq(struct l2cap_chan *chan, u16 reqseq)
2594{
2595 struct sk_buff *acked_skb;
2596 u16 ackseq;
2597
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002598 BT_DBG("chan %p, reqseq %u", chan, reqseq);
Mat Martineau608bcc62012-05-17 20:53:32 -07002599
2600 if (chan->unacked_frames == 0 || reqseq == chan->expected_ack_seq)
2601 return;
2602
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002603 BT_DBG("expected_ack_seq %u, unacked_frames %u",
Mat Martineau608bcc62012-05-17 20:53:32 -07002604 chan->expected_ack_seq, chan->unacked_frames);
2605
2606 for (ackseq = chan->expected_ack_seq; ackseq != reqseq;
2607 ackseq = __next_seq(chan, ackseq)) {
2608
2609 acked_skb = l2cap_ertm_seq_in_queue(&chan->tx_q, ackseq);
2610 if (acked_skb) {
2611 skb_unlink(acked_skb, &chan->tx_q);
2612 kfree_skb(acked_skb);
2613 chan->unacked_frames--;
2614 }
2615 }
2616
2617 chan->expected_ack_seq = reqseq;
2618
2619 if (chan->unacked_frames == 0)
2620 __clear_retrans_timer(chan);
2621
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002622 BT_DBG("unacked_frames %u", chan->unacked_frames);
Mat Martineau608bcc62012-05-17 20:53:32 -07002623}
2624
2625static void l2cap_abort_rx_srej_sent(struct l2cap_chan *chan)
2626{
2627 BT_DBG("chan %p", chan);
2628
2629 chan->expected_tx_seq = chan->buffer_seq;
2630 l2cap_seq_list_clear(&chan->srej_list);
2631 skb_queue_purge(&chan->srej_q);
2632 chan->rx_state = L2CAP_RX_STATE_RECV;
2633}
2634
Gustavo Padovand6603662012-05-21 13:58:22 -03002635static void l2cap_tx_state_xmit(struct l2cap_chan *chan,
2636 struct l2cap_ctrl *control,
2637 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002638{
Mat Martineau608bcc62012-05-17 20:53:32 -07002639 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2640 event);
2641
2642 switch (event) {
2643 case L2CAP_EV_DATA_REQUEST:
2644 if (chan->tx_send_head == NULL)
2645 chan->tx_send_head = skb_peek(skbs);
2646
2647 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2648 l2cap_ertm_send(chan);
2649 break;
2650 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2651 BT_DBG("Enter LOCAL_BUSY");
2652 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2653
2654 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2655 /* The SREJ_SENT state must be aborted if we are to
2656 * enter the LOCAL_BUSY state.
2657 */
2658 l2cap_abort_rx_srej_sent(chan);
2659 }
2660
2661 l2cap_send_ack(chan);
2662
2663 break;
2664 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2665 BT_DBG("Exit LOCAL_BUSY");
2666 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2667
2668 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2669 struct l2cap_ctrl local_control;
2670
2671 memset(&local_control, 0, sizeof(local_control));
2672 local_control.sframe = 1;
2673 local_control.super = L2CAP_SUPER_RR;
2674 local_control.poll = 1;
2675 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002676 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002677
2678 chan->retry_count = 1;
2679 __set_monitor_timer(chan);
2680 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2681 }
2682 break;
2683 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2684 l2cap_process_reqseq(chan, control->reqseq);
2685 break;
2686 case L2CAP_EV_EXPLICIT_POLL:
2687 l2cap_send_rr_or_rnr(chan, 1);
2688 chan->retry_count = 1;
2689 __set_monitor_timer(chan);
2690 __clear_ack_timer(chan);
2691 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2692 break;
2693 case L2CAP_EV_RETRANS_TO:
2694 l2cap_send_rr_or_rnr(chan, 1);
2695 chan->retry_count = 1;
2696 __set_monitor_timer(chan);
2697 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2698 break;
2699 case L2CAP_EV_RECV_FBIT:
2700 /* Nothing to process */
2701 break;
2702 default:
2703 break;
2704 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002705}
2706
Gustavo Padovand6603662012-05-21 13:58:22 -03002707static void l2cap_tx_state_wait_f(struct l2cap_chan *chan,
2708 struct l2cap_ctrl *control,
2709 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002710{
Mat Martineau608bcc62012-05-17 20:53:32 -07002711 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2712 event);
2713
2714 switch (event) {
2715 case L2CAP_EV_DATA_REQUEST:
2716 if (chan->tx_send_head == NULL)
2717 chan->tx_send_head = skb_peek(skbs);
2718 /* Queue data, but don't send. */
2719 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2720 break;
2721 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2722 BT_DBG("Enter LOCAL_BUSY");
2723 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2724
2725 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2726 /* The SREJ_SENT state must be aborted if we are to
2727 * enter the LOCAL_BUSY state.
2728 */
2729 l2cap_abort_rx_srej_sent(chan);
2730 }
2731
2732 l2cap_send_ack(chan);
2733
2734 break;
2735 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2736 BT_DBG("Exit LOCAL_BUSY");
2737 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2738
2739 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2740 struct l2cap_ctrl local_control;
2741 memset(&local_control, 0, sizeof(local_control));
2742 local_control.sframe = 1;
2743 local_control.super = L2CAP_SUPER_RR;
2744 local_control.poll = 1;
2745 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002746 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002747
2748 chan->retry_count = 1;
2749 __set_monitor_timer(chan);
2750 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2751 }
2752 break;
2753 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2754 l2cap_process_reqseq(chan, control->reqseq);
2755
2756 /* Fall through */
2757
2758 case L2CAP_EV_RECV_FBIT:
2759 if (control && control->final) {
2760 __clear_monitor_timer(chan);
2761 if (chan->unacked_frames > 0)
2762 __set_retrans_timer(chan);
2763 chan->retry_count = 0;
2764 chan->tx_state = L2CAP_TX_STATE_XMIT;
2765 BT_DBG("recv fbit tx_state 0x2.2%x", chan->tx_state);
2766 }
2767 break;
2768 case L2CAP_EV_EXPLICIT_POLL:
2769 /* Ignore */
2770 break;
2771 case L2CAP_EV_MONITOR_TO:
2772 if (chan->max_tx == 0 || chan->retry_count < chan->max_tx) {
2773 l2cap_send_rr_or_rnr(chan, 1);
2774 __set_monitor_timer(chan);
2775 chan->retry_count++;
2776 } else {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02002777 l2cap_send_disconn_req(chan, ECONNABORTED);
Mat Martineau608bcc62012-05-17 20:53:32 -07002778 }
2779 break;
2780 default:
2781 break;
2782 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002783}
2784
Gustavo Padovand6603662012-05-21 13:58:22 -03002785static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
2786 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002787{
Mat Martineau608bcc62012-05-17 20:53:32 -07002788 BT_DBG("chan %p, control %p, skbs %p, event %d, state %d",
2789 chan, control, skbs, event, chan->tx_state);
2790
2791 switch (chan->tx_state) {
2792 case L2CAP_TX_STATE_XMIT:
Gustavo Padovand6603662012-05-21 13:58:22 -03002793 l2cap_tx_state_xmit(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002794 break;
2795 case L2CAP_TX_STATE_WAIT_F:
Gustavo Padovand6603662012-05-21 13:58:22 -03002796 l2cap_tx_state_wait_f(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002797 break;
2798 default:
2799 /* Ignore event */
2800 break;
2801 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002802}
2803
Mat Martineau4b51dae92012-05-17 20:53:37 -07002804static void l2cap_pass_to_tx(struct l2cap_chan *chan,
2805 struct l2cap_ctrl *control)
2806{
2807 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002808 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_REQSEQ_AND_FBIT);
Mat Martineau4b51dae92012-05-17 20:53:37 -07002809}
2810
Mat Martineauf80842a2012-05-17 20:53:46 -07002811static void l2cap_pass_to_tx_fbit(struct l2cap_chan *chan,
2812 struct l2cap_ctrl *control)
2813{
2814 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002815 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_FBIT);
Mat Martineauf80842a2012-05-17 20:53:46 -07002816}
2817
Linus Torvalds1da177e2005-04-16 15:20:36 -07002818/* Copy frame to all raw sockets on that connection */
2819static void l2cap_raw_recv(struct l2cap_conn *conn, struct sk_buff *skb)
2820{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002821 struct sk_buff *nskb;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03002822 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002823
2824 BT_DBG("conn %p", conn);
2825
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002826 mutex_lock(&conn->chan_lock);
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002827
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002828 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002829 if (chan->chan_type != L2CAP_CHAN_RAW)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002830 continue;
2831
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002832 /* Don't send frame to the channel it came from */
2833 if (bt_cb(skb)->chan == chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002834 continue;
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002835
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002836 nskb = skb_clone(skb, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03002837 if (!nskb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002838 continue;
Gustavo Padovan80b98022012-05-27 22:27:51 -03002839 if (chan->ops->recv(chan, nskb))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002840 kfree_skb(nskb);
2841 }
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002842
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002843 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002844}
2845
2846/* ---- L2CAP signalling commands ---- */
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002847static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn, u8 code,
2848 u8 ident, u16 dlen, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002849{
2850 struct sk_buff *skb, **frag;
2851 struct l2cap_cmd_hdr *cmd;
2852 struct l2cap_hdr *lh;
2853 int len, count;
2854
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002855 BT_DBG("conn %p, code 0x%2.2x, ident 0x%2.2x, len %u",
2856 conn, code, ident, dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002857
Anderson Lizardo300b9622013-06-02 16:30:40 -04002858 if (conn->mtu < L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE)
2859 return NULL;
2860
Linus Torvalds1da177e2005-04-16 15:20:36 -07002861 len = L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE + dlen;
2862 count = min_t(unsigned int, conn->mtu, len);
2863
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002864 skb = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002865 if (!skb)
2866 return NULL;
2867
2868 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002869 lh->len = cpu_to_le16(L2CAP_CMD_HDR_SIZE + dlen);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002870
2871 if (conn->hcon->type == LE_LINK)
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002872 lh->cid = cpu_to_le16(L2CAP_CID_LE_SIGNALING);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002873 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002874 lh->cid = cpu_to_le16(L2CAP_CID_SIGNALING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002875
2876 cmd = (struct l2cap_cmd_hdr *) skb_put(skb, L2CAP_CMD_HDR_SIZE);
2877 cmd->code = code;
2878 cmd->ident = ident;
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002879 cmd->len = cpu_to_le16(dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002880
2881 if (dlen) {
2882 count -= L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE;
2883 memcpy(skb_put(skb, count), data, count);
2884 data += count;
2885 }
2886
2887 len -= skb->len;
2888
2889 /* Continuation fragments (no L2CAP header) */
2890 frag = &skb_shinfo(skb)->frag_list;
2891 while (len) {
2892 count = min_t(unsigned int, conn->mtu, len);
2893
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002894 *frag = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002895 if (!*frag)
2896 goto fail;
2897
2898 memcpy(skb_put(*frag, count), data, count);
2899
2900 len -= count;
2901 data += count;
2902
2903 frag = &(*frag)->next;
2904 }
2905
2906 return skb;
2907
2908fail:
2909 kfree_skb(skb);
2910 return NULL;
2911}
2912
Gustavo Padovan2d792812012-10-06 10:07:01 +01002913static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen,
2914 unsigned long *val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002915{
2916 struct l2cap_conf_opt *opt = *ptr;
2917 int len;
2918
2919 len = L2CAP_CONF_OPT_SIZE + opt->len;
2920 *ptr += len;
2921
2922 *type = opt->type;
2923 *olen = opt->len;
2924
2925 switch (opt->len) {
2926 case 1:
2927 *val = *((u8 *) opt->val);
2928 break;
2929
2930 case 2:
steven miaobfaaeb32010-10-16 18:29:47 -04002931 *val = get_unaligned_le16(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002932 break;
2933
2934 case 4:
steven miaobfaaeb32010-10-16 18:29:47 -04002935 *val = get_unaligned_le32(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002936 break;
2937
2938 default:
2939 *val = (unsigned long) opt->val;
2940 break;
2941 }
2942
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002943 BT_DBG("type 0x%2.2x len %u val 0x%lx", *type, opt->len, *val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002944 return len;
2945}
2946
Linus Torvalds1da177e2005-04-16 15:20:36 -07002947static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val)
2948{
2949 struct l2cap_conf_opt *opt = *ptr;
2950
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002951 BT_DBG("type 0x%2.2x len %u val 0x%lx", type, len, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002952
2953 opt->type = type;
2954 opt->len = len;
2955
2956 switch (len) {
2957 case 1:
2958 *((u8 *) opt->val) = val;
2959 break;
2960
2961 case 2:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02002962 put_unaligned_le16(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002963 break;
2964
2965 case 4:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02002966 put_unaligned_le32(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002967 break;
2968
2969 default:
2970 memcpy(opt->val, (void *) val, len);
2971 break;
2972 }
2973
2974 *ptr += L2CAP_CONF_OPT_SIZE + len;
2975}
2976
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03002977static void l2cap_add_opt_efs(void **ptr, struct l2cap_chan *chan)
2978{
2979 struct l2cap_conf_efs efs;
2980
Szymon Janc1ec918c2011-11-16 09:32:21 +01002981 switch (chan->mode) {
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03002982 case L2CAP_MODE_ERTM:
2983 efs.id = chan->local_id;
2984 efs.stype = chan->local_stype;
2985 efs.msdu = cpu_to_le16(chan->local_msdu);
2986 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002987 efs.acc_lat = cpu_to_le32(L2CAP_DEFAULT_ACC_LAT);
2988 efs.flush_to = cpu_to_le32(L2CAP_EFS_DEFAULT_FLUSH_TO);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03002989 break;
2990
2991 case L2CAP_MODE_STREAMING:
2992 efs.id = 1;
2993 efs.stype = L2CAP_SERV_BESTEFFORT;
2994 efs.msdu = cpu_to_le16(chan->local_msdu);
2995 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
2996 efs.acc_lat = 0;
2997 efs.flush_to = 0;
2998 break;
2999
3000 default:
3001 return;
3002 }
3003
3004 l2cap_add_conf_opt(ptr, L2CAP_CONF_EFS, sizeof(efs),
Andrei Emeltchenko8936fa62012-10-08 11:14:41 +03003005 (unsigned long) &efs);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003006}
3007
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003008static void l2cap_ack_timeout(struct work_struct *work)
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003009{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003010 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau03625202012-05-17 20:53:51 -07003011 ack_timer.work);
3012 u16 frames_to_ack;
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003013
Gustavo F. Padovan2fb9b3d2011-12-22 16:56:05 -02003014 BT_DBG("chan %p", chan);
3015
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003016 l2cap_chan_lock(chan);
3017
Mat Martineau03625202012-05-17 20:53:51 -07003018 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
3019 chan->last_acked_seq);
3020
3021 if (frames_to_ack)
3022 l2cap_send_rr_or_rnr(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003023
3024 l2cap_chan_unlock(chan);
Szymon Janc09bfb2e2012-01-11 10:59:49 +01003025 l2cap_chan_put(chan);
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003026}
3027
Andrei Emeltchenko466f8002012-05-29 13:59:01 +03003028int l2cap_ertm_init(struct l2cap_chan *chan)
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003029{
Mat Martineau3c588192012-04-11 10:48:42 -07003030 int err;
3031
Mat Martineau105bdf92012-04-27 16:50:48 -07003032 chan->next_tx_seq = 0;
3033 chan->expected_tx_seq = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003034 chan->expected_ack_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003035 chan->unacked_frames = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003036 chan->buffer_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003037 chan->frames_sent = 0;
Mat Martineau105bdf92012-04-27 16:50:48 -07003038 chan->last_acked_seq = 0;
3039 chan->sdu = NULL;
3040 chan->sdu_last_frag = NULL;
3041 chan->sdu_len = 0;
3042
Mat Martineaud34c34f2012-05-14 14:49:27 -07003043 skb_queue_head_init(&chan->tx_q);
3044
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003045 chan->local_amp_id = AMP_ID_BREDR;
3046 chan->move_id = AMP_ID_BREDR;
Mat Martineau08333282012-10-23 15:24:06 -07003047 chan->move_state = L2CAP_MOVE_STABLE;
3048 chan->move_role = L2CAP_MOVE_ROLE_NONE;
3049
Mat Martineau105bdf92012-04-27 16:50:48 -07003050 if (chan->mode != L2CAP_MODE_ERTM)
3051 return 0;
3052
3053 chan->rx_state = L2CAP_RX_STATE_RECV;
3054 chan->tx_state = L2CAP_TX_STATE_XMIT;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003055
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003056 INIT_DELAYED_WORK(&chan->retrans_timer, l2cap_retrans_timeout);
3057 INIT_DELAYED_WORK(&chan->monitor_timer, l2cap_monitor_timeout);
3058 INIT_DELAYED_WORK(&chan->ack_timer, l2cap_ack_timeout);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003059
Gustavo F. Padovanf1c67752011-03-25 20:36:10 -03003060 skb_queue_head_init(&chan->srej_q);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03003061
Mat Martineau3c588192012-04-11 10:48:42 -07003062 err = l2cap_seq_list_init(&chan->srej_list, chan->tx_win);
3063 if (err < 0)
3064 return err;
3065
Mat Martineau9dc9aff2012-05-17 16:20:14 -07003066 err = l2cap_seq_list_init(&chan->retrans_list, chan->remote_tx_win);
3067 if (err < 0)
3068 l2cap_seq_list_free(&chan->srej_list);
3069
3070 return err;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003071}
3072
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003073static inline __u8 l2cap_select_mode(__u8 mode, __u16 remote_feat_mask)
3074{
3075 switch (mode) {
3076 case L2CAP_MODE_STREAMING:
3077 case L2CAP_MODE_ERTM:
3078 if (l2cap_mode_supported(mode, remote_feat_mask))
3079 return mode;
3080 /* fall through */
3081 default:
3082 return L2CAP_MODE_BASIC;
3083 }
3084}
3085
Marcel Holtmann848566b2013-10-01 22:59:22 -07003086static inline bool __l2cap_ews_supported(struct l2cap_conn *conn)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003087{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003088 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003089}
3090
Marcel Holtmann848566b2013-10-01 22:59:22 -07003091static inline bool __l2cap_efs_supported(struct l2cap_conn *conn)
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003092{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003093 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_FLOW;
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003094}
3095
Mat Martineau36c86c82012-10-23 15:24:20 -07003096static void __l2cap_set_ertm_timeouts(struct l2cap_chan *chan,
3097 struct l2cap_conf_rfc *rfc)
3098{
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003099 if (chan->local_amp_id != AMP_ID_BREDR && chan->hs_hcon) {
Mat Martineau36c86c82012-10-23 15:24:20 -07003100 u64 ertm_to = chan->hs_hcon->hdev->amp_be_flush_to;
3101
3102 /* Class 1 devices have must have ERTM timeouts
3103 * exceeding the Link Supervision Timeout. The
3104 * default Link Supervision Timeout for AMP
3105 * controllers is 10 seconds.
3106 *
3107 * Class 1 devices use 0xffffffff for their
3108 * best-effort flush timeout, so the clamping logic
3109 * will result in a timeout that meets the above
3110 * requirement. ERTM timeouts are 16-bit values, so
3111 * the maximum timeout is 65.535 seconds.
3112 */
3113
3114 /* Convert timeout to milliseconds and round */
3115 ertm_to = DIV_ROUND_UP_ULL(ertm_to, 1000);
3116
3117 /* This is the recommended formula for class 2 devices
3118 * that start ERTM timers when packets are sent to the
3119 * controller.
3120 */
3121 ertm_to = 3 * ertm_to + 500;
3122
3123 if (ertm_to > 0xffff)
3124 ertm_to = 0xffff;
3125
3126 rfc->retrans_timeout = cpu_to_le16((u16) ertm_to);
3127 rfc->monitor_timeout = rfc->retrans_timeout;
3128 } else {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003129 rfc->retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO);
3130 rfc->monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO);
Mat Martineau36c86c82012-10-23 15:24:20 -07003131 }
3132}
3133
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003134static inline void l2cap_txwin_setup(struct l2cap_chan *chan)
3135{
3136 if (chan->tx_win > L2CAP_DEFAULT_TX_WINDOW &&
Marcel Holtmann848566b2013-10-01 22:59:22 -07003137 __l2cap_ews_supported(chan->conn)) {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003138 /* use extended control field */
3139 set_bit(FLAG_EXT_CTRL, &chan->flags);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003140 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
3141 } else {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003142 chan->tx_win = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003143 L2CAP_DEFAULT_TX_WINDOW);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003144 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
3145 }
Mat Martineauc20f8e32012-07-10 05:47:07 -07003146 chan->ack_win = chan->tx_win;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003147}
3148
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003149static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003150{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003151 struct l2cap_conf_req *req = data;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003152 struct l2cap_conf_rfc rfc = { .mode = chan->mode };
Linus Torvalds1da177e2005-04-16 15:20:36 -07003153 void *ptr = req->data;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003154 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003155
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03003156 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003157
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003158 if (chan->num_conf_req || chan->num_conf_rsp)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003159 goto done;
3160
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003161 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003162 case L2CAP_MODE_STREAMING:
3163 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003164 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state))
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003165 break;
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003166
Marcel Holtmann848566b2013-10-01 22:59:22 -07003167 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003168 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3169
Gustavo F. Padovan2ba13ed2010-06-09 16:39:05 -03003170 /* fall through */
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003171 default:
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003172 chan->mode = l2cap_select_mode(rfc.mode, chan->conn->feat_mask);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003173 break;
3174 }
3175
3176done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003177 if (chan->imtu != L2CAP_DEFAULT_MTU)
3178 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovan7990681c2011-01-24 16:01:43 -02003179
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003180 switch (chan->mode) {
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003181 case L2CAP_MODE_BASIC:
Marcel Holtmann6fea7ad2014-07-09 11:53:35 +02003182 if (disable_ertm)
3183 break;
3184
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003185 if (!(chan->conn->feat_mask & L2CAP_FEAT_ERTM) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003186 !(chan->conn->feat_mask & L2CAP_FEAT_STREAMING))
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003187 break;
3188
Gustavo F. Padovan62547752010-06-08 20:05:31 -03003189 rfc.mode = L2CAP_MODE_BASIC;
3190 rfc.txwin_size = 0;
3191 rfc.max_transmit = 0;
3192 rfc.retrans_timeout = 0;
3193 rfc.monitor_timeout = 0;
3194 rfc.max_pdu_size = 0;
3195
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003196 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003197 (unsigned long) &rfc);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003198 break;
3199
3200 case L2CAP_MODE_ERTM:
3201 rfc.mode = L2CAP_MODE_ERTM;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003202 rfc.max_transmit = chan->max_tx;
Mat Martineau36c86c82012-10-23 15:24:20 -07003203
3204 __l2cap_set_ertm_timeouts(chan, &rfc);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003205
3206 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003207 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3208 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003209 rfc.max_pdu_size = cpu_to_le16(size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003210
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003211 l2cap_txwin_setup(chan);
3212
3213 rfc.txwin_size = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003214 L2CAP_DEFAULT_TX_WINDOW);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003215
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003216 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003217 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003218
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003219 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3220 l2cap_add_opt_efs(&ptr, chan);
3221
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003222 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3223 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003224 chan->tx_win);
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003225
3226 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3227 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003228 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003229 chan->fcs = L2CAP_FCS_NONE;
3230 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3231 chan->fcs);
3232 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003233 break;
3234
3235 case L2CAP_MODE_STREAMING:
Mat Martineau273759e2012-05-17 20:53:53 -07003236 l2cap_txwin_setup(chan);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003237 rfc.mode = L2CAP_MODE_STREAMING;
3238 rfc.txwin_size = 0;
3239 rfc.max_transmit = 0;
3240 rfc.retrans_timeout = 0;
3241 rfc.monitor_timeout = 0;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003242
3243 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003244 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3245 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003246 rfc.max_pdu_size = cpu_to_le16(size);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003247
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003248 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003249 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003250
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003251 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3252 l2cap_add_opt_efs(&ptr, chan);
3253
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003254 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3255 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003256 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003257 chan->fcs = L2CAP_FCS_NONE;
3258 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3259 chan->fcs);
3260 }
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003261 break;
3262 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003263
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003264 req->dcid = cpu_to_le16(chan->dcid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003265 req->flags = cpu_to_le16(0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003266
3267 return ptr - data;
3268}
3269
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003270static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003271{
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003272 struct l2cap_conf_rsp *rsp = data;
3273 void *ptr = rsp->data;
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003274 void *req = chan->conf_req;
3275 int len = chan->conf_len;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003276 int type, hint, olen;
3277 unsigned long val;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003278 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003279 struct l2cap_conf_efs efs;
3280 u8 remote_efs = 0;
Marcel Holtmann861d6882007-10-20 13:37:06 +02003281 u16 mtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003282 u16 result = L2CAP_CONF_SUCCESS;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003283 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003284
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003285 BT_DBG("chan %p", chan);
Marcel Holtmann820ae1b2006-11-18 22:15:00 +01003286
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003287 while (len >= L2CAP_CONF_OPT_SIZE) {
3288 len -= l2cap_get_conf_opt(&req, &type, &olen, &val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003289
Gustavo F. Padovan589d2742009-04-20 01:31:07 -03003290 hint = type & L2CAP_CONF_HINT;
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07003291 type &= L2CAP_CONF_MASK;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003292
3293 switch (type) {
3294 case L2CAP_CONF_MTU:
Marcel Holtmann861d6882007-10-20 13:37:06 +02003295 mtu = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003296 break;
3297
3298 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003299 chan->flush_to = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003300 break;
3301
3302 case L2CAP_CONF_QOS:
3303 break;
3304
Marcel Holtmann6464f352007-10-20 13:39:51 +02003305 case L2CAP_CONF_RFC:
3306 if (olen == sizeof(rfc))
3307 memcpy(&rfc, (void *) val, olen);
3308 break;
3309
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003310 case L2CAP_CONF_FCS:
3311 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003312 set_bit(CONF_RECV_NO_FCS, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003313 break;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003314
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003315 case L2CAP_CONF_EFS:
3316 remote_efs = 1;
3317 if (olen == sizeof(efs))
3318 memcpy(&efs, (void *) val, olen);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003319 break;
3320
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003321 case L2CAP_CONF_EWS:
Marcel Holtmann848566b2013-10-01 22:59:22 -07003322 if (!chan->conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003323 return -ECONNREFUSED;
3324
3325 set_bit(FLAG_EXT_CTRL, &chan->flags);
3326 set_bit(CONF_EWS_RECV, &chan->conf_state);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003327 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003328 chan->remote_tx_win = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003329 break;
3330
3331 default:
3332 if (hint)
3333 break;
3334
3335 result = L2CAP_CONF_UNKNOWN;
3336 *((u8 *) ptr++) = type;
3337 break;
3338 }
3339 }
3340
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003341 if (chan->num_conf_rsp || chan->num_conf_req > 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003342 goto done;
3343
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003344 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003345 case L2CAP_MODE_STREAMING:
3346 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003347 if (!test_bit(CONF_STATE2_DEVICE, &chan->conf_state)) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003348 chan->mode = l2cap_select_mode(rfc.mode,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003349 chan->conn->feat_mask);
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003350 break;
3351 }
3352
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003353 if (remote_efs) {
Marcel Holtmann848566b2013-10-01 22:59:22 -07003354 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003355 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3356 else
3357 return -ECONNREFUSED;
3358 }
3359
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003360 if (chan->mode != rfc.mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003361 return -ECONNREFUSED;
Gustavo F. Padovan742e5192010-06-08 19:09:48 -03003362
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003363 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003364 }
3365
3366done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003367 if (chan->mode != rfc.mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003368 result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003369 rfc.mode = chan->mode;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003370
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003371 if (chan->num_conf_rsp == 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003372 return -ECONNREFUSED;
3373
Gustavo Padovan2d792812012-10-06 10:07:01 +01003374 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3375 (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003376 }
3377
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003378 if (result == L2CAP_CONF_SUCCESS) {
3379 /* Configure output options and let the other side know
3380 * which ones we don't like. */
3381
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003382 if (mtu < L2CAP_DEFAULT_MIN_MTU)
3383 result = L2CAP_CONF_UNACCEPT;
3384 else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003385 chan->omtu = mtu;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003386 set_bit(CONF_MTU_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003387 }
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003388 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->omtu);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003389
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003390 if (remote_efs) {
3391 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003392 efs.stype != L2CAP_SERV_NOTRAFIC &&
3393 efs.stype != chan->local_stype) {
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003394
3395 result = L2CAP_CONF_UNACCEPT;
3396
3397 if (chan->num_conf_req >= 1)
3398 return -ECONNREFUSED;
3399
3400 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003401 sizeof(efs),
3402 (unsigned long) &efs);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003403 } else {
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003404 /* Send PENDING Conf Rsp */
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003405 result = L2CAP_CONF_PENDING;
3406 set_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003407 }
3408 }
3409
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003410 switch (rfc.mode) {
3411 case L2CAP_MODE_BASIC:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003412 chan->fcs = L2CAP_FCS_NONE;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003413 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003414 break;
3415
3416 case L2CAP_MODE_ERTM:
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003417 if (!test_bit(CONF_EWS_RECV, &chan->conf_state))
3418 chan->remote_tx_win = rfc.txwin_size;
3419 else
3420 rfc.txwin_size = L2CAP_DEFAULT_TX_WINDOW;
3421
Gustavo F. Padovan2c03a7a2011-03-25 20:15:28 -03003422 chan->remote_max_tx = rfc.max_transmit;
Mat Martineau86b1b262010-08-05 15:54:22 -07003423
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003424 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003425 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3426 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003427 rfc.max_pdu_size = cpu_to_le16(size);
3428 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003429
Mat Martineau36c86c82012-10-23 15:24:20 -07003430 __l2cap_set_ertm_timeouts(chan, &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003431
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003432 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003433
3434 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003435 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003436
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003437 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3438 chan->remote_id = efs.id;
3439 chan->remote_stype = efs.stype;
3440 chan->remote_msdu = le16_to_cpu(efs.msdu);
3441 chan->remote_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003442 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003443 chan->remote_acc_lat =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003444 le32_to_cpu(efs.acc_lat);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003445 chan->remote_sdu_itime =
3446 le32_to_cpu(efs.sdu_itime);
3447 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003448 sizeof(efs),
3449 (unsigned long) &efs);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003450 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003451 break;
3452
3453 case L2CAP_MODE_STREAMING:
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003454 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003455 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3456 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003457 rfc.max_pdu_size = cpu_to_le16(size);
3458 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003459
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003460 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003461
Gustavo Padovan2d792812012-10-06 10:07:01 +01003462 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3463 (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003464
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003465 break;
3466
3467 default:
Marcel Holtmann6464f352007-10-20 13:39:51 +02003468 result = L2CAP_CONF_UNACCEPT;
3469
3470 memset(&rfc, 0, sizeof(rfc));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003471 rfc.mode = chan->mode;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003472 }
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003473
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003474 if (result == L2CAP_CONF_SUCCESS)
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003475 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003476 }
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003477 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003478 rsp->result = cpu_to_le16(result);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003479 rsp->flags = cpu_to_le16(0);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003480
3481 return ptr - data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003482}
3483
Gustavo Padovan2d792812012-10-06 10:07:01 +01003484static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len,
3485 void *data, u16 *result)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003486{
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003487 struct l2cap_conf_req *req = data;
3488 void *ptr = req->data;
3489 int type, olen;
3490 unsigned long val;
Mat Martineau36e999a2011-12-08 17:23:21 -08003491 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003492 struct l2cap_conf_efs efs;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003493
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003494 BT_DBG("chan %p, rsp %p, len %d, req %p", chan, rsp, len, data);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003495
3496 while (len >= L2CAP_CONF_OPT_SIZE) {
3497 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3498
3499 switch (type) {
3500 case L2CAP_CONF_MTU:
3501 if (val < L2CAP_DEFAULT_MIN_MTU) {
3502 *result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003503 chan->imtu = L2CAP_DEFAULT_MIN_MTU;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003504 } else
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003505 chan->imtu = val;
3506 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003507 break;
3508
3509 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003510 chan->flush_to = val;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003511 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003512 2, chan->flush_to);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003513 break;
3514
3515 case L2CAP_CONF_RFC:
3516 if (olen == sizeof(rfc))
3517 memcpy(&rfc, (void *)val, olen);
3518
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003519 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003520 rfc.mode != chan->mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003521 return -ECONNREFUSED;
3522
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003523 chan->fcs = 0;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003524
3525 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003526 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003527 break;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003528
3529 case L2CAP_CONF_EWS:
Mat Martineauc20f8e32012-07-10 05:47:07 -07003530 chan->ack_win = min_t(u16, val, chan->ack_win);
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003531 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Mat Martineauc20f8e32012-07-10 05:47:07 -07003532 chan->tx_win);
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003533 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003534
3535 case L2CAP_CONF_EFS:
3536 if (olen == sizeof(efs))
3537 memcpy(&efs, (void *)val, olen);
3538
3539 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003540 efs.stype != L2CAP_SERV_NOTRAFIC &&
3541 efs.stype != chan->local_stype)
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003542 return -ECONNREFUSED;
3543
Gustavo Padovan2d792812012-10-06 10:07:01 +01003544 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS, sizeof(efs),
3545 (unsigned long) &efs);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003546 break;
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003547
3548 case L2CAP_CONF_FCS:
3549 if (*result == L2CAP_CONF_PENDING)
3550 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003551 set_bit(CONF_RECV_NO_FCS,
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003552 &chan->conf_state);
3553 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003554 }
3555 }
3556
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003557 if (chan->mode == L2CAP_MODE_BASIC && chan->mode != rfc.mode)
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003558 return -ECONNREFUSED;
3559
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003560 chan->mode = rfc.mode;
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003561
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003562 if (*result == L2CAP_CONF_SUCCESS || *result == L2CAP_CONF_PENDING) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003563 switch (rfc.mode) {
3564 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003565 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3566 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
3567 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003568 if (!test_bit(FLAG_EXT_CTRL, &chan->flags))
3569 chan->ack_win = min_t(u16, chan->ack_win,
3570 rfc.txwin_size);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003571
3572 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3573 chan->local_msdu = le16_to_cpu(efs.msdu);
3574 chan->local_sdu_itime =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003575 le32_to_cpu(efs.sdu_itime);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003576 chan->local_acc_lat = le32_to_cpu(efs.acc_lat);
3577 chan->local_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003578 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003579 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003580 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003581
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003582 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003583 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003584 }
3585 }
3586
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003587 req->dcid = cpu_to_le16(chan->dcid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003588 req->flags = cpu_to_le16(0);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003589
3590 return ptr - data;
3591}
3592
Gustavo Padovan2d792812012-10-06 10:07:01 +01003593static int l2cap_build_conf_rsp(struct l2cap_chan *chan, void *data,
3594 u16 result, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003595{
3596 struct l2cap_conf_rsp *rsp = data;
3597 void *ptr = rsp->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003598
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003599 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003600
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003601 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003602 rsp->result = cpu_to_le16(result);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003603 rsp->flags = cpu_to_le16(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003604
3605 return ptr - data;
3606}
3607
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003608void __l2cap_le_connect_rsp_defer(struct l2cap_chan *chan)
3609{
3610 struct l2cap_le_conn_rsp rsp;
3611 struct l2cap_conn *conn = chan->conn;
3612
3613 BT_DBG("chan %p", chan);
3614
3615 rsp.dcid = cpu_to_le16(chan->scid);
3616 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02003617 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03003618 rsp.credits = cpu_to_le16(chan->rx_credits);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003619 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003620
3621 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp),
3622 &rsp);
3623}
3624
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003625void __l2cap_connect_rsp_defer(struct l2cap_chan *chan)
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003626{
3627 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003628 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003629 u8 buf[128];
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003630 u8 rsp_code;
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003631
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003632 rsp.scid = cpu_to_le16(chan->dcid);
3633 rsp.dcid = cpu_to_le16(chan->scid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003634 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
3635 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003636
3637 if (chan->hs_hcon)
3638 rsp_code = L2CAP_CREATE_CHAN_RSP;
3639 else
3640 rsp_code = L2CAP_CONN_RSP;
3641
3642 BT_DBG("chan %p rsp_code %u", chan, rsp_code);
3643
3644 l2cap_send_cmd(conn, chan->ident, rsp_code, sizeof(rsp), &rsp);
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003645
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003646 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003647 return;
3648
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003649 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003650 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003651 chan->num_conf_req++;
3652}
3653
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003654static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len)
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003655{
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003656 int type, olen;
3657 unsigned long val;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003658 /* Use sane default values in case a misbehaving remote device
3659 * did not send an RFC or extended window size option.
3660 */
3661 u16 txwin_ext = chan->ack_win;
3662 struct l2cap_conf_rfc rfc = {
3663 .mode = chan->mode,
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003664 .retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO),
3665 .monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO),
Mat Martineauc20f8e32012-07-10 05:47:07 -07003666 .max_pdu_size = cpu_to_le16(chan->imtu),
3667 .txwin_size = min_t(u16, chan->ack_win, L2CAP_DEFAULT_TX_WINDOW),
3668 };
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003669
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003670 BT_DBG("chan %p, rsp %p, len %d", chan, rsp, len);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003671
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003672 if ((chan->mode != L2CAP_MODE_ERTM) && (chan->mode != L2CAP_MODE_STREAMING))
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003673 return;
3674
3675 while (len >= L2CAP_CONF_OPT_SIZE) {
3676 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3677
Mat Martineauc20f8e32012-07-10 05:47:07 -07003678 switch (type) {
3679 case L2CAP_CONF_RFC:
3680 if (olen == sizeof(rfc))
3681 memcpy(&rfc, (void *)val, olen);
Szymon Janc8f321f82012-06-08 11:33:33 +02003682 break;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003683 case L2CAP_CONF_EWS:
3684 txwin_ext = val;
3685 break;
3686 }
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003687 }
3688
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003689 switch (rfc.mode) {
3690 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003691 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3692 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003693 chan->mps = le16_to_cpu(rfc.max_pdu_size);
3694 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3695 chan->ack_win = min_t(u16, chan->ack_win, txwin_ext);
3696 else
3697 chan->ack_win = min_t(u16, chan->ack_win,
3698 rfc.txwin_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003699 break;
3700 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003701 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003702 }
3703}
3704
Gustavo Padovan2d792812012-10-06 10:07:01 +01003705static inline int l2cap_command_rej(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003706 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3707 u8 *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003708{
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003709 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003710
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003711 if (cmd_len < sizeof(*rej))
3712 return -EPROTO;
3713
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003714 if (rej->reason != L2CAP_REJ_NOT_UNDERSTOOD)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003715 return 0;
3716
3717 if ((conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003718 cmd->ident == conn->info_ident) {
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02003719 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann984947d2009-02-06 23:35:19 +01003720
3721 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01003722 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01003723
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003724 l2cap_conn_start(conn);
3725 }
3726
3727 return 0;
3728}
3729
Mat Martineau17009152012-10-23 15:24:07 -07003730static struct l2cap_chan *l2cap_connect(struct l2cap_conn *conn,
3731 struct l2cap_cmd_hdr *cmd,
3732 u8 *data, u8 rsp_code, u8 amp_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003733{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003734 struct l2cap_conn_req *req = (struct l2cap_conn_req *) data;
3735 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003736 struct l2cap_chan *chan = NULL, *pchan;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003737 int result, status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003738
3739 u16 dcid = 0, scid = __le16_to_cpu(req->scid);
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003740 __le16 psm = req->psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003741
Andrei Emeltchenko097db762012-03-09 14:16:17 +02003742 BT_DBG("psm 0x%2.2x scid 0x%4.4x", __le16_to_cpu(psm), scid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003743
3744 /* Check if we have socket listening on psm */
Marcel Holtmann6f59b902013-10-13 05:24:01 -07003745 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03003746 &conn->hcon->dst, ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003747 if (!pchan) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003748 result = L2CAP_CR_BAD_PSM;
3749 goto sendresp;
3750 }
3751
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003752 mutex_lock(&conn->chan_lock);
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003753 l2cap_chan_lock(pchan);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00003754
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003755 /* Check if the ACL is secure enough (if not SDP) */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003756 if (psm != cpu_to_le16(L2CAP_PSM_SDP) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003757 !hci_conn_check_link_mode(conn->hcon)) {
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02003758 conn->disc_reason = HCI_ERROR_AUTH_FAILURE;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003759 result = L2CAP_CR_SEC_BLOCK;
3760 goto response;
3761 }
3762
Linus Torvalds1da177e2005-04-16 15:20:36 -07003763 result = L2CAP_CR_NO_MEM;
3764
Gustavo Padovan2dfa1002012-05-27 22:27:58 -03003765 /* Check if we already have channel with that dcid */
3766 if (__l2cap_get_chan_by_dcid(conn, scid))
3767 goto response;
3768
Gustavo Padovan80b98022012-05-27 22:27:51 -03003769 chan = pchan->ops->new_connection(pchan);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03003770 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003771 goto response;
3772
Syam Sidhardhan330b6c12013-08-06 01:59:12 +09003773 /* For certain devices (ex: HID mouse), support for authentication,
3774 * pairing and bonding is optional. For such devices, inorder to avoid
3775 * the ACL alive for too long after L2CAP disconnection, reset the ACL
3776 * disc_timeout back to HCI_DISCONN_TIMEOUT during L2CAP connect.
3777 */
3778 conn->hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
3779
Marcel Holtmann7eafc592013-10-13 08:12:47 -07003780 bacpy(&chan->src, &conn->hcon->src);
3781 bacpy(&chan->dst, &conn->hcon->dst);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -07003782 chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type);
3783 chan->dst_type = bdaddr_type(conn->hcon, conn->hcon->dst_type);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003784 chan->psm = psm;
3785 chan->dcid = scid;
Mat Martineau17009152012-10-23 15:24:07 -07003786 chan->local_amp_id = amp_id;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003787
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003788 __l2cap_chan_add(conn, chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003789
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003790 dcid = chan->scid;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003791
Gustavo Padovan8d836d72013-10-15 19:24:47 -03003792 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003793
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003794 chan->ident = cmd->ident;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003795
Marcel Holtmann984947d2009-02-06 23:35:19 +01003796 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) {
Johan Hedberge7cafc42014-07-17 15:35:38 +03003797 if (l2cap_chan_check_security(chan, false)) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07003798 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003799 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003800 result = L2CAP_CR_PEND;
3801 status = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08003802 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003803 } else {
Mat Martineau17009152012-10-23 15:24:07 -07003804 /* Force pending result for AMP controllers.
3805 * The connection will succeed after the
3806 * physical link is up.
3807 */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003808 if (amp_id == AMP_ID_BREDR) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003809 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau17009152012-10-23 15:24:07 -07003810 result = L2CAP_CR_SUCCESS;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003811 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003812 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003813 result = L2CAP_CR_PEND;
Mat Martineau17009152012-10-23 15:24:07 -07003814 }
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003815 status = L2CAP_CS_NO_INFO;
3816 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003817 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003818 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003819 result = L2CAP_CR_PEND;
3820 status = L2CAP_CS_AUTHEN_PEND;
3821 }
3822 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003823 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003824 result = L2CAP_CR_PEND;
3825 status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003826 }
3827
Linus Torvalds1da177e2005-04-16 15:20:36 -07003828response:
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003829 l2cap_chan_unlock(pchan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003830 mutex_unlock(&conn->chan_lock);
Johan Hedberga24cce12014-08-07 22:56:42 +03003831 l2cap_chan_put(pchan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003832
3833sendresp:
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003834 rsp.scid = cpu_to_le16(scid);
3835 rsp.dcid = cpu_to_le16(dcid);
3836 rsp.result = cpu_to_le16(result);
3837 rsp.status = cpu_to_le16(status);
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003838 l2cap_send_cmd(conn, cmd->ident, rsp_code, sizeof(rsp), &rsp);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003839
3840 if (result == L2CAP_CR_PEND && status == L2CAP_CS_NO_INFO) {
3841 struct l2cap_info_req info;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003842 info.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003843
3844 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
3845 conn->info_ident = l2cap_get_ident(conn);
3846
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08003847 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003848
Gustavo Padovan2d792812012-10-06 10:07:01 +01003849 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
3850 sizeof(info), &info);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003851 }
3852
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003853 if (chan && !test_bit(CONF_REQ_SENT, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003854 result == L2CAP_CR_SUCCESS) {
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003855 u8 buf[128];
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003856 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003857 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003858 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003859 chan->num_conf_req++;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003860 }
Mat Martineau17009152012-10-23 15:24:07 -07003861
3862 return chan;
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003863}
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003864
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003865static int l2cap_connect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003866 struct l2cap_cmd_hdr *cmd, u16 cmd_len, u8 *data)
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003867{
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303868 struct hci_dev *hdev = conn->hcon->hdev;
3869 struct hci_conn *hcon = conn->hcon;
3870
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003871 if (cmd_len < sizeof(struct l2cap_conn_req))
3872 return -EPROTO;
3873
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303874 hci_dev_lock(hdev);
3875 if (test_bit(HCI_MGMT, &hdev->dev_flags) &&
3876 !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &hcon->flags))
3877 mgmt_device_connected(hdev, &hcon->dst, hcon->type,
3878 hcon->dst_type, 0, NULL, 0,
3879 hcon->dev_class);
3880 hci_dev_unlock(hdev);
3881
Gustavo Padovan300229f2012-10-12 19:40:40 +08003882 l2cap_connect(conn, cmd, data, L2CAP_CONN_RSP, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003883 return 0;
3884}
3885
Mat Martineau5909cf32012-10-23 15:24:08 -07003886static int l2cap_connect_create_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003887 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3888 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003889{
3890 struct l2cap_conn_rsp *rsp = (struct l2cap_conn_rsp *) data;
3891 u16 scid, dcid, result, status;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003892 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003893 u8 req[128];
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003894 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003895
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003896 if (cmd_len < sizeof(*rsp))
3897 return -EPROTO;
3898
Linus Torvalds1da177e2005-04-16 15:20:36 -07003899 scid = __le16_to_cpu(rsp->scid);
3900 dcid = __le16_to_cpu(rsp->dcid);
3901 result = __le16_to_cpu(rsp->result);
3902 status = __le16_to_cpu(rsp->status);
3903
Andrei Emeltchenko1b009c92012-02-21 12:54:54 +02003904 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 +01003905 dcid, scid, result, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003906
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003907 mutex_lock(&conn->chan_lock);
3908
Linus Torvalds1da177e2005-04-16 15:20:36 -07003909 if (scid) {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003910 chan = __l2cap_get_chan_by_scid(conn, scid);
3911 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003912 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003913 goto unlock;
3914 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003915 } else {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003916 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
3917 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003918 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003919 goto unlock;
3920 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003921 }
3922
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003923 err = 0;
3924
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003925 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003926
Linus Torvalds1da177e2005-04-16 15:20:36 -07003927 switch (result) {
3928 case L2CAP_CR_SUCCESS:
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03003929 l2cap_state_change(chan, BT_CONFIG);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003930 chan->ident = 0;
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003931 chan->dcid = dcid;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003932 clear_bit(CONF_CONNECT_PEND, &chan->conf_state);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01003933
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003934 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003935 break;
3936
Linus Torvalds1da177e2005-04-16 15:20:36 -07003937 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003938 l2cap_build_conf_req(chan, req), req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003939 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003940 break;
3941
3942 case L2CAP_CR_PEND:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003943 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003944 break;
3945
3946 default:
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003947 l2cap_chan_del(chan, ECONNREFUSED);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003948 break;
3949 }
3950
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003951 l2cap_chan_unlock(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003952
3953unlock:
3954 mutex_unlock(&conn->chan_lock);
3955
3956 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003957}
3958
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003959static inline void set_default_fcs(struct l2cap_chan *chan)
Mat Martineau8c462b62010-08-24 15:35:42 -07003960{
3961 /* FCS is enabled only in ERTM or streaming mode, if one or both
3962 * sides request it.
3963 */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003964 if (chan->mode != L2CAP_MODE_ERTM && chan->mode != L2CAP_MODE_STREAMING)
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003965 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003966 else if (!test_bit(CONF_RECV_NO_FCS, &chan->conf_state))
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003967 chan->fcs = L2CAP_FCS_CRC16;
Mat Martineau8c462b62010-08-24 15:35:42 -07003968}
3969
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03003970static void l2cap_send_efs_conf_rsp(struct l2cap_chan *chan, void *data,
3971 u8 ident, u16 flags)
3972{
3973 struct l2cap_conn *conn = chan->conn;
3974
3975 BT_DBG("conn %p chan %p ident %d flags 0x%4.4x", conn, chan, ident,
3976 flags);
3977
3978 clear_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
3979 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
3980
3981 l2cap_send_cmd(conn, ident, L2CAP_CONF_RSP,
3982 l2cap_build_conf_rsp(chan, data,
3983 L2CAP_CONF_SUCCESS, flags), data);
3984}
3985
Johan Hedberg662d6522013-10-16 11:20:47 +03003986static void cmd_reject_invalid_cid(struct l2cap_conn *conn, u8 ident,
3987 u16 scid, u16 dcid)
3988{
3989 struct l2cap_cmd_rej_cid rej;
3990
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003991 rej.reason = cpu_to_le16(L2CAP_REJ_INVALID_CID);
Johan Hedberg662d6522013-10-16 11:20:47 +03003992 rej.scid = __cpu_to_le16(scid);
3993 rej.dcid = __cpu_to_le16(dcid);
3994
3995 l2cap_send_cmd(conn, ident, L2CAP_COMMAND_REJ, sizeof(rej), &rej);
3996}
3997
Gustavo Padovan2d792812012-10-06 10:07:01 +01003998static inline int l2cap_config_req(struct l2cap_conn *conn,
3999 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4000 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004001{
4002 struct l2cap_conf_req *req = (struct l2cap_conf_req *) data;
4003 u16 dcid, flags;
4004 u8 rsp[64];
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004005 struct l2cap_chan *chan;
Mat Martineau3c588192012-04-11 10:48:42 -07004006 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004007
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004008 if (cmd_len < sizeof(*req))
4009 return -EPROTO;
4010
Linus Torvalds1da177e2005-04-16 15:20:36 -07004011 dcid = __le16_to_cpu(req->dcid);
4012 flags = __le16_to_cpu(req->flags);
4013
4014 BT_DBG("dcid 0x%4.4x flags 0x%2.2x", dcid, flags);
4015
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004016 chan = l2cap_get_chan_by_scid(conn, dcid);
Johan Hedberg662d6522013-10-16 11:20:47 +03004017 if (!chan) {
4018 cmd_reject_invalid_cid(conn, cmd->ident, dcid, 0);
4019 return 0;
4020 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004021
David S. Miller033b1142011-07-21 13:38:42 -07004022 if (chan->state != BT_CONFIG && chan->state != BT_CONNECT2) {
Johan Hedberg662d6522013-10-16 11:20:47 +03004023 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4024 chan->dcid);
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004025 goto unlock;
Gustavo F. Padovandf6bd742010-06-14 02:26:15 -03004026 }
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004027
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004028 /* Reject if config buffer is too small. */
Al Viro88219a02007-07-29 00:17:25 -07004029 len = cmd_len - sizeof(*req);
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004030 if (chan->conf_len + len > sizeof(chan->conf_req)) {
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004031 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004032 l2cap_build_conf_rsp(chan, rsp,
4033 L2CAP_CONF_REJECT, flags), rsp);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004034 goto unlock;
4035 }
4036
4037 /* Store config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004038 memcpy(chan->conf_req + chan->conf_len, req->data, len);
4039 chan->conf_len += len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004040
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004041 if (flags & L2CAP_CONF_FLAG_CONTINUATION) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004042 /* Incomplete config. Send empty response. */
4043 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004044 l2cap_build_conf_rsp(chan, rsp,
4045 L2CAP_CONF_SUCCESS, flags), rsp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004046 goto unlock;
4047 }
4048
4049 /* Complete config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004050 len = l2cap_parse_conf_req(chan, rsp);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004051 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004052 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004053 goto unlock;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004054 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004055
Mat Martineau1500109b2012-10-23 15:24:15 -07004056 chan->ident = cmd->ident;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004057 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004058 chan->num_conf_rsp++;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004059
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004060 /* Reset config buffer. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004061 chan->conf_len = 0;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004062
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004063 if (!test_bit(CONF_OUTPUT_DONE, &chan->conf_state))
Marcel Holtmann876d9482007-10-20 13:35:42 +02004064 goto unlock;
4065
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004066 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004067 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004068
Mat Martineau105bdf92012-04-27 16:50:48 -07004069 if (chan->mode == L2CAP_MODE_ERTM ||
4070 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004071 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004072
Mat Martineau3c588192012-04-11 10:48:42 -07004073 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004074 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004075 else
4076 l2cap_chan_ready(chan);
4077
Marcel Holtmann876d9482007-10-20 13:35:42 +02004078 goto unlock;
4079 }
4080
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004081 if (!test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02004082 u8 buf[64];
Linus Torvalds1da177e2005-04-16 15:20:36 -07004083 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004084 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004085 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004086 }
4087
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004088 /* Got Conf Rsp PENDING from remote side and asume we sent
4089 Conf Rsp PENDING in the code above */
4090 if (test_bit(CONF_REM_CONF_PEND, &chan->conf_state) &&
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03004091 test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004092
4093 /* check compatibility */
4094
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004095 /* Send rsp for BR/EDR channel */
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004096 if (!chan->hs_hcon)
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004097 l2cap_send_efs_conf_rsp(chan, rsp, cmd->ident, flags);
4098 else
4099 chan->ident = cmd->ident;
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004100 }
4101
Linus Torvalds1da177e2005-04-16 15:20:36 -07004102unlock:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004103 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004104 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004105}
4106
Gustavo Padovan2d792812012-10-06 10:07:01 +01004107static inline int l2cap_config_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004108 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4109 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004110{
4111 struct l2cap_conf_rsp *rsp = (struct l2cap_conf_rsp *)data;
4112 u16 scid, flags, result;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004113 struct l2cap_chan *chan;
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004114 int len = cmd_len - sizeof(*rsp);
Mat Martineau3c588192012-04-11 10:48:42 -07004115 int err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004116
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004117 if (cmd_len < sizeof(*rsp))
4118 return -EPROTO;
4119
Linus Torvalds1da177e2005-04-16 15:20:36 -07004120 scid = __le16_to_cpu(rsp->scid);
4121 flags = __le16_to_cpu(rsp->flags);
4122 result = __le16_to_cpu(rsp->result);
4123
Andrei Emeltchenko61386cb2012-03-12 12:13:07 +02004124 BT_DBG("scid 0x%4.4x flags 0x%2.2x result 0x%2.2x len %d", scid, flags,
4125 result, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004126
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004127 chan = l2cap_get_chan_by_scid(conn, scid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004128 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004129 return 0;
4130
4131 switch (result) {
4132 case L2CAP_CONF_SUCCESS:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004133 l2cap_conf_rfc_get(chan, rsp->data, len);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004134 clear_bit(CONF_REM_CONF_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004135 break;
4136
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004137 case L2CAP_CONF_PENDING:
4138 set_bit(CONF_REM_CONF_PEND, &chan->conf_state);
4139
4140 if (test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
4141 char buf[64];
4142
4143 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004144 buf, &result);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004145 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004146 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004147 goto done;
4148 }
4149
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004150 if (!chan->hs_hcon) {
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004151 l2cap_send_efs_conf_rsp(chan, buf, cmd->ident,
4152 0);
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02004153 } else {
4154 if (l2cap_check_efs(chan)) {
4155 amp_create_logical_link(chan);
4156 chan->ident = cmd->ident;
4157 }
4158 }
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004159 }
4160 goto done;
4161
Linus Torvalds1da177e2005-04-16 15:20:36 -07004162 case L2CAP_CONF_UNACCEPT:
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004163 if (chan->num_conf_rsp <= L2CAP_CONF_MAX_CONF_RSP) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004164 char req[64];
4165
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004166 if (len > sizeof(req) - sizeof(struct l2cap_conf_req)) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004167 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004168 goto done;
4169 }
4170
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004171 /* throw out any old stored conf requests */
4172 result = L2CAP_CONF_SUCCESS;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03004173 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004174 req, &result);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004175 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004176 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004177 goto done;
4178 }
4179
4180 l2cap_send_cmd(conn, l2cap_get_ident(conn),
Gustavo Padovan2d792812012-10-06 10:07:01 +01004181 L2CAP_CONF_REQ, len, req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004182 chan->num_conf_req++;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004183 if (result != L2CAP_CONF_SUCCESS)
4184 goto done;
4185 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004186 }
4187
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09004188 default:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004189 l2cap_chan_set_err(chan, ECONNRESET);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +02004190
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08004191 __set_chan_timer(chan, L2CAP_DISC_REJ_TIMEOUT);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004192 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004193 goto done;
4194 }
4195
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004196 if (flags & L2CAP_CONF_FLAG_CONTINUATION)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004197 goto done;
4198
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004199 set_bit(CONF_INPUT_DONE, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004200
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004201 if (test_bit(CONF_OUTPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004202 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004203
Mat Martineau105bdf92012-04-27 16:50:48 -07004204 if (chan->mode == L2CAP_MODE_ERTM ||
4205 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004206 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004207
Mat Martineau3c588192012-04-11 10:48:42 -07004208 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004209 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004210 else
4211 l2cap_chan_ready(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004212 }
4213
4214done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004215 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004216 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004217}
4218
Gustavo Padovan2d792812012-10-06 10:07:01 +01004219static inline int l2cap_disconnect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004220 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4221 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004222{
4223 struct l2cap_disconn_req *req = (struct l2cap_disconn_req *) data;
4224 struct l2cap_disconn_rsp rsp;
4225 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004226 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004227
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004228 if (cmd_len != sizeof(*req))
4229 return -EPROTO;
4230
Linus Torvalds1da177e2005-04-16 15:20:36 -07004231 scid = __le16_to_cpu(req->scid);
4232 dcid = __le16_to_cpu(req->dcid);
4233
4234 BT_DBG("scid 0x%4.4x dcid 0x%4.4x", scid, dcid);
4235
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004236 mutex_lock(&conn->chan_lock);
4237
4238 chan = __l2cap_get_chan_by_scid(conn, dcid);
4239 if (!chan) {
4240 mutex_unlock(&conn->chan_lock);
Johan Hedberg662d6522013-10-16 11:20:47 +03004241 cmd_reject_invalid_cid(conn, cmd->ident, dcid, scid);
4242 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004243 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004244
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004245 l2cap_chan_lock(chan);
4246
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03004247 rsp.dcid = cpu_to_le16(chan->scid);
4248 rsp.scid = cpu_to_le16(chan->dcid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004249 l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp);
4250
Gustavo Padovan5ec1bbe2013-10-15 19:24:48 -03004251 chan->ops->set_shutdown(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004252
Mat Martineau61d6ef32012-04-27 16:50:50 -07004253 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004254 l2cap_chan_del(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004255
4256 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004257
Gustavo Padovan80b98022012-05-27 22:27:51 -03004258 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004259 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004260
4261 mutex_unlock(&conn->chan_lock);
4262
Linus Torvalds1da177e2005-04-16 15:20:36 -07004263 return 0;
4264}
4265
Gustavo Padovan2d792812012-10-06 10:07:01 +01004266static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004267 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4268 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004269{
4270 struct l2cap_disconn_rsp *rsp = (struct l2cap_disconn_rsp *) data;
4271 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004272 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004273
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004274 if (cmd_len != sizeof(*rsp))
4275 return -EPROTO;
4276
Linus Torvalds1da177e2005-04-16 15:20:36 -07004277 scid = __le16_to_cpu(rsp->scid);
4278 dcid = __le16_to_cpu(rsp->dcid);
4279
4280 BT_DBG("dcid 0x%4.4x scid 0x%4.4x", dcid, scid);
4281
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004282 mutex_lock(&conn->chan_lock);
4283
4284 chan = __l2cap_get_chan_by_scid(conn, scid);
4285 if (!chan) {
4286 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004287 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004288 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004289
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004290 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004291
Mat Martineau61d6ef32012-04-27 16:50:50 -07004292 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004293 l2cap_chan_del(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004294
4295 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004296
Gustavo Padovan80b98022012-05-27 22:27:51 -03004297 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004298 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004299
4300 mutex_unlock(&conn->chan_lock);
4301
Linus Torvalds1da177e2005-04-16 15:20:36 -07004302 return 0;
4303}
4304
Gustavo Padovan2d792812012-10-06 10:07:01 +01004305static inline int l2cap_information_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004306 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4307 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004308{
4309 struct l2cap_info_req *req = (struct l2cap_info_req *) data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004310 u16 type;
4311
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004312 if (cmd_len != sizeof(*req))
4313 return -EPROTO;
4314
Linus Torvalds1da177e2005-04-16 15:20:36 -07004315 type = __le16_to_cpu(req->type);
4316
4317 BT_DBG("type 0x%4.4x", type);
4318
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004319 if (type == L2CAP_IT_FEAT_MASK) {
4320 u8 buf[8];
Marcel Holtmann44dd46d2009-05-02 19:09:01 -07004321 u32 feat_mask = l2cap_feat_mask;
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004322 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004323 rsp->type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
4324 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03004325 if (!disable_ertm)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004326 feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING
Gustavo Padovan2d792812012-10-06 10:07:01 +01004327 | L2CAP_FEAT_FCS;
Marcel Holtmann848566b2013-10-01 22:59:22 -07004328 if (conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03004329 feat_mask |= L2CAP_FEAT_EXT_FLOW
Gustavo Padovan2d792812012-10-06 10:07:01 +01004330 | L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenkoa5fd6f32011-09-16 16:26:32 +03004331
Gustavo F. Padovan1b7bf4e2009-08-24 00:45:20 -03004332 put_unaligned_le32(feat_mask, rsp->data);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004333 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4334 buf);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004335 } else if (type == L2CAP_IT_FIXED_CHAN) {
4336 u8 buf[12];
4337 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Mat Martineau50a147c2011-11-02 16:18:34 -07004338
Marcel Holtmann848566b2013-10-01 22:59:22 -07004339 if (conn->hs_enabled)
Mat Martineau50a147c2011-11-02 16:18:34 -07004340 l2cap_fixed_chan[0] |= L2CAP_FC_A2MP;
4341 else
4342 l2cap_fixed_chan[0] &= ~L2CAP_FC_A2MP;
4343
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004344 rsp->type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
4345 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Andrei Emeltchenkoc6337ea2011-10-20 17:02:44 +03004346 memcpy(rsp->data, l2cap_fixed_chan, sizeof(l2cap_fixed_chan));
Gustavo Padovan2d792812012-10-06 10:07:01 +01004347 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4348 buf);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004349 } else {
4350 struct l2cap_info_rsp rsp;
4351 rsp.type = cpu_to_le16(type);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004352 rsp.result = cpu_to_le16(L2CAP_IR_NOTSUPP);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004353 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(rsp),
4354 &rsp);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004355 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004356
4357 return 0;
4358}
4359
Gustavo Padovan2d792812012-10-06 10:07:01 +01004360static inline int l2cap_information_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004361 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4362 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004363{
4364 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) data;
4365 u16 type, result;
4366
Jaganath Kanakkassery3f6fa3d2013-06-21 19:55:11 +05304367 if (cmd_len < sizeof(*rsp))
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004368 return -EPROTO;
4369
Linus Torvalds1da177e2005-04-16 15:20:36 -07004370 type = __le16_to_cpu(rsp->type);
4371 result = __le16_to_cpu(rsp->result);
4372
4373 BT_DBG("type 0x%4.4x result 0x%2.2x", type, result);
4374
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004375 /* L2CAP Info req/rsp are unbound to channels, add extra checks */
4376 if (cmd->ident != conn->info_ident ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01004377 conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004378 return 0;
4379
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02004380 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004381
Ville Tervoadb08ed2010-08-04 09:43:33 +03004382 if (result != L2CAP_IR_SUCCESS) {
4383 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4384 conn->info_ident = 0;
4385
4386 l2cap_conn_start(conn);
4387
4388 return 0;
4389 }
4390
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004391 switch (type) {
4392 case L2CAP_IT_FEAT_MASK:
Harvey Harrison83985312008-05-02 16:25:46 -07004393 conn->feat_mask = get_unaligned_le32(rsp->data);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004394
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07004395 if (conn->feat_mask & L2CAP_FEAT_FIXED_CHAN) {
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004396 struct l2cap_info_req req;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004397 req.type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004398
4399 conn->info_ident = l2cap_get_ident(conn);
4400
4401 l2cap_send_cmd(conn, conn->info_ident,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004402 L2CAP_INFO_REQ, sizeof(req), &req);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004403 } else {
4404 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4405 conn->info_ident = 0;
4406
4407 l2cap_conn_start(conn);
4408 }
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004409 break;
4410
4411 case L2CAP_IT_FIXED_CHAN:
4412 conn->fixed_chan_mask = rsp->data[0];
Marcel Holtmann984947d2009-02-06 23:35:19 +01004413 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004414 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004415
4416 l2cap_conn_start(conn);
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004417 break;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004418 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004419
Linus Torvalds1da177e2005-04-16 15:20:36 -07004420 return 0;
4421}
4422
Mat Martineau17009152012-10-23 15:24:07 -07004423static int l2cap_create_channel_req(struct l2cap_conn *conn,
4424 struct l2cap_cmd_hdr *cmd,
4425 u16 cmd_len, void *data)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004426{
4427 struct l2cap_create_chan_req *req = data;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004428 struct l2cap_create_chan_rsp rsp;
Mat Martineau17009152012-10-23 15:24:07 -07004429 struct l2cap_chan *chan;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004430 struct hci_dev *hdev;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004431 u16 psm, scid;
4432
4433 if (cmd_len != sizeof(*req))
4434 return -EPROTO;
4435
Marcel Holtmann848566b2013-10-01 22:59:22 -07004436 if (!conn->hs_enabled)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004437 return -EINVAL;
4438
4439 psm = le16_to_cpu(req->psm);
4440 scid = le16_to_cpu(req->scid);
4441
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004442 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 -07004443
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004444 /* For controller id 0 make BR/EDR connection */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004445 if (req->amp_id == AMP_ID_BREDR) {
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004446 l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4447 req->amp_id);
4448 return 0;
4449 }
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004450
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004451 /* Validate AMP controller id */
4452 hdev = hci_dev_get(req->amp_id);
4453 if (!hdev)
4454 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004455
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004456 if (hdev->dev_type != HCI_AMP || !test_bit(HCI_UP, &hdev->flags)) {
Mat Martineau17009152012-10-23 15:24:07 -07004457 hci_dev_put(hdev);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004458 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004459 }
4460
4461 chan = l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4462 req->amp_id);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004463 if (chan) {
4464 struct amp_mgr *mgr = conn->hcon->amp_mgr;
4465 struct hci_conn *hs_hcon;
4466
Marcel Holtmann98e0f7e2013-10-13 02:23:40 -07004467 hs_hcon = hci_conn_hash_lookup_ba(hdev, AMP_LINK,
4468 &conn->hcon->dst);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004469 if (!hs_hcon) {
4470 hci_dev_put(hdev);
Johan Hedberg662d6522013-10-16 11:20:47 +03004471 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4472 chan->dcid);
4473 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004474 }
4475
4476 BT_DBG("mgr %p bredr_chan %p hs_hcon %p", mgr, chan, hs_hcon);
4477
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004478 mgr->bredr_chan = chan;
4479 chan->hs_hcon = hs_hcon;
Andrei Emeltchenkofd45bf42012-11-20 17:16:22 +02004480 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004481 conn->mtu = hdev->block_mtu;
4482 }
4483
4484 hci_dev_put(hdev);
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004485
4486 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004487
4488error:
4489 rsp.dcid = 0;
4490 rsp.scid = cpu_to_le16(scid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004491 rsp.result = cpu_to_le16(L2CAP_CR_BAD_AMP);
4492 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004493
4494 l2cap_send_cmd(conn, cmd->ident, L2CAP_CREATE_CHAN_RSP,
4495 sizeof(rsp), &rsp);
4496
Johan Hedbergdc280802013-09-16 13:05:13 +03004497 return 0;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004498}
4499
Mat Martineau8eb200b2012-10-23 15:24:17 -07004500static void l2cap_send_move_chan_req(struct l2cap_chan *chan, u8 dest_amp_id)
4501{
4502 struct l2cap_move_chan_req req;
4503 u8 ident;
4504
4505 BT_DBG("chan %p, dest_amp_id %d", chan, dest_amp_id);
4506
4507 ident = l2cap_get_ident(chan->conn);
4508 chan->ident = ident;
4509
4510 req.icid = cpu_to_le16(chan->scid);
4511 req.dest_amp_id = dest_amp_id;
4512
4513 l2cap_send_cmd(chan->conn, ident, L2CAP_MOVE_CHAN_REQ, sizeof(req),
4514 &req);
4515
4516 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4517}
4518
Mat Martineau1500109b2012-10-23 15:24:15 -07004519static void l2cap_send_move_chan_rsp(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004520{
4521 struct l2cap_move_chan_rsp rsp;
4522
Mat Martineau1500109b2012-10-23 15:24:15 -07004523 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004524
Mat Martineau1500109b2012-10-23 15:24:15 -07004525 rsp.icid = cpu_to_le16(chan->dcid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004526 rsp.result = cpu_to_le16(result);
4527
Mat Martineau1500109b2012-10-23 15:24:15 -07004528 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_RSP,
4529 sizeof(rsp), &rsp);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004530}
4531
Mat Martineau5b155ef2012-10-23 15:24:14 -07004532static void l2cap_send_move_chan_cfm(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004533{
4534 struct l2cap_move_chan_cfm cfm;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004535
Mat Martineau5b155ef2012-10-23 15:24:14 -07004536 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004537
Mat Martineau5b155ef2012-10-23 15:24:14 -07004538 chan->ident = l2cap_get_ident(chan->conn);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004539
Mat Martineau5b155ef2012-10-23 15:24:14 -07004540 cfm.icid = cpu_to_le16(chan->scid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004541 cfm.result = cpu_to_le16(result);
4542
Mat Martineau5b155ef2012-10-23 15:24:14 -07004543 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_CFM,
4544 sizeof(cfm), &cfm);
4545
4546 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4547}
4548
4549static void l2cap_send_move_chan_cfm_icid(struct l2cap_conn *conn, u16 icid)
4550{
4551 struct l2cap_move_chan_cfm cfm;
4552
4553 BT_DBG("conn %p, icid 0x%4.4x", conn, icid);
4554
4555 cfm.icid = cpu_to_le16(icid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004556 cfm.result = cpu_to_le16(L2CAP_MC_UNCONFIRMED);
Mat Martineau5b155ef2012-10-23 15:24:14 -07004557
4558 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_MOVE_CHAN_CFM,
4559 sizeof(cfm), &cfm);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004560}
4561
4562static void l2cap_send_move_chan_cfm_rsp(struct l2cap_conn *conn, u8 ident,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004563 u16 icid)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004564{
4565 struct l2cap_move_chan_cfm_rsp rsp;
4566
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004567 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004568
4569 rsp.icid = cpu_to_le16(icid);
4570 l2cap_send_cmd(conn, ident, L2CAP_MOVE_CHAN_CFM_RSP, sizeof(rsp), &rsp);
4571}
4572
Mat Martineau5f3847a2012-10-23 15:24:12 -07004573static void __release_logical_link(struct l2cap_chan *chan)
4574{
4575 chan->hs_hchan = NULL;
4576 chan->hs_hcon = NULL;
4577
4578 /* Placeholder - release the logical link */
4579}
4580
Mat Martineau1500109b2012-10-23 15:24:15 -07004581static void l2cap_logical_fail(struct l2cap_chan *chan)
4582{
4583 /* Logical link setup failed */
4584 if (chan->state != BT_CONNECTED) {
4585 /* Create channel failure, disconnect */
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004586 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineau1500109b2012-10-23 15:24:15 -07004587 return;
4588 }
4589
4590 switch (chan->move_role) {
4591 case L2CAP_MOVE_ROLE_RESPONDER:
4592 l2cap_move_done(chan);
4593 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_SUPP);
4594 break;
4595 case L2CAP_MOVE_ROLE_INITIATOR:
4596 if (chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_COMP ||
4597 chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_CFM) {
4598 /* Remote has only sent pending or
4599 * success responses, clean up
4600 */
4601 l2cap_move_done(chan);
4602 }
4603
4604 /* Other amp move states imply that the move
4605 * has already aborted
4606 */
4607 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
4608 break;
4609 }
4610}
4611
4612static void l2cap_logical_finish_create(struct l2cap_chan *chan,
4613 struct hci_chan *hchan)
4614{
4615 struct l2cap_conf_rsp rsp;
Mat Martineau1500109b2012-10-23 15:24:15 -07004616
Andrei Emeltchenko336178a2012-10-31 15:46:27 +02004617 chan->hs_hchan = hchan;
Mat Martineau1500109b2012-10-23 15:24:15 -07004618 chan->hs_hcon->l2cap_data = chan->conn;
4619
Andrei Emeltchenko35ba9562012-10-25 15:20:43 +03004620 l2cap_send_efs_conf_rsp(chan, &rsp, chan->ident, 0);
Mat Martineau1500109b2012-10-23 15:24:15 -07004621
4622 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Andrei Emeltchenkofe79c6f2012-10-25 15:20:42 +03004623 int err;
Mat Martineau1500109b2012-10-23 15:24:15 -07004624
4625 set_default_fcs(chan);
4626
4627 err = l2cap_ertm_init(chan);
4628 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004629 l2cap_send_disconn_req(chan, -err);
Mat Martineau1500109b2012-10-23 15:24:15 -07004630 else
4631 l2cap_chan_ready(chan);
4632 }
4633}
4634
4635static void l2cap_logical_finish_move(struct l2cap_chan *chan,
4636 struct hci_chan *hchan)
4637{
4638 chan->hs_hcon = hchan->conn;
4639 chan->hs_hcon->l2cap_data = chan->conn;
4640
4641 BT_DBG("move_state %d", chan->move_state);
4642
4643 switch (chan->move_state) {
4644 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
4645 /* Move confirm will be sent after a success
4646 * response is received
4647 */
4648 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4649 break;
4650 case L2CAP_MOVE_WAIT_LOGICAL_CFM:
4651 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4652 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4653 } else if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
4654 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
4655 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
4656 } else if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4657 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4658 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4659 }
4660 break;
4661 default:
4662 /* Move was not in expected state, free the channel */
4663 __release_logical_link(chan);
4664
4665 chan->move_state = L2CAP_MOVE_STABLE;
4666 }
4667}
4668
4669/* Call with chan locked */
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004670void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan,
4671 u8 status)
Mat Martineau5b155ef2012-10-23 15:24:14 -07004672{
Mat Martineau1500109b2012-10-23 15:24:15 -07004673 BT_DBG("chan %p, hchan %p, status %d", chan, hchan, status);
4674
4675 if (status) {
4676 l2cap_logical_fail(chan);
4677 __release_logical_link(chan);
4678 return;
4679 }
4680
4681 if (chan->state != BT_CONNECTED) {
4682 /* Ignore logical link if channel is on BR/EDR */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004683 if (chan->local_amp_id != AMP_ID_BREDR)
Mat Martineau1500109b2012-10-23 15:24:15 -07004684 l2cap_logical_finish_create(chan, hchan);
4685 } else {
4686 l2cap_logical_finish_move(chan, hchan);
4687 }
Mat Martineau5b155ef2012-10-23 15:24:14 -07004688}
4689
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004690void l2cap_move_start(struct l2cap_chan *chan)
4691{
4692 BT_DBG("chan %p", chan);
4693
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004694 if (chan->local_amp_id == AMP_ID_BREDR) {
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004695 if (chan->chan_policy != BT_CHANNEL_POLICY_AMP_PREFERRED)
4696 return;
4697 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4698 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4699 /* Placeholder - start physical link setup */
4700 } else {
4701 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4702 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4703 chan->move_id = 0;
4704 l2cap_move_setup(chan);
4705 l2cap_send_move_chan_req(chan, 0);
4706 }
4707}
4708
Mat Martineau8eb200b2012-10-23 15:24:17 -07004709static void l2cap_do_create(struct l2cap_chan *chan, int result,
4710 u8 local_amp_id, u8 remote_amp_id)
4711{
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004712 BT_DBG("chan %p state %s %u -> %u", chan, state_to_string(chan->state),
4713 local_amp_id, remote_amp_id);
4714
Andrei Emeltchenko12d6cc62012-11-14 17:39:31 +02004715 chan->fcs = L2CAP_FCS_NONE;
4716
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004717 /* Outgoing channel on AMP */
4718 if (chan->state == BT_CONNECT) {
4719 if (result == L2CAP_CR_SUCCESS) {
4720 chan->local_amp_id = local_amp_id;
4721 l2cap_send_create_chan_req(chan, remote_amp_id);
4722 } else {
4723 /* Revert to BR/EDR connect */
4724 l2cap_send_conn_req(chan);
4725 }
4726
4727 return;
4728 }
4729
4730 /* Incoming channel on AMP */
4731 if (__l2cap_no_conn_pending(chan)) {
Mat Martineau8eb200b2012-10-23 15:24:17 -07004732 struct l2cap_conn_rsp rsp;
4733 char buf[128];
4734 rsp.scid = cpu_to_le16(chan->dcid);
4735 rsp.dcid = cpu_to_le16(chan->scid);
4736
Mat Martineau8eb200b2012-10-23 15:24:17 -07004737 if (result == L2CAP_CR_SUCCESS) {
4738 /* Send successful response */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004739 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
4740 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004741 } else {
4742 /* Send negative response */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004743 rsp.result = cpu_to_le16(L2CAP_CR_NO_MEM);
4744 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004745 }
4746
4747 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_RSP,
4748 sizeof(rsp), &rsp);
4749
4750 if (result == L2CAP_CR_SUCCESS) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02004751 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004752 set_bit(CONF_REQ_SENT, &chan->conf_state);
4753 l2cap_send_cmd(chan->conn, l2cap_get_ident(chan->conn),
4754 L2CAP_CONF_REQ,
4755 l2cap_build_conf_req(chan, buf), buf);
4756 chan->num_conf_req++;
4757 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004758 }
4759}
4760
4761static void l2cap_do_move_initiate(struct l2cap_chan *chan, u8 local_amp_id,
4762 u8 remote_amp_id)
4763{
4764 l2cap_move_setup(chan);
4765 chan->move_id = local_amp_id;
4766 chan->move_state = L2CAP_MOVE_WAIT_RSP;
4767
4768 l2cap_send_move_chan_req(chan, remote_amp_id);
4769}
4770
4771static void l2cap_do_move_respond(struct l2cap_chan *chan, int result)
4772{
4773 struct hci_chan *hchan = NULL;
4774
4775 /* Placeholder - get hci_chan for logical link */
4776
4777 if (hchan) {
4778 if (hchan->state == BT_CONNECTED) {
4779 /* Logical link is ready to go */
4780 chan->hs_hcon = hchan->conn;
4781 chan->hs_hcon->l2cap_data = chan->conn;
4782 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4783 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4784
4785 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
4786 } else {
4787 /* Wait for logical link to be ready */
4788 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4789 }
4790 } else {
4791 /* Logical link not available */
4792 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_ALLOWED);
4793 }
4794}
4795
4796static void l2cap_do_move_cancel(struct l2cap_chan *chan, int result)
4797{
4798 if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4799 u8 rsp_result;
4800 if (result == -EINVAL)
4801 rsp_result = L2CAP_MR_BAD_ID;
4802 else
4803 rsp_result = L2CAP_MR_NOT_ALLOWED;
4804
4805 l2cap_send_move_chan_rsp(chan, rsp_result);
4806 }
4807
4808 chan->move_role = L2CAP_MOVE_ROLE_NONE;
4809 chan->move_state = L2CAP_MOVE_STABLE;
4810
4811 /* Restart data transmission */
4812 l2cap_ertm_send(chan);
4813}
4814
Andrei Emeltchenkoa514b172012-11-14 17:39:30 +02004815/* Invoke with locked chan */
4816void __l2cap_physical_cfm(struct l2cap_chan *chan, int result)
Mat Martineau8eb200b2012-10-23 15:24:17 -07004817{
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004818 u8 local_amp_id = chan->local_amp_id;
Andrei Emeltchenkofffadc02012-11-01 15:37:03 +02004819 u8 remote_amp_id = chan->remote_amp_id;
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004820
Mat Martineau8eb200b2012-10-23 15:24:17 -07004821 BT_DBG("chan %p, result %d, local_amp_id %d, remote_amp_id %d",
4822 chan, result, local_amp_id, remote_amp_id);
4823
Mat Martineau8eb200b2012-10-23 15:24:17 -07004824 if (chan->state == BT_DISCONN || chan->state == BT_CLOSED) {
4825 l2cap_chan_unlock(chan);
4826 return;
4827 }
4828
4829 if (chan->state != BT_CONNECTED) {
4830 l2cap_do_create(chan, result, local_amp_id, remote_amp_id);
4831 } else if (result != L2CAP_MR_SUCCESS) {
4832 l2cap_do_move_cancel(chan, result);
4833 } else {
4834 switch (chan->move_role) {
4835 case L2CAP_MOVE_ROLE_INITIATOR:
4836 l2cap_do_move_initiate(chan, local_amp_id,
4837 remote_amp_id);
4838 break;
4839 case L2CAP_MOVE_ROLE_RESPONDER:
4840 l2cap_do_move_respond(chan, result);
4841 break;
4842 default:
4843 l2cap_do_move_cancel(chan, result);
4844 break;
4845 }
4846 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004847}
4848
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004849static inline int l2cap_move_channel_req(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004850 struct l2cap_cmd_hdr *cmd,
4851 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004852{
4853 struct l2cap_move_chan_req *req = data;
Mat Martineau1500109b2012-10-23 15:24:15 -07004854 struct l2cap_move_chan_rsp rsp;
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004855 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004856 u16 icid = 0;
4857 u16 result = L2CAP_MR_NOT_ALLOWED;
4858
4859 if (cmd_len != sizeof(*req))
4860 return -EPROTO;
4861
4862 icid = le16_to_cpu(req->icid);
4863
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004864 BT_DBG("icid 0x%4.4x, dest_amp_id %d", icid, req->dest_amp_id);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004865
Marcel Holtmann848566b2013-10-01 22:59:22 -07004866 if (!conn->hs_enabled)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004867 return -EINVAL;
4868
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004869 chan = l2cap_get_chan_by_dcid(conn, icid);
4870 if (!chan) {
Mat Martineau1500109b2012-10-23 15:24:15 -07004871 rsp.icid = cpu_to_le16(icid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004872 rsp.result = cpu_to_le16(L2CAP_MR_NOT_ALLOWED);
Mat Martineau1500109b2012-10-23 15:24:15 -07004873 l2cap_send_cmd(conn, cmd->ident, L2CAP_MOVE_CHAN_RSP,
4874 sizeof(rsp), &rsp);
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004875 return 0;
4876 }
4877
Mat Martineau1500109b2012-10-23 15:24:15 -07004878 chan->ident = cmd->ident;
4879
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004880 if (chan->scid < L2CAP_CID_DYN_START ||
4881 chan->chan_policy == BT_CHANNEL_POLICY_BREDR_ONLY ||
4882 (chan->mode != L2CAP_MODE_ERTM &&
4883 chan->mode != L2CAP_MODE_STREAMING)) {
4884 result = L2CAP_MR_NOT_ALLOWED;
4885 goto send_move_response;
4886 }
4887
4888 if (chan->local_amp_id == req->dest_amp_id) {
4889 result = L2CAP_MR_SAME_ID;
4890 goto send_move_response;
4891 }
4892
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004893 if (req->dest_amp_id != AMP_ID_BREDR) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004894 struct hci_dev *hdev;
4895 hdev = hci_dev_get(req->dest_amp_id);
4896 if (!hdev || hdev->dev_type != HCI_AMP ||
4897 !test_bit(HCI_UP, &hdev->flags)) {
4898 if (hdev)
4899 hci_dev_put(hdev);
4900
4901 result = L2CAP_MR_BAD_ID;
4902 goto send_move_response;
4903 }
4904 hci_dev_put(hdev);
4905 }
4906
4907 /* Detect a move collision. Only send a collision response
4908 * if this side has "lost", otherwise proceed with the move.
4909 * The winner has the larger bd_addr.
4910 */
4911 if ((__chan_is_moving(chan) ||
4912 chan->move_role != L2CAP_MOVE_ROLE_NONE) &&
Marcel Holtmann6f59b902013-10-13 05:24:01 -07004913 bacmp(&conn->hcon->src, &conn->hcon->dst) > 0) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004914 result = L2CAP_MR_COLLISION;
4915 goto send_move_response;
4916 }
4917
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004918 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
4919 l2cap_move_setup(chan);
4920 chan->move_id = req->dest_amp_id;
4921 icid = chan->dcid;
4922
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004923 if (req->dest_amp_id == AMP_ID_BREDR) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004924 /* Moving to BR/EDR */
4925 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4926 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4927 result = L2CAP_MR_PEND;
4928 } else {
4929 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4930 result = L2CAP_MR_SUCCESS;
4931 }
4932 } else {
4933 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4934 /* Placeholder - uncomment when amp functions are available */
4935 /*amp_accept_physical(chan, req->dest_amp_id);*/
4936 result = L2CAP_MR_PEND;
4937 }
4938
4939send_move_response:
Mat Martineau1500109b2012-10-23 15:24:15 -07004940 l2cap_send_move_chan_rsp(chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004941
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004942 l2cap_chan_unlock(chan);
4943
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004944 return 0;
4945}
4946
Mat Martineau5b155ef2012-10-23 15:24:14 -07004947static void l2cap_move_continue(struct l2cap_conn *conn, u16 icid, u16 result)
4948{
4949 struct l2cap_chan *chan;
4950 struct hci_chan *hchan = NULL;
4951
4952 chan = l2cap_get_chan_by_scid(conn, icid);
4953 if (!chan) {
4954 l2cap_send_move_chan_cfm_icid(conn, icid);
4955 return;
4956 }
4957
4958 __clear_chan_timer(chan);
4959 if (result == L2CAP_MR_PEND)
4960 __set_chan_timer(chan, L2CAP_MOVE_ERTX_TIMEOUT);
4961
4962 switch (chan->move_state) {
4963 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
4964 /* Move confirm will be sent when logical link
4965 * is complete.
4966 */
4967 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4968 break;
4969 case L2CAP_MOVE_WAIT_RSP_SUCCESS:
4970 if (result == L2CAP_MR_PEND) {
4971 break;
4972 } else if (test_bit(CONN_LOCAL_BUSY,
4973 &chan->conn_state)) {
4974 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4975 } else {
4976 /* Logical link is up or moving to BR/EDR,
4977 * proceed with move
4978 */
4979 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
4980 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
4981 }
4982 break;
4983 case L2CAP_MOVE_WAIT_RSP:
4984 /* Moving to AMP */
4985 if (result == L2CAP_MR_SUCCESS) {
4986 /* Remote is ready, send confirm immediately
4987 * after logical link is ready
4988 */
4989 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4990 } else {
4991 /* Both logical link and move success
4992 * are required to confirm
4993 */
4994 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_COMP;
4995 }
4996
4997 /* Placeholder - get hci_chan for logical link */
4998 if (!hchan) {
4999 /* Logical link not available */
5000 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5001 break;
5002 }
5003
5004 /* If the logical link is not yet connected, do not
5005 * send confirmation.
5006 */
5007 if (hchan->state != BT_CONNECTED)
5008 break;
5009
5010 /* Logical link is already ready to go */
5011
5012 chan->hs_hcon = hchan->conn;
5013 chan->hs_hcon->l2cap_data = chan->conn;
5014
5015 if (result == L2CAP_MR_SUCCESS) {
5016 /* Can confirm now */
5017 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
5018 } else {
5019 /* Now only need move success
5020 * to confirm
5021 */
5022 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
5023 }
5024
5025 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
5026 break;
5027 default:
5028 /* Any other amp move state means the move failed. */
5029 chan->move_id = chan->local_amp_id;
5030 l2cap_move_done(chan);
5031 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5032 }
5033
5034 l2cap_chan_unlock(chan);
5035}
5036
5037static void l2cap_move_fail(struct l2cap_conn *conn, u8 ident, u16 icid,
5038 u16 result)
5039{
5040 struct l2cap_chan *chan;
5041
5042 chan = l2cap_get_chan_by_ident(conn, ident);
5043 if (!chan) {
5044 /* Could not locate channel, icid is best guess */
5045 l2cap_send_move_chan_cfm_icid(conn, icid);
5046 return;
5047 }
5048
5049 __clear_chan_timer(chan);
5050
5051 if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
5052 if (result == L2CAP_MR_COLLISION) {
5053 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
5054 } else {
5055 /* Cleanup - cancel move */
5056 chan->move_id = chan->local_amp_id;
5057 l2cap_move_done(chan);
5058 }
5059 }
5060
5061 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5062
5063 l2cap_chan_unlock(chan);
5064}
5065
5066static int l2cap_move_channel_rsp(struct l2cap_conn *conn,
5067 struct l2cap_cmd_hdr *cmd,
5068 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005069{
5070 struct l2cap_move_chan_rsp *rsp = data;
5071 u16 icid, result;
5072
5073 if (cmd_len != sizeof(*rsp))
5074 return -EPROTO;
5075
5076 icid = le16_to_cpu(rsp->icid);
5077 result = le16_to_cpu(rsp->result);
5078
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005079 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005080
Mat Martineau5b155ef2012-10-23 15:24:14 -07005081 if (result == L2CAP_MR_SUCCESS || result == L2CAP_MR_PEND)
5082 l2cap_move_continue(conn, icid, result);
5083 else
5084 l2cap_move_fail(conn, cmd->ident, icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005085
5086 return 0;
5087}
5088
Mat Martineau5f3847a2012-10-23 15:24:12 -07005089static int l2cap_move_channel_confirm(struct l2cap_conn *conn,
5090 struct l2cap_cmd_hdr *cmd,
5091 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005092{
5093 struct l2cap_move_chan_cfm *cfm = data;
Mat Martineau5f3847a2012-10-23 15:24:12 -07005094 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005095 u16 icid, result;
5096
5097 if (cmd_len != sizeof(*cfm))
5098 return -EPROTO;
5099
5100 icid = le16_to_cpu(cfm->icid);
5101 result = le16_to_cpu(cfm->result);
5102
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005103 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005104
Mat Martineau5f3847a2012-10-23 15:24:12 -07005105 chan = l2cap_get_chan_by_dcid(conn, icid);
5106 if (!chan) {
5107 /* Spec requires a response even if the icid was not found */
5108 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5109 return 0;
5110 }
5111
5112 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM) {
5113 if (result == L2CAP_MC_CONFIRMED) {
5114 chan->local_amp_id = chan->move_id;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005115 if (chan->local_amp_id == AMP_ID_BREDR)
Mat Martineau5f3847a2012-10-23 15:24:12 -07005116 __release_logical_link(chan);
5117 } else {
5118 chan->move_id = chan->local_amp_id;
5119 }
5120
5121 l2cap_move_done(chan);
5122 }
5123
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005124 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5125
Mat Martineau5f3847a2012-10-23 15:24:12 -07005126 l2cap_chan_unlock(chan);
5127
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005128 return 0;
5129}
5130
5131static inline int l2cap_move_channel_confirm_rsp(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005132 struct l2cap_cmd_hdr *cmd,
5133 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005134{
5135 struct l2cap_move_chan_cfm_rsp *rsp = data;
Mat Martineau3fd71a02012-10-23 15:24:16 -07005136 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005137 u16 icid;
5138
5139 if (cmd_len != sizeof(*rsp))
5140 return -EPROTO;
5141
5142 icid = le16_to_cpu(rsp->icid);
5143
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005144 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005145
Mat Martineau3fd71a02012-10-23 15:24:16 -07005146 chan = l2cap_get_chan_by_scid(conn, icid);
5147 if (!chan)
5148 return 0;
5149
5150 __clear_chan_timer(chan);
5151
5152 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM_RSP) {
5153 chan->local_amp_id = chan->move_id;
5154
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005155 if (chan->local_amp_id == AMP_ID_BREDR && chan->hs_hchan)
Mat Martineau3fd71a02012-10-23 15:24:16 -07005156 __release_logical_link(chan);
5157
5158 l2cap_move_done(chan);
5159 }
5160
5161 l2cap_chan_unlock(chan);
5162
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005163 return 0;
5164}
5165
Claudio Takahaside731152011-02-11 19:28:55 -02005166static inline int l2cap_conn_param_update_req(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005167 struct l2cap_cmd_hdr *cmd,
Johan Hedberg203e6392013-05-15 10:07:15 +03005168 u16 cmd_len, u8 *data)
Claudio Takahaside731152011-02-11 19:28:55 -02005169{
5170 struct hci_conn *hcon = conn->hcon;
5171 struct l2cap_conn_param_update_req *req;
5172 struct l2cap_conn_param_update_rsp rsp;
Johan Hedberg203e6392013-05-15 10:07:15 +03005173 u16 min, max, latency, to_multiplier;
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005174 int err;
Claudio Takahaside731152011-02-11 19:28:55 -02005175
Johan Hedberg40bef302014-07-16 11:42:27 +03005176 if (hcon->role != HCI_ROLE_MASTER)
Claudio Takahaside731152011-02-11 19:28:55 -02005177 return -EINVAL;
5178
Claudio Takahaside731152011-02-11 19:28:55 -02005179 if (cmd_len != sizeof(struct l2cap_conn_param_update_req))
5180 return -EPROTO;
5181
5182 req = (struct l2cap_conn_param_update_req *) data;
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03005183 min = __le16_to_cpu(req->min);
5184 max = __le16_to_cpu(req->max);
Claudio Takahaside731152011-02-11 19:28:55 -02005185 latency = __le16_to_cpu(req->latency);
5186 to_multiplier = __le16_to_cpu(req->to_multiplier);
5187
5188 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 +01005189 min, max, latency, to_multiplier);
Claudio Takahaside731152011-02-11 19:28:55 -02005190
5191 memset(&rsp, 0, sizeof(rsp));
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005192
Andre Guedesd4905f22014-06-25 21:52:52 -03005193 err = hci_check_conn_params(min, max, latency, to_multiplier);
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005194 if (err)
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005195 rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_REJECTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005196 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005197 rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_ACCEPTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005198
5199 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONN_PARAM_UPDATE_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005200 sizeof(rsp), &rsp);
Claudio Takahaside731152011-02-11 19:28:55 -02005201
Andre Guedesffb5a8272014-07-01 18:10:11 -03005202 if (!err) {
Johan Hedbergf4869e22014-07-02 17:37:32 +03005203 u8 store_hint;
Andre Guedesffb5a8272014-07-01 18:10:11 -03005204
Johan Hedbergf4869e22014-07-02 17:37:32 +03005205 store_hint = hci_le_conn_update(hcon, min, max, latency,
5206 to_multiplier);
5207 mgmt_new_conn_param(hcon->hdev, &hcon->dst, hcon->dst_type,
5208 store_hint, min, max, latency,
5209 to_multiplier);
5210
Andre Guedesffb5a8272014-07-01 18:10:11 -03005211 }
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005212
Claudio Takahaside731152011-02-11 19:28:55 -02005213 return 0;
5214}
5215
Johan Hedbergf1496de2013-05-13 14:15:56 +03005216static int l2cap_le_connect_rsp(struct l2cap_conn *conn,
5217 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5218 u8 *data)
5219{
5220 struct l2cap_le_conn_rsp *rsp = (struct l2cap_le_conn_rsp *) data;
5221 u16 dcid, mtu, mps, credits, result;
5222 struct l2cap_chan *chan;
5223 int err;
5224
5225 if (cmd_len < sizeof(*rsp))
5226 return -EPROTO;
5227
5228 dcid = __le16_to_cpu(rsp->dcid);
5229 mtu = __le16_to_cpu(rsp->mtu);
5230 mps = __le16_to_cpu(rsp->mps);
5231 credits = __le16_to_cpu(rsp->credits);
5232 result = __le16_to_cpu(rsp->result);
5233
5234 if (result == L2CAP_CR_SUCCESS && (mtu < 23 || mps < 23))
5235 return -EPROTO;
5236
5237 BT_DBG("dcid 0x%4.4x mtu %u mps %u credits %u result 0x%2.2x",
5238 dcid, mtu, mps, credits, result);
5239
5240 mutex_lock(&conn->chan_lock);
5241
5242 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5243 if (!chan) {
5244 err = -EBADSLT;
5245 goto unlock;
5246 }
5247
5248 err = 0;
5249
5250 l2cap_chan_lock(chan);
5251
5252 switch (result) {
5253 case L2CAP_CR_SUCCESS:
5254 chan->ident = 0;
5255 chan->dcid = dcid;
5256 chan->omtu = mtu;
5257 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005258 chan->tx_credits = credits;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005259 l2cap_chan_ready(chan);
5260 break;
5261
5262 default:
5263 l2cap_chan_del(chan, ECONNREFUSED);
5264 break;
5265 }
5266
5267 l2cap_chan_unlock(chan);
5268
5269unlock:
5270 mutex_unlock(&conn->chan_lock);
5271
5272 return err;
5273}
5274
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005275static inline int l2cap_bredr_sig_cmd(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005276 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5277 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005278{
5279 int err = 0;
5280
5281 switch (cmd->code) {
5282 case L2CAP_COMMAND_REJ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005283 l2cap_command_rej(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005284 break;
5285
5286 case L2CAP_CONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005287 err = l2cap_connect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005288 break;
5289
5290 case L2CAP_CONN_RSP:
Mat Martineauf5a25982012-10-11 17:48:21 +03005291 case L2CAP_CREATE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005292 l2cap_connect_create_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005293 break;
5294
5295 case L2CAP_CONF_REQ:
5296 err = l2cap_config_req(conn, cmd, cmd_len, data);
5297 break;
5298
5299 case L2CAP_CONF_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005300 l2cap_config_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005301 break;
5302
5303 case L2CAP_DISCONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005304 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005305 break;
5306
5307 case L2CAP_DISCONN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005308 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005309 break;
5310
5311 case L2CAP_ECHO_REQ:
5312 l2cap_send_cmd(conn, cmd->ident, L2CAP_ECHO_RSP, cmd_len, data);
5313 break;
5314
5315 case L2CAP_ECHO_RSP:
5316 break;
5317
5318 case L2CAP_INFO_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005319 err = l2cap_information_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005320 break;
5321
5322 case L2CAP_INFO_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005323 l2cap_information_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005324 break;
5325
Mat Martineauf94ff6f2011-11-02 16:18:32 -07005326 case L2CAP_CREATE_CHAN_REQ:
5327 err = l2cap_create_channel_req(conn, cmd, cmd_len, data);
5328 break;
5329
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005330 case L2CAP_MOVE_CHAN_REQ:
5331 err = l2cap_move_channel_req(conn, cmd, cmd_len, data);
5332 break;
5333
5334 case L2CAP_MOVE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005335 l2cap_move_channel_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005336 break;
5337
5338 case L2CAP_MOVE_CHAN_CFM:
5339 err = l2cap_move_channel_confirm(conn, cmd, cmd_len, data);
5340 break;
5341
5342 case L2CAP_MOVE_CHAN_CFM_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005343 l2cap_move_channel_confirm_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005344 break;
5345
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005346 default:
5347 BT_ERR("Unknown BR/EDR signaling command 0x%2.2x", cmd->code);
5348 err = -EINVAL;
5349 break;
5350 }
5351
5352 return err;
5353}
5354
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005355static int l2cap_le_connect_req(struct l2cap_conn *conn,
5356 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5357 u8 *data)
5358{
5359 struct l2cap_le_conn_req *req = (struct l2cap_le_conn_req *) data;
5360 struct l2cap_le_conn_rsp rsp;
5361 struct l2cap_chan *chan, *pchan;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005362 u16 dcid, scid, credits, mtu, mps;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005363 __le16 psm;
5364 u8 result;
5365
5366 if (cmd_len != sizeof(*req))
5367 return -EPROTO;
5368
5369 scid = __le16_to_cpu(req->scid);
5370 mtu = __le16_to_cpu(req->mtu);
5371 mps = __le16_to_cpu(req->mps);
5372 psm = req->psm;
5373 dcid = 0;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005374 credits = 0;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005375
5376 if (mtu < 23 || mps < 23)
5377 return -EPROTO;
5378
5379 BT_DBG("psm 0x%2.2x scid 0x%4.4x mtu %u mps %u", __le16_to_cpu(psm),
5380 scid, mtu, mps);
5381
5382 /* Check if we have socket listening on psm */
5383 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
5384 &conn->hcon->dst, LE_LINK);
5385 if (!pchan) {
5386 result = L2CAP_CR_BAD_PSM;
5387 chan = NULL;
5388 goto response;
5389 }
5390
5391 mutex_lock(&conn->chan_lock);
5392 l2cap_chan_lock(pchan);
5393
5394 if (!smp_sufficient_security(conn->hcon, pchan->sec_level)) {
5395 result = L2CAP_CR_AUTHENTICATION;
5396 chan = NULL;
5397 goto response_unlock;
5398 }
5399
5400 /* Check if we already have channel with that dcid */
5401 if (__l2cap_get_chan_by_dcid(conn, scid)) {
5402 result = L2CAP_CR_NO_MEM;
5403 chan = NULL;
5404 goto response_unlock;
5405 }
5406
5407 chan = pchan->ops->new_connection(pchan);
5408 if (!chan) {
5409 result = L2CAP_CR_NO_MEM;
5410 goto response_unlock;
5411 }
5412
Johan Hedberg0ce43ce2013-12-05 14:55:33 +02005413 l2cap_le_flowctl_init(chan);
5414
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005415 bacpy(&chan->src, &conn->hcon->src);
5416 bacpy(&chan->dst, &conn->hcon->dst);
5417 chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type);
5418 chan->dst_type = bdaddr_type(conn->hcon, conn->hcon->dst_type);
5419 chan->psm = psm;
5420 chan->dcid = scid;
5421 chan->omtu = mtu;
5422 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005423 chan->tx_credits = __le16_to_cpu(req->credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005424
5425 __l2cap_chan_add(conn, chan);
5426 dcid = chan->scid;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005427 credits = chan->rx_credits;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005428
5429 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
5430
5431 chan->ident = cmd->ident;
5432
5433 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
5434 l2cap_state_change(chan, BT_CONNECT2);
5435 result = L2CAP_CR_PEND;
5436 chan->ops->defer(chan);
5437 } else {
5438 l2cap_chan_ready(chan);
5439 result = L2CAP_CR_SUCCESS;
5440 }
5441
5442response_unlock:
5443 l2cap_chan_unlock(pchan);
5444 mutex_unlock(&conn->chan_lock);
Johan Hedberga24cce12014-08-07 22:56:42 +03005445 l2cap_chan_put(pchan);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005446
5447 if (result == L2CAP_CR_PEND)
5448 return 0;
5449
5450response:
5451 if (chan) {
5452 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02005453 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005454 } else {
5455 rsp.mtu = 0;
5456 rsp.mps = 0;
5457 }
5458
5459 rsp.dcid = cpu_to_le16(dcid);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005460 rsp.credits = cpu_to_le16(credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005461 rsp.result = cpu_to_le16(result);
5462
5463 l2cap_send_cmd(conn, cmd->ident, L2CAP_LE_CONN_RSP, sizeof(rsp), &rsp);
5464
5465 return 0;
5466}
5467
Johan Hedbergfad5fc892013-12-05 09:45:01 +02005468static inline int l2cap_le_credits(struct l2cap_conn *conn,
5469 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5470 u8 *data)
5471{
5472 struct l2cap_le_credits *pkt;
5473 struct l2cap_chan *chan;
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005474 u16 cid, credits, max_credits;
Johan Hedbergfad5fc892013-12-05 09:45:01 +02005475
5476 if (cmd_len != sizeof(*pkt))
5477 return -EPROTO;
5478
5479 pkt = (struct l2cap_le_credits *) data;
5480 cid = __le16_to_cpu(pkt->cid);
5481 credits = __le16_to_cpu(pkt->credits);
5482
5483 BT_DBG("cid 0x%4.4x credits 0x%4.4x", cid, credits);
5484
5485 chan = l2cap_get_chan_by_dcid(conn, cid);
5486 if (!chan)
5487 return -EBADSLT;
5488
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005489 max_credits = LE_FLOWCTL_MAX_CREDITS - chan->tx_credits;
5490 if (credits > max_credits) {
5491 BT_ERR("LE credits overflow");
5492 l2cap_send_disconn_req(chan, ECONNRESET);
5493
5494 /* Return 0 so that we don't trigger an unnecessary
5495 * command reject packet.
5496 */
5497 return 0;
5498 }
5499
Johan Hedbergfad5fc892013-12-05 09:45:01 +02005500 chan->tx_credits += credits;
5501
5502 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
5503 l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
5504 chan->tx_credits--;
5505 }
5506
5507 if (chan->tx_credits)
5508 chan->ops->resume(chan);
5509
5510 l2cap_chan_unlock(chan);
5511
5512 return 0;
5513}
5514
Johan Hedberg71fb4192013-12-10 10:52:48 +02005515static inline int l2cap_le_command_rej(struct l2cap_conn *conn,
5516 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5517 u8 *data)
5518{
5519 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
5520 struct l2cap_chan *chan;
5521
5522 if (cmd_len < sizeof(*rej))
5523 return -EPROTO;
5524
5525 mutex_lock(&conn->chan_lock);
5526
5527 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5528 if (!chan)
5529 goto done;
5530
5531 l2cap_chan_lock(chan);
5532 l2cap_chan_del(chan, ECONNREFUSED);
5533 l2cap_chan_unlock(chan);
5534
5535done:
5536 mutex_unlock(&conn->chan_lock);
5537 return 0;
5538}
5539
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005540static inline int l2cap_le_sig_cmd(struct l2cap_conn *conn,
Johan Hedberg203e6392013-05-15 10:07:15 +03005541 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5542 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005543{
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005544 int err = 0;
5545
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005546 switch (cmd->code) {
5547 case L2CAP_COMMAND_REJ:
Johan Hedberg71fb4192013-12-10 10:52:48 +02005548 l2cap_le_command_rej(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005549 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005550
5551 case L2CAP_CONN_PARAM_UPDATE_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005552 err = l2cap_conn_param_update_req(conn, cmd, cmd_len, data);
5553 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005554
5555 case L2CAP_CONN_PARAM_UPDATE_RSP:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005556 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005557
Johan Hedbergf1496de2013-05-13 14:15:56 +03005558 case L2CAP_LE_CONN_RSP:
5559 l2cap_le_connect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005560 break;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005561
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005562 case L2CAP_LE_CONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005563 err = l2cap_le_connect_req(conn, cmd, cmd_len, data);
5564 break;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005565
Johan Hedbergfad5fc892013-12-05 09:45:01 +02005566 case L2CAP_LE_CREDITS:
5567 err = l2cap_le_credits(conn, cmd, cmd_len, data);
5568 break;
5569
Johan Hedberg3defe012013-05-15 10:16:06 +03005570 case L2CAP_DISCONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005571 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
5572 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005573
5574 case L2CAP_DISCONN_RSP:
5575 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005576 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005577
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005578 default:
5579 BT_ERR("Unknown LE signaling command 0x%2.2x", cmd->code);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005580 err = -EINVAL;
5581 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005582 }
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005583
5584 return err;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005585}
5586
Johan Hedbergc5623552013-04-29 19:35:33 +03005587static inline void l2cap_le_sig_channel(struct l2cap_conn *conn,
5588 struct sk_buff *skb)
5589{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005590 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005591 struct l2cap_cmd_hdr *cmd;
5592 u16 len;
Johan Hedbergc5623552013-04-29 19:35:33 +03005593 int err;
5594
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005595 if (hcon->type != LE_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005596 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005597
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005598 if (skb->len < L2CAP_CMD_HDR_SIZE)
5599 goto drop;
Johan Hedbergc5623552013-04-29 19:35:33 +03005600
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005601 cmd = (void *) skb->data;
5602 skb_pull(skb, L2CAP_CMD_HDR_SIZE);
Johan Hedbergc5623552013-04-29 19:35:33 +03005603
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005604 len = le16_to_cpu(cmd->len);
Johan Hedbergc5623552013-04-29 19:35:33 +03005605
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005606 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd->code, len, cmd->ident);
Johan Hedbergc5623552013-04-29 19:35:33 +03005607
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005608 if (len != skb->len || !cmd->ident) {
5609 BT_DBG("corrupted command");
5610 goto drop;
5611 }
Johan Hedbergc5623552013-04-29 19:35:33 +03005612
Johan Hedberg203e6392013-05-15 10:07:15 +03005613 err = l2cap_le_sig_cmd(conn, cmd, len, skb->data);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005614 if (err) {
5615 struct l2cap_cmd_rej_unk rej;
Johan Hedbergc5623552013-04-29 19:35:33 +03005616
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005617 BT_ERR("Wrong link type (%d)", err);
Johan Hedbergc5623552013-04-29 19:35:33 +03005618
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005619 rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005620 l2cap_send_cmd(conn, cmd->ident, L2CAP_COMMAND_REJ,
5621 sizeof(rej), &rej);
Johan Hedbergc5623552013-04-29 19:35:33 +03005622 }
5623
Marcel Holtmann3b166292013-10-02 08:28:21 -07005624drop:
Johan Hedbergc5623552013-04-29 19:35:33 +03005625 kfree_skb(skb);
5626}
5627
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005628static inline void l2cap_sig_channel(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005629 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005630{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005631 struct hci_conn *hcon = conn->hcon;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005632 u8 *data = skb->data;
5633 int len = skb->len;
5634 struct l2cap_cmd_hdr cmd;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005635 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005636
5637 l2cap_raw_recv(conn, skb);
5638
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005639 if (hcon->type != ACL_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005640 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005641
Linus Torvalds1da177e2005-04-16 15:20:36 -07005642 while (len >= L2CAP_CMD_HDR_SIZE) {
Al Viro88219a02007-07-29 00:17:25 -07005643 u16 cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005644 memcpy(&cmd, data, L2CAP_CMD_HDR_SIZE);
5645 data += L2CAP_CMD_HDR_SIZE;
5646 len -= L2CAP_CMD_HDR_SIZE;
5647
Al Viro88219a02007-07-29 00:17:25 -07005648 cmd_len = le16_to_cpu(cmd.len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005649
Gustavo Padovan2d792812012-10-06 10:07:01 +01005650 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd.code, cmd_len,
5651 cmd.ident);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005652
Al Viro88219a02007-07-29 00:17:25 -07005653 if (cmd_len > len || !cmd.ident) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005654 BT_DBG("corrupted command");
5655 break;
5656 }
5657
Johan Hedbergc5623552013-04-29 19:35:33 +03005658 err = l2cap_bredr_sig_cmd(conn, &cmd, cmd_len, data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005659 if (err) {
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03005660 struct l2cap_cmd_rej_unk rej;
Gustavo F. Padovan2c6d1a22011-03-23 14:38:32 -03005661
5662 BT_ERR("Wrong link type (%d)", err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005663
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005664 rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Gustavo Padovan2d792812012-10-06 10:07:01 +01005665 l2cap_send_cmd(conn, cmd.ident, L2CAP_COMMAND_REJ,
5666 sizeof(rej), &rej);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005667 }
5668
Al Viro88219a02007-07-29 00:17:25 -07005669 data += cmd_len;
5670 len -= cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005671 }
5672
Marcel Holtmann3b166292013-10-02 08:28:21 -07005673drop:
Linus Torvalds1da177e2005-04-16 15:20:36 -07005674 kfree_skb(skb);
5675}
5676
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005677static int l2cap_check_fcs(struct l2cap_chan *chan, struct sk_buff *skb)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005678{
5679 u16 our_fcs, rcv_fcs;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03005680 int hdr_size;
5681
5682 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
5683 hdr_size = L2CAP_EXT_HDR_SIZE;
5684 else
5685 hdr_size = L2CAP_ENH_HDR_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005686
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005687 if (chan->fcs == L2CAP_FCS_CRC16) {
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005688 skb_trim(skb, skb->len - L2CAP_FCS_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005689 rcv_fcs = get_unaligned_le16(skb->data + skb->len);
5690 our_fcs = crc16(0, skb->data - hdr_size, skb->len + hdr_size);
5691
5692 if (our_fcs != rcv_fcs)
João Paulo Rechi Vita7a560e52010-06-22 13:56:27 -03005693 return -EBADMSG;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005694 }
5695 return 0;
5696}
5697
Mat Martineau6ea00482012-05-17 20:53:52 -07005698static void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan)
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005699{
Mat Martineaue31f7632012-05-17 20:53:41 -07005700 struct l2cap_ctrl control;
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005701
Mat Martineaue31f7632012-05-17 20:53:41 -07005702 BT_DBG("chan %p", chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005703
Mat Martineaue31f7632012-05-17 20:53:41 -07005704 memset(&control, 0, sizeof(control));
5705 control.sframe = 1;
5706 control.final = 1;
5707 control.reqseq = chan->buffer_seq;
5708 set_bit(CONN_SEND_FBIT, &chan->conn_state);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005709
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005710 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
Mat Martineaue31f7632012-05-17 20:53:41 -07005711 control.super = L2CAP_SUPER_RNR;
5712 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005713 }
5714
Mat Martineaue31f7632012-05-17 20:53:41 -07005715 if (test_and_clear_bit(CONN_REMOTE_BUSY, &chan->conn_state) &&
5716 chan->unacked_frames > 0)
5717 __set_retrans_timer(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005718
Mat Martineaue31f7632012-05-17 20:53:41 -07005719 /* Send pending iframes */
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03005720 l2cap_ertm_send(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005721
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005722 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
Mat Martineaue31f7632012-05-17 20:53:41 -07005723 test_bit(CONN_SEND_FBIT, &chan->conn_state)) {
5724 /* F-bit wasn't sent in an s-frame or i-frame yet, so
5725 * send it now.
5726 */
5727 control.super = L2CAP_SUPER_RR;
5728 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005729 }
5730}
5731
Gustavo Padovan2d792812012-10-06 10:07:01 +01005732static void append_skb_frag(struct sk_buff *skb, struct sk_buff *new_frag,
5733 struct sk_buff **last_frag)
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005734{
Mat Martineau84084a32011-07-22 14:54:00 -07005735 /* skb->len reflects data in skb as well as all fragments
5736 * skb->data_len reflects only data in fragments
5737 */
5738 if (!skb_has_frag_list(skb))
5739 skb_shinfo(skb)->frag_list = new_frag;
5740
5741 new_frag->next = NULL;
5742
5743 (*last_frag)->next = new_frag;
5744 *last_frag = new_frag;
5745
5746 skb->len += new_frag->len;
5747 skb->data_len += new_frag->len;
5748 skb->truesize += new_frag->truesize;
5749}
5750
Mat Martineau4b51dae92012-05-17 20:53:37 -07005751static int l2cap_reassemble_sdu(struct l2cap_chan *chan, struct sk_buff *skb,
5752 struct l2cap_ctrl *control)
Mat Martineau84084a32011-07-22 14:54:00 -07005753{
5754 int err = -EINVAL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005755
Mat Martineau4b51dae92012-05-17 20:53:37 -07005756 switch (control->sar) {
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005757 case L2CAP_SAR_UNSEGMENTED:
Mat Martineau84084a32011-07-22 14:54:00 -07005758 if (chan->sdu)
5759 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005760
Gustavo Padovan80b98022012-05-27 22:27:51 -03005761 err = chan->ops->recv(chan, skb);
Mat Martineau84084a32011-07-22 14:54:00 -07005762 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005763
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005764 case L2CAP_SAR_START:
Mat Martineau84084a32011-07-22 14:54:00 -07005765 if (chan->sdu)
5766 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005767
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005768 chan->sdu_len = get_unaligned_le16(skb->data);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005769 skb_pull(skb, L2CAP_SDULEN_SIZE);
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005770
Mat Martineau84084a32011-07-22 14:54:00 -07005771 if (chan->sdu_len > chan->imtu) {
5772 err = -EMSGSIZE;
5773 break;
5774 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005775
Mat Martineau84084a32011-07-22 14:54:00 -07005776 if (skb->len >= chan->sdu_len)
5777 break;
5778
5779 chan->sdu = skb;
5780 chan->sdu_last_frag = skb;
5781
5782 skb = NULL;
5783 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005784 break;
5785
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005786 case L2CAP_SAR_CONTINUE:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005787 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005788 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005789
Mat Martineau84084a32011-07-22 14:54:00 -07005790 append_skb_frag(chan->sdu, skb,
5791 &chan->sdu_last_frag);
5792 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005793
Mat Martineau84084a32011-07-22 14:54:00 -07005794 if (chan->sdu->len >= chan->sdu_len)
5795 break;
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005796
Mat Martineau84084a32011-07-22 14:54:00 -07005797 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005798 break;
5799
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005800 case L2CAP_SAR_END:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005801 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005802 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005803
Mat Martineau84084a32011-07-22 14:54:00 -07005804 append_skb_frag(chan->sdu, skb,
5805 &chan->sdu_last_frag);
5806 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005807
Mat Martineau84084a32011-07-22 14:54:00 -07005808 if (chan->sdu->len != chan->sdu_len)
5809 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005810
Gustavo Padovan80b98022012-05-27 22:27:51 -03005811 err = chan->ops->recv(chan, chan->sdu);
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005812
Mat Martineau84084a32011-07-22 14:54:00 -07005813 if (!err) {
5814 /* Reassembly complete */
5815 chan->sdu = NULL;
5816 chan->sdu_last_frag = NULL;
5817 chan->sdu_len = 0;
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005818 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005819 break;
5820 }
5821
Mat Martineau84084a32011-07-22 14:54:00 -07005822 if (err) {
5823 kfree_skb(skb);
5824 kfree_skb(chan->sdu);
5825 chan->sdu = NULL;
5826 chan->sdu_last_frag = NULL;
5827 chan->sdu_len = 0;
5828 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005829
Mat Martineau84084a32011-07-22 14:54:00 -07005830 return err;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005831}
5832
Mat Martineau32b32732012-10-23 15:24:11 -07005833static int l2cap_resegment(struct l2cap_chan *chan)
5834{
5835 /* Placeholder */
5836 return 0;
5837}
5838
Mat Martineaue3281402011-07-07 09:39:02 -07005839void l2cap_chan_busy(struct l2cap_chan *chan, int busy)
Gustavo F. Padovan712132e2010-06-21 19:39:50 -03005840{
Mat Martineau61aa4f52012-05-17 20:53:40 -07005841 u8 event;
5842
5843 if (chan->mode != L2CAP_MODE_ERTM)
5844 return;
5845
5846 event = busy ? L2CAP_EV_LOCAL_BUSY_DETECTED : L2CAP_EV_LOCAL_BUSY_CLEAR;
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03005847 l2cap_tx(chan, NULL, NULL, event);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005848}
5849
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005850static int l2cap_rx_queued_iframes(struct l2cap_chan *chan)
5851{
Mat Martineau63838722012-05-17 20:53:45 -07005852 int err = 0;
5853 /* Pass sequential frames to l2cap_reassemble_sdu()
5854 * until a gap is encountered.
5855 */
5856
5857 BT_DBG("chan %p", chan);
5858
5859 while (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
5860 struct sk_buff *skb;
5861 BT_DBG("Searching for skb with txseq %d (queue len %d)",
5862 chan->buffer_seq, skb_queue_len(&chan->srej_q));
5863
5864 skb = l2cap_ertm_seq_in_queue(&chan->srej_q, chan->buffer_seq);
5865
5866 if (!skb)
5867 break;
5868
5869 skb_unlink(skb, &chan->srej_q);
5870 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
5871 err = l2cap_reassemble_sdu(chan, skb, &bt_cb(skb)->control);
5872 if (err)
5873 break;
5874 }
5875
5876 if (skb_queue_empty(&chan->srej_q)) {
5877 chan->rx_state = L2CAP_RX_STATE_RECV;
5878 l2cap_send_ack(chan);
5879 }
5880
5881 return err;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005882}
5883
5884static void l2cap_handle_srej(struct l2cap_chan *chan,
5885 struct l2cap_ctrl *control)
5886{
Mat Martineauf80842a2012-05-17 20:53:46 -07005887 struct sk_buff *skb;
5888
5889 BT_DBG("chan %p, control %p", chan, control);
5890
5891 if (control->reqseq == chan->next_tx_seq) {
5892 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005893 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005894 return;
5895 }
5896
5897 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
5898
5899 if (skb == NULL) {
5900 BT_DBG("Seq %d not available for retransmission",
5901 control->reqseq);
5902 return;
5903 }
5904
5905 if (chan->max_tx != 0 && bt_cb(skb)->control.retries >= chan->max_tx) {
5906 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005907 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005908 return;
5909 }
5910
5911 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
5912
5913 if (control->poll) {
5914 l2cap_pass_to_tx(chan, control);
5915
5916 set_bit(CONN_SEND_FBIT, &chan->conn_state);
5917 l2cap_retransmit(chan, control);
5918 l2cap_ertm_send(chan);
5919
5920 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5921 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5922 chan->srej_save_reqseq = control->reqseq;
5923 }
5924 } else {
5925 l2cap_pass_to_tx_fbit(chan, control);
5926
5927 if (control->final) {
5928 if (chan->srej_save_reqseq != control->reqseq ||
5929 !test_and_clear_bit(CONN_SREJ_ACT,
5930 &chan->conn_state))
5931 l2cap_retransmit(chan, control);
5932 } else {
5933 l2cap_retransmit(chan, control);
5934 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5935 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5936 chan->srej_save_reqseq = control->reqseq;
5937 }
5938 }
5939 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005940}
5941
5942static void l2cap_handle_rej(struct l2cap_chan *chan,
5943 struct l2cap_ctrl *control)
5944{
Mat Martineaufcd289d2012-05-17 20:53:47 -07005945 struct sk_buff *skb;
5946
5947 BT_DBG("chan %p, control %p", chan, control);
5948
5949 if (control->reqseq == chan->next_tx_seq) {
5950 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005951 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07005952 return;
5953 }
5954
5955 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
5956
5957 if (chan->max_tx && skb &&
5958 bt_cb(skb)->control.retries >= chan->max_tx) {
5959 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005960 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07005961 return;
5962 }
5963
5964 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
5965
5966 l2cap_pass_to_tx(chan, control);
5967
5968 if (control->final) {
5969 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state))
5970 l2cap_retransmit_all(chan, control);
5971 } else {
5972 l2cap_retransmit_all(chan, control);
5973 l2cap_ertm_send(chan);
5974 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F)
5975 set_bit(CONN_REJ_ACT, &chan->conn_state);
5976 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005977}
5978
Mat Martineau4b51dae92012-05-17 20:53:37 -07005979static u8 l2cap_classify_txseq(struct l2cap_chan *chan, u16 txseq)
5980{
5981 BT_DBG("chan %p, txseq %d", chan, txseq);
5982
5983 BT_DBG("last_acked_seq %d, expected_tx_seq %d", chan->last_acked_seq,
5984 chan->expected_tx_seq);
5985
5986 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
5987 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
Gustavo Padovan2d792812012-10-06 10:07:01 +01005988 chan->tx_win) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07005989 /* See notes below regarding "double poll" and
5990 * invalid packets.
5991 */
5992 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
5993 BT_DBG("Invalid/Ignore - after SREJ");
5994 return L2CAP_TXSEQ_INVALID_IGNORE;
5995 } else {
5996 BT_DBG("Invalid - in window after SREJ sent");
5997 return L2CAP_TXSEQ_INVALID;
5998 }
5999 }
6000
6001 if (chan->srej_list.head == txseq) {
6002 BT_DBG("Expected SREJ");
6003 return L2CAP_TXSEQ_EXPECTED_SREJ;
6004 }
6005
6006 if (l2cap_ertm_seq_in_queue(&chan->srej_q, txseq)) {
6007 BT_DBG("Duplicate SREJ - txseq already stored");
6008 return L2CAP_TXSEQ_DUPLICATE_SREJ;
6009 }
6010
6011 if (l2cap_seq_list_contains(&chan->srej_list, txseq)) {
6012 BT_DBG("Unexpected SREJ - not requested");
6013 return L2CAP_TXSEQ_UNEXPECTED_SREJ;
6014 }
6015 }
6016
6017 if (chan->expected_tx_seq == txseq) {
6018 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
6019 chan->tx_win) {
6020 BT_DBG("Invalid - txseq outside tx window");
6021 return L2CAP_TXSEQ_INVALID;
6022 } else {
6023 BT_DBG("Expected");
6024 return L2CAP_TXSEQ_EXPECTED;
6025 }
6026 }
6027
6028 if (__seq_offset(chan, txseq, chan->last_acked_seq) <
Gustavo Padovan2d792812012-10-06 10:07:01 +01006029 __seq_offset(chan, chan->expected_tx_seq, chan->last_acked_seq)) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07006030 BT_DBG("Duplicate - expected_tx_seq later than txseq");
6031 return L2CAP_TXSEQ_DUPLICATE;
6032 }
6033
6034 if (__seq_offset(chan, txseq, chan->last_acked_seq) >= chan->tx_win) {
6035 /* A source of invalid packets is a "double poll" condition,
6036 * where delays cause us to send multiple poll packets. If
6037 * the remote stack receives and processes both polls,
6038 * sequence numbers can wrap around in such a way that a
6039 * resent frame has a sequence number that looks like new data
6040 * with a sequence gap. This would trigger an erroneous SREJ
6041 * request.
6042 *
6043 * Fortunately, this is impossible with a tx window that's
6044 * less than half of the maximum sequence number, which allows
6045 * invalid frames to be safely ignored.
6046 *
6047 * With tx window sizes greater than half of the tx window
6048 * maximum, the frame is invalid and cannot be ignored. This
6049 * causes a disconnect.
6050 */
6051
6052 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
6053 BT_DBG("Invalid/Ignore - txseq outside tx window");
6054 return L2CAP_TXSEQ_INVALID_IGNORE;
6055 } else {
6056 BT_DBG("Invalid - txseq outside tx window");
6057 return L2CAP_TXSEQ_INVALID;
6058 }
6059 } else {
6060 BT_DBG("Unexpected - txseq indicates missing frames");
6061 return L2CAP_TXSEQ_UNEXPECTED;
6062 }
6063}
6064
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006065static int l2cap_rx_state_recv(struct l2cap_chan *chan,
6066 struct l2cap_ctrl *control,
6067 struct sk_buff *skb, u8 event)
6068{
6069 int err = 0;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006070 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006071
6072 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6073 event);
6074
6075 switch (event) {
6076 case L2CAP_EV_RECV_IFRAME:
6077 switch (l2cap_classify_txseq(chan, control->txseq)) {
6078 case L2CAP_TXSEQ_EXPECTED:
6079 l2cap_pass_to_tx(chan, control);
6080
6081 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6082 BT_DBG("Busy, discarding expected seq %d",
6083 control->txseq);
6084 break;
6085 }
6086
6087 chan->expected_tx_seq = __next_seq(chan,
6088 control->txseq);
6089
6090 chan->buffer_seq = chan->expected_tx_seq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006091 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006092
6093 err = l2cap_reassemble_sdu(chan, skb, control);
6094 if (err)
6095 break;
6096
6097 if (control->final) {
6098 if (!test_and_clear_bit(CONN_REJ_ACT,
6099 &chan->conn_state)) {
6100 control->final = 0;
6101 l2cap_retransmit_all(chan, control);
6102 l2cap_ertm_send(chan);
6103 }
6104 }
6105
6106 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
6107 l2cap_send_ack(chan);
6108 break;
6109 case L2CAP_TXSEQ_UNEXPECTED:
6110 l2cap_pass_to_tx(chan, control);
6111
6112 /* Can't issue SREJ frames in the local busy state.
6113 * Drop this frame, it will be seen as missing
6114 * when local busy is exited.
6115 */
6116 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6117 BT_DBG("Busy, discarding unexpected seq %d",
6118 control->txseq);
6119 break;
6120 }
6121
6122 /* There was a gap in the sequence, so an SREJ
6123 * must be sent for each missing frame. The
6124 * current frame is stored for later use.
6125 */
6126 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006127 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006128 BT_DBG("Queued %p (queue len %d)", skb,
6129 skb_queue_len(&chan->srej_q));
6130
6131 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
6132 l2cap_seq_list_clear(&chan->srej_list);
6133 l2cap_send_srej(chan, control->txseq);
6134
6135 chan->rx_state = L2CAP_RX_STATE_SREJ_SENT;
6136 break;
6137 case L2CAP_TXSEQ_DUPLICATE:
6138 l2cap_pass_to_tx(chan, control);
6139 break;
6140 case L2CAP_TXSEQ_INVALID_IGNORE:
6141 break;
6142 case L2CAP_TXSEQ_INVALID:
6143 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006144 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006145 break;
6146 }
6147 break;
6148 case L2CAP_EV_RECV_RR:
6149 l2cap_pass_to_tx(chan, control);
6150 if (control->final) {
6151 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6152
Mat Martineaue6a3ee62012-10-23 15:24:22 -07006153 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state) &&
6154 !__chan_is_moving(chan)) {
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006155 control->final = 0;
6156 l2cap_retransmit_all(chan, control);
6157 }
6158
6159 l2cap_ertm_send(chan);
6160 } else if (control->poll) {
6161 l2cap_send_i_or_rr_or_rnr(chan);
6162 } else {
6163 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6164 &chan->conn_state) &&
6165 chan->unacked_frames)
6166 __set_retrans_timer(chan);
6167
6168 l2cap_ertm_send(chan);
6169 }
6170 break;
6171 case L2CAP_EV_RECV_RNR:
6172 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6173 l2cap_pass_to_tx(chan, control);
6174 if (control && control->poll) {
6175 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6176 l2cap_send_rr_or_rnr(chan, 0);
6177 }
6178 __clear_retrans_timer(chan);
6179 l2cap_seq_list_clear(&chan->retrans_list);
6180 break;
6181 case L2CAP_EV_RECV_REJ:
6182 l2cap_handle_rej(chan, control);
6183 break;
6184 case L2CAP_EV_RECV_SREJ:
6185 l2cap_handle_srej(chan, control);
6186 break;
6187 default:
6188 break;
6189 }
6190
6191 if (skb && !skb_in_use) {
6192 BT_DBG("Freeing %p", skb);
6193 kfree_skb(skb);
6194 }
6195
6196 return err;
6197}
6198
6199static int l2cap_rx_state_srej_sent(struct l2cap_chan *chan,
6200 struct l2cap_ctrl *control,
6201 struct sk_buff *skb, u8 event)
6202{
6203 int err = 0;
6204 u16 txseq = control->txseq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006205 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006206
6207 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6208 event);
6209
6210 switch (event) {
6211 case L2CAP_EV_RECV_IFRAME:
6212 switch (l2cap_classify_txseq(chan, txseq)) {
6213 case L2CAP_TXSEQ_EXPECTED:
6214 /* Keep frame for reassembly later */
6215 l2cap_pass_to_tx(chan, control);
6216 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006217 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006218 BT_DBG("Queued %p (queue len %d)", skb,
6219 skb_queue_len(&chan->srej_q));
6220
6221 chan->expected_tx_seq = __next_seq(chan, txseq);
6222 break;
6223 case L2CAP_TXSEQ_EXPECTED_SREJ:
6224 l2cap_seq_list_pop(&chan->srej_list);
6225
6226 l2cap_pass_to_tx(chan, control);
6227 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006228 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006229 BT_DBG("Queued %p (queue len %d)", skb,
6230 skb_queue_len(&chan->srej_q));
6231
6232 err = l2cap_rx_queued_iframes(chan);
6233 if (err)
6234 break;
6235
6236 break;
6237 case L2CAP_TXSEQ_UNEXPECTED:
6238 /* Got a frame that can't be reassembled yet.
6239 * Save it for later, and send SREJs to cover
6240 * the missing frames.
6241 */
6242 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006243 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006244 BT_DBG("Queued %p (queue len %d)", skb,
6245 skb_queue_len(&chan->srej_q));
6246
6247 l2cap_pass_to_tx(chan, control);
6248 l2cap_send_srej(chan, control->txseq);
6249 break;
6250 case L2CAP_TXSEQ_UNEXPECTED_SREJ:
6251 /* This frame was requested with an SREJ, but
6252 * some expected retransmitted frames are
6253 * missing. Request retransmission of missing
6254 * SREJ'd frames.
6255 */
6256 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006257 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006258 BT_DBG("Queued %p (queue len %d)", skb,
6259 skb_queue_len(&chan->srej_q));
6260
6261 l2cap_pass_to_tx(chan, control);
6262 l2cap_send_srej_list(chan, control->txseq);
6263 break;
6264 case L2CAP_TXSEQ_DUPLICATE_SREJ:
6265 /* We've already queued this frame. Drop this copy. */
6266 l2cap_pass_to_tx(chan, control);
6267 break;
6268 case L2CAP_TXSEQ_DUPLICATE:
6269 /* Expecting a later sequence number, so this frame
6270 * was already received. Ignore it completely.
6271 */
6272 break;
6273 case L2CAP_TXSEQ_INVALID_IGNORE:
6274 break;
6275 case L2CAP_TXSEQ_INVALID:
6276 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006277 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006278 break;
6279 }
6280 break;
6281 case L2CAP_EV_RECV_RR:
6282 l2cap_pass_to_tx(chan, control);
6283 if (control->final) {
6284 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6285
6286 if (!test_and_clear_bit(CONN_REJ_ACT,
6287 &chan->conn_state)) {
6288 control->final = 0;
6289 l2cap_retransmit_all(chan, control);
6290 }
6291
6292 l2cap_ertm_send(chan);
6293 } else if (control->poll) {
6294 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6295 &chan->conn_state) &&
6296 chan->unacked_frames) {
6297 __set_retrans_timer(chan);
6298 }
6299
6300 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6301 l2cap_send_srej_tail(chan);
6302 } else {
6303 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6304 &chan->conn_state) &&
6305 chan->unacked_frames)
6306 __set_retrans_timer(chan);
6307
6308 l2cap_send_ack(chan);
6309 }
6310 break;
6311 case L2CAP_EV_RECV_RNR:
6312 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6313 l2cap_pass_to_tx(chan, control);
6314 if (control->poll) {
6315 l2cap_send_srej_tail(chan);
6316 } else {
6317 struct l2cap_ctrl rr_control;
6318 memset(&rr_control, 0, sizeof(rr_control));
6319 rr_control.sframe = 1;
6320 rr_control.super = L2CAP_SUPER_RR;
6321 rr_control.reqseq = chan->buffer_seq;
6322 l2cap_send_sframe(chan, &rr_control);
6323 }
6324
6325 break;
6326 case L2CAP_EV_RECV_REJ:
6327 l2cap_handle_rej(chan, control);
6328 break;
6329 case L2CAP_EV_RECV_SREJ:
6330 l2cap_handle_srej(chan, control);
6331 break;
6332 }
6333
6334 if (skb && !skb_in_use) {
6335 BT_DBG("Freeing %p", skb);
6336 kfree_skb(skb);
6337 }
6338
6339 return err;
6340}
6341
Mat Martineau32b32732012-10-23 15:24:11 -07006342static int l2cap_finish_move(struct l2cap_chan *chan)
6343{
6344 BT_DBG("chan %p", chan);
6345
6346 chan->rx_state = L2CAP_RX_STATE_RECV;
6347
6348 if (chan->hs_hcon)
6349 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6350 else
6351 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6352
6353 return l2cap_resegment(chan);
6354}
6355
6356static int l2cap_rx_state_wait_p(struct l2cap_chan *chan,
6357 struct l2cap_ctrl *control,
6358 struct sk_buff *skb, u8 event)
6359{
6360 int err;
6361
6362 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6363 event);
6364
6365 if (!control->poll)
6366 return -EPROTO;
6367
6368 l2cap_process_reqseq(chan, control->reqseq);
6369
6370 if (!skb_queue_empty(&chan->tx_q))
6371 chan->tx_send_head = skb_peek(&chan->tx_q);
6372 else
6373 chan->tx_send_head = NULL;
6374
6375 /* Rewind next_tx_seq to the point expected
6376 * by the receiver.
6377 */
6378 chan->next_tx_seq = control->reqseq;
6379 chan->unacked_frames = 0;
6380
6381 err = l2cap_finish_move(chan);
6382 if (err)
6383 return err;
6384
6385 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6386 l2cap_send_i_or_rr_or_rnr(chan);
6387
6388 if (event == L2CAP_EV_RECV_IFRAME)
6389 return -EPROTO;
6390
6391 return l2cap_rx_state_recv(chan, control, NULL, event);
6392}
6393
6394static int l2cap_rx_state_wait_f(struct l2cap_chan *chan,
6395 struct l2cap_ctrl *control,
6396 struct sk_buff *skb, u8 event)
6397{
6398 int err;
6399
6400 if (!control->final)
6401 return -EPROTO;
6402
6403 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6404
6405 chan->rx_state = L2CAP_RX_STATE_RECV;
6406 l2cap_process_reqseq(chan, control->reqseq);
6407
6408 if (!skb_queue_empty(&chan->tx_q))
6409 chan->tx_send_head = skb_peek(&chan->tx_q);
6410 else
6411 chan->tx_send_head = NULL;
6412
6413 /* Rewind next_tx_seq to the point expected
6414 * by the receiver.
6415 */
6416 chan->next_tx_seq = control->reqseq;
6417 chan->unacked_frames = 0;
6418
6419 if (chan->hs_hcon)
6420 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6421 else
6422 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6423
6424 err = l2cap_resegment(chan);
6425
6426 if (!err)
6427 err = l2cap_rx_state_recv(chan, control, skb, event);
6428
6429 return err;
6430}
6431
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006432static bool __valid_reqseq(struct l2cap_chan *chan, u16 reqseq)
6433{
6434 /* Make sure reqseq is for a packet that has been sent but not acked */
6435 u16 unacked;
6436
6437 unacked = __seq_offset(chan, chan->next_tx_seq, chan->expected_ack_seq);
6438 return __seq_offset(chan, chan->next_tx_seq, reqseq) <= unacked;
6439}
6440
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006441static int l2cap_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6442 struct sk_buff *skb, u8 event)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006443{
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006444 int err = 0;
6445
6446 BT_DBG("chan %p, control %p, skb %p, event %d, state %d", chan,
6447 control, skb, event, chan->rx_state);
6448
6449 if (__valid_reqseq(chan, control->reqseq)) {
6450 switch (chan->rx_state) {
6451 case L2CAP_RX_STATE_RECV:
6452 err = l2cap_rx_state_recv(chan, control, skb, event);
6453 break;
6454 case L2CAP_RX_STATE_SREJ_SENT:
6455 err = l2cap_rx_state_srej_sent(chan, control, skb,
6456 event);
6457 break;
Mat Martineau32b32732012-10-23 15:24:11 -07006458 case L2CAP_RX_STATE_WAIT_P:
6459 err = l2cap_rx_state_wait_p(chan, control, skb, event);
6460 break;
6461 case L2CAP_RX_STATE_WAIT_F:
6462 err = l2cap_rx_state_wait_f(chan, control, skb, event);
6463 break;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006464 default:
6465 /* shut it down */
6466 break;
6467 }
6468 } else {
6469 BT_DBG("Invalid reqseq %d (next_tx_seq %d, expected_ack_seq %d",
6470 control->reqseq, chan->next_tx_seq,
6471 chan->expected_ack_seq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006472 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006473 }
6474
6475 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006476}
6477
6478static int l2cap_stream_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6479 struct sk_buff *skb)
6480{
Mat Martineau4b51dae92012-05-17 20:53:37 -07006481 int err = 0;
6482
6483 BT_DBG("chan %p, control %p, skb %p, state %d", chan, control, skb,
6484 chan->rx_state);
6485
6486 if (l2cap_classify_txseq(chan, control->txseq) ==
6487 L2CAP_TXSEQ_EXPECTED) {
6488 l2cap_pass_to_tx(chan, control);
6489
6490 BT_DBG("buffer_seq %d->%d", chan->buffer_seq,
6491 __next_seq(chan, chan->buffer_seq));
6492
6493 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
6494
6495 l2cap_reassemble_sdu(chan, skb, control);
6496 } else {
6497 if (chan->sdu) {
6498 kfree_skb(chan->sdu);
6499 chan->sdu = NULL;
6500 }
6501 chan->sdu_last_frag = NULL;
6502 chan->sdu_len = 0;
6503
6504 if (skb) {
6505 BT_DBG("Freeing %p", skb);
6506 kfree_skb(skb);
6507 }
6508 }
6509
6510 chan->last_acked_seq = control->txseq;
6511 chan->expected_tx_seq = __next_seq(chan, control->txseq);
6512
6513 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006514}
6515
6516static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6517{
6518 struct l2cap_ctrl *control = &bt_cb(skb)->control;
6519 u16 len;
6520 u8 event;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006521
Mat Martineaub76bbd62012-04-11 10:48:43 -07006522 __unpack_control(chan, skb);
6523
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006524 len = skb->len;
6525
6526 /*
6527 * We can just drop the corrupted I-frame here.
6528 * Receiver will miss it and start proper recovery
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006529 * procedures and ask for retransmission.
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006530 */
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006531 if (l2cap_check_fcs(chan, skb))
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006532 goto drop;
6533
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006534 if (!control->sframe && control->sar == L2CAP_SAR_START)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006535 len -= L2CAP_SDULEN_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006536
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006537 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006538 len -= L2CAP_FCS_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006539
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006540 if (len > chan->mps) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006541 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006542 goto drop;
6543 }
6544
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006545 if (!control->sframe) {
6546 int err;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006547
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006548 BT_DBG("iframe sar %d, reqseq %d, final %d, txseq %d",
6549 control->sar, control->reqseq, control->final,
6550 control->txseq);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03006551
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006552 /* Validate F-bit - F=0 always valid, F=1 only
6553 * valid in TX WAIT_F
6554 */
6555 if (control->final && chan->tx_state != L2CAP_TX_STATE_WAIT_F)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006556 goto drop;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006557
6558 if (chan->mode != L2CAP_MODE_STREAMING) {
6559 event = L2CAP_EV_RECV_IFRAME;
6560 err = l2cap_rx(chan, control, skb, event);
6561 } else {
6562 err = l2cap_stream_rx(chan, control, skb);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006563 }
6564
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006565 if (err)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006566 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006567 } else {
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006568 const u8 rx_func_to_event[4] = {
6569 L2CAP_EV_RECV_RR, L2CAP_EV_RECV_REJ,
6570 L2CAP_EV_RECV_RNR, L2CAP_EV_RECV_SREJ
6571 };
6572
6573 /* Only I-frames are expected in streaming mode */
6574 if (chan->mode == L2CAP_MODE_STREAMING)
6575 goto drop;
6576
6577 BT_DBG("sframe reqseq %d, final %d, poll %d, super %d",
6578 control->reqseq, control->final, control->poll,
6579 control->super);
6580
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006581 if (len != 0) {
Andrei Emeltchenko1bb166e2012-11-20 17:16:21 +02006582 BT_ERR("Trailing bytes: %d in sframe", len);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006583 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006584 goto drop;
6585 }
6586
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006587 /* Validate F and P bits */
6588 if (control->final && (control->poll ||
6589 chan->tx_state != L2CAP_TX_STATE_WAIT_F))
6590 goto drop;
6591
6592 event = rx_func_to_event[control->super];
6593 if (l2cap_rx(chan, control, skb, event))
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006594 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006595 }
6596
6597 return 0;
6598
6599drop:
6600 kfree_skb(skb);
6601 return 0;
6602}
6603
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006604static void l2cap_chan_le_send_credits(struct l2cap_chan *chan)
6605{
6606 struct l2cap_conn *conn = chan->conn;
6607 struct l2cap_le_credits pkt;
6608 u16 return_credits;
6609
6610 /* We return more credits to the sender only after the amount of
6611 * credits falls below half of the initial amount.
6612 */
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02006613 if (chan->rx_credits >= (le_max_credits + 1) / 2)
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006614 return;
6615
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02006616 return_credits = le_max_credits - chan->rx_credits;
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006617
6618 BT_DBG("chan %p returning %u credits to sender", chan, return_credits);
6619
6620 chan->rx_credits += return_credits;
6621
6622 pkt.cid = cpu_to_le16(chan->scid);
6623 pkt.credits = cpu_to_le16(return_credits);
6624
6625 chan->ident = l2cap_get_ident(conn);
6626
6627 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CREDITS, sizeof(pkt), &pkt);
6628}
6629
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006630static int l2cap_le_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6631{
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006632 int err;
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006633
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006634 if (!chan->rx_credits) {
6635 BT_ERR("No credits to receive LE L2CAP data");
Johan Hedbergdfd97742014-01-27 15:11:34 -08006636 l2cap_send_disconn_req(chan, ECONNRESET);
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006637 return -ENOBUFS;
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006638 }
6639
6640 if (chan->imtu < skb->len) {
6641 BT_ERR("Too big LE L2CAP PDU");
6642 return -ENOBUFS;
6643 }
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006644
6645 chan->rx_credits--;
6646 BT_DBG("rx_credits %u -> %u", chan->rx_credits + 1, chan->rx_credits);
6647
6648 l2cap_chan_le_send_credits(chan);
6649
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006650 err = 0;
6651
6652 if (!chan->sdu) {
6653 u16 sdu_len;
6654
6655 sdu_len = get_unaligned_le16(skb->data);
6656 skb_pull(skb, L2CAP_SDULEN_SIZE);
6657
6658 BT_DBG("Start of new SDU. sdu_len %u skb->len %u imtu %u",
6659 sdu_len, skb->len, chan->imtu);
6660
6661 if (sdu_len > chan->imtu) {
6662 BT_ERR("Too big LE L2CAP SDU length received");
6663 err = -EMSGSIZE;
6664 goto failed;
6665 }
6666
6667 if (skb->len > sdu_len) {
6668 BT_ERR("Too much LE L2CAP data received");
6669 err = -EINVAL;
6670 goto failed;
6671 }
6672
6673 if (skb->len == sdu_len)
6674 return chan->ops->recv(chan, skb);
6675
6676 chan->sdu = skb;
6677 chan->sdu_len = sdu_len;
6678 chan->sdu_last_frag = skb;
6679
6680 return 0;
6681 }
6682
6683 BT_DBG("SDU fragment. chan->sdu->len %u skb->len %u chan->sdu_len %u",
6684 chan->sdu->len, skb->len, chan->sdu_len);
6685
6686 if (chan->sdu->len + skb->len > chan->sdu_len) {
6687 BT_ERR("Too much LE L2CAP data received");
6688 err = -EINVAL;
6689 goto failed;
6690 }
6691
6692 append_skb_frag(chan->sdu, skb, &chan->sdu_last_frag);
6693 skb = NULL;
6694
6695 if (chan->sdu->len == chan->sdu_len) {
6696 err = chan->ops->recv(chan, chan->sdu);
6697 if (!err) {
6698 chan->sdu = NULL;
6699 chan->sdu_last_frag = NULL;
6700 chan->sdu_len = 0;
6701 }
6702 }
6703
6704failed:
6705 if (err) {
6706 kfree_skb(skb);
6707 kfree_skb(chan->sdu);
6708 chan->sdu = NULL;
6709 chan->sdu_last_frag = NULL;
6710 chan->sdu_len = 0;
6711 }
6712
6713 /* We can't return an error here since we took care of the skb
6714 * freeing internally. An error return would cause the caller to
6715 * do a double-free of the skb.
6716 */
6717 return 0;
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006718}
6719
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006720static void l2cap_data_channel(struct l2cap_conn *conn, u16 cid,
6721 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006722{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006723 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006724
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03006725 chan = l2cap_get_chan_by_scid(conn, cid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006726 if (!chan) {
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006727 if (cid == L2CAP_CID_A2MP) {
6728 chan = a2mp_channel_create(conn, skb);
6729 if (!chan) {
6730 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006731 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006732 }
6733
6734 l2cap_chan_lock(chan);
6735 } else {
6736 BT_DBG("unknown cid 0x%4.4x", cid);
6737 /* Drop packet and return */
6738 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006739 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006740 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006741 }
6742
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03006743 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006744
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03006745 if (chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006746 goto drop;
6747
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006748 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03006749 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006750 if (l2cap_le_data_rcv(chan, skb) < 0)
6751 goto drop;
6752
6753 goto done;
6754
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006755 case L2CAP_MODE_BASIC:
6756 /* If socket recv buffers overflows we drop data here
6757 * which is *bad* because L2CAP has to be reliable.
6758 * But we don't have any other choice. L2CAP doesn't
6759 * provide flow control mechanism. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07006760
Szymon Janc2c96e032014-02-18 20:48:34 +01006761 if (chan->imtu < skb->len) {
6762 BT_ERR("Dropping L2CAP data: receive buffer overflow");
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006763 goto drop;
Szymon Janc2c96e032014-02-18 20:48:34 +01006764 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006765
Gustavo Padovan80b98022012-05-27 22:27:51 -03006766 if (!chan->ops->recv(chan, skb))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006767 goto done;
6768 break;
6769
6770 case L2CAP_MODE_ERTM:
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006771 case L2CAP_MODE_STREAMING:
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006772 l2cap_data_rcv(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006773 goto done;
6774
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006775 default:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006776 BT_DBG("chan %p: bad mode 0x%2.2x", chan, chan->mode);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006777 break;
6778 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006779
6780drop:
6781 kfree_skb(skb);
6782
6783done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006784 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006785}
6786
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006787static void l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm,
6788 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006789{
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006790 struct hci_conn *hcon = conn->hcon;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006791 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006792
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006793 if (hcon->type != ACL_LINK)
Johan Hedberga24cce12014-08-07 22:56:42 +03006794 goto free_skb;
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006795
Johan Hedbergbf20fd42013-05-14 13:23:13 +03006796 chan = l2cap_global_chan_by_psm(0, psm, &hcon->src, &hcon->dst,
6797 ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006798 if (!chan)
Johan Hedberga24cce12014-08-07 22:56:42 +03006799 goto free_skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006800
Andrei Emeltchenko5b4ceda2012-02-24 16:35:32 +02006801 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006802
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03006803 if (chan->state != BT_BOUND && chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006804 goto drop;
6805
Vinicius Costa Gomese13e21d2011-06-17 22:46:27 -03006806 if (chan->imtu < skb->len)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006807 goto drop;
6808
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006809 /* Store remote BD_ADDR and PSM for msg_name */
Marcel Holtmann06ae3312013-10-18 03:43:00 -07006810 bacpy(&bt_cb(skb)->bdaddr, &hcon->dst);
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006811 bt_cb(skb)->psm = psm;
6812
Johan Hedberga24cce12014-08-07 22:56:42 +03006813 if (!chan->ops->recv(chan, skb)) {
6814 l2cap_chan_put(chan);
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006815 return;
Johan Hedberga24cce12014-08-07 22:56:42 +03006816 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006817
6818drop:
Johan Hedberga24cce12014-08-07 22:56:42 +03006819 l2cap_chan_put(chan);
6820free_skb:
Linus Torvalds1da177e2005-04-16 15:20:36 -07006821 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006822}
6823
6824static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb)
6825{
6826 struct l2cap_hdr *lh = (void *) skb->data;
Johan Hedberg61a939c2014-01-17 20:45:11 +02006827 struct hci_conn *hcon = conn->hcon;
Al Viro8e036fc2007-07-29 00:16:36 -07006828 u16 cid, len;
6829 __le16 psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006830
Johan Hedberg61a939c2014-01-17 20:45:11 +02006831 if (hcon->state != BT_CONNECTED) {
6832 BT_DBG("queueing pending rx skb");
6833 skb_queue_tail(&conn->pending_rx, skb);
6834 return;
6835 }
6836
Linus Torvalds1da177e2005-04-16 15:20:36 -07006837 skb_pull(skb, L2CAP_HDR_SIZE);
6838 cid = __le16_to_cpu(lh->cid);
6839 len = __le16_to_cpu(lh->len);
6840
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006841 if (len != skb->len) {
6842 kfree_skb(skb);
6843 return;
6844 }
6845
Johan Hedberg9e1d7e12014-07-06 11:03:36 +03006846 /* Since we can't actively block incoming LE connections we must
6847 * at least ensure that we ignore incoming data from them.
6848 */
6849 if (hcon->type == LE_LINK &&
Johan Hedbergdcc36c12014-07-09 12:59:13 +03006850 hci_bdaddr_list_lookup(&hcon->hdev->blacklist, &hcon->dst,
6851 bdaddr_type(hcon, hcon->dst_type))) {
Johan Hedberge4931502014-07-02 09:36:21 +03006852 kfree_skb(skb);
6853 return;
6854 }
6855
Linus Torvalds1da177e2005-04-16 15:20:36 -07006856 BT_DBG("len %d, cid 0x%4.4x", len, cid);
6857
6858 switch (cid) {
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006859 case L2CAP_CID_SIGNALING:
Linus Torvalds1da177e2005-04-16 15:20:36 -07006860 l2cap_sig_channel(conn, skb);
6861 break;
6862
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006863 case L2CAP_CID_CONN_LESS:
Andrei Emeltchenko097db762012-03-09 14:16:17 +02006864 psm = get_unaligned((__le16 *) skb->data);
Andrei Emeltchenko0181a702012-05-29 10:04:05 +03006865 skb_pull(skb, L2CAP_PSMLEN_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006866 l2cap_conless_channel(conn, psm, skb);
6867 break;
6868
Marcel Holtmanna2877622013-10-02 23:46:54 -07006869 case L2CAP_CID_LE_SIGNALING:
6870 l2cap_le_sig_channel(conn, skb);
6871 break;
6872
Linus Torvalds1da177e2005-04-16 15:20:36 -07006873 default:
6874 l2cap_data_channel(conn, cid, skb);
6875 break;
6876 }
6877}
6878
Johan Hedberg61a939c2014-01-17 20:45:11 +02006879static void process_pending_rx(struct work_struct *work)
6880{
6881 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
6882 pending_rx_work);
6883 struct sk_buff *skb;
6884
6885 BT_DBG("");
6886
6887 while ((skb = skb_dequeue(&conn->pending_rx)))
6888 l2cap_recv_frame(conn, skb);
6889}
6890
Johan Hedberg162b49e2014-01-17 20:45:10 +02006891static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon)
6892{
6893 struct l2cap_conn *conn = hcon->l2cap_data;
6894 struct hci_chan *hchan;
6895
6896 if (conn)
6897 return conn;
6898
6899 hchan = hci_chan_create(hcon);
6900 if (!hchan)
6901 return NULL;
6902
Johan Hedberg27f70f32014-07-21 10:50:06 +03006903 conn = kzalloc(sizeof(*conn), GFP_KERNEL);
Johan Hedberg162b49e2014-01-17 20:45:10 +02006904 if (!conn) {
6905 hci_chan_del(hchan);
6906 return NULL;
6907 }
6908
6909 kref_init(&conn->ref);
6910 hcon->l2cap_data = conn;
6911 conn->hcon = hcon;
6912 hci_conn_get(conn->hcon);
6913 conn->hchan = hchan;
6914
6915 BT_DBG("hcon %p conn %p hchan %p", hcon, conn, hchan);
6916
6917 switch (hcon->type) {
6918 case LE_LINK:
6919 if (hcon->hdev->le_mtu) {
6920 conn->mtu = hcon->hdev->le_mtu;
6921 break;
6922 }
6923 /* fall through */
6924 default:
6925 conn->mtu = hcon->hdev->acl_mtu;
6926 break;
6927 }
6928
6929 conn->feat_mask = 0;
6930
6931 if (hcon->type == ACL_LINK)
6932 conn->hs_enabled = test_bit(HCI_HS_ENABLED,
6933 &hcon->hdev->dev_flags);
6934
Marcel Holtmann5a54e7c2014-07-13 20:50:15 +02006935 mutex_init(&conn->ident_lock);
Johan Hedberg162b49e2014-01-17 20:45:10 +02006936 mutex_init(&conn->chan_lock);
6937
6938 INIT_LIST_HEAD(&conn->chan_l);
6939 INIT_LIST_HEAD(&conn->users);
6940
Johan Hedberg276d8072014-08-11 22:06:41 +03006941 INIT_DELAYED_WORK(&conn->info_timer, l2cap_info_timeout);
Johan Hedberg162b49e2014-01-17 20:45:10 +02006942
Johan Hedbergdec5b492014-08-11 22:06:37 +03006943 INIT_WORK(&conn->disconn_work, disconn_work);
6944
Johan Hedberg61a939c2014-01-17 20:45:11 +02006945 skb_queue_head_init(&conn->pending_rx);
6946 INIT_WORK(&conn->pending_rx_work, process_pending_rx);
6947
Johan Hedberg162b49e2014-01-17 20:45:10 +02006948 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
6949
6950 return conn;
6951}
6952
6953static bool is_valid_psm(u16 psm, u8 dst_type) {
6954 if (!psm)
6955 return false;
6956
6957 if (bdaddr_type_is_le(dst_type))
6958 return (psm <= 0x00ff);
6959
6960 /* PSM must be odd and lsb of upper byte must be 0 */
6961 return ((psm & 0x0101) == 0x0001);
6962}
6963
6964int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
6965 bdaddr_t *dst, u8 dst_type)
6966{
6967 struct l2cap_conn *conn;
6968 struct hci_conn *hcon;
6969 struct hci_dev *hdev;
Johan Hedberg162b49e2014-01-17 20:45:10 +02006970 int err;
6971
6972 BT_DBG("%pMR -> %pMR (type %u) psm 0x%2.2x", &chan->src, dst,
6973 dst_type, __le16_to_cpu(psm));
6974
6975 hdev = hci_get_route(dst, &chan->src);
6976 if (!hdev)
6977 return -EHOSTUNREACH;
6978
6979 hci_dev_lock(hdev);
6980
6981 l2cap_chan_lock(chan);
6982
6983 if (!is_valid_psm(__le16_to_cpu(psm), dst_type) && !cid &&
6984 chan->chan_type != L2CAP_CHAN_RAW) {
6985 err = -EINVAL;
6986 goto done;
6987 }
6988
Johan Hedberg21626e62014-01-24 10:35:41 +02006989 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED && !psm) {
6990 err = -EINVAL;
6991 goto done;
6992 }
6993
6994 if (chan->chan_type == L2CAP_CHAN_FIXED && !cid) {
Johan Hedberg162b49e2014-01-17 20:45:10 +02006995 err = -EINVAL;
6996 goto done;
6997 }
6998
6999 switch (chan->mode) {
7000 case L2CAP_MODE_BASIC:
7001 break;
7002 case L2CAP_MODE_LE_FLOWCTL:
7003 l2cap_le_flowctl_init(chan);
7004 break;
7005 case L2CAP_MODE_ERTM:
7006 case L2CAP_MODE_STREAMING:
7007 if (!disable_ertm)
7008 break;
7009 /* fall through */
7010 default:
Johan Hedbergbeb19e42014-07-18 11:15:26 +03007011 err = -EOPNOTSUPP;
Johan Hedberg162b49e2014-01-17 20:45:10 +02007012 goto done;
7013 }
7014
7015 switch (chan->state) {
7016 case BT_CONNECT:
7017 case BT_CONNECT2:
7018 case BT_CONFIG:
7019 /* Already connecting */
7020 err = 0;
7021 goto done;
7022
7023 case BT_CONNECTED:
7024 /* Already connected */
7025 err = -EISCONN;
7026 goto done;
7027
7028 case BT_OPEN:
7029 case BT_BOUND:
7030 /* Can connect */
7031 break;
7032
7033 default:
7034 err = -EBADFD;
7035 goto done;
7036 }
7037
7038 /* Set destination address and psm */
7039 bacpy(&chan->dst, dst);
7040 chan->dst_type = dst_type;
7041
7042 chan->psm = psm;
7043 chan->dcid = cid;
7044
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007045 if (bdaddr_type_is_le(dst_type)) {
Johan Hedberge804d252014-07-16 11:42:28 +03007046 u8 role;
Johan Hedbergcdd62752014-07-07 15:02:28 +03007047
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007048 /* Convert from L2CAP channel address type to HCI address type
7049 */
7050 if (dst_type == BDADDR_LE_PUBLIC)
7051 dst_type = ADDR_LE_DEV_PUBLIC;
7052 else
7053 dst_type = ADDR_LE_DEV_RANDOM;
7054
Johan Hedberge804d252014-07-16 11:42:28 +03007055 if (test_bit(HCI_ADVERTISING, &hdev->dev_flags))
7056 role = HCI_ROLE_SLAVE;
7057 else
7058 role = HCI_ROLE_MASTER;
Johan Hedbergcdd62752014-07-07 15:02:28 +03007059
Andre Guedes04a6c582014-02-26 20:21:44 -03007060 hcon = hci_connect_le(hdev, dst, dst_type, chan->sec_level,
Johan Hedberge804d252014-07-16 11:42:28 +03007061 HCI_LE_CONN_TIMEOUT, role);
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007062 } else {
Johan Hedbergd93375a2014-07-07 15:02:27 +03007063 u8 auth_type = l2cap_get_auth_type(chan);
Andre Guedes04a6c582014-02-26 20:21:44 -03007064 hcon = hci_connect_acl(hdev, dst, chan->sec_level, auth_type);
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007065 }
Johan Hedberg162b49e2014-01-17 20:45:10 +02007066
7067 if (IS_ERR(hcon)) {
7068 err = PTR_ERR(hcon);
7069 goto done;
7070 }
7071
7072 conn = l2cap_conn_add(hcon);
7073 if (!conn) {
7074 hci_conn_drop(hcon);
7075 err = -ENOMEM;
7076 goto done;
7077 }
7078
7079 if (cid && __l2cap_get_chan_by_dcid(conn, cid)) {
7080 hci_conn_drop(hcon);
7081 err = -EBUSY;
7082 goto done;
7083 }
7084
7085 /* Update source addr of the socket */
7086 bacpy(&chan->src, &hcon->src);
7087 chan->src_type = bdaddr_type(hcon, hcon->src_type);
7088
Johan Hedberg162b49e2014-01-17 20:45:10 +02007089 l2cap_chan_add(conn, chan);
Johan Hedberg162b49e2014-01-17 20:45:10 +02007090
7091 /* l2cap_chan_add takes its own ref so we can drop this one */
7092 hci_conn_drop(hcon);
7093
7094 l2cap_state_change(chan, BT_CONNECT);
7095 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
7096
Johan Hedberg61202e42014-01-28 15:16:48 -08007097 /* Release chan->sport so that it can be reused by other
7098 * sockets (as it's only used for listening sockets).
7099 */
7100 write_lock(&chan_list_lock);
7101 chan->sport = 0;
7102 write_unlock(&chan_list_lock);
7103
Johan Hedberg162b49e2014-01-17 20:45:10 +02007104 if (hcon->state == BT_CONNECTED) {
7105 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
7106 __clear_chan_timer(chan);
Johan Hedberge7cafc42014-07-17 15:35:38 +03007107 if (l2cap_chan_check_security(chan, true))
Johan Hedberg162b49e2014-01-17 20:45:10 +02007108 l2cap_state_change(chan, BT_CONNECTED);
7109 } else
7110 l2cap_do_start(chan);
7111 }
7112
7113 err = 0;
7114
7115done:
7116 l2cap_chan_unlock(chan);
7117 hci_dev_unlock(hdev);
7118 hci_dev_put(hdev);
7119 return err;
7120}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +03007121EXPORT_SYMBOL_GPL(l2cap_chan_connect);
Johan Hedberg162b49e2014-01-17 20:45:10 +02007122
Linus Torvalds1da177e2005-04-16 15:20:36 -07007123/* ---- L2CAP interface with lower layer (HCI) ---- */
7124
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007125int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007126{
7127 int exact = 0, lm1 = 0, lm2 = 0;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007128 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007129
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03007130 BT_DBG("hdev %s, bdaddr %pMR", hdev->name, bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007131
7132 /* Find listening sockets and check their link_mode */
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007133 read_lock(&chan_list_lock);
7134 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03007135 if (c->state != BT_LISTEN)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007136 continue;
7137
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007138 if (!bacmp(&c->src, &hdev->bdaddr)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007139 lm1 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03007140 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007141 lm1 |= HCI_LM_MASTER;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007142 exact++;
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007143 } else if (!bacmp(&c->src, BDADDR_ANY)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007144 lm2 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03007145 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007146 lm2 |= HCI_LM_MASTER;
7147 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007148 }
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007149 read_unlock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007150
7151 return exact ? lm1 : lm2;
7152}
7153
Johan Hedberge760ec12014-08-07 22:56:47 +03007154/* Find the next fixed channel in BT_LISTEN state, continue iteration
7155 * from an existing channel in the list or from the beginning of the
7156 * global list (by passing NULL as first parameter).
7157 */
7158static struct l2cap_chan *l2cap_global_fixed_chan(struct l2cap_chan *c,
Johan Hedberg54a1b622014-08-07 22:56:48 +03007159 bdaddr_t *src, u8 link_type)
Johan Hedberge760ec12014-08-07 22:56:47 +03007160{
7161 read_lock(&chan_list_lock);
7162
7163 if (c)
7164 c = list_next_entry(c, global_l);
7165 else
7166 c = list_entry(chan_list.next, typeof(*c), global_l);
7167
7168 list_for_each_entry_from(c, &chan_list, global_l) {
7169 if (c->chan_type != L2CAP_CHAN_FIXED)
7170 continue;
7171 if (c->state != BT_LISTEN)
7172 continue;
7173 if (bacmp(&c->src, src) && bacmp(&c->src, BDADDR_ANY))
7174 continue;
Johan Hedberg54a1b622014-08-07 22:56:48 +03007175 if (link_type == ACL_LINK && c->src_type != BDADDR_BREDR)
7176 continue;
7177 if (link_type == LE_LINK && c->src_type == BDADDR_BREDR)
7178 continue;
Johan Hedberge760ec12014-08-07 22:56:47 +03007179
7180 l2cap_chan_hold(c);
7181 read_unlock(&chan_list_lock);
7182 return c;
7183 }
7184
7185 read_unlock(&chan_list_lock);
7186
7187 return NULL;
7188}
7189
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03007190void l2cap_connect_cfm(struct hci_conn *hcon, u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007191{
Johan Hedberge760ec12014-08-07 22:56:47 +03007192 struct hci_dev *hdev = hcon->hdev;
Marcel Holtmann01394182006-07-03 10:02:46 +02007193 struct l2cap_conn *conn;
Johan Hedberge760ec12014-08-07 22:56:47 +03007194 struct l2cap_chan *pchan;
7195 u8 dst_type;
Marcel Holtmann01394182006-07-03 10:02:46 +02007196
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03007197 BT_DBG("hcon %p bdaddr %pMR status %d", hcon, &hcon->dst, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007198
Johan Hedbergdc0f5082014-08-07 22:56:46 +03007199 if (status) {
Joe Perchese1750722011-06-29 18:18:29 -07007200 l2cap_conn_del(hcon, bt_to_errno(status));
Johan Hedbergdc0f5082014-08-07 22:56:46 +03007201 return;
Andrei Emeltchenkoba6fc312012-10-31 15:46:26 +02007202 }
Johan Hedbergdc0f5082014-08-07 22:56:46 +03007203
7204 conn = l2cap_conn_add(hcon);
7205 if (!conn)
7206 return;
7207
Johan Hedberge760ec12014-08-07 22:56:47 +03007208 dst_type = bdaddr_type(hcon, hcon->dst_type);
7209
7210 /* If device is blocked, do not create channels for it */
7211 if (hci_bdaddr_list_lookup(&hdev->blacklist, &hcon->dst, dst_type))
7212 return;
7213
7214 /* Find fixed channels and notify them of the new connection. We
7215 * use multiple individual lookups, continuing each time where
7216 * we left off, because the list lock would prevent calling the
7217 * potentially sleeping l2cap_chan_lock() function.
7218 */
Johan Hedberg54a1b622014-08-07 22:56:48 +03007219 pchan = l2cap_global_fixed_chan(NULL, &hdev->bdaddr, hcon->type);
Johan Hedberge760ec12014-08-07 22:56:47 +03007220 while (pchan) {
7221 struct l2cap_chan *chan, *next;
7222
7223 /* Client fixed channels should override server ones */
7224 if (__l2cap_get_chan_by_dcid(conn, pchan->scid))
7225 goto next;
7226
7227 l2cap_chan_lock(pchan);
7228 chan = pchan->ops->new_connection(pchan);
7229 if (chan) {
7230 bacpy(&chan->src, &hcon->src);
7231 bacpy(&chan->dst, &hcon->dst);
7232 chan->src_type = bdaddr_type(hcon, hcon->src_type);
7233 chan->dst_type = dst_type;
7234
7235 __l2cap_chan_add(conn, chan);
7236 }
7237
7238 l2cap_chan_unlock(pchan);
7239next:
Johan Hedberg54a1b622014-08-07 22:56:48 +03007240 next = l2cap_global_fixed_chan(pchan, &hdev->bdaddr,
7241 hcon->type);
Johan Hedberge760ec12014-08-07 22:56:47 +03007242 l2cap_chan_put(pchan);
7243 pchan = next;
7244 }
7245
Johan Hedbergdc0f5082014-08-07 22:56:46 +03007246 l2cap_conn_ready(conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007247}
7248
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007249int l2cap_disconn_ind(struct hci_conn *hcon)
Marcel Holtmann2950f212009-02-12 14:02:50 +01007250{
7251 struct l2cap_conn *conn = hcon->l2cap_data;
7252
7253 BT_DBG("hcon %p", hcon);
7254
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007255 if (!conn)
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02007256 return HCI_ERROR_REMOTE_USER_TERM;
Marcel Holtmann2950f212009-02-12 14:02:50 +01007257 return conn->disc_reason;
7258}
7259
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03007260void l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007261{
7262 BT_DBG("hcon %p reason %d", hcon, reason);
7263
Joe Perchese1750722011-06-29 18:18:29 -07007264 l2cap_conn_del(hcon, bt_to_errno(reason));
Linus Torvalds1da177e2005-04-16 15:20:36 -07007265}
7266
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007267static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt)
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007268{
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03007269 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED)
Marcel Holtmann255c7602009-02-04 21:07:19 +01007270 return;
7271
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007272 if (encrypt == 0x00) {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007273 if (chan->sec_level == BT_SECURITY_MEDIUM) {
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007274 __set_chan_timer(chan, L2CAP_ENC_TIMEOUT);
Marcel Holtmann7d513e92014-01-15 22:37:40 -08007275 } else if (chan->sec_level == BT_SECURITY_HIGH ||
7276 chan->sec_level == BT_SECURITY_FIPS)
Gustavo F. Padovan0f852722011-05-04 19:42:50 -03007277 l2cap_chan_close(chan, ECONNREFUSED);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007278 } else {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007279 if (chan->sec_level == BT_SECURITY_MEDIUM)
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -03007280 __clear_chan_timer(chan);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007281 }
7282}
7283
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007284int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007285{
Marcel Holtmann40be4922008-07-14 20:13:50 +02007286 struct l2cap_conn *conn = hcon->l2cap_data;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03007287 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007288
Marcel Holtmann01394182006-07-03 10:02:46 +02007289 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007290 return 0;
Marcel Holtmann01394182006-07-03 10:02:46 +02007291
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03007292 BT_DBG("conn %p status 0x%2.2x encrypt %u", conn, status, encrypt);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007293
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007294 mutex_lock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007295
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007296 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007297 l2cap_chan_lock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007298
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03007299 BT_DBG("chan %p scid 0x%4.4x state %s", chan, chan->scid,
7300 state_to_string(chan->state));
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007301
Johan Hedberg2338a7e2014-01-24 10:35:40 +02007302 if (chan->scid == L2CAP_CID_A2MP) {
Andrei Emeltchenko78eb2f92012-07-19 17:03:47 +03007303 l2cap_chan_unlock(chan);
7304 continue;
7305 }
7306
Johan Hedberg191eb392014-08-07 22:56:45 +03007307 if (!status && encrypt)
7308 chan->sec_level = hcon->sec_level;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007309
Andrei Emeltchenko96eff462012-11-15 18:14:53 +02007310 if (!__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007311 l2cap_chan_unlock(chan);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01007312 continue;
7313 }
7314
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03007315 if (!status && (chan->state == BT_CONNECTED ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01007316 chan->state == BT_CONFIG)) {
Marcel Holtmannd97c8992013-10-14 02:53:54 -07007317 chan->ops->resume(chan);
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007318 l2cap_check_encryption(chan, encrypt);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007319 l2cap_chan_unlock(chan);
Marcel Holtmann9719f8a2008-07-14 20:13:45 +02007320 continue;
7321 }
7322
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03007323 if (chan->state == BT_CONNECT) {
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007324 if (!status)
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03007325 l2cap_start_connection(chan);
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007326 else
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007327 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03007328 } else if (chan->state == BT_CONNECT2) {
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007329 struct l2cap_conn_rsp rsp;
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007330 __u16 res, stat;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007331
7332 if (!status) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07007333 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007334 res = L2CAP_CR_PEND;
7335 stat = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08007336 chan->ops->defer(chan);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007337 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007338 l2cap_state_change(chan, BT_CONFIG);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007339 res = L2CAP_CR_SUCCESS;
7340 stat = L2CAP_CS_NO_INFO;
7341 }
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007342 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007343 l2cap_state_change(chan, BT_DISCONN);
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007344 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007345 res = L2CAP_CR_SEC_BLOCK;
7346 stat = L2CAP_CS_NO_INFO;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007347 }
7348
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03007349 rsp.scid = cpu_to_le16(chan->dcid);
7350 rsp.dcid = cpu_to_le16(chan->scid);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007351 rsp.result = cpu_to_le16(res);
7352 rsp.status = cpu_to_le16(stat);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03007353 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01007354 sizeof(rsp), &rsp);
Mat Martineau2d369352012-05-23 14:59:30 -07007355
7356 if (!test_bit(CONF_REQ_SENT, &chan->conf_state) &&
7357 res == L2CAP_CR_SUCCESS) {
7358 char buf[128];
7359 set_bit(CONF_REQ_SENT, &chan->conf_state);
7360 l2cap_send_cmd(conn, l2cap_get_ident(conn),
7361 L2CAP_CONF_REQ,
7362 l2cap_build_conf_req(chan, buf),
7363 buf);
7364 chan->num_conf_req++;
7365 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007366 }
7367
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007368 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007369 }
7370
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007371 mutex_unlock(&conn->chan_lock);
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007372
Linus Torvalds1da177e2005-04-16 15:20:36 -07007373 return 0;
7374}
7375
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007376int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007377{
7378 struct l2cap_conn *conn = hcon->l2cap_data;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007379 struct l2cap_hdr *hdr;
7380 int len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007381
Andrei Emeltchenko1d13a252012-10-15 11:58:41 +03007382 /* For AMP controller do not create l2cap conn */
7383 if (!conn && hcon->hdev->dev_type != HCI_BREDR)
7384 goto drop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007385
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007386 if (!conn)
Claudio Takahasibaf43252013-04-11 13:55:50 -03007387 conn = l2cap_conn_add(hcon);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007388
7389 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007390 goto drop;
7391
7392 BT_DBG("conn %p len %d flags 0x%x", conn, skb->len, flags);
7393
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007394 switch (flags) {
7395 case ACL_START:
7396 case ACL_START_NO_FLUSH:
7397 case ACL_COMPLETE:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007398 if (conn->rx_len) {
7399 BT_ERR("Unexpected start frame (len %d)", skb->len);
7400 kfree_skb(conn->rx_skb);
7401 conn->rx_skb = NULL;
7402 conn->rx_len = 0;
7403 l2cap_conn_unreliable(conn, ECOMM);
7404 }
7405
Andrei Emeltchenkoaae7fe22010-09-15 14:28:43 +03007406 /* Start fragment always begin with Basic L2CAP header */
7407 if (skb->len < L2CAP_HDR_SIZE) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07007408 BT_ERR("Frame is too short (len %d)", skb->len);
7409 l2cap_conn_unreliable(conn, ECOMM);
7410 goto drop;
7411 }
7412
7413 hdr = (struct l2cap_hdr *) skb->data;
7414 len = __le16_to_cpu(hdr->len) + L2CAP_HDR_SIZE;
7415
7416 if (len == skb->len) {
7417 /* Complete frame received */
7418 l2cap_recv_frame(conn, skb);
7419 return 0;
7420 }
7421
7422 BT_DBG("Start: total len %d, frag len %d", len, skb->len);
7423
7424 if (skb->len > len) {
7425 BT_ERR("Frame is too long (len %d, expected len %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007426 skb->len, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007427 l2cap_conn_unreliable(conn, ECOMM);
7428 goto drop;
7429 }
7430
7431 /* Allocate skb for the complete frame (with header) */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03007432 conn->rx_skb = bt_skb_alloc(len, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03007433 if (!conn->rx_skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007434 goto drop;
7435
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007436 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007437 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007438 conn->rx_len = len - skb->len;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007439 break;
7440
7441 case ACL_CONT:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007442 BT_DBG("Cont: frag len %d (expecting %d)", skb->len, conn->rx_len);
7443
7444 if (!conn->rx_len) {
7445 BT_ERR("Unexpected continuation frame (len %d)", skb->len);
7446 l2cap_conn_unreliable(conn, ECOMM);
7447 goto drop;
7448 }
7449
7450 if (skb->len > conn->rx_len) {
7451 BT_ERR("Fragment is too long (len %d, expected %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007452 skb->len, conn->rx_len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007453 kfree_skb(conn->rx_skb);
7454 conn->rx_skb = NULL;
7455 conn->rx_len = 0;
7456 l2cap_conn_unreliable(conn, ECOMM);
7457 goto drop;
7458 }
7459
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007460 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007461 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007462 conn->rx_len -= skb->len;
7463
7464 if (!conn->rx_len) {
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007465 /* Complete frame received. l2cap_recv_frame
7466 * takes ownership of the skb so set the global
7467 * rx_skb pointer to NULL first.
7468 */
7469 struct sk_buff *rx_skb = conn->rx_skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007470 conn->rx_skb = NULL;
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007471 l2cap_recv_frame(conn, rx_skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007472 }
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007473 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007474 }
7475
7476drop:
7477 kfree_skb(skb);
7478 return 0;
7479}
7480
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007481static int l2cap_debugfs_show(struct seq_file *f, void *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007482{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007483 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007484
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007485 read_lock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007486
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007487 list_for_each_entry(c, &chan_list, global_l) {
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03007488 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 -07007489 &c->src, &c->dst,
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03007490 c->state, __le16_to_cpu(c->psm),
7491 c->scid, c->dcid, c->imtu, c->omtu,
7492 c->sec_level, c->mode);
Andrei Emeltchenko61e1b4b2012-01-19 11:19:50 +02007493 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007494
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007495 read_unlock(&chan_list_lock);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007496
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007497 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007498}
7499
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007500static int l2cap_debugfs_open(struct inode *inode, struct file *file)
7501{
7502 return single_open(file, l2cap_debugfs_show, inode->i_private);
7503}
7504
7505static const struct file_operations l2cap_debugfs_fops = {
7506 .open = l2cap_debugfs_open,
7507 .read = seq_read,
7508 .llseek = seq_lseek,
7509 .release = single_release,
7510};
7511
7512static struct dentry *l2cap_debugfs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007513
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007514int __init l2cap_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007515{
7516 int err;
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007517
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007518 err = l2cap_init_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007519 if (err < 0)
7520 return err;
7521
Marcel Holtmann1120e4b2013-10-17 17:24:16 -07007522 if (IS_ERR_OR_NULL(bt_debugfs))
7523 return 0;
7524
7525 l2cap_debugfs = debugfs_create_file("l2cap", 0444, bt_debugfs,
7526 NULL, &l2cap_debugfs_fops);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007527
Samuel Ortiz40b93972014-05-14 17:53:35 +02007528 debugfs_create_u16("l2cap_le_max_credits", 0644, bt_debugfs,
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02007529 &le_max_credits);
Samuel Ortiz40b93972014-05-14 17:53:35 +02007530 debugfs_create_u16("l2cap_le_default_mps", 0644, bt_debugfs,
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02007531 &le_default_mps);
7532
Linus Torvalds1da177e2005-04-16 15:20:36 -07007533 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007534}
7535
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007536void l2cap_exit(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007537{
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007538 debugfs_remove(l2cap_debugfs);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007539 l2cap_cleanup_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007540}
7541
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03007542module_param(disable_ertm, bool, 0644);
7543MODULE_PARM_DESC(disable_ertm, "Disable enhanced retransmission mode");