blob: c6419f40cfbaa56e336bd3f3c2d9a57bab54bb14 [file] [log] [blame]
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2000-2001 Qualcomm Incorporated
Gustavo F. Padovance5706b2010-07-13 11:57:11 -03004 Copyright (C) 2009-2010 Gustavo F. Padovan <gustavo@padovan.org>
Gustavo F. Padovan5d8868f2010-07-16 16:18:39 -03005 Copyright (C) 2010 Google Inc.
Gustavo F. Padovan590051d2011-12-18 13:39:33 -02006 Copyright (C) 2011 ProFUSION Embedded Systems
Mat Martineau422e9252012-04-27 16:50:55 -07007 Copyright (c) 2012 Code Aurora Forum. All rights reserved.
Linus Torvalds1da177e2005-04-16 15:20:36 -07008
9 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
10
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License version 2 as
13 published by the Free Software Foundation;
14
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
18 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090019 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
20 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
21 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
Linus Torvalds1da177e2005-04-16 15:20:36 -070022 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090024 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
25 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
Linus Torvalds1da177e2005-04-16 15:20:36 -070026 SOFTWARE IS DISCLAIMED.
27*/
28
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020029/* Bluetooth L2CAP core. */
Linus Torvalds1da177e2005-04-16 15:20:36 -070030
Linus Torvalds1da177e2005-04-16 15:20:36 -070031#include <linux/module.h>
32
Marcel Holtmannaef7d972010-03-21 05:27:45 +010033#include <linux/debugfs.h>
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -030034#include <linux/crc16.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070035
36#include <net/bluetooth/bluetooth.h>
37#include <net/bluetooth/hci_core.h>
38#include <net/bluetooth/l2cap.h>
Marcel Holtmann7ef9fbf2013-10-10 14:54:14 -070039
Marcel Holtmannac4b7232013-10-10 14:54:16 -070040#include "smp.h"
Marcel Holtmann70247282013-10-10 14:54:15 -070041#include "a2mp.h"
Marcel Holtmann7ef9fbf2013-10-10 14:54:14 -070042#include "amp.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070043
Johan Hedberg0f1bfe42014-01-27 15:11:35 -080044#define LE_FLOWCTL_MAX_CREDITS 65535
45
Mat Martineaud1de6d42012-05-17 20:53:55 -070046bool disable_ertm;
Marcel Holtmannf0709e02007-10-20 13:38:51 +020047
Marcel Holtmann547d1032013-10-12 08:18:19 -070048static u32 l2cap_feat_mask = L2CAP_FEAT_FIXED_CHAN | L2CAP_FEAT_UCD;
Marcel Holtmanna6801ca2014-07-11 06:03:08 +020049static u8 l2cap_fixed_chan[8] = { L2CAP_FC_SIG_BREDR | L2CAP_FC_CONNLESS, };
Linus Torvalds1da177e2005-04-16 15:20:36 -070050
Johannes Bergb5ad8b72011-06-01 08:54:45 +020051static LIST_HEAD(chan_list);
52static DEFINE_RWLOCK(chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -070053
Johan Hedbergf15b8ec2013-12-03 15:08:25 +020054static u16 le_max_credits = L2CAP_LE_MAX_CREDITS;
55static u16 le_default_mps = L2CAP_LE_DEFAULT_MPS;
56
Linus Torvalds1da177e2005-04-16 15:20:36 -070057static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +010058 u8 code, u8 ident, u16 dlen, void *data);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -030059static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len,
Gustavo Padovan2d792812012-10-06 10:07:01 +010060 void *data);
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -030061static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +020062static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err);
Linus Torvalds1da177e2005-04-16 15:20:36 -070063
Gustavo Padovand6603662012-05-21 13:58:22 -030064static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
Gustavo Padovan2d792812012-10-06 10:07:01 +010065 struct sk_buff_head *skbs, u8 event);
Mat Martineau608bcc62012-05-17 20:53:32 -070066
Marcel Holtmann4f1654e2013-10-13 08:50:41 -070067static inline __u8 bdaddr_type(struct hci_conn *hcon, __u8 type)
68{
69 if (hcon->type == LE_LINK) {
70 if (type == ADDR_LE_DEV_PUBLIC)
71 return BDADDR_LE_PUBLIC;
72 else
73 return BDADDR_LE_RANDOM;
74 }
75
76 return BDADDR_BREDR;
77}
78
Marcel Holtmann01394182006-07-03 10:02:46 +020079/* ---- L2CAP channels ---- */
Gustavo F. Padovan71ba0e52011-05-17 14:34:52 -030080
Gustavo Padovan2d792812012-10-06 10:07:01 +010081static struct l2cap_chan *__l2cap_get_chan_by_dcid(struct l2cap_conn *conn,
82 u16 cid)
Marcel Holtmann01394182006-07-03 10:02:46 +020083{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020084 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -030085
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020086 list_for_each_entry(c, &conn->chan_l, list) {
87 if (c->dcid == cid)
88 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +020089 }
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020090 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +020091}
92
Gustavo Padovan2d792812012-10-06 10:07:01 +010093static struct l2cap_chan *__l2cap_get_chan_by_scid(struct l2cap_conn *conn,
94 u16 cid)
Marcel Holtmann01394182006-07-03 10:02:46 +020095{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020096 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -030097
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020098 list_for_each_entry(c, &conn->chan_l, list) {
99 if (c->scid == cid)
100 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +0200101 }
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200102 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200103}
104
105/* Find channel with given SCID.
Mat Martineauef191ad2012-05-02 09:42:00 -0700106 * Returns locked channel. */
Gustavo Padovan2d792812012-10-06 10:07:01 +0100107static struct l2cap_chan *l2cap_get_chan_by_scid(struct l2cap_conn *conn,
108 u16 cid)
Marcel Holtmann01394182006-07-03 10:02:46 +0200109{
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300110 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300111
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200112 mutex_lock(&conn->chan_lock);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300113 c = __l2cap_get_chan_by_scid(conn, cid);
Mat Martineauef191ad2012-05-02 09:42:00 -0700114 if (c)
115 l2cap_chan_lock(c);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200116 mutex_unlock(&conn->chan_lock);
117
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300118 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +0200119}
120
Mat Martineaub1a130b2012-10-23 15:24:09 -0700121/* Find channel with given DCID.
122 * Returns locked channel.
123 */
124static struct l2cap_chan *l2cap_get_chan_by_dcid(struct l2cap_conn *conn,
125 u16 cid)
126{
127 struct l2cap_chan *c;
128
129 mutex_lock(&conn->chan_lock);
130 c = __l2cap_get_chan_by_dcid(conn, cid);
131 if (c)
132 l2cap_chan_lock(c);
133 mutex_unlock(&conn->chan_lock);
134
135 return c;
136}
137
Gustavo Padovan2d792812012-10-06 10:07:01 +0100138static struct l2cap_chan *__l2cap_get_chan_by_ident(struct l2cap_conn *conn,
139 u8 ident)
Marcel Holtmann01394182006-07-03 10:02:46 +0200140{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200141 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300142
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200143 list_for_each_entry(c, &conn->chan_l, list) {
144 if (c->ident == ident)
145 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +0200146 }
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200147 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200148}
149
Mat Martineau5b155ef2012-10-23 15:24:14 -0700150static struct l2cap_chan *l2cap_get_chan_by_ident(struct l2cap_conn *conn,
151 u8 ident)
152{
153 struct l2cap_chan *c;
154
155 mutex_lock(&conn->chan_lock);
156 c = __l2cap_get_chan_by_ident(conn, ident);
157 if (c)
158 l2cap_chan_lock(c);
159 mutex_unlock(&conn->chan_lock);
160
161 return c;
162}
163
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300164static struct l2cap_chan *__l2cap_global_chan_by_addr(__le16 psm, bdaddr_t *src)
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300165{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300166 struct l2cap_chan *c;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300167
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300168 list_for_each_entry(c, &chan_list, global_l) {
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700169 if (c->sport == psm && !bacmp(&c->src, src))
Szymon Janc250938c2011-11-16 09:32:22 +0100170 return c;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300171 }
Szymon Janc250938c2011-11-16 09:32:22 +0100172 return NULL;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300173}
174
175int l2cap_add_psm(struct l2cap_chan *chan, bdaddr_t *src, __le16 psm)
176{
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300177 int err;
178
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200179 write_lock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300180
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300181 if (psm && __l2cap_global_chan_by_addr(psm, src)) {
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300182 err = -EADDRINUSE;
183 goto done;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300184 }
185
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300186 if (psm) {
187 chan->psm = psm;
188 chan->sport = psm;
189 err = 0;
190 } else {
191 u16 p;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300192
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300193 err = -EINVAL;
194 for (p = 0x1001; p < 0x1100; p += 2)
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300195 if (!__l2cap_global_chan_by_addr(cpu_to_le16(p), src)) {
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300196 chan->psm = cpu_to_le16(p);
197 chan->sport = cpu_to_le16(p);
198 err = 0;
199 break;
200 }
201 }
202
203done:
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200204 write_unlock(&chan_list_lock);
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300205 return err;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300206}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300207EXPORT_SYMBOL_GPL(l2cap_add_psm);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300208
209int l2cap_add_scid(struct l2cap_chan *chan, __u16 scid)
210{
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200211 write_lock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300212
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. Padovan89bc500e2011-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. Padovan89bc500e2011-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. Padovan89bc500e2011-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. Padovan89bc500e2011-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. Padovan89bc500e2011-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. Padovan89bc500e2011-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 Hedberg5ee98912013-04-29 19:35:43 +0300549 hci_conn_hold(conn->hcon);
550
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200551 list_add(&chan->list, &conn->chan_l);
Andrei Emeltchenko643162a2012-02-22 17:11:55 +0200552}
553
Andrei Emeltchenko466f8002012-05-29 13:59:01 +0300554void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
Andrei Emeltchenko643162a2012-02-22 17:11:55 +0200555{
556 mutex_lock(&conn->chan_lock);
557 __l2cap_chan_add(conn, chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200558 mutex_unlock(&conn->chan_lock);
Marcel Holtmann01394182006-07-03 10:02:46 +0200559}
560
Andrei Emeltchenko466f8002012-05-29 13:59:01 +0300561void l2cap_chan_del(struct l2cap_chan *chan, int err)
Marcel Holtmann01394182006-07-03 10:02:46 +0200562{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300563 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann01394182006-07-03 10:02:46 +0200564
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -0300565 __clear_chan_timer(chan);
Marcel Holtmann01394182006-07-03 10:02:46 +0200566
Gustavo F. Padovan49208c92011-04-04 15:59:54 -0300567 BT_DBG("chan %p, conn %p, err %d", chan, conn, err);
Marcel Holtmann01394182006-07-03 10:02:46 +0200568
Johan Hedberg72847ce2014-08-08 09:28:03 +0300569 chan->ops->teardown(chan, err);
570
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900571 if (conn) {
Andrei Emeltchenko56f60982012-10-15 11:58:44 +0300572 struct amp_mgr *mgr = conn->hcon->amp_mgr;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300573 /* Delete from channel list */
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200574 list_del(&chan->list);
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -0200575
Ulisses Furquim371fd832011-12-21 20:02:36 -0200576 l2cap_chan_put(chan);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300577
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300578 chan->conn = NULL;
Andrei Emeltchenko3cabbfd2012-05-31 11:01:37 +0300579
Johan Hedberg2338a7e2014-01-24 10:35:40 +0200580 if (chan->scid != L2CAP_CID_A2MP)
David Herrmann76a68ba2013-04-06 20:28:37 +0200581 hci_conn_drop(conn->hcon);
Andrei Emeltchenko56f60982012-10-15 11:58:44 +0300582
583 if (mgr && mgr->bredr_chan == chan)
584 mgr->bredr_chan = NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200585 }
586
Andrei Emeltchenko419e08c2012-10-31 15:46:34 +0200587 if (chan->hs_hchan) {
588 struct hci_chan *hs_hchan = chan->hs_hchan;
589
590 BT_DBG("chan %p disconnect hs_hchan %p", chan, hs_hchan);
591 amp_disconnect_logical_link(hs_hchan);
592 }
593
Mat Martineau28270112012-05-17 21:14:09 -0700594 if (test_bit(CONF_NOT_COMPLETE, &chan->conf_state))
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300595 return;
Gustavo F. Padovan2ead70b2011-04-01 15:13:36 -0300596
Gustavo Padovanee556f62012-05-18 20:22:38 -0300597 switch(chan->mode) {
598 case L2CAP_MODE_BASIC:
599 break;
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300600
Johan Hedberg38319712013-05-17 12:49:23 +0300601 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedberg177f8f22013-05-31 17:54:51 +0300602 skb_queue_purge(&chan->tx_q);
Johan Hedberg38319712013-05-17 12:49:23 +0300603 break;
604
Gustavo Padovanee556f62012-05-18 20:22:38 -0300605 case L2CAP_MODE_ERTM:
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -0300606 __clear_retrans_timer(chan);
607 __clear_monitor_timer(chan);
608 __clear_ack_timer(chan);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300609
Gustavo F. Padovanf1c67752011-03-25 20:36:10 -0300610 skb_queue_purge(&chan->srej_q);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300611
Mat Martineau3c588192012-04-11 10:48:42 -0700612 l2cap_seq_list_free(&chan->srej_list);
613 l2cap_seq_list_free(&chan->retrans_list);
Gustavo Padovanee556f62012-05-18 20:22:38 -0300614
615 /* fall through */
616
617 case L2CAP_MODE_STREAMING:
618 skb_queue_purge(&chan->tx_q);
619 break;
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300620 }
Gustavo Padovanee556f62012-05-18 20:22:38 -0300621
622 return;
Marcel Holtmann01394182006-07-03 10:02:46 +0200623}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300624EXPORT_SYMBOL_GPL(l2cap_chan_del);
Marcel Holtmann01394182006-07-03 10:02:46 +0200625
Johan Hedberg387a33e2014-02-18 21:41:33 +0200626void l2cap_conn_update_id_addr(struct hci_conn *hcon)
627{
628 struct l2cap_conn *conn = hcon->l2cap_data;
629 struct l2cap_chan *chan;
630
631 mutex_lock(&conn->chan_lock);
632
633 list_for_each_entry(chan, &conn->chan_l, list) {
634 l2cap_chan_lock(chan);
635 bacpy(&chan->dst, &hcon->dst);
636 chan->dst_type = bdaddr_type(hcon, hcon->dst_type);
637 l2cap_chan_unlock(chan);
638 }
639
640 mutex_unlock(&conn->chan_lock);
641}
642
Johan Hedberg27e2d4c2013-05-14 13:27:21 +0300643static void l2cap_chan_le_connect_reject(struct l2cap_chan *chan)
644{
645 struct l2cap_conn *conn = chan->conn;
646 struct l2cap_le_conn_rsp rsp;
647 u16 result;
648
649 if (test_bit(FLAG_DEFER_SETUP, &chan->flags))
650 result = L2CAP_CR_AUTHORIZATION;
651 else
652 result = L2CAP_CR_BAD_PSM;
653
654 l2cap_state_change(chan, BT_DISCONN);
655
656 rsp.dcid = cpu_to_le16(chan->scid);
657 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +0200658 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +0300659 rsp.credits = cpu_to_le16(chan->rx_credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +0300660 rsp.result = cpu_to_le16(result);
661
662 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp),
663 &rsp);
664}
665
Johan Hedberg791d60f2013-05-14 22:24:44 +0300666static void l2cap_chan_connect_reject(struct l2cap_chan *chan)
667{
668 struct l2cap_conn *conn = chan->conn;
669 struct l2cap_conn_rsp rsp;
670 u16 result;
671
672 if (test_bit(FLAG_DEFER_SETUP, &chan->flags))
673 result = L2CAP_CR_SEC_BLOCK;
674 else
675 result = L2CAP_CR_BAD_PSM;
676
677 l2cap_state_change(chan, BT_DISCONN);
678
679 rsp.scid = cpu_to_le16(chan->dcid);
680 rsp.dcid = cpu_to_le16(chan->scid);
681 rsp.result = cpu_to_le16(result);
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700682 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Johan Hedberg791d60f2013-05-14 22:24:44 +0300683
684 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, sizeof(rsp), &rsp);
685}
686
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300687void l2cap_chan_close(struct l2cap_chan *chan, int reason)
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300688{
689 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300690
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700691 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300692
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300693 switch (chan->state) {
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300694 case BT_LISTEN:
Gustavo Padovanb699ec02012-10-06 11:51:54 +0100695 chan->ops->teardown(chan, 0);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300696 break;
697
698 case BT_CONNECTED:
699 case BT_CONFIG:
Johan Hedberg7b25c9b2014-01-28 15:28:04 -0800700 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED) {
Gustavo Padovan8d836d72013-10-15 19:24:47 -0300701 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +0200702 l2cap_send_disconn_req(chan, reason);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300703 } else
704 l2cap_chan_del(chan, reason);
705 break;
706
707 case BT_CONNECT2:
Johan Hedberg791d60f2013-05-14 22:24:44 +0300708 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED) {
709 if (conn->hcon->type == ACL_LINK)
710 l2cap_chan_connect_reject(chan);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +0300711 else if (conn->hcon->type == LE_LINK)
712 l2cap_chan_le_connect_reject(chan);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300713 }
714
715 l2cap_chan_del(chan, reason);
716 break;
717
718 case BT_CONNECT:
719 case BT_DISCONN:
720 l2cap_chan_del(chan, reason);
721 break;
722
723 default:
Gustavo Padovanb699ec02012-10-06 11:51:54 +0100724 chan->ops->teardown(chan, 0);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300725 break;
726 }
727}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300728EXPORT_SYMBOL(l2cap_chan_close);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300729
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300730static inline u8 l2cap_get_auth_type(struct l2cap_chan *chan)
Johan Hedberg8556edd32011-01-19 12:06:50 +0530731{
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700732 switch (chan->chan_type) {
733 case L2CAP_CHAN_RAW:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300734 switch (chan->sec_level) {
Johan Hedberg8556edd32011-01-19 12:06:50 +0530735 case BT_SECURITY_HIGH:
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800736 case BT_SECURITY_FIPS:
Johan Hedberg8556edd32011-01-19 12:06:50 +0530737 return HCI_AT_DEDICATED_BONDING_MITM;
738 case BT_SECURITY_MEDIUM:
739 return HCI_AT_DEDICATED_BONDING;
740 default:
741 return HCI_AT_NO_BONDING;
742 }
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700743 break;
Marcel Holtmann3124b842013-10-12 07:19:32 -0700744 case L2CAP_CHAN_CONN_LESS:
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700745 if (chan->psm == cpu_to_le16(L2CAP_PSM_3DSP)) {
Marcel Holtmann3124b842013-10-12 07:19:32 -0700746 if (chan->sec_level == BT_SECURITY_LOW)
747 chan->sec_level = BT_SECURITY_SDP;
748 }
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800749 if (chan->sec_level == BT_SECURITY_HIGH ||
750 chan->sec_level == BT_SECURITY_FIPS)
Marcel Holtmann3124b842013-10-12 07:19:32 -0700751 return HCI_AT_NO_BONDING_MITM;
752 else
753 return HCI_AT_NO_BONDING;
754 break;
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700755 case L2CAP_CHAN_CONN_ORIENTED:
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700756 if (chan->psm == cpu_to_le16(L2CAP_PSM_SDP)) {
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700757 if (chan->sec_level == BT_SECURITY_LOW)
758 chan->sec_level = BT_SECURITY_SDP;
Johan Hedberg8556edd32011-01-19 12:06:50 +0530759
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800760 if (chan->sec_level == BT_SECURITY_HIGH ||
761 chan->sec_level == BT_SECURITY_FIPS)
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700762 return HCI_AT_NO_BONDING_MITM;
763 else
764 return HCI_AT_NO_BONDING;
765 }
766 /* fall through */
767 default:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300768 switch (chan->sec_level) {
Johan Hedberg8556edd32011-01-19 12:06:50 +0530769 case BT_SECURITY_HIGH:
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800770 case BT_SECURITY_FIPS:
Johan Hedberg8556edd32011-01-19 12:06:50 +0530771 return HCI_AT_GENERAL_BONDING_MITM;
772 case BT_SECURITY_MEDIUM:
773 return HCI_AT_GENERAL_BONDING;
774 default:
775 return HCI_AT_NO_BONDING;
776 }
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700777 break;
Johan Hedberg8556edd32011-01-19 12:06:50 +0530778 }
779}
780
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200781/* Service level security */
Johan Hedberge7cafc42014-07-17 15:35:38 +0300782int l2cap_chan_check_security(struct l2cap_chan *chan, bool initiator)
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200783{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300784 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100785 __u8 auth_type;
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200786
Johan Hedberga17de2f2013-05-14 13:25:37 +0300787 if (conn->hcon->type == LE_LINK)
788 return smp_conn_security(conn->hcon, chan->sec_level);
789
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300790 auth_type = l2cap_get_auth_type(chan);
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100791
Johan Hedberge7cafc42014-07-17 15:35:38 +0300792 return hci_conn_security(conn->hcon, chan->sec_level, auth_type,
793 initiator);
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200794}
795
Johannes Bergb5ad8b72011-06-01 08:54:45 +0200796static u8 l2cap_get_ident(struct l2cap_conn *conn)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200797{
798 u8 id;
799
800 /* Get next available identificator.
801 * 1 - 128 are used by kernel.
802 * 129 - 199 are reserved.
803 * 200 - 254 are used by utilities like l2ping, etc.
804 */
805
Marcel Holtmann5a54e7c2014-07-13 20:50:15 +0200806 mutex_lock(&conn->ident_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200807
808 if (++conn->tx_ident > 128)
809 conn->tx_ident = 1;
810
811 id = conn->tx_ident;
812
Marcel Holtmann5a54e7c2014-07-13 20:50:15 +0200813 mutex_unlock(&conn->ident_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200814
815 return id;
816}
817
Gustavo Padovan2d792812012-10-06 10:07:01 +0100818static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len,
819 void *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200820{
821 struct sk_buff *skb = l2cap_build_cmd(conn, code, ident, len, data);
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +0200822 u8 flags;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200823
824 BT_DBG("code 0x%2.2x", code);
825
826 if (!skb)
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -0300827 return;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200828
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +0200829 if (lmp_no_flush_capable(conn->hcon->hdev))
830 flags = ACL_START_NO_FLUSH;
831 else
832 flags = ACL_START;
833
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700834 bt_cb(skb)->force_active = BT_POWER_FORCE_ACTIVE_ON;
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +0200835 skb->priority = HCI_PRIO_MAX;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700836
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200837 hci_send_acl(conn->hchan, skb, flags);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200838}
839
Mat Martineau02b0fbb2012-10-23 15:24:10 -0700840static bool __chan_is_moving(struct l2cap_chan *chan)
841{
842 return chan->move_state != L2CAP_MOVE_STABLE &&
843 chan->move_state != L2CAP_MOVE_WAIT_PREPARE;
844}
845
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200846static void l2cap_do_send(struct l2cap_chan *chan, struct sk_buff *skb)
847{
848 struct hci_conn *hcon = chan->conn->hcon;
849 u16 flags;
850
851 BT_DBG("chan %p, skb %p len %d priority %u", chan, skb, skb->len,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100852 skb->priority);
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200853
Mat Martineaud5f8a752012-10-23 15:24:18 -0700854 if (chan->hs_hcon && !__chan_is_moving(chan)) {
855 if (chan->hs_hchan)
856 hci_send_acl(chan->hs_hchan, skb, ACL_COMPLETE);
857 else
858 kfree_skb(skb);
859
860 return;
861 }
862
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200863 if (!test_bit(FLAG_FLUSHABLE, &chan->flags) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100864 lmp_no_flush_capable(hcon->hdev))
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200865 flags = ACL_START_NO_FLUSH;
866 else
867 flags = ACL_START;
868
869 bt_cb(skb)->force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
870 hci_send_acl(chan->conn->hchan, skb, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700871}
872
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700873static void __unpack_enhanced_control(u16 enh, struct l2cap_ctrl *control)
874{
875 control->reqseq = (enh & L2CAP_CTRL_REQSEQ) >> L2CAP_CTRL_REQSEQ_SHIFT;
876 control->final = (enh & L2CAP_CTRL_FINAL) >> L2CAP_CTRL_FINAL_SHIFT;
877
878 if (enh & L2CAP_CTRL_FRAME_TYPE) {
879 /* S-Frame */
880 control->sframe = 1;
881 control->poll = (enh & L2CAP_CTRL_POLL) >> L2CAP_CTRL_POLL_SHIFT;
882 control->super = (enh & L2CAP_CTRL_SUPERVISE) >> L2CAP_CTRL_SUPER_SHIFT;
883
884 control->sar = 0;
885 control->txseq = 0;
886 } else {
887 /* I-Frame */
888 control->sframe = 0;
889 control->sar = (enh & L2CAP_CTRL_SAR) >> L2CAP_CTRL_SAR_SHIFT;
890 control->txseq = (enh & L2CAP_CTRL_TXSEQ) >> L2CAP_CTRL_TXSEQ_SHIFT;
891
892 control->poll = 0;
893 control->super = 0;
894 }
895}
896
897static void __unpack_extended_control(u32 ext, struct l2cap_ctrl *control)
898{
899 control->reqseq = (ext & L2CAP_EXT_CTRL_REQSEQ) >> L2CAP_EXT_CTRL_REQSEQ_SHIFT;
900 control->final = (ext & L2CAP_EXT_CTRL_FINAL) >> L2CAP_EXT_CTRL_FINAL_SHIFT;
901
902 if (ext & L2CAP_EXT_CTRL_FRAME_TYPE) {
903 /* S-Frame */
904 control->sframe = 1;
905 control->poll = (ext & L2CAP_EXT_CTRL_POLL) >> L2CAP_EXT_CTRL_POLL_SHIFT;
906 control->super = (ext & L2CAP_EXT_CTRL_SUPERVISE) >> L2CAP_EXT_CTRL_SUPER_SHIFT;
907
908 control->sar = 0;
909 control->txseq = 0;
910 } else {
911 /* I-Frame */
912 control->sframe = 0;
913 control->sar = (ext & L2CAP_EXT_CTRL_SAR) >> L2CAP_EXT_CTRL_SAR_SHIFT;
914 control->txseq = (ext & L2CAP_EXT_CTRL_TXSEQ) >> L2CAP_EXT_CTRL_TXSEQ_SHIFT;
915
916 control->poll = 0;
917 control->super = 0;
918 }
919}
920
921static inline void __unpack_control(struct l2cap_chan *chan,
922 struct sk_buff *skb)
923{
924 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
925 __unpack_extended_control(get_unaligned_le32(skb->data),
926 &bt_cb(skb)->control);
Mat Martineaucec8ab6e2012-05-17 20:53:36 -0700927 skb_pull(skb, L2CAP_EXT_CTRL_SIZE);
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700928 } else {
929 __unpack_enhanced_control(get_unaligned_le16(skb->data),
930 &bt_cb(skb)->control);
Mat Martineaucec8ab6e2012-05-17 20:53:36 -0700931 skb_pull(skb, L2CAP_ENH_CTRL_SIZE);
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700932 }
933}
934
935static u32 __pack_extended_control(struct l2cap_ctrl *control)
936{
937 u32 packed;
938
939 packed = control->reqseq << L2CAP_EXT_CTRL_REQSEQ_SHIFT;
940 packed |= control->final << L2CAP_EXT_CTRL_FINAL_SHIFT;
941
942 if (control->sframe) {
943 packed |= control->poll << L2CAP_EXT_CTRL_POLL_SHIFT;
944 packed |= control->super << L2CAP_EXT_CTRL_SUPER_SHIFT;
945 packed |= L2CAP_EXT_CTRL_FRAME_TYPE;
946 } else {
947 packed |= control->sar << L2CAP_EXT_CTRL_SAR_SHIFT;
948 packed |= control->txseq << L2CAP_EXT_CTRL_TXSEQ_SHIFT;
949 }
950
951 return packed;
952}
953
954static u16 __pack_enhanced_control(struct l2cap_ctrl *control)
955{
956 u16 packed;
957
958 packed = control->reqseq << L2CAP_CTRL_REQSEQ_SHIFT;
959 packed |= control->final << L2CAP_CTRL_FINAL_SHIFT;
960
961 if (control->sframe) {
962 packed |= control->poll << L2CAP_CTRL_POLL_SHIFT;
963 packed |= control->super << L2CAP_CTRL_SUPER_SHIFT;
964 packed |= L2CAP_CTRL_FRAME_TYPE;
965 } else {
966 packed |= control->sar << L2CAP_CTRL_SAR_SHIFT;
967 packed |= control->txseq << L2CAP_CTRL_TXSEQ_SHIFT;
968 }
969
970 return packed;
971}
972
973static inline void __pack_control(struct l2cap_chan *chan,
974 struct l2cap_ctrl *control,
975 struct sk_buff *skb)
976{
977 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
978 put_unaligned_le32(__pack_extended_control(control),
979 skb->data + L2CAP_HDR_SIZE);
980 } else {
981 put_unaligned_le16(__pack_enhanced_control(control),
982 skb->data + L2CAP_HDR_SIZE);
983 }
984}
985
Gustavo Padovanba7aa642012-05-29 13:29:16 -0300986static inline unsigned int __ertm_hdr_size(struct l2cap_chan *chan)
987{
988 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
989 return L2CAP_EXT_HDR_SIZE;
990 else
991 return L2CAP_ENH_HDR_SIZE;
992}
993
Mat Martineaua67d7f62012-05-17 20:53:35 -0700994static struct sk_buff *l2cap_create_sframe_pdu(struct l2cap_chan *chan,
995 u32 control)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300996{
997 struct sk_buff *skb;
998 struct l2cap_hdr *lh;
Gustavo Padovanba7aa642012-05-29 13:29:16 -0300999 int hlen = __ertm_hdr_size(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001000
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001001 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03001002 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001003
Mat Martineaua67d7f62012-05-17 20:53:35 -07001004 skb = bt_skb_alloc(hlen, GFP_KERNEL);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001005
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001006 if (!skb)
Mat Martineaua67d7f62012-05-17 20:53:35 -07001007 return ERR_PTR(-ENOMEM);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001008
1009 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001010 lh->len = cpu_to_le16(hlen - L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001011 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03001012
Mat Martineaua67d7f62012-05-17 20:53:35 -07001013 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
1014 put_unaligned_le32(control, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
1015 else
1016 put_unaligned_le16(control, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001017
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001018 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineaua67d7f62012-05-17 20:53:35 -07001019 u16 fcs = crc16(0, (u8 *)skb->data, skb->len);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03001020 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001021 }
1022
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001023 skb->priority = HCI_PRIO_MAX;
Mat Martineaua67d7f62012-05-17 20:53:35 -07001024 return skb;
1025}
1026
1027static void l2cap_send_sframe(struct l2cap_chan *chan,
1028 struct l2cap_ctrl *control)
1029{
1030 struct sk_buff *skb;
1031 u32 control_field;
1032
1033 BT_DBG("chan %p, control %p", chan, control);
1034
1035 if (!control->sframe)
1036 return;
1037
Mat Martineaub99e13a2012-10-23 15:24:19 -07001038 if (__chan_is_moving(chan))
1039 return;
1040
Mat Martineaua67d7f62012-05-17 20:53:35 -07001041 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state) &&
1042 !control->poll)
1043 control->final = 1;
1044
1045 if (control->super == L2CAP_SUPER_RR)
1046 clear_bit(CONN_RNR_SENT, &chan->conn_state);
1047 else if (control->super == L2CAP_SUPER_RNR)
1048 set_bit(CONN_RNR_SENT, &chan->conn_state);
1049
1050 if (control->super != L2CAP_SUPER_SREJ) {
1051 chan->last_acked_seq = control->reqseq;
1052 __clear_ack_timer(chan);
1053 }
1054
1055 BT_DBG("reqseq %d, final %d, poll %d, super %d", control->reqseq,
1056 control->final, control->poll, control->super);
1057
1058 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
1059 control_field = __pack_extended_control(control);
1060 else
1061 control_field = __pack_enhanced_control(control);
1062
1063 skb = l2cap_create_sframe_pdu(chan, control_field);
1064 if (!IS_ERR(skb))
1065 l2cap_do_send(chan, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001066}
1067
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001068static void l2cap_send_rr_or_rnr(struct l2cap_chan *chan, bool poll)
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001069{
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001070 struct l2cap_ctrl control;
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001071
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001072 BT_DBG("chan %p, poll %d", chan, poll);
1073
1074 memset(&control, 0, sizeof(control));
1075 control.sframe = 1;
1076 control.poll = poll;
1077
1078 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
1079 control.super = L2CAP_SUPER_RNR;
1080 else
1081 control.super = L2CAP_SUPER_RR;
1082
1083 control.reqseq = chan->buffer_seq;
1084 l2cap_send_sframe(chan, &control);
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001085}
1086
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001087static inline int __l2cap_no_conn_pending(struct l2cap_chan *chan)
Andrei Emeltchenkoe501d052010-07-08 12:14:41 +03001088{
Johan Hedberg5ff6f342014-08-07 22:56:43 +03001089 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED)
1090 return true;
1091
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001092 return !test_bit(CONF_CONNECT_PEND, &chan->conf_state);
Andrei Emeltchenkoe501d052010-07-08 12:14:41 +03001093}
1094
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001095static bool __amp_capable(struct l2cap_chan *chan)
1096{
1097 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann1df7b172013-10-05 11:47:49 -07001098 struct hci_dev *hdev;
1099 bool amp_available = false;
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001100
Marcel Holtmann1df7b172013-10-05 11:47:49 -07001101 if (!conn->hs_enabled)
1102 return false;
1103
1104 if (!(conn->fixed_chan_mask & L2CAP_FC_A2MP))
1105 return false;
1106
1107 read_lock(&hci_dev_list_lock);
1108 list_for_each_entry(hdev, &hci_dev_list, list) {
1109 if (hdev->amp_type != AMP_TYPE_BREDR &&
1110 test_bit(HCI_UP, &hdev->flags)) {
1111 amp_available = true;
1112 break;
1113 }
1114 }
1115 read_unlock(&hci_dev_list_lock);
1116
1117 if (chan->chan_policy == BT_CHANNEL_POLICY_AMP_PREFERRED)
1118 return amp_available;
Marcel Holtmann848566b2013-10-01 22:59:22 -07001119
1120 return false;
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001121}
1122
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02001123static bool l2cap_check_efs(struct l2cap_chan *chan)
1124{
1125 /* Check EFS parameters */
1126 return true;
1127}
1128
Andrei Emeltchenko2766be42012-09-27 17:26:21 +03001129void l2cap_send_conn_req(struct l2cap_chan *chan)
Andrei Emeltchenko9b27f352012-02-24 16:00:00 +02001130{
1131 struct l2cap_conn *conn = chan->conn;
1132 struct l2cap_conn_req req;
1133
1134 req.scid = cpu_to_le16(chan->scid);
1135 req.psm = chan->psm;
1136
1137 chan->ident = l2cap_get_ident(conn);
1138
1139 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
1140
1141 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_REQ, sizeof(req), &req);
1142}
1143
Mat Martineau8eb200b2012-10-23 15:24:17 -07001144static void l2cap_send_create_chan_req(struct l2cap_chan *chan, u8 amp_id)
1145{
1146 struct l2cap_create_chan_req req;
1147 req.scid = cpu_to_le16(chan->scid);
1148 req.psm = chan->psm;
1149 req.amp_id = amp_id;
1150
1151 chan->ident = l2cap_get_ident(chan->conn);
1152
1153 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_REQ,
1154 sizeof(req), &req);
1155}
1156
Mat Martineau02b0fbb2012-10-23 15:24:10 -07001157static void l2cap_move_setup(struct l2cap_chan *chan)
1158{
1159 struct sk_buff *skb;
1160
1161 BT_DBG("chan %p", chan);
1162
1163 if (chan->mode != L2CAP_MODE_ERTM)
1164 return;
1165
1166 __clear_retrans_timer(chan);
1167 __clear_monitor_timer(chan);
1168 __clear_ack_timer(chan);
1169
1170 chan->retry_count = 0;
1171 skb_queue_walk(&chan->tx_q, skb) {
1172 if (bt_cb(skb)->control.retries)
1173 bt_cb(skb)->control.retries = 1;
1174 else
1175 break;
1176 }
1177
1178 chan->expected_tx_seq = chan->buffer_seq;
1179
1180 clear_bit(CONN_REJ_ACT, &chan->conn_state);
1181 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
1182 l2cap_seq_list_clear(&chan->retrans_list);
1183 l2cap_seq_list_clear(&chan->srej_list);
1184 skb_queue_purge(&chan->srej_q);
1185
1186 chan->tx_state = L2CAP_TX_STATE_XMIT;
1187 chan->rx_state = L2CAP_RX_STATE_MOVE;
1188
1189 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
1190}
1191
Mat Martineau5f3847a2012-10-23 15:24:12 -07001192static void l2cap_move_done(struct l2cap_chan *chan)
1193{
1194 u8 move_role = chan->move_role;
1195 BT_DBG("chan %p", chan);
1196
1197 chan->move_state = L2CAP_MOVE_STABLE;
1198 chan->move_role = L2CAP_MOVE_ROLE_NONE;
1199
1200 if (chan->mode != L2CAP_MODE_ERTM)
1201 return;
1202
1203 switch (move_role) {
1204 case L2CAP_MOVE_ROLE_INITIATOR:
1205 l2cap_tx(chan, NULL, NULL, L2CAP_EV_EXPLICIT_POLL);
1206 chan->rx_state = L2CAP_RX_STATE_WAIT_F;
1207 break;
1208 case L2CAP_MOVE_ROLE_RESPONDER:
1209 chan->rx_state = L2CAP_RX_STATE_WAIT_P;
1210 break;
1211 }
1212}
1213
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001214static void l2cap_chan_ready(struct l2cap_chan *chan)
1215{
Mat Martineau28270112012-05-17 21:14:09 -07001216 /* This clears all conf flags, including CONF_NOT_COMPLETE */
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001217 chan->conf_state = 0;
1218 __clear_chan_timer(chan);
1219
Johan Hedberg0ce43ce2013-12-05 14:55:33 +02001220 if (chan->mode == L2CAP_MODE_LE_FLOWCTL && !chan->tx_credits)
1221 chan->ops->suspend(chan);
Johan Hedberg177f8f22013-05-31 17:54:51 +03001222
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001223 chan->state = BT_CONNECTED;
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001224
Andrei Emeltchenkofd83e2c2012-05-30 09:55:32 +03001225 chan->ops->ready(chan);
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001226}
1227
Johan Hedbergf1496de2013-05-13 14:15:56 +03001228static void l2cap_le_connect(struct l2cap_chan *chan)
1229{
1230 struct l2cap_conn *conn = chan->conn;
1231 struct l2cap_le_conn_req req;
1232
Johan Hedberg595177f2013-12-02 22:12:22 +02001233 if (test_and_set_bit(FLAG_LE_CONN_REQ_SENT, &chan->flags))
1234 return;
1235
Johan Hedbergf1496de2013-05-13 14:15:56 +03001236 req.psm = chan->psm;
1237 req.scid = cpu_to_le16(chan->scid);
1238 req.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02001239 req.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03001240 req.credits = cpu_to_le16(chan->rx_credits);
Johan Hedbergf1496de2013-05-13 14:15:56 +03001241
1242 chan->ident = l2cap_get_ident(conn);
1243
1244 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_REQ,
1245 sizeof(req), &req);
1246}
1247
1248static void l2cap_le_start(struct l2cap_chan *chan)
1249{
1250 struct l2cap_conn *conn = chan->conn;
1251
1252 if (!smp_conn_security(conn->hcon, chan->sec_level))
1253 return;
1254
1255 if (!chan->psm) {
1256 l2cap_chan_ready(chan);
1257 return;
1258 }
1259
1260 if (chan->state == BT_CONNECT)
1261 l2cap_le_connect(chan);
1262}
1263
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001264static void l2cap_start_connection(struct l2cap_chan *chan)
1265{
1266 if (__amp_capable(chan)) {
1267 BT_DBG("chan %p AMP capable: discover AMPs", chan);
1268 a2mp_discover_amp(chan);
Johan Hedbergf1496de2013-05-13 14:15:56 +03001269 } else if (chan->conn->hcon->type == LE_LINK) {
1270 l2cap_le_start(chan);
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001271 } else {
1272 l2cap_send_conn_req(chan);
1273 }
1274}
1275
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001276static void l2cap_do_start(struct l2cap_chan *chan)
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001277{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03001278 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001279
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001280 if (conn->hcon->type == LE_LINK) {
Johan Hedberg96ac34f2013-05-13 11:15:07 +03001281 l2cap_le_start(chan);
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001282 return;
1283 }
1284
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001285 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) {
Marcel Holtmann984947d2009-02-06 23:35:19 +01001286 if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE))
1287 return;
1288
Johan Hedberge7cafc42014-07-17 15:35:38 +03001289 if (l2cap_chan_check_security(chan, true) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01001290 __l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001291 l2cap_start_connection(chan);
1292 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001293 } else {
1294 struct l2cap_info_req req;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001295 req.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001296
1297 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
1298 conn->info_ident = l2cap_get_ident(conn);
1299
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08001300 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001301
Gustavo Padovan2d792812012-10-06 10:07:01 +01001302 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
1303 sizeof(req), &req);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001304 }
1305}
1306
Gustavo F. Padovancf6c2c02010-06-07 20:54:45 -03001307static inline int l2cap_mode_supported(__u8 mode, __u32 feat_mask)
1308{
1309 u32 local_feat_mask = l2cap_feat_mask;
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03001310 if (!disable_ertm)
Gustavo F. Padovancf6c2c02010-06-07 20:54:45 -03001311 local_feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING;
1312
1313 switch (mode) {
1314 case L2CAP_MODE_ERTM:
1315 return L2CAP_FEAT_ERTM & feat_mask & local_feat_mask;
1316 case L2CAP_MODE_STREAMING:
1317 return L2CAP_FEAT_STREAMING & feat_mask & local_feat_mask;
1318 default:
1319 return 0x00;
1320 }
1321}
1322
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001323static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err)
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001324{
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001325 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001326 struct l2cap_disconn_req req;
1327
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001328 if (!conn)
1329 return;
1330
Andrei Emeltchenkoaad3d0e2012-09-06 15:05:42 +03001331 if (chan->mode == L2CAP_MODE_ERTM && chan->state == BT_CONNECTED) {
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03001332 __clear_retrans_timer(chan);
1333 __clear_monitor_timer(chan);
1334 __clear_ack_timer(chan);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001335 }
1336
Johan Hedberg2338a7e2014-01-24 10:35:40 +02001337 if (chan->scid == L2CAP_CID_A2MP) {
Gustavo Padovand1177732012-10-06 11:47:38 +01001338 l2cap_state_change(chan, BT_DISCONN);
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001339 return;
1340 }
1341
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001342 req.dcid = cpu_to_le16(chan->dcid);
1343 req.scid = cpu_to_le16(chan->scid);
Gustavo Padovan2d792812012-10-06 10:07:01 +01001344 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_DISCONN_REQ,
1345 sizeof(req), &req);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001346
Gustavo Padovanf8e73012013-10-15 19:24:46 -03001347 l2cap_state_change_and_error(chan, BT_DISCONN, err);
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001348}
1349
Linus Torvalds1da177e2005-04-16 15:20:36 -07001350/* ---- L2CAP connections ---- */
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001351static void l2cap_conn_start(struct l2cap_conn *conn)
1352{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001353 struct l2cap_chan *chan, *tmp;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001354
1355 BT_DBG("conn %p", conn);
1356
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001357 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001358
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001359 list_for_each_entry_safe(chan, tmp, &conn->chan_l, list) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001360 l2cap_chan_lock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001361
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001362 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001363 l2cap_chan_unlock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001364 continue;
1365 }
1366
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001367 if (chan->state == BT_CONNECT) {
Johan Hedberge7cafc42014-07-17 15:35:38 +03001368 if (!l2cap_chan_check_security(chan, true) ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01001369 !__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001370 l2cap_chan_unlock(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001371 continue;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02001372 }
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001373
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001374 if (!l2cap_mode_supported(chan->mode, conn->feat_mask)
Gustavo Padovan2d792812012-10-06 10:07:01 +01001375 && test_bit(CONF_STATE2_DEVICE,
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001376 &chan->conf_state)) {
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001377 l2cap_chan_close(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001378 l2cap_chan_unlock(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001379 continue;
1380 }
1381
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001382 l2cap_start_connection(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001383
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001384 } else if (chan->state == BT_CONNECT2) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001385 struct l2cap_conn_rsp rsp;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001386 char buf[128];
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001387 rsp.scid = cpu_to_le16(chan->dcid);
1388 rsp.dcid = cpu_to_le16(chan->scid);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001389
Johan Hedberge7cafc42014-07-17 15:35:38 +03001390 if (l2cap_chan_check_security(chan, false)) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07001391 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001392 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
1393 rsp.status = cpu_to_le16(L2CAP_CS_AUTHOR_PEND);
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001394 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001395
1396 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001397 l2cap_state_change(chan, BT_CONFIG);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001398 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
1399 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001400 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001401 } else {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001402 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
1403 rsp.status = cpu_to_le16(L2CAP_CS_AUTHEN_PEND);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001404 }
1405
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001406 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001407 sizeof(rsp), &rsp);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001408
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001409 if (test_bit(CONF_REQ_SENT, &chan->conf_state) ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01001410 rsp.result != L2CAP_CR_SUCCESS) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001411 l2cap_chan_unlock(chan);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001412 continue;
1413 }
1414
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001415 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001416 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001417 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03001418 chan->num_conf_req++;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001419 }
1420
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001421 l2cap_chan_unlock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001422 }
1423
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001424 mutex_unlock(&conn->chan_lock);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001425}
1426
Ville Tervob62f3282011-02-10 22:38:50 -03001427static void l2cap_le_conn_ready(struct l2cap_conn *conn)
1428{
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001429 struct hci_conn *hcon = conn->hcon;
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001430 struct hci_dev *hdev = hcon->hdev;
Ville Tervob62f3282011-02-10 22:38:50 -03001431
Johan Hedberge760ec12014-08-07 22:56:47 +03001432 BT_DBG("%s conn %p", hdev->name, conn);
Ville Tervob62f3282011-02-10 22:38:50 -03001433
Johan Hedberge760ec12014-08-07 22:56:47 +03001434 /* For outgoing pairing which doesn't necessarily have an
1435 * associated socket (e.g. mgmt_pair_device).
1436 */
1437 if (hcon->out)
1438 smp_conn_security(hcon, hcon->pending_sec_level);
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001439
Marcel Holtmann80afeb62014-06-23 12:18:51 +02001440 /* For LE slave connections, make sure the connection interval
1441 * is in the range of the minium and maximum interval that has
1442 * been configured for this connection. If not, then trigger
1443 * the connection update procedure.
1444 */
Johan Hedberg40bef302014-07-16 11:42:27 +03001445 if (hcon->role == HCI_ROLE_SLAVE &&
Marcel Holtmann80afeb62014-06-23 12:18:51 +02001446 (hcon->le_conn_interval < hcon->le_conn_min_interval ||
1447 hcon->le_conn_interval > hcon->le_conn_max_interval)) {
1448 struct l2cap_conn_param_update_req req;
1449
1450 req.min = cpu_to_le16(hcon->le_conn_min_interval);
1451 req.max = cpu_to_le16(hcon->le_conn_max_interval);
1452 req.latency = cpu_to_le16(hcon->le_conn_latency);
1453 req.to_multiplier = cpu_to_le16(hcon->le_supv_timeout);
1454
1455 l2cap_send_cmd(conn, l2cap_get_ident(conn),
1456 L2CAP_CONN_PARAM_UPDATE_REQ, sizeof(req), &req);
1457 }
Ville Tervob62f3282011-02-10 22:38:50 -03001458}
1459
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001460static void l2cap_conn_ready(struct l2cap_conn *conn)
1461{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001462 struct l2cap_chan *chan;
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001463 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001464
1465 BT_DBG("conn %p", conn);
1466
Johan Hedberg44f3b0f2013-04-29 19:35:45 +03001467 if (hcon->type == LE_LINK)
1468 l2cap_le_conn_ready(conn);
1469
Johan Hedberge760ec12014-08-07 22:56:47 +03001470 mutex_lock(&conn->chan_lock);
1471
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001472 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03001473
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001474 l2cap_chan_lock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001475
Johan Hedberg2338a7e2014-01-24 10:35:40 +02001476 if (chan->scid == L2CAP_CID_A2MP) {
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001477 l2cap_chan_unlock(chan);
1478 continue;
1479 }
1480
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001481 if (hcon->type == LE_LINK) {
Johan Hedbergf1496de2013-05-13 14:15:56 +03001482 l2cap_le_start(chan);
Vinicius Costa Gomes63128452011-06-17 22:46:26 -03001483 } else if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Gustavo Padovan74e75742013-10-15 19:24:51 -03001484 l2cap_chan_ready(chan);
Anderson Brigliab501d6a2011-06-07 18:46:31 -03001485
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001486 } else if (chan->state == BT_CONNECT) {
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001487 l2cap_do_start(chan);
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001488 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001489
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001490 l2cap_chan_unlock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001491 }
1492
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001493 mutex_unlock(&conn->chan_lock);
Johan Hedberg61a939c2014-01-17 20:45:11 +02001494
1495 queue_work(hcon->hdev->workqueue, &conn->pending_rx_work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001496}
1497
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001498/* Notify sockets that we cannot guaranty reliability anymore */
1499static void l2cap_conn_unreliable(struct l2cap_conn *conn, int err)
1500{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001501 struct l2cap_chan *chan;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001502
1503 BT_DBG("conn %p", conn);
1504
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001505 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001506
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001507 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +03001508 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo Padovan1d8b1fd2012-10-06 11:34:52 +01001509 l2cap_chan_set_err(chan, err);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001510 }
1511
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001512 mutex_unlock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001513}
1514
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001515static void l2cap_info_timeout(struct work_struct *work)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001516{
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001517 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001518 info_timer.work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001519
Marcel Holtmann984947d2009-02-06 23:35:19 +01001520 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01001521 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01001522
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001523 l2cap_conn_start(conn);
1524}
1525
David Herrmann2c8e1412013-04-06 20:28:45 +02001526/*
1527 * l2cap_user
1528 * External modules can register l2cap_user objects on l2cap_conn. The ->probe
1529 * callback is called during registration. The ->remove callback is called
1530 * during unregistration.
1531 * An l2cap_user object can either be explicitly unregistered or when the
1532 * underlying l2cap_conn object is deleted. This guarantees that l2cap->hcon,
1533 * l2cap->hchan, .. are valid as long as the remove callback hasn't been called.
1534 * External modules must own a reference to the l2cap_conn object if they intend
1535 * to call l2cap_unregister_user(). The l2cap_conn object might get destroyed at
1536 * any time if they don't.
1537 */
1538
1539int l2cap_register_user(struct l2cap_conn *conn, struct l2cap_user *user)
1540{
1541 struct hci_dev *hdev = conn->hcon->hdev;
1542 int ret;
1543
1544 /* We need to check whether l2cap_conn is registered. If it is not, we
1545 * must not register the l2cap_user. l2cap_conn_del() is unregisters
1546 * l2cap_conn objects, but doesn't provide its own locking. Instead, it
1547 * relies on the parent hci_conn object to be locked. This itself relies
1548 * on the hci_dev object to be locked. So we must lock the hci device
1549 * here, too. */
1550
1551 hci_dev_lock(hdev);
1552
1553 if (user->list.next || user->list.prev) {
1554 ret = -EINVAL;
1555 goto out_unlock;
1556 }
1557
1558 /* conn->hchan is NULL after l2cap_conn_del() was called */
1559 if (!conn->hchan) {
1560 ret = -ENODEV;
1561 goto out_unlock;
1562 }
1563
1564 ret = user->probe(conn, user);
1565 if (ret)
1566 goto out_unlock;
1567
1568 list_add(&user->list, &conn->users);
1569 ret = 0;
1570
1571out_unlock:
1572 hci_dev_unlock(hdev);
1573 return ret;
1574}
1575EXPORT_SYMBOL(l2cap_register_user);
1576
1577void l2cap_unregister_user(struct l2cap_conn *conn, struct l2cap_user *user)
1578{
1579 struct hci_dev *hdev = conn->hcon->hdev;
1580
1581 hci_dev_lock(hdev);
1582
1583 if (!user->list.next || !user->list.prev)
1584 goto out_unlock;
1585
1586 list_del(&user->list);
1587 user->list.next = NULL;
1588 user->list.prev = NULL;
1589 user->remove(conn, user);
1590
1591out_unlock:
1592 hci_dev_unlock(hdev);
1593}
1594EXPORT_SYMBOL(l2cap_unregister_user);
1595
1596static void l2cap_unregister_all_users(struct l2cap_conn *conn)
1597{
1598 struct l2cap_user *user;
1599
1600 while (!list_empty(&conn->users)) {
1601 user = list_first_entry(&conn->users, struct l2cap_user, list);
1602 list_del(&user->list);
1603 user->list.next = NULL;
1604 user->list.prev = NULL;
1605 user->remove(conn, user);
1606 }
1607}
1608
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001609static void l2cap_conn_del(struct hci_conn *hcon, int err)
1610{
1611 struct l2cap_conn *conn = hcon->l2cap_data;
1612 struct l2cap_chan *chan, *l;
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001613
1614 if (!conn)
1615 return;
1616
1617 BT_DBG("hcon %p conn %p, err %d", hcon, conn, err);
1618
1619 kfree_skb(conn->rx_skb);
1620
Johan Hedberg61a939c2014-01-17 20:45:11 +02001621 skb_queue_purge(&conn->pending_rx);
Jukka Taimisto7ab56c32014-06-12 10:15:13 +00001622
1623 /* We can not call flush_work(&conn->pending_rx_work) here since we
1624 * might block if we are running on a worker from the same workqueue
1625 * pending_rx_work is waiting on.
1626 */
1627 if (work_pending(&conn->pending_rx_work))
1628 cancel_work_sync(&conn->pending_rx_work);
Johan Hedberg61a939c2014-01-17 20:45:11 +02001629
David Herrmann2c8e1412013-04-06 20:28:45 +02001630 l2cap_unregister_all_users(conn);
1631
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001632 mutex_lock(&conn->chan_lock);
1633
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001634 /* Kill channels */
1635 list_for_each_entry_safe(chan, l, &conn->chan_l, list) {
Mat Martineau61d6ef32012-04-27 16:50:50 -07001636 l2cap_chan_hold(chan);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001637 l2cap_chan_lock(chan);
1638
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001639 l2cap_chan_del(chan, err);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001640
1641 l2cap_chan_unlock(chan);
1642
Gustavo Padovan80b98022012-05-27 22:27:51 -03001643 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07001644 l2cap_chan_put(chan);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001645 }
1646
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001647 mutex_unlock(&conn->chan_lock);
1648
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001649 hci_chan_del(conn->hchan);
1650
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001651 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT)
Ulisses Furquim127074b2012-01-30 18:26:29 -02001652 cancel_delayed_work_sync(&conn->info_timer);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001653
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001654 if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags)) {
Ulisses Furquim127074b2012-01-30 18:26:29 -02001655 cancel_delayed_work_sync(&conn->security_timer);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001656 smp_chan_destroy(conn);
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001657 }
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001658
1659 hcon->l2cap_data = NULL;
David Herrmann9c903e32013-04-06 20:28:44 +02001660 conn->hchan = NULL;
1661 l2cap_conn_put(conn);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001662}
1663
Gustavo F. Padovan6c9d42a2011-12-20 10:57:27 -02001664static void security_timeout(struct work_struct *work)
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001665{
Gustavo F. Padovan6c9d42a2011-12-20 10:57:27 -02001666 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001667 security_timer.work);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001668
Johan Hedbergd06cc412012-06-06 18:44:11 +08001669 BT_DBG("conn %p", conn);
1670
1671 if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags)) {
1672 smp_chan_destroy(conn);
1673 l2cap_conn_del(conn->hcon, ETIMEDOUT);
1674 }
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001675}
1676
David Herrmann9c903e32013-04-06 20:28:44 +02001677static void l2cap_conn_free(struct kref *ref)
1678{
1679 struct l2cap_conn *conn = container_of(ref, struct l2cap_conn, ref);
1680
1681 hci_conn_put(conn->hcon);
1682 kfree(conn);
1683}
1684
1685void l2cap_conn_get(struct l2cap_conn *conn)
1686{
1687 kref_get(&conn->ref);
1688}
1689EXPORT_SYMBOL(l2cap_conn_get);
1690
1691void l2cap_conn_put(struct l2cap_conn *conn)
1692{
1693 kref_put(&conn->ref, l2cap_conn_free);
1694}
1695EXPORT_SYMBOL(l2cap_conn_put);
1696
Linus Torvalds1da177e2005-04-16 15:20:36 -07001697/* ---- Socket interface ---- */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001698
Ido Yarivc2287682012-04-20 15:46:07 -03001699/* Find socket with psm and source / destination bdaddr.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001700 * Returns closest match.
1701 */
Ido Yarivc2287682012-04-20 15:46:07 -03001702static struct l2cap_chan *l2cap_global_chan_by_psm(int state, __le16 psm,
1703 bdaddr_t *src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001704 bdaddr_t *dst,
1705 u8 link_type)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001706{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001707 struct l2cap_chan *c, *c1 = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001708
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001709 read_lock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001710
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001711 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001712 if (state && c->state != state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001713 continue;
1714
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001715 if (link_type == ACL_LINK && c->src_type != BDADDR_BREDR)
1716 continue;
1717
1718 if (link_type == LE_LINK && c->src_type == BDADDR_BREDR)
1719 continue;
1720
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001721 if (c->psm == psm) {
Ido Yarivc2287682012-04-20 15:46:07 -03001722 int src_match, dst_match;
1723 int src_any, dst_any;
1724
Linus Torvalds1da177e2005-04-16 15:20:36 -07001725 /* Exact match. */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001726 src_match = !bacmp(&c->src, src);
1727 dst_match = !bacmp(&c->dst, dst);
Ido Yarivc2287682012-04-20 15:46:07 -03001728 if (src_match && dst_match) {
Johan Hedberga24cce12014-08-07 22:56:42 +03001729 l2cap_chan_hold(c);
Johannes Berga7567b22011-06-01 08:29:54 +02001730 read_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001731 return c;
1732 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001733
1734 /* Closest match */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001735 src_any = !bacmp(&c->src, BDADDR_ANY);
1736 dst_any = !bacmp(&c->dst, BDADDR_ANY);
Ido Yarivc2287682012-04-20 15:46:07 -03001737 if ((src_match && dst_any) || (src_any && dst_match) ||
1738 (src_any && dst_any))
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001739 c1 = c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001740 }
1741 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001742
Johan Hedberga24cce12014-08-07 22:56:42 +03001743 if (c1)
1744 l2cap_chan_hold(c1);
1745
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001746 read_unlock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001747
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001748 return c1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001749}
1750
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001751static void l2cap_monitor_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001752{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001753 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001754 monitor_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001755
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03001756 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001757
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001758 l2cap_chan_lock(chan);
1759
Mat Martineau80909e02012-05-17 20:53:50 -07001760 if (!chan->conn) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001761 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001762 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001763 return;
1764 }
1765
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001766 l2cap_tx(chan, NULL, NULL, L2CAP_EV_MONITOR_TO);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001767
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001768 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001769 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001770}
1771
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001772static void l2cap_retrans_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001773{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001774 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001775 retrans_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001776
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03001777 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001778
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001779 l2cap_chan_lock(chan);
1780
Mat Martineau80909e02012-05-17 20:53:50 -07001781 if (!chan->conn) {
1782 l2cap_chan_unlock(chan);
1783 l2cap_chan_put(chan);
1784 return;
1785 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001786
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001787 l2cap_tx(chan, NULL, NULL, L2CAP_EV_RETRANS_TO);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001788 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001789 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001790}
1791
Gustavo Padovand6603662012-05-21 13:58:22 -03001792static void l2cap_streaming_send(struct l2cap_chan *chan,
1793 struct sk_buff_head *skbs)
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001794{
Gustavo F. Padovanccbb84a2010-08-30 18:44:44 -03001795 struct sk_buff *skb;
Mat Martineau37339372012-05-17 20:53:33 -07001796 struct l2cap_ctrl *control;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001797
Mat Martineau37339372012-05-17 20:53:33 -07001798 BT_DBG("chan %p, skbs %p", chan, skbs);
1799
Mat Martineaub99e13a2012-10-23 15:24:19 -07001800 if (__chan_is_moving(chan))
1801 return;
1802
Mat Martineau37339372012-05-17 20:53:33 -07001803 skb_queue_splice_tail_init(skbs, &chan->tx_q);
1804
1805 while (!skb_queue_empty(&chan->tx_q)) {
1806
1807 skb = skb_dequeue(&chan->tx_q);
1808
1809 bt_cb(skb)->control.retries = 1;
1810 control = &bt_cb(skb)->control;
1811
1812 control->reqseq = 0;
1813 control->txseq = chan->next_tx_seq;
1814
1815 __pack_control(chan, control, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001816
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001817 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau37339372012-05-17 20:53:33 -07001818 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1819 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001820 }
1821
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001822 l2cap_do_send(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001823
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001824 BT_DBG("Sent txseq %u", control->txseq);
Mat Martineau37339372012-05-17 20:53:33 -07001825
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001826 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau37339372012-05-17 20:53:33 -07001827 chan->frames_sent++;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001828 }
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001829}
1830
Szymon Janc67c9e842011-07-28 16:24:33 +02001831static int l2cap_ertm_send(struct l2cap_chan *chan)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001832{
1833 struct sk_buff *skb, *tx_skb;
Mat Martineau18a48e72012-05-17 20:53:34 -07001834 struct l2cap_ctrl *control;
1835 int sent = 0;
1836
1837 BT_DBG("chan %p", chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001838
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001839 if (chan->state != BT_CONNECTED)
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001840 return -ENOTCONN;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001841
Mat Martineau94122bb2012-05-02 09:42:02 -07001842 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1843 return 0;
1844
Mat Martineaub99e13a2012-10-23 15:24:19 -07001845 if (__chan_is_moving(chan))
1846 return 0;
1847
Mat Martineau18a48e72012-05-17 20:53:34 -07001848 while (chan->tx_send_head &&
1849 chan->unacked_frames < chan->remote_tx_win &&
1850 chan->tx_state == L2CAP_TX_STATE_XMIT) {
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001851
Mat Martineau18a48e72012-05-17 20:53:34 -07001852 skb = chan->tx_send_head;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001853
Mat Martineau18a48e72012-05-17 20:53:34 -07001854 bt_cb(skb)->control.retries = 1;
1855 control = &bt_cb(skb)->control;
Gustavo F. Padovan95ffa972010-06-18 20:37:33 -03001856
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001857 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
Mat Martineau18a48e72012-05-17 20:53:34 -07001858 control->final = 1;
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001859
Mat Martineau18a48e72012-05-17 20:53:34 -07001860 control->reqseq = chan->buffer_seq;
1861 chan->last_acked_seq = chan->buffer_seq;
1862 control->txseq = chan->next_tx_seq;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001863
Mat Martineau18a48e72012-05-17 20:53:34 -07001864 __pack_control(chan, control, skb);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001865
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001866 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau18a48e72012-05-17 20:53:34 -07001867 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1868 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001869 }
1870
Mat Martineau18a48e72012-05-17 20:53:34 -07001871 /* Clone after data has been modified. Data is assumed to be
1872 read-only (for locking purposes) on cloned sk_buffs.
1873 */
1874 tx_skb = skb_clone(skb, GFP_KERNEL);
1875
1876 if (!tx_skb)
1877 break;
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -03001878
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03001879 __set_retrans_timer(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001880
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001881 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau18a48e72012-05-17 20:53:34 -07001882 chan->unacked_frames++;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03001883 chan->frames_sent++;
Mat Martineau18a48e72012-05-17 20:53:34 -07001884 sent++;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001885
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001886 if (skb_queue_is_last(&chan->tx_q, skb))
1887 chan->tx_send_head = NULL;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001888 else
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001889 chan->tx_send_head = skb_queue_next(&chan->tx_q, skb);
Mat Martineau18a48e72012-05-17 20:53:34 -07001890
1891 l2cap_do_send(chan, tx_skb);
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001892 BT_DBG("Sent txseq %u", control->txseq);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001893 }
1894
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001895 BT_DBG("Sent %d, %u unacked, %u in ERTM queue", sent,
1896 chan->unacked_frames, skb_queue_len(&chan->tx_q));
Mat Martineau18a48e72012-05-17 20:53:34 -07001897
1898 return sent;
Gustavo F. Padovan9e917af2010-05-01 16:15:37 -03001899}
1900
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001901static void l2cap_ertm_resend(struct l2cap_chan *chan)
1902{
1903 struct l2cap_ctrl control;
1904 struct sk_buff *skb;
1905 struct sk_buff *tx_skb;
1906 u16 seq;
1907
1908 BT_DBG("chan %p", chan);
1909
1910 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1911 return;
1912
Mat Martineaub99e13a2012-10-23 15:24:19 -07001913 if (__chan_is_moving(chan))
1914 return;
1915
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001916 while (chan->retrans_list.head != L2CAP_SEQ_LIST_CLEAR) {
1917 seq = l2cap_seq_list_pop(&chan->retrans_list);
1918
1919 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, seq);
1920 if (!skb) {
1921 BT_DBG("Error: Can't retransmit seq %d, frame missing",
Gustavo Padovan2d792812012-10-06 10:07:01 +01001922 seq);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001923 continue;
1924 }
1925
1926 bt_cb(skb)->control.retries++;
1927 control = bt_cb(skb)->control;
1928
1929 if (chan->max_tx != 0 &&
1930 bt_cb(skb)->control.retries > chan->max_tx) {
1931 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001932 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001933 l2cap_seq_list_clear(&chan->retrans_list);
1934 break;
1935 }
1936
1937 control.reqseq = chan->buffer_seq;
1938 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
1939 control.final = 1;
1940 else
1941 control.final = 0;
1942
1943 if (skb_cloned(skb)) {
1944 /* Cloned sk_buffs are read-only, so we need a
1945 * writeable copy
1946 */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03001947 tx_skb = skb_copy(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001948 } else {
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03001949 tx_skb = skb_clone(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001950 }
1951
1952 if (!tx_skb) {
1953 l2cap_seq_list_clear(&chan->retrans_list);
1954 break;
1955 }
1956
1957 /* Update skb contents */
1958 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
1959 put_unaligned_le32(__pack_extended_control(&control),
1960 tx_skb->data + L2CAP_HDR_SIZE);
1961 } else {
1962 put_unaligned_le16(__pack_enhanced_control(&control),
1963 tx_skb->data + L2CAP_HDR_SIZE);
1964 }
1965
1966 if (chan->fcs == L2CAP_FCS_CRC16) {
1967 u16 fcs = crc16(0, (u8 *) tx_skb->data, tx_skb->len);
1968 put_unaligned_le16(fcs, skb_put(tx_skb,
1969 L2CAP_FCS_SIZE));
1970 }
1971
1972 l2cap_do_send(chan, tx_skb);
1973
1974 BT_DBG("Resent txseq %d", control.txseq);
1975
1976 chan->last_acked_seq = chan->buffer_seq;
1977 }
1978}
1979
Mat Martineauf80842a2012-05-17 20:53:46 -07001980static void l2cap_retransmit(struct l2cap_chan *chan,
1981 struct l2cap_ctrl *control)
1982{
1983 BT_DBG("chan %p, control %p", chan, control);
1984
1985 l2cap_seq_list_append(&chan->retrans_list, control->reqseq);
1986 l2cap_ertm_resend(chan);
1987}
1988
Mat Martineaud2a7ac52012-05-17 20:53:42 -07001989static void l2cap_retransmit_all(struct l2cap_chan *chan,
1990 struct l2cap_ctrl *control)
1991{
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001992 struct sk_buff *skb;
1993
1994 BT_DBG("chan %p, control %p", chan, control);
1995
1996 if (control->poll)
1997 set_bit(CONN_SEND_FBIT, &chan->conn_state);
1998
1999 l2cap_seq_list_clear(&chan->retrans_list);
2000
2001 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
2002 return;
2003
2004 if (chan->unacked_frames) {
2005 skb_queue_walk(&chan->tx_q, skb) {
2006 if (bt_cb(skb)->control.txseq == control->reqseq ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01002007 skb == chan->tx_send_head)
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002008 break;
2009 }
2010
2011 skb_queue_walk_from(&chan->tx_q, skb) {
2012 if (skb == chan->tx_send_head)
2013 break;
2014
2015 l2cap_seq_list_append(&chan->retrans_list,
2016 bt_cb(skb)->control.txseq);
2017 }
2018
2019 l2cap_ertm_resend(chan);
2020 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002021}
2022
Szymon Jancb17e73b2012-01-11 10:59:47 +01002023static void l2cap_send_ack(struct l2cap_chan *chan)
2024{
Mat Martineau0a0aba42012-05-17 20:53:39 -07002025 struct l2cap_ctrl control;
2026 u16 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
2027 chan->last_acked_seq);
2028 int threshold;
2029
2030 BT_DBG("chan %p last_acked_seq %d buffer_seq %d",
2031 chan, chan->last_acked_seq, chan->buffer_seq);
2032
2033 memset(&control, 0, sizeof(control));
2034 control.sframe = 1;
2035
2036 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
2037 chan->rx_state == L2CAP_RX_STATE_RECV) {
2038 __clear_ack_timer(chan);
2039 control.super = L2CAP_SUPER_RNR;
2040 control.reqseq = chan->buffer_seq;
2041 l2cap_send_sframe(chan, &control);
2042 } else {
2043 if (!test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) {
2044 l2cap_ertm_send(chan);
2045 /* If any i-frames were sent, they included an ack */
2046 if (chan->buffer_seq == chan->last_acked_seq)
2047 frames_to_ack = 0;
2048 }
2049
Mat Martineauc20f8e32012-07-10 05:47:07 -07002050 /* Ack now if the window is 3/4ths full.
Mat Martineau0a0aba42012-05-17 20:53:39 -07002051 * Calculate without mul or div
2052 */
Mat Martineauc20f8e32012-07-10 05:47:07 -07002053 threshold = chan->ack_win;
Mat Martineau0a0aba42012-05-17 20:53:39 -07002054 threshold += threshold << 1;
2055 threshold >>= 2;
2056
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002057 BT_DBG("frames_to_ack %u, threshold %d", frames_to_ack,
Mat Martineau0a0aba42012-05-17 20:53:39 -07002058 threshold);
2059
2060 if (frames_to_ack >= threshold) {
2061 __clear_ack_timer(chan);
2062 control.super = L2CAP_SUPER_RR;
2063 control.reqseq = chan->buffer_seq;
2064 l2cap_send_sframe(chan, &control);
2065 frames_to_ack = 0;
2066 }
2067
2068 if (frames_to_ack)
2069 __set_ack_timer(chan);
2070 }
Szymon Jancb17e73b2012-01-11 10:59:47 +01002071}
2072
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002073static inline int l2cap_skbuff_fromiovec(struct l2cap_chan *chan,
2074 struct msghdr *msg, int len,
2075 int count, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002076{
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002077 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002078 struct sk_buff **frag;
Gustavo Padovan90338942012-04-06 20:15:47 -03002079 int sent = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002080
Jukka Rissanen04988782014-06-18 16:37:07 +03002081 if (chan->ops->memcpy_fromiovec(chan, skb_put(skb, count),
2082 msg->msg_iov, count))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002083 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002084
2085 sent += count;
2086 len -= count;
2087
2088 /* Continuation fragments (no L2CAP header) */
2089 frag = &skb_shinfo(skb)->frag_list;
2090 while (len) {
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002091 struct sk_buff *tmp;
2092
Linus Torvalds1da177e2005-04-16 15:20:36 -07002093 count = min_t(unsigned int, conn->mtu, len);
2094
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002095 tmp = chan->ops->alloc_skb(chan, 0, count,
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002096 msg->msg_flags & MSG_DONTWAIT);
2097 if (IS_ERR(tmp))
2098 return PTR_ERR(tmp);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002099
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002100 *frag = tmp;
2101
Jukka Rissanen04988782014-06-18 16:37:07 +03002102 if (chan->ops->memcpy_fromiovec(chan, skb_put(*frag, count),
2103 msg->msg_iov, count))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002104 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002105
2106 sent += count;
2107 len -= count;
2108
Gustavo Padovan2d0ed3d2012-05-11 13:16:12 -03002109 skb->len += (*frag)->len;
2110 skb->data_len += (*frag)->len;
2111
Linus Torvalds1da177e2005-04-16 15:20:36 -07002112 frag = &(*frag)->next;
2113 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002114
2115 return sent;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002116}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002117
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002118static struct sk_buff *l2cap_create_connless_pdu(struct l2cap_chan *chan,
Marcel Holtmann8d463212014-06-05 15:22:51 +02002119 struct msghdr *msg, size_t len)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002120{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002121 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002122 struct sk_buff *skb;
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002123 int err, count, hlen = L2CAP_HDR_SIZE + L2CAP_PSMLEN_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002124 struct l2cap_hdr *lh;
2125
Marcel Holtmann8d463212014-06-05 15:22:51 +02002126 BT_DBG("chan %p psm 0x%2.2x len %zu", chan,
2127 __le16_to_cpu(chan->psm), len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002128
2129 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002130
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002131 skb = chan->ops->alloc_skb(chan, hlen, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002132 msg->msg_flags & MSG_DONTWAIT);
2133 if (IS_ERR(skb))
2134 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002135
2136 /* Create L2CAP header */
2137 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002138 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenkodaf6a78c2012-05-03 10:55:52 +03002139 lh->len = cpu_to_le16(len + L2CAP_PSMLEN_SIZE);
Marcel Holtmann43b1b8d2013-10-12 06:01:26 -07002140 put_unaligned(chan->psm, (__le16 *) skb_put(skb, L2CAP_PSMLEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002141
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002142 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002143 if (unlikely(err < 0)) {
2144 kfree_skb(skb);
2145 return ERR_PTR(err);
2146 }
2147 return skb;
2148}
2149
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002150static struct sk_buff *l2cap_create_basic_pdu(struct l2cap_chan *chan,
Marcel Holtmann8d463212014-06-05 15:22:51 +02002151 struct msghdr *msg, size_t len)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002152{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002153 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002154 struct sk_buff *skb;
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002155 int err, count;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002156 struct l2cap_hdr *lh;
2157
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002158 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002159
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002160 count = min_t(unsigned int, (conn->mtu - L2CAP_HDR_SIZE), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002161
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002162 skb = chan->ops->alloc_skb(chan, L2CAP_HDR_SIZE, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002163 msg->msg_flags & MSG_DONTWAIT);
2164 if (IS_ERR(skb))
2165 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002166
2167 /* Create L2CAP header */
2168 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002169 lh->cid = cpu_to_le16(chan->dcid);
Gustavo Padovan6ff9b5e2012-05-02 11:56:17 -03002170 lh->len = cpu_to_le16(len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002171
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002172 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002173 if (unlikely(err < 0)) {
2174 kfree_skb(skb);
2175 return ERR_PTR(err);
2176 }
2177 return skb;
2178}
2179
Luiz Augusto von Dentzab0ff762011-09-12 20:00:50 +03002180static struct sk_buff *l2cap_create_iframe_pdu(struct l2cap_chan *chan,
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002181 struct msghdr *msg, size_t len,
2182 u16 sdulen)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002183{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002184 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002185 struct sk_buff *skb;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002186 int err, count, hlen;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002187 struct l2cap_hdr *lh;
2188
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002189 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002190
Gustavo F. Padovan0ee0d202010-05-01 16:15:41 -03002191 if (!conn)
2192 return ERR_PTR(-ENOTCONN);
2193
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002194 hlen = __ertm_hdr_size(chan);
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002195
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002196 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002197 hlen += L2CAP_SDULEN_SIZE;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002198
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03002199 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002200 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03002201
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002202 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002203
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002204 skb = chan->ops->alloc_skb(chan, hlen, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002205 msg->msg_flags & MSG_DONTWAIT);
2206 if (IS_ERR(skb))
2207 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002208
2209 /* Create L2CAP header */
2210 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002211 lh->cid = cpu_to_le16(chan->dcid);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002212 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002213
Mat Martineau18a48e72012-05-17 20:53:34 -07002214 /* Control header is populated later */
2215 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
2216 put_unaligned_le32(0, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
2217 else
2218 put_unaligned_le16(0, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002219
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002220 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002221 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002222
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002223 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002224 if (unlikely(err < 0)) {
2225 kfree_skb(skb);
2226 return ERR_PTR(err);
2227 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03002228
Mat Martineau18a48e72012-05-17 20:53:34 -07002229 bt_cb(skb)->control.fcs = chan->fcs;
Mat Martineau3ce35142012-04-25 16:36:14 -07002230 bt_cb(skb)->control.retries = 0;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002231 return skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002232}
2233
Mat Martineau94122bb2012-05-02 09:42:02 -07002234static int l2cap_segment_sdu(struct l2cap_chan *chan,
2235 struct sk_buff_head *seg_queue,
2236 struct msghdr *msg, size_t len)
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002237{
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002238 struct sk_buff *skb;
Mat Martineau94122bb2012-05-02 09:42:02 -07002239 u16 sdu_len;
2240 size_t pdu_len;
Mat Martineau94122bb2012-05-02 09:42:02 -07002241 u8 sar;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002242
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002243 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002244
Mat Martineau94122bb2012-05-02 09:42:02 -07002245 /* It is critical that ERTM PDUs fit in a single HCI fragment,
2246 * so fragmented skbs are not used. The HCI layer's handling
2247 * of fragmented skbs is not compatible with ERTM's queueing.
2248 */
2249
2250 /* PDU size is derived from the HCI MTU */
2251 pdu_len = chan->conn->mtu;
2252
Mat Martineaua5495742012-10-23 15:24:21 -07002253 /* Constrain PDU size for BR/EDR connections */
2254 if (!chan->hs_hcon)
2255 pdu_len = min_t(size_t, pdu_len, L2CAP_BREDR_MAX_PAYLOAD);
Mat Martineau94122bb2012-05-02 09:42:02 -07002256
2257 /* Adjust for largest possible L2CAP overhead. */
Gustavo Padovan35d401d2012-05-25 18:57:05 -03002258 if (chan->fcs)
2259 pdu_len -= L2CAP_FCS_SIZE;
2260
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002261 pdu_len -= __ertm_hdr_size(chan);
Mat Martineau94122bb2012-05-02 09:42:02 -07002262
2263 /* Remote device may have requested smaller PDUs */
2264 pdu_len = min_t(size_t, pdu_len, chan->remote_mps);
2265
2266 if (len <= pdu_len) {
2267 sar = L2CAP_SAR_UNSEGMENTED;
2268 sdu_len = 0;
2269 pdu_len = len;
2270 } else {
2271 sar = L2CAP_SAR_START;
2272 sdu_len = len;
2273 pdu_len -= L2CAP_SDULEN_SIZE;
2274 }
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002275
2276 while (len > 0) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002277 skb = l2cap_create_iframe_pdu(chan, msg, pdu_len, sdu_len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002278
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002279 if (IS_ERR(skb)) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002280 __skb_queue_purge(seg_queue);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002281 return PTR_ERR(skb);
2282 }
2283
Mat Martineau94122bb2012-05-02 09:42:02 -07002284 bt_cb(skb)->control.sar = sar;
2285 __skb_queue_tail(seg_queue, skb);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002286
Mat Martineau94122bb2012-05-02 09:42:02 -07002287 len -= pdu_len;
2288 if (sdu_len) {
2289 sdu_len = 0;
2290 pdu_len += L2CAP_SDULEN_SIZE;
2291 }
2292
2293 if (len <= pdu_len) {
2294 sar = L2CAP_SAR_END;
2295 pdu_len = len;
2296 } else {
2297 sar = L2CAP_SAR_CONTINUE;
2298 }
2299 }
2300
Gustavo Padovanf0f62792012-05-29 13:29:17 -03002301 return 0;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002302}
2303
Johan Hedberg177f8f22013-05-31 17:54:51 +03002304static struct sk_buff *l2cap_create_le_flowctl_pdu(struct l2cap_chan *chan,
2305 struct msghdr *msg,
2306 size_t len, u16 sdulen)
2307{
2308 struct l2cap_conn *conn = chan->conn;
2309 struct sk_buff *skb;
2310 int err, count, hlen;
2311 struct l2cap_hdr *lh;
2312
2313 BT_DBG("chan %p len %zu", chan, len);
2314
2315 if (!conn)
2316 return ERR_PTR(-ENOTCONN);
2317
2318 hlen = L2CAP_HDR_SIZE;
2319
2320 if (sdulen)
2321 hlen += L2CAP_SDULEN_SIZE;
2322
2323 count = min_t(unsigned int, (conn->mtu - hlen), len);
2324
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002325 skb = chan->ops->alloc_skb(chan, hlen, count,
Johan Hedberg177f8f22013-05-31 17:54:51 +03002326 msg->msg_flags & MSG_DONTWAIT);
2327 if (IS_ERR(skb))
2328 return skb;
2329
2330 /* Create L2CAP header */
2331 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
2332 lh->cid = cpu_to_le16(chan->dcid);
2333 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
2334
2335 if (sdulen)
2336 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
2337
2338 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
2339 if (unlikely(err < 0)) {
2340 kfree_skb(skb);
2341 return ERR_PTR(err);
2342 }
2343
2344 return skb;
2345}
2346
2347static int l2cap_segment_le_sdu(struct l2cap_chan *chan,
2348 struct sk_buff_head *seg_queue,
2349 struct msghdr *msg, size_t len)
2350{
2351 struct sk_buff *skb;
2352 size_t pdu_len;
2353 u16 sdu_len;
2354
2355 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
2356
2357 pdu_len = chan->conn->mtu - L2CAP_HDR_SIZE;
2358
2359 pdu_len = min_t(size_t, pdu_len, chan->remote_mps);
2360
2361 sdu_len = len;
2362 pdu_len -= L2CAP_SDULEN_SIZE;
2363
2364 while (len > 0) {
2365 if (len <= pdu_len)
2366 pdu_len = len;
2367
2368 skb = l2cap_create_le_flowctl_pdu(chan, msg, pdu_len, sdu_len);
2369 if (IS_ERR(skb)) {
2370 __skb_queue_purge(seg_queue);
2371 return PTR_ERR(skb);
2372 }
2373
2374 __skb_queue_tail(seg_queue, skb);
2375
2376 len -= pdu_len;
2377
2378 if (sdu_len) {
2379 sdu_len = 0;
2380 pdu_len += L2CAP_SDULEN_SIZE;
2381 }
2382 }
2383
2384 return 0;
2385}
2386
Marcel Holtmann8d463212014-06-05 15:22:51 +02002387int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002388{
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002389 struct sk_buff *skb;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002390 int err;
Mat Martineau94122bb2012-05-02 09:42:02 -07002391 struct sk_buff_head seg_queue;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002392
Seung-Woo Kim31e8ce82013-11-05 18:46:33 +09002393 if (!chan->conn)
2394 return -ENOTCONN;
2395
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002396 /* Connectionless channel */
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002397 if (chan->chan_type == L2CAP_CHAN_CONN_LESS) {
Marcel Holtmann8d463212014-06-05 15:22:51 +02002398 skb = l2cap_create_connless_pdu(chan, msg, len);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002399 if (IS_ERR(skb))
2400 return PTR_ERR(skb);
2401
Andrzej Kaczmarekede81a22014-02-25 17:16:22 +01002402 /* Channel lock is released before requesting new skb and then
2403 * reacquired thus we need to recheck channel state.
2404 */
2405 if (chan->state != BT_CONNECTED) {
2406 kfree_skb(skb);
2407 return -ENOTCONN;
2408 }
2409
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002410 l2cap_do_send(chan, skb);
2411 return len;
2412 }
2413
2414 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03002415 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedberg177f8f22013-05-31 17:54:51 +03002416 /* Check outgoing MTU */
2417 if (len > chan->omtu)
2418 return -EMSGSIZE;
2419
Johan Hedbergfad5fc82013-12-05 09:45:01 +02002420 if (!chan->tx_credits)
2421 return -EAGAIN;
2422
Johan Hedberg177f8f22013-05-31 17:54:51 +03002423 __skb_queue_head_init(&seg_queue);
2424
2425 err = l2cap_segment_le_sdu(chan, &seg_queue, msg, len);
2426
2427 if (chan->state != BT_CONNECTED) {
2428 __skb_queue_purge(&seg_queue);
2429 err = -ENOTCONN;
2430 }
2431
2432 if (err)
2433 return err;
2434
2435 skb_queue_splice_tail_init(&seg_queue, &chan->tx_q);
2436
2437 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
2438 l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
2439 chan->tx_credits--;
2440 }
2441
2442 if (!chan->tx_credits)
2443 chan->ops->suspend(chan);
2444
2445 err = len;
2446
2447 break;
2448
Johan Hedbergfad5fc82013-12-05 09:45:01 +02002449 case L2CAP_MODE_BASIC:
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002450 /* Check outgoing MTU */
2451 if (len > chan->omtu)
2452 return -EMSGSIZE;
2453
2454 /* Create a basic PDU */
Marcel Holtmann8d463212014-06-05 15:22:51 +02002455 skb = l2cap_create_basic_pdu(chan, msg, len);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002456 if (IS_ERR(skb))
2457 return PTR_ERR(skb);
2458
Andrzej Kaczmarekede81a22014-02-25 17:16:22 +01002459 /* Channel lock is released before requesting new skb and then
2460 * reacquired thus we need to recheck channel state.
2461 */
2462 if (chan->state != BT_CONNECTED) {
2463 kfree_skb(skb);
2464 return -ENOTCONN;
2465 }
2466
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002467 l2cap_do_send(chan, skb);
2468 err = len;
2469 break;
2470
2471 case L2CAP_MODE_ERTM:
2472 case L2CAP_MODE_STREAMING:
Mat Martineau94122bb2012-05-02 09:42:02 -07002473 /* Check outgoing MTU */
2474 if (len > chan->omtu) {
2475 err = -EMSGSIZE;
2476 break;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002477 }
2478
Mat Martineau94122bb2012-05-02 09:42:02 -07002479 __skb_queue_head_init(&seg_queue);
2480
2481 /* Do segmentation before calling in to the state machine,
2482 * since it's possible to block while waiting for memory
2483 * allocation.
2484 */
2485 err = l2cap_segment_sdu(chan, &seg_queue, msg, len);
2486
2487 /* The channel could have been closed while segmenting,
2488 * check that it is still connected.
2489 */
2490 if (chan->state != BT_CONNECTED) {
2491 __skb_queue_purge(&seg_queue);
2492 err = -ENOTCONN;
2493 }
2494
2495 if (err)
2496 break;
2497
Mat Martineau37339372012-05-17 20:53:33 -07002498 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo Padovand6603662012-05-21 13:58:22 -03002499 l2cap_tx(chan, NULL, &seg_queue, L2CAP_EV_DATA_REQUEST);
Mat Martineau37339372012-05-17 20:53:33 -07002500 else
Gustavo Padovand6603662012-05-21 13:58:22 -03002501 l2cap_streaming_send(chan, &seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002502
Gustavo Padovand6603662012-05-21 13:58:22 -03002503 err = len;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002504
Mat Martineau94122bb2012-05-02 09:42:02 -07002505 /* If the skbs were not queued for sending, they'll still be in
2506 * seg_queue and need to be purged.
2507 */
2508 __skb_queue_purge(&seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002509 break;
2510
2511 default:
2512 BT_DBG("bad state %1.1x", chan->mode);
2513 err = -EBADFD;
2514 }
2515
2516 return err;
2517}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +03002518EXPORT_SYMBOL_GPL(l2cap_chan_send);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002519
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002520static void l2cap_send_srej(struct l2cap_chan *chan, u16 txseq)
2521{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002522 struct l2cap_ctrl control;
2523 u16 seq;
2524
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002525 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002526
2527 memset(&control, 0, sizeof(control));
2528 control.sframe = 1;
2529 control.super = L2CAP_SUPER_SREJ;
2530
2531 for (seq = chan->expected_tx_seq; seq != txseq;
2532 seq = __next_seq(chan, seq)) {
2533 if (!l2cap_ertm_seq_in_queue(&chan->srej_q, seq)) {
2534 control.reqseq = seq;
2535 l2cap_send_sframe(chan, &control);
2536 l2cap_seq_list_append(&chan->srej_list, seq);
2537 }
2538 }
2539
2540 chan->expected_tx_seq = __next_seq(chan, txseq);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002541}
2542
2543static void l2cap_send_srej_tail(struct l2cap_chan *chan)
2544{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002545 struct l2cap_ctrl control;
2546
2547 BT_DBG("chan %p", chan);
2548
2549 if (chan->srej_list.tail == L2CAP_SEQ_LIST_CLEAR)
2550 return;
2551
2552 memset(&control, 0, sizeof(control));
2553 control.sframe = 1;
2554 control.super = L2CAP_SUPER_SREJ;
2555 control.reqseq = chan->srej_list.tail;
2556 l2cap_send_sframe(chan, &control);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002557}
2558
2559static void l2cap_send_srej_list(struct l2cap_chan *chan, u16 txseq)
2560{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002561 struct l2cap_ctrl control;
2562 u16 initial_head;
2563 u16 seq;
2564
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002565 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002566
2567 memset(&control, 0, sizeof(control));
2568 control.sframe = 1;
2569 control.super = L2CAP_SUPER_SREJ;
2570
2571 /* Capture initial list head to allow only one pass through the list. */
2572 initial_head = chan->srej_list.head;
2573
2574 do {
2575 seq = l2cap_seq_list_pop(&chan->srej_list);
2576 if (seq == txseq || seq == L2CAP_SEQ_LIST_CLEAR)
2577 break;
2578
2579 control.reqseq = seq;
2580 l2cap_send_sframe(chan, &control);
2581 l2cap_seq_list_append(&chan->srej_list, seq);
2582 } while (chan->srej_list.head != initial_head);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002583}
2584
Mat Martineau608bcc62012-05-17 20:53:32 -07002585static void l2cap_process_reqseq(struct l2cap_chan *chan, u16 reqseq)
2586{
2587 struct sk_buff *acked_skb;
2588 u16 ackseq;
2589
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002590 BT_DBG("chan %p, reqseq %u", chan, reqseq);
Mat Martineau608bcc62012-05-17 20:53:32 -07002591
2592 if (chan->unacked_frames == 0 || reqseq == chan->expected_ack_seq)
2593 return;
2594
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002595 BT_DBG("expected_ack_seq %u, unacked_frames %u",
Mat Martineau608bcc62012-05-17 20:53:32 -07002596 chan->expected_ack_seq, chan->unacked_frames);
2597
2598 for (ackseq = chan->expected_ack_seq; ackseq != reqseq;
2599 ackseq = __next_seq(chan, ackseq)) {
2600
2601 acked_skb = l2cap_ertm_seq_in_queue(&chan->tx_q, ackseq);
2602 if (acked_skb) {
2603 skb_unlink(acked_skb, &chan->tx_q);
2604 kfree_skb(acked_skb);
2605 chan->unacked_frames--;
2606 }
2607 }
2608
2609 chan->expected_ack_seq = reqseq;
2610
2611 if (chan->unacked_frames == 0)
2612 __clear_retrans_timer(chan);
2613
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002614 BT_DBG("unacked_frames %u", chan->unacked_frames);
Mat Martineau608bcc62012-05-17 20:53:32 -07002615}
2616
2617static void l2cap_abort_rx_srej_sent(struct l2cap_chan *chan)
2618{
2619 BT_DBG("chan %p", chan);
2620
2621 chan->expected_tx_seq = chan->buffer_seq;
2622 l2cap_seq_list_clear(&chan->srej_list);
2623 skb_queue_purge(&chan->srej_q);
2624 chan->rx_state = L2CAP_RX_STATE_RECV;
2625}
2626
Gustavo Padovand6603662012-05-21 13:58:22 -03002627static void l2cap_tx_state_xmit(struct l2cap_chan *chan,
2628 struct l2cap_ctrl *control,
2629 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002630{
Mat Martineau608bcc62012-05-17 20:53:32 -07002631 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2632 event);
2633
2634 switch (event) {
2635 case L2CAP_EV_DATA_REQUEST:
2636 if (chan->tx_send_head == NULL)
2637 chan->tx_send_head = skb_peek(skbs);
2638
2639 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2640 l2cap_ertm_send(chan);
2641 break;
2642 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2643 BT_DBG("Enter LOCAL_BUSY");
2644 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2645
2646 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2647 /* The SREJ_SENT state must be aborted if we are to
2648 * enter the LOCAL_BUSY state.
2649 */
2650 l2cap_abort_rx_srej_sent(chan);
2651 }
2652
2653 l2cap_send_ack(chan);
2654
2655 break;
2656 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2657 BT_DBG("Exit LOCAL_BUSY");
2658 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2659
2660 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2661 struct l2cap_ctrl local_control;
2662
2663 memset(&local_control, 0, sizeof(local_control));
2664 local_control.sframe = 1;
2665 local_control.super = L2CAP_SUPER_RR;
2666 local_control.poll = 1;
2667 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002668 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002669
2670 chan->retry_count = 1;
2671 __set_monitor_timer(chan);
2672 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2673 }
2674 break;
2675 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2676 l2cap_process_reqseq(chan, control->reqseq);
2677 break;
2678 case L2CAP_EV_EXPLICIT_POLL:
2679 l2cap_send_rr_or_rnr(chan, 1);
2680 chan->retry_count = 1;
2681 __set_monitor_timer(chan);
2682 __clear_ack_timer(chan);
2683 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2684 break;
2685 case L2CAP_EV_RETRANS_TO:
2686 l2cap_send_rr_or_rnr(chan, 1);
2687 chan->retry_count = 1;
2688 __set_monitor_timer(chan);
2689 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2690 break;
2691 case L2CAP_EV_RECV_FBIT:
2692 /* Nothing to process */
2693 break;
2694 default:
2695 break;
2696 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002697}
2698
Gustavo Padovand6603662012-05-21 13:58:22 -03002699static void l2cap_tx_state_wait_f(struct l2cap_chan *chan,
2700 struct l2cap_ctrl *control,
2701 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002702{
Mat Martineau608bcc62012-05-17 20:53:32 -07002703 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2704 event);
2705
2706 switch (event) {
2707 case L2CAP_EV_DATA_REQUEST:
2708 if (chan->tx_send_head == NULL)
2709 chan->tx_send_head = skb_peek(skbs);
2710 /* Queue data, but don't send. */
2711 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2712 break;
2713 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2714 BT_DBG("Enter LOCAL_BUSY");
2715 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2716
2717 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2718 /* The SREJ_SENT state must be aborted if we are to
2719 * enter the LOCAL_BUSY state.
2720 */
2721 l2cap_abort_rx_srej_sent(chan);
2722 }
2723
2724 l2cap_send_ack(chan);
2725
2726 break;
2727 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2728 BT_DBG("Exit LOCAL_BUSY");
2729 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2730
2731 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2732 struct l2cap_ctrl local_control;
2733 memset(&local_control, 0, sizeof(local_control));
2734 local_control.sframe = 1;
2735 local_control.super = L2CAP_SUPER_RR;
2736 local_control.poll = 1;
2737 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002738 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002739
2740 chan->retry_count = 1;
2741 __set_monitor_timer(chan);
2742 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2743 }
2744 break;
2745 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2746 l2cap_process_reqseq(chan, control->reqseq);
2747
2748 /* Fall through */
2749
2750 case L2CAP_EV_RECV_FBIT:
2751 if (control && control->final) {
2752 __clear_monitor_timer(chan);
2753 if (chan->unacked_frames > 0)
2754 __set_retrans_timer(chan);
2755 chan->retry_count = 0;
2756 chan->tx_state = L2CAP_TX_STATE_XMIT;
2757 BT_DBG("recv fbit tx_state 0x2.2%x", chan->tx_state);
2758 }
2759 break;
2760 case L2CAP_EV_EXPLICIT_POLL:
2761 /* Ignore */
2762 break;
2763 case L2CAP_EV_MONITOR_TO:
2764 if (chan->max_tx == 0 || chan->retry_count < chan->max_tx) {
2765 l2cap_send_rr_or_rnr(chan, 1);
2766 __set_monitor_timer(chan);
2767 chan->retry_count++;
2768 } else {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02002769 l2cap_send_disconn_req(chan, ECONNABORTED);
Mat Martineau608bcc62012-05-17 20:53:32 -07002770 }
2771 break;
2772 default:
2773 break;
2774 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002775}
2776
Gustavo Padovand6603662012-05-21 13:58:22 -03002777static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
2778 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002779{
Mat Martineau608bcc62012-05-17 20:53:32 -07002780 BT_DBG("chan %p, control %p, skbs %p, event %d, state %d",
2781 chan, control, skbs, event, chan->tx_state);
2782
2783 switch (chan->tx_state) {
2784 case L2CAP_TX_STATE_XMIT:
Gustavo Padovand6603662012-05-21 13:58:22 -03002785 l2cap_tx_state_xmit(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002786 break;
2787 case L2CAP_TX_STATE_WAIT_F:
Gustavo Padovand6603662012-05-21 13:58:22 -03002788 l2cap_tx_state_wait_f(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002789 break;
2790 default:
2791 /* Ignore event */
2792 break;
2793 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002794}
2795
Mat Martineau4b51dae92012-05-17 20:53:37 -07002796static void l2cap_pass_to_tx(struct l2cap_chan *chan,
2797 struct l2cap_ctrl *control)
2798{
2799 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002800 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_REQSEQ_AND_FBIT);
Mat Martineau4b51dae92012-05-17 20:53:37 -07002801}
2802
Mat Martineauf80842a2012-05-17 20:53:46 -07002803static void l2cap_pass_to_tx_fbit(struct l2cap_chan *chan,
2804 struct l2cap_ctrl *control)
2805{
2806 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002807 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_FBIT);
Mat Martineauf80842a2012-05-17 20:53:46 -07002808}
2809
Linus Torvalds1da177e2005-04-16 15:20:36 -07002810/* Copy frame to all raw sockets on that connection */
2811static void l2cap_raw_recv(struct l2cap_conn *conn, struct sk_buff *skb)
2812{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002813 struct sk_buff *nskb;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03002814 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002815
2816 BT_DBG("conn %p", conn);
2817
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002818 mutex_lock(&conn->chan_lock);
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002819
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002820 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002821 if (chan->chan_type != L2CAP_CHAN_RAW)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002822 continue;
2823
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002824 /* Don't send frame to the channel it came from */
2825 if (bt_cb(skb)->chan == chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002826 continue;
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002827
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002828 nskb = skb_clone(skb, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03002829 if (!nskb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002830 continue;
Gustavo Padovan80b98022012-05-27 22:27:51 -03002831 if (chan->ops->recv(chan, nskb))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002832 kfree_skb(nskb);
2833 }
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002834
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002835 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002836}
2837
2838/* ---- L2CAP signalling commands ---- */
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002839static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn, u8 code,
2840 u8 ident, u16 dlen, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002841{
2842 struct sk_buff *skb, **frag;
2843 struct l2cap_cmd_hdr *cmd;
2844 struct l2cap_hdr *lh;
2845 int len, count;
2846
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002847 BT_DBG("conn %p, code 0x%2.2x, ident 0x%2.2x, len %u",
2848 conn, code, ident, dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002849
Anderson Lizardo300b9622013-06-02 16:30:40 -04002850 if (conn->mtu < L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE)
2851 return NULL;
2852
Linus Torvalds1da177e2005-04-16 15:20:36 -07002853 len = L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE + dlen;
2854 count = min_t(unsigned int, conn->mtu, len);
2855
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002856 skb = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002857 if (!skb)
2858 return NULL;
2859
2860 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002861 lh->len = cpu_to_le16(L2CAP_CMD_HDR_SIZE + dlen);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002862
2863 if (conn->hcon->type == LE_LINK)
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002864 lh->cid = cpu_to_le16(L2CAP_CID_LE_SIGNALING);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002865 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002866 lh->cid = cpu_to_le16(L2CAP_CID_SIGNALING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002867
2868 cmd = (struct l2cap_cmd_hdr *) skb_put(skb, L2CAP_CMD_HDR_SIZE);
2869 cmd->code = code;
2870 cmd->ident = ident;
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002871 cmd->len = cpu_to_le16(dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002872
2873 if (dlen) {
2874 count -= L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE;
2875 memcpy(skb_put(skb, count), data, count);
2876 data += count;
2877 }
2878
2879 len -= skb->len;
2880
2881 /* Continuation fragments (no L2CAP header) */
2882 frag = &skb_shinfo(skb)->frag_list;
2883 while (len) {
2884 count = min_t(unsigned int, conn->mtu, len);
2885
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002886 *frag = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002887 if (!*frag)
2888 goto fail;
2889
2890 memcpy(skb_put(*frag, count), data, count);
2891
2892 len -= count;
2893 data += count;
2894
2895 frag = &(*frag)->next;
2896 }
2897
2898 return skb;
2899
2900fail:
2901 kfree_skb(skb);
2902 return NULL;
2903}
2904
Gustavo Padovan2d792812012-10-06 10:07:01 +01002905static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen,
2906 unsigned long *val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002907{
2908 struct l2cap_conf_opt *opt = *ptr;
2909 int len;
2910
2911 len = L2CAP_CONF_OPT_SIZE + opt->len;
2912 *ptr += len;
2913
2914 *type = opt->type;
2915 *olen = opt->len;
2916
2917 switch (opt->len) {
2918 case 1:
2919 *val = *((u8 *) opt->val);
2920 break;
2921
2922 case 2:
steven miaobfaaeb32010-10-16 18:29:47 -04002923 *val = get_unaligned_le16(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002924 break;
2925
2926 case 4:
steven miaobfaaeb32010-10-16 18:29:47 -04002927 *val = get_unaligned_le32(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002928 break;
2929
2930 default:
2931 *val = (unsigned long) opt->val;
2932 break;
2933 }
2934
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002935 BT_DBG("type 0x%2.2x len %u val 0x%lx", *type, opt->len, *val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002936 return len;
2937}
2938
Linus Torvalds1da177e2005-04-16 15:20:36 -07002939static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val)
2940{
2941 struct l2cap_conf_opt *opt = *ptr;
2942
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002943 BT_DBG("type 0x%2.2x len %u val 0x%lx", type, len, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002944
2945 opt->type = type;
2946 opt->len = len;
2947
2948 switch (len) {
2949 case 1:
2950 *((u8 *) opt->val) = val;
2951 break;
2952
2953 case 2:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02002954 put_unaligned_le16(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002955 break;
2956
2957 case 4:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02002958 put_unaligned_le32(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002959 break;
2960
2961 default:
2962 memcpy(opt->val, (void *) val, len);
2963 break;
2964 }
2965
2966 *ptr += L2CAP_CONF_OPT_SIZE + len;
2967}
2968
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03002969static void l2cap_add_opt_efs(void **ptr, struct l2cap_chan *chan)
2970{
2971 struct l2cap_conf_efs efs;
2972
Szymon Janc1ec918c2011-11-16 09:32:21 +01002973 switch (chan->mode) {
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03002974 case L2CAP_MODE_ERTM:
2975 efs.id = chan->local_id;
2976 efs.stype = chan->local_stype;
2977 efs.msdu = cpu_to_le16(chan->local_msdu);
2978 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002979 efs.acc_lat = cpu_to_le32(L2CAP_DEFAULT_ACC_LAT);
2980 efs.flush_to = cpu_to_le32(L2CAP_EFS_DEFAULT_FLUSH_TO);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03002981 break;
2982
2983 case L2CAP_MODE_STREAMING:
2984 efs.id = 1;
2985 efs.stype = L2CAP_SERV_BESTEFFORT;
2986 efs.msdu = cpu_to_le16(chan->local_msdu);
2987 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
2988 efs.acc_lat = 0;
2989 efs.flush_to = 0;
2990 break;
2991
2992 default:
2993 return;
2994 }
2995
2996 l2cap_add_conf_opt(ptr, L2CAP_CONF_EFS, sizeof(efs),
Andrei Emeltchenko8936fa62012-10-08 11:14:41 +03002997 (unsigned long) &efs);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03002998}
2999
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003000static void l2cap_ack_timeout(struct work_struct *work)
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003001{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003002 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau03625202012-05-17 20:53:51 -07003003 ack_timer.work);
3004 u16 frames_to_ack;
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003005
Gustavo F. Padovan2fb9b3d2011-12-22 16:56:05 -02003006 BT_DBG("chan %p", chan);
3007
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003008 l2cap_chan_lock(chan);
3009
Mat Martineau03625202012-05-17 20:53:51 -07003010 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
3011 chan->last_acked_seq);
3012
3013 if (frames_to_ack)
3014 l2cap_send_rr_or_rnr(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003015
3016 l2cap_chan_unlock(chan);
Szymon Janc09bfb2e2012-01-11 10:59:49 +01003017 l2cap_chan_put(chan);
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003018}
3019
Andrei Emeltchenko466f8002012-05-29 13:59:01 +03003020int l2cap_ertm_init(struct l2cap_chan *chan)
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003021{
Mat Martineau3c588192012-04-11 10:48:42 -07003022 int err;
3023
Mat Martineau105bdf92012-04-27 16:50:48 -07003024 chan->next_tx_seq = 0;
3025 chan->expected_tx_seq = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003026 chan->expected_ack_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003027 chan->unacked_frames = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003028 chan->buffer_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003029 chan->frames_sent = 0;
Mat Martineau105bdf92012-04-27 16:50:48 -07003030 chan->last_acked_seq = 0;
3031 chan->sdu = NULL;
3032 chan->sdu_last_frag = NULL;
3033 chan->sdu_len = 0;
3034
Mat Martineaud34c34f2012-05-14 14:49:27 -07003035 skb_queue_head_init(&chan->tx_q);
3036
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003037 chan->local_amp_id = AMP_ID_BREDR;
3038 chan->move_id = AMP_ID_BREDR;
Mat Martineau08333282012-10-23 15:24:06 -07003039 chan->move_state = L2CAP_MOVE_STABLE;
3040 chan->move_role = L2CAP_MOVE_ROLE_NONE;
3041
Mat Martineau105bdf92012-04-27 16:50:48 -07003042 if (chan->mode != L2CAP_MODE_ERTM)
3043 return 0;
3044
3045 chan->rx_state = L2CAP_RX_STATE_RECV;
3046 chan->tx_state = L2CAP_TX_STATE_XMIT;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003047
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003048 INIT_DELAYED_WORK(&chan->retrans_timer, l2cap_retrans_timeout);
3049 INIT_DELAYED_WORK(&chan->monitor_timer, l2cap_monitor_timeout);
3050 INIT_DELAYED_WORK(&chan->ack_timer, l2cap_ack_timeout);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003051
Gustavo F. Padovanf1c67752011-03-25 20:36:10 -03003052 skb_queue_head_init(&chan->srej_q);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03003053
Mat Martineau3c588192012-04-11 10:48:42 -07003054 err = l2cap_seq_list_init(&chan->srej_list, chan->tx_win);
3055 if (err < 0)
3056 return err;
3057
Mat Martineau9dc9aff2012-05-17 16:20:14 -07003058 err = l2cap_seq_list_init(&chan->retrans_list, chan->remote_tx_win);
3059 if (err < 0)
3060 l2cap_seq_list_free(&chan->srej_list);
3061
3062 return err;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003063}
3064
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003065static inline __u8 l2cap_select_mode(__u8 mode, __u16 remote_feat_mask)
3066{
3067 switch (mode) {
3068 case L2CAP_MODE_STREAMING:
3069 case L2CAP_MODE_ERTM:
3070 if (l2cap_mode_supported(mode, remote_feat_mask))
3071 return mode;
3072 /* fall through */
3073 default:
3074 return L2CAP_MODE_BASIC;
3075 }
3076}
3077
Marcel Holtmann848566b2013-10-01 22:59:22 -07003078static inline bool __l2cap_ews_supported(struct l2cap_conn *conn)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003079{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003080 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003081}
3082
Marcel Holtmann848566b2013-10-01 22:59:22 -07003083static inline bool __l2cap_efs_supported(struct l2cap_conn *conn)
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003084{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003085 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_FLOW;
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003086}
3087
Mat Martineau36c86c82012-10-23 15:24:20 -07003088static void __l2cap_set_ertm_timeouts(struct l2cap_chan *chan,
3089 struct l2cap_conf_rfc *rfc)
3090{
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003091 if (chan->local_amp_id != AMP_ID_BREDR && chan->hs_hcon) {
Mat Martineau36c86c82012-10-23 15:24:20 -07003092 u64 ertm_to = chan->hs_hcon->hdev->amp_be_flush_to;
3093
3094 /* Class 1 devices have must have ERTM timeouts
3095 * exceeding the Link Supervision Timeout. The
3096 * default Link Supervision Timeout for AMP
3097 * controllers is 10 seconds.
3098 *
3099 * Class 1 devices use 0xffffffff for their
3100 * best-effort flush timeout, so the clamping logic
3101 * will result in a timeout that meets the above
3102 * requirement. ERTM timeouts are 16-bit values, so
3103 * the maximum timeout is 65.535 seconds.
3104 */
3105
3106 /* Convert timeout to milliseconds and round */
3107 ertm_to = DIV_ROUND_UP_ULL(ertm_to, 1000);
3108
3109 /* This is the recommended formula for class 2 devices
3110 * that start ERTM timers when packets are sent to the
3111 * controller.
3112 */
3113 ertm_to = 3 * ertm_to + 500;
3114
3115 if (ertm_to > 0xffff)
3116 ertm_to = 0xffff;
3117
3118 rfc->retrans_timeout = cpu_to_le16((u16) ertm_to);
3119 rfc->monitor_timeout = rfc->retrans_timeout;
3120 } else {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003121 rfc->retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO);
3122 rfc->monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO);
Mat Martineau36c86c82012-10-23 15:24:20 -07003123 }
3124}
3125
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003126static inline void l2cap_txwin_setup(struct l2cap_chan *chan)
3127{
3128 if (chan->tx_win > L2CAP_DEFAULT_TX_WINDOW &&
Marcel Holtmann848566b2013-10-01 22:59:22 -07003129 __l2cap_ews_supported(chan->conn)) {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003130 /* use extended control field */
3131 set_bit(FLAG_EXT_CTRL, &chan->flags);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003132 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
3133 } else {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003134 chan->tx_win = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003135 L2CAP_DEFAULT_TX_WINDOW);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003136 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
3137 }
Mat Martineauc20f8e32012-07-10 05:47:07 -07003138 chan->ack_win = chan->tx_win;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003139}
3140
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003141static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003142{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003143 struct l2cap_conf_req *req = data;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003144 struct l2cap_conf_rfc rfc = { .mode = chan->mode };
Linus Torvalds1da177e2005-04-16 15:20:36 -07003145 void *ptr = req->data;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003146 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003147
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03003148 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003149
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003150 if (chan->num_conf_req || chan->num_conf_rsp)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003151 goto done;
3152
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003153 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003154 case L2CAP_MODE_STREAMING:
3155 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003156 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state))
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003157 break;
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003158
Marcel Holtmann848566b2013-10-01 22:59:22 -07003159 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003160 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3161
Gustavo F. Padovan2ba13ed2010-06-09 16:39:05 -03003162 /* fall through */
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003163 default:
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003164 chan->mode = l2cap_select_mode(rfc.mode, chan->conn->feat_mask);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003165 break;
3166 }
3167
3168done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003169 if (chan->imtu != L2CAP_DEFAULT_MTU)
3170 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovan7990681c2011-01-24 16:01:43 -02003171
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003172 switch (chan->mode) {
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003173 case L2CAP_MODE_BASIC:
Marcel Holtmann6fea7ad2014-07-09 11:53:35 +02003174 if (disable_ertm)
3175 break;
3176
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003177 if (!(chan->conn->feat_mask & L2CAP_FEAT_ERTM) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003178 !(chan->conn->feat_mask & L2CAP_FEAT_STREAMING))
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003179 break;
3180
Gustavo F. Padovan62547752010-06-08 20:05:31 -03003181 rfc.mode = L2CAP_MODE_BASIC;
3182 rfc.txwin_size = 0;
3183 rfc.max_transmit = 0;
3184 rfc.retrans_timeout = 0;
3185 rfc.monitor_timeout = 0;
3186 rfc.max_pdu_size = 0;
3187
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003188 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003189 (unsigned long) &rfc);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003190 break;
3191
3192 case L2CAP_MODE_ERTM:
3193 rfc.mode = L2CAP_MODE_ERTM;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003194 rfc.max_transmit = chan->max_tx;
Mat Martineau36c86c82012-10-23 15:24:20 -07003195
3196 __l2cap_set_ertm_timeouts(chan, &rfc);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003197
3198 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003199 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3200 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003201 rfc.max_pdu_size = cpu_to_le16(size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003202
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003203 l2cap_txwin_setup(chan);
3204
3205 rfc.txwin_size = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003206 L2CAP_DEFAULT_TX_WINDOW);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003207
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003208 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003209 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003210
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003211 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3212 l2cap_add_opt_efs(&ptr, chan);
3213
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003214 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3215 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003216 chan->tx_win);
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003217
3218 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3219 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003220 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003221 chan->fcs = L2CAP_FCS_NONE;
3222 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3223 chan->fcs);
3224 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003225 break;
3226
3227 case L2CAP_MODE_STREAMING:
Mat Martineau273759e2012-05-17 20:53:53 -07003228 l2cap_txwin_setup(chan);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003229 rfc.mode = L2CAP_MODE_STREAMING;
3230 rfc.txwin_size = 0;
3231 rfc.max_transmit = 0;
3232 rfc.retrans_timeout = 0;
3233 rfc.monitor_timeout = 0;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003234
3235 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003236 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3237 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003238 rfc.max_pdu_size = cpu_to_le16(size);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003239
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003240 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003241 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003242
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003243 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3244 l2cap_add_opt_efs(&ptr, chan);
3245
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003246 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3247 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003248 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003249 chan->fcs = L2CAP_FCS_NONE;
3250 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3251 chan->fcs);
3252 }
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003253 break;
3254 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003255
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003256 req->dcid = cpu_to_le16(chan->dcid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003257 req->flags = cpu_to_le16(0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003258
3259 return ptr - data;
3260}
3261
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003262static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003263{
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003264 struct l2cap_conf_rsp *rsp = data;
3265 void *ptr = rsp->data;
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003266 void *req = chan->conf_req;
3267 int len = chan->conf_len;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003268 int type, hint, olen;
3269 unsigned long val;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003270 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003271 struct l2cap_conf_efs efs;
3272 u8 remote_efs = 0;
Marcel Holtmann861d6882007-10-20 13:37:06 +02003273 u16 mtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003274 u16 result = L2CAP_CONF_SUCCESS;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003275 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003276
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003277 BT_DBG("chan %p", chan);
Marcel Holtmann820ae1b2006-11-18 22:15:00 +01003278
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003279 while (len >= L2CAP_CONF_OPT_SIZE) {
3280 len -= l2cap_get_conf_opt(&req, &type, &olen, &val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003281
Gustavo F. Padovan589d2742009-04-20 01:31:07 -03003282 hint = type & L2CAP_CONF_HINT;
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07003283 type &= L2CAP_CONF_MASK;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003284
3285 switch (type) {
3286 case L2CAP_CONF_MTU:
Marcel Holtmann861d6882007-10-20 13:37:06 +02003287 mtu = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003288 break;
3289
3290 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003291 chan->flush_to = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003292 break;
3293
3294 case L2CAP_CONF_QOS:
3295 break;
3296
Marcel Holtmann6464f352007-10-20 13:39:51 +02003297 case L2CAP_CONF_RFC:
3298 if (olen == sizeof(rfc))
3299 memcpy(&rfc, (void *) val, olen);
3300 break;
3301
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003302 case L2CAP_CONF_FCS:
3303 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003304 set_bit(CONF_RECV_NO_FCS, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003305 break;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003306
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003307 case L2CAP_CONF_EFS:
3308 remote_efs = 1;
3309 if (olen == sizeof(efs))
3310 memcpy(&efs, (void *) val, olen);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003311 break;
3312
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003313 case L2CAP_CONF_EWS:
Marcel Holtmann848566b2013-10-01 22:59:22 -07003314 if (!chan->conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003315 return -ECONNREFUSED;
3316
3317 set_bit(FLAG_EXT_CTRL, &chan->flags);
3318 set_bit(CONF_EWS_RECV, &chan->conf_state);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003319 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003320 chan->remote_tx_win = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003321 break;
3322
3323 default:
3324 if (hint)
3325 break;
3326
3327 result = L2CAP_CONF_UNKNOWN;
3328 *((u8 *) ptr++) = type;
3329 break;
3330 }
3331 }
3332
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003333 if (chan->num_conf_rsp || chan->num_conf_req > 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003334 goto done;
3335
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003336 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003337 case L2CAP_MODE_STREAMING:
3338 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003339 if (!test_bit(CONF_STATE2_DEVICE, &chan->conf_state)) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003340 chan->mode = l2cap_select_mode(rfc.mode,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003341 chan->conn->feat_mask);
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003342 break;
3343 }
3344
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003345 if (remote_efs) {
Marcel Holtmann848566b2013-10-01 22:59:22 -07003346 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003347 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3348 else
3349 return -ECONNREFUSED;
3350 }
3351
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003352 if (chan->mode != rfc.mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003353 return -ECONNREFUSED;
Gustavo F. Padovan742e5192010-06-08 19:09:48 -03003354
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003355 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003356 }
3357
3358done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003359 if (chan->mode != rfc.mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003360 result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003361 rfc.mode = chan->mode;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003362
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003363 if (chan->num_conf_rsp == 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003364 return -ECONNREFUSED;
3365
Gustavo Padovan2d792812012-10-06 10:07:01 +01003366 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3367 (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003368 }
3369
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003370 if (result == L2CAP_CONF_SUCCESS) {
3371 /* Configure output options and let the other side know
3372 * which ones we don't like. */
3373
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003374 if (mtu < L2CAP_DEFAULT_MIN_MTU)
3375 result = L2CAP_CONF_UNACCEPT;
3376 else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003377 chan->omtu = mtu;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003378 set_bit(CONF_MTU_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003379 }
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003380 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->omtu);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003381
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003382 if (remote_efs) {
3383 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003384 efs.stype != L2CAP_SERV_NOTRAFIC &&
3385 efs.stype != chan->local_stype) {
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003386
3387 result = L2CAP_CONF_UNACCEPT;
3388
3389 if (chan->num_conf_req >= 1)
3390 return -ECONNREFUSED;
3391
3392 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003393 sizeof(efs),
3394 (unsigned long) &efs);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003395 } else {
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003396 /* Send PENDING Conf Rsp */
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003397 result = L2CAP_CONF_PENDING;
3398 set_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003399 }
3400 }
3401
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003402 switch (rfc.mode) {
3403 case L2CAP_MODE_BASIC:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003404 chan->fcs = L2CAP_FCS_NONE;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003405 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003406 break;
3407
3408 case L2CAP_MODE_ERTM:
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003409 if (!test_bit(CONF_EWS_RECV, &chan->conf_state))
3410 chan->remote_tx_win = rfc.txwin_size;
3411 else
3412 rfc.txwin_size = L2CAP_DEFAULT_TX_WINDOW;
3413
Gustavo F. Padovan2c03a7a2011-03-25 20:15:28 -03003414 chan->remote_max_tx = rfc.max_transmit;
Mat Martineau86b1b262010-08-05 15:54:22 -07003415
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003416 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003417 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3418 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003419 rfc.max_pdu_size = cpu_to_le16(size);
3420 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003421
Mat Martineau36c86c82012-10-23 15:24:20 -07003422 __l2cap_set_ertm_timeouts(chan, &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003423
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003424 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003425
3426 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003427 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003428
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003429 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3430 chan->remote_id = efs.id;
3431 chan->remote_stype = efs.stype;
3432 chan->remote_msdu = le16_to_cpu(efs.msdu);
3433 chan->remote_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003434 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003435 chan->remote_acc_lat =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003436 le32_to_cpu(efs.acc_lat);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003437 chan->remote_sdu_itime =
3438 le32_to_cpu(efs.sdu_itime);
3439 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003440 sizeof(efs),
3441 (unsigned long) &efs);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003442 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003443 break;
3444
3445 case L2CAP_MODE_STREAMING:
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003446 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003447 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3448 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003449 rfc.max_pdu_size = cpu_to_le16(size);
3450 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003451
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003452 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003453
Gustavo Padovan2d792812012-10-06 10:07:01 +01003454 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3455 (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003456
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003457 break;
3458
3459 default:
Marcel Holtmann6464f352007-10-20 13:39:51 +02003460 result = L2CAP_CONF_UNACCEPT;
3461
3462 memset(&rfc, 0, sizeof(rfc));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003463 rfc.mode = chan->mode;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003464 }
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003465
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003466 if (result == L2CAP_CONF_SUCCESS)
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003467 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003468 }
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003469 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003470 rsp->result = cpu_to_le16(result);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003471 rsp->flags = cpu_to_le16(0);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003472
3473 return ptr - data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003474}
3475
Gustavo Padovan2d792812012-10-06 10:07:01 +01003476static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len,
3477 void *data, u16 *result)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003478{
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003479 struct l2cap_conf_req *req = data;
3480 void *ptr = req->data;
3481 int type, olen;
3482 unsigned long val;
Mat Martineau36e999a2011-12-08 17:23:21 -08003483 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003484 struct l2cap_conf_efs efs;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003485
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003486 BT_DBG("chan %p, rsp %p, len %d, req %p", chan, rsp, len, data);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003487
3488 while (len >= L2CAP_CONF_OPT_SIZE) {
3489 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3490
3491 switch (type) {
3492 case L2CAP_CONF_MTU:
3493 if (val < L2CAP_DEFAULT_MIN_MTU) {
3494 *result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003495 chan->imtu = L2CAP_DEFAULT_MIN_MTU;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003496 } else
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003497 chan->imtu = val;
3498 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003499 break;
3500
3501 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003502 chan->flush_to = val;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003503 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003504 2, chan->flush_to);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003505 break;
3506
3507 case L2CAP_CONF_RFC:
3508 if (olen == sizeof(rfc))
3509 memcpy(&rfc, (void *)val, olen);
3510
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003511 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003512 rfc.mode != chan->mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003513 return -ECONNREFUSED;
3514
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003515 chan->fcs = 0;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003516
3517 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003518 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003519 break;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003520
3521 case L2CAP_CONF_EWS:
Mat Martineauc20f8e32012-07-10 05:47:07 -07003522 chan->ack_win = min_t(u16, val, chan->ack_win);
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003523 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Mat Martineauc20f8e32012-07-10 05:47:07 -07003524 chan->tx_win);
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003525 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003526
3527 case L2CAP_CONF_EFS:
3528 if (olen == sizeof(efs))
3529 memcpy(&efs, (void *)val, olen);
3530
3531 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003532 efs.stype != L2CAP_SERV_NOTRAFIC &&
3533 efs.stype != chan->local_stype)
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003534 return -ECONNREFUSED;
3535
Gustavo Padovan2d792812012-10-06 10:07:01 +01003536 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS, sizeof(efs),
3537 (unsigned long) &efs);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003538 break;
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003539
3540 case L2CAP_CONF_FCS:
3541 if (*result == L2CAP_CONF_PENDING)
3542 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003543 set_bit(CONF_RECV_NO_FCS,
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003544 &chan->conf_state);
3545 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003546 }
3547 }
3548
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003549 if (chan->mode == L2CAP_MODE_BASIC && chan->mode != rfc.mode)
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003550 return -ECONNREFUSED;
3551
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003552 chan->mode = rfc.mode;
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003553
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003554 if (*result == L2CAP_CONF_SUCCESS || *result == L2CAP_CONF_PENDING) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003555 switch (rfc.mode) {
3556 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003557 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3558 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
3559 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003560 if (!test_bit(FLAG_EXT_CTRL, &chan->flags))
3561 chan->ack_win = min_t(u16, chan->ack_win,
3562 rfc.txwin_size);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003563
3564 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3565 chan->local_msdu = le16_to_cpu(efs.msdu);
3566 chan->local_sdu_itime =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003567 le32_to_cpu(efs.sdu_itime);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003568 chan->local_acc_lat = le32_to_cpu(efs.acc_lat);
3569 chan->local_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003570 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003571 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003572 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003573
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003574 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003575 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003576 }
3577 }
3578
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003579 req->dcid = cpu_to_le16(chan->dcid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003580 req->flags = cpu_to_le16(0);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003581
3582 return ptr - data;
3583}
3584
Gustavo Padovan2d792812012-10-06 10:07:01 +01003585static int l2cap_build_conf_rsp(struct l2cap_chan *chan, void *data,
3586 u16 result, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003587{
3588 struct l2cap_conf_rsp *rsp = data;
3589 void *ptr = rsp->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003590
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003591 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003592
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003593 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003594 rsp->result = cpu_to_le16(result);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003595 rsp->flags = cpu_to_le16(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003596
3597 return ptr - data;
3598}
3599
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003600void __l2cap_le_connect_rsp_defer(struct l2cap_chan *chan)
3601{
3602 struct l2cap_le_conn_rsp rsp;
3603 struct l2cap_conn *conn = chan->conn;
3604
3605 BT_DBG("chan %p", chan);
3606
3607 rsp.dcid = cpu_to_le16(chan->scid);
3608 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02003609 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03003610 rsp.credits = cpu_to_le16(chan->rx_credits);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003611 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003612
3613 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp),
3614 &rsp);
3615}
3616
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003617void __l2cap_connect_rsp_defer(struct l2cap_chan *chan)
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003618{
3619 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003620 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003621 u8 buf[128];
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003622 u8 rsp_code;
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003623
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003624 rsp.scid = cpu_to_le16(chan->dcid);
3625 rsp.dcid = cpu_to_le16(chan->scid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003626 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
3627 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003628
3629 if (chan->hs_hcon)
3630 rsp_code = L2CAP_CREATE_CHAN_RSP;
3631 else
3632 rsp_code = L2CAP_CONN_RSP;
3633
3634 BT_DBG("chan %p rsp_code %u", chan, rsp_code);
3635
3636 l2cap_send_cmd(conn, chan->ident, rsp_code, sizeof(rsp), &rsp);
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003637
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003638 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003639 return;
3640
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003641 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003642 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003643 chan->num_conf_req++;
3644}
3645
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003646static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len)
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003647{
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003648 int type, olen;
3649 unsigned long val;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003650 /* Use sane default values in case a misbehaving remote device
3651 * did not send an RFC or extended window size option.
3652 */
3653 u16 txwin_ext = chan->ack_win;
3654 struct l2cap_conf_rfc rfc = {
3655 .mode = chan->mode,
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003656 .retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO),
3657 .monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO),
Mat Martineauc20f8e32012-07-10 05:47:07 -07003658 .max_pdu_size = cpu_to_le16(chan->imtu),
3659 .txwin_size = min_t(u16, chan->ack_win, L2CAP_DEFAULT_TX_WINDOW),
3660 };
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003661
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003662 BT_DBG("chan %p, rsp %p, len %d", chan, rsp, len);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003663
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003664 if ((chan->mode != L2CAP_MODE_ERTM) && (chan->mode != L2CAP_MODE_STREAMING))
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003665 return;
3666
3667 while (len >= L2CAP_CONF_OPT_SIZE) {
3668 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3669
Mat Martineauc20f8e32012-07-10 05:47:07 -07003670 switch (type) {
3671 case L2CAP_CONF_RFC:
3672 if (olen == sizeof(rfc))
3673 memcpy(&rfc, (void *)val, olen);
Szymon Janc8f321f82012-06-08 11:33:33 +02003674 break;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003675 case L2CAP_CONF_EWS:
3676 txwin_ext = val;
3677 break;
3678 }
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003679 }
3680
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003681 switch (rfc.mode) {
3682 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003683 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3684 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003685 chan->mps = le16_to_cpu(rfc.max_pdu_size);
3686 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3687 chan->ack_win = min_t(u16, chan->ack_win, txwin_ext);
3688 else
3689 chan->ack_win = min_t(u16, chan->ack_win,
3690 rfc.txwin_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003691 break;
3692 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003693 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003694 }
3695}
3696
Gustavo Padovan2d792812012-10-06 10:07:01 +01003697static inline int l2cap_command_rej(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003698 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3699 u8 *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003700{
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003701 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003702
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003703 if (cmd_len < sizeof(*rej))
3704 return -EPROTO;
3705
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003706 if (rej->reason != L2CAP_REJ_NOT_UNDERSTOOD)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003707 return 0;
3708
3709 if ((conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003710 cmd->ident == conn->info_ident) {
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02003711 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann984947d2009-02-06 23:35:19 +01003712
3713 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01003714 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01003715
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003716 l2cap_conn_start(conn);
3717 }
3718
3719 return 0;
3720}
3721
Mat Martineau17009152012-10-23 15:24:07 -07003722static struct l2cap_chan *l2cap_connect(struct l2cap_conn *conn,
3723 struct l2cap_cmd_hdr *cmd,
3724 u8 *data, u8 rsp_code, u8 amp_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003725{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003726 struct l2cap_conn_req *req = (struct l2cap_conn_req *) data;
3727 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003728 struct l2cap_chan *chan = NULL, *pchan;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003729 int result, status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003730
3731 u16 dcid = 0, scid = __le16_to_cpu(req->scid);
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003732 __le16 psm = req->psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003733
Andrei Emeltchenko097db762012-03-09 14:16:17 +02003734 BT_DBG("psm 0x%2.2x scid 0x%4.4x", __le16_to_cpu(psm), scid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003735
3736 /* Check if we have socket listening on psm */
Marcel Holtmann6f59b902013-10-13 05:24:01 -07003737 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03003738 &conn->hcon->dst, ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003739 if (!pchan) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003740 result = L2CAP_CR_BAD_PSM;
3741 goto sendresp;
3742 }
3743
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003744 mutex_lock(&conn->chan_lock);
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003745 l2cap_chan_lock(pchan);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00003746
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003747 /* Check if the ACL is secure enough (if not SDP) */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003748 if (psm != cpu_to_le16(L2CAP_PSM_SDP) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003749 !hci_conn_check_link_mode(conn->hcon)) {
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02003750 conn->disc_reason = HCI_ERROR_AUTH_FAILURE;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003751 result = L2CAP_CR_SEC_BLOCK;
3752 goto response;
3753 }
3754
Linus Torvalds1da177e2005-04-16 15:20:36 -07003755 result = L2CAP_CR_NO_MEM;
3756
Gustavo Padovan2dfa1002012-05-27 22:27:58 -03003757 /* Check if we already have channel with that dcid */
3758 if (__l2cap_get_chan_by_dcid(conn, scid))
3759 goto response;
3760
Gustavo Padovan80b98022012-05-27 22:27:51 -03003761 chan = pchan->ops->new_connection(pchan);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03003762 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003763 goto response;
3764
Syam Sidhardhan330b6c12013-08-06 01:59:12 +09003765 /* For certain devices (ex: HID mouse), support for authentication,
3766 * pairing and bonding is optional. For such devices, inorder to avoid
3767 * the ACL alive for too long after L2CAP disconnection, reset the ACL
3768 * disc_timeout back to HCI_DISCONN_TIMEOUT during L2CAP connect.
3769 */
3770 conn->hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
3771
Marcel Holtmann7eafc592013-10-13 08:12:47 -07003772 bacpy(&chan->src, &conn->hcon->src);
3773 bacpy(&chan->dst, &conn->hcon->dst);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -07003774 chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type);
3775 chan->dst_type = bdaddr_type(conn->hcon, conn->hcon->dst_type);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003776 chan->psm = psm;
3777 chan->dcid = scid;
Mat Martineau17009152012-10-23 15:24:07 -07003778 chan->local_amp_id = amp_id;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003779
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003780 __l2cap_chan_add(conn, chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003781
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003782 dcid = chan->scid;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003783
Gustavo Padovan8d836d72013-10-15 19:24:47 -03003784 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003785
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003786 chan->ident = cmd->ident;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003787
Marcel Holtmann984947d2009-02-06 23:35:19 +01003788 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) {
Johan Hedberge7cafc42014-07-17 15:35:38 +03003789 if (l2cap_chan_check_security(chan, false)) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07003790 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003791 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003792 result = L2CAP_CR_PEND;
3793 status = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08003794 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003795 } else {
Mat Martineau17009152012-10-23 15:24:07 -07003796 /* Force pending result for AMP controllers.
3797 * The connection will succeed after the
3798 * physical link is up.
3799 */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003800 if (amp_id == AMP_ID_BREDR) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003801 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau17009152012-10-23 15:24:07 -07003802 result = L2CAP_CR_SUCCESS;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003803 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003804 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003805 result = L2CAP_CR_PEND;
Mat Martineau17009152012-10-23 15:24:07 -07003806 }
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003807 status = L2CAP_CS_NO_INFO;
3808 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003809 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003810 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003811 result = L2CAP_CR_PEND;
3812 status = L2CAP_CS_AUTHEN_PEND;
3813 }
3814 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003815 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003816 result = L2CAP_CR_PEND;
3817 status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003818 }
3819
Linus Torvalds1da177e2005-04-16 15:20:36 -07003820response:
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003821 l2cap_chan_unlock(pchan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003822 mutex_unlock(&conn->chan_lock);
Johan Hedberga24cce12014-08-07 22:56:42 +03003823 l2cap_chan_put(pchan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003824
3825sendresp:
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003826 rsp.scid = cpu_to_le16(scid);
3827 rsp.dcid = cpu_to_le16(dcid);
3828 rsp.result = cpu_to_le16(result);
3829 rsp.status = cpu_to_le16(status);
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003830 l2cap_send_cmd(conn, cmd->ident, rsp_code, sizeof(rsp), &rsp);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003831
3832 if (result == L2CAP_CR_PEND && status == L2CAP_CS_NO_INFO) {
3833 struct l2cap_info_req info;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003834 info.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003835
3836 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
3837 conn->info_ident = l2cap_get_ident(conn);
3838
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08003839 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003840
Gustavo Padovan2d792812012-10-06 10:07:01 +01003841 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
3842 sizeof(info), &info);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003843 }
3844
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003845 if (chan && !test_bit(CONF_REQ_SENT, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003846 result == L2CAP_CR_SUCCESS) {
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003847 u8 buf[128];
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003848 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003849 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003850 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003851 chan->num_conf_req++;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003852 }
Mat Martineau17009152012-10-23 15:24:07 -07003853
3854 return chan;
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003855}
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003856
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003857static int l2cap_connect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003858 struct l2cap_cmd_hdr *cmd, u16 cmd_len, u8 *data)
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003859{
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303860 struct hci_dev *hdev = conn->hcon->hdev;
3861 struct hci_conn *hcon = conn->hcon;
3862
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003863 if (cmd_len < sizeof(struct l2cap_conn_req))
3864 return -EPROTO;
3865
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303866 hci_dev_lock(hdev);
3867 if (test_bit(HCI_MGMT, &hdev->dev_flags) &&
3868 !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &hcon->flags))
3869 mgmt_device_connected(hdev, &hcon->dst, hcon->type,
3870 hcon->dst_type, 0, NULL, 0,
3871 hcon->dev_class);
3872 hci_dev_unlock(hdev);
3873
Gustavo Padovan300229f2012-10-12 19:40:40 +08003874 l2cap_connect(conn, cmd, data, L2CAP_CONN_RSP, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003875 return 0;
3876}
3877
Mat Martineau5909cf32012-10-23 15:24:08 -07003878static int l2cap_connect_create_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003879 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3880 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003881{
3882 struct l2cap_conn_rsp *rsp = (struct l2cap_conn_rsp *) data;
3883 u16 scid, dcid, result, status;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003884 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003885 u8 req[128];
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003886 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003887
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003888 if (cmd_len < sizeof(*rsp))
3889 return -EPROTO;
3890
Linus Torvalds1da177e2005-04-16 15:20:36 -07003891 scid = __le16_to_cpu(rsp->scid);
3892 dcid = __le16_to_cpu(rsp->dcid);
3893 result = __le16_to_cpu(rsp->result);
3894 status = __le16_to_cpu(rsp->status);
3895
Andrei Emeltchenko1b009c92012-02-21 12:54:54 +02003896 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 +01003897 dcid, scid, result, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003898
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003899 mutex_lock(&conn->chan_lock);
3900
Linus Torvalds1da177e2005-04-16 15:20:36 -07003901 if (scid) {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003902 chan = __l2cap_get_chan_by_scid(conn, scid);
3903 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003904 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003905 goto unlock;
3906 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003907 } else {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003908 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
3909 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003910 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003911 goto unlock;
3912 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003913 }
3914
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003915 err = 0;
3916
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003917 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003918
Linus Torvalds1da177e2005-04-16 15:20:36 -07003919 switch (result) {
3920 case L2CAP_CR_SUCCESS:
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03003921 l2cap_state_change(chan, BT_CONFIG);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003922 chan->ident = 0;
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003923 chan->dcid = dcid;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003924 clear_bit(CONF_CONNECT_PEND, &chan->conf_state);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01003925
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003926 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003927 break;
3928
Linus Torvalds1da177e2005-04-16 15:20:36 -07003929 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003930 l2cap_build_conf_req(chan, req), req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003931 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003932 break;
3933
3934 case L2CAP_CR_PEND:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003935 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003936 break;
3937
3938 default:
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003939 l2cap_chan_del(chan, ECONNREFUSED);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003940 break;
3941 }
3942
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003943 l2cap_chan_unlock(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003944
3945unlock:
3946 mutex_unlock(&conn->chan_lock);
3947
3948 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003949}
3950
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003951static inline void set_default_fcs(struct l2cap_chan *chan)
Mat Martineau8c462b62010-08-24 15:35:42 -07003952{
3953 /* FCS is enabled only in ERTM or streaming mode, if one or both
3954 * sides request it.
3955 */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003956 if (chan->mode != L2CAP_MODE_ERTM && chan->mode != L2CAP_MODE_STREAMING)
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003957 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003958 else if (!test_bit(CONF_RECV_NO_FCS, &chan->conf_state))
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003959 chan->fcs = L2CAP_FCS_CRC16;
Mat Martineau8c462b62010-08-24 15:35:42 -07003960}
3961
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03003962static void l2cap_send_efs_conf_rsp(struct l2cap_chan *chan, void *data,
3963 u8 ident, u16 flags)
3964{
3965 struct l2cap_conn *conn = chan->conn;
3966
3967 BT_DBG("conn %p chan %p ident %d flags 0x%4.4x", conn, chan, ident,
3968 flags);
3969
3970 clear_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
3971 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
3972
3973 l2cap_send_cmd(conn, ident, L2CAP_CONF_RSP,
3974 l2cap_build_conf_rsp(chan, data,
3975 L2CAP_CONF_SUCCESS, flags), data);
3976}
3977
Johan Hedberg662d6522013-10-16 11:20:47 +03003978static void cmd_reject_invalid_cid(struct l2cap_conn *conn, u8 ident,
3979 u16 scid, u16 dcid)
3980{
3981 struct l2cap_cmd_rej_cid rej;
3982
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003983 rej.reason = cpu_to_le16(L2CAP_REJ_INVALID_CID);
Johan Hedberg662d6522013-10-16 11:20:47 +03003984 rej.scid = __cpu_to_le16(scid);
3985 rej.dcid = __cpu_to_le16(dcid);
3986
3987 l2cap_send_cmd(conn, ident, L2CAP_COMMAND_REJ, sizeof(rej), &rej);
3988}
3989
Gustavo Padovan2d792812012-10-06 10:07:01 +01003990static inline int l2cap_config_req(struct l2cap_conn *conn,
3991 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3992 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003993{
3994 struct l2cap_conf_req *req = (struct l2cap_conf_req *) data;
3995 u16 dcid, flags;
3996 u8 rsp[64];
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003997 struct l2cap_chan *chan;
Mat Martineau3c588192012-04-11 10:48:42 -07003998 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003999
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004000 if (cmd_len < sizeof(*req))
4001 return -EPROTO;
4002
Linus Torvalds1da177e2005-04-16 15:20:36 -07004003 dcid = __le16_to_cpu(req->dcid);
4004 flags = __le16_to_cpu(req->flags);
4005
4006 BT_DBG("dcid 0x%4.4x flags 0x%2.2x", dcid, flags);
4007
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004008 chan = l2cap_get_chan_by_scid(conn, dcid);
Johan Hedberg662d6522013-10-16 11:20:47 +03004009 if (!chan) {
4010 cmd_reject_invalid_cid(conn, cmd->ident, dcid, 0);
4011 return 0;
4012 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004013
David S. Miller033b1142011-07-21 13:38:42 -07004014 if (chan->state != BT_CONFIG && chan->state != BT_CONNECT2) {
Johan Hedberg662d6522013-10-16 11:20:47 +03004015 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4016 chan->dcid);
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004017 goto unlock;
Gustavo F. Padovandf6bd742010-06-14 02:26:15 -03004018 }
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004019
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004020 /* Reject if config buffer is too small. */
Al Viro88219a02007-07-29 00:17:25 -07004021 len = cmd_len - sizeof(*req);
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004022 if (chan->conf_len + len > sizeof(chan->conf_req)) {
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004023 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004024 l2cap_build_conf_rsp(chan, rsp,
4025 L2CAP_CONF_REJECT, flags), rsp);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004026 goto unlock;
4027 }
4028
4029 /* Store config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004030 memcpy(chan->conf_req + chan->conf_len, req->data, len);
4031 chan->conf_len += len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004032
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004033 if (flags & L2CAP_CONF_FLAG_CONTINUATION) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004034 /* Incomplete config. Send empty response. */
4035 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004036 l2cap_build_conf_rsp(chan, rsp,
4037 L2CAP_CONF_SUCCESS, flags), rsp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004038 goto unlock;
4039 }
4040
4041 /* Complete config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004042 len = l2cap_parse_conf_req(chan, rsp);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004043 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004044 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004045 goto unlock;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004046 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004047
Mat Martineau1500109b2012-10-23 15:24:15 -07004048 chan->ident = cmd->ident;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004049 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004050 chan->num_conf_rsp++;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004051
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004052 /* Reset config buffer. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004053 chan->conf_len = 0;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004054
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004055 if (!test_bit(CONF_OUTPUT_DONE, &chan->conf_state))
Marcel Holtmann876d9482007-10-20 13:35:42 +02004056 goto unlock;
4057
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004058 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004059 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004060
Mat Martineau105bdf92012-04-27 16:50:48 -07004061 if (chan->mode == L2CAP_MODE_ERTM ||
4062 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004063 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004064
Mat Martineau3c588192012-04-11 10:48:42 -07004065 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004066 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004067 else
4068 l2cap_chan_ready(chan);
4069
Marcel Holtmann876d9482007-10-20 13:35:42 +02004070 goto unlock;
4071 }
4072
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004073 if (!test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02004074 u8 buf[64];
Linus Torvalds1da177e2005-04-16 15:20:36 -07004075 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004076 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004077 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004078 }
4079
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004080 /* Got Conf Rsp PENDING from remote side and asume we sent
4081 Conf Rsp PENDING in the code above */
4082 if (test_bit(CONF_REM_CONF_PEND, &chan->conf_state) &&
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03004083 test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004084
4085 /* check compatibility */
4086
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004087 /* Send rsp for BR/EDR channel */
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004088 if (!chan->hs_hcon)
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004089 l2cap_send_efs_conf_rsp(chan, rsp, cmd->ident, flags);
4090 else
4091 chan->ident = cmd->ident;
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004092 }
4093
Linus Torvalds1da177e2005-04-16 15:20:36 -07004094unlock:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004095 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004096 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004097}
4098
Gustavo Padovan2d792812012-10-06 10:07:01 +01004099static inline int l2cap_config_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004100 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4101 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004102{
4103 struct l2cap_conf_rsp *rsp = (struct l2cap_conf_rsp *)data;
4104 u16 scid, flags, result;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004105 struct l2cap_chan *chan;
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004106 int len = cmd_len - sizeof(*rsp);
Mat Martineau3c588192012-04-11 10:48:42 -07004107 int err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004108
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004109 if (cmd_len < sizeof(*rsp))
4110 return -EPROTO;
4111
Linus Torvalds1da177e2005-04-16 15:20:36 -07004112 scid = __le16_to_cpu(rsp->scid);
4113 flags = __le16_to_cpu(rsp->flags);
4114 result = __le16_to_cpu(rsp->result);
4115
Andrei Emeltchenko61386cb2012-03-12 12:13:07 +02004116 BT_DBG("scid 0x%4.4x flags 0x%2.2x result 0x%2.2x len %d", scid, flags,
4117 result, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004118
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004119 chan = l2cap_get_chan_by_scid(conn, scid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004120 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004121 return 0;
4122
4123 switch (result) {
4124 case L2CAP_CONF_SUCCESS:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004125 l2cap_conf_rfc_get(chan, rsp->data, len);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004126 clear_bit(CONF_REM_CONF_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004127 break;
4128
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004129 case L2CAP_CONF_PENDING:
4130 set_bit(CONF_REM_CONF_PEND, &chan->conf_state);
4131
4132 if (test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
4133 char buf[64];
4134
4135 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004136 buf, &result);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004137 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004138 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004139 goto done;
4140 }
4141
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004142 if (!chan->hs_hcon) {
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004143 l2cap_send_efs_conf_rsp(chan, buf, cmd->ident,
4144 0);
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02004145 } else {
4146 if (l2cap_check_efs(chan)) {
4147 amp_create_logical_link(chan);
4148 chan->ident = cmd->ident;
4149 }
4150 }
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004151 }
4152 goto done;
4153
Linus Torvalds1da177e2005-04-16 15:20:36 -07004154 case L2CAP_CONF_UNACCEPT:
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004155 if (chan->num_conf_rsp <= L2CAP_CONF_MAX_CONF_RSP) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004156 char req[64];
4157
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004158 if (len > sizeof(req) - sizeof(struct l2cap_conf_req)) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004159 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004160 goto done;
4161 }
4162
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004163 /* throw out any old stored conf requests */
4164 result = L2CAP_CONF_SUCCESS;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03004165 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004166 req, &result);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004167 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004168 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004169 goto done;
4170 }
4171
4172 l2cap_send_cmd(conn, l2cap_get_ident(conn),
Gustavo Padovan2d792812012-10-06 10:07:01 +01004173 L2CAP_CONF_REQ, len, req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004174 chan->num_conf_req++;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004175 if (result != L2CAP_CONF_SUCCESS)
4176 goto done;
4177 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004178 }
4179
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09004180 default:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004181 l2cap_chan_set_err(chan, ECONNRESET);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +02004182
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08004183 __set_chan_timer(chan, L2CAP_DISC_REJ_TIMEOUT);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004184 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004185 goto done;
4186 }
4187
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004188 if (flags & L2CAP_CONF_FLAG_CONTINUATION)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004189 goto done;
4190
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004191 set_bit(CONF_INPUT_DONE, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004192
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004193 if (test_bit(CONF_OUTPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004194 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004195
Mat Martineau105bdf92012-04-27 16:50:48 -07004196 if (chan->mode == L2CAP_MODE_ERTM ||
4197 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004198 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004199
Mat Martineau3c588192012-04-11 10:48:42 -07004200 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004201 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004202 else
4203 l2cap_chan_ready(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004204 }
4205
4206done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004207 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004208 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004209}
4210
Gustavo Padovan2d792812012-10-06 10:07:01 +01004211static inline int l2cap_disconnect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004212 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4213 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004214{
4215 struct l2cap_disconn_req *req = (struct l2cap_disconn_req *) data;
4216 struct l2cap_disconn_rsp rsp;
4217 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004218 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004219
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004220 if (cmd_len != sizeof(*req))
4221 return -EPROTO;
4222
Linus Torvalds1da177e2005-04-16 15:20:36 -07004223 scid = __le16_to_cpu(req->scid);
4224 dcid = __le16_to_cpu(req->dcid);
4225
4226 BT_DBG("scid 0x%4.4x dcid 0x%4.4x", scid, dcid);
4227
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004228 mutex_lock(&conn->chan_lock);
4229
4230 chan = __l2cap_get_chan_by_scid(conn, dcid);
4231 if (!chan) {
4232 mutex_unlock(&conn->chan_lock);
Johan Hedberg662d6522013-10-16 11:20:47 +03004233 cmd_reject_invalid_cid(conn, cmd->ident, dcid, scid);
4234 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004235 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004236
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004237 l2cap_chan_lock(chan);
4238
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03004239 rsp.dcid = cpu_to_le16(chan->scid);
4240 rsp.scid = cpu_to_le16(chan->dcid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004241 l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp);
4242
Gustavo Padovan5ec1bbe2013-10-15 19:24:48 -03004243 chan->ops->set_shutdown(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004244
Mat Martineau61d6ef32012-04-27 16:50:50 -07004245 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004246 l2cap_chan_del(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004247
4248 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004249
Gustavo Padovan80b98022012-05-27 22:27:51 -03004250 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004251 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004252
4253 mutex_unlock(&conn->chan_lock);
4254
Linus Torvalds1da177e2005-04-16 15:20:36 -07004255 return 0;
4256}
4257
Gustavo Padovan2d792812012-10-06 10:07:01 +01004258static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004259 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4260 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004261{
4262 struct l2cap_disconn_rsp *rsp = (struct l2cap_disconn_rsp *) data;
4263 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004264 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004265
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004266 if (cmd_len != sizeof(*rsp))
4267 return -EPROTO;
4268
Linus Torvalds1da177e2005-04-16 15:20:36 -07004269 scid = __le16_to_cpu(rsp->scid);
4270 dcid = __le16_to_cpu(rsp->dcid);
4271
4272 BT_DBG("dcid 0x%4.4x scid 0x%4.4x", dcid, scid);
4273
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004274 mutex_lock(&conn->chan_lock);
4275
4276 chan = __l2cap_get_chan_by_scid(conn, scid);
4277 if (!chan) {
4278 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004279 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004280 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004281
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004282 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004283
Mat Martineau61d6ef32012-04-27 16:50:50 -07004284 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004285 l2cap_chan_del(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004286
4287 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004288
Gustavo Padovan80b98022012-05-27 22:27:51 -03004289 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004290 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004291
4292 mutex_unlock(&conn->chan_lock);
4293
Linus Torvalds1da177e2005-04-16 15:20:36 -07004294 return 0;
4295}
4296
Gustavo Padovan2d792812012-10-06 10:07:01 +01004297static inline int l2cap_information_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004298 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4299 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004300{
4301 struct l2cap_info_req *req = (struct l2cap_info_req *) data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004302 u16 type;
4303
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004304 if (cmd_len != sizeof(*req))
4305 return -EPROTO;
4306
Linus Torvalds1da177e2005-04-16 15:20:36 -07004307 type = __le16_to_cpu(req->type);
4308
4309 BT_DBG("type 0x%4.4x", type);
4310
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004311 if (type == L2CAP_IT_FEAT_MASK) {
4312 u8 buf[8];
Marcel Holtmann44dd46d2009-05-02 19:09:01 -07004313 u32 feat_mask = l2cap_feat_mask;
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004314 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004315 rsp->type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
4316 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03004317 if (!disable_ertm)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004318 feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING
Gustavo Padovan2d792812012-10-06 10:07:01 +01004319 | L2CAP_FEAT_FCS;
Marcel Holtmann848566b2013-10-01 22:59:22 -07004320 if (conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03004321 feat_mask |= L2CAP_FEAT_EXT_FLOW
Gustavo Padovan2d792812012-10-06 10:07:01 +01004322 | L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenkoa5fd6f32011-09-16 16:26:32 +03004323
Gustavo F. Padovan1b7bf4e2009-08-24 00:45:20 -03004324 put_unaligned_le32(feat_mask, rsp->data);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004325 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4326 buf);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004327 } else if (type == L2CAP_IT_FIXED_CHAN) {
4328 u8 buf[12];
4329 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Mat Martineau50a147c2011-11-02 16:18:34 -07004330
Marcel Holtmann848566b2013-10-01 22:59:22 -07004331 if (conn->hs_enabled)
Mat Martineau50a147c2011-11-02 16:18:34 -07004332 l2cap_fixed_chan[0] |= L2CAP_FC_A2MP;
4333 else
4334 l2cap_fixed_chan[0] &= ~L2CAP_FC_A2MP;
4335
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004336 rsp->type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
4337 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Andrei Emeltchenkoc6337ea2011-10-20 17:02:44 +03004338 memcpy(rsp->data, l2cap_fixed_chan, sizeof(l2cap_fixed_chan));
Gustavo Padovan2d792812012-10-06 10:07:01 +01004339 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4340 buf);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004341 } else {
4342 struct l2cap_info_rsp rsp;
4343 rsp.type = cpu_to_le16(type);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004344 rsp.result = cpu_to_le16(L2CAP_IR_NOTSUPP);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004345 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(rsp),
4346 &rsp);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004347 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004348
4349 return 0;
4350}
4351
Gustavo Padovan2d792812012-10-06 10:07:01 +01004352static inline int l2cap_information_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004353 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4354 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004355{
4356 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) data;
4357 u16 type, result;
4358
Jaganath Kanakkassery3f6fa3d2013-06-21 19:55:11 +05304359 if (cmd_len < sizeof(*rsp))
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004360 return -EPROTO;
4361
Linus Torvalds1da177e2005-04-16 15:20:36 -07004362 type = __le16_to_cpu(rsp->type);
4363 result = __le16_to_cpu(rsp->result);
4364
4365 BT_DBG("type 0x%4.4x result 0x%2.2x", type, result);
4366
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004367 /* L2CAP Info req/rsp are unbound to channels, add extra checks */
4368 if (cmd->ident != conn->info_ident ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01004369 conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004370 return 0;
4371
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02004372 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004373
Ville Tervoadb08ed2010-08-04 09:43:33 +03004374 if (result != L2CAP_IR_SUCCESS) {
4375 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4376 conn->info_ident = 0;
4377
4378 l2cap_conn_start(conn);
4379
4380 return 0;
4381 }
4382
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004383 switch (type) {
4384 case L2CAP_IT_FEAT_MASK:
Harvey Harrison83985312008-05-02 16:25:46 -07004385 conn->feat_mask = get_unaligned_le32(rsp->data);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004386
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07004387 if (conn->feat_mask & L2CAP_FEAT_FIXED_CHAN) {
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004388 struct l2cap_info_req req;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004389 req.type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004390
4391 conn->info_ident = l2cap_get_ident(conn);
4392
4393 l2cap_send_cmd(conn, conn->info_ident,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004394 L2CAP_INFO_REQ, sizeof(req), &req);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004395 } else {
4396 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4397 conn->info_ident = 0;
4398
4399 l2cap_conn_start(conn);
4400 }
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004401 break;
4402
4403 case L2CAP_IT_FIXED_CHAN:
4404 conn->fixed_chan_mask = rsp->data[0];
Marcel Holtmann984947d2009-02-06 23:35:19 +01004405 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004406 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004407
4408 l2cap_conn_start(conn);
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004409 break;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004410 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004411
Linus Torvalds1da177e2005-04-16 15:20:36 -07004412 return 0;
4413}
4414
Mat Martineau17009152012-10-23 15:24:07 -07004415static int l2cap_create_channel_req(struct l2cap_conn *conn,
4416 struct l2cap_cmd_hdr *cmd,
4417 u16 cmd_len, void *data)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004418{
4419 struct l2cap_create_chan_req *req = data;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004420 struct l2cap_create_chan_rsp rsp;
Mat Martineau17009152012-10-23 15:24:07 -07004421 struct l2cap_chan *chan;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004422 struct hci_dev *hdev;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004423 u16 psm, scid;
4424
4425 if (cmd_len != sizeof(*req))
4426 return -EPROTO;
4427
Marcel Holtmann848566b2013-10-01 22:59:22 -07004428 if (!conn->hs_enabled)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004429 return -EINVAL;
4430
4431 psm = le16_to_cpu(req->psm);
4432 scid = le16_to_cpu(req->scid);
4433
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004434 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 -07004435
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004436 /* For controller id 0 make BR/EDR connection */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004437 if (req->amp_id == AMP_ID_BREDR) {
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004438 l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4439 req->amp_id);
4440 return 0;
4441 }
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004442
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004443 /* Validate AMP controller id */
4444 hdev = hci_dev_get(req->amp_id);
4445 if (!hdev)
4446 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004447
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004448 if (hdev->dev_type != HCI_AMP || !test_bit(HCI_UP, &hdev->flags)) {
Mat Martineau17009152012-10-23 15:24:07 -07004449 hci_dev_put(hdev);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004450 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004451 }
4452
4453 chan = l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4454 req->amp_id);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004455 if (chan) {
4456 struct amp_mgr *mgr = conn->hcon->amp_mgr;
4457 struct hci_conn *hs_hcon;
4458
Marcel Holtmann98e0f7e2013-10-13 02:23:40 -07004459 hs_hcon = hci_conn_hash_lookup_ba(hdev, AMP_LINK,
4460 &conn->hcon->dst);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004461 if (!hs_hcon) {
4462 hci_dev_put(hdev);
Johan Hedberg662d6522013-10-16 11:20:47 +03004463 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4464 chan->dcid);
4465 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004466 }
4467
4468 BT_DBG("mgr %p bredr_chan %p hs_hcon %p", mgr, chan, hs_hcon);
4469
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004470 mgr->bredr_chan = chan;
4471 chan->hs_hcon = hs_hcon;
Andrei Emeltchenkofd45bf42012-11-20 17:16:22 +02004472 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004473 conn->mtu = hdev->block_mtu;
4474 }
4475
4476 hci_dev_put(hdev);
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004477
4478 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004479
4480error:
4481 rsp.dcid = 0;
4482 rsp.scid = cpu_to_le16(scid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004483 rsp.result = cpu_to_le16(L2CAP_CR_BAD_AMP);
4484 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004485
4486 l2cap_send_cmd(conn, cmd->ident, L2CAP_CREATE_CHAN_RSP,
4487 sizeof(rsp), &rsp);
4488
Johan Hedbergdc280802013-09-16 13:05:13 +03004489 return 0;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004490}
4491
Mat Martineau8eb200b2012-10-23 15:24:17 -07004492static void l2cap_send_move_chan_req(struct l2cap_chan *chan, u8 dest_amp_id)
4493{
4494 struct l2cap_move_chan_req req;
4495 u8 ident;
4496
4497 BT_DBG("chan %p, dest_amp_id %d", chan, dest_amp_id);
4498
4499 ident = l2cap_get_ident(chan->conn);
4500 chan->ident = ident;
4501
4502 req.icid = cpu_to_le16(chan->scid);
4503 req.dest_amp_id = dest_amp_id;
4504
4505 l2cap_send_cmd(chan->conn, ident, L2CAP_MOVE_CHAN_REQ, sizeof(req),
4506 &req);
4507
4508 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4509}
4510
Mat Martineau1500109b2012-10-23 15:24:15 -07004511static void l2cap_send_move_chan_rsp(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004512{
4513 struct l2cap_move_chan_rsp rsp;
4514
Mat Martineau1500109b2012-10-23 15:24:15 -07004515 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004516
Mat Martineau1500109b2012-10-23 15:24:15 -07004517 rsp.icid = cpu_to_le16(chan->dcid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004518 rsp.result = cpu_to_le16(result);
4519
Mat Martineau1500109b2012-10-23 15:24:15 -07004520 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_RSP,
4521 sizeof(rsp), &rsp);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004522}
4523
Mat Martineau5b155ef2012-10-23 15:24:14 -07004524static void l2cap_send_move_chan_cfm(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004525{
4526 struct l2cap_move_chan_cfm cfm;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004527
Mat Martineau5b155ef2012-10-23 15:24:14 -07004528 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004529
Mat Martineau5b155ef2012-10-23 15:24:14 -07004530 chan->ident = l2cap_get_ident(chan->conn);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004531
Mat Martineau5b155ef2012-10-23 15:24:14 -07004532 cfm.icid = cpu_to_le16(chan->scid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004533 cfm.result = cpu_to_le16(result);
4534
Mat Martineau5b155ef2012-10-23 15:24:14 -07004535 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_CFM,
4536 sizeof(cfm), &cfm);
4537
4538 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4539}
4540
4541static void l2cap_send_move_chan_cfm_icid(struct l2cap_conn *conn, u16 icid)
4542{
4543 struct l2cap_move_chan_cfm cfm;
4544
4545 BT_DBG("conn %p, icid 0x%4.4x", conn, icid);
4546
4547 cfm.icid = cpu_to_le16(icid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004548 cfm.result = cpu_to_le16(L2CAP_MC_UNCONFIRMED);
Mat Martineau5b155ef2012-10-23 15:24:14 -07004549
4550 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_MOVE_CHAN_CFM,
4551 sizeof(cfm), &cfm);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004552}
4553
4554static void l2cap_send_move_chan_cfm_rsp(struct l2cap_conn *conn, u8 ident,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004555 u16 icid)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004556{
4557 struct l2cap_move_chan_cfm_rsp rsp;
4558
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004559 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004560
4561 rsp.icid = cpu_to_le16(icid);
4562 l2cap_send_cmd(conn, ident, L2CAP_MOVE_CHAN_CFM_RSP, sizeof(rsp), &rsp);
4563}
4564
Mat Martineau5f3847a2012-10-23 15:24:12 -07004565static void __release_logical_link(struct l2cap_chan *chan)
4566{
4567 chan->hs_hchan = NULL;
4568 chan->hs_hcon = NULL;
4569
4570 /* Placeholder - release the logical link */
4571}
4572
Mat Martineau1500109b2012-10-23 15:24:15 -07004573static void l2cap_logical_fail(struct l2cap_chan *chan)
4574{
4575 /* Logical link setup failed */
4576 if (chan->state != BT_CONNECTED) {
4577 /* Create channel failure, disconnect */
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004578 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineau1500109b2012-10-23 15:24:15 -07004579 return;
4580 }
4581
4582 switch (chan->move_role) {
4583 case L2CAP_MOVE_ROLE_RESPONDER:
4584 l2cap_move_done(chan);
4585 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_SUPP);
4586 break;
4587 case L2CAP_MOVE_ROLE_INITIATOR:
4588 if (chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_COMP ||
4589 chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_CFM) {
4590 /* Remote has only sent pending or
4591 * success responses, clean up
4592 */
4593 l2cap_move_done(chan);
4594 }
4595
4596 /* Other amp move states imply that the move
4597 * has already aborted
4598 */
4599 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
4600 break;
4601 }
4602}
4603
4604static void l2cap_logical_finish_create(struct l2cap_chan *chan,
4605 struct hci_chan *hchan)
4606{
4607 struct l2cap_conf_rsp rsp;
Mat Martineau1500109b2012-10-23 15:24:15 -07004608
Andrei Emeltchenko336178a2012-10-31 15:46:27 +02004609 chan->hs_hchan = hchan;
Mat Martineau1500109b2012-10-23 15:24:15 -07004610 chan->hs_hcon->l2cap_data = chan->conn;
4611
Andrei Emeltchenko35ba9562012-10-25 15:20:43 +03004612 l2cap_send_efs_conf_rsp(chan, &rsp, chan->ident, 0);
Mat Martineau1500109b2012-10-23 15:24:15 -07004613
4614 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Andrei Emeltchenkofe79c6f2012-10-25 15:20:42 +03004615 int err;
Mat Martineau1500109b2012-10-23 15:24:15 -07004616
4617 set_default_fcs(chan);
4618
4619 err = l2cap_ertm_init(chan);
4620 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004621 l2cap_send_disconn_req(chan, -err);
Mat Martineau1500109b2012-10-23 15:24:15 -07004622 else
4623 l2cap_chan_ready(chan);
4624 }
4625}
4626
4627static void l2cap_logical_finish_move(struct l2cap_chan *chan,
4628 struct hci_chan *hchan)
4629{
4630 chan->hs_hcon = hchan->conn;
4631 chan->hs_hcon->l2cap_data = chan->conn;
4632
4633 BT_DBG("move_state %d", chan->move_state);
4634
4635 switch (chan->move_state) {
4636 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
4637 /* Move confirm will be sent after a success
4638 * response is received
4639 */
4640 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4641 break;
4642 case L2CAP_MOVE_WAIT_LOGICAL_CFM:
4643 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4644 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4645 } else if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
4646 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
4647 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
4648 } else if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4649 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4650 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4651 }
4652 break;
4653 default:
4654 /* Move was not in expected state, free the channel */
4655 __release_logical_link(chan);
4656
4657 chan->move_state = L2CAP_MOVE_STABLE;
4658 }
4659}
4660
4661/* Call with chan locked */
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004662void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan,
4663 u8 status)
Mat Martineau5b155ef2012-10-23 15:24:14 -07004664{
Mat Martineau1500109b2012-10-23 15:24:15 -07004665 BT_DBG("chan %p, hchan %p, status %d", chan, hchan, status);
4666
4667 if (status) {
4668 l2cap_logical_fail(chan);
4669 __release_logical_link(chan);
4670 return;
4671 }
4672
4673 if (chan->state != BT_CONNECTED) {
4674 /* Ignore logical link if channel is on BR/EDR */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004675 if (chan->local_amp_id != AMP_ID_BREDR)
Mat Martineau1500109b2012-10-23 15:24:15 -07004676 l2cap_logical_finish_create(chan, hchan);
4677 } else {
4678 l2cap_logical_finish_move(chan, hchan);
4679 }
Mat Martineau5b155ef2012-10-23 15:24:14 -07004680}
4681
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004682void l2cap_move_start(struct l2cap_chan *chan)
4683{
4684 BT_DBG("chan %p", chan);
4685
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004686 if (chan->local_amp_id == AMP_ID_BREDR) {
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004687 if (chan->chan_policy != BT_CHANNEL_POLICY_AMP_PREFERRED)
4688 return;
4689 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4690 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4691 /* Placeholder - start physical link setup */
4692 } else {
4693 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4694 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4695 chan->move_id = 0;
4696 l2cap_move_setup(chan);
4697 l2cap_send_move_chan_req(chan, 0);
4698 }
4699}
4700
Mat Martineau8eb200b2012-10-23 15:24:17 -07004701static void l2cap_do_create(struct l2cap_chan *chan, int result,
4702 u8 local_amp_id, u8 remote_amp_id)
4703{
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004704 BT_DBG("chan %p state %s %u -> %u", chan, state_to_string(chan->state),
4705 local_amp_id, remote_amp_id);
4706
Andrei Emeltchenko12d6cc62012-11-14 17:39:31 +02004707 chan->fcs = L2CAP_FCS_NONE;
4708
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004709 /* Outgoing channel on AMP */
4710 if (chan->state == BT_CONNECT) {
4711 if (result == L2CAP_CR_SUCCESS) {
4712 chan->local_amp_id = local_amp_id;
4713 l2cap_send_create_chan_req(chan, remote_amp_id);
4714 } else {
4715 /* Revert to BR/EDR connect */
4716 l2cap_send_conn_req(chan);
4717 }
4718
4719 return;
4720 }
4721
4722 /* Incoming channel on AMP */
4723 if (__l2cap_no_conn_pending(chan)) {
Mat Martineau8eb200b2012-10-23 15:24:17 -07004724 struct l2cap_conn_rsp rsp;
4725 char buf[128];
4726 rsp.scid = cpu_to_le16(chan->dcid);
4727 rsp.dcid = cpu_to_le16(chan->scid);
4728
Mat Martineau8eb200b2012-10-23 15:24:17 -07004729 if (result == L2CAP_CR_SUCCESS) {
4730 /* Send successful response */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004731 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
4732 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004733 } else {
4734 /* Send negative response */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004735 rsp.result = cpu_to_le16(L2CAP_CR_NO_MEM);
4736 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004737 }
4738
4739 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_RSP,
4740 sizeof(rsp), &rsp);
4741
4742 if (result == L2CAP_CR_SUCCESS) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02004743 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004744 set_bit(CONF_REQ_SENT, &chan->conf_state);
4745 l2cap_send_cmd(chan->conn, l2cap_get_ident(chan->conn),
4746 L2CAP_CONF_REQ,
4747 l2cap_build_conf_req(chan, buf), buf);
4748 chan->num_conf_req++;
4749 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004750 }
4751}
4752
4753static void l2cap_do_move_initiate(struct l2cap_chan *chan, u8 local_amp_id,
4754 u8 remote_amp_id)
4755{
4756 l2cap_move_setup(chan);
4757 chan->move_id = local_amp_id;
4758 chan->move_state = L2CAP_MOVE_WAIT_RSP;
4759
4760 l2cap_send_move_chan_req(chan, remote_amp_id);
4761}
4762
4763static void l2cap_do_move_respond(struct l2cap_chan *chan, int result)
4764{
4765 struct hci_chan *hchan = NULL;
4766
4767 /* Placeholder - get hci_chan for logical link */
4768
4769 if (hchan) {
4770 if (hchan->state == BT_CONNECTED) {
4771 /* Logical link is ready to go */
4772 chan->hs_hcon = hchan->conn;
4773 chan->hs_hcon->l2cap_data = chan->conn;
4774 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4775 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4776
4777 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
4778 } else {
4779 /* Wait for logical link to be ready */
4780 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4781 }
4782 } else {
4783 /* Logical link not available */
4784 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_ALLOWED);
4785 }
4786}
4787
4788static void l2cap_do_move_cancel(struct l2cap_chan *chan, int result)
4789{
4790 if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4791 u8 rsp_result;
4792 if (result == -EINVAL)
4793 rsp_result = L2CAP_MR_BAD_ID;
4794 else
4795 rsp_result = L2CAP_MR_NOT_ALLOWED;
4796
4797 l2cap_send_move_chan_rsp(chan, rsp_result);
4798 }
4799
4800 chan->move_role = L2CAP_MOVE_ROLE_NONE;
4801 chan->move_state = L2CAP_MOVE_STABLE;
4802
4803 /* Restart data transmission */
4804 l2cap_ertm_send(chan);
4805}
4806
Andrei Emeltchenkoa514b172012-11-14 17:39:30 +02004807/* Invoke with locked chan */
4808void __l2cap_physical_cfm(struct l2cap_chan *chan, int result)
Mat Martineau8eb200b2012-10-23 15:24:17 -07004809{
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004810 u8 local_amp_id = chan->local_amp_id;
Andrei Emeltchenkofffadc02012-11-01 15:37:03 +02004811 u8 remote_amp_id = chan->remote_amp_id;
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004812
Mat Martineau8eb200b2012-10-23 15:24:17 -07004813 BT_DBG("chan %p, result %d, local_amp_id %d, remote_amp_id %d",
4814 chan, result, local_amp_id, remote_amp_id);
4815
Mat Martineau8eb200b2012-10-23 15:24:17 -07004816 if (chan->state == BT_DISCONN || chan->state == BT_CLOSED) {
4817 l2cap_chan_unlock(chan);
4818 return;
4819 }
4820
4821 if (chan->state != BT_CONNECTED) {
4822 l2cap_do_create(chan, result, local_amp_id, remote_amp_id);
4823 } else if (result != L2CAP_MR_SUCCESS) {
4824 l2cap_do_move_cancel(chan, result);
4825 } else {
4826 switch (chan->move_role) {
4827 case L2CAP_MOVE_ROLE_INITIATOR:
4828 l2cap_do_move_initiate(chan, local_amp_id,
4829 remote_amp_id);
4830 break;
4831 case L2CAP_MOVE_ROLE_RESPONDER:
4832 l2cap_do_move_respond(chan, result);
4833 break;
4834 default:
4835 l2cap_do_move_cancel(chan, result);
4836 break;
4837 }
4838 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004839}
4840
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004841static inline int l2cap_move_channel_req(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004842 struct l2cap_cmd_hdr *cmd,
4843 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004844{
4845 struct l2cap_move_chan_req *req = data;
Mat Martineau1500109b2012-10-23 15:24:15 -07004846 struct l2cap_move_chan_rsp rsp;
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004847 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004848 u16 icid = 0;
4849 u16 result = L2CAP_MR_NOT_ALLOWED;
4850
4851 if (cmd_len != sizeof(*req))
4852 return -EPROTO;
4853
4854 icid = le16_to_cpu(req->icid);
4855
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004856 BT_DBG("icid 0x%4.4x, dest_amp_id %d", icid, req->dest_amp_id);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004857
Marcel Holtmann848566b2013-10-01 22:59:22 -07004858 if (!conn->hs_enabled)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004859 return -EINVAL;
4860
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004861 chan = l2cap_get_chan_by_dcid(conn, icid);
4862 if (!chan) {
Mat Martineau1500109b2012-10-23 15:24:15 -07004863 rsp.icid = cpu_to_le16(icid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004864 rsp.result = cpu_to_le16(L2CAP_MR_NOT_ALLOWED);
Mat Martineau1500109b2012-10-23 15:24:15 -07004865 l2cap_send_cmd(conn, cmd->ident, L2CAP_MOVE_CHAN_RSP,
4866 sizeof(rsp), &rsp);
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004867 return 0;
4868 }
4869
Mat Martineau1500109b2012-10-23 15:24:15 -07004870 chan->ident = cmd->ident;
4871
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004872 if (chan->scid < L2CAP_CID_DYN_START ||
4873 chan->chan_policy == BT_CHANNEL_POLICY_BREDR_ONLY ||
4874 (chan->mode != L2CAP_MODE_ERTM &&
4875 chan->mode != L2CAP_MODE_STREAMING)) {
4876 result = L2CAP_MR_NOT_ALLOWED;
4877 goto send_move_response;
4878 }
4879
4880 if (chan->local_amp_id == req->dest_amp_id) {
4881 result = L2CAP_MR_SAME_ID;
4882 goto send_move_response;
4883 }
4884
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004885 if (req->dest_amp_id != AMP_ID_BREDR) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004886 struct hci_dev *hdev;
4887 hdev = hci_dev_get(req->dest_amp_id);
4888 if (!hdev || hdev->dev_type != HCI_AMP ||
4889 !test_bit(HCI_UP, &hdev->flags)) {
4890 if (hdev)
4891 hci_dev_put(hdev);
4892
4893 result = L2CAP_MR_BAD_ID;
4894 goto send_move_response;
4895 }
4896 hci_dev_put(hdev);
4897 }
4898
4899 /* Detect a move collision. Only send a collision response
4900 * if this side has "lost", otherwise proceed with the move.
4901 * The winner has the larger bd_addr.
4902 */
4903 if ((__chan_is_moving(chan) ||
4904 chan->move_role != L2CAP_MOVE_ROLE_NONE) &&
Marcel Holtmann6f59b902013-10-13 05:24:01 -07004905 bacmp(&conn->hcon->src, &conn->hcon->dst) > 0) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004906 result = L2CAP_MR_COLLISION;
4907 goto send_move_response;
4908 }
4909
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004910 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
4911 l2cap_move_setup(chan);
4912 chan->move_id = req->dest_amp_id;
4913 icid = chan->dcid;
4914
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004915 if (req->dest_amp_id == AMP_ID_BREDR) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004916 /* Moving to BR/EDR */
4917 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4918 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4919 result = L2CAP_MR_PEND;
4920 } else {
4921 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4922 result = L2CAP_MR_SUCCESS;
4923 }
4924 } else {
4925 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4926 /* Placeholder - uncomment when amp functions are available */
4927 /*amp_accept_physical(chan, req->dest_amp_id);*/
4928 result = L2CAP_MR_PEND;
4929 }
4930
4931send_move_response:
Mat Martineau1500109b2012-10-23 15:24:15 -07004932 l2cap_send_move_chan_rsp(chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004933
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004934 l2cap_chan_unlock(chan);
4935
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004936 return 0;
4937}
4938
Mat Martineau5b155ef2012-10-23 15:24:14 -07004939static void l2cap_move_continue(struct l2cap_conn *conn, u16 icid, u16 result)
4940{
4941 struct l2cap_chan *chan;
4942 struct hci_chan *hchan = NULL;
4943
4944 chan = l2cap_get_chan_by_scid(conn, icid);
4945 if (!chan) {
4946 l2cap_send_move_chan_cfm_icid(conn, icid);
4947 return;
4948 }
4949
4950 __clear_chan_timer(chan);
4951 if (result == L2CAP_MR_PEND)
4952 __set_chan_timer(chan, L2CAP_MOVE_ERTX_TIMEOUT);
4953
4954 switch (chan->move_state) {
4955 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
4956 /* Move confirm will be sent when logical link
4957 * is complete.
4958 */
4959 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4960 break;
4961 case L2CAP_MOVE_WAIT_RSP_SUCCESS:
4962 if (result == L2CAP_MR_PEND) {
4963 break;
4964 } else if (test_bit(CONN_LOCAL_BUSY,
4965 &chan->conn_state)) {
4966 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4967 } else {
4968 /* Logical link is up or moving to BR/EDR,
4969 * proceed with move
4970 */
4971 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
4972 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
4973 }
4974 break;
4975 case L2CAP_MOVE_WAIT_RSP:
4976 /* Moving to AMP */
4977 if (result == L2CAP_MR_SUCCESS) {
4978 /* Remote is ready, send confirm immediately
4979 * after logical link is ready
4980 */
4981 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4982 } else {
4983 /* Both logical link and move success
4984 * are required to confirm
4985 */
4986 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_COMP;
4987 }
4988
4989 /* Placeholder - get hci_chan for logical link */
4990 if (!hchan) {
4991 /* Logical link not available */
4992 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
4993 break;
4994 }
4995
4996 /* If the logical link is not yet connected, do not
4997 * send confirmation.
4998 */
4999 if (hchan->state != BT_CONNECTED)
5000 break;
5001
5002 /* Logical link is already ready to go */
5003
5004 chan->hs_hcon = hchan->conn;
5005 chan->hs_hcon->l2cap_data = chan->conn;
5006
5007 if (result == L2CAP_MR_SUCCESS) {
5008 /* Can confirm now */
5009 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
5010 } else {
5011 /* Now only need move success
5012 * to confirm
5013 */
5014 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
5015 }
5016
5017 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
5018 break;
5019 default:
5020 /* Any other amp move state means the move failed. */
5021 chan->move_id = chan->local_amp_id;
5022 l2cap_move_done(chan);
5023 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5024 }
5025
5026 l2cap_chan_unlock(chan);
5027}
5028
5029static void l2cap_move_fail(struct l2cap_conn *conn, u8 ident, u16 icid,
5030 u16 result)
5031{
5032 struct l2cap_chan *chan;
5033
5034 chan = l2cap_get_chan_by_ident(conn, ident);
5035 if (!chan) {
5036 /* Could not locate channel, icid is best guess */
5037 l2cap_send_move_chan_cfm_icid(conn, icid);
5038 return;
5039 }
5040
5041 __clear_chan_timer(chan);
5042
5043 if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
5044 if (result == L2CAP_MR_COLLISION) {
5045 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
5046 } else {
5047 /* Cleanup - cancel move */
5048 chan->move_id = chan->local_amp_id;
5049 l2cap_move_done(chan);
5050 }
5051 }
5052
5053 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5054
5055 l2cap_chan_unlock(chan);
5056}
5057
5058static int l2cap_move_channel_rsp(struct l2cap_conn *conn,
5059 struct l2cap_cmd_hdr *cmd,
5060 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005061{
5062 struct l2cap_move_chan_rsp *rsp = data;
5063 u16 icid, result;
5064
5065 if (cmd_len != sizeof(*rsp))
5066 return -EPROTO;
5067
5068 icid = le16_to_cpu(rsp->icid);
5069 result = le16_to_cpu(rsp->result);
5070
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005071 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005072
Mat Martineau5b155ef2012-10-23 15:24:14 -07005073 if (result == L2CAP_MR_SUCCESS || result == L2CAP_MR_PEND)
5074 l2cap_move_continue(conn, icid, result);
5075 else
5076 l2cap_move_fail(conn, cmd->ident, icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005077
5078 return 0;
5079}
5080
Mat Martineau5f3847a2012-10-23 15:24:12 -07005081static int l2cap_move_channel_confirm(struct l2cap_conn *conn,
5082 struct l2cap_cmd_hdr *cmd,
5083 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005084{
5085 struct l2cap_move_chan_cfm *cfm = data;
Mat Martineau5f3847a2012-10-23 15:24:12 -07005086 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005087 u16 icid, result;
5088
5089 if (cmd_len != sizeof(*cfm))
5090 return -EPROTO;
5091
5092 icid = le16_to_cpu(cfm->icid);
5093 result = le16_to_cpu(cfm->result);
5094
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005095 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005096
Mat Martineau5f3847a2012-10-23 15:24:12 -07005097 chan = l2cap_get_chan_by_dcid(conn, icid);
5098 if (!chan) {
5099 /* Spec requires a response even if the icid was not found */
5100 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5101 return 0;
5102 }
5103
5104 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM) {
5105 if (result == L2CAP_MC_CONFIRMED) {
5106 chan->local_amp_id = chan->move_id;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005107 if (chan->local_amp_id == AMP_ID_BREDR)
Mat Martineau5f3847a2012-10-23 15:24:12 -07005108 __release_logical_link(chan);
5109 } else {
5110 chan->move_id = chan->local_amp_id;
5111 }
5112
5113 l2cap_move_done(chan);
5114 }
5115
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005116 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5117
Mat Martineau5f3847a2012-10-23 15:24:12 -07005118 l2cap_chan_unlock(chan);
5119
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005120 return 0;
5121}
5122
5123static inline int l2cap_move_channel_confirm_rsp(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005124 struct l2cap_cmd_hdr *cmd,
5125 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005126{
5127 struct l2cap_move_chan_cfm_rsp *rsp = data;
Mat Martineau3fd71a02012-10-23 15:24:16 -07005128 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005129 u16 icid;
5130
5131 if (cmd_len != sizeof(*rsp))
5132 return -EPROTO;
5133
5134 icid = le16_to_cpu(rsp->icid);
5135
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005136 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005137
Mat Martineau3fd71a02012-10-23 15:24:16 -07005138 chan = l2cap_get_chan_by_scid(conn, icid);
5139 if (!chan)
5140 return 0;
5141
5142 __clear_chan_timer(chan);
5143
5144 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM_RSP) {
5145 chan->local_amp_id = chan->move_id;
5146
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005147 if (chan->local_amp_id == AMP_ID_BREDR && chan->hs_hchan)
Mat Martineau3fd71a02012-10-23 15:24:16 -07005148 __release_logical_link(chan);
5149
5150 l2cap_move_done(chan);
5151 }
5152
5153 l2cap_chan_unlock(chan);
5154
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005155 return 0;
5156}
5157
Claudio Takahaside731152011-02-11 19:28:55 -02005158static inline int l2cap_conn_param_update_req(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005159 struct l2cap_cmd_hdr *cmd,
Johan Hedberg203e6392013-05-15 10:07:15 +03005160 u16 cmd_len, u8 *data)
Claudio Takahaside731152011-02-11 19:28:55 -02005161{
5162 struct hci_conn *hcon = conn->hcon;
5163 struct l2cap_conn_param_update_req *req;
5164 struct l2cap_conn_param_update_rsp rsp;
Johan Hedberg203e6392013-05-15 10:07:15 +03005165 u16 min, max, latency, to_multiplier;
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005166 int err;
Claudio Takahaside731152011-02-11 19:28:55 -02005167
Johan Hedberg40bef302014-07-16 11:42:27 +03005168 if (hcon->role != HCI_ROLE_MASTER)
Claudio Takahaside731152011-02-11 19:28:55 -02005169 return -EINVAL;
5170
Claudio Takahaside731152011-02-11 19:28:55 -02005171 if (cmd_len != sizeof(struct l2cap_conn_param_update_req))
5172 return -EPROTO;
5173
5174 req = (struct l2cap_conn_param_update_req *) data;
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03005175 min = __le16_to_cpu(req->min);
5176 max = __le16_to_cpu(req->max);
Claudio Takahaside731152011-02-11 19:28:55 -02005177 latency = __le16_to_cpu(req->latency);
5178 to_multiplier = __le16_to_cpu(req->to_multiplier);
5179
5180 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 +01005181 min, max, latency, to_multiplier);
Claudio Takahaside731152011-02-11 19:28:55 -02005182
5183 memset(&rsp, 0, sizeof(rsp));
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005184
Andre Guedesd4905f22014-06-25 21:52:52 -03005185 err = hci_check_conn_params(min, max, latency, to_multiplier);
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005186 if (err)
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005187 rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_REJECTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005188 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005189 rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_ACCEPTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005190
5191 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONN_PARAM_UPDATE_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005192 sizeof(rsp), &rsp);
Claudio Takahaside731152011-02-11 19:28:55 -02005193
Andre Guedesffb5a8272014-07-01 18:10:11 -03005194 if (!err) {
Johan Hedbergf4869e22014-07-02 17:37:32 +03005195 u8 store_hint;
Andre Guedesffb5a8272014-07-01 18:10:11 -03005196
Johan Hedbergf4869e22014-07-02 17:37:32 +03005197 store_hint = hci_le_conn_update(hcon, min, max, latency,
5198 to_multiplier);
5199 mgmt_new_conn_param(hcon->hdev, &hcon->dst, hcon->dst_type,
5200 store_hint, min, max, latency,
5201 to_multiplier);
5202
Andre Guedesffb5a8272014-07-01 18:10:11 -03005203 }
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005204
Claudio Takahaside731152011-02-11 19:28:55 -02005205 return 0;
5206}
5207
Johan Hedbergf1496de2013-05-13 14:15:56 +03005208static int l2cap_le_connect_rsp(struct l2cap_conn *conn,
5209 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5210 u8 *data)
5211{
5212 struct l2cap_le_conn_rsp *rsp = (struct l2cap_le_conn_rsp *) data;
5213 u16 dcid, mtu, mps, credits, result;
5214 struct l2cap_chan *chan;
5215 int err;
5216
5217 if (cmd_len < sizeof(*rsp))
5218 return -EPROTO;
5219
5220 dcid = __le16_to_cpu(rsp->dcid);
5221 mtu = __le16_to_cpu(rsp->mtu);
5222 mps = __le16_to_cpu(rsp->mps);
5223 credits = __le16_to_cpu(rsp->credits);
5224 result = __le16_to_cpu(rsp->result);
5225
5226 if (result == L2CAP_CR_SUCCESS && (mtu < 23 || mps < 23))
5227 return -EPROTO;
5228
5229 BT_DBG("dcid 0x%4.4x mtu %u mps %u credits %u result 0x%2.2x",
5230 dcid, mtu, mps, credits, result);
5231
5232 mutex_lock(&conn->chan_lock);
5233
5234 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5235 if (!chan) {
5236 err = -EBADSLT;
5237 goto unlock;
5238 }
5239
5240 err = 0;
5241
5242 l2cap_chan_lock(chan);
5243
5244 switch (result) {
5245 case L2CAP_CR_SUCCESS:
5246 chan->ident = 0;
5247 chan->dcid = dcid;
5248 chan->omtu = mtu;
5249 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005250 chan->tx_credits = credits;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005251 l2cap_chan_ready(chan);
5252 break;
5253
5254 default:
5255 l2cap_chan_del(chan, ECONNREFUSED);
5256 break;
5257 }
5258
5259 l2cap_chan_unlock(chan);
5260
5261unlock:
5262 mutex_unlock(&conn->chan_lock);
5263
5264 return err;
5265}
5266
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005267static inline int l2cap_bredr_sig_cmd(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005268 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5269 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005270{
5271 int err = 0;
5272
5273 switch (cmd->code) {
5274 case L2CAP_COMMAND_REJ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005275 l2cap_command_rej(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005276 break;
5277
5278 case L2CAP_CONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005279 err = l2cap_connect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005280 break;
5281
5282 case L2CAP_CONN_RSP:
Mat Martineauf5a25982012-10-11 17:48:21 +03005283 case L2CAP_CREATE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005284 l2cap_connect_create_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005285 break;
5286
5287 case L2CAP_CONF_REQ:
5288 err = l2cap_config_req(conn, cmd, cmd_len, data);
5289 break;
5290
5291 case L2CAP_CONF_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005292 l2cap_config_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005293 break;
5294
5295 case L2CAP_DISCONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005296 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005297 break;
5298
5299 case L2CAP_DISCONN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005300 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005301 break;
5302
5303 case L2CAP_ECHO_REQ:
5304 l2cap_send_cmd(conn, cmd->ident, L2CAP_ECHO_RSP, cmd_len, data);
5305 break;
5306
5307 case L2CAP_ECHO_RSP:
5308 break;
5309
5310 case L2CAP_INFO_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005311 err = l2cap_information_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005312 break;
5313
5314 case L2CAP_INFO_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005315 l2cap_information_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005316 break;
5317
Mat Martineauf94ff6f2011-11-02 16:18:32 -07005318 case L2CAP_CREATE_CHAN_REQ:
5319 err = l2cap_create_channel_req(conn, cmd, cmd_len, data);
5320 break;
5321
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005322 case L2CAP_MOVE_CHAN_REQ:
5323 err = l2cap_move_channel_req(conn, cmd, cmd_len, data);
5324 break;
5325
5326 case L2CAP_MOVE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005327 l2cap_move_channel_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005328 break;
5329
5330 case L2CAP_MOVE_CHAN_CFM:
5331 err = l2cap_move_channel_confirm(conn, cmd, cmd_len, data);
5332 break;
5333
5334 case L2CAP_MOVE_CHAN_CFM_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005335 l2cap_move_channel_confirm_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005336 break;
5337
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005338 default:
5339 BT_ERR("Unknown BR/EDR signaling command 0x%2.2x", cmd->code);
5340 err = -EINVAL;
5341 break;
5342 }
5343
5344 return err;
5345}
5346
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005347static int l2cap_le_connect_req(struct l2cap_conn *conn,
5348 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5349 u8 *data)
5350{
5351 struct l2cap_le_conn_req *req = (struct l2cap_le_conn_req *) data;
5352 struct l2cap_le_conn_rsp rsp;
5353 struct l2cap_chan *chan, *pchan;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005354 u16 dcid, scid, credits, mtu, mps;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005355 __le16 psm;
5356 u8 result;
5357
5358 if (cmd_len != sizeof(*req))
5359 return -EPROTO;
5360
5361 scid = __le16_to_cpu(req->scid);
5362 mtu = __le16_to_cpu(req->mtu);
5363 mps = __le16_to_cpu(req->mps);
5364 psm = req->psm;
5365 dcid = 0;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005366 credits = 0;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005367
5368 if (mtu < 23 || mps < 23)
5369 return -EPROTO;
5370
5371 BT_DBG("psm 0x%2.2x scid 0x%4.4x mtu %u mps %u", __le16_to_cpu(psm),
5372 scid, mtu, mps);
5373
5374 /* Check if we have socket listening on psm */
5375 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
5376 &conn->hcon->dst, LE_LINK);
5377 if (!pchan) {
5378 result = L2CAP_CR_BAD_PSM;
5379 chan = NULL;
5380 goto response;
5381 }
5382
5383 mutex_lock(&conn->chan_lock);
5384 l2cap_chan_lock(pchan);
5385
5386 if (!smp_sufficient_security(conn->hcon, pchan->sec_level)) {
5387 result = L2CAP_CR_AUTHENTICATION;
5388 chan = NULL;
5389 goto response_unlock;
5390 }
5391
5392 /* Check if we already have channel with that dcid */
5393 if (__l2cap_get_chan_by_dcid(conn, scid)) {
5394 result = L2CAP_CR_NO_MEM;
5395 chan = NULL;
5396 goto response_unlock;
5397 }
5398
5399 chan = pchan->ops->new_connection(pchan);
5400 if (!chan) {
5401 result = L2CAP_CR_NO_MEM;
5402 goto response_unlock;
5403 }
5404
Johan Hedberg0ce43ce2013-12-05 14:55:33 +02005405 l2cap_le_flowctl_init(chan);
5406
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005407 bacpy(&chan->src, &conn->hcon->src);
5408 bacpy(&chan->dst, &conn->hcon->dst);
5409 chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type);
5410 chan->dst_type = bdaddr_type(conn->hcon, conn->hcon->dst_type);
5411 chan->psm = psm;
5412 chan->dcid = scid;
5413 chan->omtu = mtu;
5414 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005415 chan->tx_credits = __le16_to_cpu(req->credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005416
5417 __l2cap_chan_add(conn, chan);
5418 dcid = chan->scid;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005419 credits = chan->rx_credits;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005420
5421 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
5422
5423 chan->ident = cmd->ident;
5424
5425 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
5426 l2cap_state_change(chan, BT_CONNECT2);
5427 result = L2CAP_CR_PEND;
5428 chan->ops->defer(chan);
5429 } else {
5430 l2cap_chan_ready(chan);
5431 result = L2CAP_CR_SUCCESS;
5432 }
5433
5434response_unlock:
5435 l2cap_chan_unlock(pchan);
5436 mutex_unlock(&conn->chan_lock);
Johan Hedberga24cce12014-08-07 22:56:42 +03005437 l2cap_chan_put(pchan);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005438
5439 if (result == L2CAP_CR_PEND)
5440 return 0;
5441
5442response:
5443 if (chan) {
5444 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02005445 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005446 } else {
5447 rsp.mtu = 0;
5448 rsp.mps = 0;
5449 }
5450
5451 rsp.dcid = cpu_to_le16(dcid);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005452 rsp.credits = cpu_to_le16(credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005453 rsp.result = cpu_to_le16(result);
5454
5455 l2cap_send_cmd(conn, cmd->ident, L2CAP_LE_CONN_RSP, sizeof(rsp), &rsp);
5456
5457 return 0;
5458}
5459
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005460static inline int l2cap_le_credits(struct l2cap_conn *conn,
5461 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5462 u8 *data)
5463{
5464 struct l2cap_le_credits *pkt;
5465 struct l2cap_chan *chan;
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005466 u16 cid, credits, max_credits;
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005467
5468 if (cmd_len != sizeof(*pkt))
5469 return -EPROTO;
5470
5471 pkt = (struct l2cap_le_credits *) data;
5472 cid = __le16_to_cpu(pkt->cid);
5473 credits = __le16_to_cpu(pkt->credits);
5474
5475 BT_DBG("cid 0x%4.4x credits 0x%4.4x", cid, credits);
5476
5477 chan = l2cap_get_chan_by_dcid(conn, cid);
5478 if (!chan)
5479 return -EBADSLT;
5480
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005481 max_credits = LE_FLOWCTL_MAX_CREDITS - chan->tx_credits;
5482 if (credits > max_credits) {
5483 BT_ERR("LE credits overflow");
5484 l2cap_send_disconn_req(chan, ECONNRESET);
5485
5486 /* Return 0 so that we don't trigger an unnecessary
5487 * command reject packet.
5488 */
5489 return 0;
5490 }
5491
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005492 chan->tx_credits += credits;
5493
5494 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
5495 l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
5496 chan->tx_credits--;
5497 }
5498
5499 if (chan->tx_credits)
5500 chan->ops->resume(chan);
5501
5502 l2cap_chan_unlock(chan);
5503
5504 return 0;
5505}
5506
Johan Hedberg71fb4192013-12-10 10:52:48 +02005507static inline int l2cap_le_command_rej(struct l2cap_conn *conn,
5508 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5509 u8 *data)
5510{
5511 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
5512 struct l2cap_chan *chan;
5513
5514 if (cmd_len < sizeof(*rej))
5515 return -EPROTO;
5516
5517 mutex_lock(&conn->chan_lock);
5518
5519 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5520 if (!chan)
5521 goto done;
5522
5523 l2cap_chan_lock(chan);
5524 l2cap_chan_del(chan, ECONNREFUSED);
5525 l2cap_chan_unlock(chan);
5526
5527done:
5528 mutex_unlock(&conn->chan_lock);
5529 return 0;
5530}
5531
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005532static inline int l2cap_le_sig_cmd(struct l2cap_conn *conn,
Johan Hedberg203e6392013-05-15 10:07:15 +03005533 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5534 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005535{
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005536 int err = 0;
5537
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005538 switch (cmd->code) {
5539 case L2CAP_COMMAND_REJ:
Johan Hedberg71fb4192013-12-10 10:52:48 +02005540 l2cap_le_command_rej(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005541 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005542
5543 case L2CAP_CONN_PARAM_UPDATE_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005544 err = l2cap_conn_param_update_req(conn, cmd, cmd_len, data);
5545 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005546
5547 case L2CAP_CONN_PARAM_UPDATE_RSP:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005548 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005549
Johan Hedbergf1496de2013-05-13 14:15:56 +03005550 case L2CAP_LE_CONN_RSP:
5551 l2cap_le_connect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005552 break;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005553
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005554 case L2CAP_LE_CONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005555 err = l2cap_le_connect_req(conn, cmd, cmd_len, data);
5556 break;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005557
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005558 case L2CAP_LE_CREDITS:
5559 err = l2cap_le_credits(conn, cmd, cmd_len, data);
5560 break;
5561
Johan Hedberg3defe012013-05-15 10:16:06 +03005562 case L2CAP_DISCONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005563 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
5564 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005565
5566 case L2CAP_DISCONN_RSP:
5567 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005568 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005569
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005570 default:
5571 BT_ERR("Unknown LE signaling command 0x%2.2x", cmd->code);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005572 err = -EINVAL;
5573 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005574 }
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005575
5576 return err;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005577}
5578
Johan Hedbergc5623552013-04-29 19:35:33 +03005579static inline void l2cap_le_sig_channel(struct l2cap_conn *conn,
5580 struct sk_buff *skb)
5581{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005582 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005583 struct l2cap_cmd_hdr *cmd;
5584 u16 len;
Johan Hedbergc5623552013-04-29 19:35:33 +03005585 int err;
5586
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005587 if (hcon->type != LE_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005588 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005589
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005590 if (skb->len < L2CAP_CMD_HDR_SIZE)
5591 goto drop;
Johan Hedbergc5623552013-04-29 19:35:33 +03005592
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005593 cmd = (void *) skb->data;
5594 skb_pull(skb, L2CAP_CMD_HDR_SIZE);
Johan Hedbergc5623552013-04-29 19:35:33 +03005595
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005596 len = le16_to_cpu(cmd->len);
Johan Hedbergc5623552013-04-29 19:35:33 +03005597
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005598 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd->code, len, cmd->ident);
Johan Hedbergc5623552013-04-29 19:35:33 +03005599
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005600 if (len != skb->len || !cmd->ident) {
5601 BT_DBG("corrupted command");
5602 goto drop;
5603 }
Johan Hedbergc5623552013-04-29 19:35:33 +03005604
Johan Hedberg203e6392013-05-15 10:07:15 +03005605 err = l2cap_le_sig_cmd(conn, cmd, len, skb->data);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005606 if (err) {
5607 struct l2cap_cmd_rej_unk rej;
Johan Hedbergc5623552013-04-29 19:35:33 +03005608
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005609 BT_ERR("Wrong link type (%d)", err);
Johan Hedbergc5623552013-04-29 19:35:33 +03005610
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005611 rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005612 l2cap_send_cmd(conn, cmd->ident, L2CAP_COMMAND_REJ,
5613 sizeof(rej), &rej);
Johan Hedbergc5623552013-04-29 19:35:33 +03005614 }
5615
Marcel Holtmann3b166292013-10-02 08:28:21 -07005616drop:
Johan Hedbergc5623552013-04-29 19:35:33 +03005617 kfree_skb(skb);
5618}
5619
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005620static inline void l2cap_sig_channel(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005621 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005622{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005623 struct hci_conn *hcon = conn->hcon;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005624 u8 *data = skb->data;
5625 int len = skb->len;
5626 struct l2cap_cmd_hdr cmd;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005627 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005628
5629 l2cap_raw_recv(conn, skb);
5630
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005631 if (hcon->type != ACL_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005632 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005633
Linus Torvalds1da177e2005-04-16 15:20:36 -07005634 while (len >= L2CAP_CMD_HDR_SIZE) {
Al Viro88219a02007-07-29 00:17:25 -07005635 u16 cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005636 memcpy(&cmd, data, L2CAP_CMD_HDR_SIZE);
5637 data += L2CAP_CMD_HDR_SIZE;
5638 len -= L2CAP_CMD_HDR_SIZE;
5639
Al Viro88219a02007-07-29 00:17:25 -07005640 cmd_len = le16_to_cpu(cmd.len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005641
Gustavo Padovan2d792812012-10-06 10:07:01 +01005642 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd.code, cmd_len,
5643 cmd.ident);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005644
Al Viro88219a02007-07-29 00:17:25 -07005645 if (cmd_len > len || !cmd.ident) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005646 BT_DBG("corrupted command");
5647 break;
5648 }
5649
Johan Hedbergc5623552013-04-29 19:35:33 +03005650 err = l2cap_bredr_sig_cmd(conn, &cmd, cmd_len, data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005651 if (err) {
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03005652 struct l2cap_cmd_rej_unk rej;
Gustavo F. Padovan2c6d1a22011-03-23 14:38:32 -03005653
5654 BT_ERR("Wrong link type (%d)", err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005655
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005656 rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Gustavo Padovan2d792812012-10-06 10:07:01 +01005657 l2cap_send_cmd(conn, cmd.ident, L2CAP_COMMAND_REJ,
5658 sizeof(rej), &rej);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005659 }
5660
Al Viro88219a02007-07-29 00:17:25 -07005661 data += cmd_len;
5662 len -= cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005663 }
5664
Marcel Holtmann3b166292013-10-02 08:28:21 -07005665drop:
Linus Torvalds1da177e2005-04-16 15:20:36 -07005666 kfree_skb(skb);
5667}
5668
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005669static int l2cap_check_fcs(struct l2cap_chan *chan, struct sk_buff *skb)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005670{
5671 u16 our_fcs, rcv_fcs;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03005672 int hdr_size;
5673
5674 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
5675 hdr_size = L2CAP_EXT_HDR_SIZE;
5676 else
5677 hdr_size = L2CAP_ENH_HDR_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005678
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005679 if (chan->fcs == L2CAP_FCS_CRC16) {
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005680 skb_trim(skb, skb->len - L2CAP_FCS_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005681 rcv_fcs = get_unaligned_le16(skb->data + skb->len);
5682 our_fcs = crc16(0, skb->data - hdr_size, skb->len + hdr_size);
5683
5684 if (our_fcs != rcv_fcs)
João Paulo Rechi Vita7a560e52010-06-22 13:56:27 -03005685 return -EBADMSG;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005686 }
5687 return 0;
5688}
5689
Mat Martineau6ea00482012-05-17 20:53:52 -07005690static void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan)
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005691{
Mat Martineaue31f7632012-05-17 20:53:41 -07005692 struct l2cap_ctrl control;
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005693
Mat Martineaue31f7632012-05-17 20:53:41 -07005694 BT_DBG("chan %p", chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005695
Mat Martineaue31f7632012-05-17 20:53:41 -07005696 memset(&control, 0, sizeof(control));
5697 control.sframe = 1;
5698 control.final = 1;
5699 control.reqseq = chan->buffer_seq;
5700 set_bit(CONN_SEND_FBIT, &chan->conn_state);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005701
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005702 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
Mat Martineaue31f7632012-05-17 20:53:41 -07005703 control.super = L2CAP_SUPER_RNR;
5704 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005705 }
5706
Mat Martineaue31f7632012-05-17 20:53:41 -07005707 if (test_and_clear_bit(CONN_REMOTE_BUSY, &chan->conn_state) &&
5708 chan->unacked_frames > 0)
5709 __set_retrans_timer(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005710
Mat Martineaue31f7632012-05-17 20:53:41 -07005711 /* Send pending iframes */
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03005712 l2cap_ertm_send(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005713
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005714 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
Mat Martineaue31f7632012-05-17 20:53:41 -07005715 test_bit(CONN_SEND_FBIT, &chan->conn_state)) {
5716 /* F-bit wasn't sent in an s-frame or i-frame yet, so
5717 * send it now.
5718 */
5719 control.super = L2CAP_SUPER_RR;
5720 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005721 }
5722}
5723
Gustavo Padovan2d792812012-10-06 10:07:01 +01005724static void append_skb_frag(struct sk_buff *skb, struct sk_buff *new_frag,
5725 struct sk_buff **last_frag)
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005726{
Mat Martineau84084a32011-07-22 14:54:00 -07005727 /* skb->len reflects data in skb as well as all fragments
5728 * skb->data_len reflects only data in fragments
5729 */
5730 if (!skb_has_frag_list(skb))
5731 skb_shinfo(skb)->frag_list = new_frag;
5732
5733 new_frag->next = NULL;
5734
5735 (*last_frag)->next = new_frag;
5736 *last_frag = new_frag;
5737
5738 skb->len += new_frag->len;
5739 skb->data_len += new_frag->len;
5740 skb->truesize += new_frag->truesize;
5741}
5742
Mat Martineau4b51dae92012-05-17 20:53:37 -07005743static int l2cap_reassemble_sdu(struct l2cap_chan *chan, struct sk_buff *skb,
5744 struct l2cap_ctrl *control)
Mat Martineau84084a32011-07-22 14:54:00 -07005745{
5746 int err = -EINVAL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005747
Mat Martineau4b51dae92012-05-17 20:53:37 -07005748 switch (control->sar) {
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005749 case L2CAP_SAR_UNSEGMENTED:
Mat Martineau84084a32011-07-22 14:54:00 -07005750 if (chan->sdu)
5751 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005752
Gustavo Padovan80b98022012-05-27 22:27:51 -03005753 err = chan->ops->recv(chan, skb);
Mat Martineau84084a32011-07-22 14:54:00 -07005754 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005755
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005756 case L2CAP_SAR_START:
Mat Martineau84084a32011-07-22 14:54:00 -07005757 if (chan->sdu)
5758 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005759
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005760 chan->sdu_len = get_unaligned_le16(skb->data);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005761 skb_pull(skb, L2CAP_SDULEN_SIZE);
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005762
Mat Martineau84084a32011-07-22 14:54:00 -07005763 if (chan->sdu_len > chan->imtu) {
5764 err = -EMSGSIZE;
5765 break;
5766 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005767
Mat Martineau84084a32011-07-22 14:54:00 -07005768 if (skb->len >= chan->sdu_len)
5769 break;
5770
5771 chan->sdu = skb;
5772 chan->sdu_last_frag = skb;
5773
5774 skb = NULL;
5775 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005776 break;
5777
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005778 case L2CAP_SAR_CONTINUE:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005779 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005780 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005781
Mat Martineau84084a32011-07-22 14:54:00 -07005782 append_skb_frag(chan->sdu, skb,
5783 &chan->sdu_last_frag);
5784 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005785
Mat Martineau84084a32011-07-22 14:54:00 -07005786 if (chan->sdu->len >= chan->sdu_len)
5787 break;
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005788
Mat Martineau84084a32011-07-22 14:54:00 -07005789 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005790 break;
5791
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005792 case L2CAP_SAR_END:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005793 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005794 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005795
Mat Martineau84084a32011-07-22 14:54:00 -07005796 append_skb_frag(chan->sdu, skb,
5797 &chan->sdu_last_frag);
5798 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005799
Mat Martineau84084a32011-07-22 14:54:00 -07005800 if (chan->sdu->len != chan->sdu_len)
5801 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005802
Gustavo Padovan80b98022012-05-27 22:27:51 -03005803 err = chan->ops->recv(chan, chan->sdu);
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005804
Mat Martineau84084a32011-07-22 14:54:00 -07005805 if (!err) {
5806 /* Reassembly complete */
5807 chan->sdu = NULL;
5808 chan->sdu_last_frag = NULL;
5809 chan->sdu_len = 0;
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005810 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005811 break;
5812 }
5813
Mat Martineau84084a32011-07-22 14:54:00 -07005814 if (err) {
5815 kfree_skb(skb);
5816 kfree_skb(chan->sdu);
5817 chan->sdu = NULL;
5818 chan->sdu_last_frag = NULL;
5819 chan->sdu_len = 0;
5820 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005821
Mat Martineau84084a32011-07-22 14:54:00 -07005822 return err;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005823}
5824
Mat Martineau32b32732012-10-23 15:24:11 -07005825static int l2cap_resegment(struct l2cap_chan *chan)
5826{
5827 /* Placeholder */
5828 return 0;
5829}
5830
Mat Martineaue3281402011-07-07 09:39:02 -07005831void l2cap_chan_busy(struct l2cap_chan *chan, int busy)
Gustavo F. Padovan712132eb2010-06-21 19:39:50 -03005832{
Mat Martineau61aa4f52012-05-17 20:53:40 -07005833 u8 event;
5834
5835 if (chan->mode != L2CAP_MODE_ERTM)
5836 return;
5837
5838 event = busy ? L2CAP_EV_LOCAL_BUSY_DETECTED : L2CAP_EV_LOCAL_BUSY_CLEAR;
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03005839 l2cap_tx(chan, NULL, NULL, event);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005840}
5841
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005842static int l2cap_rx_queued_iframes(struct l2cap_chan *chan)
5843{
Mat Martineau63838722012-05-17 20:53:45 -07005844 int err = 0;
5845 /* Pass sequential frames to l2cap_reassemble_sdu()
5846 * until a gap is encountered.
5847 */
5848
5849 BT_DBG("chan %p", chan);
5850
5851 while (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
5852 struct sk_buff *skb;
5853 BT_DBG("Searching for skb with txseq %d (queue len %d)",
5854 chan->buffer_seq, skb_queue_len(&chan->srej_q));
5855
5856 skb = l2cap_ertm_seq_in_queue(&chan->srej_q, chan->buffer_seq);
5857
5858 if (!skb)
5859 break;
5860
5861 skb_unlink(skb, &chan->srej_q);
5862 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
5863 err = l2cap_reassemble_sdu(chan, skb, &bt_cb(skb)->control);
5864 if (err)
5865 break;
5866 }
5867
5868 if (skb_queue_empty(&chan->srej_q)) {
5869 chan->rx_state = L2CAP_RX_STATE_RECV;
5870 l2cap_send_ack(chan);
5871 }
5872
5873 return err;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005874}
5875
5876static void l2cap_handle_srej(struct l2cap_chan *chan,
5877 struct l2cap_ctrl *control)
5878{
Mat Martineauf80842a2012-05-17 20:53:46 -07005879 struct sk_buff *skb;
5880
5881 BT_DBG("chan %p, control %p", chan, control);
5882
5883 if (control->reqseq == chan->next_tx_seq) {
5884 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005885 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005886 return;
5887 }
5888
5889 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
5890
5891 if (skb == NULL) {
5892 BT_DBG("Seq %d not available for retransmission",
5893 control->reqseq);
5894 return;
5895 }
5896
5897 if (chan->max_tx != 0 && bt_cb(skb)->control.retries >= chan->max_tx) {
5898 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005899 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005900 return;
5901 }
5902
5903 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
5904
5905 if (control->poll) {
5906 l2cap_pass_to_tx(chan, control);
5907
5908 set_bit(CONN_SEND_FBIT, &chan->conn_state);
5909 l2cap_retransmit(chan, control);
5910 l2cap_ertm_send(chan);
5911
5912 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5913 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5914 chan->srej_save_reqseq = control->reqseq;
5915 }
5916 } else {
5917 l2cap_pass_to_tx_fbit(chan, control);
5918
5919 if (control->final) {
5920 if (chan->srej_save_reqseq != control->reqseq ||
5921 !test_and_clear_bit(CONN_SREJ_ACT,
5922 &chan->conn_state))
5923 l2cap_retransmit(chan, control);
5924 } else {
5925 l2cap_retransmit(chan, control);
5926 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5927 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5928 chan->srej_save_reqseq = control->reqseq;
5929 }
5930 }
5931 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005932}
5933
5934static void l2cap_handle_rej(struct l2cap_chan *chan,
5935 struct l2cap_ctrl *control)
5936{
Mat Martineaufcd289d2012-05-17 20:53:47 -07005937 struct sk_buff *skb;
5938
5939 BT_DBG("chan %p, control %p", chan, control);
5940
5941 if (control->reqseq == chan->next_tx_seq) {
5942 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005943 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07005944 return;
5945 }
5946
5947 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
5948
5949 if (chan->max_tx && skb &&
5950 bt_cb(skb)->control.retries >= chan->max_tx) {
5951 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005952 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07005953 return;
5954 }
5955
5956 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
5957
5958 l2cap_pass_to_tx(chan, control);
5959
5960 if (control->final) {
5961 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state))
5962 l2cap_retransmit_all(chan, control);
5963 } else {
5964 l2cap_retransmit_all(chan, control);
5965 l2cap_ertm_send(chan);
5966 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F)
5967 set_bit(CONN_REJ_ACT, &chan->conn_state);
5968 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005969}
5970
Mat Martineau4b51dae92012-05-17 20:53:37 -07005971static u8 l2cap_classify_txseq(struct l2cap_chan *chan, u16 txseq)
5972{
5973 BT_DBG("chan %p, txseq %d", chan, txseq);
5974
5975 BT_DBG("last_acked_seq %d, expected_tx_seq %d", chan->last_acked_seq,
5976 chan->expected_tx_seq);
5977
5978 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
5979 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
Gustavo Padovan2d792812012-10-06 10:07:01 +01005980 chan->tx_win) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07005981 /* See notes below regarding "double poll" and
5982 * invalid packets.
5983 */
5984 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
5985 BT_DBG("Invalid/Ignore - after SREJ");
5986 return L2CAP_TXSEQ_INVALID_IGNORE;
5987 } else {
5988 BT_DBG("Invalid - in window after SREJ sent");
5989 return L2CAP_TXSEQ_INVALID;
5990 }
5991 }
5992
5993 if (chan->srej_list.head == txseq) {
5994 BT_DBG("Expected SREJ");
5995 return L2CAP_TXSEQ_EXPECTED_SREJ;
5996 }
5997
5998 if (l2cap_ertm_seq_in_queue(&chan->srej_q, txseq)) {
5999 BT_DBG("Duplicate SREJ - txseq already stored");
6000 return L2CAP_TXSEQ_DUPLICATE_SREJ;
6001 }
6002
6003 if (l2cap_seq_list_contains(&chan->srej_list, txseq)) {
6004 BT_DBG("Unexpected SREJ - not requested");
6005 return L2CAP_TXSEQ_UNEXPECTED_SREJ;
6006 }
6007 }
6008
6009 if (chan->expected_tx_seq == txseq) {
6010 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
6011 chan->tx_win) {
6012 BT_DBG("Invalid - txseq outside tx window");
6013 return L2CAP_TXSEQ_INVALID;
6014 } else {
6015 BT_DBG("Expected");
6016 return L2CAP_TXSEQ_EXPECTED;
6017 }
6018 }
6019
6020 if (__seq_offset(chan, txseq, chan->last_acked_seq) <
Gustavo Padovan2d792812012-10-06 10:07:01 +01006021 __seq_offset(chan, chan->expected_tx_seq, chan->last_acked_seq)) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07006022 BT_DBG("Duplicate - expected_tx_seq later than txseq");
6023 return L2CAP_TXSEQ_DUPLICATE;
6024 }
6025
6026 if (__seq_offset(chan, txseq, chan->last_acked_seq) >= chan->tx_win) {
6027 /* A source of invalid packets is a "double poll" condition,
6028 * where delays cause us to send multiple poll packets. If
6029 * the remote stack receives and processes both polls,
6030 * sequence numbers can wrap around in such a way that a
6031 * resent frame has a sequence number that looks like new data
6032 * with a sequence gap. This would trigger an erroneous SREJ
6033 * request.
6034 *
6035 * Fortunately, this is impossible with a tx window that's
6036 * less than half of the maximum sequence number, which allows
6037 * invalid frames to be safely ignored.
6038 *
6039 * With tx window sizes greater than half of the tx window
6040 * maximum, the frame is invalid and cannot be ignored. This
6041 * causes a disconnect.
6042 */
6043
6044 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
6045 BT_DBG("Invalid/Ignore - txseq outside tx window");
6046 return L2CAP_TXSEQ_INVALID_IGNORE;
6047 } else {
6048 BT_DBG("Invalid - txseq outside tx window");
6049 return L2CAP_TXSEQ_INVALID;
6050 }
6051 } else {
6052 BT_DBG("Unexpected - txseq indicates missing frames");
6053 return L2CAP_TXSEQ_UNEXPECTED;
6054 }
6055}
6056
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006057static int l2cap_rx_state_recv(struct l2cap_chan *chan,
6058 struct l2cap_ctrl *control,
6059 struct sk_buff *skb, u8 event)
6060{
6061 int err = 0;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006062 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006063
6064 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6065 event);
6066
6067 switch (event) {
6068 case L2CAP_EV_RECV_IFRAME:
6069 switch (l2cap_classify_txseq(chan, control->txseq)) {
6070 case L2CAP_TXSEQ_EXPECTED:
6071 l2cap_pass_to_tx(chan, control);
6072
6073 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6074 BT_DBG("Busy, discarding expected seq %d",
6075 control->txseq);
6076 break;
6077 }
6078
6079 chan->expected_tx_seq = __next_seq(chan,
6080 control->txseq);
6081
6082 chan->buffer_seq = chan->expected_tx_seq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006083 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006084
6085 err = l2cap_reassemble_sdu(chan, skb, control);
6086 if (err)
6087 break;
6088
6089 if (control->final) {
6090 if (!test_and_clear_bit(CONN_REJ_ACT,
6091 &chan->conn_state)) {
6092 control->final = 0;
6093 l2cap_retransmit_all(chan, control);
6094 l2cap_ertm_send(chan);
6095 }
6096 }
6097
6098 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
6099 l2cap_send_ack(chan);
6100 break;
6101 case L2CAP_TXSEQ_UNEXPECTED:
6102 l2cap_pass_to_tx(chan, control);
6103
6104 /* Can't issue SREJ frames in the local busy state.
6105 * Drop this frame, it will be seen as missing
6106 * when local busy is exited.
6107 */
6108 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6109 BT_DBG("Busy, discarding unexpected seq %d",
6110 control->txseq);
6111 break;
6112 }
6113
6114 /* There was a gap in the sequence, so an SREJ
6115 * must be sent for each missing frame. The
6116 * current frame is stored for later use.
6117 */
6118 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006119 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006120 BT_DBG("Queued %p (queue len %d)", skb,
6121 skb_queue_len(&chan->srej_q));
6122
6123 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
6124 l2cap_seq_list_clear(&chan->srej_list);
6125 l2cap_send_srej(chan, control->txseq);
6126
6127 chan->rx_state = L2CAP_RX_STATE_SREJ_SENT;
6128 break;
6129 case L2CAP_TXSEQ_DUPLICATE:
6130 l2cap_pass_to_tx(chan, control);
6131 break;
6132 case L2CAP_TXSEQ_INVALID_IGNORE:
6133 break;
6134 case L2CAP_TXSEQ_INVALID:
6135 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006136 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006137 break;
6138 }
6139 break;
6140 case L2CAP_EV_RECV_RR:
6141 l2cap_pass_to_tx(chan, control);
6142 if (control->final) {
6143 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6144
Mat Martineaue6a3ee62012-10-23 15:24:22 -07006145 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state) &&
6146 !__chan_is_moving(chan)) {
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006147 control->final = 0;
6148 l2cap_retransmit_all(chan, control);
6149 }
6150
6151 l2cap_ertm_send(chan);
6152 } else if (control->poll) {
6153 l2cap_send_i_or_rr_or_rnr(chan);
6154 } else {
6155 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6156 &chan->conn_state) &&
6157 chan->unacked_frames)
6158 __set_retrans_timer(chan);
6159
6160 l2cap_ertm_send(chan);
6161 }
6162 break;
6163 case L2CAP_EV_RECV_RNR:
6164 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6165 l2cap_pass_to_tx(chan, control);
6166 if (control && control->poll) {
6167 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6168 l2cap_send_rr_or_rnr(chan, 0);
6169 }
6170 __clear_retrans_timer(chan);
6171 l2cap_seq_list_clear(&chan->retrans_list);
6172 break;
6173 case L2CAP_EV_RECV_REJ:
6174 l2cap_handle_rej(chan, control);
6175 break;
6176 case L2CAP_EV_RECV_SREJ:
6177 l2cap_handle_srej(chan, control);
6178 break;
6179 default:
6180 break;
6181 }
6182
6183 if (skb && !skb_in_use) {
6184 BT_DBG("Freeing %p", skb);
6185 kfree_skb(skb);
6186 }
6187
6188 return err;
6189}
6190
6191static int l2cap_rx_state_srej_sent(struct l2cap_chan *chan,
6192 struct l2cap_ctrl *control,
6193 struct sk_buff *skb, u8 event)
6194{
6195 int err = 0;
6196 u16 txseq = control->txseq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006197 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006198
6199 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6200 event);
6201
6202 switch (event) {
6203 case L2CAP_EV_RECV_IFRAME:
6204 switch (l2cap_classify_txseq(chan, txseq)) {
6205 case L2CAP_TXSEQ_EXPECTED:
6206 /* Keep frame for reassembly later */
6207 l2cap_pass_to_tx(chan, control);
6208 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006209 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006210 BT_DBG("Queued %p (queue len %d)", skb,
6211 skb_queue_len(&chan->srej_q));
6212
6213 chan->expected_tx_seq = __next_seq(chan, txseq);
6214 break;
6215 case L2CAP_TXSEQ_EXPECTED_SREJ:
6216 l2cap_seq_list_pop(&chan->srej_list);
6217
6218 l2cap_pass_to_tx(chan, control);
6219 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006220 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006221 BT_DBG("Queued %p (queue len %d)", skb,
6222 skb_queue_len(&chan->srej_q));
6223
6224 err = l2cap_rx_queued_iframes(chan);
6225 if (err)
6226 break;
6227
6228 break;
6229 case L2CAP_TXSEQ_UNEXPECTED:
6230 /* Got a frame that can't be reassembled yet.
6231 * Save it for later, and send SREJs to cover
6232 * the missing frames.
6233 */
6234 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006235 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006236 BT_DBG("Queued %p (queue len %d)", skb,
6237 skb_queue_len(&chan->srej_q));
6238
6239 l2cap_pass_to_tx(chan, control);
6240 l2cap_send_srej(chan, control->txseq);
6241 break;
6242 case L2CAP_TXSEQ_UNEXPECTED_SREJ:
6243 /* This frame was requested with an SREJ, but
6244 * some expected retransmitted frames are
6245 * missing. Request retransmission of missing
6246 * SREJ'd frames.
6247 */
6248 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006249 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006250 BT_DBG("Queued %p (queue len %d)", skb,
6251 skb_queue_len(&chan->srej_q));
6252
6253 l2cap_pass_to_tx(chan, control);
6254 l2cap_send_srej_list(chan, control->txseq);
6255 break;
6256 case L2CAP_TXSEQ_DUPLICATE_SREJ:
6257 /* We've already queued this frame. Drop this copy. */
6258 l2cap_pass_to_tx(chan, control);
6259 break;
6260 case L2CAP_TXSEQ_DUPLICATE:
6261 /* Expecting a later sequence number, so this frame
6262 * was already received. Ignore it completely.
6263 */
6264 break;
6265 case L2CAP_TXSEQ_INVALID_IGNORE:
6266 break;
6267 case L2CAP_TXSEQ_INVALID:
6268 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006269 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006270 break;
6271 }
6272 break;
6273 case L2CAP_EV_RECV_RR:
6274 l2cap_pass_to_tx(chan, control);
6275 if (control->final) {
6276 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6277
6278 if (!test_and_clear_bit(CONN_REJ_ACT,
6279 &chan->conn_state)) {
6280 control->final = 0;
6281 l2cap_retransmit_all(chan, control);
6282 }
6283
6284 l2cap_ertm_send(chan);
6285 } else if (control->poll) {
6286 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6287 &chan->conn_state) &&
6288 chan->unacked_frames) {
6289 __set_retrans_timer(chan);
6290 }
6291
6292 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6293 l2cap_send_srej_tail(chan);
6294 } else {
6295 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6296 &chan->conn_state) &&
6297 chan->unacked_frames)
6298 __set_retrans_timer(chan);
6299
6300 l2cap_send_ack(chan);
6301 }
6302 break;
6303 case L2CAP_EV_RECV_RNR:
6304 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6305 l2cap_pass_to_tx(chan, control);
6306 if (control->poll) {
6307 l2cap_send_srej_tail(chan);
6308 } else {
6309 struct l2cap_ctrl rr_control;
6310 memset(&rr_control, 0, sizeof(rr_control));
6311 rr_control.sframe = 1;
6312 rr_control.super = L2CAP_SUPER_RR;
6313 rr_control.reqseq = chan->buffer_seq;
6314 l2cap_send_sframe(chan, &rr_control);
6315 }
6316
6317 break;
6318 case L2CAP_EV_RECV_REJ:
6319 l2cap_handle_rej(chan, control);
6320 break;
6321 case L2CAP_EV_RECV_SREJ:
6322 l2cap_handle_srej(chan, control);
6323 break;
6324 }
6325
6326 if (skb && !skb_in_use) {
6327 BT_DBG("Freeing %p", skb);
6328 kfree_skb(skb);
6329 }
6330
6331 return err;
6332}
6333
Mat Martineau32b32732012-10-23 15:24:11 -07006334static int l2cap_finish_move(struct l2cap_chan *chan)
6335{
6336 BT_DBG("chan %p", chan);
6337
6338 chan->rx_state = L2CAP_RX_STATE_RECV;
6339
6340 if (chan->hs_hcon)
6341 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6342 else
6343 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6344
6345 return l2cap_resegment(chan);
6346}
6347
6348static int l2cap_rx_state_wait_p(struct l2cap_chan *chan,
6349 struct l2cap_ctrl *control,
6350 struct sk_buff *skb, u8 event)
6351{
6352 int err;
6353
6354 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6355 event);
6356
6357 if (!control->poll)
6358 return -EPROTO;
6359
6360 l2cap_process_reqseq(chan, control->reqseq);
6361
6362 if (!skb_queue_empty(&chan->tx_q))
6363 chan->tx_send_head = skb_peek(&chan->tx_q);
6364 else
6365 chan->tx_send_head = NULL;
6366
6367 /* Rewind next_tx_seq to the point expected
6368 * by the receiver.
6369 */
6370 chan->next_tx_seq = control->reqseq;
6371 chan->unacked_frames = 0;
6372
6373 err = l2cap_finish_move(chan);
6374 if (err)
6375 return err;
6376
6377 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6378 l2cap_send_i_or_rr_or_rnr(chan);
6379
6380 if (event == L2CAP_EV_RECV_IFRAME)
6381 return -EPROTO;
6382
6383 return l2cap_rx_state_recv(chan, control, NULL, event);
6384}
6385
6386static int l2cap_rx_state_wait_f(struct l2cap_chan *chan,
6387 struct l2cap_ctrl *control,
6388 struct sk_buff *skb, u8 event)
6389{
6390 int err;
6391
6392 if (!control->final)
6393 return -EPROTO;
6394
6395 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6396
6397 chan->rx_state = L2CAP_RX_STATE_RECV;
6398 l2cap_process_reqseq(chan, control->reqseq);
6399
6400 if (!skb_queue_empty(&chan->tx_q))
6401 chan->tx_send_head = skb_peek(&chan->tx_q);
6402 else
6403 chan->tx_send_head = NULL;
6404
6405 /* Rewind next_tx_seq to the point expected
6406 * by the receiver.
6407 */
6408 chan->next_tx_seq = control->reqseq;
6409 chan->unacked_frames = 0;
6410
6411 if (chan->hs_hcon)
6412 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6413 else
6414 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6415
6416 err = l2cap_resegment(chan);
6417
6418 if (!err)
6419 err = l2cap_rx_state_recv(chan, control, skb, event);
6420
6421 return err;
6422}
6423
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006424static bool __valid_reqseq(struct l2cap_chan *chan, u16 reqseq)
6425{
6426 /* Make sure reqseq is for a packet that has been sent but not acked */
6427 u16 unacked;
6428
6429 unacked = __seq_offset(chan, chan->next_tx_seq, chan->expected_ack_seq);
6430 return __seq_offset(chan, chan->next_tx_seq, reqseq) <= unacked;
6431}
6432
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006433static int l2cap_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6434 struct sk_buff *skb, u8 event)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006435{
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006436 int err = 0;
6437
6438 BT_DBG("chan %p, control %p, skb %p, event %d, state %d", chan,
6439 control, skb, event, chan->rx_state);
6440
6441 if (__valid_reqseq(chan, control->reqseq)) {
6442 switch (chan->rx_state) {
6443 case L2CAP_RX_STATE_RECV:
6444 err = l2cap_rx_state_recv(chan, control, skb, event);
6445 break;
6446 case L2CAP_RX_STATE_SREJ_SENT:
6447 err = l2cap_rx_state_srej_sent(chan, control, skb,
6448 event);
6449 break;
Mat Martineau32b32732012-10-23 15:24:11 -07006450 case L2CAP_RX_STATE_WAIT_P:
6451 err = l2cap_rx_state_wait_p(chan, control, skb, event);
6452 break;
6453 case L2CAP_RX_STATE_WAIT_F:
6454 err = l2cap_rx_state_wait_f(chan, control, skb, event);
6455 break;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006456 default:
6457 /* shut it down */
6458 break;
6459 }
6460 } else {
6461 BT_DBG("Invalid reqseq %d (next_tx_seq %d, expected_ack_seq %d",
6462 control->reqseq, chan->next_tx_seq,
6463 chan->expected_ack_seq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006464 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006465 }
6466
6467 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006468}
6469
6470static int l2cap_stream_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6471 struct sk_buff *skb)
6472{
Mat Martineau4b51dae92012-05-17 20:53:37 -07006473 int err = 0;
6474
6475 BT_DBG("chan %p, control %p, skb %p, state %d", chan, control, skb,
6476 chan->rx_state);
6477
6478 if (l2cap_classify_txseq(chan, control->txseq) ==
6479 L2CAP_TXSEQ_EXPECTED) {
6480 l2cap_pass_to_tx(chan, control);
6481
6482 BT_DBG("buffer_seq %d->%d", chan->buffer_seq,
6483 __next_seq(chan, chan->buffer_seq));
6484
6485 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
6486
6487 l2cap_reassemble_sdu(chan, skb, control);
6488 } else {
6489 if (chan->sdu) {
6490 kfree_skb(chan->sdu);
6491 chan->sdu = NULL;
6492 }
6493 chan->sdu_last_frag = NULL;
6494 chan->sdu_len = 0;
6495
6496 if (skb) {
6497 BT_DBG("Freeing %p", skb);
6498 kfree_skb(skb);
6499 }
6500 }
6501
6502 chan->last_acked_seq = control->txseq;
6503 chan->expected_tx_seq = __next_seq(chan, control->txseq);
6504
6505 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006506}
6507
6508static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6509{
6510 struct l2cap_ctrl *control = &bt_cb(skb)->control;
6511 u16 len;
6512 u8 event;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006513
Mat Martineaub76bbd62012-04-11 10:48:43 -07006514 __unpack_control(chan, skb);
6515
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006516 len = skb->len;
6517
6518 /*
6519 * We can just drop the corrupted I-frame here.
6520 * Receiver will miss it and start proper recovery
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006521 * procedures and ask for retransmission.
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006522 */
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006523 if (l2cap_check_fcs(chan, skb))
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006524 goto drop;
6525
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006526 if (!control->sframe && control->sar == L2CAP_SAR_START)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006527 len -= L2CAP_SDULEN_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006528
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006529 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006530 len -= L2CAP_FCS_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006531
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006532 if (len > chan->mps) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006533 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006534 goto drop;
6535 }
6536
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006537 if (!control->sframe) {
6538 int err;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006539
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006540 BT_DBG("iframe sar %d, reqseq %d, final %d, txseq %d",
6541 control->sar, control->reqseq, control->final,
6542 control->txseq);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03006543
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006544 /* Validate F-bit - F=0 always valid, F=1 only
6545 * valid in TX WAIT_F
6546 */
6547 if (control->final && chan->tx_state != L2CAP_TX_STATE_WAIT_F)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006548 goto drop;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006549
6550 if (chan->mode != L2CAP_MODE_STREAMING) {
6551 event = L2CAP_EV_RECV_IFRAME;
6552 err = l2cap_rx(chan, control, skb, event);
6553 } else {
6554 err = l2cap_stream_rx(chan, control, skb);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006555 }
6556
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006557 if (err)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006558 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006559 } else {
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006560 const u8 rx_func_to_event[4] = {
6561 L2CAP_EV_RECV_RR, L2CAP_EV_RECV_REJ,
6562 L2CAP_EV_RECV_RNR, L2CAP_EV_RECV_SREJ
6563 };
6564
6565 /* Only I-frames are expected in streaming mode */
6566 if (chan->mode == L2CAP_MODE_STREAMING)
6567 goto drop;
6568
6569 BT_DBG("sframe reqseq %d, final %d, poll %d, super %d",
6570 control->reqseq, control->final, control->poll,
6571 control->super);
6572
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006573 if (len != 0) {
Andrei Emeltchenko1bb166e2012-11-20 17:16:21 +02006574 BT_ERR("Trailing bytes: %d in sframe", len);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006575 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006576 goto drop;
6577 }
6578
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006579 /* Validate F and P bits */
6580 if (control->final && (control->poll ||
6581 chan->tx_state != L2CAP_TX_STATE_WAIT_F))
6582 goto drop;
6583
6584 event = rx_func_to_event[control->super];
6585 if (l2cap_rx(chan, control, skb, event))
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006586 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006587 }
6588
6589 return 0;
6590
6591drop:
6592 kfree_skb(skb);
6593 return 0;
6594}
6595
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006596static void l2cap_chan_le_send_credits(struct l2cap_chan *chan)
6597{
6598 struct l2cap_conn *conn = chan->conn;
6599 struct l2cap_le_credits pkt;
6600 u16 return_credits;
6601
6602 /* We return more credits to the sender only after the amount of
6603 * credits falls below half of the initial amount.
6604 */
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02006605 if (chan->rx_credits >= (le_max_credits + 1) / 2)
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006606 return;
6607
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02006608 return_credits = le_max_credits - chan->rx_credits;
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006609
6610 BT_DBG("chan %p returning %u credits to sender", chan, return_credits);
6611
6612 chan->rx_credits += return_credits;
6613
6614 pkt.cid = cpu_to_le16(chan->scid);
6615 pkt.credits = cpu_to_le16(return_credits);
6616
6617 chan->ident = l2cap_get_ident(conn);
6618
6619 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CREDITS, sizeof(pkt), &pkt);
6620}
6621
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006622static int l2cap_le_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6623{
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006624 int err;
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006625
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006626 if (!chan->rx_credits) {
6627 BT_ERR("No credits to receive LE L2CAP data");
Johan Hedbergdfd97742014-01-27 15:11:34 -08006628 l2cap_send_disconn_req(chan, ECONNRESET);
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006629 return -ENOBUFS;
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006630 }
6631
6632 if (chan->imtu < skb->len) {
6633 BT_ERR("Too big LE L2CAP PDU");
6634 return -ENOBUFS;
6635 }
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006636
6637 chan->rx_credits--;
6638 BT_DBG("rx_credits %u -> %u", chan->rx_credits + 1, chan->rx_credits);
6639
6640 l2cap_chan_le_send_credits(chan);
6641
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006642 err = 0;
6643
6644 if (!chan->sdu) {
6645 u16 sdu_len;
6646
6647 sdu_len = get_unaligned_le16(skb->data);
6648 skb_pull(skb, L2CAP_SDULEN_SIZE);
6649
6650 BT_DBG("Start of new SDU. sdu_len %u skb->len %u imtu %u",
6651 sdu_len, skb->len, chan->imtu);
6652
6653 if (sdu_len > chan->imtu) {
6654 BT_ERR("Too big LE L2CAP SDU length received");
6655 err = -EMSGSIZE;
6656 goto failed;
6657 }
6658
6659 if (skb->len > sdu_len) {
6660 BT_ERR("Too much LE L2CAP data received");
6661 err = -EINVAL;
6662 goto failed;
6663 }
6664
6665 if (skb->len == sdu_len)
6666 return chan->ops->recv(chan, skb);
6667
6668 chan->sdu = skb;
6669 chan->sdu_len = sdu_len;
6670 chan->sdu_last_frag = skb;
6671
6672 return 0;
6673 }
6674
6675 BT_DBG("SDU fragment. chan->sdu->len %u skb->len %u chan->sdu_len %u",
6676 chan->sdu->len, skb->len, chan->sdu_len);
6677
6678 if (chan->sdu->len + skb->len > chan->sdu_len) {
6679 BT_ERR("Too much LE L2CAP data received");
6680 err = -EINVAL;
6681 goto failed;
6682 }
6683
6684 append_skb_frag(chan->sdu, skb, &chan->sdu_last_frag);
6685 skb = NULL;
6686
6687 if (chan->sdu->len == chan->sdu_len) {
6688 err = chan->ops->recv(chan, chan->sdu);
6689 if (!err) {
6690 chan->sdu = NULL;
6691 chan->sdu_last_frag = NULL;
6692 chan->sdu_len = 0;
6693 }
6694 }
6695
6696failed:
6697 if (err) {
6698 kfree_skb(skb);
6699 kfree_skb(chan->sdu);
6700 chan->sdu = NULL;
6701 chan->sdu_last_frag = NULL;
6702 chan->sdu_len = 0;
6703 }
6704
6705 /* We can't return an error here since we took care of the skb
6706 * freeing internally. An error return would cause the caller to
6707 * do a double-free of the skb.
6708 */
6709 return 0;
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006710}
6711
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006712static void l2cap_data_channel(struct l2cap_conn *conn, u16 cid,
6713 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006714{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006715 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006716
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03006717 chan = l2cap_get_chan_by_scid(conn, cid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006718 if (!chan) {
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006719 if (cid == L2CAP_CID_A2MP) {
6720 chan = a2mp_channel_create(conn, skb);
6721 if (!chan) {
6722 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006723 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006724 }
6725
6726 l2cap_chan_lock(chan);
6727 } else {
6728 BT_DBG("unknown cid 0x%4.4x", cid);
6729 /* Drop packet and return */
6730 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006731 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006732 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006733 }
6734
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03006735 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006736
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03006737 if (chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006738 goto drop;
6739
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006740 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03006741 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006742 if (l2cap_le_data_rcv(chan, skb) < 0)
6743 goto drop;
6744
6745 goto done;
6746
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006747 case L2CAP_MODE_BASIC:
6748 /* If socket recv buffers overflows we drop data here
6749 * which is *bad* because L2CAP has to be reliable.
6750 * But we don't have any other choice. L2CAP doesn't
6751 * provide flow control mechanism. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07006752
Szymon Janc2c96e032014-02-18 20:48:34 +01006753 if (chan->imtu < skb->len) {
6754 BT_ERR("Dropping L2CAP data: receive buffer overflow");
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006755 goto drop;
Szymon Janc2c96e032014-02-18 20:48:34 +01006756 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006757
Gustavo Padovan80b98022012-05-27 22:27:51 -03006758 if (!chan->ops->recv(chan, skb))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006759 goto done;
6760 break;
6761
6762 case L2CAP_MODE_ERTM:
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006763 case L2CAP_MODE_STREAMING:
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006764 l2cap_data_rcv(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006765 goto done;
6766
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006767 default:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006768 BT_DBG("chan %p: bad mode 0x%2.2x", chan, chan->mode);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006769 break;
6770 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006771
6772drop:
6773 kfree_skb(skb);
6774
6775done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006776 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006777}
6778
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006779static void l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm,
6780 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006781{
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006782 struct hci_conn *hcon = conn->hcon;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006783 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006784
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006785 if (hcon->type != ACL_LINK)
Johan Hedberga24cce12014-08-07 22:56:42 +03006786 goto free_skb;
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006787
Johan Hedbergbf20fd42013-05-14 13:23:13 +03006788 chan = l2cap_global_chan_by_psm(0, psm, &hcon->src, &hcon->dst,
6789 ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006790 if (!chan)
Johan Hedberga24cce12014-08-07 22:56:42 +03006791 goto free_skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006792
Andrei Emeltchenko5b4ceda2012-02-24 16:35:32 +02006793 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006794
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03006795 if (chan->state != BT_BOUND && chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006796 goto drop;
6797
Vinicius Costa Gomese13e21d2011-06-17 22:46:27 -03006798 if (chan->imtu < skb->len)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006799 goto drop;
6800
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006801 /* Store remote BD_ADDR and PSM for msg_name */
Marcel Holtmann06ae3312013-10-18 03:43:00 -07006802 bacpy(&bt_cb(skb)->bdaddr, &hcon->dst);
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006803 bt_cb(skb)->psm = psm;
6804
Johan Hedberga24cce12014-08-07 22:56:42 +03006805 if (!chan->ops->recv(chan, skb)) {
6806 l2cap_chan_put(chan);
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006807 return;
Johan Hedberga24cce12014-08-07 22:56:42 +03006808 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006809
6810drop:
Johan Hedberga24cce12014-08-07 22:56:42 +03006811 l2cap_chan_put(chan);
6812free_skb:
Linus Torvalds1da177e2005-04-16 15:20:36 -07006813 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006814}
6815
6816static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb)
6817{
6818 struct l2cap_hdr *lh = (void *) skb->data;
Johan Hedberg61a939c2014-01-17 20:45:11 +02006819 struct hci_conn *hcon = conn->hcon;
Al Viro8e036fc2007-07-29 00:16:36 -07006820 u16 cid, len;
6821 __le16 psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006822
Johan Hedberg61a939c2014-01-17 20:45:11 +02006823 if (hcon->state != BT_CONNECTED) {
6824 BT_DBG("queueing pending rx skb");
6825 skb_queue_tail(&conn->pending_rx, skb);
6826 return;
6827 }
6828
Linus Torvalds1da177e2005-04-16 15:20:36 -07006829 skb_pull(skb, L2CAP_HDR_SIZE);
6830 cid = __le16_to_cpu(lh->cid);
6831 len = __le16_to_cpu(lh->len);
6832
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006833 if (len != skb->len) {
6834 kfree_skb(skb);
6835 return;
6836 }
6837
Johan Hedberg9e1d7e12014-07-06 11:03:36 +03006838 /* Since we can't actively block incoming LE connections we must
6839 * at least ensure that we ignore incoming data from them.
6840 */
6841 if (hcon->type == LE_LINK &&
Johan Hedbergdcc36c12014-07-09 12:59:13 +03006842 hci_bdaddr_list_lookup(&hcon->hdev->blacklist, &hcon->dst,
6843 bdaddr_type(hcon, hcon->dst_type))) {
Johan Hedberge4931502014-07-02 09:36:21 +03006844 kfree_skb(skb);
6845 return;
6846 }
6847
Linus Torvalds1da177e2005-04-16 15:20:36 -07006848 BT_DBG("len %d, cid 0x%4.4x", len, cid);
6849
6850 switch (cid) {
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006851 case L2CAP_CID_SIGNALING:
Linus Torvalds1da177e2005-04-16 15:20:36 -07006852 l2cap_sig_channel(conn, skb);
6853 break;
6854
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006855 case L2CAP_CID_CONN_LESS:
Andrei Emeltchenko097db762012-03-09 14:16:17 +02006856 psm = get_unaligned((__le16 *) skb->data);
Andrei Emeltchenko0181a702012-05-29 10:04:05 +03006857 skb_pull(skb, L2CAP_PSMLEN_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006858 l2cap_conless_channel(conn, psm, skb);
6859 break;
6860
Marcel Holtmanna2877622013-10-02 23:46:54 -07006861 case L2CAP_CID_LE_SIGNALING:
6862 l2cap_le_sig_channel(conn, skb);
6863 break;
6864
Anderson Brigliab501d6a2011-06-07 18:46:31 -03006865 case L2CAP_CID_SMP:
6866 if (smp_sig_channel(conn, skb))
6867 l2cap_conn_del(conn->hcon, EACCES);
6868 break;
6869
Linus Torvalds1da177e2005-04-16 15:20:36 -07006870 default:
6871 l2cap_data_channel(conn, cid, skb);
6872 break;
6873 }
6874}
6875
Johan Hedberg61a939c2014-01-17 20:45:11 +02006876static void process_pending_rx(struct work_struct *work)
6877{
6878 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
6879 pending_rx_work);
6880 struct sk_buff *skb;
6881
6882 BT_DBG("");
6883
6884 while ((skb = skb_dequeue(&conn->pending_rx)))
6885 l2cap_recv_frame(conn, skb);
6886}
6887
Johan Hedberg162b49e2014-01-17 20:45:10 +02006888static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon)
6889{
6890 struct l2cap_conn *conn = hcon->l2cap_data;
6891 struct hci_chan *hchan;
6892
6893 if (conn)
6894 return conn;
6895
6896 hchan = hci_chan_create(hcon);
6897 if (!hchan)
6898 return NULL;
6899
Johan Hedberg27f70f32014-07-21 10:50:06 +03006900 conn = kzalloc(sizeof(*conn), GFP_KERNEL);
Johan Hedberg162b49e2014-01-17 20:45:10 +02006901 if (!conn) {
6902 hci_chan_del(hchan);
6903 return NULL;
6904 }
6905
6906 kref_init(&conn->ref);
6907 hcon->l2cap_data = conn;
6908 conn->hcon = hcon;
6909 hci_conn_get(conn->hcon);
6910 conn->hchan = hchan;
6911
6912 BT_DBG("hcon %p conn %p hchan %p", hcon, conn, hchan);
6913
6914 switch (hcon->type) {
6915 case LE_LINK:
6916 if (hcon->hdev->le_mtu) {
6917 conn->mtu = hcon->hdev->le_mtu;
6918 break;
6919 }
6920 /* fall through */
6921 default:
6922 conn->mtu = hcon->hdev->acl_mtu;
6923 break;
6924 }
6925
6926 conn->feat_mask = 0;
6927
6928 if (hcon->type == ACL_LINK)
6929 conn->hs_enabled = test_bit(HCI_HS_ENABLED,
6930 &hcon->hdev->dev_flags);
6931
Marcel Holtmann5a54e7c2014-07-13 20:50:15 +02006932 mutex_init(&conn->ident_lock);
Johan Hedberg162b49e2014-01-17 20:45:10 +02006933 mutex_init(&conn->chan_lock);
6934
6935 INIT_LIST_HEAD(&conn->chan_l);
6936 INIT_LIST_HEAD(&conn->users);
6937
6938 if (hcon->type == LE_LINK)
6939 INIT_DELAYED_WORK(&conn->security_timer, security_timeout);
6940 else
6941 INIT_DELAYED_WORK(&conn->info_timer, l2cap_info_timeout);
6942
Johan Hedberg61a939c2014-01-17 20:45:11 +02006943 skb_queue_head_init(&conn->pending_rx);
6944 INIT_WORK(&conn->pending_rx_work, process_pending_rx);
6945
Johan Hedberg162b49e2014-01-17 20:45:10 +02006946 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
6947
6948 return conn;
6949}
6950
6951static bool is_valid_psm(u16 psm, u8 dst_type) {
6952 if (!psm)
6953 return false;
6954
6955 if (bdaddr_type_is_le(dst_type))
6956 return (psm <= 0x00ff);
6957
6958 /* PSM must be odd and lsb of upper byte must be 0 */
6959 return ((psm & 0x0101) == 0x0001);
6960}
6961
6962int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
6963 bdaddr_t *dst, u8 dst_type)
6964{
6965 struct l2cap_conn *conn;
6966 struct hci_conn *hcon;
6967 struct hci_dev *hdev;
Johan Hedberg162b49e2014-01-17 20:45:10 +02006968 int err;
6969
6970 BT_DBG("%pMR -> %pMR (type %u) psm 0x%2.2x", &chan->src, dst,
6971 dst_type, __le16_to_cpu(psm));
6972
6973 hdev = hci_get_route(dst, &chan->src);
6974 if (!hdev)
6975 return -EHOSTUNREACH;
6976
6977 hci_dev_lock(hdev);
6978
6979 l2cap_chan_lock(chan);
6980
6981 if (!is_valid_psm(__le16_to_cpu(psm), dst_type) && !cid &&
6982 chan->chan_type != L2CAP_CHAN_RAW) {
6983 err = -EINVAL;
6984 goto done;
6985 }
6986
Johan Hedberg21626e62014-01-24 10:35:41 +02006987 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED && !psm) {
6988 err = -EINVAL;
6989 goto done;
6990 }
6991
6992 if (chan->chan_type == L2CAP_CHAN_FIXED && !cid) {
Johan Hedberg162b49e2014-01-17 20:45:10 +02006993 err = -EINVAL;
6994 goto done;
6995 }
6996
6997 switch (chan->mode) {
6998 case L2CAP_MODE_BASIC:
6999 break;
7000 case L2CAP_MODE_LE_FLOWCTL:
7001 l2cap_le_flowctl_init(chan);
7002 break;
7003 case L2CAP_MODE_ERTM:
7004 case L2CAP_MODE_STREAMING:
7005 if (!disable_ertm)
7006 break;
7007 /* fall through */
7008 default:
Johan Hedbergbeb19e42014-07-18 11:15:26 +03007009 err = -EOPNOTSUPP;
Johan Hedberg162b49e2014-01-17 20:45:10 +02007010 goto done;
7011 }
7012
7013 switch (chan->state) {
7014 case BT_CONNECT:
7015 case BT_CONNECT2:
7016 case BT_CONFIG:
7017 /* Already connecting */
7018 err = 0;
7019 goto done;
7020
7021 case BT_CONNECTED:
7022 /* Already connected */
7023 err = -EISCONN;
7024 goto done;
7025
7026 case BT_OPEN:
7027 case BT_BOUND:
7028 /* Can connect */
7029 break;
7030
7031 default:
7032 err = -EBADFD;
7033 goto done;
7034 }
7035
7036 /* Set destination address and psm */
7037 bacpy(&chan->dst, dst);
7038 chan->dst_type = dst_type;
7039
7040 chan->psm = psm;
7041 chan->dcid = cid;
7042
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007043 if (bdaddr_type_is_le(dst_type)) {
Johan Hedberge804d252014-07-16 11:42:28 +03007044 u8 role;
Johan Hedbergcdd62752014-07-07 15:02:28 +03007045
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007046 /* Convert from L2CAP channel address type to HCI address type
7047 */
7048 if (dst_type == BDADDR_LE_PUBLIC)
7049 dst_type = ADDR_LE_DEV_PUBLIC;
7050 else
7051 dst_type = ADDR_LE_DEV_RANDOM;
7052
Johan Hedberge804d252014-07-16 11:42:28 +03007053 if (test_bit(HCI_ADVERTISING, &hdev->dev_flags))
7054 role = HCI_ROLE_SLAVE;
7055 else
7056 role = HCI_ROLE_MASTER;
Johan Hedbergcdd62752014-07-07 15:02:28 +03007057
Andre Guedes04a6c582014-02-26 20:21:44 -03007058 hcon = hci_connect_le(hdev, dst, dst_type, chan->sec_level,
Johan Hedberge804d252014-07-16 11:42:28 +03007059 HCI_LE_CONN_TIMEOUT, role);
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007060 } else {
Johan Hedbergd93375a2014-07-07 15:02:27 +03007061 u8 auth_type = l2cap_get_auth_type(chan);
Andre Guedes04a6c582014-02-26 20:21:44 -03007062 hcon = hci_connect_acl(hdev, dst, chan->sec_level, auth_type);
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007063 }
Johan Hedberg162b49e2014-01-17 20:45:10 +02007064
7065 if (IS_ERR(hcon)) {
7066 err = PTR_ERR(hcon);
7067 goto done;
7068 }
7069
7070 conn = l2cap_conn_add(hcon);
7071 if (!conn) {
7072 hci_conn_drop(hcon);
7073 err = -ENOMEM;
7074 goto done;
7075 }
7076
7077 if (cid && __l2cap_get_chan_by_dcid(conn, cid)) {
7078 hci_conn_drop(hcon);
7079 err = -EBUSY;
7080 goto done;
7081 }
7082
7083 /* Update source addr of the socket */
7084 bacpy(&chan->src, &hcon->src);
7085 chan->src_type = bdaddr_type(hcon, hcon->src_type);
7086
7087 l2cap_chan_unlock(chan);
7088 l2cap_chan_add(conn, chan);
7089 l2cap_chan_lock(chan);
7090
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. Padovan89bc500e2011-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
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03007294 if (hcon->type == LE_LINK) {
Hemant Gupta35d4adcc2012-04-18 14:46:26 +05307295 if (!status && encrypt)
Johan Hedberg4bd6d382014-02-26 23:33:45 +02007296 smp_distribute_keys(conn);
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02007297 cancel_delayed_work(&conn->security_timer);
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03007298 }
7299
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007300 mutex_lock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007301
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007302 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007303 l2cap_chan_lock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007304
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03007305 BT_DBG("chan %p scid 0x%4.4x state %s", chan, chan->scid,
7306 state_to_string(chan->state));
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007307
Johan Hedberg2338a7e2014-01-24 10:35:40 +02007308 if (chan->scid == L2CAP_CID_A2MP) {
Andrei Emeltchenko78eb2f92012-07-19 17:03:47 +03007309 l2cap_chan_unlock(chan);
7310 continue;
7311 }
7312
Johan Hedberg191eb392014-08-07 22:56:45 +03007313 if (!status && encrypt)
7314 chan->sec_level = hcon->sec_level;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007315
Andrei Emeltchenko96eff462012-11-15 18:14:53 +02007316 if (!__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007317 l2cap_chan_unlock(chan);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01007318 continue;
7319 }
7320
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007321 if (!status && (chan->state == BT_CONNECTED ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01007322 chan->state == BT_CONFIG)) {
Marcel Holtmannd97c8992013-10-14 02:53:54 -07007323 chan->ops->resume(chan);
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007324 l2cap_check_encryption(chan, encrypt);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007325 l2cap_chan_unlock(chan);
Marcel Holtmann9719f8a2008-07-14 20:13:45 +02007326 continue;
7327 }
7328
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007329 if (chan->state == BT_CONNECT) {
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007330 if (!status)
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03007331 l2cap_start_connection(chan);
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007332 else
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007333 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007334 } else if (chan->state == BT_CONNECT2) {
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007335 struct l2cap_conn_rsp rsp;
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007336 __u16 res, stat;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007337
7338 if (!status) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07007339 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007340 res = L2CAP_CR_PEND;
7341 stat = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08007342 chan->ops->defer(chan);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007343 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007344 l2cap_state_change(chan, BT_CONFIG);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007345 res = L2CAP_CR_SUCCESS;
7346 stat = L2CAP_CS_NO_INFO;
7347 }
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007348 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007349 l2cap_state_change(chan, BT_DISCONN);
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007350 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007351 res = L2CAP_CR_SEC_BLOCK;
7352 stat = L2CAP_CS_NO_INFO;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007353 }
7354
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03007355 rsp.scid = cpu_to_le16(chan->dcid);
7356 rsp.dcid = cpu_to_le16(chan->scid);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007357 rsp.result = cpu_to_le16(res);
7358 rsp.status = cpu_to_le16(stat);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03007359 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01007360 sizeof(rsp), &rsp);
Mat Martineau2d369352012-05-23 14:59:30 -07007361
7362 if (!test_bit(CONF_REQ_SENT, &chan->conf_state) &&
7363 res == L2CAP_CR_SUCCESS) {
7364 char buf[128];
7365 set_bit(CONF_REQ_SENT, &chan->conf_state);
7366 l2cap_send_cmd(conn, l2cap_get_ident(conn),
7367 L2CAP_CONF_REQ,
7368 l2cap_build_conf_req(chan, buf),
7369 buf);
7370 chan->num_conf_req++;
7371 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007372 }
7373
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007374 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007375 }
7376
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007377 mutex_unlock(&conn->chan_lock);
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007378
Linus Torvalds1da177e2005-04-16 15:20:36 -07007379 return 0;
7380}
7381
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007382int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007383{
7384 struct l2cap_conn *conn = hcon->l2cap_data;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007385 struct l2cap_hdr *hdr;
7386 int len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007387
Andrei Emeltchenko1d13a252012-10-15 11:58:41 +03007388 /* For AMP controller do not create l2cap conn */
7389 if (!conn && hcon->hdev->dev_type != HCI_BREDR)
7390 goto drop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007391
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007392 if (!conn)
Claudio Takahasibaf43252013-04-11 13:55:50 -03007393 conn = l2cap_conn_add(hcon);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007394
7395 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007396 goto drop;
7397
7398 BT_DBG("conn %p len %d flags 0x%x", conn, skb->len, flags);
7399
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007400 switch (flags) {
7401 case ACL_START:
7402 case ACL_START_NO_FLUSH:
7403 case ACL_COMPLETE:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007404 if (conn->rx_len) {
7405 BT_ERR("Unexpected start frame (len %d)", skb->len);
7406 kfree_skb(conn->rx_skb);
7407 conn->rx_skb = NULL;
7408 conn->rx_len = 0;
7409 l2cap_conn_unreliable(conn, ECOMM);
7410 }
7411
Andrei Emeltchenkoaae7fe22010-09-15 14:28:43 +03007412 /* Start fragment always begin with Basic L2CAP header */
7413 if (skb->len < L2CAP_HDR_SIZE) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07007414 BT_ERR("Frame is too short (len %d)", skb->len);
7415 l2cap_conn_unreliable(conn, ECOMM);
7416 goto drop;
7417 }
7418
7419 hdr = (struct l2cap_hdr *) skb->data;
7420 len = __le16_to_cpu(hdr->len) + L2CAP_HDR_SIZE;
7421
7422 if (len == skb->len) {
7423 /* Complete frame received */
7424 l2cap_recv_frame(conn, skb);
7425 return 0;
7426 }
7427
7428 BT_DBG("Start: total len %d, frag len %d", len, skb->len);
7429
7430 if (skb->len > len) {
7431 BT_ERR("Frame is too long (len %d, expected len %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007432 skb->len, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007433 l2cap_conn_unreliable(conn, ECOMM);
7434 goto drop;
7435 }
7436
7437 /* Allocate skb for the complete frame (with header) */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03007438 conn->rx_skb = bt_skb_alloc(len, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03007439 if (!conn->rx_skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007440 goto drop;
7441
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007442 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007443 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007444 conn->rx_len = len - skb->len;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007445 break;
7446
7447 case ACL_CONT:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007448 BT_DBG("Cont: frag len %d (expecting %d)", skb->len, conn->rx_len);
7449
7450 if (!conn->rx_len) {
7451 BT_ERR("Unexpected continuation frame (len %d)", skb->len);
7452 l2cap_conn_unreliable(conn, ECOMM);
7453 goto drop;
7454 }
7455
7456 if (skb->len > conn->rx_len) {
7457 BT_ERR("Fragment is too long (len %d, expected %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007458 skb->len, conn->rx_len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007459 kfree_skb(conn->rx_skb);
7460 conn->rx_skb = NULL;
7461 conn->rx_len = 0;
7462 l2cap_conn_unreliable(conn, ECOMM);
7463 goto drop;
7464 }
7465
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007466 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007467 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007468 conn->rx_len -= skb->len;
7469
7470 if (!conn->rx_len) {
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007471 /* Complete frame received. l2cap_recv_frame
7472 * takes ownership of the skb so set the global
7473 * rx_skb pointer to NULL first.
7474 */
7475 struct sk_buff *rx_skb = conn->rx_skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007476 conn->rx_skb = NULL;
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007477 l2cap_recv_frame(conn, rx_skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007478 }
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007479 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007480 }
7481
7482drop:
7483 kfree_skb(skb);
7484 return 0;
7485}
7486
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007487static int l2cap_debugfs_show(struct seq_file *f, void *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007488{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007489 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007490
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007491 read_lock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007492
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007493 list_for_each_entry(c, &chan_list, global_l) {
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03007494 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 -07007495 &c->src, &c->dst,
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03007496 c->state, __le16_to_cpu(c->psm),
7497 c->scid, c->dcid, c->imtu, c->omtu,
7498 c->sec_level, c->mode);
Andrei Emeltchenko61e1b4b2012-01-19 11:19:50 +02007499 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007500
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007501 read_unlock(&chan_list_lock);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007502
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007503 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007504}
7505
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007506static int l2cap_debugfs_open(struct inode *inode, struct file *file)
7507{
7508 return single_open(file, l2cap_debugfs_show, inode->i_private);
7509}
7510
7511static const struct file_operations l2cap_debugfs_fops = {
7512 .open = l2cap_debugfs_open,
7513 .read = seq_read,
7514 .llseek = seq_lseek,
7515 .release = single_release,
7516};
7517
7518static struct dentry *l2cap_debugfs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007519
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007520int __init l2cap_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007521{
7522 int err;
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007523
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007524 err = l2cap_init_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007525 if (err < 0)
7526 return err;
7527
Marcel Holtmann1120e4b2013-10-17 17:24:16 -07007528 if (IS_ERR_OR_NULL(bt_debugfs))
7529 return 0;
7530
7531 l2cap_debugfs = debugfs_create_file("l2cap", 0444, bt_debugfs,
7532 NULL, &l2cap_debugfs_fops);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007533
Samuel Ortiz40b93972014-05-14 17:53:35 +02007534 debugfs_create_u16("l2cap_le_max_credits", 0644, bt_debugfs,
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02007535 &le_max_credits);
Samuel Ortiz40b93972014-05-14 17:53:35 +02007536 debugfs_create_u16("l2cap_le_default_mps", 0644, bt_debugfs,
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02007537 &le_default_mps);
7538
Linus Torvalds1da177e2005-04-16 15:20:36 -07007539 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007540}
7541
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007542void l2cap_exit(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007543{
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007544 debugfs_remove(l2cap_debugfs);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007545 l2cap_cleanup_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007546}
7547
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03007548module_param(disable_ertm, bool, 0644);
7549MODULE_PARM_DESC(disable_ertm, "Disable enhanced retransmission mode");