blob: 2d550afe4322695fccb8314f0e253641b129c5b2 [file] [log] [blame]
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2000-2001 Qualcomm Incorporated
Gustavo F. Padovance5706b2010-07-13 11:57:11 -03004 Copyright (C) 2009-2010 Gustavo F. Padovan <gustavo@padovan.org>
Gustavo F. Padovan5d8868f2010-07-16 16:18:39 -03005 Copyright (C) 2010 Google Inc.
Gustavo F. Padovan590051d2011-12-18 13:39:33 -02006 Copyright (C) 2011 ProFUSION Embedded Systems
Mat Martineau422e9252012-04-27 16:50:55 -07007 Copyright (c) 2012 Code Aurora Forum. All rights reserved.
Linus Torvalds1da177e2005-04-16 15:20:36 -07008
9 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
10
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License version 2 as
13 published by the Free Software Foundation;
14
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
18 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090019 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
20 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
21 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
Linus Torvalds1da177e2005-04-16 15:20:36 -070022 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090024 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
25 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
Linus Torvalds1da177e2005-04-16 15:20:36 -070026 SOFTWARE IS DISCLAIMED.
27*/
28
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020029/* Bluetooth L2CAP core. */
Linus Torvalds1da177e2005-04-16 15:20:36 -070030
Linus Torvalds1da177e2005-04-16 15:20:36 -070031#include <linux/module.h>
32
Marcel Holtmannaef7d972010-03-21 05:27:45 +010033#include <linux/debugfs.h>
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -030034#include <linux/crc16.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070035
36#include <net/bluetooth/bluetooth.h>
37#include <net/bluetooth/hci_core.h>
38#include <net/bluetooth/l2cap.h>
Marcel Holtmann7ef9fbf2013-10-10 14:54:14 -070039
Marcel Holtmannac4b7232013-10-10 14:54:16 -070040#include "smp.h"
Marcel Holtmann70247282013-10-10 14:54:15 -070041#include "a2mp.h"
Marcel Holtmann7ef9fbf2013-10-10 14:54:14 -070042#include "amp.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070043
Johan Hedberg0f1bfe42014-01-27 15:11:35 -080044#define LE_FLOWCTL_MAX_CREDITS 65535
45
Mat Martineaud1de6d42012-05-17 20:53:55 -070046bool disable_ertm;
Marcel Holtmannf0709e02007-10-20 13:38:51 +020047
Marcel Holtmann547d1032013-10-12 08:18:19 -070048static u32 l2cap_feat_mask = L2CAP_FEAT_FIXED_CHAN | L2CAP_FEAT_UCD;
Marcel Holtmanna6801ca2014-07-11 06:03:08 +020049static u8 l2cap_fixed_chan[8] = { L2CAP_FC_SIG_BREDR | L2CAP_FC_CONNLESS, };
Linus Torvalds1da177e2005-04-16 15:20:36 -070050
Johannes Bergb5ad8b72011-06-01 08:54:45 +020051static LIST_HEAD(chan_list);
52static DEFINE_RWLOCK(chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -070053
Johan Hedbergf15b8ec2013-12-03 15:08:25 +020054static u16 le_max_credits = L2CAP_LE_MAX_CREDITS;
55static u16 le_default_mps = L2CAP_LE_DEFAULT_MPS;
56
Linus Torvalds1da177e2005-04-16 15:20:36 -070057static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +010058 u8 code, u8 ident, u16 dlen, void *data);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -030059static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len,
Gustavo Padovan2d792812012-10-06 10:07:01 +010060 void *data);
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -030061static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +020062static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err);
Linus Torvalds1da177e2005-04-16 15:20:36 -070063
Gustavo Padovand6603662012-05-21 13:58:22 -030064static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
Gustavo Padovan2d792812012-10-06 10:07:01 +010065 struct sk_buff_head *skbs, u8 event);
Mat Martineau608bcc62012-05-17 20:53:32 -070066
Marcel Holtmann4f1654e2013-10-13 08:50:41 -070067static inline __u8 bdaddr_type(struct hci_conn *hcon, __u8 type)
68{
69 if (hcon->type == LE_LINK) {
70 if (type == ADDR_LE_DEV_PUBLIC)
71 return BDADDR_LE_PUBLIC;
72 else
73 return BDADDR_LE_RANDOM;
74 }
75
76 return BDADDR_BREDR;
77}
78
Marcel Holtmann01394182006-07-03 10:02:46 +020079/* ---- L2CAP channels ---- */
Gustavo F. Padovan71ba0e52011-05-17 14:34:52 -030080
Gustavo Padovan2d792812012-10-06 10:07:01 +010081static struct l2cap_chan *__l2cap_get_chan_by_dcid(struct l2cap_conn *conn,
82 u16 cid)
Marcel Holtmann01394182006-07-03 10:02:46 +020083{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020084 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -030085
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020086 list_for_each_entry(c, &conn->chan_l, list) {
87 if (c->dcid == cid)
88 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +020089 }
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020090 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +020091}
92
Gustavo Padovan2d792812012-10-06 10:07:01 +010093static struct l2cap_chan *__l2cap_get_chan_by_scid(struct l2cap_conn *conn,
94 u16 cid)
Marcel Holtmann01394182006-07-03 10:02:46 +020095{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020096 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -030097
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020098 list_for_each_entry(c, &conn->chan_l, list) {
99 if (c->scid == cid)
100 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +0200101 }
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200102 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200103}
104
105/* Find channel with given SCID.
Mat Martineauef191ad2012-05-02 09:42:00 -0700106 * Returns locked channel. */
Gustavo Padovan2d792812012-10-06 10:07:01 +0100107static struct l2cap_chan *l2cap_get_chan_by_scid(struct l2cap_conn *conn,
108 u16 cid)
Marcel Holtmann01394182006-07-03 10:02:46 +0200109{
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300110 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300111
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200112 mutex_lock(&conn->chan_lock);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300113 c = __l2cap_get_chan_by_scid(conn, cid);
Mat Martineauef191ad2012-05-02 09:42:00 -0700114 if (c)
115 l2cap_chan_lock(c);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200116 mutex_unlock(&conn->chan_lock);
117
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300118 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +0200119}
120
Mat Martineaub1a130b2012-10-23 15:24:09 -0700121/* Find channel with given DCID.
122 * Returns locked channel.
123 */
124static struct l2cap_chan *l2cap_get_chan_by_dcid(struct l2cap_conn *conn,
125 u16 cid)
126{
127 struct l2cap_chan *c;
128
129 mutex_lock(&conn->chan_lock);
130 c = __l2cap_get_chan_by_dcid(conn, cid);
131 if (c)
132 l2cap_chan_lock(c);
133 mutex_unlock(&conn->chan_lock);
134
135 return c;
136}
137
Gustavo Padovan2d792812012-10-06 10:07:01 +0100138static struct l2cap_chan *__l2cap_get_chan_by_ident(struct l2cap_conn *conn,
139 u8 ident)
Marcel Holtmann01394182006-07-03 10:02:46 +0200140{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200141 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300142
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200143 list_for_each_entry(c, &conn->chan_l, list) {
144 if (c->ident == ident)
145 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +0200146 }
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200147 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200148}
149
Mat Martineau5b155ef2012-10-23 15:24:14 -0700150static struct l2cap_chan *l2cap_get_chan_by_ident(struct l2cap_conn *conn,
151 u8 ident)
152{
153 struct l2cap_chan *c;
154
155 mutex_lock(&conn->chan_lock);
156 c = __l2cap_get_chan_by_ident(conn, ident);
157 if (c)
158 l2cap_chan_lock(c);
159 mutex_unlock(&conn->chan_lock);
160
161 return c;
162}
163
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300164static struct l2cap_chan *__l2cap_global_chan_by_addr(__le16 psm, bdaddr_t *src)
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300165{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300166 struct l2cap_chan *c;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300167
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300168 list_for_each_entry(c, &chan_list, global_l) {
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700169 if (c->sport == psm && !bacmp(&c->src, src))
Szymon Janc250938c2011-11-16 09:32:22 +0100170 return c;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300171 }
Szymon Janc250938c2011-11-16 09:32:22 +0100172 return NULL;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300173}
174
175int l2cap_add_psm(struct l2cap_chan *chan, bdaddr_t *src, __le16 psm)
176{
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300177 int err;
178
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200179 write_lock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300180
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300181 if (psm && __l2cap_global_chan_by_addr(psm, src)) {
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300182 err = -EADDRINUSE;
183 goto done;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300184 }
185
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300186 if (psm) {
187 chan->psm = psm;
188 chan->sport = psm;
189 err = 0;
190 } else {
191 u16 p;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300192
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300193 err = -EINVAL;
194 for (p = 0x1001; p < 0x1100; p += 2)
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300195 if (!__l2cap_global_chan_by_addr(cpu_to_le16(p), src)) {
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300196 chan->psm = cpu_to_le16(p);
197 chan->sport = cpu_to_le16(p);
198 err = 0;
199 break;
200 }
201 }
202
203done:
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200204 write_unlock(&chan_list_lock);
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300205 return err;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300206}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300207EXPORT_SYMBOL_GPL(l2cap_add_psm);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300208
209int l2cap_add_scid(struct l2cap_chan *chan, __u16 scid)
210{
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200211 write_lock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300212
Johan Hedberg14824302014-08-07 22:56:50 +0300213 /* Override the defaults (which are for conn-oriented) */
214 chan->omtu = L2CAP_DEFAULT_MTU;
215 chan->chan_type = L2CAP_CHAN_FIXED;
216
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300217 chan->scid = scid;
218
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200219 write_unlock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300220
221 return 0;
222}
223
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300224static u16 l2cap_alloc_cid(struct l2cap_conn *conn)
Marcel Holtmann01394182006-07-03 10:02:46 +0200225{
Johan Hedberge77af752013-10-08 10:31:00 +0200226 u16 cid, dyn_end;
Marcel Holtmann01394182006-07-03 10:02:46 +0200227
Johan Hedberge77af752013-10-08 10:31:00 +0200228 if (conn->hcon->type == LE_LINK)
229 dyn_end = L2CAP_CID_LE_DYN_END;
230 else
231 dyn_end = L2CAP_CID_DYN_END;
232
233 for (cid = L2CAP_CID_DYN_START; cid < dyn_end; cid++) {
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300234 if (!__l2cap_get_chan_by_scid(conn, cid))
Marcel Holtmann01394182006-07-03 10:02:46 +0200235 return cid;
236 }
237
238 return 0;
239}
240
Gustavo Padovanf93fa272013-10-21 14:21:40 -0200241static void l2cap_state_change(struct l2cap_chan *chan, int state)
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300242{
Andrei Emeltchenko42d2d872012-02-17 11:40:57 +0200243 BT_DBG("chan %p %s -> %s", chan, state_to_string(chan->state),
Gustavo Padovan2d792812012-10-06 10:07:01 +0100244 state_to_string(state));
Gustavo F. Padovanbadaaa02011-11-23 20:11:46 -0200245
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300246 chan->state = state;
Gustavo Padovan53f52122013-10-15 19:24:45 -0300247 chan->ops->state_change(chan, state, 0);
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300248}
249
Gustavo Padovanf8e73012013-10-15 19:24:46 -0300250static inline void l2cap_state_change_and_error(struct l2cap_chan *chan,
251 int state, int err)
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +0200252{
Gustavo Padovanf8e73012013-10-15 19:24:46 -0300253 chan->state = state;
Gustavo Padovan53f52122013-10-15 19:24:45 -0300254 chan->ops->state_change(chan, chan->state, err);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +0200255}
256
257static inline void l2cap_chan_set_err(struct l2cap_chan *chan, int err)
258{
Gustavo Padovanf8e73012013-10-15 19:24:46 -0300259 chan->ops->state_change(chan, chan->state, err);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +0200260}
261
Mat Martineau4239d162012-05-17 20:53:49 -0700262static void __set_retrans_timer(struct l2cap_chan *chan)
263{
264 if (!delayed_work_pending(&chan->monitor_timer) &&
265 chan->retrans_timeout) {
266 l2cap_set_timer(chan, &chan->retrans_timer,
267 msecs_to_jiffies(chan->retrans_timeout));
268 }
269}
270
271static void __set_monitor_timer(struct l2cap_chan *chan)
272{
273 __clear_retrans_timer(chan);
274 if (chan->monitor_timeout) {
275 l2cap_set_timer(chan, &chan->monitor_timer,
276 msecs_to_jiffies(chan->monitor_timeout));
277 }
278}
279
Mat Martineau608bcc62012-05-17 20:53:32 -0700280static struct sk_buff *l2cap_ertm_seq_in_queue(struct sk_buff_head *head,
281 u16 seq)
282{
283 struct sk_buff *skb;
284
285 skb_queue_walk(head, skb) {
286 if (bt_cb(skb)->control.txseq == seq)
287 return skb;
288 }
289
290 return NULL;
291}
292
Mat Martineau3c588192012-04-11 10:48:42 -0700293/* ---- L2CAP sequence number lists ---- */
294
295/* For ERTM, ordered lists of sequence numbers must be tracked for
296 * SREJ requests that are received and for frames that are to be
297 * retransmitted. These seq_list functions implement a singly-linked
298 * list in an array, where membership in the list can also be checked
299 * in constant time. Items can also be added to the tail of the list
300 * and removed from the head in constant time, without further memory
301 * allocs or frees.
302 */
303
304static int l2cap_seq_list_init(struct l2cap_seq_list *seq_list, u16 size)
305{
306 size_t alloc_size, i;
307
308 /* Allocated size is a power of 2 to map sequence numbers
309 * (which may be up to 14 bits) in to a smaller array that is
310 * sized for the negotiated ERTM transmit windows.
311 */
312 alloc_size = roundup_pow_of_two(size);
313
314 seq_list->list = kmalloc(sizeof(u16) * alloc_size, GFP_KERNEL);
315 if (!seq_list->list)
316 return -ENOMEM;
317
318 seq_list->mask = alloc_size - 1;
319 seq_list->head = L2CAP_SEQ_LIST_CLEAR;
320 seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
321 for (i = 0; i < alloc_size; i++)
322 seq_list->list[i] = L2CAP_SEQ_LIST_CLEAR;
323
324 return 0;
325}
326
327static inline void l2cap_seq_list_free(struct l2cap_seq_list *seq_list)
328{
329 kfree(seq_list->list);
330}
331
332static inline bool l2cap_seq_list_contains(struct l2cap_seq_list *seq_list,
333 u16 seq)
334{
335 /* Constant-time check for list membership */
336 return seq_list->list[seq & seq_list->mask] != L2CAP_SEQ_LIST_CLEAR;
337}
338
Mat Martineau3c588192012-04-11 10:48:42 -0700339static inline u16 l2cap_seq_list_pop(struct l2cap_seq_list *seq_list)
340{
Johan Hedberg03a0c5d2014-01-18 21:32:59 +0200341 u16 seq = seq_list->head;
342 u16 mask = seq_list->mask;
343
344 seq_list->head = seq_list->list[seq & mask];
345 seq_list->list[seq & mask] = L2CAP_SEQ_LIST_CLEAR;
346
347 if (seq_list->head == L2CAP_SEQ_LIST_TAIL) {
348 seq_list->head = L2CAP_SEQ_LIST_CLEAR;
349 seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
350 }
351
352 return seq;
Mat Martineau3c588192012-04-11 10:48:42 -0700353}
354
355static void l2cap_seq_list_clear(struct l2cap_seq_list *seq_list)
356{
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300357 u16 i;
Mat Martineau3c588192012-04-11 10:48:42 -0700358
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300359 if (seq_list->head == L2CAP_SEQ_LIST_CLEAR)
360 return;
361
362 for (i = 0; i <= seq_list->mask; i++)
363 seq_list->list[i] = L2CAP_SEQ_LIST_CLEAR;
364
365 seq_list->head = L2CAP_SEQ_LIST_CLEAR;
366 seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
Mat Martineau3c588192012-04-11 10:48:42 -0700367}
368
369static void l2cap_seq_list_append(struct l2cap_seq_list *seq_list, u16 seq)
370{
371 u16 mask = seq_list->mask;
372
373 /* All appends happen in constant time */
374
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300375 if (seq_list->list[seq & mask] != L2CAP_SEQ_LIST_CLEAR)
376 return;
Mat Martineau3c588192012-04-11 10:48:42 -0700377
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300378 if (seq_list->tail == L2CAP_SEQ_LIST_CLEAR)
379 seq_list->head = seq;
380 else
381 seq_list->list[seq_list->tail & mask] = seq;
382
383 seq_list->tail = seq;
384 seq_list->list[seq & mask] = L2CAP_SEQ_LIST_TAIL;
Mat Martineau3c588192012-04-11 10:48:42 -0700385}
386
Gustavo F. Padovan721c4182011-06-23 19:29:58 -0300387static void l2cap_chan_timeout(struct work_struct *work)
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300388{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -0300389 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100390 chan_timer.work);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200391 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300392 int reason;
393
Andrei Emeltchenkoe05dcc32012-02-17 11:40:56 +0200394 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300395
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200396 mutex_lock(&conn->chan_lock);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200397 l2cap_chan_lock(chan);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300398
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300399 if (chan->state == BT_CONNECTED || chan->state == BT_CONFIG)
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300400 reason = ECONNREFUSED;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300401 else if (chan->state == BT_CONNECT &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100402 chan->sec_level != BT_SECURITY_SDP)
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300403 reason = ECONNREFUSED;
404 else
405 reason = ETIMEDOUT;
406
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300407 l2cap_chan_close(chan, reason);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300408
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200409 l2cap_chan_unlock(chan);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300410
Gustavo Padovan80b98022012-05-27 22:27:51 -0300411 chan->ops->close(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200412 mutex_unlock(&conn->chan_lock);
413
Ulisses Furquim371fd832011-12-21 20:02:36 -0200414 l2cap_chan_put(chan);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300415}
416
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -0300417struct l2cap_chan *l2cap_chan_create(void)
Marcel Holtmann01394182006-07-03 10:02:46 +0200418{
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300419 struct l2cap_chan *chan;
Marcel Holtmann01394182006-07-03 10:02:46 +0200420
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300421 chan = kzalloc(sizeof(*chan), GFP_ATOMIC);
422 if (!chan)
423 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200424
Andrei Emeltchenkoc03b3552012-02-21 12:54:56 +0200425 mutex_init(&chan->lock);
426
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200427 write_lock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300428 list_add(&chan->global_l, &chan_list);
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200429 write_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300430
Gustavo F. Padovan721c4182011-06-23 19:29:58 -0300431 INIT_DELAYED_WORK(&chan->chan_timer, l2cap_chan_timeout);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300432
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300433 chan->state = BT_OPEN;
434
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530435 kref_init(&chan->kref);
Gustavo F. Padovan71ba0e52011-05-17 14:34:52 -0300436
Mat Martineau28270112012-05-17 21:14:09 -0700437 /* This flag is cleared in l2cap_chan_ready() */
438 set_bit(CONF_NOT_COMPLETE, &chan->conf_state);
439
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -0300440 BT_DBG("chan %p", chan);
Szymon Jancabc545b2011-11-03 16:05:44 +0100441
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300442 return chan;
Marcel Holtmann01394182006-07-03 10:02:46 +0200443}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300444EXPORT_SYMBOL_GPL(l2cap_chan_create);
Marcel Holtmann01394182006-07-03 10:02:46 +0200445
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530446static void l2cap_chan_destroy(struct kref *kref)
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300447{
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530448 struct l2cap_chan *chan = container_of(kref, struct l2cap_chan, kref);
449
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +0530450 BT_DBG("chan %p", chan);
451
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200452 write_lock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300453 list_del(&chan->global_l);
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200454 write_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300455
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +0530456 kfree(chan);
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300457}
458
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530459void l2cap_chan_hold(struct l2cap_chan *c)
460{
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530461 BT_DBG("chan %p orig refcnt %d", c, atomic_read(&c->kref.refcount));
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530462
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530463 kref_get(&c->kref);
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530464}
465
466void l2cap_chan_put(struct l2cap_chan *c)
467{
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530468 BT_DBG("chan %p orig refcnt %d", c, atomic_read(&c->kref.refcount));
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530469
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530470 kref_put(&c->kref, l2cap_chan_destroy);
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530471}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300472EXPORT_SYMBOL_GPL(l2cap_chan_put);
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530473
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300474void l2cap_chan_set_defaults(struct l2cap_chan *chan)
475{
476 chan->fcs = L2CAP_FCS_CRC16;
477 chan->max_tx = L2CAP_DEFAULT_MAX_TX;
478 chan->tx_win = L2CAP_DEFAULT_TX_WINDOW;
479 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
Jukka Rissanen6a5e8162014-05-28 14:43:04 +0300480 chan->remote_max_tx = chan->max_tx;
481 chan->remote_tx_win = chan->tx_win;
Mat Martineauc20f8e32012-07-10 05:47:07 -0700482 chan->ack_win = L2CAP_DEFAULT_TX_WINDOW;
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300483 chan->sec_level = BT_SECURITY_LOW;
Jukka Rissanen6a5e8162014-05-28 14:43:04 +0300484 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
485 chan->retrans_timeout = L2CAP_DEFAULT_RETRANS_TO;
486 chan->monitor_timeout = L2CAP_DEFAULT_MONITOR_TO;
487 chan->conf_state = 0;
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300488
489 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
490}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300491EXPORT_SYMBOL_GPL(l2cap_chan_set_defaults);
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300492
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200493static void l2cap_le_flowctl_init(struct l2cap_chan *chan)
Johan Hedberg38319712013-05-17 12:49:23 +0300494{
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200495 chan->sdu = NULL;
496 chan->sdu_last_frag = NULL;
497 chan->sdu_len = 0;
Johan Hedberg0cd75f72013-05-17 13:09:05 +0300498 chan->tx_credits = 0;
Johan Hedbergf15b8ec2013-12-03 15:08:25 +0200499 chan->rx_credits = le_max_credits;
Johan Hedbergd1d79412014-01-27 15:11:33 -0800500 chan->mps = min_t(u16, chan->imtu, le_default_mps);
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200501
502 skb_queue_head_init(&chan->tx_q);
Johan Hedberg38319712013-05-17 12:49:23 +0300503}
504
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +0300505void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
Marcel Holtmann01394182006-07-03 10:02:46 +0200506{
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -0300507 BT_DBG("conn %p, psm 0x%2.2x, dcid 0x%4.4x", conn,
Andrei Emeltchenko097db762012-03-09 14:16:17 +0200508 __le16_to_cpu(chan->psm), chan->dcid);
Marcel Holtmann01394182006-07-03 10:02:46 +0200509
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +0200510 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
Marcel Holtmann2950f212009-02-12 14:02:50 +0100511
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300512 chan->conn = conn;
Marcel Holtmann01394182006-07-03 10:02:46 +0200513
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200514 switch (chan->chan_type) {
515 case L2CAP_CHAN_CONN_ORIENTED:
Johan Hedberg21626e62014-01-24 10:35:41 +0200516 /* Alloc CID for connection-oriented socket */
517 chan->scid = l2cap_alloc_cid(conn);
518 if (conn->hcon->type == ACL_LINK)
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300519 chan->omtu = L2CAP_DEFAULT_MTU;
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200520 break;
521
522 case L2CAP_CHAN_CONN_LESS:
Marcel Holtmann01394182006-07-03 10:02:46 +0200523 /* Connectionless socket */
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300524 chan->scid = L2CAP_CID_CONN_LESS;
525 chan->dcid = L2CAP_CID_CONN_LESS;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300526 chan->omtu = L2CAP_DEFAULT_MTU;
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200527 break;
528
Johan Hedberg2338a7e2014-01-24 10:35:40 +0200529 case L2CAP_CHAN_FIXED:
530 /* Caller will set CID and CID specific MTU values */
Andrei Emeltchenko416fa752012-05-29 13:59:16 +0300531 break;
532
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200533 default:
Marcel Holtmann01394182006-07-03 10:02:46 +0200534 /* Raw socket can send/recv signalling messages only */
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300535 chan->scid = L2CAP_CID_SIGNALING;
536 chan->dcid = L2CAP_CID_SIGNALING;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300537 chan->omtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann01394182006-07-03 10:02:46 +0200538 }
539
Andrei Emeltchenko8f7975b2011-10-13 16:18:54 +0300540 chan->local_id = L2CAP_BESTEFFORT_ID;
541 chan->local_stype = L2CAP_SERV_BESTEFFORT;
542 chan->local_msdu = L2CAP_DEFAULT_MAX_SDU_SIZE;
543 chan->local_sdu_itime = L2CAP_DEFAULT_SDU_ITIME;
544 chan->local_acc_lat = L2CAP_DEFAULT_ACC_LAT;
Andrei Emeltchenko8936fa62012-10-08 11:14:41 +0300545 chan->local_flush_to = L2CAP_EFS_DEFAULT_FLUSH_TO;
Andrei Emeltchenko8f7975b2011-10-13 16:18:54 +0300546
Ulisses Furquim371fd832011-12-21 20:02:36 -0200547 l2cap_chan_hold(chan);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300548
Johan Hedbergc16900c2014-08-15 21:17:06 +0300549 /* Only keep a reference for fixed channels if they requested it */
550 if (chan->chan_type != L2CAP_CHAN_FIXED ||
551 test_bit(FLAG_HOLD_HCI_CONN, &chan->flags))
552 hci_conn_hold(conn->hcon);
Johan Hedberg5ee98912013-04-29 19:35:43 +0300553
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200554 list_add(&chan->list, &conn->chan_l);
Andrei Emeltchenko643162a2012-02-22 17:11:55 +0200555}
556
Andrei Emeltchenko466f8002012-05-29 13:59:01 +0300557void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
Andrei Emeltchenko643162a2012-02-22 17:11:55 +0200558{
559 mutex_lock(&conn->chan_lock);
560 __l2cap_chan_add(conn, chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200561 mutex_unlock(&conn->chan_lock);
Marcel Holtmann01394182006-07-03 10:02:46 +0200562}
563
Andrei Emeltchenko466f8002012-05-29 13:59:01 +0300564void l2cap_chan_del(struct l2cap_chan *chan, int err)
Marcel Holtmann01394182006-07-03 10:02:46 +0200565{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300566 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann01394182006-07-03 10:02:46 +0200567
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -0300568 __clear_chan_timer(chan);
Marcel Holtmann01394182006-07-03 10:02:46 +0200569
Gustavo F. Padovan49208c92011-04-04 15:59:54 -0300570 BT_DBG("chan %p, conn %p, err %d", chan, conn, err);
Marcel Holtmann01394182006-07-03 10:02:46 +0200571
Johan Hedberg72847ce2014-08-08 09:28:03 +0300572 chan->ops->teardown(chan, err);
573
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900574 if (conn) {
Andrei Emeltchenko56f60982012-10-15 11:58:44 +0300575 struct amp_mgr *mgr = conn->hcon->amp_mgr;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300576 /* Delete from channel list */
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200577 list_del(&chan->list);
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -0200578
Ulisses Furquim371fd832011-12-21 20:02:36 -0200579 l2cap_chan_put(chan);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300580
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300581 chan->conn = NULL;
Andrei Emeltchenko3cabbfd2012-05-31 11:01:37 +0300582
Johan Hedbergc16900c2014-08-15 21:17:06 +0300583 /* Reference was only held for non-fixed channels or
584 * fixed channels that explicitly requested it using the
585 * FLAG_HOLD_HCI_CONN flag.
586 */
587 if (chan->chan_type != L2CAP_CHAN_FIXED ||
588 test_bit(FLAG_HOLD_HCI_CONN, &chan->flags))
David Herrmann76a68ba2013-04-06 20:28:37 +0200589 hci_conn_drop(conn->hcon);
Andrei Emeltchenko56f60982012-10-15 11:58:44 +0300590
591 if (mgr && mgr->bredr_chan == chan)
592 mgr->bredr_chan = NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200593 }
594
Andrei Emeltchenko419e08c2012-10-31 15:46:34 +0200595 if (chan->hs_hchan) {
596 struct hci_chan *hs_hchan = chan->hs_hchan;
597
598 BT_DBG("chan %p disconnect hs_hchan %p", chan, hs_hchan);
599 amp_disconnect_logical_link(hs_hchan);
600 }
601
Mat Martineau28270112012-05-17 21:14:09 -0700602 if (test_bit(CONF_NOT_COMPLETE, &chan->conf_state))
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300603 return;
Gustavo F. Padovan2ead70b2011-04-01 15:13:36 -0300604
Gustavo Padovanee556f62012-05-18 20:22:38 -0300605 switch(chan->mode) {
606 case L2CAP_MODE_BASIC:
607 break;
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300608
Johan Hedberg38319712013-05-17 12:49:23 +0300609 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedberg177f8f22013-05-31 17:54:51 +0300610 skb_queue_purge(&chan->tx_q);
Johan Hedberg38319712013-05-17 12:49:23 +0300611 break;
612
Gustavo Padovanee556f62012-05-18 20:22:38 -0300613 case L2CAP_MODE_ERTM:
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -0300614 __clear_retrans_timer(chan);
615 __clear_monitor_timer(chan);
616 __clear_ack_timer(chan);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300617
Gustavo F. Padovanf1c67752011-03-25 20:36:10 -0300618 skb_queue_purge(&chan->srej_q);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300619
Mat Martineau3c588192012-04-11 10:48:42 -0700620 l2cap_seq_list_free(&chan->srej_list);
621 l2cap_seq_list_free(&chan->retrans_list);
Gustavo Padovanee556f62012-05-18 20:22:38 -0300622
623 /* fall through */
624
625 case L2CAP_MODE_STREAMING:
626 skb_queue_purge(&chan->tx_q);
627 break;
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300628 }
Gustavo Padovanee556f62012-05-18 20:22:38 -0300629
630 return;
Marcel Holtmann01394182006-07-03 10:02:46 +0200631}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300632EXPORT_SYMBOL_GPL(l2cap_chan_del);
Marcel Holtmann01394182006-07-03 10:02:46 +0200633
Johan Hedberg387a33e2014-02-18 21:41:33 +0200634void l2cap_conn_update_id_addr(struct hci_conn *hcon)
635{
636 struct l2cap_conn *conn = hcon->l2cap_data;
637 struct l2cap_chan *chan;
638
639 mutex_lock(&conn->chan_lock);
640
641 list_for_each_entry(chan, &conn->chan_l, list) {
642 l2cap_chan_lock(chan);
643 bacpy(&chan->dst, &hcon->dst);
644 chan->dst_type = bdaddr_type(hcon, hcon->dst_type);
645 l2cap_chan_unlock(chan);
646 }
647
648 mutex_unlock(&conn->chan_lock);
649}
650
Johan Hedberg27e2d4c2013-05-14 13:27:21 +0300651static void l2cap_chan_le_connect_reject(struct l2cap_chan *chan)
652{
653 struct l2cap_conn *conn = chan->conn;
654 struct l2cap_le_conn_rsp rsp;
655 u16 result;
656
657 if (test_bit(FLAG_DEFER_SETUP, &chan->flags))
658 result = L2CAP_CR_AUTHORIZATION;
659 else
660 result = L2CAP_CR_BAD_PSM;
661
662 l2cap_state_change(chan, BT_DISCONN);
663
664 rsp.dcid = cpu_to_le16(chan->scid);
665 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +0200666 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +0300667 rsp.credits = cpu_to_le16(chan->rx_credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +0300668 rsp.result = cpu_to_le16(result);
669
670 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp),
671 &rsp);
672}
673
Johan Hedberg791d60f2013-05-14 22:24:44 +0300674static void l2cap_chan_connect_reject(struct l2cap_chan *chan)
675{
676 struct l2cap_conn *conn = chan->conn;
677 struct l2cap_conn_rsp rsp;
678 u16 result;
679
680 if (test_bit(FLAG_DEFER_SETUP, &chan->flags))
681 result = L2CAP_CR_SEC_BLOCK;
682 else
683 result = L2CAP_CR_BAD_PSM;
684
685 l2cap_state_change(chan, BT_DISCONN);
686
687 rsp.scid = cpu_to_le16(chan->dcid);
688 rsp.dcid = cpu_to_le16(chan->scid);
689 rsp.result = cpu_to_le16(result);
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700690 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Johan Hedberg791d60f2013-05-14 22:24:44 +0300691
692 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, sizeof(rsp), &rsp);
693}
694
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300695void l2cap_chan_close(struct l2cap_chan *chan, int reason)
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300696{
697 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300698
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700699 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300700
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300701 switch (chan->state) {
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300702 case BT_LISTEN:
Gustavo Padovanb699ec02012-10-06 11:51:54 +0100703 chan->ops->teardown(chan, 0);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300704 break;
705
706 case BT_CONNECTED:
707 case BT_CONFIG:
Johan Hedberg7b25c9b2014-01-28 15:28:04 -0800708 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED) {
Gustavo Padovan8d836d72013-10-15 19:24:47 -0300709 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +0200710 l2cap_send_disconn_req(chan, reason);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300711 } else
712 l2cap_chan_del(chan, reason);
713 break;
714
715 case BT_CONNECT2:
Johan Hedberg791d60f2013-05-14 22:24:44 +0300716 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED) {
717 if (conn->hcon->type == ACL_LINK)
718 l2cap_chan_connect_reject(chan);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +0300719 else if (conn->hcon->type == LE_LINK)
720 l2cap_chan_le_connect_reject(chan);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300721 }
722
723 l2cap_chan_del(chan, reason);
724 break;
725
726 case BT_CONNECT:
727 case BT_DISCONN:
728 l2cap_chan_del(chan, reason);
729 break;
730
731 default:
Gustavo Padovanb699ec02012-10-06 11:51:54 +0100732 chan->ops->teardown(chan, 0);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300733 break;
734 }
735}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300736EXPORT_SYMBOL(l2cap_chan_close);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300737
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300738static inline u8 l2cap_get_auth_type(struct l2cap_chan *chan)
Johan Hedberg8556edd32011-01-19 12:06:50 +0530739{
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700740 switch (chan->chan_type) {
741 case L2CAP_CHAN_RAW:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300742 switch (chan->sec_level) {
Johan Hedberg8556edd32011-01-19 12:06:50 +0530743 case BT_SECURITY_HIGH:
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800744 case BT_SECURITY_FIPS:
Johan Hedberg8556edd32011-01-19 12:06:50 +0530745 return HCI_AT_DEDICATED_BONDING_MITM;
746 case BT_SECURITY_MEDIUM:
747 return HCI_AT_DEDICATED_BONDING;
748 default:
749 return HCI_AT_NO_BONDING;
750 }
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700751 break;
Marcel Holtmann3124b842013-10-12 07:19:32 -0700752 case L2CAP_CHAN_CONN_LESS:
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700753 if (chan->psm == cpu_to_le16(L2CAP_PSM_3DSP)) {
Marcel Holtmann3124b842013-10-12 07:19:32 -0700754 if (chan->sec_level == BT_SECURITY_LOW)
755 chan->sec_level = BT_SECURITY_SDP;
756 }
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800757 if (chan->sec_level == BT_SECURITY_HIGH ||
758 chan->sec_level == BT_SECURITY_FIPS)
Marcel Holtmann3124b842013-10-12 07:19:32 -0700759 return HCI_AT_NO_BONDING_MITM;
760 else
761 return HCI_AT_NO_BONDING;
762 break;
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700763 case L2CAP_CHAN_CONN_ORIENTED:
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700764 if (chan->psm == cpu_to_le16(L2CAP_PSM_SDP)) {
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700765 if (chan->sec_level == BT_SECURITY_LOW)
766 chan->sec_level = BT_SECURITY_SDP;
Johan Hedberg8556edd32011-01-19 12:06:50 +0530767
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800768 if (chan->sec_level == BT_SECURITY_HIGH ||
769 chan->sec_level == BT_SECURITY_FIPS)
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700770 return HCI_AT_NO_BONDING_MITM;
771 else
772 return HCI_AT_NO_BONDING;
773 }
774 /* fall through */
775 default:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300776 switch (chan->sec_level) {
Johan Hedberg8556edd32011-01-19 12:06:50 +0530777 case BT_SECURITY_HIGH:
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800778 case BT_SECURITY_FIPS:
Johan Hedberg8556edd32011-01-19 12:06:50 +0530779 return HCI_AT_GENERAL_BONDING_MITM;
780 case BT_SECURITY_MEDIUM:
781 return HCI_AT_GENERAL_BONDING;
782 default:
783 return HCI_AT_NO_BONDING;
784 }
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700785 break;
Johan Hedberg8556edd32011-01-19 12:06:50 +0530786 }
787}
788
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200789/* Service level security */
Johan Hedberge7cafc42014-07-17 15:35:38 +0300790int l2cap_chan_check_security(struct l2cap_chan *chan, bool initiator)
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200791{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300792 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100793 __u8 auth_type;
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200794
Johan Hedberga17de2f2013-05-14 13:25:37 +0300795 if (conn->hcon->type == LE_LINK)
796 return smp_conn_security(conn->hcon, chan->sec_level);
797
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300798 auth_type = l2cap_get_auth_type(chan);
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100799
Johan Hedberge7cafc42014-07-17 15:35:38 +0300800 return hci_conn_security(conn->hcon, chan->sec_level, auth_type,
801 initiator);
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200802}
803
Johannes Bergb5ad8b72011-06-01 08:54:45 +0200804static u8 l2cap_get_ident(struct l2cap_conn *conn)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200805{
806 u8 id;
807
808 /* Get next available identificator.
809 * 1 - 128 are used by kernel.
810 * 129 - 199 are reserved.
811 * 200 - 254 are used by utilities like l2ping, etc.
812 */
813
Marcel Holtmann5a54e7c2014-07-13 20:50:15 +0200814 mutex_lock(&conn->ident_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200815
816 if (++conn->tx_ident > 128)
817 conn->tx_ident = 1;
818
819 id = conn->tx_ident;
820
Marcel Holtmann5a54e7c2014-07-13 20:50:15 +0200821 mutex_unlock(&conn->ident_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200822
823 return id;
824}
825
Gustavo Padovan2d792812012-10-06 10:07:01 +0100826static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len,
827 void *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200828{
829 struct sk_buff *skb = l2cap_build_cmd(conn, code, ident, len, data);
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +0200830 u8 flags;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200831
832 BT_DBG("code 0x%2.2x", code);
833
834 if (!skb)
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -0300835 return;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200836
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +0200837 if (lmp_no_flush_capable(conn->hcon->hdev))
838 flags = ACL_START_NO_FLUSH;
839 else
840 flags = ACL_START;
841
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700842 bt_cb(skb)->force_active = BT_POWER_FORCE_ACTIVE_ON;
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +0200843 skb->priority = HCI_PRIO_MAX;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700844
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200845 hci_send_acl(conn->hchan, skb, flags);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200846}
847
Mat Martineau02b0fbb2012-10-23 15:24:10 -0700848static bool __chan_is_moving(struct l2cap_chan *chan)
849{
850 return chan->move_state != L2CAP_MOVE_STABLE &&
851 chan->move_state != L2CAP_MOVE_WAIT_PREPARE;
852}
853
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200854static void l2cap_do_send(struct l2cap_chan *chan, struct sk_buff *skb)
855{
856 struct hci_conn *hcon = chan->conn->hcon;
857 u16 flags;
858
859 BT_DBG("chan %p, skb %p len %d priority %u", chan, skb, skb->len,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100860 skb->priority);
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200861
Mat Martineaud5f8a752012-10-23 15:24:18 -0700862 if (chan->hs_hcon && !__chan_is_moving(chan)) {
863 if (chan->hs_hchan)
864 hci_send_acl(chan->hs_hchan, skb, ACL_COMPLETE);
865 else
866 kfree_skb(skb);
867
868 return;
869 }
870
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200871 if (!test_bit(FLAG_FLUSHABLE, &chan->flags) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100872 lmp_no_flush_capable(hcon->hdev))
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200873 flags = ACL_START_NO_FLUSH;
874 else
875 flags = ACL_START;
876
877 bt_cb(skb)->force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
878 hci_send_acl(chan->conn->hchan, skb, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700879}
880
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700881static void __unpack_enhanced_control(u16 enh, struct l2cap_ctrl *control)
882{
883 control->reqseq = (enh & L2CAP_CTRL_REQSEQ) >> L2CAP_CTRL_REQSEQ_SHIFT;
884 control->final = (enh & L2CAP_CTRL_FINAL) >> L2CAP_CTRL_FINAL_SHIFT;
885
886 if (enh & L2CAP_CTRL_FRAME_TYPE) {
887 /* S-Frame */
888 control->sframe = 1;
889 control->poll = (enh & L2CAP_CTRL_POLL) >> L2CAP_CTRL_POLL_SHIFT;
890 control->super = (enh & L2CAP_CTRL_SUPERVISE) >> L2CAP_CTRL_SUPER_SHIFT;
891
892 control->sar = 0;
893 control->txseq = 0;
894 } else {
895 /* I-Frame */
896 control->sframe = 0;
897 control->sar = (enh & L2CAP_CTRL_SAR) >> L2CAP_CTRL_SAR_SHIFT;
898 control->txseq = (enh & L2CAP_CTRL_TXSEQ) >> L2CAP_CTRL_TXSEQ_SHIFT;
899
900 control->poll = 0;
901 control->super = 0;
902 }
903}
904
905static void __unpack_extended_control(u32 ext, struct l2cap_ctrl *control)
906{
907 control->reqseq = (ext & L2CAP_EXT_CTRL_REQSEQ) >> L2CAP_EXT_CTRL_REQSEQ_SHIFT;
908 control->final = (ext & L2CAP_EXT_CTRL_FINAL) >> L2CAP_EXT_CTRL_FINAL_SHIFT;
909
910 if (ext & L2CAP_EXT_CTRL_FRAME_TYPE) {
911 /* S-Frame */
912 control->sframe = 1;
913 control->poll = (ext & L2CAP_EXT_CTRL_POLL) >> L2CAP_EXT_CTRL_POLL_SHIFT;
914 control->super = (ext & L2CAP_EXT_CTRL_SUPERVISE) >> L2CAP_EXT_CTRL_SUPER_SHIFT;
915
916 control->sar = 0;
917 control->txseq = 0;
918 } else {
919 /* I-Frame */
920 control->sframe = 0;
921 control->sar = (ext & L2CAP_EXT_CTRL_SAR) >> L2CAP_EXT_CTRL_SAR_SHIFT;
922 control->txseq = (ext & L2CAP_EXT_CTRL_TXSEQ) >> L2CAP_EXT_CTRL_TXSEQ_SHIFT;
923
924 control->poll = 0;
925 control->super = 0;
926 }
927}
928
929static inline void __unpack_control(struct l2cap_chan *chan,
930 struct sk_buff *skb)
931{
932 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
933 __unpack_extended_control(get_unaligned_le32(skb->data),
934 &bt_cb(skb)->control);
Mat Martineaucec8ab6e2012-05-17 20:53:36 -0700935 skb_pull(skb, L2CAP_EXT_CTRL_SIZE);
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700936 } else {
937 __unpack_enhanced_control(get_unaligned_le16(skb->data),
938 &bt_cb(skb)->control);
Mat Martineaucec8ab6e2012-05-17 20:53:36 -0700939 skb_pull(skb, L2CAP_ENH_CTRL_SIZE);
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700940 }
941}
942
943static u32 __pack_extended_control(struct l2cap_ctrl *control)
944{
945 u32 packed;
946
947 packed = control->reqseq << L2CAP_EXT_CTRL_REQSEQ_SHIFT;
948 packed |= control->final << L2CAP_EXT_CTRL_FINAL_SHIFT;
949
950 if (control->sframe) {
951 packed |= control->poll << L2CAP_EXT_CTRL_POLL_SHIFT;
952 packed |= control->super << L2CAP_EXT_CTRL_SUPER_SHIFT;
953 packed |= L2CAP_EXT_CTRL_FRAME_TYPE;
954 } else {
955 packed |= control->sar << L2CAP_EXT_CTRL_SAR_SHIFT;
956 packed |= control->txseq << L2CAP_EXT_CTRL_TXSEQ_SHIFT;
957 }
958
959 return packed;
960}
961
962static u16 __pack_enhanced_control(struct l2cap_ctrl *control)
963{
964 u16 packed;
965
966 packed = control->reqseq << L2CAP_CTRL_REQSEQ_SHIFT;
967 packed |= control->final << L2CAP_CTRL_FINAL_SHIFT;
968
969 if (control->sframe) {
970 packed |= control->poll << L2CAP_CTRL_POLL_SHIFT;
971 packed |= control->super << L2CAP_CTRL_SUPER_SHIFT;
972 packed |= L2CAP_CTRL_FRAME_TYPE;
973 } else {
974 packed |= control->sar << L2CAP_CTRL_SAR_SHIFT;
975 packed |= control->txseq << L2CAP_CTRL_TXSEQ_SHIFT;
976 }
977
978 return packed;
979}
980
981static inline void __pack_control(struct l2cap_chan *chan,
982 struct l2cap_ctrl *control,
983 struct sk_buff *skb)
984{
985 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
986 put_unaligned_le32(__pack_extended_control(control),
987 skb->data + L2CAP_HDR_SIZE);
988 } else {
989 put_unaligned_le16(__pack_enhanced_control(control),
990 skb->data + L2CAP_HDR_SIZE);
991 }
992}
993
Gustavo Padovanba7aa642012-05-29 13:29:16 -0300994static inline unsigned int __ertm_hdr_size(struct l2cap_chan *chan)
995{
996 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
997 return L2CAP_EXT_HDR_SIZE;
998 else
999 return L2CAP_ENH_HDR_SIZE;
1000}
1001
Mat Martineaua67d7f62012-05-17 20:53:35 -07001002static struct sk_buff *l2cap_create_sframe_pdu(struct l2cap_chan *chan,
1003 u32 control)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001004{
1005 struct sk_buff *skb;
1006 struct l2cap_hdr *lh;
Gustavo Padovanba7aa642012-05-29 13:29:16 -03001007 int hlen = __ertm_hdr_size(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001008
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001009 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03001010 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001011
Mat Martineaua67d7f62012-05-17 20:53:35 -07001012 skb = bt_skb_alloc(hlen, GFP_KERNEL);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001013
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001014 if (!skb)
Mat Martineaua67d7f62012-05-17 20:53:35 -07001015 return ERR_PTR(-ENOMEM);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001016
1017 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001018 lh->len = cpu_to_le16(hlen - L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001019 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03001020
Mat Martineaua67d7f62012-05-17 20:53:35 -07001021 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
1022 put_unaligned_le32(control, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
1023 else
1024 put_unaligned_le16(control, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001025
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001026 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineaua67d7f62012-05-17 20:53:35 -07001027 u16 fcs = crc16(0, (u8 *)skb->data, skb->len);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03001028 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001029 }
1030
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001031 skb->priority = HCI_PRIO_MAX;
Mat Martineaua67d7f62012-05-17 20:53:35 -07001032 return skb;
1033}
1034
1035static void l2cap_send_sframe(struct l2cap_chan *chan,
1036 struct l2cap_ctrl *control)
1037{
1038 struct sk_buff *skb;
1039 u32 control_field;
1040
1041 BT_DBG("chan %p, control %p", chan, control);
1042
1043 if (!control->sframe)
1044 return;
1045
Mat Martineaub99e13a2012-10-23 15:24:19 -07001046 if (__chan_is_moving(chan))
1047 return;
1048
Mat Martineaua67d7f62012-05-17 20:53:35 -07001049 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state) &&
1050 !control->poll)
1051 control->final = 1;
1052
1053 if (control->super == L2CAP_SUPER_RR)
1054 clear_bit(CONN_RNR_SENT, &chan->conn_state);
1055 else if (control->super == L2CAP_SUPER_RNR)
1056 set_bit(CONN_RNR_SENT, &chan->conn_state);
1057
1058 if (control->super != L2CAP_SUPER_SREJ) {
1059 chan->last_acked_seq = control->reqseq;
1060 __clear_ack_timer(chan);
1061 }
1062
1063 BT_DBG("reqseq %d, final %d, poll %d, super %d", control->reqseq,
1064 control->final, control->poll, control->super);
1065
1066 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
1067 control_field = __pack_extended_control(control);
1068 else
1069 control_field = __pack_enhanced_control(control);
1070
1071 skb = l2cap_create_sframe_pdu(chan, control_field);
1072 if (!IS_ERR(skb))
1073 l2cap_do_send(chan, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001074}
1075
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001076static void l2cap_send_rr_or_rnr(struct l2cap_chan *chan, bool poll)
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001077{
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001078 struct l2cap_ctrl control;
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001079
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001080 BT_DBG("chan %p, poll %d", chan, poll);
1081
1082 memset(&control, 0, sizeof(control));
1083 control.sframe = 1;
1084 control.poll = poll;
1085
1086 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
1087 control.super = L2CAP_SUPER_RNR;
1088 else
1089 control.super = L2CAP_SUPER_RR;
1090
1091 control.reqseq = chan->buffer_seq;
1092 l2cap_send_sframe(chan, &control);
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001093}
1094
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001095static inline int __l2cap_no_conn_pending(struct l2cap_chan *chan)
Andrei Emeltchenkoe501d052010-07-08 12:14:41 +03001096{
Johan Hedberg5ff6f342014-08-07 22:56:43 +03001097 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED)
1098 return true;
1099
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001100 return !test_bit(CONF_CONNECT_PEND, &chan->conf_state);
Andrei Emeltchenkoe501d052010-07-08 12:14:41 +03001101}
1102
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001103static bool __amp_capable(struct l2cap_chan *chan)
1104{
1105 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann1df7b172013-10-05 11:47:49 -07001106 struct hci_dev *hdev;
1107 bool amp_available = false;
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001108
Marcel Holtmann1df7b172013-10-05 11:47:49 -07001109 if (!conn->hs_enabled)
1110 return false;
1111
1112 if (!(conn->fixed_chan_mask & L2CAP_FC_A2MP))
1113 return false;
1114
1115 read_lock(&hci_dev_list_lock);
1116 list_for_each_entry(hdev, &hci_dev_list, list) {
1117 if (hdev->amp_type != AMP_TYPE_BREDR &&
1118 test_bit(HCI_UP, &hdev->flags)) {
1119 amp_available = true;
1120 break;
1121 }
1122 }
1123 read_unlock(&hci_dev_list_lock);
1124
1125 if (chan->chan_policy == BT_CHANNEL_POLICY_AMP_PREFERRED)
1126 return amp_available;
Marcel Holtmann848566b2013-10-01 22:59:22 -07001127
1128 return false;
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001129}
1130
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02001131static bool l2cap_check_efs(struct l2cap_chan *chan)
1132{
1133 /* Check EFS parameters */
1134 return true;
1135}
1136
Andrei Emeltchenko2766be42012-09-27 17:26:21 +03001137void l2cap_send_conn_req(struct l2cap_chan *chan)
Andrei Emeltchenko9b27f352012-02-24 16:00:00 +02001138{
1139 struct l2cap_conn *conn = chan->conn;
1140 struct l2cap_conn_req req;
1141
1142 req.scid = cpu_to_le16(chan->scid);
1143 req.psm = chan->psm;
1144
1145 chan->ident = l2cap_get_ident(conn);
1146
1147 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
1148
1149 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_REQ, sizeof(req), &req);
1150}
1151
Mat Martineau8eb200b2012-10-23 15:24:17 -07001152static void l2cap_send_create_chan_req(struct l2cap_chan *chan, u8 amp_id)
1153{
1154 struct l2cap_create_chan_req req;
1155 req.scid = cpu_to_le16(chan->scid);
1156 req.psm = chan->psm;
1157 req.amp_id = amp_id;
1158
1159 chan->ident = l2cap_get_ident(chan->conn);
1160
1161 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_REQ,
1162 sizeof(req), &req);
1163}
1164
Mat Martineau02b0fbb2012-10-23 15:24:10 -07001165static void l2cap_move_setup(struct l2cap_chan *chan)
1166{
1167 struct sk_buff *skb;
1168
1169 BT_DBG("chan %p", chan);
1170
1171 if (chan->mode != L2CAP_MODE_ERTM)
1172 return;
1173
1174 __clear_retrans_timer(chan);
1175 __clear_monitor_timer(chan);
1176 __clear_ack_timer(chan);
1177
1178 chan->retry_count = 0;
1179 skb_queue_walk(&chan->tx_q, skb) {
1180 if (bt_cb(skb)->control.retries)
1181 bt_cb(skb)->control.retries = 1;
1182 else
1183 break;
1184 }
1185
1186 chan->expected_tx_seq = chan->buffer_seq;
1187
1188 clear_bit(CONN_REJ_ACT, &chan->conn_state);
1189 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
1190 l2cap_seq_list_clear(&chan->retrans_list);
1191 l2cap_seq_list_clear(&chan->srej_list);
1192 skb_queue_purge(&chan->srej_q);
1193
1194 chan->tx_state = L2CAP_TX_STATE_XMIT;
1195 chan->rx_state = L2CAP_RX_STATE_MOVE;
1196
1197 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
1198}
1199
Mat Martineau5f3847a2012-10-23 15:24:12 -07001200static void l2cap_move_done(struct l2cap_chan *chan)
1201{
1202 u8 move_role = chan->move_role;
1203 BT_DBG("chan %p", chan);
1204
1205 chan->move_state = L2CAP_MOVE_STABLE;
1206 chan->move_role = L2CAP_MOVE_ROLE_NONE;
1207
1208 if (chan->mode != L2CAP_MODE_ERTM)
1209 return;
1210
1211 switch (move_role) {
1212 case L2CAP_MOVE_ROLE_INITIATOR:
1213 l2cap_tx(chan, NULL, NULL, L2CAP_EV_EXPLICIT_POLL);
1214 chan->rx_state = L2CAP_RX_STATE_WAIT_F;
1215 break;
1216 case L2CAP_MOVE_ROLE_RESPONDER:
1217 chan->rx_state = L2CAP_RX_STATE_WAIT_P;
1218 break;
1219 }
1220}
1221
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001222static void l2cap_chan_ready(struct l2cap_chan *chan)
1223{
Mat Martineau28270112012-05-17 21:14:09 -07001224 /* This clears all conf flags, including CONF_NOT_COMPLETE */
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001225 chan->conf_state = 0;
1226 __clear_chan_timer(chan);
1227
Johan Hedberg0ce43ce2013-12-05 14:55:33 +02001228 if (chan->mode == L2CAP_MODE_LE_FLOWCTL && !chan->tx_credits)
1229 chan->ops->suspend(chan);
Johan Hedberg177f8f22013-05-31 17:54:51 +03001230
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001231 chan->state = BT_CONNECTED;
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001232
Andrei Emeltchenkofd83e2c2012-05-30 09:55:32 +03001233 chan->ops->ready(chan);
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001234}
1235
Johan Hedbergf1496de2013-05-13 14:15:56 +03001236static void l2cap_le_connect(struct l2cap_chan *chan)
1237{
1238 struct l2cap_conn *conn = chan->conn;
1239 struct l2cap_le_conn_req req;
1240
Johan Hedberg595177f2013-12-02 22:12:22 +02001241 if (test_and_set_bit(FLAG_LE_CONN_REQ_SENT, &chan->flags))
1242 return;
1243
Johan Hedbergf1496de2013-05-13 14:15:56 +03001244 req.psm = chan->psm;
1245 req.scid = cpu_to_le16(chan->scid);
1246 req.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02001247 req.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03001248 req.credits = cpu_to_le16(chan->rx_credits);
Johan Hedbergf1496de2013-05-13 14:15:56 +03001249
1250 chan->ident = l2cap_get_ident(conn);
1251
1252 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_REQ,
1253 sizeof(req), &req);
1254}
1255
1256static void l2cap_le_start(struct l2cap_chan *chan)
1257{
1258 struct l2cap_conn *conn = chan->conn;
1259
1260 if (!smp_conn_security(conn->hcon, chan->sec_level))
1261 return;
1262
1263 if (!chan->psm) {
1264 l2cap_chan_ready(chan);
1265 return;
1266 }
1267
1268 if (chan->state == BT_CONNECT)
1269 l2cap_le_connect(chan);
1270}
1271
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001272static void l2cap_start_connection(struct l2cap_chan *chan)
1273{
1274 if (__amp_capable(chan)) {
1275 BT_DBG("chan %p AMP capable: discover AMPs", chan);
1276 a2mp_discover_amp(chan);
Johan Hedbergf1496de2013-05-13 14:15:56 +03001277 } else if (chan->conn->hcon->type == LE_LINK) {
1278 l2cap_le_start(chan);
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001279 } else {
1280 l2cap_send_conn_req(chan);
1281 }
1282}
1283
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001284static void l2cap_do_start(struct l2cap_chan *chan)
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001285{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03001286 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001287
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001288 if (conn->hcon->type == LE_LINK) {
Johan Hedberg96ac34f2013-05-13 11:15:07 +03001289 l2cap_le_start(chan);
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001290 return;
1291 }
1292
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001293 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) {
Marcel Holtmann984947d2009-02-06 23:35:19 +01001294 if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE))
1295 return;
1296
Johan Hedberge7cafc42014-07-17 15:35:38 +03001297 if (l2cap_chan_check_security(chan, true) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01001298 __l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001299 l2cap_start_connection(chan);
1300 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001301 } else {
1302 struct l2cap_info_req req;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001303 req.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001304
1305 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
1306 conn->info_ident = l2cap_get_ident(conn);
1307
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08001308 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001309
Gustavo Padovan2d792812012-10-06 10:07:01 +01001310 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
1311 sizeof(req), &req);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001312 }
1313}
1314
Gustavo F. Padovancf6c2c02010-06-07 20:54:45 -03001315static inline int l2cap_mode_supported(__u8 mode, __u32 feat_mask)
1316{
1317 u32 local_feat_mask = l2cap_feat_mask;
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03001318 if (!disable_ertm)
Gustavo F. Padovancf6c2c02010-06-07 20:54:45 -03001319 local_feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING;
1320
1321 switch (mode) {
1322 case L2CAP_MODE_ERTM:
1323 return L2CAP_FEAT_ERTM & feat_mask & local_feat_mask;
1324 case L2CAP_MODE_STREAMING:
1325 return L2CAP_FEAT_STREAMING & feat_mask & local_feat_mask;
1326 default:
1327 return 0x00;
1328 }
1329}
1330
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001331static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err)
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001332{
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001333 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001334 struct l2cap_disconn_req req;
1335
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001336 if (!conn)
1337 return;
1338
Andrei Emeltchenkoaad3d0e2012-09-06 15:05:42 +03001339 if (chan->mode == L2CAP_MODE_ERTM && chan->state == BT_CONNECTED) {
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03001340 __clear_retrans_timer(chan);
1341 __clear_monitor_timer(chan);
1342 __clear_ack_timer(chan);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001343 }
1344
Johan Hedberg2338a7e2014-01-24 10:35:40 +02001345 if (chan->scid == L2CAP_CID_A2MP) {
Gustavo Padovand1177732012-10-06 11:47:38 +01001346 l2cap_state_change(chan, BT_DISCONN);
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001347 return;
1348 }
1349
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001350 req.dcid = cpu_to_le16(chan->dcid);
1351 req.scid = cpu_to_le16(chan->scid);
Gustavo Padovan2d792812012-10-06 10:07:01 +01001352 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_DISCONN_REQ,
1353 sizeof(req), &req);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001354
Gustavo Padovanf8e73012013-10-15 19:24:46 -03001355 l2cap_state_change_and_error(chan, BT_DISCONN, err);
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001356}
1357
Linus Torvalds1da177e2005-04-16 15:20:36 -07001358/* ---- L2CAP connections ---- */
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001359static void l2cap_conn_start(struct l2cap_conn *conn)
1360{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001361 struct l2cap_chan *chan, *tmp;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001362
1363 BT_DBG("conn %p", conn);
1364
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001365 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001366
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001367 list_for_each_entry_safe(chan, tmp, &conn->chan_l, list) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001368 l2cap_chan_lock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001369
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001370 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001371 l2cap_chan_unlock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001372 continue;
1373 }
1374
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001375 if (chan->state == BT_CONNECT) {
Johan Hedberge7cafc42014-07-17 15:35:38 +03001376 if (!l2cap_chan_check_security(chan, true) ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01001377 !__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001378 l2cap_chan_unlock(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001379 continue;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02001380 }
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001381
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001382 if (!l2cap_mode_supported(chan->mode, conn->feat_mask)
Gustavo Padovan2d792812012-10-06 10:07:01 +01001383 && test_bit(CONF_STATE2_DEVICE,
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001384 &chan->conf_state)) {
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001385 l2cap_chan_close(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001386 l2cap_chan_unlock(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001387 continue;
1388 }
1389
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001390 l2cap_start_connection(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001391
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001392 } else if (chan->state == BT_CONNECT2) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001393 struct l2cap_conn_rsp rsp;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001394 char buf[128];
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001395 rsp.scid = cpu_to_le16(chan->dcid);
1396 rsp.dcid = cpu_to_le16(chan->scid);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001397
Johan Hedberge7cafc42014-07-17 15:35:38 +03001398 if (l2cap_chan_check_security(chan, false)) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07001399 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001400 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
1401 rsp.status = cpu_to_le16(L2CAP_CS_AUTHOR_PEND);
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001402 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001403
1404 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001405 l2cap_state_change(chan, BT_CONFIG);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001406 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
1407 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001408 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001409 } else {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001410 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
1411 rsp.status = cpu_to_le16(L2CAP_CS_AUTHEN_PEND);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001412 }
1413
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001414 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001415 sizeof(rsp), &rsp);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001416
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001417 if (test_bit(CONF_REQ_SENT, &chan->conf_state) ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01001418 rsp.result != L2CAP_CR_SUCCESS) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001419 l2cap_chan_unlock(chan);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001420 continue;
1421 }
1422
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001423 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001424 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001425 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03001426 chan->num_conf_req++;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001427 }
1428
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001429 l2cap_chan_unlock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001430 }
1431
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001432 mutex_unlock(&conn->chan_lock);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001433}
1434
Ville Tervob62f3282011-02-10 22:38:50 -03001435static void l2cap_le_conn_ready(struct l2cap_conn *conn)
1436{
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001437 struct hci_conn *hcon = conn->hcon;
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001438 struct hci_dev *hdev = hcon->hdev;
Ville Tervob62f3282011-02-10 22:38:50 -03001439
Johan Hedberge760ec12014-08-07 22:56:47 +03001440 BT_DBG("%s conn %p", hdev->name, conn);
Ville Tervob62f3282011-02-10 22:38:50 -03001441
Johan Hedberge760ec12014-08-07 22:56:47 +03001442 /* For outgoing pairing which doesn't necessarily have an
1443 * associated socket (e.g. mgmt_pair_device).
1444 */
1445 if (hcon->out)
1446 smp_conn_security(hcon, hcon->pending_sec_level);
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001447
Marcel Holtmann80afeb62014-06-23 12:18:51 +02001448 /* For LE slave connections, make sure the connection interval
1449 * is in the range of the minium and maximum interval that has
1450 * been configured for this connection. If not, then trigger
1451 * the connection update procedure.
1452 */
Johan Hedberg40bef302014-07-16 11:42:27 +03001453 if (hcon->role == HCI_ROLE_SLAVE &&
Marcel Holtmann80afeb62014-06-23 12:18:51 +02001454 (hcon->le_conn_interval < hcon->le_conn_min_interval ||
1455 hcon->le_conn_interval > hcon->le_conn_max_interval)) {
1456 struct l2cap_conn_param_update_req req;
1457
1458 req.min = cpu_to_le16(hcon->le_conn_min_interval);
1459 req.max = cpu_to_le16(hcon->le_conn_max_interval);
1460 req.latency = cpu_to_le16(hcon->le_conn_latency);
1461 req.to_multiplier = cpu_to_le16(hcon->le_supv_timeout);
1462
1463 l2cap_send_cmd(conn, l2cap_get_ident(conn),
1464 L2CAP_CONN_PARAM_UPDATE_REQ, sizeof(req), &req);
1465 }
Ville Tervob62f3282011-02-10 22:38:50 -03001466}
1467
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001468static void l2cap_conn_ready(struct l2cap_conn *conn)
1469{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001470 struct l2cap_chan *chan;
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001471 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001472
1473 BT_DBG("conn %p", conn);
1474
Johan Hedberge760ec12014-08-07 22:56:47 +03001475 mutex_lock(&conn->chan_lock);
1476
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001477 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03001478
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001479 l2cap_chan_lock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001480
Johan Hedberg2338a7e2014-01-24 10:35:40 +02001481 if (chan->scid == L2CAP_CID_A2MP) {
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001482 l2cap_chan_unlock(chan);
1483 continue;
1484 }
1485
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001486 if (hcon->type == LE_LINK) {
Johan Hedbergf1496de2013-05-13 14:15:56 +03001487 l2cap_le_start(chan);
Vinicius Costa Gomes63128452011-06-17 22:46:26 -03001488 } else if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Gustavo Padovan74e75742013-10-15 19:24:51 -03001489 l2cap_chan_ready(chan);
Anderson Brigliab501d6a2011-06-07 18:46:31 -03001490
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001491 } else if (chan->state == BT_CONNECT) {
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001492 l2cap_do_start(chan);
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001493 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001494
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001495 l2cap_chan_unlock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001496 }
1497
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001498 mutex_unlock(&conn->chan_lock);
Johan Hedberg61a939c2014-01-17 20:45:11 +02001499
Johan Hedberg79a05722014-08-08 09:28:04 +03001500 if (hcon->type == LE_LINK)
1501 l2cap_le_conn_ready(conn);
1502
Johan Hedberg61a939c2014-01-17 20:45:11 +02001503 queue_work(hcon->hdev->workqueue, &conn->pending_rx_work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001504}
1505
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001506/* Notify sockets that we cannot guaranty reliability anymore */
1507static void l2cap_conn_unreliable(struct l2cap_conn *conn, int err)
1508{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001509 struct l2cap_chan *chan;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001510
1511 BT_DBG("conn %p", conn);
1512
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001513 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001514
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001515 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +03001516 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo Padovan1d8b1fd2012-10-06 11:34:52 +01001517 l2cap_chan_set_err(chan, err);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001518 }
1519
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001520 mutex_unlock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001521}
1522
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001523static void l2cap_info_timeout(struct work_struct *work)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001524{
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001525 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001526 info_timer.work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001527
Marcel Holtmann984947d2009-02-06 23:35:19 +01001528 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01001529 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01001530
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001531 l2cap_conn_start(conn);
1532}
1533
David Herrmann2c8e1412013-04-06 20:28:45 +02001534/*
1535 * l2cap_user
1536 * External modules can register l2cap_user objects on l2cap_conn. The ->probe
1537 * callback is called during registration. The ->remove callback is called
1538 * during unregistration.
1539 * An l2cap_user object can either be explicitly unregistered or when the
1540 * underlying l2cap_conn object is deleted. This guarantees that l2cap->hcon,
1541 * l2cap->hchan, .. are valid as long as the remove callback hasn't been called.
1542 * External modules must own a reference to the l2cap_conn object if they intend
1543 * to call l2cap_unregister_user(). The l2cap_conn object might get destroyed at
1544 * any time if they don't.
1545 */
1546
1547int l2cap_register_user(struct l2cap_conn *conn, struct l2cap_user *user)
1548{
1549 struct hci_dev *hdev = conn->hcon->hdev;
1550 int ret;
1551
1552 /* We need to check whether l2cap_conn is registered. If it is not, we
1553 * must not register the l2cap_user. l2cap_conn_del() is unregisters
1554 * l2cap_conn objects, but doesn't provide its own locking. Instead, it
1555 * relies on the parent hci_conn object to be locked. This itself relies
1556 * on the hci_dev object to be locked. So we must lock the hci device
1557 * here, too. */
1558
1559 hci_dev_lock(hdev);
1560
1561 if (user->list.next || user->list.prev) {
1562 ret = -EINVAL;
1563 goto out_unlock;
1564 }
1565
1566 /* conn->hchan is NULL after l2cap_conn_del() was called */
1567 if (!conn->hchan) {
1568 ret = -ENODEV;
1569 goto out_unlock;
1570 }
1571
1572 ret = user->probe(conn, user);
1573 if (ret)
1574 goto out_unlock;
1575
1576 list_add(&user->list, &conn->users);
1577 ret = 0;
1578
1579out_unlock:
1580 hci_dev_unlock(hdev);
1581 return ret;
1582}
1583EXPORT_SYMBOL(l2cap_register_user);
1584
1585void l2cap_unregister_user(struct l2cap_conn *conn, struct l2cap_user *user)
1586{
1587 struct hci_dev *hdev = conn->hcon->hdev;
1588
1589 hci_dev_lock(hdev);
1590
1591 if (!user->list.next || !user->list.prev)
1592 goto out_unlock;
1593
1594 list_del(&user->list);
1595 user->list.next = NULL;
1596 user->list.prev = NULL;
1597 user->remove(conn, user);
1598
1599out_unlock:
1600 hci_dev_unlock(hdev);
1601}
1602EXPORT_SYMBOL(l2cap_unregister_user);
1603
1604static void l2cap_unregister_all_users(struct l2cap_conn *conn)
1605{
1606 struct l2cap_user *user;
1607
1608 while (!list_empty(&conn->users)) {
1609 user = list_first_entry(&conn->users, struct l2cap_user, list);
1610 list_del(&user->list);
1611 user->list.next = NULL;
1612 user->list.prev = NULL;
1613 user->remove(conn, user);
1614 }
1615}
1616
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001617static void l2cap_conn_del(struct hci_conn *hcon, int err)
1618{
1619 struct l2cap_conn *conn = hcon->l2cap_data;
1620 struct l2cap_chan *chan, *l;
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001621
1622 if (!conn)
1623 return;
1624
1625 BT_DBG("hcon %p conn %p, err %d", hcon, conn, err);
1626
1627 kfree_skb(conn->rx_skb);
1628
Johan Hedberg61a939c2014-01-17 20:45:11 +02001629 skb_queue_purge(&conn->pending_rx);
Jukka Taimisto7ab56c32014-06-12 10:15:13 +00001630
1631 /* We can not call flush_work(&conn->pending_rx_work) here since we
1632 * might block if we are running on a worker from the same workqueue
1633 * pending_rx_work is waiting on.
1634 */
1635 if (work_pending(&conn->pending_rx_work))
1636 cancel_work_sync(&conn->pending_rx_work);
Johan Hedberg61a939c2014-01-17 20:45:11 +02001637
Johan Hedbergdec5b492014-08-11 22:06:37 +03001638 if (work_pending(&conn->disconn_work))
1639 cancel_work_sync(&conn->disconn_work);
1640
David Herrmann2c8e1412013-04-06 20:28:45 +02001641 l2cap_unregister_all_users(conn);
1642
Johan Hedberge31fb862014-08-18 20:33:28 +03001643 /* Force the connection to be immediately dropped */
1644 hcon->disc_timeout = 0;
1645
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001646 mutex_lock(&conn->chan_lock);
1647
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001648 /* Kill channels */
1649 list_for_each_entry_safe(chan, l, &conn->chan_l, list) {
Mat Martineau61d6ef32012-04-27 16:50:50 -07001650 l2cap_chan_hold(chan);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001651 l2cap_chan_lock(chan);
1652
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001653 l2cap_chan_del(chan, err);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001654
1655 l2cap_chan_unlock(chan);
1656
Gustavo Padovan80b98022012-05-27 22:27:51 -03001657 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07001658 l2cap_chan_put(chan);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001659 }
1660
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001661 mutex_unlock(&conn->chan_lock);
1662
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001663 hci_chan_del(conn->hchan);
1664
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001665 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT)
Ulisses Furquim127074b2012-01-30 18:26:29 -02001666 cancel_delayed_work_sync(&conn->info_timer);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001667
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001668 hcon->l2cap_data = NULL;
David Herrmann9c903e32013-04-06 20:28:44 +02001669 conn->hchan = NULL;
1670 l2cap_conn_put(conn);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001671}
1672
Johan Hedbergdec5b492014-08-11 22:06:37 +03001673static void disconn_work(struct work_struct *work)
1674{
1675 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
1676 disconn_work);
1677
1678 BT_DBG("conn %p", conn);
1679
1680 l2cap_conn_del(conn->hcon, conn->disconn_err);
1681}
1682
1683void l2cap_conn_shutdown(struct l2cap_conn *conn, int err)
1684{
1685 struct hci_dev *hdev = conn->hcon->hdev;
1686
1687 BT_DBG("conn %p err %d", conn, err);
1688
1689 conn->disconn_err = err;
1690 queue_work(hdev->workqueue, &conn->disconn_work);
1691}
1692
David Herrmann9c903e32013-04-06 20:28:44 +02001693static void l2cap_conn_free(struct kref *ref)
1694{
1695 struct l2cap_conn *conn = container_of(ref, struct l2cap_conn, ref);
1696
1697 hci_conn_put(conn->hcon);
1698 kfree(conn);
1699}
1700
Johan Hedberg51bb84572014-08-15 21:06:57 +03001701struct l2cap_conn *l2cap_conn_get(struct l2cap_conn *conn)
David Herrmann9c903e32013-04-06 20:28:44 +02001702{
1703 kref_get(&conn->ref);
Johan Hedberg51bb84572014-08-15 21:06:57 +03001704 return conn;
David Herrmann9c903e32013-04-06 20:28:44 +02001705}
1706EXPORT_SYMBOL(l2cap_conn_get);
1707
1708void l2cap_conn_put(struct l2cap_conn *conn)
1709{
1710 kref_put(&conn->ref, l2cap_conn_free);
1711}
1712EXPORT_SYMBOL(l2cap_conn_put);
1713
Linus Torvalds1da177e2005-04-16 15:20:36 -07001714/* ---- Socket interface ---- */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001715
Ido Yarivc2287682012-04-20 15:46:07 -03001716/* Find socket with psm and source / destination bdaddr.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001717 * Returns closest match.
1718 */
Ido Yarivc2287682012-04-20 15:46:07 -03001719static struct l2cap_chan *l2cap_global_chan_by_psm(int state, __le16 psm,
1720 bdaddr_t *src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001721 bdaddr_t *dst,
1722 u8 link_type)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001723{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001724 struct l2cap_chan *c, *c1 = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001725
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001726 read_lock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001727
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001728 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001729 if (state && c->state != state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001730 continue;
1731
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001732 if (link_type == ACL_LINK && c->src_type != BDADDR_BREDR)
1733 continue;
1734
1735 if (link_type == LE_LINK && c->src_type == BDADDR_BREDR)
1736 continue;
1737
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001738 if (c->psm == psm) {
Ido Yarivc2287682012-04-20 15:46:07 -03001739 int src_match, dst_match;
1740 int src_any, dst_any;
1741
Linus Torvalds1da177e2005-04-16 15:20:36 -07001742 /* Exact match. */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001743 src_match = !bacmp(&c->src, src);
1744 dst_match = !bacmp(&c->dst, dst);
Ido Yarivc2287682012-04-20 15:46:07 -03001745 if (src_match && dst_match) {
Johan Hedberga24cce12014-08-07 22:56:42 +03001746 l2cap_chan_hold(c);
Johannes Berga7567b22011-06-01 08:29:54 +02001747 read_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001748 return c;
1749 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001750
1751 /* Closest match */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001752 src_any = !bacmp(&c->src, BDADDR_ANY);
1753 dst_any = !bacmp(&c->dst, BDADDR_ANY);
Ido Yarivc2287682012-04-20 15:46:07 -03001754 if ((src_match && dst_any) || (src_any && dst_match) ||
1755 (src_any && dst_any))
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001756 c1 = c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001757 }
1758 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001759
Johan Hedberga24cce12014-08-07 22:56:42 +03001760 if (c1)
1761 l2cap_chan_hold(c1);
1762
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001763 read_unlock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001764
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001765 return c1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001766}
1767
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001768static void l2cap_monitor_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001769{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001770 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001771 monitor_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001772
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03001773 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001774
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001775 l2cap_chan_lock(chan);
1776
Mat Martineau80909e02012-05-17 20:53:50 -07001777 if (!chan->conn) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001778 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001779 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001780 return;
1781 }
1782
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001783 l2cap_tx(chan, NULL, NULL, L2CAP_EV_MONITOR_TO);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001784
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001785 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001786 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001787}
1788
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001789static void l2cap_retrans_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001790{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001791 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001792 retrans_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001793
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03001794 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001795
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001796 l2cap_chan_lock(chan);
1797
Mat Martineau80909e02012-05-17 20:53:50 -07001798 if (!chan->conn) {
1799 l2cap_chan_unlock(chan);
1800 l2cap_chan_put(chan);
1801 return;
1802 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001803
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001804 l2cap_tx(chan, NULL, NULL, L2CAP_EV_RETRANS_TO);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001805 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001806 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001807}
1808
Gustavo Padovand6603662012-05-21 13:58:22 -03001809static void l2cap_streaming_send(struct l2cap_chan *chan,
1810 struct sk_buff_head *skbs)
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001811{
Gustavo F. Padovanccbb84a2010-08-30 18:44:44 -03001812 struct sk_buff *skb;
Mat Martineau37339372012-05-17 20:53:33 -07001813 struct l2cap_ctrl *control;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001814
Mat Martineau37339372012-05-17 20:53:33 -07001815 BT_DBG("chan %p, skbs %p", chan, skbs);
1816
Mat Martineaub99e13a2012-10-23 15:24:19 -07001817 if (__chan_is_moving(chan))
1818 return;
1819
Mat Martineau37339372012-05-17 20:53:33 -07001820 skb_queue_splice_tail_init(skbs, &chan->tx_q);
1821
1822 while (!skb_queue_empty(&chan->tx_q)) {
1823
1824 skb = skb_dequeue(&chan->tx_q);
1825
1826 bt_cb(skb)->control.retries = 1;
1827 control = &bt_cb(skb)->control;
1828
1829 control->reqseq = 0;
1830 control->txseq = chan->next_tx_seq;
1831
1832 __pack_control(chan, control, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001833
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001834 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau37339372012-05-17 20:53:33 -07001835 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1836 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001837 }
1838
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001839 l2cap_do_send(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001840
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001841 BT_DBG("Sent txseq %u", control->txseq);
Mat Martineau37339372012-05-17 20:53:33 -07001842
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001843 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau37339372012-05-17 20:53:33 -07001844 chan->frames_sent++;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001845 }
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001846}
1847
Szymon Janc67c9e842011-07-28 16:24:33 +02001848static int l2cap_ertm_send(struct l2cap_chan *chan)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001849{
1850 struct sk_buff *skb, *tx_skb;
Mat Martineau18a48e72012-05-17 20:53:34 -07001851 struct l2cap_ctrl *control;
1852 int sent = 0;
1853
1854 BT_DBG("chan %p", chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001855
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001856 if (chan->state != BT_CONNECTED)
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001857 return -ENOTCONN;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001858
Mat Martineau94122bb2012-05-02 09:42:02 -07001859 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1860 return 0;
1861
Mat Martineaub99e13a2012-10-23 15:24:19 -07001862 if (__chan_is_moving(chan))
1863 return 0;
1864
Mat Martineau18a48e72012-05-17 20:53:34 -07001865 while (chan->tx_send_head &&
1866 chan->unacked_frames < chan->remote_tx_win &&
1867 chan->tx_state == L2CAP_TX_STATE_XMIT) {
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001868
Mat Martineau18a48e72012-05-17 20:53:34 -07001869 skb = chan->tx_send_head;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001870
Mat Martineau18a48e72012-05-17 20:53:34 -07001871 bt_cb(skb)->control.retries = 1;
1872 control = &bt_cb(skb)->control;
Gustavo F. Padovan95ffa972010-06-18 20:37:33 -03001873
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001874 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
Mat Martineau18a48e72012-05-17 20:53:34 -07001875 control->final = 1;
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001876
Mat Martineau18a48e72012-05-17 20:53:34 -07001877 control->reqseq = chan->buffer_seq;
1878 chan->last_acked_seq = chan->buffer_seq;
1879 control->txseq = chan->next_tx_seq;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001880
Mat Martineau18a48e72012-05-17 20:53:34 -07001881 __pack_control(chan, control, skb);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001882
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001883 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau18a48e72012-05-17 20:53:34 -07001884 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1885 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001886 }
1887
Mat Martineau18a48e72012-05-17 20:53:34 -07001888 /* Clone after data has been modified. Data is assumed to be
1889 read-only (for locking purposes) on cloned sk_buffs.
1890 */
1891 tx_skb = skb_clone(skb, GFP_KERNEL);
1892
1893 if (!tx_skb)
1894 break;
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -03001895
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03001896 __set_retrans_timer(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001897
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001898 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau18a48e72012-05-17 20:53:34 -07001899 chan->unacked_frames++;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03001900 chan->frames_sent++;
Mat Martineau18a48e72012-05-17 20:53:34 -07001901 sent++;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001902
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001903 if (skb_queue_is_last(&chan->tx_q, skb))
1904 chan->tx_send_head = NULL;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001905 else
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001906 chan->tx_send_head = skb_queue_next(&chan->tx_q, skb);
Mat Martineau18a48e72012-05-17 20:53:34 -07001907
1908 l2cap_do_send(chan, tx_skb);
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001909 BT_DBG("Sent txseq %u", control->txseq);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001910 }
1911
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001912 BT_DBG("Sent %d, %u unacked, %u in ERTM queue", sent,
1913 chan->unacked_frames, skb_queue_len(&chan->tx_q));
Mat Martineau18a48e72012-05-17 20:53:34 -07001914
1915 return sent;
Gustavo F. Padovan9e917af2010-05-01 16:15:37 -03001916}
1917
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001918static void l2cap_ertm_resend(struct l2cap_chan *chan)
1919{
1920 struct l2cap_ctrl control;
1921 struct sk_buff *skb;
1922 struct sk_buff *tx_skb;
1923 u16 seq;
1924
1925 BT_DBG("chan %p", chan);
1926
1927 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1928 return;
1929
Mat Martineaub99e13a2012-10-23 15:24:19 -07001930 if (__chan_is_moving(chan))
1931 return;
1932
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001933 while (chan->retrans_list.head != L2CAP_SEQ_LIST_CLEAR) {
1934 seq = l2cap_seq_list_pop(&chan->retrans_list);
1935
1936 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, seq);
1937 if (!skb) {
1938 BT_DBG("Error: Can't retransmit seq %d, frame missing",
Gustavo Padovan2d792812012-10-06 10:07:01 +01001939 seq);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001940 continue;
1941 }
1942
1943 bt_cb(skb)->control.retries++;
1944 control = bt_cb(skb)->control;
1945
1946 if (chan->max_tx != 0 &&
1947 bt_cb(skb)->control.retries > chan->max_tx) {
1948 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001949 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001950 l2cap_seq_list_clear(&chan->retrans_list);
1951 break;
1952 }
1953
1954 control.reqseq = chan->buffer_seq;
1955 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
1956 control.final = 1;
1957 else
1958 control.final = 0;
1959
1960 if (skb_cloned(skb)) {
1961 /* Cloned sk_buffs are read-only, so we need a
1962 * writeable copy
1963 */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03001964 tx_skb = skb_copy(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001965 } else {
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03001966 tx_skb = skb_clone(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001967 }
1968
1969 if (!tx_skb) {
1970 l2cap_seq_list_clear(&chan->retrans_list);
1971 break;
1972 }
1973
1974 /* Update skb contents */
1975 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
1976 put_unaligned_le32(__pack_extended_control(&control),
1977 tx_skb->data + L2CAP_HDR_SIZE);
1978 } else {
1979 put_unaligned_le16(__pack_enhanced_control(&control),
1980 tx_skb->data + L2CAP_HDR_SIZE);
1981 }
1982
Lukasz Rymanowski13cac152014-08-14 09:35:34 +02001983 /* Update FCS */
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001984 if (chan->fcs == L2CAP_FCS_CRC16) {
Lukasz Rymanowski13cac152014-08-14 09:35:34 +02001985 u16 fcs = crc16(0, (u8 *) tx_skb->data,
1986 tx_skb->len - L2CAP_FCS_SIZE);
1987 put_unaligned_le16(fcs, skb_tail_pointer(tx_skb) -
1988 L2CAP_FCS_SIZE);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001989 }
1990
1991 l2cap_do_send(chan, tx_skb);
1992
1993 BT_DBG("Resent txseq %d", control.txseq);
1994
1995 chan->last_acked_seq = chan->buffer_seq;
1996 }
1997}
1998
Mat Martineauf80842a2012-05-17 20:53:46 -07001999static void l2cap_retransmit(struct l2cap_chan *chan,
2000 struct l2cap_ctrl *control)
2001{
2002 BT_DBG("chan %p, control %p", chan, control);
2003
2004 l2cap_seq_list_append(&chan->retrans_list, control->reqseq);
2005 l2cap_ertm_resend(chan);
2006}
2007
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002008static void l2cap_retransmit_all(struct l2cap_chan *chan,
2009 struct l2cap_ctrl *control)
2010{
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002011 struct sk_buff *skb;
2012
2013 BT_DBG("chan %p, control %p", chan, control);
2014
2015 if (control->poll)
2016 set_bit(CONN_SEND_FBIT, &chan->conn_state);
2017
2018 l2cap_seq_list_clear(&chan->retrans_list);
2019
2020 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
2021 return;
2022
2023 if (chan->unacked_frames) {
2024 skb_queue_walk(&chan->tx_q, skb) {
2025 if (bt_cb(skb)->control.txseq == control->reqseq ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01002026 skb == chan->tx_send_head)
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002027 break;
2028 }
2029
2030 skb_queue_walk_from(&chan->tx_q, skb) {
2031 if (skb == chan->tx_send_head)
2032 break;
2033
2034 l2cap_seq_list_append(&chan->retrans_list,
2035 bt_cb(skb)->control.txseq);
2036 }
2037
2038 l2cap_ertm_resend(chan);
2039 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002040}
2041
Szymon Jancb17e73b2012-01-11 10:59:47 +01002042static void l2cap_send_ack(struct l2cap_chan *chan)
2043{
Mat Martineau0a0aba42012-05-17 20:53:39 -07002044 struct l2cap_ctrl control;
2045 u16 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
2046 chan->last_acked_seq);
2047 int threshold;
2048
2049 BT_DBG("chan %p last_acked_seq %d buffer_seq %d",
2050 chan, chan->last_acked_seq, chan->buffer_seq);
2051
2052 memset(&control, 0, sizeof(control));
2053 control.sframe = 1;
2054
2055 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
2056 chan->rx_state == L2CAP_RX_STATE_RECV) {
2057 __clear_ack_timer(chan);
2058 control.super = L2CAP_SUPER_RNR;
2059 control.reqseq = chan->buffer_seq;
2060 l2cap_send_sframe(chan, &control);
2061 } else {
2062 if (!test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) {
2063 l2cap_ertm_send(chan);
2064 /* If any i-frames were sent, they included an ack */
2065 if (chan->buffer_seq == chan->last_acked_seq)
2066 frames_to_ack = 0;
2067 }
2068
Mat Martineauc20f8e32012-07-10 05:47:07 -07002069 /* Ack now if the window is 3/4ths full.
Mat Martineau0a0aba42012-05-17 20:53:39 -07002070 * Calculate without mul or div
2071 */
Mat Martineauc20f8e32012-07-10 05:47:07 -07002072 threshold = chan->ack_win;
Mat Martineau0a0aba42012-05-17 20:53:39 -07002073 threshold += threshold << 1;
2074 threshold >>= 2;
2075
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002076 BT_DBG("frames_to_ack %u, threshold %d", frames_to_ack,
Mat Martineau0a0aba42012-05-17 20:53:39 -07002077 threshold);
2078
2079 if (frames_to_ack >= threshold) {
2080 __clear_ack_timer(chan);
2081 control.super = L2CAP_SUPER_RR;
2082 control.reqseq = chan->buffer_seq;
2083 l2cap_send_sframe(chan, &control);
2084 frames_to_ack = 0;
2085 }
2086
2087 if (frames_to_ack)
2088 __set_ack_timer(chan);
2089 }
Szymon Jancb17e73b2012-01-11 10:59:47 +01002090}
2091
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002092static inline int l2cap_skbuff_fromiovec(struct l2cap_chan *chan,
2093 struct msghdr *msg, int len,
2094 int count, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002095{
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002096 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002097 struct sk_buff **frag;
Gustavo Padovan90338942012-04-06 20:15:47 -03002098 int sent = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002099
Jukka Rissanen04988782014-06-18 16:37:07 +03002100 if (chan->ops->memcpy_fromiovec(chan, skb_put(skb, count),
2101 msg->msg_iov, count))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002102 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002103
2104 sent += count;
2105 len -= count;
2106
2107 /* Continuation fragments (no L2CAP header) */
2108 frag = &skb_shinfo(skb)->frag_list;
2109 while (len) {
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002110 struct sk_buff *tmp;
2111
Linus Torvalds1da177e2005-04-16 15:20:36 -07002112 count = min_t(unsigned int, conn->mtu, len);
2113
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002114 tmp = chan->ops->alloc_skb(chan, 0, count,
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002115 msg->msg_flags & MSG_DONTWAIT);
2116 if (IS_ERR(tmp))
2117 return PTR_ERR(tmp);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002118
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002119 *frag = tmp;
2120
Jukka Rissanen04988782014-06-18 16:37:07 +03002121 if (chan->ops->memcpy_fromiovec(chan, skb_put(*frag, count),
2122 msg->msg_iov, count))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002123 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002124
2125 sent += count;
2126 len -= count;
2127
Gustavo Padovan2d0ed3d2012-05-11 13:16:12 -03002128 skb->len += (*frag)->len;
2129 skb->data_len += (*frag)->len;
2130
Linus Torvalds1da177e2005-04-16 15:20:36 -07002131 frag = &(*frag)->next;
2132 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002133
2134 return sent;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002135}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002136
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002137static struct sk_buff *l2cap_create_connless_pdu(struct l2cap_chan *chan,
Marcel Holtmann8d463212014-06-05 15:22:51 +02002138 struct msghdr *msg, size_t len)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002139{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002140 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002141 struct sk_buff *skb;
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002142 int err, count, hlen = L2CAP_HDR_SIZE + L2CAP_PSMLEN_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002143 struct l2cap_hdr *lh;
2144
Marcel Holtmann8d463212014-06-05 15:22:51 +02002145 BT_DBG("chan %p psm 0x%2.2x len %zu", chan,
2146 __le16_to_cpu(chan->psm), len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002147
2148 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002149
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002150 skb = chan->ops->alloc_skb(chan, hlen, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002151 msg->msg_flags & MSG_DONTWAIT);
2152 if (IS_ERR(skb))
2153 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002154
2155 /* Create L2CAP header */
2156 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002157 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenkodaf6a78c2012-05-03 10:55:52 +03002158 lh->len = cpu_to_le16(len + L2CAP_PSMLEN_SIZE);
Marcel Holtmann43b1b8d2013-10-12 06:01:26 -07002159 put_unaligned(chan->psm, (__le16 *) skb_put(skb, L2CAP_PSMLEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002160
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002161 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002162 if (unlikely(err < 0)) {
2163 kfree_skb(skb);
2164 return ERR_PTR(err);
2165 }
2166 return skb;
2167}
2168
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002169static struct sk_buff *l2cap_create_basic_pdu(struct l2cap_chan *chan,
Marcel Holtmann8d463212014-06-05 15:22:51 +02002170 struct msghdr *msg, size_t len)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002171{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002172 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002173 struct sk_buff *skb;
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002174 int err, count;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002175 struct l2cap_hdr *lh;
2176
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002177 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002178
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002179 count = min_t(unsigned int, (conn->mtu - L2CAP_HDR_SIZE), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002180
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002181 skb = chan->ops->alloc_skb(chan, L2CAP_HDR_SIZE, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002182 msg->msg_flags & MSG_DONTWAIT);
2183 if (IS_ERR(skb))
2184 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002185
2186 /* Create L2CAP header */
2187 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002188 lh->cid = cpu_to_le16(chan->dcid);
Gustavo Padovan6ff9b5e2012-05-02 11:56:17 -03002189 lh->len = cpu_to_le16(len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002190
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002191 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002192 if (unlikely(err < 0)) {
2193 kfree_skb(skb);
2194 return ERR_PTR(err);
2195 }
2196 return skb;
2197}
2198
Luiz Augusto von Dentzab0ff762011-09-12 20:00:50 +03002199static struct sk_buff *l2cap_create_iframe_pdu(struct l2cap_chan *chan,
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002200 struct msghdr *msg, size_t len,
2201 u16 sdulen)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002202{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002203 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002204 struct sk_buff *skb;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002205 int err, count, hlen;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002206 struct l2cap_hdr *lh;
2207
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002208 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002209
Gustavo F. Padovan0ee0d202010-05-01 16:15:41 -03002210 if (!conn)
2211 return ERR_PTR(-ENOTCONN);
2212
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002213 hlen = __ertm_hdr_size(chan);
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002214
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002215 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002216 hlen += L2CAP_SDULEN_SIZE;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002217
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03002218 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002219 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03002220
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002221 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002222
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002223 skb = chan->ops->alloc_skb(chan, hlen, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002224 msg->msg_flags & MSG_DONTWAIT);
2225 if (IS_ERR(skb))
2226 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002227
2228 /* Create L2CAP header */
2229 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002230 lh->cid = cpu_to_le16(chan->dcid);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002231 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002232
Mat Martineau18a48e72012-05-17 20:53:34 -07002233 /* Control header is populated later */
2234 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
2235 put_unaligned_le32(0, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
2236 else
2237 put_unaligned_le16(0, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002238
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002239 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002240 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002241
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002242 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002243 if (unlikely(err < 0)) {
2244 kfree_skb(skb);
2245 return ERR_PTR(err);
2246 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03002247
Mat Martineau18a48e72012-05-17 20:53:34 -07002248 bt_cb(skb)->control.fcs = chan->fcs;
Mat Martineau3ce35142012-04-25 16:36:14 -07002249 bt_cb(skb)->control.retries = 0;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002250 return skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002251}
2252
Mat Martineau94122bb2012-05-02 09:42:02 -07002253static int l2cap_segment_sdu(struct l2cap_chan *chan,
2254 struct sk_buff_head *seg_queue,
2255 struct msghdr *msg, size_t len)
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002256{
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002257 struct sk_buff *skb;
Mat Martineau94122bb2012-05-02 09:42:02 -07002258 u16 sdu_len;
2259 size_t pdu_len;
Mat Martineau94122bb2012-05-02 09:42:02 -07002260 u8 sar;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002261
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002262 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002263
Mat Martineau94122bb2012-05-02 09:42:02 -07002264 /* It is critical that ERTM PDUs fit in a single HCI fragment,
2265 * so fragmented skbs are not used. The HCI layer's handling
2266 * of fragmented skbs is not compatible with ERTM's queueing.
2267 */
2268
2269 /* PDU size is derived from the HCI MTU */
2270 pdu_len = chan->conn->mtu;
2271
Mat Martineaua5495742012-10-23 15:24:21 -07002272 /* Constrain PDU size for BR/EDR connections */
2273 if (!chan->hs_hcon)
2274 pdu_len = min_t(size_t, pdu_len, L2CAP_BREDR_MAX_PAYLOAD);
Mat Martineau94122bb2012-05-02 09:42:02 -07002275
2276 /* Adjust for largest possible L2CAP overhead. */
Gustavo Padovan35d401d2012-05-25 18:57:05 -03002277 if (chan->fcs)
2278 pdu_len -= L2CAP_FCS_SIZE;
2279
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002280 pdu_len -= __ertm_hdr_size(chan);
Mat Martineau94122bb2012-05-02 09:42:02 -07002281
2282 /* Remote device may have requested smaller PDUs */
2283 pdu_len = min_t(size_t, pdu_len, chan->remote_mps);
2284
2285 if (len <= pdu_len) {
2286 sar = L2CAP_SAR_UNSEGMENTED;
2287 sdu_len = 0;
2288 pdu_len = len;
2289 } else {
2290 sar = L2CAP_SAR_START;
2291 sdu_len = len;
Mat Martineau94122bb2012-05-02 09:42:02 -07002292 }
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002293
2294 while (len > 0) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002295 skb = l2cap_create_iframe_pdu(chan, msg, pdu_len, sdu_len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002296
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002297 if (IS_ERR(skb)) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002298 __skb_queue_purge(seg_queue);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002299 return PTR_ERR(skb);
2300 }
2301
Mat Martineau94122bb2012-05-02 09:42:02 -07002302 bt_cb(skb)->control.sar = sar;
2303 __skb_queue_tail(seg_queue, skb);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002304
Mat Martineau94122bb2012-05-02 09:42:02 -07002305 len -= pdu_len;
Lukasz Rymanowski069cb272014-08-13 16:01:41 +02002306 if (sdu_len)
Mat Martineau94122bb2012-05-02 09:42:02 -07002307 sdu_len = 0;
Mat Martineau94122bb2012-05-02 09:42:02 -07002308
2309 if (len <= pdu_len) {
2310 sar = L2CAP_SAR_END;
2311 pdu_len = len;
2312 } else {
2313 sar = L2CAP_SAR_CONTINUE;
2314 }
2315 }
2316
Gustavo Padovanf0f62792012-05-29 13:29:17 -03002317 return 0;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002318}
2319
Johan Hedberg177f8f22013-05-31 17:54:51 +03002320static struct sk_buff *l2cap_create_le_flowctl_pdu(struct l2cap_chan *chan,
2321 struct msghdr *msg,
2322 size_t len, u16 sdulen)
2323{
2324 struct l2cap_conn *conn = chan->conn;
2325 struct sk_buff *skb;
2326 int err, count, hlen;
2327 struct l2cap_hdr *lh;
2328
2329 BT_DBG("chan %p len %zu", chan, len);
2330
2331 if (!conn)
2332 return ERR_PTR(-ENOTCONN);
2333
2334 hlen = L2CAP_HDR_SIZE;
2335
2336 if (sdulen)
2337 hlen += L2CAP_SDULEN_SIZE;
2338
2339 count = min_t(unsigned int, (conn->mtu - hlen), len);
2340
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002341 skb = chan->ops->alloc_skb(chan, hlen, count,
Johan Hedberg177f8f22013-05-31 17:54:51 +03002342 msg->msg_flags & MSG_DONTWAIT);
2343 if (IS_ERR(skb))
2344 return skb;
2345
2346 /* Create L2CAP header */
2347 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
2348 lh->cid = cpu_to_le16(chan->dcid);
2349 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
2350
2351 if (sdulen)
2352 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
2353
2354 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
2355 if (unlikely(err < 0)) {
2356 kfree_skb(skb);
2357 return ERR_PTR(err);
2358 }
2359
2360 return skb;
2361}
2362
2363static int l2cap_segment_le_sdu(struct l2cap_chan *chan,
2364 struct sk_buff_head *seg_queue,
2365 struct msghdr *msg, size_t len)
2366{
2367 struct sk_buff *skb;
2368 size_t pdu_len;
2369 u16 sdu_len;
2370
2371 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
2372
Johan Hedberg177f8f22013-05-31 17:54:51 +03002373 sdu_len = len;
Johan Hedberg72c6fb92014-08-15 21:06:51 +03002374 pdu_len = chan->remote_mps - L2CAP_SDULEN_SIZE;
Johan Hedberg177f8f22013-05-31 17:54:51 +03002375
2376 while (len > 0) {
2377 if (len <= pdu_len)
2378 pdu_len = len;
2379
2380 skb = l2cap_create_le_flowctl_pdu(chan, msg, pdu_len, sdu_len);
2381 if (IS_ERR(skb)) {
2382 __skb_queue_purge(seg_queue);
2383 return PTR_ERR(skb);
2384 }
2385
2386 __skb_queue_tail(seg_queue, skb);
2387
2388 len -= pdu_len;
2389
2390 if (sdu_len) {
2391 sdu_len = 0;
2392 pdu_len += L2CAP_SDULEN_SIZE;
2393 }
2394 }
2395
2396 return 0;
2397}
2398
Marcel Holtmann8d463212014-06-05 15:22:51 +02002399int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002400{
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002401 struct sk_buff *skb;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002402 int err;
Mat Martineau94122bb2012-05-02 09:42:02 -07002403 struct sk_buff_head seg_queue;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002404
Seung-Woo Kim31e8ce82013-11-05 18:46:33 +09002405 if (!chan->conn)
2406 return -ENOTCONN;
2407
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002408 /* Connectionless channel */
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002409 if (chan->chan_type == L2CAP_CHAN_CONN_LESS) {
Marcel Holtmann8d463212014-06-05 15:22:51 +02002410 skb = l2cap_create_connless_pdu(chan, msg, len);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002411 if (IS_ERR(skb))
2412 return PTR_ERR(skb);
2413
Andrzej Kaczmarekede81a22014-02-25 17:16:22 +01002414 /* Channel lock is released before requesting new skb and then
2415 * reacquired thus we need to recheck channel state.
2416 */
2417 if (chan->state != BT_CONNECTED) {
2418 kfree_skb(skb);
2419 return -ENOTCONN;
2420 }
2421
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002422 l2cap_do_send(chan, skb);
2423 return len;
2424 }
2425
2426 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03002427 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedberg177f8f22013-05-31 17:54:51 +03002428 /* Check outgoing MTU */
2429 if (len > chan->omtu)
2430 return -EMSGSIZE;
2431
Johan Hedbergfad5fc892013-12-05 09:45:01 +02002432 if (!chan->tx_credits)
2433 return -EAGAIN;
2434
Johan Hedberg177f8f22013-05-31 17:54:51 +03002435 __skb_queue_head_init(&seg_queue);
2436
2437 err = l2cap_segment_le_sdu(chan, &seg_queue, msg, len);
2438
2439 if (chan->state != BT_CONNECTED) {
2440 __skb_queue_purge(&seg_queue);
2441 err = -ENOTCONN;
2442 }
2443
2444 if (err)
2445 return err;
2446
2447 skb_queue_splice_tail_init(&seg_queue, &chan->tx_q);
2448
2449 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
2450 l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
2451 chan->tx_credits--;
2452 }
2453
2454 if (!chan->tx_credits)
2455 chan->ops->suspend(chan);
2456
2457 err = len;
2458
2459 break;
2460
Johan Hedbergfad5fc892013-12-05 09:45:01 +02002461 case L2CAP_MODE_BASIC:
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002462 /* Check outgoing MTU */
2463 if (len > chan->omtu)
2464 return -EMSGSIZE;
2465
2466 /* Create a basic PDU */
Marcel Holtmann8d463212014-06-05 15:22:51 +02002467 skb = l2cap_create_basic_pdu(chan, msg, len);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002468 if (IS_ERR(skb))
2469 return PTR_ERR(skb);
2470
Andrzej Kaczmarekede81a22014-02-25 17:16:22 +01002471 /* Channel lock is released before requesting new skb and then
2472 * reacquired thus we need to recheck channel state.
2473 */
2474 if (chan->state != BT_CONNECTED) {
2475 kfree_skb(skb);
2476 return -ENOTCONN;
2477 }
2478
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002479 l2cap_do_send(chan, skb);
2480 err = len;
2481 break;
2482
2483 case L2CAP_MODE_ERTM:
2484 case L2CAP_MODE_STREAMING:
Mat Martineau94122bb2012-05-02 09:42:02 -07002485 /* Check outgoing MTU */
2486 if (len > chan->omtu) {
2487 err = -EMSGSIZE;
2488 break;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002489 }
2490
Mat Martineau94122bb2012-05-02 09:42:02 -07002491 __skb_queue_head_init(&seg_queue);
2492
2493 /* Do segmentation before calling in to the state machine,
2494 * since it's possible to block while waiting for memory
2495 * allocation.
2496 */
2497 err = l2cap_segment_sdu(chan, &seg_queue, msg, len);
2498
2499 /* The channel could have been closed while segmenting,
2500 * check that it is still connected.
2501 */
2502 if (chan->state != BT_CONNECTED) {
2503 __skb_queue_purge(&seg_queue);
2504 err = -ENOTCONN;
2505 }
2506
2507 if (err)
2508 break;
2509
Mat Martineau37339372012-05-17 20:53:33 -07002510 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo Padovand6603662012-05-21 13:58:22 -03002511 l2cap_tx(chan, NULL, &seg_queue, L2CAP_EV_DATA_REQUEST);
Mat Martineau37339372012-05-17 20:53:33 -07002512 else
Gustavo Padovand6603662012-05-21 13:58:22 -03002513 l2cap_streaming_send(chan, &seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002514
Gustavo Padovand6603662012-05-21 13:58:22 -03002515 err = len;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002516
Mat Martineau94122bb2012-05-02 09:42:02 -07002517 /* If the skbs were not queued for sending, they'll still be in
2518 * seg_queue and need to be purged.
2519 */
2520 __skb_queue_purge(&seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002521 break;
2522
2523 default:
2524 BT_DBG("bad state %1.1x", chan->mode);
2525 err = -EBADFD;
2526 }
2527
2528 return err;
2529}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +03002530EXPORT_SYMBOL_GPL(l2cap_chan_send);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002531
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002532static void l2cap_send_srej(struct l2cap_chan *chan, u16 txseq)
2533{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002534 struct l2cap_ctrl control;
2535 u16 seq;
2536
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002537 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002538
2539 memset(&control, 0, sizeof(control));
2540 control.sframe = 1;
2541 control.super = L2CAP_SUPER_SREJ;
2542
2543 for (seq = chan->expected_tx_seq; seq != txseq;
2544 seq = __next_seq(chan, seq)) {
2545 if (!l2cap_ertm_seq_in_queue(&chan->srej_q, seq)) {
2546 control.reqseq = seq;
2547 l2cap_send_sframe(chan, &control);
2548 l2cap_seq_list_append(&chan->srej_list, seq);
2549 }
2550 }
2551
2552 chan->expected_tx_seq = __next_seq(chan, txseq);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002553}
2554
2555static void l2cap_send_srej_tail(struct l2cap_chan *chan)
2556{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002557 struct l2cap_ctrl control;
2558
2559 BT_DBG("chan %p", chan);
2560
2561 if (chan->srej_list.tail == L2CAP_SEQ_LIST_CLEAR)
2562 return;
2563
2564 memset(&control, 0, sizeof(control));
2565 control.sframe = 1;
2566 control.super = L2CAP_SUPER_SREJ;
2567 control.reqseq = chan->srej_list.tail;
2568 l2cap_send_sframe(chan, &control);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002569}
2570
2571static void l2cap_send_srej_list(struct l2cap_chan *chan, u16 txseq)
2572{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002573 struct l2cap_ctrl control;
2574 u16 initial_head;
2575 u16 seq;
2576
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002577 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002578
2579 memset(&control, 0, sizeof(control));
2580 control.sframe = 1;
2581 control.super = L2CAP_SUPER_SREJ;
2582
2583 /* Capture initial list head to allow only one pass through the list. */
2584 initial_head = chan->srej_list.head;
2585
2586 do {
2587 seq = l2cap_seq_list_pop(&chan->srej_list);
2588 if (seq == txseq || seq == L2CAP_SEQ_LIST_CLEAR)
2589 break;
2590
2591 control.reqseq = seq;
2592 l2cap_send_sframe(chan, &control);
2593 l2cap_seq_list_append(&chan->srej_list, seq);
2594 } while (chan->srej_list.head != initial_head);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002595}
2596
Mat Martineau608bcc62012-05-17 20:53:32 -07002597static void l2cap_process_reqseq(struct l2cap_chan *chan, u16 reqseq)
2598{
2599 struct sk_buff *acked_skb;
2600 u16 ackseq;
2601
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002602 BT_DBG("chan %p, reqseq %u", chan, reqseq);
Mat Martineau608bcc62012-05-17 20:53:32 -07002603
2604 if (chan->unacked_frames == 0 || reqseq == chan->expected_ack_seq)
2605 return;
2606
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002607 BT_DBG("expected_ack_seq %u, unacked_frames %u",
Mat Martineau608bcc62012-05-17 20:53:32 -07002608 chan->expected_ack_seq, chan->unacked_frames);
2609
2610 for (ackseq = chan->expected_ack_seq; ackseq != reqseq;
2611 ackseq = __next_seq(chan, ackseq)) {
2612
2613 acked_skb = l2cap_ertm_seq_in_queue(&chan->tx_q, ackseq);
2614 if (acked_skb) {
2615 skb_unlink(acked_skb, &chan->tx_q);
2616 kfree_skb(acked_skb);
2617 chan->unacked_frames--;
2618 }
2619 }
2620
2621 chan->expected_ack_seq = reqseq;
2622
2623 if (chan->unacked_frames == 0)
2624 __clear_retrans_timer(chan);
2625
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002626 BT_DBG("unacked_frames %u", chan->unacked_frames);
Mat Martineau608bcc62012-05-17 20:53:32 -07002627}
2628
2629static void l2cap_abort_rx_srej_sent(struct l2cap_chan *chan)
2630{
2631 BT_DBG("chan %p", chan);
2632
2633 chan->expected_tx_seq = chan->buffer_seq;
2634 l2cap_seq_list_clear(&chan->srej_list);
2635 skb_queue_purge(&chan->srej_q);
2636 chan->rx_state = L2CAP_RX_STATE_RECV;
2637}
2638
Gustavo Padovand6603662012-05-21 13:58:22 -03002639static void l2cap_tx_state_xmit(struct l2cap_chan *chan,
2640 struct l2cap_ctrl *control,
2641 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002642{
Mat Martineau608bcc62012-05-17 20:53:32 -07002643 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2644 event);
2645
2646 switch (event) {
2647 case L2CAP_EV_DATA_REQUEST:
2648 if (chan->tx_send_head == NULL)
2649 chan->tx_send_head = skb_peek(skbs);
2650
2651 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2652 l2cap_ertm_send(chan);
2653 break;
2654 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2655 BT_DBG("Enter LOCAL_BUSY");
2656 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2657
2658 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2659 /* The SREJ_SENT state must be aborted if we are to
2660 * enter the LOCAL_BUSY state.
2661 */
2662 l2cap_abort_rx_srej_sent(chan);
2663 }
2664
2665 l2cap_send_ack(chan);
2666
2667 break;
2668 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2669 BT_DBG("Exit LOCAL_BUSY");
2670 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2671
2672 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2673 struct l2cap_ctrl local_control;
2674
2675 memset(&local_control, 0, sizeof(local_control));
2676 local_control.sframe = 1;
2677 local_control.super = L2CAP_SUPER_RR;
2678 local_control.poll = 1;
2679 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002680 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002681
2682 chan->retry_count = 1;
2683 __set_monitor_timer(chan);
2684 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2685 }
2686 break;
2687 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2688 l2cap_process_reqseq(chan, control->reqseq);
2689 break;
2690 case L2CAP_EV_EXPLICIT_POLL:
2691 l2cap_send_rr_or_rnr(chan, 1);
2692 chan->retry_count = 1;
2693 __set_monitor_timer(chan);
2694 __clear_ack_timer(chan);
2695 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2696 break;
2697 case L2CAP_EV_RETRANS_TO:
2698 l2cap_send_rr_or_rnr(chan, 1);
2699 chan->retry_count = 1;
2700 __set_monitor_timer(chan);
2701 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2702 break;
2703 case L2CAP_EV_RECV_FBIT:
2704 /* Nothing to process */
2705 break;
2706 default:
2707 break;
2708 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002709}
2710
Gustavo Padovand6603662012-05-21 13:58:22 -03002711static void l2cap_tx_state_wait_f(struct l2cap_chan *chan,
2712 struct l2cap_ctrl *control,
2713 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002714{
Mat Martineau608bcc62012-05-17 20:53:32 -07002715 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2716 event);
2717
2718 switch (event) {
2719 case L2CAP_EV_DATA_REQUEST:
2720 if (chan->tx_send_head == NULL)
2721 chan->tx_send_head = skb_peek(skbs);
2722 /* Queue data, but don't send. */
2723 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2724 break;
2725 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2726 BT_DBG("Enter LOCAL_BUSY");
2727 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2728
2729 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2730 /* The SREJ_SENT state must be aborted if we are to
2731 * enter the LOCAL_BUSY state.
2732 */
2733 l2cap_abort_rx_srej_sent(chan);
2734 }
2735
2736 l2cap_send_ack(chan);
2737
2738 break;
2739 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2740 BT_DBG("Exit LOCAL_BUSY");
2741 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2742
2743 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2744 struct l2cap_ctrl local_control;
2745 memset(&local_control, 0, sizeof(local_control));
2746 local_control.sframe = 1;
2747 local_control.super = L2CAP_SUPER_RR;
2748 local_control.poll = 1;
2749 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002750 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002751
2752 chan->retry_count = 1;
2753 __set_monitor_timer(chan);
2754 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2755 }
2756 break;
2757 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2758 l2cap_process_reqseq(chan, control->reqseq);
2759
2760 /* Fall through */
2761
2762 case L2CAP_EV_RECV_FBIT:
2763 if (control && control->final) {
2764 __clear_monitor_timer(chan);
2765 if (chan->unacked_frames > 0)
2766 __set_retrans_timer(chan);
2767 chan->retry_count = 0;
2768 chan->tx_state = L2CAP_TX_STATE_XMIT;
2769 BT_DBG("recv fbit tx_state 0x2.2%x", chan->tx_state);
2770 }
2771 break;
2772 case L2CAP_EV_EXPLICIT_POLL:
2773 /* Ignore */
2774 break;
2775 case L2CAP_EV_MONITOR_TO:
2776 if (chan->max_tx == 0 || chan->retry_count < chan->max_tx) {
2777 l2cap_send_rr_or_rnr(chan, 1);
2778 __set_monitor_timer(chan);
2779 chan->retry_count++;
2780 } else {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02002781 l2cap_send_disconn_req(chan, ECONNABORTED);
Mat Martineau608bcc62012-05-17 20:53:32 -07002782 }
2783 break;
2784 default:
2785 break;
2786 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002787}
2788
Gustavo Padovand6603662012-05-21 13:58:22 -03002789static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
2790 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002791{
Mat Martineau608bcc62012-05-17 20:53:32 -07002792 BT_DBG("chan %p, control %p, skbs %p, event %d, state %d",
2793 chan, control, skbs, event, chan->tx_state);
2794
2795 switch (chan->tx_state) {
2796 case L2CAP_TX_STATE_XMIT:
Gustavo Padovand6603662012-05-21 13:58:22 -03002797 l2cap_tx_state_xmit(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002798 break;
2799 case L2CAP_TX_STATE_WAIT_F:
Gustavo Padovand6603662012-05-21 13:58:22 -03002800 l2cap_tx_state_wait_f(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002801 break;
2802 default:
2803 /* Ignore event */
2804 break;
2805 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002806}
2807
Mat Martineau4b51dae92012-05-17 20:53:37 -07002808static void l2cap_pass_to_tx(struct l2cap_chan *chan,
2809 struct l2cap_ctrl *control)
2810{
2811 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002812 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_REQSEQ_AND_FBIT);
Mat Martineau4b51dae92012-05-17 20:53:37 -07002813}
2814
Mat Martineauf80842a2012-05-17 20:53:46 -07002815static void l2cap_pass_to_tx_fbit(struct l2cap_chan *chan,
2816 struct l2cap_ctrl *control)
2817{
2818 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002819 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_FBIT);
Mat Martineauf80842a2012-05-17 20:53:46 -07002820}
2821
Linus Torvalds1da177e2005-04-16 15:20:36 -07002822/* Copy frame to all raw sockets on that connection */
2823static void l2cap_raw_recv(struct l2cap_conn *conn, struct sk_buff *skb)
2824{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002825 struct sk_buff *nskb;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03002826 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002827
2828 BT_DBG("conn %p", conn);
2829
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002830 mutex_lock(&conn->chan_lock);
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002831
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002832 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002833 if (chan->chan_type != L2CAP_CHAN_RAW)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002834 continue;
2835
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002836 /* Don't send frame to the channel it came from */
2837 if (bt_cb(skb)->chan == chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002838 continue;
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002839
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002840 nskb = skb_clone(skb, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03002841 if (!nskb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002842 continue;
Gustavo Padovan80b98022012-05-27 22:27:51 -03002843 if (chan->ops->recv(chan, nskb))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002844 kfree_skb(nskb);
2845 }
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002846
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002847 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002848}
2849
2850/* ---- L2CAP signalling commands ---- */
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002851static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn, u8 code,
2852 u8 ident, u16 dlen, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002853{
2854 struct sk_buff *skb, **frag;
2855 struct l2cap_cmd_hdr *cmd;
2856 struct l2cap_hdr *lh;
2857 int len, count;
2858
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002859 BT_DBG("conn %p, code 0x%2.2x, ident 0x%2.2x, len %u",
2860 conn, code, ident, dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002861
Anderson Lizardo300b9622013-06-02 16:30:40 -04002862 if (conn->mtu < L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE)
2863 return NULL;
2864
Linus Torvalds1da177e2005-04-16 15:20:36 -07002865 len = L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE + dlen;
2866 count = min_t(unsigned int, conn->mtu, len);
2867
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002868 skb = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002869 if (!skb)
2870 return NULL;
2871
2872 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002873 lh->len = cpu_to_le16(L2CAP_CMD_HDR_SIZE + dlen);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002874
2875 if (conn->hcon->type == LE_LINK)
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002876 lh->cid = cpu_to_le16(L2CAP_CID_LE_SIGNALING);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002877 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002878 lh->cid = cpu_to_le16(L2CAP_CID_SIGNALING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002879
2880 cmd = (struct l2cap_cmd_hdr *) skb_put(skb, L2CAP_CMD_HDR_SIZE);
2881 cmd->code = code;
2882 cmd->ident = ident;
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002883 cmd->len = cpu_to_le16(dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002884
2885 if (dlen) {
2886 count -= L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE;
2887 memcpy(skb_put(skb, count), data, count);
2888 data += count;
2889 }
2890
2891 len -= skb->len;
2892
2893 /* Continuation fragments (no L2CAP header) */
2894 frag = &skb_shinfo(skb)->frag_list;
2895 while (len) {
2896 count = min_t(unsigned int, conn->mtu, len);
2897
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002898 *frag = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002899 if (!*frag)
2900 goto fail;
2901
2902 memcpy(skb_put(*frag, count), data, count);
2903
2904 len -= count;
2905 data += count;
2906
2907 frag = &(*frag)->next;
2908 }
2909
2910 return skb;
2911
2912fail:
2913 kfree_skb(skb);
2914 return NULL;
2915}
2916
Gustavo Padovan2d792812012-10-06 10:07:01 +01002917static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen,
2918 unsigned long *val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002919{
2920 struct l2cap_conf_opt *opt = *ptr;
2921 int len;
2922
2923 len = L2CAP_CONF_OPT_SIZE + opt->len;
2924 *ptr += len;
2925
2926 *type = opt->type;
2927 *olen = opt->len;
2928
2929 switch (opt->len) {
2930 case 1:
2931 *val = *((u8 *) opt->val);
2932 break;
2933
2934 case 2:
steven miaobfaaeb32010-10-16 18:29:47 -04002935 *val = get_unaligned_le16(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002936 break;
2937
2938 case 4:
steven miaobfaaeb32010-10-16 18:29:47 -04002939 *val = get_unaligned_le32(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002940 break;
2941
2942 default:
2943 *val = (unsigned long) opt->val;
2944 break;
2945 }
2946
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002947 BT_DBG("type 0x%2.2x len %u val 0x%lx", *type, opt->len, *val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002948 return len;
2949}
2950
Linus Torvalds1da177e2005-04-16 15:20:36 -07002951static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val)
2952{
2953 struct l2cap_conf_opt *opt = *ptr;
2954
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002955 BT_DBG("type 0x%2.2x len %u val 0x%lx", type, len, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002956
2957 opt->type = type;
2958 opt->len = len;
2959
2960 switch (len) {
2961 case 1:
2962 *((u8 *) opt->val) = val;
2963 break;
2964
2965 case 2:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02002966 put_unaligned_le16(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002967 break;
2968
2969 case 4:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02002970 put_unaligned_le32(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002971 break;
2972
2973 default:
2974 memcpy(opt->val, (void *) val, len);
2975 break;
2976 }
2977
2978 *ptr += L2CAP_CONF_OPT_SIZE + len;
2979}
2980
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03002981static void l2cap_add_opt_efs(void **ptr, struct l2cap_chan *chan)
2982{
2983 struct l2cap_conf_efs efs;
2984
Szymon Janc1ec918c2011-11-16 09:32:21 +01002985 switch (chan->mode) {
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03002986 case L2CAP_MODE_ERTM:
2987 efs.id = chan->local_id;
2988 efs.stype = chan->local_stype;
2989 efs.msdu = cpu_to_le16(chan->local_msdu);
2990 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002991 efs.acc_lat = cpu_to_le32(L2CAP_DEFAULT_ACC_LAT);
2992 efs.flush_to = cpu_to_le32(L2CAP_EFS_DEFAULT_FLUSH_TO);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03002993 break;
2994
2995 case L2CAP_MODE_STREAMING:
2996 efs.id = 1;
2997 efs.stype = L2CAP_SERV_BESTEFFORT;
2998 efs.msdu = cpu_to_le16(chan->local_msdu);
2999 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
3000 efs.acc_lat = 0;
3001 efs.flush_to = 0;
3002 break;
3003
3004 default:
3005 return;
3006 }
3007
3008 l2cap_add_conf_opt(ptr, L2CAP_CONF_EFS, sizeof(efs),
Andrei Emeltchenko8936fa62012-10-08 11:14:41 +03003009 (unsigned long) &efs);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003010}
3011
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003012static void l2cap_ack_timeout(struct work_struct *work)
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003013{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003014 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau03625202012-05-17 20:53:51 -07003015 ack_timer.work);
3016 u16 frames_to_ack;
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003017
Gustavo F. Padovan2fb9b3d2011-12-22 16:56:05 -02003018 BT_DBG("chan %p", chan);
3019
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003020 l2cap_chan_lock(chan);
3021
Mat Martineau03625202012-05-17 20:53:51 -07003022 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
3023 chan->last_acked_seq);
3024
3025 if (frames_to_ack)
3026 l2cap_send_rr_or_rnr(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003027
3028 l2cap_chan_unlock(chan);
Szymon Janc09bfb2e2012-01-11 10:59:49 +01003029 l2cap_chan_put(chan);
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003030}
3031
Andrei Emeltchenko466f8002012-05-29 13:59:01 +03003032int l2cap_ertm_init(struct l2cap_chan *chan)
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003033{
Mat Martineau3c588192012-04-11 10:48:42 -07003034 int err;
3035
Mat Martineau105bdf92012-04-27 16:50:48 -07003036 chan->next_tx_seq = 0;
3037 chan->expected_tx_seq = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003038 chan->expected_ack_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003039 chan->unacked_frames = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003040 chan->buffer_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003041 chan->frames_sent = 0;
Mat Martineau105bdf92012-04-27 16:50:48 -07003042 chan->last_acked_seq = 0;
3043 chan->sdu = NULL;
3044 chan->sdu_last_frag = NULL;
3045 chan->sdu_len = 0;
3046
Mat Martineaud34c34f2012-05-14 14:49:27 -07003047 skb_queue_head_init(&chan->tx_q);
3048
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003049 chan->local_amp_id = AMP_ID_BREDR;
3050 chan->move_id = AMP_ID_BREDR;
Mat Martineau08333282012-10-23 15:24:06 -07003051 chan->move_state = L2CAP_MOVE_STABLE;
3052 chan->move_role = L2CAP_MOVE_ROLE_NONE;
3053
Mat Martineau105bdf92012-04-27 16:50:48 -07003054 if (chan->mode != L2CAP_MODE_ERTM)
3055 return 0;
3056
3057 chan->rx_state = L2CAP_RX_STATE_RECV;
3058 chan->tx_state = L2CAP_TX_STATE_XMIT;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003059
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003060 INIT_DELAYED_WORK(&chan->retrans_timer, l2cap_retrans_timeout);
3061 INIT_DELAYED_WORK(&chan->monitor_timer, l2cap_monitor_timeout);
3062 INIT_DELAYED_WORK(&chan->ack_timer, l2cap_ack_timeout);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003063
Gustavo F. Padovanf1c67752011-03-25 20:36:10 -03003064 skb_queue_head_init(&chan->srej_q);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03003065
Mat Martineau3c588192012-04-11 10:48:42 -07003066 err = l2cap_seq_list_init(&chan->srej_list, chan->tx_win);
3067 if (err < 0)
3068 return err;
3069
Mat Martineau9dc9aff2012-05-17 16:20:14 -07003070 err = l2cap_seq_list_init(&chan->retrans_list, chan->remote_tx_win);
3071 if (err < 0)
3072 l2cap_seq_list_free(&chan->srej_list);
3073
3074 return err;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003075}
3076
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003077static inline __u8 l2cap_select_mode(__u8 mode, __u16 remote_feat_mask)
3078{
3079 switch (mode) {
3080 case L2CAP_MODE_STREAMING:
3081 case L2CAP_MODE_ERTM:
3082 if (l2cap_mode_supported(mode, remote_feat_mask))
3083 return mode;
3084 /* fall through */
3085 default:
3086 return L2CAP_MODE_BASIC;
3087 }
3088}
3089
Marcel Holtmann848566b2013-10-01 22:59:22 -07003090static inline bool __l2cap_ews_supported(struct l2cap_conn *conn)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003091{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003092 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003093}
3094
Marcel Holtmann848566b2013-10-01 22:59:22 -07003095static inline bool __l2cap_efs_supported(struct l2cap_conn *conn)
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003096{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003097 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_FLOW;
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003098}
3099
Mat Martineau36c86c82012-10-23 15:24:20 -07003100static void __l2cap_set_ertm_timeouts(struct l2cap_chan *chan,
3101 struct l2cap_conf_rfc *rfc)
3102{
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003103 if (chan->local_amp_id != AMP_ID_BREDR && chan->hs_hcon) {
Mat Martineau36c86c82012-10-23 15:24:20 -07003104 u64 ertm_to = chan->hs_hcon->hdev->amp_be_flush_to;
3105
3106 /* Class 1 devices have must have ERTM timeouts
3107 * exceeding the Link Supervision Timeout. The
3108 * default Link Supervision Timeout for AMP
3109 * controllers is 10 seconds.
3110 *
3111 * Class 1 devices use 0xffffffff for their
3112 * best-effort flush timeout, so the clamping logic
3113 * will result in a timeout that meets the above
3114 * requirement. ERTM timeouts are 16-bit values, so
3115 * the maximum timeout is 65.535 seconds.
3116 */
3117
3118 /* Convert timeout to milliseconds and round */
3119 ertm_to = DIV_ROUND_UP_ULL(ertm_to, 1000);
3120
3121 /* This is the recommended formula for class 2 devices
3122 * that start ERTM timers when packets are sent to the
3123 * controller.
3124 */
3125 ertm_to = 3 * ertm_to + 500;
3126
3127 if (ertm_to > 0xffff)
3128 ertm_to = 0xffff;
3129
3130 rfc->retrans_timeout = cpu_to_le16((u16) ertm_to);
3131 rfc->monitor_timeout = rfc->retrans_timeout;
3132 } else {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003133 rfc->retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO);
3134 rfc->monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO);
Mat Martineau36c86c82012-10-23 15:24:20 -07003135 }
3136}
3137
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003138static inline void l2cap_txwin_setup(struct l2cap_chan *chan)
3139{
3140 if (chan->tx_win > L2CAP_DEFAULT_TX_WINDOW &&
Marcel Holtmann848566b2013-10-01 22:59:22 -07003141 __l2cap_ews_supported(chan->conn)) {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003142 /* use extended control field */
3143 set_bit(FLAG_EXT_CTRL, &chan->flags);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003144 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
3145 } else {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003146 chan->tx_win = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003147 L2CAP_DEFAULT_TX_WINDOW);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003148 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
3149 }
Mat Martineauc20f8e32012-07-10 05:47:07 -07003150 chan->ack_win = chan->tx_win;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003151}
3152
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003153static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003154{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003155 struct l2cap_conf_req *req = data;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003156 struct l2cap_conf_rfc rfc = { .mode = chan->mode };
Linus Torvalds1da177e2005-04-16 15:20:36 -07003157 void *ptr = req->data;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003158 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003159
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03003160 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003161
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003162 if (chan->num_conf_req || chan->num_conf_rsp)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003163 goto done;
3164
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003165 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003166 case L2CAP_MODE_STREAMING:
3167 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003168 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state))
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003169 break;
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003170
Marcel Holtmann848566b2013-10-01 22:59:22 -07003171 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003172 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3173
Gustavo F. Padovan2ba13ed2010-06-09 16:39:05 -03003174 /* fall through */
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003175 default:
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003176 chan->mode = l2cap_select_mode(rfc.mode, chan->conn->feat_mask);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003177 break;
3178 }
3179
3180done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003181 if (chan->imtu != L2CAP_DEFAULT_MTU)
3182 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovan7990681c2011-01-24 16:01:43 -02003183
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003184 switch (chan->mode) {
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003185 case L2CAP_MODE_BASIC:
Marcel Holtmann6fea7ad2014-07-09 11:53:35 +02003186 if (disable_ertm)
3187 break;
3188
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003189 if (!(chan->conn->feat_mask & L2CAP_FEAT_ERTM) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003190 !(chan->conn->feat_mask & L2CAP_FEAT_STREAMING))
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003191 break;
3192
Gustavo F. Padovan62547752010-06-08 20:05:31 -03003193 rfc.mode = L2CAP_MODE_BASIC;
3194 rfc.txwin_size = 0;
3195 rfc.max_transmit = 0;
3196 rfc.retrans_timeout = 0;
3197 rfc.monitor_timeout = 0;
3198 rfc.max_pdu_size = 0;
3199
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003200 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003201 (unsigned long) &rfc);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003202 break;
3203
3204 case L2CAP_MODE_ERTM:
3205 rfc.mode = L2CAP_MODE_ERTM;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003206 rfc.max_transmit = chan->max_tx;
Mat Martineau36c86c82012-10-23 15:24:20 -07003207
3208 __l2cap_set_ertm_timeouts(chan, &rfc);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003209
3210 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003211 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3212 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003213 rfc.max_pdu_size = cpu_to_le16(size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003214
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003215 l2cap_txwin_setup(chan);
3216
3217 rfc.txwin_size = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003218 L2CAP_DEFAULT_TX_WINDOW);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003219
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003220 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003221 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003222
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003223 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3224 l2cap_add_opt_efs(&ptr, chan);
3225
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003226 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3227 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003228 chan->tx_win);
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003229
3230 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3231 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003232 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003233 chan->fcs = L2CAP_FCS_NONE;
3234 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3235 chan->fcs);
3236 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003237 break;
3238
3239 case L2CAP_MODE_STREAMING:
Mat Martineau273759e2012-05-17 20:53:53 -07003240 l2cap_txwin_setup(chan);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003241 rfc.mode = L2CAP_MODE_STREAMING;
3242 rfc.txwin_size = 0;
3243 rfc.max_transmit = 0;
3244 rfc.retrans_timeout = 0;
3245 rfc.monitor_timeout = 0;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003246
3247 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003248 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3249 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003250 rfc.max_pdu_size = cpu_to_le16(size);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003251
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003252 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003253 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003254
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003255 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3256 l2cap_add_opt_efs(&ptr, chan);
3257
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003258 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3259 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003260 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003261 chan->fcs = L2CAP_FCS_NONE;
3262 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3263 chan->fcs);
3264 }
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003265 break;
3266 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003267
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003268 req->dcid = cpu_to_le16(chan->dcid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003269 req->flags = cpu_to_le16(0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003270
3271 return ptr - data;
3272}
3273
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003274static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003275{
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003276 struct l2cap_conf_rsp *rsp = data;
3277 void *ptr = rsp->data;
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003278 void *req = chan->conf_req;
3279 int len = chan->conf_len;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003280 int type, hint, olen;
3281 unsigned long val;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003282 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003283 struct l2cap_conf_efs efs;
3284 u8 remote_efs = 0;
Marcel Holtmann861d6882007-10-20 13:37:06 +02003285 u16 mtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003286 u16 result = L2CAP_CONF_SUCCESS;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003287 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003288
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003289 BT_DBG("chan %p", chan);
Marcel Holtmann820ae1b2006-11-18 22:15:00 +01003290
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003291 while (len >= L2CAP_CONF_OPT_SIZE) {
3292 len -= l2cap_get_conf_opt(&req, &type, &olen, &val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003293
Gustavo F. Padovan589d2742009-04-20 01:31:07 -03003294 hint = type & L2CAP_CONF_HINT;
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07003295 type &= L2CAP_CONF_MASK;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003296
3297 switch (type) {
3298 case L2CAP_CONF_MTU:
Marcel Holtmann861d6882007-10-20 13:37:06 +02003299 mtu = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003300 break;
3301
3302 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003303 chan->flush_to = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003304 break;
3305
3306 case L2CAP_CONF_QOS:
3307 break;
3308
Marcel Holtmann6464f352007-10-20 13:39:51 +02003309 case L2CAP_CONF_RFC:
3310 if (olen == sizeof(rfc))
3311 memcpy(&rfc, (void *) val, olen);
3312 break;
3313
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003314 case L2CAP_CONF_FCS:
3315 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003316 set_bit(CONF_RECV_NO_FCS, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003317 break;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003318
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003319 case L2CAP_CONF_EFS:
3320 remote_efs = 1;
3321 if (olen == sizeof(efs))
3322 memcpy(&efs, (void *) val, olen);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003323 break;
3324
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003325 case L2CAP_CONF_EWS:
Marcel Holtmann848566b2013-10-01 22:59:22 -07003326 if (!chan->conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003327 return -ECONNREFUSED;
3328
3329 set_bit(FLAG_EXT_CTRL, &chan->flags);
3330 set_bit(CONF_EWS_RECV, &chan->conf_state);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003331 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003332 chan->remote_tx_win = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003333 break;
3334
3335 default:
3336 if (hint)
3337 break;
3338
3339 result = L2CAP_CONF_UNKNOWN;
3340 *((u8 *) ptr++) = type;
3341 break;
3342 }
3343 }
3344
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003345 if (chan->num_conf_rsp || chan->num_conf_req > 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003346 goto done;
3347
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003348 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003349 case L2CAP_MODE_STREAMING:
3350 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003351 if (!test_bit(CONF_STATE2_DEVICE, &chan->conf_state)) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003352 chan->mode = l2cap_select_mode(rfc.mode,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003353 chan->conn->feat_mask);
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003354 break;
3355 }
3356
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003357 if (remote_efs) {
Marcel Holtmann848566b2013-10-01 22:59:22 -07003358 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003359 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3360 else
3361 return -ECONNREFUSED;
3362 }
3363
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003364 if (chan->mode != rfc.mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003365 return -ECONNREFUSED;
Gustavo F. Padovan742e5192010-06-08 19:09:48 -03003366
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003367 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003368 }
3369
3370done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003371 if (chan->mode != rfc.mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003372 result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003373 rfc.mode = chan->mode;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003374
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003375 if (chan->num_conf_rsp == 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003376 return -ECONNREFUSED;
3377
Gustavo Padovan2d792812012-10-06 10:07:01 +01003378 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3379 (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003380 }
3381
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003382 if (result == L2CAP_CONF_SUCCESS) {
3383 /* Configure output options and let the other side know
3384 * which ones we don't like. */
3385
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003386 if (mtu < L2CAP_DEFAULT_MIN_MTU)
3387 result = L2CAP_CONF_UNACCEPT;
3388 else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003389 chan->omtu = mtu;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003390 set_bit(CONF_MTU_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003391 }
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003392 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->omtu);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003393
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003394 if (remote_efs) {
3395 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003396 efs.stype != L2CAP_SERV_NOTRAFIC &&
3397 efs.stype != chan->local_stype) {
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003398
3399 result = L2CAP_CONF_UNACCEPT;
3400
3401 if (chan->num_conf_req >= 1)
3402 return -ECONNREFUSED;
3403
3404 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003405 sizeof(efs),
3406 (unsigned long) &efs);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003407 } else {
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003408 /* Send PENDING Conf Rsp */
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003409 result = L2CAP_CONF_PENDING;
3410 set_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003411 }
3412 }
3413
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003414 switch (rfc.mode) {
3415 case L2CAP_MODE_BASIC:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003416 chan->fcs = L2CAP_FCS_NONE;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003417 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003418 break;
3419
3420 case L2CAP_MODE_ERTM:
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003421 if (!test_bit(CONF_EWS_RECV, &chan->conf_state))
3422 chan->remote_tx_win = rfc.txwin_size;
3423 else
3424 rfc.txwin_size = L2CAP_DEFAULT_TX_WINDOW;
3425
Gustavo F. Padovan2c03a7a2011-03-25 20:15:28 -03003426 chan->remote_max_tx = rfc.max_transmit;
Mat Martineau86b1b262010-08-05 15:54:22 -07003427
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003428 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003429 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3430 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003431 rfc.max_pdu_size = cpu_to_le16(size);
3432 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003433
Mat Martineau36c86c82012-10-23 15:24:20 -07003434 __l2cap_set_ertm_timeouts(chan, &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003435
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003436 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003437
3438 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003439 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003440
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003441 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3442 chan->remote_id = efs.id;
3443 chan->remote_stype = efs.stype;
3444 chan->remote_msdu = le16_to_cpu(efs.msdu);
3445 chan->remote_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003446 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003447 chan->remote_acc_lat =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003448 le32_to_cpu(efs.acc_lat);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003449 chan->remote_sdu_itime =
3450 le32_to_cpu(efs.sdu_itime);
3451 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003452 sizeof(efs),
3453 (unsigned long) &efs);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003454 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003455 break;
3456
3457 case L2CAP_MODE_STREAMING:
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003458 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003459 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3460 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003461 rfc.max_pdu_size = cpu_to_le16(size);
3462 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003463
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003464 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003465
Gustavo Padovan2d792812012-10-06 10:07:01 +01003466 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3467 (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003468
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003469 break;
3470
3471 default:
Marcel Holtmann6464f352007-10-20 13:39:51 +02003472 result = L2CAP_CONF_UNACCEPT;
3473
3474 memset(&rfc, 0, sizeof(rfc));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003475 rfc.mode = chan->mode;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003476 }
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003477
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003478 if (result == L2CAP_CONF_SUCCESS)
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003479 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003480 }
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003481 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003482 rsp->result = cpu_to_le16(result);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003483 rsp->flags = cpu_to_le16(0);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003484
3485 return ptr - data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003486}
3487
Gustavo Padovan2d792812012-10-06 10:07:01 +01003488static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len,
3489 void *data, u16 *result)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003490{
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003491 struct l2cap_conf_req *req = data;
3492 void *ptr = req->data;
3493 int type, olen;
3494 unsigned long val;
Mat Martineau36e999a2011-12-08 17:23:21 -08003495 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003496 struct l2cap_conf_efs efs;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003497
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003498 BT_DBG("chan %p, rsp %p, len %d, req %p", chan, rsp, len, data);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003499
3500 while (len >= L2CAP_CONF_OPT_SIZE) {
3501 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3502
3503 switch (type) {
3504 case L2CAP_CONF_MTU:
3505 if (val < L2CAP_DEFAULT_MIN_MTU) {
3506 *result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003507 chan->imtu = L2CAP_DEFAULT_MIN_MTU;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003508 } else
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003509 chan->imtu = val;
3510 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003511 break;
3512
3513 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003514 chan->flush_to = val;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003515 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003516 2, chan->flush_to);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003517 break;
3518
3519 case L2CAP_CONF_RFC:
3520 if (olen == sizeof(rfc))
3521 memcpy(&rfc, (void *)val, olen);
3522
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003523 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003524 rfc.mode != chan->mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003525 return -ECONNREFUSED;
3526
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003527 chan->fcs = 0;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003528
3529 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003530 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003531 break;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003532
3533 case L2CAP_CONF_EWS:
Mat Martineauc20f8e32012-07-10 05:47:07 -07003534 chan->ack_win = min_t(u16, val, chan->ack_win);
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003535 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Mat Martineauc20f8e32012-07-10 05:47:07 -07003536 chan->tx_win);
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003537 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003538
3539 case L2CAP_CONF_EFS:
3540 if (olen == sizeof(efs))
3541 memcpy(&efs, (void *)val, olen);
3542
3543 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003544 efs.stype != L2CAP_SERV_NOTRAFIC &&
3545 efs.stype != chan->local_stype)
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003546 return -ECONNREFUSED;
3547
Gustavo Padovan2d792812012-10-06 10:07:01 +01003548 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS, sizeof(efs),
3549 (unsigned long) &efs);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003550 break;
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003551
3552 case L2CAP_CONF_FCS:
3553 if (*result == L2CAP_CONF_PENDING)
3554 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003555 set_bit(CONF_RECV_NO_FCS,
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003556 &chan->conf_state);
3557 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003558 }
3559 }
3560
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003561 if (chan->mode == L2CAP_MODE_BASIC && chan->mode != rfc.mode)
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003562 return -ECONNREFUSED;
3563
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003564 chan->mode = rfc.mode;
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003565
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003566 if (*result == L2CAP_CONF_SUCCESS || *result == L2CAP_CONF_PENDING) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003567 switch (rfc.mode) {
3568 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003569 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3570 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
3571 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003572 if (!test_bit(FLAG_EXT_CTRL, &chan->flags))
3573 chan->ack_win = min_t(u16, chan->ack_win,
3574 rfc.txwin_size);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003575
3576 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3577 chan->local_msdu = le16_to_cpu(efs.msdu);
3578 chan->local_sdu_itime =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003579 le32_to_cpu(efs.sdu_itime);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003580 chan->local_acc_lat = le32_to_cpu(efs.acc_lat);
3581 chan->local_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003582 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003583 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003584 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003585
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003586 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003587 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003588 }
3589 }
3590
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003591 req->dcid = cpu_to_le16(chan->dcid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003592 req->flags = cpu_to_le16(0);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003593
3594 return ptr - data;
3595}
3596
Gustavo Padovan2d792812012-10-06 10:07:01 +01003597static int l2cap_build_conf_rsp(struct l2cap_chan *chan, void *data,
3598 u16 result, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003599{
3600 struct l2cap_conf_rsp *rsp = data;
3601 void *ptr = rsp->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003602
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003603 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003604
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003605 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003606 rsp->result = cpu_to_le16(result);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003607 rsp->flags = cpu_to_le16(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003608
3609 return ptr - data;
3610}
3611
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003612void __l2cap_le_connect_rsp_defer(struct l2cap_chan *chan)
3613{
3614 struct l2cap_le_conn_rsp rsp;
3615 struct l2cap_conn *conn = chan->conn;
3616
3617 BT_DBG("chan %p", chan);
3618
3619 rsp.dcid = cpu_to_le16(chan->scid);
3620 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02003621 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03003622 rsp.credits = cpu_to_le16(chan->rx_credits);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003623 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003624
3625 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp),
3626 &rsp);
3627}
3628
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003629void __l2cap_connect_rsp_defer(struct l2cap_chan *chan)
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003630{
3631 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003632 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003633 u8 buf[128];
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003634 u8 rsp_code;
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003635
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003636 rsp.scid = cpu_to_le16(chan->dcid);
3637 rsp.dcid = cpu_to_le16(chan->scid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003638 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
3639 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003640
3641 if (chan->hs_hcon)
3642 rsp_code = L2CAP_CREATE_CHAN_RSP;
3643 else
3644 rsp_code = L2CAP_CONN_RSP;
3645
3646 BT_DBG("chan %p rsp_code %u", chan, rsp_code);
3647
3648 l2cap_send_cmd(conn, chan->ident, rsp_code, sizeof(rsp), &rsp);
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003649
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003650 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003651 return;
3652
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003653 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003654 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003655 chan->num_conf_req++;
3656}
3657
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003658static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len)
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003659{
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003660 int type, olen;
3661 unsigned long val;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003662 /* Use sane default values in case a misbehaving remote device
3663 * did not send an RFC or extended window size option.
3664 */
3665 u16 txwin_ext = chan->ack_win;
3666 struct l2cap_conf_rfc rfc = {
3667 .mode = chan->mode,
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003668 .retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO),
3669 .monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO),
Mat Martineauc20f8e32012-07-10 05:47:07 -07003670 .max_pdu_size = cpu_to_le16(chan->imtu),
3671 .txwin_size = min_t(u16, chan->ack_win, L2CAP_DEFAULT_TX_WINDOW),
3672 };
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003673
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003674 BT_DBG("chan %p, rsp %p, len %d", chan, rsp, len);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003675
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003676 if ((chan->mode != L2CAP_MODE_ERTM) && (chan->mode != L2CAP_MODE_STREAMING))
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003677 return;
3678
3679 while (len >= L2CAP_CONF_OPT_SIZE) {
3680 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3681
Mat Martineauc20f8e32012-07-10 05:47:07 -07003682 switch (type) {
3683 case L2CAP_CONF_RFC:
3684 if (olen == sizeof(rfc))
3685 memcpy(&rfc, (void *)val, olen);
Szymon Janc8f321f82012-06-08 11:33:33 +02003686 break;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003687 case L2CAP_CONF_EWS:
3688 txwin_ext = val;
3689 break;
3690 }
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003691 }
3692
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003693 switch (rfc.mode) {
3694 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003695 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3696 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003697 chan->mps = le16_to_cpu(rfc.max_pdu_size);
3698 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3699 chan->ack_win = min_t(u16, chan->ack_win, txwin_ext);
3700 else
3701 chan->ack_win = min_t(u16, chan->ack_win,
3702 rfc.txwin_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003703 break;
3704 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003705 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003706 }
3707}
3708
Gustavo Padovan2d792812012-10-06 10:07:01 +01003709static inline int l2cap_command_rej(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003710 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3711 u8 *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003712{
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003713 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003714
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003715 if (cmd_len < sizeof(*rej))
3716 return -EPROTO;
3717
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003718 if (rej->reason != L2CAP_REJ_NOT_UNDERSTOOD)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003719 return 0;
3720
3721 if ((conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003722 cmd->ident == conn->info_ident) {
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02003723 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann984947d2009-02-06 23:35:19 +01003724
3725 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01003726 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01003727
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003728 l2cap_conn_start(conn);
3729 }
3730
3731 return 0;
3732}
3733
Mat Martineau17009152012-10-23 15:24:07 -07003734static struct l2cap_chan *l2cap_connect(struct l2cap_conn *conn,
3735 struct l2cap_cmd_hdr *cmd,
3736 u8 *data, u8 rsp_code, u8 amp_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003737{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003738 struct l2cap_conn_req *req = (struct l2cap_conn_req *) data;
3739 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003740 struct l2cap_chan *chan = NULL, *pchan;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003741 int result, status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003742
3743 u16 dcid = 0, scid = __le16_to_cpu(req->scid);
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003744 __le16 psm = req->psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003745
Andrei Emeltchenko097db762012-03-09 14:16:17 +02003746 BT_DBG("psm 0x%2.2x scid 0x%4.4x", __le16_to_cpu(psm), scid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003747
3748 /* Check if we have socket listening on psm */
Marcel Holtmann6f59b902013-10-13 05:24:01 -07003749 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03003750 &conn->hcon->dst, ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003751 if (!pchan) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003752 result = L2CAP_CR_BAD_PSM;
3753 goto sendresp;
3754 }
3755
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003756 mutex_lock(&conn->chan_lock);
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003757 l2cap_chan_lock(pchan);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00003758
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003759 /* Check if the ACL is secure enough (if not SDP) */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003760 if (psm != cpu_to_le16(L2CAP_PSM_SDP) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003761 !hci_conn_check_link_mode(conn->hcon)) {
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02003762 conn->disc_reason = HCI_ERROR_AUTH_FAILURE;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003763 result = L2CAP_CR_SEC_BLOCK;
3764 goto response;
3765 }
3766
Linus Torvalds1da177e2005-04-16 15:20:36 -07003767 result = L2CAP_CR_NO_MEM;
3768
Gustavo Padovan2dfa1002012-05-27 22:27:58 -03003769 /* Check if we already have channel with that dcid */
3770 if (__l2cap_get_chan_by_dcid(conn, scid))
3771 goto response;
3772
Gustavo Padovan80b98022012-05-27 22:27:51 -03003773 chan = pchan->ops->new_connection(pchan);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03003774 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003775 goto response;
3776
Syam Sidhardhan330b6c12013-08-06 01:59:12 +09003777 /* For certain devices (ex: HID mouse), support for authentication,
3778 * pairing and bonding is optional. For such devices, inorder to avoid
3779 * the ACL alive for too long after L2CAP disconnection, reset the ACL
3780 * disc_timeout back to HCI_DISCONN_TIMEOUT during L2CAP connect.
3781 */
3782 conn->hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
3783
Marcel Holtmann7eafc592013-10-13 08:12:47 -07003784 bacpy(&chan->src, &conn->hcon->src);
3785 bacpy(&chan->dst, &conn->hcon->dst);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -07003786 chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type);
3787 chan->dst_type = bdaddr_type(conn->hcon, conn->hcon->dst_type);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003788 chan->psm = psm;
3789 chan->dcid = scid;
Mat Martineau17009152012-10-23 15:24:07 -07003790 chan->local_amp_id = amp_id;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003791
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003792 __l2cap_chan_add(conn, chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003793
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003794 dcid = chan->scid;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003795
Gustavo Padovan8d836d72013-10-15 19:24:47 -03003796 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003797
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003798 chan->ident = cmd->ident;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003799
Marcel Holtmann984947d2009-02-06 23:35:19 +01003800 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) {
Johan Hedberge7cafc42014-07-17 15:35:38 +03003801 if (l2cap_chan_check_security(chan, false)) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07003802 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003803 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003804 result = L2CAP_CR_PEND;
3805 status = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08003806 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003807 } else {
Mat Martineau17009152012-10-23 15:24:07 -07003808 /* Force pending result for AMP controllers.
3809 * The connection will succeed after the
3810 * physical link is up.
3811 */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003812 if (amp_id == AMP_ID_BREDR) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003813 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau17009152012-10-23 15:24:07 -07003814 result = L2CAP_CR_SUCCESS;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003815 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003816 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003817 result = L2CAP_CR_PEND;
Mat Martineau17009152012-10-23 15:24:07 -07003818 }
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003819 status = L2CAP_CS_NO_INFO;
3820 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003821 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003822 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003823 result = L2CAP_CR_PEND;
3824 status = L2CAP_CS_AUTHEN_PEND;
3825 }
3826 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003827 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003828 result = L2CAP_CR_PEND;
3829 status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003830 }
3831
Linus Torvalds1da177e2005-04-16 15:20:36 -07003832response:
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003833 l2cap_chan_unlock(pchan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003834 mutex_unlock(&conn->chan_lock);
Johan Hedberga24cce12014-08-07 22:56:42 +03003835 l2cap_chan_put(pchan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003836
3837sendresp:
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003838 rsp.scid = cpu_to_le16(scid);
3839 rsp.dcid = cpu_to_le16(dcid);
3840 rsp.result = cpu_to_le16(result);
3841 rsp.status = cpu_to_le16(status);
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003842 l2cap_send_cmd(conn, cmd->ident, rsp_code, sizeof(rsp), &rsp);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003843
3844 if (result == L2CAP_CR_PEND && status == L2CAP_CS_NO_INFO) {
3845 struct l2cap_info_req info;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003846 info.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003847
3848 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
3849 conn->info_ident = l2cap_get_ident(conn);
3850
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08003851 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003852
Gustavo Padovan2d792812012-10-06 10:07:01 +01003853 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
3854 sizeof(info), &info);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003855 }
3856
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003857 if (chan && !test_bit(CONF_REQ_SENT, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003858 result == L2CAP_CR_SUCCESS) {
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003859 u8 buf[128];
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003860 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003861 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003862 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003863 chan->num_conf_req++;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003864 }
Mat Martineau17009152012-10-23 15:24:07 -07003865
3866 return chan;
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003867}
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003868
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003869static int l2cap_connect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003870 struct l2cap_cmd_hdr *cmd, u16 cmd_len, u8 *data)
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003871{
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303872 struct hci_dev *hdev = conn->hcon->hdev;
3873 struct hci_conn *hcon = conn->hcon;
3874
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003875 if (cmd_len < sizeof(struct l2cap_conn_req))
3876 return -EPROTO;
3877
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303878 hci_dev_lock(hdev);
3879 if (test_bit(HCI_MGMT, &hdev->dev_flags) &&
3880 !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &hcon->flags))
3881 mgmt_device_connected(hdev, &hcon->dst, hcon->type,
3882 hcon->dst_type, 0, NULL, 0,
3883 hcon->dev_class);
3884 hci_dev_unlock(hdev);
3885
Gustavo Padovan300229f2012-10-12 19:40:40 +08003886 l2cap_connect(conn, cmd, data, L2CAP_CONN_RSP, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003887 return 0;
3888}
3889
Mat Martineau5909cf32012-10-23 15:24:08 -07003890static int l2cap_connect_create_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003891 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3892 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003893{
3894 struct l2cap_conn_rsp *rsp = (struct l2cap_conn_rsp *) data;
3895 u16 scid, dcid, result, status;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003896 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003897 u8 req[128];
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003898 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003899
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003900 if (cmd_len < sizeof(*rsp))
3901 return -EPROTO;
3902
Linus Torvalds1da177e2005-04-16 15:20:36 -07003903 scid = __le16_to_cpu(rsp->scid);
3904 dcid = __le16_to_cpu(rsp->dcid);
3905 result = __le16_to_cpu(rsp->result);
3906 status = __le16_to_cpu(rsp->status);
3907
Andrei Emeltchenko1b009c92012-02-21 12:54:54 +02003908 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 +01003909 dcid, scid, result, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003910
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003911 mutex_lock(&conn->chan_lock);
3912
Linus Torvalds1da177e2005-04-16 15:20:36 -07003913 if (scid) {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003914 chan = __l2cap_get_chan_by_scid(conn, scid);
3915 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003916 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003917 goto unlock;
3918 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003919 } else {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003920 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
3921 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003922 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003923 goto unlock;
3924 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003925 }
3926
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003927 err = 0;
3928
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003929 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003930
Linus Torvalds1da177e2005-04-16 15:20:36 -07003931 switch (result) {
3932 case L2CAP_CR_SUCCESS:
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03003933 l2cap_state_change(chan, BT_CONFIG);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003934 chan->ident = 0;
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003935 chan->dcid = dcid;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003936 clear_bit(CONF_CONNECT_PEND, &chan->conf_state);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01003937
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003938 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003939 break;
3940
Linus Torvalds1da177e2005-04-16 15:20:36 -07003941 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003942 l2cap_build_conf_req(chan, req), req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003943 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003944 break;
3945
3946 case L2CAP_CR_PEND:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003947 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003948 break;
3949
3950 default:
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003951 l2cap_chan_del(chan, ECONNREFUSED);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003952 break;
3953 }
3954
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003955 l2cap_chan_unlock(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003956
3957unlock:
3958 mutex_unlock(&conn->chan_lock);
3959
3960 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003961}
3962
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003963static inline void set_default_fcs(struct l2cap_chan *chan)
Mat Martineau8c462b62010-08-24 15:35:42 -07003964{
3965 /* FCS is enabled only in ERTM or streaming mode, if one or both
3966 * sides request it.
3967 */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003968 if (chan->mode != L2CAP_MODE_ERTM && chan->mode != L2CAP_MODE_STREAMING)
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003969 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003970 else if (!test_bit(CONF_RECV_NO_FCS, &chan->conf_state))
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003971 chan->fcs = L2CAP_FCS_CRC16;
Mat Martineau8c462b62010-08-24 15:35:42 -07003972}
3973
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03003974static void l2cap_send_efs_conf_rsp(struct l2cap_chan *chan, void *data,
3975 u8 ident, u16 flags)
3976{
3977 struct l2cap_conn *conn = chan->conn;
3978
3979 BT_DBG("conn %p chan %p ident %d flags 0x%4.4x", conn, chan, ident,
3980 flags);
3981
3982 clear_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
3983 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
3984
3985 l2cap_send_cmd(conn, ident, L2CAP_CONF_RSP,
3986 l2cap_build_conf_rsp(chan, data,
3987 L2CAP_CONF_SUCCESS, flags), data);
3988}
3989
Johan Hedberg662d6522013-10-16 11:20:47 +03003990static void cmd_reject_invalid_cid(struct l2cap_conn *conn, u8 ident,
3991 u16 scid, u16 dcid)
3992{
3993 struct l2cap_cmd_rej_cid rej;
3994
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003995 rej.reason = cpu_to_le16(L2CAP_REJ_INVALID_CID);
Johan Hedberg662d6522013-10-16 11:20:47 +03003996 rej.scid = __cpu_to_le16(scid);
3997 rej.dcid = __cpu_to_le16(dcid);
3998
3999 l2cap_send_cmd(conn, ident, L2CAP_COMMAND_REJ, sizeof(rej), &rej);
4000}
4001
Gustavo Padovan2d792812012-10-06 10:07:01 +01004002static inline int l2cap_config_req(struct l2cap_conn *conn,
4003 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4004 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004005{
4006 struct l2cap_conf_req *req = (struct l2cap_conf_req *) data;
4007 u16 dcid, flags;
4008 u8 rsp[64];
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004009 struct l2cap_chan *chan;
Mat Martineau3c588192012-04-11 10:48:42 -07004010 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004011
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004012 if (cmd_len < sizeof(*req))
4013 return -EPROTO;
4014
Linus Torvalds1da177e2005-04-16 15:20:36 -07004015 dcid = __le16_to_cpu(req->dcid);
4016 flags = __le16_to_cpu(req->flags);
4017
4018 BT_DBG("dcid 0x%4.4x flags 0x%2.2x", dcid, flags);
4019
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004020 chan = l2cap_get_chan_by_scid(conn, dcid);
Johan Hedberg662d6522013-10-16 11:20:47 +03004021 if (!chan) {
4022 cmd_reject_invalid_cid(conn, cmd->ident, dcid, 0);
4023 return 0;
4024 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004025
David S. Miller033b1142011-07-21 13:38:42 -07004026 if (chan->state != BT_CONFIG && chan->state != BT_CONNECT2) {
Johan Hedberg662d6522013-10-16 11:20:47 +03004027 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4028 chan->dcid);
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004029 goto unlock;
Gustavo F. Padovandf6bd742010-06-14 02:26:15 -03004030 }
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004031
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004032 /* Reject if config buffer is too small. */
Al Viro88219a02007-07-29 00:17:25 -07004033 len = cmd_len - sizeof(*req);
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004034 if (chan->conf_len + len > sizeof(chan->conf_req)) {
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004035 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_REJECT, flags), rsp);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004038 goto unlock;
4039 }
4040
4041 /* Store config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004042 memcpy(chan->conf_req + chan->conf_len, req->data, len);
4043 chan->conf_len += len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004044
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004045 if (flags & L2CAP_CONF_FLAG_CONTINUATION) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004046 /* Incomplete config. Send empty response. */
4047 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004048 l2cap_build_conf_rsp(chan, rsp,
4049 L2CAP_CONF_SUCCESS, flags), rsp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004050 goto unlock;
4051 }
4052
4053 /* Complete config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004054 len = l2cap_parse_conf_req(chan, rsp);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004055 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004056 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004057 goto unlock;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004058 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004059
Mat Martineau1500109b2012-10-23 15:24:15 -07004060 chan->ident = cmd->ident;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004061 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004062 chan->num_conf_rsp++;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004063
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004064 /* Reset config buffer. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004065 chan->conf_len = 0;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004066
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004067 if (!test_bit(CONF_OUTPUT_DONE, &chan->conf_state))
Marcel Holtmann876d9482007-10-20 13:35:42 +02004068 goto unlock;
4069
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004070 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004071 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004072
Mat Martineau105bdf92012-04-27 16:50:48 -07004073 if (chan->mode == L2CAP_MODE_ERTM ||
4074 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004075 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004076
Mat Martineau3c588192012-04-11 10:48:42 -07004077 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004078 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004079 else
4080 l2cap_chan_ready(chan);
4081
Marcel Holtmann876d9482007-10-20 13:35:42 +02004082 goto unlock;
4083 }
4084
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004085 if (!test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02004086 u8 buf[64];
Linus Torvalds1da177e2005-04-16 15:20:36 -07004087 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004088 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004089 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004090 }
4091
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004092 /* Got Conf Rsp PENDING from remote side and asume we sent
4093 Conf Rsp PENDING in the code above */
4094 if (test_bit(CONF_REM_CONF_PEND, &chan->conf_state) &&
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03004095 test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004096
4097 /* check compatibility */
4098
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004099 /* Send rsp for BR/EDR channel */
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004100 if (!chan->hs_hcon)
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004101 l2cap_send_efs_conf_rsp(chan, rsp, cmd->ident, flags);
4102 else
4103 chan->ident = cmd->ident;
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004104 }
4105
Linus Torvalds1da177e2005-04-16 15:20:36 -07004106unlock:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004107 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004108 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004109}
4110
Gustavo Padovan2d792812012-10-06 10:07:01 +01004111static inline int l2cap_config_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004112 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4113 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004114{
4115 struct l2cap_conf_rsp *rsp = (struct l2cap_conf_rsp *)data;
4116 u16 scid, flags, result;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004117 struct l2cap_chan *chan;
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004118 int len = cmd_len - sizeof(*rsp);
Mat Martineau3c588192012-04-11 10:48:42 -07004119 int err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004120
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004121 if (cmd_len < sizeof(*rsp))
4122 return -EPROTO;
4123
Linus Torvalds1da177e2005-04-16 15:20:36 -07004124 scid = __le16_to_cpu(rsp->scid);
4125 flags = __le16_to_cpu(rsp->flags);
4126 result = __le16_to_cpu(rsp->result);
4127
Andrei Emeltchenko61386cb2012-03-12 12:13:07 +02004128 BT_DBG("scid 0x%4.4x flags 0x%2.2x result 0x%2.2x len %d", scid, flags,
4129 result, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004130
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004131 chan = l2cap_get_chan_by_scid(conn, scid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004132 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004133 return 0;
4134
4135 switch (result) {
4136 case L2CAP_CONF_SUCCESS:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004137 l2cap_conf_rfc_get(chan, rsp->data, len);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004138 clear_bit(CONF_REM_CONF_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004139 break;
4140
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004141 case L2CAP_CONF_PENDING:
4142 set_bit(CONF_REM_CONF_PEND, &chan->conf_state);
4143
4144 if (test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
4145 char buf[64];
4146
4147 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004148 buf, &result);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004149 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004150 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004151 goto done;
4152 }
4153
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004154 if (!chan->hs_hcon) {
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004155 l2cap_send_efs_conf_rsp(chan, buf, cmd->ident,
4156 0);
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02004157 } else {
4158 if (l2cap_check_efs(chan)) {
4159 amp_create_logical_link(chan);
4160 chan->ident = cmd->ident;
4161 }
4162 }
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004163 }
4164 goto done;
4165
Linus Torvalds1da177e2005-04-16 15:20:36 -07004166 case L2CAP_CONF_UNACCEPT:
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004167 if (chan->num_conf_rsp <= L2CAP_CONF_MAX_CONF_RSP) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004168 char req[64];
4169
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004170 if (len > sizeof(req) - sizeof(struct l2cap_conf_req)) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004171 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004172 goto done;
4173 }
4174
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004175 /* throw out any old stored conf requests */
4176 result = L2CAP_CONF_SUCCESS;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03004177 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004178 req, &result);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004179 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004180 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004181 goto done;
4182 }
4183
4184 l2cap_send_cmd(conn, l2cap_get_ident(conn),
Gustavo Padovan2d792812012-10-06 10:07:01 +01004185 L2CAP_CONF_REQ, len, req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004186 chan->num_conf_req++;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004187 if (result != L2CAP_CONF_SUCCESS)
4188 goto done;
4189 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004190 }
4191
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09004192 default:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004193 l2cap_chan_set_err(chan, ECONNRESET);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +02004194
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08004195 __set_chan_timer(chan, L2CAP_DISC_REJ_TIMEOUT);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004196 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004197 goto done;
4198 }
4199
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004200 if (flags & L2CAP_CONF_FLAG_CONTINUATION)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004201 goto done;
4202
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004203 set_bit(CONF_INPUT_DONE, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004204
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004205 if (test_bit(CONF_OUTPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004206 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004207
Mat Martineau105bdf92012-04-27 16:50:48 -07004208 if (chan->mode == L2CAP_MODE_ERTM ||
4209 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004210 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004211
Mat Martineau3c588192012-04-11 10:48:42 -07004212 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004213 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004214 else
4215 l2cap_chan_ready(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004216 }
4217
4218done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004219 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004220 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004221}
4222
Gustavo Padovan2d792812012-10-06 10:07:01 +01004223static inline int l2cap_disconnect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004224 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4225 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004226{
4227 struct l2cap_disconn_req *req = (struct l2cap_disconn_req *) data;
4228 struct l2cap_disconn_rsp rsp;
4229 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004230 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004231
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004232 if (cmd_len != sizeof(*req))
4233 return -EPROTO;
4234
Linus Torvalds1da177e2005-04-16 15:20:36 -07004235 scid = __le16_to_cpu(req->scid);
4236 dcid = __le16_to_cpu(req->dcid);
4237
4238 BT_DBG("scid 0x%4.4x dcid 0x%4.4x", scid, dcid);
4239
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004240 mutex_lock(&conn->chan_lock);
4241
4242 chan = __l2cap_get_chan_by_scid(conn, dcid);
4243 if (!chan) {
4244 mutex_unlock(&conn->chan_lock);
Johan Hedberg662d6522013-10-16 11:20:47 +03004245 cmd_reject_invalid_cid(conn, cmd->ident, dcid, scid);
4246 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004247 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004248
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004249 l2cap_chan_lock(chan);
4250
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03004251 rsp.dcid = cpu_to_le16(chan->scid);
4252 rsp.scid = cpu_to_le16(chan->dcid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004253 l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp);
4254
Gustavo Padovan5ec1bbe2013-10-15 19:24:48 -03004255 chan->ops->set_shutdown(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004256
Mat Martineau61d6ef32012-04-27 16:50:50 -07004257 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004258 l2cap_chan_del(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004259
4260 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004261
Gustavo Padovan80b98022012-05-27 22:27:51 -03004262 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004263 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004264
4265 mutex_unlock(&conn->chan_lock);
4266
Linus Torvalds1da177e2005-04-16 15:20:36 -07004267 return 0;
4268}
4269
Gustavo Padovan2d792812012-10-06 10:07:01 +01004270static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004271 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4272 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004273{
4274 struct l2cap_disconn_rsp *rsp = (struct l2cap_disconn_rsp *) data;
4275 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004276 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004277
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004278 if (cmd_len != sizeof(*rsp))
4279 return -EPROTO;
4280
Linus Torvalds1da177e2005-04-16 15:20:36 -07004281 scid = __le16_to_cpu(rsp->scid);
4282 dcid = __le16_to_cpu(rsp->dcid);
4283
4284 BT_DBG("dcid 0x%4.4x scid 0x%4.4x", dcid, scid);
4285
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004286 mutex_lock(&conn->chan_lock);
4287
4288 chan = __l2cap_get_chan_by_scid(conn, scid);
4289 if (!chan) {
4290 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004291 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004292 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004293
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004294 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004295
Mat Martineau61d6ef32012-04-27 16:50:50 -07004296 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004297 l2cap_chan_del(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004298
4299 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004300
Gustavo Padovan80b98022012-05-27 22:27:51 -03004301 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004302 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004303
4304 mutex_unlock(&conn->chan_lock);
4305
Linus Torvalds1da177e2005-04-16 15:20:36 -07004306 return 0;
4307}
4308
Gustavo Padovan2d792812012-10-06 10:07:01 +01004309static inline int l2cap_information_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004310 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4311 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004312{
4313 struct l2cap_info_req *req = (struct l2cap_info_req *) data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004314 u16 type;
4315
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004316 if (cmd_len != sizeof(*req))
4317 return -EPROTO;
4318
Linus Torvalds1da177e2005-04-16 15:20:36 -07004319 type = __le16_to_cpu(req->type);
4320
4321 BT_DBG("type 0x%4.4x", type);
4322
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004323 if (type == L2CAP_IT_FEAT_MASK) {
4324 u8 buf[8];
Marcel Holtmann44dd46d2009-05-02 19:09:01 -07004325 u32 feat_mask = l2cap_feat_mask;
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004326 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004327 rsp->type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
4328 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03004329 if (!disable_ertm)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004330 feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING
Gustavo Padovan2d792812012-10-06 10:07:01 +01004331 | L2CAP_FEAT_FCS;
Marcel Holtmann848566b2013-10-01 22:59:22 -07004332 if (conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03004333 feat_mask |= L2CAP_FEAT_EXT_FLOW
Gustavo Padovan2d792812012-10-06 10:07:01 +01004334 | L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenkoa5fd6f32011-09-16 16:26:32 +03004335
Gustavo F. Padovan1b7bf4e2009-08-24 00:45:20 -03004336 put_unaligned_le32(feat_mask, rsp->data);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004337 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4338 buf);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004339 } else if (type == L2CAP_IT_FIXED_CHAN) {
4340 u8 buf[12];
4341 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Mat Martineau50a147c2011-11-02 16:18:34 -07004342
Marcel Holtmann848566b2013-10-01 22:59:22 -07004343 if (conn->hs_enabled)
Mat Martineau50a147c2011-11-02 16:18:34 -07004344 l2cap_fixed_chan[0] |= L2CAP_FC_A2MP;
4345 else
4346 l2cap_fixed_chan[0] &= ~L2CAP_FC_A2MP;
4347
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004348 rsp->type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
4349 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Andrei Emeltchenkoc6337ea2011-10-20 17:02:44 +03004350 memcpy(rsp->data, l2cap_fixed_chan, sizeof(l2cap_fixed_chan));
Gustavo Padovan2d792812012-10-06 10:07:01 +01004351 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4352 buf);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004353 } else {
4354 struct l2cap_info_rsp rsp;
4355 rsp.type = cpu_to_le16(type);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004356 rsp.result = cpu_to_le16(L2CAP_IR_NOTSUPP);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004357 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(rsp),
4358 &rsp);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004359 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004360
4361 return 0;
4362}
4363
Gustavo Padovan2d792812012-10-06 10:07:01 +01004364static inline int l2cap_information_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004365 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4366 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004367{
4368 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) data;
4369 u16 type, result;
4370
Jaganath Kanakkassery3f6fa3d2013-06-21 19:55:11 +05304371 if (cmd_len < sizeof(*rsp))
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004372 return -EPROTO;
4373
Linus Torvalds1da177e2005-04-16 15:20:36 -07004374 type = __le16_to_cpu(rsp->type);
4375 result = __le16_to_cpu(rsp->result);
4376
4377 BT_DBG("type 0x%4.4x result 0x%2.2x", type, result);
4378
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004379 /* L2CAP Info req/rsp are unbound to channels, add extra checks */
4380 if (cmd->ident != conn->info_ident ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01004381 conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004382 return 0;
4383
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02004384 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004385
Ville Tervoadb08ed2010-08-04 09:43:33 +03004386 if (result != L2CAP_IR_SUCCESS) {
4387 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4388 conn->info_ident = 0;
4389
4390 l2cap_conn_start(conn);
4391
4392 return 0;
4393 }
4394
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004395 switch (type) {
4396 case L2CAP_IT_FEAT_MASK:
Harvey Harrison83985312008-05-02 16:25:46 -07004397 conn->feat_mask = get_unaligned_le32(rsp->data);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004398
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07004399 if (conn->feat_mask & L2CAP_FEAT_FIXED_CHAN) {
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004400 struct l2cap_info_req req;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004401 req.type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004402
4403 conn->info_ident = l2cap_get_ident(conn);
4404
4405 l2cap_send_cmd(conn, conn->info_ident,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004406 L2CAP_INFO_REQ, sizeof(req), &req);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004407 } else {
4408 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4409 conn->info_ident = 0;
4410
4411 l2cap_conn_start(conn);
4412 }
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004413 break;
4414
4415 case L2CAP_IT_FIXED_CHAN:
4416 conn->fixed_chan_mask = rsp->data[0];
Marcel Holtmann984947d2009-02-06 23:35:19 +01004417 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004418 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004419
4420 l2cap_conn_start(conn);
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004421 break;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004422 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004423
Linus Torvalds1da177e2005-04-16 15:20:36 -07004424 return 0;
4425}
4426
Mat Martineau17009152012-10-23 15:24:07 -07004427static int l2cap_create_channel_req(struct l2cap_conn *conn,
4428 struct l2cap_cmd_hdr *cmd,
4429 u16 cmd_len, void *data)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004430{
4431 struct l2cap_create_chan_req *req = data;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004432 struct l2cap_create_chan_rsp rsp;
Mat Martineau17009152012-10-23 15:24:07 -07004433 struct l2cap_chan *chan;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004434 struct hci_dev *hdev;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004435 u16 psm, scid;
4436
4437 if (cmd_len != sizeof(*req))
4438 return -EPROTO;
4439
Marcel Holtmann848566b2013-10-01 22:59:22 -07004440 if (!conn->hs_enabled)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004441 return -EINVAL;
4442
4443 psm = le16_to_cpu(req->psm);
4444 scid = le16_to_cpu(req->scid);
4445
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004446 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 -07004447
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004448 /* For controller id 0 make BR/EDR connection */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004449 if (req->amp_id == AMP_ID_BREDR) {
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004450 l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4451 req->amp_id);
4452 return 0;
4453 }
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004454
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004455 /* Validate AMP controller id */
4456 hdev = hci_dev_get(req->amp_id);
4457 if (!hdev)
4458 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004459
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004460 if (hdev->dev_type != HCI_AMP || !test_bit(HCI_UP, &hdev->flags)) {
Mat Martineau17009152012-10-23 15:24:07 -07004461 hci_dev_put(hdev);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004462 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004463 }
4464
4465 chan = l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4466 req->amp_id);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004467 if (chan) {
4468 struct amp_mgr *mgr = conn->hcon->amp_mgr;
4469 struct hci_conn *hs_hcon;
4470
Marcel Holtmann98e0f7e2013-10-13 02:23:40 -07004471 hs_hcon = hci_conn_hash_lookup_ba(hdev, AMP_LINK,
4472 &conn->hcon->dst);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004473 if (!hs_hcon) {
4474 hci_dev_put(hdev);
Johan Hedberg662d6522013-10-16 11:20:47 +03004475 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4476 chan->dcid);
4477 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004478 }
4479
4480 BT_DBG("mgr %p bredr_chan %p hs_hcon %p", mgr, chan, hs_hcon);
4481
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004482 mgr->bredr_chan = chan;
4483 chan->hs_hcon = hs_hcon;
Andrei Emeltchenkofd45bf42012-11-20 17:16:22 +02004484 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004485 conn->mtu = hdev->block_mtu;
4486 }
4487
4488 hci_dev_put(hdev);
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004489
4490 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004491
4492error:
4493 rsp.dcid = 0;
4494 rsp.scid = cpu_to_le16(scid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004495 rsp.result = cpu_to_le16(L2CAP_CR_BAD_AMP);
4496 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004497
4498 l2cap_send_cmd(conn, cmd->ident, L2CAP_CREATE_CHAN_RSP,
4499 sizeof(rsp), &rsp);
4500
Johan Hedbergdc280802013-09-16 13:05:13 +03004501 return 0;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004502}
4503
Mat Martineau8eb200b2012-10-23 15:24:17 -07004504static void l2cap_send_move_chan_req(struct l2cap_chan *chan, u8 dest_amp_id)
4505{
4506 struct l2cap_move_chan_req req;
4507 u8 ident;
4508
4509 BT_DBG("chan %p, dest_amp_id %d", chan, dest_amp_id);
4510
4511 ident = l2cap_get_ident(chan->conn);
4512 chan->ident = ident;
4513
4514 req.icid = cpu_to_le16(chan->scid);
4515 req.dest_amp_id = dest_amp_id;
4516
4517 l2cap_send_cmd(chan->conn, ident, L2CAP_MOVE_CHAN_REQ, sizeof(req),
4518 &req);
4519
4520 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4521}
4522
Mat Martineau1500109b2012-10-23 15:24:15 -07004523static void l2cap_send_move_chan_rsp(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004524{
4525 struct l2cap_move_chan_rsp rsp;
4526
Mat Martineau1500109b2012-10-23 15:24:15 -07004527 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004528
Mat Martineau1500109b2012-10-23 15:24:15 -07004529 rsp.icid = cpu_to_le16(chan->dcid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004530 rsp.result = cpu_to_le16(result);
4531
Mat Martineau1500109b2012-10-23 15:24:15 -07004532 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_RSP,
4533 sizeof(rsp), &rsp);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004534}
4535
Mat Martineau5b155ef2012-10-23 15:24:14 -07004536static void l2cap_send_move_chan_cfm(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004537{
4538 struct l2cap_move_chan_cfm cfm;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004539
Mat Martineau5b155ef2012-10-23 15:24:14 -07004540 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004541
Mat Martineau5b155ef2012-10-23 15:24:14 -07004542 chan->ident = l2cap_get_ident(chan->conn);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004543
Mat Martineau5b155ef2012-10-23 15:24:14 -07004544 cfm.icid = cpu_to_le16(chan->scid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004545 cfm.result = cpu_to_le16(result);
4546
Mat Martineau5b155ef2012-10-23 15:24:14 -07004547 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_CFM,
4548 sizeof(cfm), &cfm);
4549
4550 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4551}
4552
4553static void l2cap_send_move_chan_cfm_icid(struct l2cap_conn *conn, u16 icid)
4554{
4555 struct l2cap_move_chan_cfm cfm;
4556
4557 BT_DBG("conn %p, icid 0x%4.4x", conn, icid);
4558
4559 cfm.icid = cpu_to_le16(icid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004560 cfm.result = cpu_to_le16(L2CAP_MC_UNCONFIRMED);
Mat Martineau5b155ef2012-10-23 15:24:14 -07004561
4562 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_MOVE_CHAN_CFM,
4563 sizeof(cfm), &cfm);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004564}
4565
4566static void l2cap_send_move_chan_cfm_rsp(struct l2cap_conn *conn, u8 ident,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004567 u16 icid)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004568{
4569 struct l2cap_move_chan_cfm_rsp rsp;
4570
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004571 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004572
4573 rsp.icid = cpu_to_le16(icid);
4574 l2cap_send_cmd(conn, ident, L2CAP_MOVE_CHAN_CFM_RSP, sizeof(rsp), &rsp);
4575}
4576
Mat Martineau5f3847a2012-10-23 15:24:12 -07004577static void __release_logical_link(struct l2cap_chan *chan)
4578{
4579 chan->hs_hchan = NULL;
4580 chan->hs_hcon = NULL;
4581
4582 /* Placeholder - release the logical link */
4583}
4584
Mat Martineau1500109b2012-10-23 15:24:15 -07004585static void l2cap_logical_fail(struct l2cap_chan *chan)
4586{
4587 /* Logical link setup failed */
4588 if (chan->state != BT_CONNECTED) {
4589 /* Create channel failure, disconnect */
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004590 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineau1500109b2012-10-23 15:24:15 -07004591 return;
4592 }
4593
4594 switch (chan->move_role) {
4595 case L2CAP_MOVE_ROLE_RESPONDER:
4596 l2cap_move_done(chan);
4597 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_SUPP);
4598 break;
4599 case L2CAP_MOVE_ROLE_INITIATOR:
4600 if (chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_COMP ||
4601 chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_CFM) {
4602 /* Remote has only sent pending or
4603 * success responses, clean up
4604 */
4605 l2cap_move_done(chan);
4606 }
4607
4608 /* Other amp move states imply that the move
4609 * has already aborted
4610 */
4611 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
4612 break;
4613 }
4614}
4615
4616static void l2cap_logical_finish_create(struct l2cap_chan *chan,
4617 struct hci_chan *hchan)
4618{
4619 struct l2cap_conf_rsp rsp;
Mat Martineau1500109b2012-10-23 15:24:15 -07004620
Andrei Emeltchenko336178a2012-10-31 15:46:27 +02004621 chan->hs_hchan = hchan;
Mat Martineau1500109b2012-10-23 15:24:15 -07004622 chan->hs_hcon->l2cap_data = chan->conn;
4623
Andrei Emeltchenko35ba9562012-10-25 15:20:43 +03004624 l2cap_send_efs_conf_rsp(chan, &rsp, chan->ident, 0);
Mat Martineau1500109b2012-10-23 15:24:15 -07004625
4626 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Andrei Emeltchenkofe79c6f2012-10-25 15:20:42 +03004627 int err;
Mat Martineau1500109b2012-10-23 15:24:15 -07004628
4629 set_default_fcs(chan);
4630
4631 err = l2cap_ertm_init(chan);
4632 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004633 l2cap_send_disconn_req(chan, -err);
Mat Martineau1500109b2012-10-23 15:24:15 -07004634 else
4635 l2cap_chan_ready(chan);
4636 }
4637}
4638
4639static void l2cap_logical_finish_move(struct l2cap_chan *chan,
4640 struct hci_chan *hchan)
4641{
4642 chan->hs_hcon = hchan->conn;
4643 chan->hs_hcon->l2cap_data = chan->conn;
4644
4645 BT_DBG("move_state %d", chan->move_state);
4646
4647 switch (chan->move_state) {
4648 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
4649 /* Move confirm will be sent after a success
4650 * response is received
4651 */
4652 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4653 break;
4654 case L2CAP_MOVE_WAIT_LOGICAL_CFM:
4655 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4656 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4657 } else if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
4658 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
4659 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
4660 } else if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4661 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4662 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4663 }
4664 break;
4665 default:
4666 /* Move was not in expected state, free the channel */
4667 __release_logical_link(chan);
4668
4669 chan->move_state = L2CAP_MOVE_STABLE;
4670 }
4671}
4672
4673/* Call with chan locked */
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004674void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan,
4675 u8 status)
Mat Martineau5b155ef2012-10-23 15:24:14 -07004676{
Mat Martineau1500109b2012-10-23 15:24:15 -07004677 BT_DBG("chan %p, hchan %p, status %d", chan, hchan, status);
4678
4679 if (status) {
4680 l2cap_logical_fail(chan);
4681 __release_logical_link(chan);
4682 return;
4683 }
4684
4685 if (chan->state != BT_CONNECTED) {
4686 /* Ignore logical link if channel is on BR/EDR */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004687 if (chan->local_amp_id != AMP_ID_BREDR)
Mat Martineau1500109b2012-10-23 15:24:15 -07004688 l2cap_logical_finish_create(chan, hchan);
4689 } else {
4690 l2cap_logical_finish_move(chan, hchan);
4691 }
Mat Martineau5b155ef2012-10-23 15:24:14 -07004692}
4693
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004694void l2cap_move_start(struct l2cap_chan *chan)
4695{
4696 BT_DBG("chan %p", chan);
4697
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004698 if (chan->local_amp_id == AMP_ID_BREDR) {
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004699 if (chan->chan_policy != BT_CHANNEL_POLICY_AMP_PREFERRED)
4700 return;
4701 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4702 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4703 /* Placeholder - start physical link setup */
4704 } else {
4705 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4706 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4707 chan->move_id = 0;
4708 l2cap_move_setup(chan);
4709 l2cap_send_move_chan_req(chan, 0);
4710 }
4711}
4712
Mat Martineau8eb200b2012-10-23 15:24:17 -07004713static void l2cap_do_create(struct l2cap_chan *chan, int result,
4714 u8 local_amp_id, u8 remote_amp_id)
4715{
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004716 BT_DBG("chan %p state %s %u -> %u", chan, state_to_string(chan->state),
4717 local_amp_id, remote_amp_id);
4718
Andrei Emeltchenko12d6cc62012-11-14 17:39:31 +02004719 chan->fcs = L2CAP_FCS_NONE;
4720
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004721 /* Outgoing channel on AMP */
4722 if (chan->state == BT_CONNECT) {
4723 if (result == L2CAP_CR_SUCCESS) {
4724 chan->local_amp_id = local_amp_id;
4725 l2cap_send_create_chan_req(chan, remote_amp_id);
4726 } else {
4727 /* Revert to BR/EDR connect */
4728 l2cap_send_conn_req(chan);
4729 }
4730
4731 return;
4732 }
4733
4734 /* Incoming channel on AMP */
4735 if (__l2cap_no_conn_pending(chan)) {
Mat Martineau8eb200b2012-10-23 15:24:17 -07004736 struct l2cap_conn_rsp rsp;
4737 char buf[128];
4738 rsp.scid = cpu_to_le16(chan->dcid);
4739 rsp.dcid = cpu_to_le16(chan->scid);
4740
Mat Martineau8eb200b2012-10-23 15:24:17 -07004741 if (result == L2CAP_CR_SUCCESS) {
4742 /* Send successful response */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004743 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
4744 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004745 } else {
4746 /* Send negative response */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004747 rsp.result = cpu_to_le16(L2CAP_CR_NO_MEM);
4748 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004749 }
4750
4751 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_RSP,
4752 sizeof(rsp), &rsp);
4753
4754 if (result == L2CAP_CR_SUCCESS) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02004755 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004756 set_bit(CONF_REQ_SENT, &chan->conf_state);
4757 l2cap_send_cmd(chan->conn, l2cap_get_ident(chan->conn),
4758 L2CAP_CONF_REQ,
4759 l2cap_build_conf_req(chan, buf), buf);
4760 chan->num_conf_req++;
4761 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004762 }
4763}
4764
4765static void l2cap_do_move_initiate(struct l2cap_chan *chan, u8 local_amp_id,
4766 u8 remote_amp_id)
4767{
4768 l2cap_move_setup(chan);
4769 chan->move_id = local_amp_id;
4770 chan->move_state = L2CAP_MOVE_WAIT_RSP;
4771
4772 l2cap_send_move_chan_req(chan, remote_amp_id);
4773}
4774
4775static void l2cap_do_move_respond(struct l2cap_chan *chan, int result)
4776{
4777 struct hci_chan *hchan = NULL;
4778
4779 /* Placeholder - get hci_chan for logical link */
4780
4781 if (hchan) {
4782 if (hchan->state == BT_CONNECTED) {
4783 /* Logical link is ready to go */
4784 chan->hs_hcon = hchan->conn;
4785 chan->hs_hcon->l2cap_data = chan->conn;
4786 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4787 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4788
4789 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
4790 } else {
4791 /* Wait for logical link to be ready */
4792 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4793 }
4794 } else {
4795 /* Logical link not available */
4796 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_ALLOWED);
4797 }
4798}
4799
4800static void l2cap_do_move_cancel(struct l2cap_chan *chan, int result)
4801{
4802 if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4803 u8 rsp_result;
4804 if (result == -EINVAL)
4805 rsp_result = L2CAP_MR_BAD_ID;
4806 else
4807 rsp_result = L2CAP_MR_NOT_ALLOWED;
4808
4809 l2cap_send_move_chan_rsp(chan, rsp_result);
4810 }
4811
4812 chan->move_role = L2CAP_MOVE_ROLE_NONE;
4813 chan->move_state = L2CAP_MOVE_STABLE;
4814
4815 /* Restart data transmission */
4816 l2cap_ertm_send(chan);
4817}
4818
Andrei Emeltchenkoa514b172012-11-14 17:39:30 +02004819/* Invoke with locked chan */
4820void __l2cap_physical_cfm(struct l2cap_chan *chan, int result)
Mat Martineau8eb200b2012-10-23 15:24:17 -07004821{
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004822 u8 local_amp_id = chan->local_amp_id;
Andrei Emeltchenkofffadc02012-11-01 15:37:03 +02004823 u8 remote_amp_id = chan->remote_amp_id;
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004824
Mat Martineau8eb200b2012-10-23 15:24:17 -07004825 BT_DBG("chan %p, result %d, local_amp_id %d, remote_amp_id %d",
4826 chan, result, local_amp_id, remote_amp_id);
4827
Mat Martineau8eb200b2012-10-23 15:24:17 -07004828 if (chan->state == BT_DISCONN || chan->state == BT_CLOSED) {
4829 l2cap_chan_unlock(chan);
4830 return;
4831 }
4832
4833 if (chan->state != BT_CONNECTED) {
4834 l2cap_do_create(chan, result, local_amp_id, remote_amp_id);
4835 } else if (result != L2CAP_MR_SUCCESS) {
4836 l2cap_do_move_cancel(chan, result);
4837 } else {
4838 switch (chan->move_role) {
4839 case L2CAP_MOVE_ROLE_INITIATOR:
4840 l2cap_do_move_initiate(chan, local_amp_id,
4841 remote_amp_id);
4842 break;
4843 case L2CAP_MOVE_ROLE_RESPONDER:
4844 l2cap_do_move_respond(chan, result);
4845 break;
4846 default:
4847 l2cap_do_move_cancel(chan, result);
4848 break;
4849 }
4850 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004851}
4852
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004853static inline int l2cap_move_channel_req(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004854 struct l2cap_cmd_hdr *cmd,
4855 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004856{
4857 struct l2cap_move_chan_req *req = data;
Mat Martineau1500109b2012-10-23 15:24:15 -07004858 struct l2cap_move_chan_rsp rsp;
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004859 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004860 u16 icid = 0;
4861 u16 result = L2CAP_MR_NOT_ALLOWED;
4862
4863 if (cmd_len != sizeof(*req))
4864 return -EPROTO;
4865
4866 icid = le16_to_cpu(req->icid);
4867
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004868 BT_DBG("icid 0x%4.4x, dest_amp_id %d", icid, req->dest_amp_id);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004869
Marcel Holtmann848566b2013-10-01 22:59:22 -07004870 if (!conn->hs_enabled)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004871 return -EINVAL;
4872
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004873 chan = l2cap_get_chan_by_dcid(conn, icid);
4874 if (!chan) {
Mat Martineau1500109b2012-10-23 15:24:15 -07004875 rsp.icid = cpu_to_le16(icid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004876 rsp.result = cpu_to_le16(L2CAP_MR_NOT_ALLOWED);
Mat Martineau1500109b2012-10-23 15:24:15 -07004877 l2cap_send_cmd(conn, cmd->ident, L2CAP_MOVE_CHAN_RSP,
4878 sizeof(rsp), &rsp);
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004879 return 0;
4880 }
4881
Mat Martineau1500109b2012-10-23 15:24:15 -07004882 chan->ident = cmd->ident;
4883
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004884 if (chan->scid < L2CAP_CID_DYN_START ||
4885 chan->chan_policy == BT_CHANNEL_POLICY_BREDR_ONLY ||
4886 (chan->mode != L2CAP_MODE_ERTM &&
4887 chan->mode != L2CAP_MODE_STREAMING)) {
4888 result = L2CAP_MR_NOT_ALLOWED;
4889 goto send_move_response;
4890 }
4891
4892 if (chan->local_amp_id == req->dest_amp_id) {
4893 result = L2CAP_MR_SAME_ID;
4894 goto send_move_response;
4895 }
4896
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004897 if (req->dest_amp_id != AMP_ID_BREDR) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004898 struct hci_dev *hdev;
4899 hdev = hci_dev_get(req->dest_amp_id);
4900 if (!hdev || hdev->dev_type != HCI_AMP ||
4901 !test_bit(HCI_UP, &hdev->flags)) {
4902 if (hdev)
4903 hci_dev_put(hdev);
4904
4905 result = L2CAP_MR_BAD_ID;
4906 goto send_move_response;
4907 }
4908 hci_dev_put(hdev);
4909 }
4910
4911 /* Detect a move collision. Only send a collision response
4912 * if this side has "lost", otherwise proceed with the move.
4913 * The winner has the larger bd_addr.
4914 */
4915 if ((__chan_is_moving(chan) ||
4916 chan->move_role != L2CAP_MOVE_ROLE_NONE) &&
Marcel Holtmann6f59b902013-10-13 05:24:01 -07004917 bacmp(&conn->hcon->src, &conn->hcon->dst) > 0) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004918 result = L2CAP_MR_COLLISION;
4919 goto send_move_response;
4920 }
4921
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004922 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
4923 l2cap_move_setup(chan);
4924 chan->move_id = req->dest_amp_id;
4925 icid = chan->dcid;
4926
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004927 if (req->dest_amp_id == AMP_ID_BREDR) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004928 /* Moving to BR/EDR */
4929 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4930 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4931 result = L2CAP_MR_PEND;
4932 } else {
4933 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4934 result = L2CAP_MR_SUCCESS;
4935 }
4936 } else {
4937 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4938 /* Placeholder - uncomment when amp functions are available */
4939 /*amp_accept_physical(chan, req->dest_amp_id);*/
4940 result = L2CAP_MR_PEND;
4941 }
4942
4943send_move_response:
Mat Martineau1500109b2012-10-23 15:24:15 -07004944 l2cap_send_move_chan_rsp(chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004945
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004946 l2cap_chan_unlock(chan);
4947
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004948 return 0;
4949}
4950
Mat Martineau5b155ef2012-10-23 15:24:14 -07004951static void l2cap_move_continue(struct l2cap_conn *conn, u16 icid, u16 result)
4952{
4953 struct l2cap_chan *chan;
4954 struct hci_chan *hchan = NULL;
4955
4956 chan = l2cap_get_chan_by_scid(conn, icid);
4957 if (!chan) {
4958 l2cap_send_move_chan_cfm_icid(conn, icid);
4959 return;
4960 }
4961
4962 __clear_chan_timer(chan);
4963 if (result == L2CAP_MR_PEND)
4964 __set_chan_timer(chan, L2CAP_MOVE_ERTX_TIMEOUT);
4965
4966 switch (chan->move_state) {
4967 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
4968 /* Move confirm will be sent when logical link
4969 * is complete.
4970 */
4971 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4972 break;
4973 case L2CAP_MOVE_WAIT_RSP_SUCCESS:
4974 if (result == L2CAP_MR_PEND) {
4975 break;
4976 } else if (test_bit(CONN_LOCAL_BUSY,
4977 &chan->conn_state)) {
4978 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4979 } else {
4980 /* Logical link is up or moving to BR/EDR,
4981 * proceed with move
4982 */
4983 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
4984 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
4985 }
4986 break;
4987 case L2CAP_MOVE_WAIT_RSP:
4988 /* Moving to AMP */
4989 if (result == L2CAP_MR_SUCCESS) {
4990 /* Remote is ready, send confirm immediately
4991 * after logical link is ready
4992 */
4993 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4994 } else {
4995 /* Both logical link and move success
4996 * are required to confirm
4997 */
4998 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_COMP;
4999 }
5000
5001 /* Placeholder - get hci_chan for logical link */
5002 if (!hchan) {
5003 /* Logical link not available */
5004 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5005 break;
5006 }
5007
5008 /* If the logical link is not yet connected, do not
5009 * send confirmation.
5010 */
5011 if (hchan->state != BT_CONNECTED)
5012 break;
5013
5014 /* Logical link is already ready to go */
5015
5016 chan->hs_hcon = hchan->conn;
5017 chan->hs_hcon->l2cap_data = chan->conn;
5018
5019 if (result == L2CAP_MR_SUCCESS) {
5020 /* Can confirm now */
5021 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
5022 } else {
5023 /* Now only need move success
5024 * to confirm
5025 */
5026 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
5027 }
5028
5029 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
5030 break;
5031 default:
5032 /* Any other amp move state means the move failed. */
5033 chan->move_id = chan->local_amp_id;
5034 l2cap_move_done(chan);
5035 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5036 }
5037
5038 l2cap_chan_unlock(chan);
5039}
5040
5041static void l2cap_move_fail(struct l2cap_conn *conn, u8 ident, u16 icid,
5042 u16 result)
5043{
5044 struct l2cap_chan *chan;
5045
5046 chan = l2cap_get_chan_by_ident(conn, ident);
5047 if (!chan) {
5048 /* Could not locate channel, icid is best guess */
5049 l2cap_send_move_chan_cfm_icid(conn, icid);
5050 return;
5051 }
5052
5053 __clear_chan_timer(chan);
5054
5055 if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
5056 if (result == L2CAP_MR_COLLISION) {
5057 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
5058 } else {
5059 /* Cleanup - cancel move */
5060 chan->move_id = chan->local_amp_id;
5061 l2cap_move_done(chan);
5062 }
5063 }
5064
5065 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5066
5067 l2cap_chan_unlock(chan);
5068}
5069
5070static int l2cap_move_channel_rsp(struct l2cap_conn *conn,
5071 struct l2cap_cmd_hdr *cmd,
5072 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005073{
5074 struct l2cap_move_chan_rsp *rsp = data;
5075 u16 icid, result;
5076
5077 if (cmd_len != sizeof(*rsp))
5078 return -EPROTO;
5079
5080 icid = le16_to_cpu(rsp->icid);
5081 result = le16_to_cpu(rsp->result);
5082
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005083 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005084
Mat Martineau5b155ef2012-10-23 15:24:14 -07005085 if (result == L2CAP_MR_SUCCESS || result == L2CAP_MR_PEND)
5086 l2cap_move_continue(conn, icid, result);
5087 else
5088 l2cap_move_fail(conn, cmd->ident, icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005089
5090 return 0;
5091}
5092
Mat Martineau5f3847a2012-10-23 15:24:12 -07005093static int l2cap_move_channel_confirm(struct l2cap_conn *conn,
5094 struct l2cap_cmd_hdr *cmd,
5095 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005096{
5097 struct l2cap_move_chan_cfm *cfm = data;
Mat Martineau5f3847a2012-10-23 15:24:12 -07005098 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005099 u16 icid, result;
5100
5101 if (cmd_len != sizeof(*cfm))
5102 return -EPROTO;
5103
5104 icid = le16_to_cpu(cfm->icid);
5105 result = le16_to_cpu(cfm->result);
5106
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005107 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005108
Mat Martineau5f3847a2012-10-23 15:24:12 -07005109 chan = l2cap_get_chan_by_dcid(conn, icid);
5110 if (!chan) {
5111 /* Spec requires a response even if the icid was not found */
5112 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5113 return 0;
5114 }
5115
5116 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM) {
5117 if (result == L2CAP_MC_CONFIRMED) {
5118 chan->local_amp_id = chan->move_id;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005119 if (chan->local_amp_id == AMP_ID_BREDR)
Mat Martineau5f3847a2012-10-23 15:24:12 -07005120 __release_logical_link(chan);
5121 } else {
5122 chan->move_id = chan->local_amp_id;
5123 }
5124
5125 l2cap_move_done(chan);
5126 }
5127
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005128 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5129
Mat Martineau5f3847a2012-10-23 15:24:12 -07005130 l2cap_chan_unlock(chan);
5131
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005132 return 0;
5133}
5134
5135static inline int l2cap_move_channel_confirm_rsp(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005136 struct l2cap_cmd_hdr *cmd,
5137 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005138{
5139 struct l2cap_move_chan_cfm_rsp *rsp = data;
Mat Martineau3fd71a02012-10-23 15:24:16 -07005140 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005141 u16 icid;
5142
5143 if (cmd_len != sizeof(*rsp))
5144 return -EPROTO;
5145
5146 icid = le16_to_cpu(rsp->icid);
5147
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005148 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005149
Mat Martineau3fd71a02012-10-23 15:24:16 -07005150 chan = l2cap_get_chan_by_scid(conn, icid);
5151 if (!chan)
5152 return 0;
5153
5154 __clear_chan_timer(chan);
5155
5156 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM_RSP) {
5157 chan->local_amp_id = chan->move_id;
5158
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005159 if (chan->local_amp_id == AMP_ID_BREDR && chan->hs_hchan)
Mat Martineau3fd71a02012-10-23 15:24:16 -07005160 __release_logical_link(chan);
5161
5162 l2cap_move_done(chan);
5163 }
5164
5165 l2cap_chan_unlock(chan);
5166
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005167 return 0;
5168}
5169
Claudio Takahaside731152011-02-11 19:28:55 -02005170static inline int l2cap_conn_param_update_req(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005171 struct l2cap_cmd_hdr *cmd,
Johan Hedberg203e6392013-05-15 10:07:15 +03005172 u16 cmd_len, u8 *data)
Claudio Takahaside731152011-02-11 19:28:55 -02005173{
5174 struct hci_conn *hcon = conn->hcon;
5175 struct l2cap_conn_param_update_req *req;
5176 struct l2cap_conn_param_update_rsp rsp;
Johan Hedberg203e6392013-05-15 10:07:15 +03005177 u16 min, max, latency, to_multiplier;
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005178 int err;
Claudio Takahaside731152011-02-11 19:28:55 -02005179
Johan Hedberg40bef302014-07-16 11:42:27 +03005180 if (hcon->role != HCI_ROLE_MASTER)
Claudio Takahaside731152011-02-11 19:28:55 -02005181 return -EINVAL;
5182
Claudio Takahaside731152011-02-11 19:28:55 -02005183 if (cmd_len != sizeof(struct l2cap_conn_param_update_req))
5184 return -EPROTO;
5185
5186 req = (struct l2cap_conn_param_update_req *) data;
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03005187 min = __le16_to_cpu(req->min);
5188 max = __le16_to_cpu(req->max);
Claudio Takahaside731152011-02-11 19:28:55 -02005189 latency = __le16_to_cpu(req->latency);
5190 to_multiplier = __le16_to_cpu(req->to_multiplier);
5191
5192 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 +01005193 min, max, latency, to_multiplier);
Claudio Takahaside731152011-02-11 19:28:55 -02005194
5195 memset(&rsp, 0, sizeof(rsp));
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005196
Andre Guedesd4905f22014-06-25 21:52:52 -03005197 err = hci_check_conn_params(min, max, latency, to_multiplier);
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005198 if (err)
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005199 rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_REJECTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005200 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005201 rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_ACCEPTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005202
5203 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONN_PARAM_UPDATE_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005204 sizeof(rsp), &rsp);
Claudio Takahaside731152011-02-11 19:28:55 -02005205
Andre Guedesffb5a8272014-07-01 18:10:11 -03005206 if (!err) {
Johan Hedbergf4869e22014-07-02 17:37:32 +03005207 u8 store_hint;
Andre Guedesffb5a8272014-07-01 18:10:11 -03005208
Johan Hedbergf4869e22014-07-02 17:37:32 +03005209 store_hint = hci_le_conn_update(hcon, min, max, latency,
5210 to_multiplier);
5211 mgmt_new_conn_param(hcon->hdev, &hcon->dst, hcon->dst_type,
5212 store_hint, min, max, latency,
5213 to_multiplier);
5214
Andre Guedesffb5a8272014-07-01 18:10:11 -03005215 }
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005216
Claudio Takahaside731152011-02-11 19:28:55 -02005217 return 0;
5218}
5219
Johan Hedbergf1496de2013-05-13 14:15:56 +03005220static int l2cap_le_connect_rsp(struct l2cap_conn *conn,
5221 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5222 u8 *data)
5223{
5224 struct l2cap_le_conn_rsp *rsp = (struct l2cap_le_conn_rsp *) data;
5225 u16 dcid, mtu, mps, credits, result;
5226 struct l2cap_chan *chan;
5227 int err;
5228
5229 if (cmd_len < sizeof(*rsp))
5230 return -EPROTO;
5231
5232 dcid = __le16_to_cpu(rsp->dcid);
5233 mtu = __le16_to_cpu(rsp->mtu);
5234 mps = __le16_to_cpu(rsp->mps);
5235 credits = __le16_to_cpu(rsp->credits);
5236 result = __le16_to_cpu(rsp->result);
5237
5238 if (result == L2CAP_CR_SUCCESS && (mtu < 23 || mps < 23))
5239 return -EPROTO;
5240
5241 BT_DBG("dcid 0x%4.4x mtu %u mps %u credits %u result 0x%2.2x",
5242 dcid, mtu, mps, credits, result);
5243
5244 mutex_lock(&conn->chan_lock);
5245
5246 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5247 if (!chan) {
5248 err = -EBADSLT;
5249 goto unlock;
5250 }
5251
5252 err = 0;
5253
5254 l2cap_chan_lock(chan);
5255
5256 switch (result) {
5257 case L2CAP_CR_SUCCESS:
5258 chan->ident = 0;
5259 chan->dcid = dcid;
5260 chan->omtu = mtu;
5261 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005262 chan->tx_credits = credits;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005263 l2cap_chan_ready(chan);
5264 break;
5265
5266 default:
5267 l2cap_chan_del(chan, ECONNREFUSED);
5268 break;
5269 }
5270
5271 l2cap_chan_unlock(chan);
5272
5273unlock:
5274 mutex_unlock(&conn->chan_lock);
5275
5276 return err;
5277}
5278
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005279static inline int l2cap_bredr_sig_cmd(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005280 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5281 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005282{
5283 int err = 0;
5284
5285 switch (cmd->code) {
5286 case L2CAP_COMMAND_REJ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005287 l2cap_command_rej(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005288 break;
5289
5290 case L2CAP_CONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005291 err = l2cap_connect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005292 break;
5293
5294 case L2CAP_CONN_RSP:
Mat Martineauf5a25982012-10-11 17:48:21 +03005295 case L2CAP_CREATE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005296 l2cap_connect_create_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005297 break;
5298
5299 case L2CAP_CONF_REQ:
5300 err = l2cap_config_req(conn, cmd, cmd_len, data);
5301 break;
5302
5303 case L2CAP_CONF_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005304 l2cap_config_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005305 break;
5306
5307 case L2CAP_DISCONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005308 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005309 break;
5310
5311 case L2CAP_DISCONN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005312 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005313 break;
5314
5315 case L2CAP_ECHO_REQ:
5316 l2cap_send_cmd(conn, cmd->ident, L2CAP_ECHO_RSP, cmd_len, data);
5317 break;
5318
5319 case L2CAP_ECHO_RSP:
5320 break;
5321
5322 case L2CAP_INFO_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005323 err = l2cap_information_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005324 break;
5325
5326 case L2CAP_INFO_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005327 l2cap_information_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005328 break;
5329
Mat Martineauf94ff6f2011-11-02 16:18:32 -07005330 case L2CAP_CREATE_CHAN_REQ:
5331 err = l2cap_create_channel_req(conn, cmd, cmd_len, data);
5332 break;
5333
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005334 case L2CAP_MOVE_CHAN_REQ:
5335 err = l2cap_move_channel_req(conn, cmd, cmd_len, data);
5336 break;
5337
5338 case L2CAP_MOVE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005339 l2cap_move_channel_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005340 break;
5341
5342 case L2CAP_MOVE_CHAN_CFM:
5343 err = l2cap_move_channel_confirm(conn, cmd, cmd_len, data);
5344 break;
5345
5346 case L2CAP_MOVE_CHAN_CFM_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005347 l2cap_move_channel_confirm_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005348 break;
5349
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005350 default:
5351 BT_ERR("Unknown BR/EDR signaling command 0x%2.2x", cmd->code);
5352 err = -EINVAL;
5353 break;
5354 }
5355
5356 return err;
5357}
5358
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005359static int l2cap_le_connect_req(struct l2cap_conn *conn,
5360 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5361 u8 *data)
5362{
5363 struct l2cap_le_conn_req *req = (struct l2cap_le_conn_req *) data;
5364 struct l2cap_le_conn_rsp rsp;
5365 struct l2cap_chan *chan, *pchan;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005366 u16 dcid, scid, credits, mtu, mps;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005367 __le16 psm;
5368 u8 result;
5369
5370 if (cmd_len != sizeof(*req))
5371 return -EPROTO;
5372
5373 scid = __le16_to_cpu(req->scid);
5374 mtu = __le16_to_cpu(req->mtu);
5375 mps = __le16_to_cpu(req->mps);
5376 psm = req->psm;
5377 dcid = 0;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005378 credits = 0;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005379
5380 if (mtu < 23 || mps < 23)
5381 return -EPROTO;
5382
5383 BT_DBG("psm 0x%2.2x scid 0x%4.4x mtu %u mps %u", __le16_to_cpu(psm),
5384 scid, mtu, mps);
5385
5386 /* Check if we have socket listening on psm */
5387 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
5388 &conn->hcon->dst, LE_LINK);
5389 if (!pchan) {
5390 result = L2CAP_CR_BAD_PSM;
5391 chan = NULL;
5392 goto response;
5393 }
5394
5395 mutex_lock(&conn->chan_lock);
5396 l2cap_chan_lock(pchan);
5397
5398 if (!smp_sufficient_security(conn->hcon, pchan->sec_level)) {
5399 result = L2CAP_CR_AUTHENTICATION;
5400 chan = NULL;
5401 goto response_unlock;
5402 }
5403
5404 /* Check if we already have channel with that dcid */
5405 if (__l2cap_get_chan_by_dcid(conn, scid)) {
5406 result = L2CAP_CR_NO_MEM;
5407 chan = NULL;
5408 goto response_unlock;
5409 }
5410
5411 chan = pchan->ops->new_connection(pchan);
5412 if (!chan) {
5413 result = L2CAP_CR_NO_MEM;
5414 goto response_unlock;
5415 }
5416
Johan Hedberg0ce43ce2013-12-05 14:55:33 +02005417 l2cap_le_flowctl_init(chan);
5418
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005419 bacpy(&chan->src, &conn->hcon->src);
5420 bacpy(&chan->dst, &conn->hcon->dst);
5421 chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type);
5422 chan->dst_type = bdaddr_type(conn->hcon, conn->hcon->dst_type);
5423 chan->psm = psm;
5424 chan->dcid = scid;
5425 chan->omtu = mtu;
5426 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005427 chan->tx_credits = __le16_to_cpu(req->credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005428
5429 __l2cap_chan_add(conn, chan);
5430 dcid = chan->scid;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005431 credits = chan->rx_credits;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005432
5433 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
5434
5435 chan->ident = cmd->ident;
5436
5437 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
5438 l2cap_state_change(chan, BT_CONNECT2);
5439 result = L2CAP_CR_PEND;
5440 chan->ops->defer(chan);
5441 } else {
5442 l2cap_chan_ready(chan);
5443 result = L2CAP_CR_SUCCESS;
5444 }
5445
5446response_unlock:
5447 l2cap_chan_unlock(pchan);
5448 mutex_unlock(&conn->chan_lock);
Johan Hedberga24cce12014-08-07 22:56:42 +03005449 l2cap_chan_put(pchan);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005450
5451 if (result == L2CAP_CR_PEND)
5452 return 0;
5453
5454response:
5455 if (chan) {
5456 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02005457 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005458 } else {
5459 rsp.mtu = 0;
5460 rsp.mps = 0;
5461 }
5462
5463 rsp.dcid = cpu_to_le16(dcid);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005464 rsp.credits = cpu_to_le16(credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005465 rsp.result = cpu_to_le16(result);
5466
5467 l2cap_send_cmd(conn, cmd->ident, L2CAP_LE_CONN_RSP, sizeof(rsp), &rsp);
5468
5469 return 0;
5470}
5471
Johan Hedbergfad5fc892013-12-05 09:45:01 +02005472static inline int l2cap_le_credits(struct l2cap_conn *conn,
5473 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5474 u8 *data)
5475{
5476 struct l2cap_le_credits *pkt;
5477 struct l2cap_chan *chan;
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005478 u16 cid, credits, max_credits;
Johan Hedbergfad5fc892013-12-05 09:45:01 +02005479
5480 if (cmd_len != sizeof(*pkt))
5481 return -EPROTO;
5482
5483 pkt = (struct l2cap_le_credits *) data;
5484 cid = __le16_to_cpu(pkt->cid);
5485 credits = __le16_to_cpu(pkt->credits);
5486
5487 BT_DBG("cid 0x%4.4x credits 0x%4.4x", cid, credits);
5488
5489 chan = l2cap_get_chan_by_dcid(conn, cid);
5490 if (!chan)
5491 return -EBADSLT;
5492
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005493 max_credits = LE_FLOWCTL_MAX_CREDITS - chan->tx_credits;
5494 if (credits > max_credits) {
5495 BT_ERR("LE credits overflow");
5496 l2cap_send_disconn_req(chan, ECONNRESET);
5497
5498 /* Return 0 so that we don't trigger an unnecessary
5499 * command reject packet.
5500 */
5501 return 0;
5502 }
5503
Johan Hedbergfad5fc892013-12-05 09:45:01 +02005504 chan->tx_credits += credits;
5505
5506 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
5507 l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
5508 chan->tx_credits--;
5509 }
5510
5511 if (chan->tx_credits)
5512 chan->ops->resume(chan);
5513
5514 l2cap_chan_unlock(chan);
5515
5516 return 0;
5517}
5518
Johan Hedberg71fb4192013-12-10 10:52:48 +02005519static inline int l2cap_le_command_rej(struct l2cap_conn *conn,
5520 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5521 u8 *data)
5522{
5523 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
5524 struct l2cap_chan *chan;
5525
5526 if (cmd_len < sizeof(*rej))
5527 return -EPROTO;
5528
5529 mutex_lock(&conn->chan_lock);
5530
5531 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5532 if (!chan)
5533 goto done;
5534
5535 l2cap_chan_lock(chan);
5536 l2cap_chan_del(chan, ECONNREFUSED);
5537 l2cap_chan_unlock(chan);
5538
5539done:
5540 mutex_unlock(&conn->chan_lock);
5541 return 0;
5542}
5543
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005544static inline int l2cap_le_sig_cmd(struct l2cap_conn *conn,
Johan Hedberg203e6392013-05-15 10:07:15 +03005545 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5546 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005547{
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005548 int err = 0;
5549
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005550 switch (cmd->code) {
5551 case L2CAP_COMMAND_REJ:
Johan Hedberg71fb4192013-12-10 10:52:48 +02005552 l2cap_le_command_rej(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005553 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005554
5555 case L2CAP_CONN_PARAM_UPDATE_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005556 err = l2cap_conn_param_update_req(conn, cmd, cmd_len, data);
5557 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005558
5559 case L2CAP_CONN_PARAM_UPDATE_RSP:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005560 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005561
Johan Hedbergf1496de2013-05-13 14:15:56 +03005562 case L2CAP_LE_CONN_RSP:
5563 l2cap_le_connect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005564 break;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005565
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005566 case L2CAP_LE_CONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005567 err = l2cap_le_connect_req(conn, cmd, cmd_len, data);
5568 break;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005569
Johan Hedbergfad5fc892013-12-05 09:45:01 +02005570 case L2CAP_LE_CREDITS:
5571 err = l2cap_le_credits(conn, cmd, cmd_len, data);
5572 break;
5573
Johan Hedberg3defe012013-05-15 10:16:06 +03005574 case L2CAP_DISCONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005575 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
5576 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005577
5578 case L2CAP_DISCONN_RSP:
5579 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005580 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005581
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005582 default:
5583 BT_ERR("Unknown LE signaling command 0x%2.2x", cmd->code);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005584 err = -EINVAL;
5585 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005586 }
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005587
5588 return err;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005589}
5590
Johan Hedbergc5623552013-04-29 19:35:33 +03005591static inline void l2cap_le_sig_channel(struct l2cap_conn *conn,
5592 struct sk_buff *skb)
5593{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005594 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005595 struct l2cap_cmd_hdr *cmd;
5596 u16 len;
Johan Hedbergc5623552013-04-29 19:35:33 +03005597 int err;
5598
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005599 if (hcon->type != LE_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005600 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005601
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005602 if (skb->len < L2CAP_CMD_HDR_SIZE)
5603 goto drop;
Johan Hedbergc5623552013-04-29 19:35:33 +03005604
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005605 cmd = (void *) skb->data;
5606 skb_pull(skb, L2CAP_CMD_HDR_SIZE);
Johan Hedbergc5623552013-04-29 19:35:33 +03005607
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005608 len = le16_to_cpu(cmd->len);
Johan Hedbergc5623552013-04-29 19:35:33 +03005609
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005610 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd->code, len, cmd->ident);
Johan Hedbergc5623552013-04-29 19:35:33 +03005611
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005612 if (len != skb->len || !cmd->ident) {
5613 BT_DBG("corrupted command");
5614 goto drop;
5615 }
Johan Hedbergc5623552013-04-29 19:35:33 +03005616
Johan Hedberg203e6392013-05-15 10:07:15 +03005617 err = l2cap_le_sig_cmd(conn, cmd, len, skb->data);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005618 if (err) {
5619 struct l2cap_cmd_rej_unk rej;
Johan Hedbergc5623552013-04-29 19:35:33 +03005620
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005621 BT_ERR("Wrong link type (%d)", err);
Johan Hedbergc5623552013-04-29 19:35:33 +03005622
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005623 rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005624 l2cap_send_cmd(conn, cmd->ident, L2CAP_COMMAND_REJ,
5625 sizeof(rej), &rej);
Johan Hedbergc5623552013-04-29 19:35:33 +03005626 }
5627
Marcel Holtmann3b166292013-10-02 08:28:21 -07005628drop:
Johan Hedbergc5623552013-04-29 19:35:33 +03005629 kfree_skb(skb);
5630}
5631
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005632static inline void l2cap_sig_channel(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005633 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005634{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005635 struct hci_conn *hcon = conn->hcon;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005636 u8 *data = skb->data;
5637 int len = skb->len;
5638 struct l2cap_cmd_hdr cmd;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005639 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005640
5641 l2cap_raw_recv(conn, skb);
5642
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005643 if (hcon->type != ACL_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005644 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005645
Linus Torvalds1da177e2005-04-16 15:20:36 -07005646 while (len >= L2CAP_CMD_HDR_SIZE) {
Al Viro88219a02007-07-29 00:17:25 -07005647 u16 cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005648 memcpy(&cmd, data, L2CAP_CMD_HDR_SIZE);
5649 data += L2CAP_CMD_HDR_SIZE;
5650 len -= L2CAP_CMD_HDR_SIZE;
5651
Al Viro88219a02007-07-29 00:17:25 -07005652 cmd_len = le16_to_cpu(cmd.len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005653
Gustavo Padovan2d792812012-10-06 10:07:01 +01005654 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd.code, cmd_len,
5655 cmd.ident);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005656
Al Viro88219a02007-07-29 00:17:25 -07005657 if (cmd_len > len || !cmd.ident) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005658 BT_DBG("corrupted command");
5659 break;
5660 }
5661
Johan Hedbergc5623552013-04-29 19:35:33 +03005662 err = l2cap_bredr_sig_cmd(conn, &cmd, cmd_len, data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005663 if (err) {
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03005664 struct l2cap_cmd_rej_unk rej;
Gustavo F. Padovan2c6d1a22011-03-23 14:38:32 -03005665
5666 BT_ERR("Wrong link type (%d)", err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005667
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005668 rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Gustavo Padovan2d792812012-10-06 10:07:01 +01005669 l2cap_send_cmd(conn, cmd.ident, L2CAP_COMMAND_REJ,
5670 sizeof(rej), &rej);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005671 }
5672
Al Viro88219a02007-07-29 00:17:25 -07005673 data += cmd_len;
5674 len -= cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005675 }
5676
Marcel Holtmann3b166292013-10-02 08:28:21 -07005677drop:
Linus Torvalds1da177e2005-04-16 15:20:36 -07005678 kfree_skb(skb);
5679}
5680
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005681static int l2cap_check_fcs(struct l2cap_chan *chan, struct sk_buff *skb)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005682{
5683 u16 our_fcs, rcv_fcs;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03005684 int hdr_size;
5685
5686 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
5687 hdr_size = L2CAP_EXT_HDR_SIZE;
5688 else
5689 hdr_size = L2CAP_ENH_HDR_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005690
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005691 if (chan->fcs == L2CAP_FCS_CRC16) {
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005692 skb_trim(skb, skb->len - L2CAP_FCS_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005693 rcv_fcs = get_unaligned_le16(skb->data + skb->len);
5694 our_fcs = crc16(0, skb->data - hdr_size, skb->len + hdr_size);
5695
5696 if (our_fcs != rcv_fcs)
João Paulo Rechi Vita7a560e52010-06-22 13:56:27 -03005697 return -EBADMSG;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005698 }
5699 return 0;
5700}
5701
Mat Martineau6ea00482012-05-17 20:53:52 -07005702static void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan)
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005703{
Mat Martineaue31f7632012-05-17 20:53:41 -07005704 struct l2cap_ctrl control;
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005705
Mat Martineaue31f7632012-05-17 20:53:41 -07005706 BT_DBG("chan %p", chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005707
Mat Martineaue31f7632012-05-17 20:53:41 -07005708 memset(&control, 0, sizeof(control));
5709 control.sframe = 1;
5710 control.final = 1;
5711 control.reqseq = chan->buffer_seq;
5712 set_bit(CONN_SEND_FBIT, &chan->conn_state);
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 control.super = L2CAP_SUPER_RNR;
5716 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005717 }
5718
Mat Martineaue31f7632012-05-17 20:53:41 -07005719 if (test_and_clear_bit(CONN_REMOTE_BUSY, &chan->conn_state) &&
5720 chan->unacked_frames > 0)
5721 __set_retrans_timer(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005722
Mat Martineaue31f7632012-05-17 20:53:41 -07005723 /* Send pending iframes */
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03005724 l2cap_ertm_send(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005725
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005726 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
Mat Martineaue31f7632012-05-17 20:53:41 -07005727 test_bit(CONN_SEND_FBIT, &chan->conn_state)) {
5728 /* F-bit wasn't sent in an s-frame or i-frame yet, so
5729 * send it now.
5730 */
5731 control.super = L2CAP_SUPER_RR;
5732 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005733 }
5734}
5735
Gustavo Padovan2d792812012-10-06 10:07:01 +01005736static void append_skb_frag(struct sk_buff *skb, struct sk_buff *new_frag,
5737 struct sk_buff **last_frag)
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005738{
Mat Martineau84084a32011-07-22 14:54:00 -07005739 /* skb->len reflects data in skb as well as all fragments
5740 * skb->data_len reflects only data in fragments
5741 */
5742 if (!skb_has_frag_list(skb))
5743 skb_shinfo(skb)->frag_list = new_frag;
5744
5745 new_frag->next = NULL;
5746
5747 (*last_frag)->next = new_frag;
5748 *last_frag = new_frag;
5749
5750 skb->len += new_frag->len;
5751 skb->data_len += new_frag->len;
5752 skb->truesize += new_frag->truesize;
5753}
5754
Mat Martineau4b51dae92012-05-17 20:53:37 -07005755static int l2cap_reassemble_sdu(struct l2cap_chan *chan, struct sk_buff *skb,
5756 struct l2cap_ctrl *control)
Mat Martineau84084a32011-07-22 14:54:00 -07005757{
5758 int err = -EINVAL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005759
Mat Martineau4b51dae92012-05-17 20:53:37 -07005760 switch (control->sar) {
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005761 case L2CAP_SAR_UNSEGMENTED:
Mat Martineau84084a32011-07-22 14:54:00 -07005762 if (chan->sdu)
5763 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005764
Gustavo Padovan80b98022012-05-27 22:27:51 -03005765 err = chan->ops->recv(chan, skb);
Mat Martineau84084a32011-07-22 14:54:00 -07005766 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005767
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005768 case L2CAP_SAR_START:
Mat Martineau84084a32011-07-22 14:54:00 -07005769 if (chan->sdu)
5770 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005771
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005772 chan->sdu_len = get_unaligned_le16(skb->data);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005773 skb_pull(skb, L2CAP_SDULEN_SIZE);
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005774
Mat Martineau84084a32011-07-22 14:54:00 -07005775 if (chan->sdu_len > chan->imtu) {
5776 err = -EMSGSIZE;
5777 break;
5778 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005779
Mat Martineau84084a32011-07-22 14:54:00 -07005780 if (skb->len >= chan->sdu_len)
5781 break;
5782
5783 chan->sdu = skb;
5784 chan->sdu_last_frag = skb;
5785
5786 skb = NULL;
5787 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005788 break;
5789
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005790 case L2CAP_SAR_CONTINUE:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005791 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005792 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005793
Mat Martineau84084a32011-07-22 14:54:00 -07005794 append_skb_frag(chan->sdu, skb,
5795 &chan->sdu_last_frag);
5796 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005797
Mat Martineau84084a32011-07-22 14:54:00 -07005798 if (chan->sdu->len >= chan->sdu_len)
5799 break;
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005800
Mat Martineau84084a32011-07-22 14:54:00 -07005801 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005802 break;
5803
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005804 case L2CAP_SAR_END:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005805 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005806 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005807
Mat Martineau84084a32011-07-22 14:54:00 -07005808 append_skb_frag(chan->sdu, skb,
5809 &chan->sdu_last_frag);
5810 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005811
Mat Martineau84084a32011-07-22 14:54:00 -07005812 if (chan->sdu->len != chan->sdu_len)
5813 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005814
Gustavo Padovan80b98022012-05-27 22:27:51 -03005815 err = chan->ops->recv(chan, chan->sdu);
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005816
Mat Martineau84084a32011-07-22 14:54:00 -07005817 if (!err) {
5818 /* Reassembly complete */
5819 chan->sdu = NULL;
5820 chan->sdu_last_frag = NULL;
5821 chan->sdu_len = 0;
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005822 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005823 break;
5824 }
5825
Mat Martineau84084a32011-07-22 14:54:00 -07005826 if (err) {
5827 kfree_skb(skb);
5828 kfree_skb(chan->sdu);
5829 chan->sdu = NULL;
5830 chan->sdu_last_frag = NULL;
5831 chan->sdu_len = 0;
5832 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005833
Mat Martineau84084a32011-07-22 14:54:00 -07005834 return err;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005835}
5836
Mat Martineau32b32732012-10-23 15:24:11 -07005837static int l2cap_resegment(struct l2cap_chan *chan)
5838{
5839 /* Placeholder */
5840 return 0;
5841}
5842
Mat Martineaue3281402011-07-07 09:39:02 -07005843void l2cap_chan_busy(struct l2cap_chan *chan, int busy)
Gustavo F. Padovan712132e2010-06-21 19:39:50 -03005844{
Mat Martineau61aa4f52012-05-17 20:53:40 -07005845 u8 event;
5846
5847 if (chan->mode != L2CAP_MODE_ERTM)
5848 return;
5849
5850 event = busy ? L2CAP_EV_LOCAL_BUSY_DETECTED : L2CAP_EV_LOCAL_BUSY_CLEAR;
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03005851 l2cap_tx(chan, NULL, NULL, event);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005852}
5853
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005854static int l2cap_rx_queued_iframes(struct l2cap_chan *chan)
5855{
Mat Martineau63838722012-05-17 20:53:45 -07005856 int err = 0;
5857 /* Pass sequential frames to l2cap_reassemble_sdu()
5858 * until a gap is encountered.
5859 */
5860
5861 BT_DBG("chan %p", chan);
5862
5863 while (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
5864 struct sk_buff *skb;
5865 BT_DBG("Searching for skb with txseq %d (queue len %d)",
5866 chan->buffer_seq, skb_queue_len(&chan->srej_q));
5867
5868 skb = l2cap_ertm_seq_in_queue(&chan->srej_q, chan->buffer_seq);
5869
5870 if (!skb)
5871 break;
5872
5873 skb_unlink(skb, &chan->srej_q);
5874 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
5875 err = l2cap_reassemble_sdu(chan, skb, &bt_cb(skb)->control);
5876 if (err)
5877 break;
5878 }
5879
5880 if (skb_queue_empty(&chan->srej_q)) {
5881 chan->rx_state = L2CAP_RX_STATE_RECV;
5882 l2cap_send_ack(chan);
5883 }
5884
5885 return err;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005886}
5887
5888static void l2cap_handle_srej(struct l2cap_chan *chan,
5889 struct l2cap_ctrl *control)
5890{
Mat Martineauf80842a2012-05-17 20:53:46 -07005891 struct sk_buff *skb;
5892
5893 BT_DBG("chan %p, control %p", chan, control);
5894
5895 if (control->reqseq == chan->next_tx_seq) {
5896 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005897 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005898 return;
5899 }
5900
5901 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
5902
5903 if (skb == NULL) {
5904 BT_DBG("Seq %d not available for retransmission",
5905 control->reqseq);
5906 return;
5907 }
5908
5909 if (chan->max_tx != 0 && bt_cb(skb)->control.retries >= chan->max_tx) {
5910 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005911 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005912 return;
5913 }
5914
5915 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
5916
5917 if (control->poll) {
5918 l2cap_pass_to_tx(chan, control);
5919
5920 set_bit(CONN_SEND_FBIT, &chan->conn_state);
5921 l2cap_retransmit(chan, control);
5922 l2cap_ertm_send(chan);
5923
5924 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5925 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5926 chan->srej_save_reqseq = control->reqseq;
5927 }
5928 } else {
5929 l2cap_pass_to_tx_fbit(chan, control);
5930
5931 if (control->final) {
5932 if (chan->srej_save_reqseq != control->reqseq ||
5933 !test_and_clear_bit(CONN_SREJ_ACT,
5934 &chan->conn_state))
5935 l2cap_retransmit(chan, control);
5936 } else {
5937 l2cap_retransmit(chan, control);
5938 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5939 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5940 chan->srej_save_reqseq = control->reqseq;
5941 }
5942 }
5943 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005944}
5945
5946static void l2cap_handle_rej(struct l2cap_chan *chan,
5947 struct l2cap_ctrl *control)
5948{
Mat Martineaufcd289d2012-05-17 20:53:47 -07005949 struct sk_buff *skb;
5950
5951 BT_DBG("chan %p, control %p", chan, control);
5952
5953 if (control->reqseq == chan->next_tx_seq) {
5954 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005955 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07005956 return;
5957 }
5958
5959 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
5960
5961 if (chan->max_tx && skb &&
5962 bt_cb(skb)->control.retries >= chan->max_tx) {
5963 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005964 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07005965 return;
5966 }
5967
5968 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
5969
5970 l2cap_pass_to_tx(chan, control);
5971
5972 if (control->final) {
5973 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state))
5974 l2cap_retransmit_all(chan, control);
5975 } else {
5976 l2cap_retransmit_all(chan, control);
5977 l2cap_ertm_send(chan);
5978 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F)
5979 set_bit(CONN_REJ_ACT, &chan->conn_state);
5980 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005981}
5982
Mat Martineau4b51dae92012-05-17 20:53:37 -07005983static u8 l2cap_classify_txseq(struct l2cap_chan *chan, u16 txseq)
5984{
5985 BT_DBG("chan %p, txseq %d", chan, txseq);
5986
5987 BT_DBG("last_acked_seq %d, expected_tx_seq %d", chan->last_acked_seq,
5988 chan->expected_tx_seq);
5989
5990 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
5991 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
Gustavo Padovan2d792812012-10-06 10:07:01 +01005992 chan->tx_win) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07005993 /* See notes below regarding "double poll" and
5994 * invalid packets.
5995 */
5996 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
5997 BT_DBG("Invalid/Ignore - after SREJ");
5998 return L2CAP_TXSEQ_INVALID_IGNORE;
5999 } else {
6000 BT_DBG("Invalid - in window after SREJ sent");
6001 return L2CAP_TXSEQ_INVALID;
6002 }
6003 }
6004
6005 if (chan->srej_list.head == txseq) {
6006 BT_DBG("Expected SREJ");
6007 return L2CAP_TXSEQ_EXPECTED_SREJ;
6008 }
6009
6010 if (l2cap_ertm_seq_in_queue(&chan->srej_q, txseq)) {
6011 BT_DBG("Duplicate SREJ - txseq already stored");
6012 return L2CAP_TXSEQ_DUPLICATE_SREJ;
6013 }
6014
6015 if (l2cap_seq_list_contains(&chan->srej_list, txseq)) {
6016 BT_DBG("Unexpected SREJ - not requested");
6017 return L2CAP_TXSEQ_UNEXPECTED_SREJ;
6018 }
6019 }
6020
6021 if (chan->expected_tx_seq == txseq) {
6022 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
6023 chan->tx_win) {
6024 BT_DBG("Invalid - txseq outside tx window");
6025 return L2CAP_TXSEQ_INVALID;
6026 } else {
6027 BT_DBG("Expected");
6028 return L2CAP_TXSEQ_EXPECTED;
6029 }
6030 }
6031
6032 if (__seq_offset(chan, txseq, chan->last_acked_seq) <
Gustavo Padovan2d792812012-10-06 10:07:01 +01006033 __seq_offset(chan, chan->expected_tx_seq, chan->last_acked_seq)) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07006034 BT_DBG("Duplicate - expected_tx_seq later than txseq");
6035 return L2CAP_TXSEQ_DUPLICATE;
6036 }
6037
6038 if (__seq_offset(chan, txseq, chan->last_acked_seq) >= chan->tx_win) {
6039 /* A source of invalid packets is a "double poll" condition,
6040 * where delays cause us to send multiple poll packets. If
6041 * the remote stack receives and processes both polls,
6042 * sequence numbers can wrap around in such a way that a
6043 * resent frame has a sequence number that looks like new data
6044 * with a sequence gap. This would trigger an erroneous SREJ
6045 * request.
6046 *
6047 * Fortunately, this is impossible with a tx window that's
6048 * less than half of the maximum sequence number, which allows
6049 * invalid frames to be safely ignored.
6050 *
6051 * With tx window sizes greater than half of the tx window
6052 * maximum, the frame is invalid and cannot be ignored. This
6053 * causes a disconnect.
6054 */
6055
6056 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
6057 BT_DBG("Invalid/Ignore - txseq outside tx window");
6058 return L2CAP_TXSEQ_INVALID_IGNORE;
6059 } else {
6060 BT_DBG("Invalid - txseq outside tx window");
6061 return L2CAP_TXSEQ_INVALID;
6062 }
6063 } else {
6064 BT_DBG("Unexpected - txseq indicates missing frames");
6065 return L2CAP_TXSEQ_UNEXPECTED;
6066 }
6067}
6068
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006069static int l2cap_rx_state_recv(struct l2cap_chan *chan,
6070 struct l2cap_ctrl *control,
6071 struct sk_buff *skb, u8 event)
6072{
6073 int err = 0;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006074 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006075
6076 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6077 event);
6078
6079 switch (event) {
6080 case L2CAP_EV_RECV_IFRAME:
6081 switch (l2cap_classify_txseq(chan, control->txseq)) {
6082 case L2CAP_TXSEQ_EXPECTED:
6083 l2cap_pass_to_tx(chan, control);
6084
6085 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6086 BT_DBG("Busy, discarding expected seq %d",
6087 control->txseq);
6088 break;
6089 }
6090
6091 chan->expected_tx_seq = __next_seq(chan,
6092 control->txseq);
6093
6094 chan->buffer_seq = chan->expected_tx_seq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006095 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006096
6097 err = l2cap_reassemble_sdu(chan, skb, control);
6098 if (err)
6099 break;
6100
6101 if (control->final) {
6102 if (!test_and_clear_bit(CONN_REJ_ACT,
6103 &chan->conn_state)) {
6104 control->final = 0;
6105 l2cap_retransmit_all(chan, control);
6106 l2cap_ertm_send(chan);
6107 }
6108 }
6109
6110 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
6111 l2cap_send_ack(chan);
6112 break;
6113 case L2CAP_TXSEQ_UNEXPECTED:
6114 l2cap_pass_to_tx(chan, control);
6115
6116 /* Can't issue SREJ frames in the local busy state.
6117 * Drop this frame, it will be seen as missing
6118 * when local busy is exited.
6119 */
6120 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6121 BT_DBG("Busy, discarding unexpected seq %d",
6122 control->txseq);
6123 break;
6124 }
6125
6126 /* There was a gap in the sequence, so an SREJ
6127 * must be sent for each missing frame. The
6128 * current frame is stored for later use.
6129 */
6130 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006131 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006132 BT_DBG("Queued %p (queue len %d)", skb,
6133 skb_queue_len(&chan->srej_q));
6134
6135 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
6136 l2cap_seq_list_clear(&chan->srej_list);
6137 l2cap_send_srej(chan, control->txseq);
6138
6139 chan->rx_state = L2CAP_RX_STATE_SREJ_SENT;
6140 break;
6141 case L2CAP_TXSEQ_DUPLICATE:
6142 l2cap_pass_to_tx(chan, control);
6143 break;
6144 case L2CAP_TXSEQ_INVALID_IGNORE:
6145 break;
6146 case L2CAP_TXSEQ_INVALID:
6147 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006148 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006149 break;
6150 }
6151 break;
6152 case L2CAP_EV_RECV_RR:
6153 l2cap_pass_to_tx(chan, control);
6154 if (control->final) {
6155 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6156
Mat Martineaue6a3ee62012-10-23 15:24:22 -07006157 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state) &&
6158 !__chan_is_moving(chan)) {
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006159 control->final = 0;
6160 l2cap_retransmit_all(chan, control);
6161 }
6162
6163 l2cap_ertm_send(chan);
6164 } else if (control->poll) {
6165 l2cap_send_i_or_rr_or_rnr(chan);
6166 } else {
6167 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6168 &chan->conn_state) &&
6169 chan->unacked_frames)
6170 __set_retrans_timer(chan);
6171
6172 l2cap_ertm_send(chan);
6173 }
6174 break;
6175 case L2CAP_EV_RECV_RNR:
6176 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6177 l2cap_pass_to_tx(chan, control);
6178 if (control && control->poll) {
6179 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6180 l2cap_send_rr_or_rnr(chan, 0);
6181 }
6182 __clear_retrans_timer(chan);
6183 l2cap_seq_list_clear(&chan->retrans_list);
6184 break;
6185 case L2CAP_EV_RECV_REJ:
6186 l2cap_handle_rej(chan, control);
6187 break;
6188 case L2CAP_EV_RECV_SREJ:
6189 l2cap_handle_srej(chan, control);
6190 break;
6191 default:
6192 break;
6193 }
6194
6195 if (skb && !skb_in_use) {
6196 BT_DBG("Freeing %p", skb);
6197 kfree_skb(skb);
6198 }
6199
6200 return err;
6201}
6202
6203static int l2cap_rx_state_srej_sent(struct l2cap_chan *chan,
6204 struct l2cap_ctrl *control,
6205 struct sk_buff *skb, u8 event)
6206{
6207 int err = 0;
6208 u16 txseq = control->txseq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006209 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006210
6211 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6212 event);
6213
6214 switch (event) {
6215 case L2CAP_EV_RECV_IFRAME:
6216 switch (l2cap_classify_txseq(chan, txseq)) {
6217 case L2CAP_TXSEQ_EXPECTED:
6218 /* Keep frame for reassembly later */
6219 l2cap_pass_to_tx(chan, control);
6220 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006221 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006222 BT_DBG("Queued %p (queue len %d)", skb,
6223 skb_queue_len(&chan->srej_q));
6224
6225 chan->expected_tx_seq = __next_seq(chan, txseq);
6226 break;
6227 case L2CAP_TXSEQ_EXPECTED_SREJ:
6228 l2cap_seq_list_pop(&chan->srej_list);
6229
6230 l2cap_pass_to_tx(chan, control);
6231 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006232 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006233 BT_DBG("Queued %p (queue len %d)", skb,
6234 skb_queue_len(&chan->srej_q));
6235
6236 err = l2cap_rx_queued_iframes(chan);
6237 if (err)
6238 break;
6239
6240 break;
6241 case L2CAP_TXSEQ_UNEXPECTED:
6242 /* Got a frame that can't be reassembled yet.
6243 * Save it for later, and send SREJs to cover
6244 * the missing frames.
6245 */
6246 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006247 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006248 BT_DBG("Queued %p (queue len %d)", skb,
6249 skb_queue_len(&chan->srej_q));
6250
6251 l2cap_pass_to_tx(chan, control);
6252 l2cap_send_srej(chan, control->txseq);
6253 break;
6254 case L2CAP_TXSEQ_UNEXPECTED_SREJ:
6255 /* This frame was requested with an SREJ, but
6256 * some expected retransmitted frames are
6257 * missing. Request retransmission of missing
6258 * SREJ'd frames.
6259 */
6260 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006261 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006262 BT_DBG("Queued %p (queue len %d)", skb,
6263 skb_queue_len(&chan->srej_q));
6264
6265 l2cap_pass_to_tx(chan, control);
6266 l2cap_send_srej_list(chan, control->txseq);
6267 break;
6268 case L2CAP_TXSEQ_DUPLICATE_SREJ:
6269 /* We've already queued this frame. Drop this copy. */
6270 l2cap_pass_to_tx(chan, control);
6271 break;
6272 case L2CAP_TXSEQ_DUPLICATE:
6273 /* Expecting a later sequence number, so this frame
6274 * was already received. Ignore it completely.
6275 */
6276 break;
6277 case L2CAP_TXSEQ_INVALID_IGNORE:
6278 break;
6279 case L2CAP_TXSEQ_INVALID:
6280 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006281 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006282 break;
6283 }
6284 break;
6285 case L2CAP_EV_RECV_RR:
6286 l2cap_pass_to_tx(chan, control);
6287 if (control->final) {
6288 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6289
6290 if (!test_and_clear_bit(CONN_REJ_ACT,
6291 &chan->conn_state)) {
6292 control->final = 0;
6293 l2cap_retransmit_all(chan, control);
6294 }
6295
6296 l2cap_ertm_send(chan);
6297 } else if (control->poll) {
6298 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6299 &chan->conn_state) &&
6300 chan->unacked_frames) {
6301 __set_retrans_timer(chan);
6302 }
6303
6304 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6305 l2cap_send_srej_tail(chan);
6306 } else {
6307 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6308 &chan->conn_state) &&
6309 chan->unacked_frames)
6310 __set_retrans_timer(chan);
6311
6312 l2cap_send_ack(chan);
6313 }
6314 break;
6315 case L2CAP_EV_RECV_RNR:
6316 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6317 l2cap_pass_to_tx(chan, control);
6318 if (control->poll) {
6319 l2cap_send_srej_tail(chan);
6320 } else {
6321 struct l2cap_ctrl rr_control;
6322 memset(&rr_control, 0, sizeof(rr_control));
6323 rr_control.sframe = 1;
6324 rr_control.super = L2CAP_SUPER_RR;
6325 rr_control.reqseq = chan->buffer_seq;
6326 l2cap_send_sframe(chan, &rr_control);
6327 }
6328
6329 break;
6330 case L2CAP_EV_RECV_REJ:
6331 l2cap_handle_rej(chan, control);
6332 break;
6333 case L2CAP_EV_RECV_SREJ:
6334 l2cap_handle_srej(chan, control);
6335 break;
6336 }
6337
6338 if (skb && !skb_in_use) {
6339 BT_DBG("Freeing %p", skb);
6340 kfree_skb(skb);
6341 }
6342
6343 return err;
6344}
6345
Mat Martineau32b32732012-10-23 15:24:11 -07006346static int l2cap_finish_move(struct l2cap_chan *chan)
6347{
6348 BT_DBG("chan %p", chan);
6349
6350 chan->rx_state = L2CAP_RX_STATE_RECV;
6351
6352 if (chan->hs_hcon)
6353 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6354 else
6355 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6356
6357 return l2cap_resegment(chan);
6358}
6359
6360static int l2cap_rx_state_wait_p(struct l2cap_chan *chan,
6361 struct l2cap_ctrl *control,
6362 struct sk_buff *skb, u8 event)
6363{
6364 int err;
6365
6366 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6367 event);
6368
6369 if (!control->poll)
6370 return -EPROTO;
6371
6372 l2cap_process_reqseq(chan, control->reqseq);
6373
6374 if (!skb_queue_empty(&chan->tx_q))
6375 chan->tx_send_head = skb_peek(&chan->tx_q);
6376 else
6377 chan->tx_send_head = NULL;
6378
6379 /* Rewind next_tx_seq to the point expected
6380 * by the receiver.
6381 */
6382 chan->next_tx_seq = control->reqseq;
6383 chan->unacked_frames = 0;
6384
6385 err = l2cap_finish_move(chan);
6386 if (err)
6387 return err;
6388
6389 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6390 l2cap_send_i_or_rr_or_rnr(chan);
6391
6392 if (event == L2CAP_EV_RECV_IFRAME)
6393 return -EPROTO;
6394
6395 return l2cap_rx_state_recv(chan, control, NULL, event);
6396}
6397
6398static int l2cap_rx_state_wait_f(struct l2cap_chan *chan,
6399 struct l2cap_ctrl *control,
6400 struct sk_buff *skb, u8 event)
6401{
6402 int err;
6403
6404 if (!control->final)
6405 return -EPROTO;
6406
6407 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6408
6409 chan->rx_state = L2CAP_RX_STATE_RECV;
6410 l2cap_process_reqseq(chan, control->reqseq);
6411
6412 if (!skb_queue_empty(&chan->tx_q))
6413 chan->tx_send_head = skb_peek(&chan->tx_q);
6414 else
6415 chan->tx_send_head = NULL;
6416
6417 /* Rewind next_tx_seq to the point expected
6418 * by the receiver.
6419 */
6420 chan->next_tx_seq = control->reqseq;
6421 chan->unacked_frames = 0;
6422
6423 if (chan->hs_hcon)
6424 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6425 else
6426 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6427
6428 err = l2cap_resegment(chan);
6429
6430 if (!err)
6431 err = l2cap_rx_state_recv(chan, control, skb, event);
6432
6433 return err;
6434}
6435
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006436static bool __valid_reqseq(struct l2cap_chan *chan, u16 reqseq)
6437{
6438 /* Make sure reqseq is for a packet that has been sent but not acked */
6439 u16 unacked;
6440
6441 unacked = __seq_offset(chan, chan->next_tx_seq, chan->expected_ack_seq);
6442 return __seq_offset(chan, chan->next_tx_seq, reqseq) <= unacked;
6443}
6444
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006445static int l2cap_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6446 struct sk_buff *skb, u8 event)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006447{
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006448 int err = 0;
6449
6450 BT_DBG("chan %p, control %p, skb %p, event %d, state %d", chan,
6451 control, skb, event, chan->rx_state);
6452
6453 if (__valid_reqseq(chan, control->reqseq)) {
6454 switch (chan->rx_state) {
6455 case L2CAP_RX_STATE_RECV:
6456 err = l2cap_rx_state_recv(chan, control, skb, event);
6457 break;
6458 case L2CAP_RX_STATE_SREJ_SENT:
6459 err = l2cap_rx_state_srej_sent(chan, control, skb,
6460 event);
6461 break;
Mat Martineau32b32732012-10-23 15:24:11 -07006462 case L2CAP_RX_STATE_WAIT_P:
6463 err = l2cap_rx_state_wait_p(chan, control, skb, event);
6464 break;
6465 case L2CAP_RX_STATE_WAIT_F:
6466 err = l2cap_rx_state_wait_f(chan, control, skb, event);
6467 break;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006468 default:
6469 /* shut it down */
6470 break;
6471 }
6472 } else {
6473 BT_DBG("Invalid reqseq %d (next_tx_seq %d, expected_ack_seq %d",
6474 control->reqseq, chan->next_tx_seq,
6475 chan->expected_ack_seq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006476 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006477 }
6478
6479 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006480}
6481
6482static int l2cap_stream_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6483 struct sk_buff *skb)
6484{
Mat Martineau4b51dae92012-05-17 20:53:37 -07006485 int err = 0;
6486
6487 BT_DBG("chan %p, control %p, skb %p, state %d", chan, control, skb,
6488 chan->rx_state);
6489
6490 if (l2cap_classify_txseq(chan, control->txseq) ==
6491 L2CAP_TXSEQ_EXPECTED) {
6492 l2cap_pass_to_tx(chan, control);
6493
6494 BT_DBG("buffer_seq %d->%d", chan->buffer_seq,
6495 __next_seq(chan, chan->buffer_seq));
6496
6497 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
6498
6499 l2cap_reassemble_sdu(chan, skb, control);
6500 } else {
6501 if (chan->sdu) {
6502 kfree_skb(chan->sdu);
6503 chan->sdu = NULL;
6504 }
6505 chan->sdu_last_frag = NULL;
6506 chan->sdu_len = 0;
6507
6508 if (skb) {
6509 BT_DBG("Freeing %p", skb);
6510 kfree_skb(skb);
6511 }
6512 }
6513
6514 chan->last_acked_seq = control->txseq;
6515 chan->expected_tx_seq = __next_seq(chan, control->txseq);
6516
6517 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006518}
6519
6520static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6521{
6522 struct l2cap_ctrl *control = &bt_cb(skb)->control;
6523 u16 len;
6524 u8 event;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006525
Mat Martineaub76bbd62012-04-11 10:48:43 -07006526 __unpack_control(chan, skb);
6527
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006528 len = skb->len;
6529
6530 /*
6531 * We can just drop the corrupted I-frame here.
6532 * Receiver will miss it and start proper recovery
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006533 * procedures and ask for retransmission.
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006534 */
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006535 if (l2cap_check_fcs(chan, skb))
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006536 goto drop;
6537
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006538 if (!control->sframe && control->sar == L2CAP_SAR_START)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006539 len -= L2CAP_SDULEN_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006540
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006541 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006542 len -= L2CAP_FCS_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006543
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006544 if (len > chan->mps) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006545 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006546 goto drop;
6547 }
6548
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006549 if (!control->sframe) {
6550 int err;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006551
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006552 BT_DBG("iframe sar %d, reqseq %d, final %d, txseq %d",
6553 control->sar, control->reqseq, control->final,
6554 control->txseq);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03006555
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006556 /* Validate F-bit - F=0 always valid, F=1 only
6557 * valid in TX WAIT_F
6558 */
6559 if (control->final && chan->tx_state != L2CAP_TX_STATE_WAIT_F)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006560 goto drop;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006561
6562 if (chan->mode != L2CAP_MODE_STREAMING) {
6563 event = L2CAP_EV_RECV_IFRAME;
6564 err = l2cap_rx(chan, control, skb, event);
6565 } else {
6566 err = l2cap_stream_rx(chan, control, skb);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006567 }
6568
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006569 if (err)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006570 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006571 } else {
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006572 const u8 rx_func_to_event[4] = {
6573 L2CAP_EV_RECV_RR, L2CAP_EV_RECV_REJ,
6574 L2CAP_EV_RECV_RNR, L2CAP_EV_RECV_SREJ
6575 };
6576
6577 /* Only I-frames are expected in streaming mode */
6578 if (chan->mode == L2CAP_MODE_STREAMING)
6579 goto drop;
6580
6581 BT_DBG("sframe reqseq %d, final %d, poll %d, super %d",
6582 control->reqseq, control->final, control->poll,
6583 control->super);
6584
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006585 if (len != 0) {
Andrei Emeltchenko1bb166e2012-11-20 17:16:21 +02006586 BT_ERR("Trailing bytes: %d in sframe", len);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006587 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006588 goto drop;
6589 }
6590
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006591 /* Validate F and P bits */
6592 if (control->final && (control->poll ||
6593 chan->tx_state != L2CAP_TX_STATE_WAIT_F))
6594 goto drop;
6595
6596 event = rx_func_to_event[control->super];
6597 if (l2cap_rx(chan, control, skb, event))
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006598 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006599 }
6600
6601 return 0;
6602
6603drop:
6604 kfree_skb(skb);
6605 return 0;
6606}
6607
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006608static void l2cap_chan_le_send_credits(struct l2cap_chan *chan)
6609{
6610 struct l2cap_conn *conn = chan->conn;
6611 struct l2cap_le_credits pkt;
6612 u16 return_credits;
6613
6614 /* We return more credits to the sender only after the amount of
6615 * credits falls below half of the initial amount.
6616 */
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02006617 if (chan->rx_credits >= (le_max_credits + 1) / 2)
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006618 return;
6619
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02006620 return_credits = le_max_credits - chan->rx_credits;
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006621
6622 BT_DBG("chan %p returning %u credits to sender", chan, return_credits);
6623
6624 chan->rx_credits += return_credits;
6625
6626 pkt.cid = cpu_to_le16(chan->scid);
6627 pkt.credits = cpu_to_le16(return_credits);
6628
6629 chan->ident = l2cap_get_ident(conn);
6630
6631 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CREDITS, sizeof(pkt), &pkt);
6632}
6633
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006634static int l2cap_le_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6635{
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006636 int err;
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006637
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006638 if (!chan->rx_credits) {
6639 BT_ERR("No credits to receive LE L2CAP data");
Johan Hedbergdfd97742014-01-27 15:11:34 -08006640 l2cap_send_disconn_req(chan, ECONNRESET);
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006641 return -ENOBUFS;
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006642 }
6643
6644 if (chan->imtu < skb->len) {
6645 BT_ERR("Too big LE L2CAP PDU");
6646 return -ENOBUFS;
6647 }
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006648
6649 chan->rx_credits--;
6650 BT_DBG("rx_credits %u -> %u", chan->rx_credits + 1, chan->rx_credits);
6651
6652 l2cap_chan_le_send_credits(chan);
6653
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006654 err = 0;
6655
6656 if (!chan->sdu) {
6657 u16 sdu_len;
6658
6659 sdu_len = get_unaligned_le16(skb->data);
6660 skb_pull(skb, L2CAP_SDULEN_SIZE);
6661
6662 BT_DBG("Start of new SDU. sdu_len %u skb->len %u imtu %u",
6663 sdu_len, skb->len, chan->imtu);
6664
6665 if (sdu_len > chan->imtu) {
6666 BT_ERR("Too big LE L2CAP SDU length received");
6667 err = -EMSGSIZE;
6668 goto failed;
6669 }
6670
6671 if (skb->len > sdu_len) {
6672 BT_ERR("Too much LE L2CAP data received");
6673 err = -EINVAL;
6674 goto failed;
6675 }
6676
6677 if (skb->len == sdu_len)
6678 return chan->ops->recv(chan, skb);
6679
6680 chan->sdu = skb;
6681 chan->sdu_len = sdu_len;
6682 chan->sdu_last_frag = skb;
6683
6684 return 0;
6685 }
6686
6687 BT_DBG("SDU fragment. chan->sdu->len %u skb->len %u chan->sdu_len %u",
6688 chan->sdu->len, skb->len, chan->sdu_len);
6689
6690 if (chan->sdu->len + skb->len > chan->sdu_len) {
6691 BT_ERR("Too much LE L2CAP data received");
6692 err = -EINVAL;
6693 goto failed;
6694 }
6695
6696 append_skb_frag(chan->sdu, skb, &chan->sdu_last_frag);
6697 skb = NULL;
6698
6699 if (chan->sdu->len == chan->sdu_len) {
6700 err = chan->ops->recv(chan, chan->sdu);
6701 if (!err) {
6702 chan->sdu = NULL;
6703 chan->sdu_last_frag = NULL;
6704 chan->sdu_len = 0;
6705 }
6706 }
6707
6708failed:
6709 if (err) {
6710 kfree_skb(skb);
6711 kfree_skb(chan->sdu);
6712 chan->sdu = NULL;
6713 chan->sdu_last_frag = NULL;
6714 chan->sdu_len = 0;
6715 }
6716
6717 /* We can't return an error here since we took care of the skb
6718 * freeing internally. An error return would cause the caller to
6719 * do a double-free of the skb.
6720 */
6721 return 0;
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006722}
6723
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006724static void l2cap_data_channel(struct l2cap_conn *conn, u16 cid,
6725 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006726{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006727 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006728
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03006729 chan = l2cap_get_chan_by_scid(conn, cid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006730 if (!chan) {
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006731 if (cid == L2CAP_CID_A2MP) {
6732 chan = a2mp_channel_create(conn, skb);
6733 if (!chan) {
6734 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006735 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006736 }
6737
6738 l2cap_chan_lock(chan);
6739 } else {
6740 BT_DBG("unknown cid 0x%4.4x", cid);
6741 /* Drop packet and return */
6742 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006743 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006744 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006745 }
6746
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03006747 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006748
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03006749 if (chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006750 goto drop;
6751
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006752 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03006753 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006754 if (l2cap_le_data_rcv(chan, skb) < 0)
6755 goto drop;
6756
6757 goto done;
6758
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006759 case L2CAP_MODE_BASIC:
6760 /* If socket recv buffers overflows we drop data here
6761 * which is *bad* because L2CAP has to be reliable.
6762 * But we don't have any other choice. L2CAP doesn't
6763 * provide flow control mechanism. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07006764
Szymon Janc2c96e032014-02-18 20:48:34 +01006765 if (chan->imtu < skb->len) {
6766 BT_ERR("Dropping L2CAP data: receive buffer overflow");
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006767 goto drop;
Szymon Janc2c96e032014-02-18 20:48:34 +01006768 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006769
Gustavo Padovan80b98022012-05-27 22:27:51 -03006770 if (!chan->ops->recv(chan, skb))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006771 goto done;
6772 break;
6773
6774 case L2CAP_MODE_ERTM:
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006775 case L2CAP_MODE_STREAMING:
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006776 l2cap_data_rcv(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006777 goto done;
6778
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006779 default:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006780 BT_DBG("chan %p: bad mode 0x%2.2x", chan, chan->mode);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006781 break;
6782 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006783
6784drop:
6785 kfree_skb(skb);
6786
6787done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006788 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006789}
6790
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006791static void l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm,
6792 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006793{
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006794 struct hci_conn *hcon = conn->hcon;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006795 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006796
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006797 if (hcon->type != ACL_LINK)
Johan Hedberga24cce12014-08-07 22:56:42 +03006798 goto free_skb;
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006799
Johan Hedbergbf20fd42013-05-14 13:23:13 +03006800 chan = l2cap_global_chan_by_psm(0, psm, &hcon->src, &hcon->dst,
6801 ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006802 if (!chan)
Johan Hedberga24cce12014-08-07 22:56:42 +03006803 goto free_skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006804
Andrei Emeltchenko5b4ceda2012-02-24 16:35:32 +02006805 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006806
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03006807 if (chan->state != BT_BOUND && chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006808 goto drop;
6809
Vinicius Costa Gomese13e21d2011-06-17 22:46:27 -03006810 if (chan->imtu < skb->len)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006811 goto drop;
6812
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006813 /* Store remote BD_ADDR and PSM for msg_name */
Marcel Holtmann06ae3312013-10-18 03:43:00 -07006814 bacpy(&bt_cb(skb)->bdaddr, &hcon->dst);
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006815 bt_cb(skb)->psm = psm;
6816
Johan Hedberga24cce12014-08-07 22:56:42 +03006817 if (!chan->ops->recv(chan, skb)) {
6818 l2cap_chan_put(chan);
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006819 return;
Johan Hedberga24cce12014-08-07 22:56:42 +03006820 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006821
6822drop:
Johan Hedberga24cce12014-08-07 22:56:42 +03006823 l2cap_chan_put(chan);
6824free_skb:
Linus Torvalds1da177e2005-04-16 15:20:36 -07006825 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006826}
6827
6828static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb)
6829{
6830 struct l2cap_hdr *lh = (void *) skb->data;
Johan Hedberg61a939c2014-01-17 20:45:11 +02006831 struct hci_conn *hcon = conn->hcon;
Al Viro8e036fc2007-07-29 00:16:36 -07006832 u16 cid, len;
6833 __le16 psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006834
Johan Hedberg61a939c2014-01-17 20:45:11 +02006835 if (hcon->state != BT_CONNECTED) {
6836 BT_DBG("queueing pending rx skb");
6837 skb_queue_tail(&conn->pending_rx, skb);
6838 return;
6839 }
6840
Linus Torvalds1da177e2005-04-16 15:20:36 -07006841 skb_pull(skb, L2CAP_HDR_SIZE);
6842 cid = __le16_to_cpu(lh->cid);
6843 len = __le16_to_cpu(lh->len);
6844
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006845 if (len != skb->len) {
6846 kfree_skb(skb);
6847 return;
6848 }
6849
Johan Hedberg9e1d7e12014-07-06 11:03:36 +03006850 /* Since we can't actively block incoming LE connections we must
6851 * at least ensure that we ignore incoming data from them.
6852 */
6853 if (hcon->type == LE_LINK &&
Johan Hedbergdcc36c12014-07-09 12:59:13 +03006854 hci_bdaddr_list_lookup(&hcon->hdev->blacklist, &hcon->dst,
6855 bdaddr_type(hcon, hcon->dst_type))) {
Johan Hedberge4931502014-07-02 09:36:21 +03006856 kfree_skb(skb);
6857 return;
6858 }
6859
Linus Torvalds1da177e2005-04-16 15:20:36 -07006860 BT_DBG("len %d, cid 0x%4.4x", len, cid);
6861
6862 switch (cid) {
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006863 case L2CAP_CID_SIGNALING:
Linus Torvalds1da177e2005-04-16 15:20:36 -07006864 l2cap_sig_channel(conn, skb);
6865 break;
6866
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006867 case L2CAP_CID_CONN_LESS:
Andrei Emeltchenko097db762012-03-09 14:16:17 +02006868 psm = get_unaligned((__le16 *) skb->data);
Andrei Emeltchenko0181a702012-05-29 10:04:05 +03006869 skb_pull(skb, L2CAP_PSMLEN_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006870 l2cap_conless_channel(conn, psm, skb);
6871 break;
6872
Marcel Holtmanna2877622013-10-02 23:46:54 -07006873 case L2CAP_CID_LE_SIGNALING:
6874 l2cap_le_sig_channel(conn, skb);
6875 break;
6876
Linus Torvalds1da177e2005-04-16 15:20:36 -07006877 default:
6878 l2cap_data_channel(conn, cid, skb);
6879 break;
6880 }
6881}
6882
Johan Hedberg61a939c2014-01-17 20:45:11 +02006883static void process_pending_rx(struct work_struct *work)
6884{
6885 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
6886 pending_rx_work);
6887 struct sk_buff *skb;
6888
6889 BT_DBG("");
6890
6891 while ((skb = skb_dequeue(&conn->pending_rx)))
6892 l2cap_recv_frame(conn, skb);
6893}
6894
Johan Hedberg162b49e2014-01-17 20:45:10 +02006895static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon)
6896{
6897 struct l2cap_conn *conn = hcon->l2cap_data;
6898 struct hci_chan *hchan;
6899
6900 if (conn)
6901 return conn;
6902
6903 hchan = hci_chan_create(hcon);
6904 if (!hchan)
6905 return NULL;
6906
Johan Hedberg27f70f32014-07-21 10:50:06 +03006907 conn = kzalloc(sizeof(*conn), GFP_KERNEL);
Johan Hedberg162b49e2014-01-17 20:45:10 +02006908 if (!conn) {
6909 hci_chan_del(hchan);
6910 return NULL;
6911 }
6912
6913 kref_init(&conn->ref);
6914 hcon->l2cap_data = conn;
Johan Hedberg51bb84572014-08-15 21:06:57 +03006915 conn->hcon = hci_conn_get(hcon);
Johan Hedberg162b49e2014-01-17 20:45:10 +02006916 conn->hchan = hchan;
6917
6918 BT_DBG("hcon %p conn %p hchan %p", hcon, conn, hchan);
6919
6920 switch (hcon->type) {
6921 case LE_LINK:
6922 if (hcon->hdev->le_mtu) {
6923 conn->mtu = hcon->hdev->le_mtu;
6924 break;
6925 }
6926 /* fall through */
6927 default:
6928 conn->mtu = hcon->hdev->acl_mtu;
6929 break;
6930 }
6931
6932 conn->feat_mask = 0;
6933
6934 if (hcon->type == ACL_LINK)
6935 conn->hs_enabled = test_bit(HCI_HS_ENABLED,
6936 &hcon->hdev->dev_flags);
6937
Marcel Holtmann5a54e7c2014-07-13 20:50:15 +02006938 mutex_init(&conn->ident_lock);
Johan Hedberg162b49e2014-01-17 20:45:10 +02006939 mutex_init(&conn->chan_lock);
6940
6941 INIT_LIST_HEAD(&conn->chan_l);
6942 INIT_LIST_HEAD(&conn->users);
6943
Johan Hedberg276d8072014-08-11 22:06:41 +03006944 INIT_DELAYED_WORK(&conn->info_timer, l2cap_info_timeout);
Johan Hedberg162b49e2014-01-17 20:45:10 +02006945
Johan Hedbergdec5b492014-08-11 22:06:37 +03006946 INIT_WORK(&conn->disconn_work, disconn_work);
6947
Johan Hedberg61a939c2014-01-17 20:45:11 +02006948 skb_queue_head_init(&conn->pending_rx);
6949 INIT_WORK(&conn->pending_rx_work, process_pending_rx);
6950
Johan Hedberg162b49e2014-01-17 20:45:10 +02006951 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
6952
6953 return conn;
6954}
6955
6956static bool is_valid_psm(u16 psm, u8 dst_type) {
6957 if (!psm)
6958 return false;
6959
6960 if (bdaddr_type_is_le(dst_type))
6961 return (psm <= 0x00ff);
6962
6963 /* PSM must be odd and lsb of upper byte must be 0 */
6964 return ((psm & 0x0101) == 0x0001);
6965}
6966
6967int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
6968 bdaddr_t *dst, u8 dst_type)
6969{
6970 struct l2cap_conn *conn;
6971 struct hci_conn *hcon;
6972 struct hci_dev *hdev;
Johan Hedberg162b49e2014-01-17 20:45:10 +02006973 int err;
6974
6975 BT_DBG("%pMR -> %pMR (type %u) psm 0x%2.2x", &chan->src, dst,
6976 dst_type, __le16_to_cpu(psm));
6977
6978 hdev = hci_get_route(dst, &chan->src);
6979 if (!hdev)
6980 return -EHOSTUNREACH;
6981
6982 hci_dev_lock(hdev);
6983
6984 l2cap_chan_lock(chan);
6985
6986 if (!is_valid_psm(__le16_to_cpu(psm), dst_type) && !cid &&
6987 chan->chan_type != L2CAP_CHAN_RAW) {
6988 err = -EINVAL;
6989 goto done;
6990 }
6991
Johan Hedberg21626e62014-01-24 10:35:41 +02006992 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED && !psm) {
6993 err = -EINVAL;
6994 goto done;
6995 }
6996
6997 if (chan->chan_type == L2CAP_CHAN_FIXED && !cid) {
Johan Hedberg162b49e2014-01-17 20:45:10 +02006998 err = -EINVAL;
6999 goto done;
7000 }
7001
7002 switch (chan->mode) {
7003 case L2CAP_MODE_BASIC:
7004 break;
7005 case L2CAP_MODE_LE_FLOWCTL:
7006 l2cap_le_flowctl_init(chan);
7007 break;
7008 case L2CAP_MODE_ERTM:
7009 case L2CAP_MODE_STREAMING:
7010 if (!disable_ertm)
7011 break;
7012 /* fall through */
7013 default:
Johan Hedbergbeb19e42014-07-18 11:15:26 +03007014 err = -EOPNOTSUPP;
Johan Hedberg162b49e2014-01-17 20:45:10 +02007015 goto done;
7016 }
7017
7018 switch (chan->state) {
7019 case BT_CONNECT:
7020 case BT_CONNECT2:
7021 case BT_CONFIG:
7022 /* Already connecting */
7023 err = 0;
7024 goto done;
7025
7026 case BT_CONNECTED:
7027 /* Already connected */
7028 err = -EISCONN;
7029 goto done;
7030
7031 case BT_OPEN:
7032 case BT_BOUND:
7033 /* Can connect */
7034 break;
7035
7036 default:
7037 err = -EBADFD;
7038 goto done;
7039 }
7040
7041 /* Set destination address and psm */
7042 bacpy(&chan->dst, dst);
7043 chan->dst_type = dst_type;
7044
7045 chan->psm = psm;
7046 chan->dcid = cid;
7047
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007048 if (bdaddr_type_is_le(dst_type)) {
Johan Hedberge804d252014-07-16 11:42:28 +03007049 u8 role;
Johan Hedbergcdd62752014-07-07 15:02:28 +03007050
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007051 /* Convert from L2CAP channel address type to HCI address type
7052 */
7053 if (dst_type == BDADDR_LE_PUBLIC)
7054 dst_type = ADDR_LE_DEV_PUBLIC;
7055 else
7056 dst_type = ADDR_LE_DEV_RANDOM;
7057
Johan Hedberge804d252014-07-16 11:42:28 +03007058 if (test_bit(HCI_ADVERTISING, &hdev->dev_flags))
7059 role = HCI_ROLE_SLAVE;
7060 else
7061 role = HCI_ROLE_MASTER;
Johan Hedbergcdd62752014-07-07 15:02:28 +03007062
Andre Guedes04a6c582014-02-26 20:21:44 -03007063 hcon = hci_connect_le(hdev, dst, dst_type, chan->sec_level,
Johan Hedberge804d252014-07-16 11:42:28 +03007064 HCI_LE_CONN_TIMEOUT, role);
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007065 } else {
Johan Hedbergd93375a2014-07-07 15:02:27 +03007066 u8 auth_type = l2cap_get_auth_type(chan);
Andre Guedes04a6c582014-02-26 20:21:44 -03007067 hcon = hci_connect_acl(hdev, dst, chan->sec_level, auth_type);
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007068 }
Johan Hedberg162b49e2014-01-17 20:45:10 +02007069
7070 if (IS_ERR(hcon)) {
7071 err = PTR_ERR(hcon);
7072 goto done;
7073 }
7074
7075 conn = l2cap_conn_add(hcon);
7076 if (!conn) {
7077 hci_conn_drop(hcon);
7078 err = -ENOMEM;
7079 goto done;
7080 }
7081
7082 if (cid && __l2cap_get_chan_by_dcid(conn, cid)) {
7083 hci_conn_drop(hcon);
7084 err = -EBUSY;
7085 goto done;
7086 }
7087
7088 /* Update source addr of the socket */
7089 bacpy(&chan->src, &hcon->src);
7090 chan->src_type = bdaddr_type(hcon, hcon->src_type);
7091
Johan Hedberg162b49e2014-01-17 20:45:10 +02007092 l2cap_chan_add(conn, chan);
Johan Hedberg162b49e2014-01-17 20:45:10 +02007093
7094 /* l2cap_chan_add takes its own ref so we can drop this one */
7095 hci_conn_drop(hcon);
7096
7097 l2cap_state_change(chan, BT_CONNECT);
7098 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
7099
Johan Hedberg61202e42014-01-28 15:16:48 -08007100 /* Release chan->sport so that it can be reused by other
7101 * sockets (as it's only used for listening sockets).
7102 */
7103 write_lock(&chan_list_lock);
7104 chan->sport = 0;
7105 write_unlock(&chan_list_lock);
7106
Johan Hedberg162b49e2014-01-17 20:45:10 +02007107 if (hcon->state == BT_CONNECTED) {
7108 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
7109 __clear_chan_timer(chan);
Johan Hedberge7cafc42014-07-17 15:35:38 +03007110 if (l2cap_chan_check_security(chan, true))
Johan Hedberg162b49e2014-01-17 20:45:10 +02007111 l2cap_state_change(chan, BT_CONNECTED);
7112 } else
7113 l2cap_do_start(chan);
7114 }
7115
7116 err = 0;
7117
7118done:
7119 l2cap_chan_unlock(chan);
7120 hci_dev_unlock(hdev);
7121 hci_dev_put(hdev);
7122 return err;
7123}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +03007124EXPORT_SYMBOL_GPL(l2cap_chan_connect);
Johan Hedberg162b49e2014-01-17 20:45:10 +02007125
Linus Torvalds1da177e2005-04-16 15:20:36 -07007126/* ---- L2CAP interface with lower layer (HCI) ---- */
7127
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007128int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007129{
7130 int exact = 0, lm1 = 0, lm2 = 0;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007131 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007132
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03007133 BT_DBG("hdev %s, bdaddr %pMR", hdev->name, bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007134
7135 /* Find listening sockets and check their link_mode */
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007136 read_lock(&chan_list_lock);
7137 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03007138 if (c->state != BT_LISTEN)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007139 continue;
7140
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007141 if (!bacmp(&c->src, &hdev->bdaddr)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007142 lm1 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03007143 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007144 lm1 |= HCI_LM_MASTER;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007145 exact++;
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007146 } else if (!bacmp(&c->src, BDADDR_ANY)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007147 lm2 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03007148 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007149 lm2 |= HCI_LM_MASTER;
7150 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007151 }
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007152 read_unlock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007153
7154 return exact ? lm1 : lm2;
7155}
7156
Johan Hedberge760ec12014-08-07 22:56:47 +03007157/* Find the next fixed channel in BT_LISTEN state, continue iteration
7158 * from an existing channel in the list or from the beginning of the
7159 * global list (by passing NULL as first parameter).
7160 */
7161static struct l2cap_chan *l2cap_global_fixed_chan(struct l2cap_chan *c,
Johan Hedberg54a1b622014-08-07 22:56:48 +03007162 bdaddr_t *src, u8 link_type)
Johan Hedberge760ec12014-08-07 22:56:47 +03007163{
7164 read_lock(&chan_list_lock);
7165
7166 if (c)
7167 c = list_next_entry(c, global_l);
7168 else
7169 c = list_entry(chan_list.next, typeof(*c), global_l);
7170
7171 list_for_each_entry_from(c, &chan_list, global_l) {
7172 if (c->chan_type != L2CAP_CHAN_FIXED)
7173 continue;
7174 if (c->state != BT_LISTEN)
7175 continue;
7176 if (bacmp(&c->src, src) && bacmp(&c->src, BDADDR_ANY))
7177 continue;
Johan Hedberg54a1b622014-08-07 22:56:48 +03007178 if (link_type == ACL_LINK && c->src_type != BDADDR_BREDR)
7179 continue;
7180 if (link_type == LE_LINK && c->src_type == BDADDR_BREDR)
7181 continue;
Johan Hedberge760ec12014-08-07 22:56:47 +03007182
7183 l2cap_chan_hold(c);
7184 read_unlock(&chan_list_lock);
7185 return c;
7186 }
7187
7188 read_unlock(&chan_list_lock);
7189
7190 return NULL;
7191}
7192
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03007193void l2cap_connect_cfm(struct hci_conn *hcon, u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007194{
Johan Hedberge760ec12014-08-07 22:56:47 +03007195 struct hci_dev *hdev = hcon->hdev;
Marcel Holtmann01394182006-07-03 10:02:46 +02007196 struct l2cap_conn *conn;
Johan Hedberge760ec12014-08-07 22:56:47 +03007197 struct l2cap_chan *pchan;
7198 u8 dst_type;
Marcel Holtmann01394182006-07-03 10:02:46 +02007199
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03007200 BT_DBG("hcon %p bdaddr %pMR status %d", hcon, &hcon->dst, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007201
Johan Hedbergdc0f5082014-08-07 22:56:46 +03007202 if (status) {
Joe Perchese1750722011-06-29 18:18:29 -07007203 l2cap_conn_del(hcon, bt_to_errno(status));
Johan Hedbergdc0f5082014-08-07 22:56:46 +03007204 return;
Andrei Emeltchenkoba6fc312012-10-31 15:46:26 +02007205 }
Johan Hedbergdc0f5082014-08-07 22:56:46 +03007206
7207 conn = l2cap_conn_add(hcon);
7208 if (!conn)
7209 return;
7210
Johan Hedberge760ec12014-08-07 22:56:47 +03007211 dst_type = bdaddr_type(hcon, hcon->dst_type);
7212
7213 /* If device is blocked, do not create channels for it */
7214 if (hci_bdaddr_list_lookup(&hdev->blacklist, &hcon->dst, dst_type))
7215 return;
7216
7217 /* Find fixed channels and notify them of the new connection. We
7218 * use multiple individual lookups, continuing each time where
7219 * we left off, because the list lock would prevent calling the
7220 * potentially sleeping l2cap_chan_lock() function.
7221 */
Johan Hedberg54a1b622014-08-07 22:56:48 +03007222 pchan = l2cap_global_fixed_chan(NULL, &hdev->bdaddr, hcon->type);
Johan Hedberge760ec12014-08-07 22:56:47 +03007223 while (pchan) {
7224 struct l2cap_chan *chan, *next;
7225
7226 /* Client fixed channels should override server ones */
7227 if (__l2cap_get_chan_by_dcid(conn, pchan->scid))
7228 goto next;
7229
7230 l2cap_chan_lock(pchan);
7231 chan = pchan->ops->new_connection(pchan);
7232 if (chan) {
7233 bacpy(&chan->src, &hcon->src);
7234 bacpy(&chan->dst, &hcon->dst);
7235 chan->src_type = bdaddr_type(hcon, hcon->src_type);
7236 chan->dst_type = dst_type;
7237
7238 __l2cap_chan_add(conn, chan);
7239 }
7240
7241 l2cap_chan_unlock(pchan);
7242next:
Johan Hedberg54a1b622014-08-07 22:56:48 +03007243 next = l2cap_global_fixed_chan(pchan, &hdev->bdaddr,
7244 hcon->type);
Johan Hedberge760ec12014-08-07 22:56:47 +03007245 l2cap_chan_put(pchan);
7246 pchan = next;
7247 }
7248
Johan Hedbergdc0f5082014-08-07 22:56:46 +03007249 l2cap_conn_ready(conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007250}
7251
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007252int l2cap_disconn_ind(struct hci_conn *hcon)
Marcel Holtmann2950f212009-02-12 14:02:50 +01007253{
7254 struct l2cap_conn *conn = hcon->l2cap_data;
7255
7256 BT_DBG("hcon %p", hcon);
7257
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007258 if (!conn)
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02007259 return HCI_ERROR_REMOTE_USER_TERM;
Marcel Holtmann2950f212009-02-12 14:02:50 +01007260 return conn->disc_reason;
7261}
7262
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03007263void l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007264{
7265 BT_DBG("hcon %p reason %d", hcon, reason);
7266
Joe Perchese1750722011-06-29 18:18:29 -07007267 l2cap_conn_del(hcon, bt_to_errno(reason));
Linus Torvalds1da177e2005-04-16 15:20:36 -07007268}
7269
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007270static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt)
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007271{
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03007272 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED)
Marcel Holtmann255c7602009-02-04 21:07:19 +01007273 return;
7274
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007275 if (encrypt == 0x00) {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007276 if (chan->sec_level == BT_SECURITY_MEDIUM) {
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007277 __set_chan_timer(chan, L2CAP_ENC_TIMEOUT);
Marcel Holtmann7d513e92014-01-15 22:37:40 -08007278 } else if (chan->sec_level == BT_SECURITY_HIGH ||
7279 chan->sec_level == BT_SECURITY_FIPS)
Gustavo F. Padovan0f852722011-05-04 19:42:50 -03007280 l2cap_chan_close(chan, ECONNREFUSED);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007281 } else {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007282 if (chan->sec_level == BT_SECURITY_MEDIUM)
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -03007283 __clear_chan_timer(chan);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007284 }
7285}
7286
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007287int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007288{
Marcel Holtmann40be4922008-07-14 20:13:50 +02007289 struct l2cap_conn *conn = hcon->l2cap_data;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03007290 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007291
Marcel Holtmann01394182006-07-03 10:02:46 +02007292 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007293 return 0;
Marcel Holtmann01394182006-07-03 10:02:46 +02007294
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03007295 BT_DBG("conn %p status 0x%2.2x encrypt %u", conn, status, encrypt);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007296
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007297 mutex_lock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007298
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007299 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007300 l2cap_chan_lock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007301
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03007302 BT_DBG("chan %p scid 0x%4.4x state %s", chan, chan->scid,
7303 state_to_string(chan->state));
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007304
Johan Hedberg2338a7e2014-01-24 10:35:40 +02007305 if (chan->scid == L2CAP_CID_A2MP) {
Andrei Emeltchenko78eb2f92012-07-19 17:03:47 +03007306 l2cap_chan_unlock(chan);
7307 continue;
7308 }
7309
Johan Hedberg191eb392014-08-07 22:56:45 +03007310 if (!status && encrypt)
7311 chan->sec_level = hcon->sec_level;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007312
Andrei Emeltchenko96eff462012-11-15 18:14:53 +02007313 if (!__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007314 l2cap_chan_unlock(chan);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01007315 continue;
7316 }
7317
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03007318 if (!status && (chan->state == BT_CONNECTED ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01007319 chan->state == BT_CONFIG)) {
Marcel Holtmannd97c8992013-10-14 02:53:54 -07007320 chan->ops->resume(chan);
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007321 l2cap_check_encryption(chan, encrypt);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007322 l2cap_chan_unlock(chan);
Marcel Holtmann9719f8a2008-07-14 20:13:45 +02007323 continue;
7324 }
7325
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03007326 if (chan->state == BT_CONNECT) {
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007327 if (!status)
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03007328 l2cap_start_connection(chan);
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007329 else
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007330 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03007331 } else if (chan->state == BT_CONNECT2) {
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007332 struct l2cap_conn_rsp rsp;
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007333 __u16 res, stat;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007334
7335 if (!status) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07007336 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007337 res = L2CAP_CR_PEND;
7338 stat = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08007339 chan->ops->defer(chan);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007340 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007341 l2cap_state_change(chan, BT_CONFIG);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007342 res = L2CAP_CR_SUCCESS;
7343 stat = L2CAP_CS_NO_INFO;
7344 }
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007345 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007346 l2cap_state_change(chan, BT_DISCONN);
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007347 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007348 res = L2CAP_CR_SEC_BLOCK;
7349 stat = L2CAP_CS_NO_INFO;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007350 }
7351
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03007352 rsp.scid = cpu_to_le16(chan->dcid);
7353 rsp.dcid = cpu_to_le16(chan->scid);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007354 rsp.result = cpu_to_le16(res);
7355 rsp.status = cpu_to_le16(stat);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03007356 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01007357 sizeof(rsp), &rsp);
Mat Martineau2d369352012-05-23 14:59:30 -07007358
7359 if (!test_bit(CONF_REQ_SENT, &chan->conf_state) &&
7360 res == L2CAP_CR_SUCCESS) {
7361 char buf[128];
7362 set_bit(CONF_REQ_SENT, &chan->conf_state);
7363 l2cap_send_cmd(conn, l2cap_get_ident(conn),
7364 L2CAP_CONF_REQ,
7365 l2cap_build_conf_req(chan, buf),
7366 buf);
7367 chan->num_conf_req++;
7368 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007369 }
7370
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007371 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007372 }
7373
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007374 mutex_unlock(&conn->chan_lock);
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007375
Linus Torvalds1da177e2005-04-16 15:20:36 -07007376 return 0;
7377}
7378
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007379int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007380{
7381 struct l2cap_conn *conn = hcon->l2cap_data;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007382 struct l2cap_hdr *hdr;
7383 int len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007384
Andrei Emeltchenko1d13a252012-10-15 11:58:41 +03007385 /* For AMP controller do not create l2cap conn */
7386 if (!conn && hcon->hdev->dev_type != HCI_BREDR)
7387 goto drop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007388
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007389 if (!conn)
Claudio Takahasibaf43252013-04-11 13:55:50 -03007390 conn = l2cap_conn_add(hcon);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007391
7392 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007393 goto drop;
7394
7395 BT_DBG("conn %p len %d flags 0x%x", conn, skb->len, flags);
7396
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007397 switch (flags) {
7398 case ACL_START:
7399 case ACL_START_NO_FLUSH:
7400 case ACL_COMPLETE:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007401 if (conn->rx_len) {
7402 BT_ERR("Unexpected start frame (len %d)", skb->len);
7403 kfree_skb(conn->rx_skb);
7404 conn->rx_skb = NULL;
7405 conn->rx_len = 0;
7406 l2cap_conn_unreliable(conn, ECOMM);
7407 }
7408
Andrei Emeltchenkoaae7fe22010-09-15 14:28:43 +03007409 /* Start fragment always begin with Basic L2CAP header */
7410 if (skb->len < L2CAP_HDR_SIZE) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07007411 BT_ERR("Frame is too short (len %d)", skb->len);
7412 l2cap_conn_unreliable(conn, ECOMM);
7413 goto drop;
7414 }
7415
7416 hdr = (struct l2cap_hdr *) skb->data;
7417 len = __le16_to_cpu(hdr->len) + L2CAP_HDR_SIZE;
7418
7419 if (len == skb->len) {
7420 /* Complete frame received */
7421 l2cap_recv_frame(conn, skb);
7422 return 0;
7423 }
7424
7425 BT_DBG("Start: total len %d, frag len %d", len, skb->len);
7426
7427 if (skb->len > len) {
7428 BT_ERR("Frame is too long (len %d, expected len %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007429 skb->len, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007430 l2cap_conn_unreliable(conn, ECOMM);
7431 goto drop;
7432 }
7433
7434 /* Allocate skb for the complete frame (with header) */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03007435 conn->rx_skb = bt_skb_alloc(len, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03007436 if (!conn->rx_skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007437 goto drop;
7438
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007439 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007440 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007441 conn->rx_len = len - skb->len;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007442 break;
7443
7444 case ACL_CONT:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007445 BT_DBG("Cont: frag len %d (expecting %d)", skb->len, conn->rx_len);
7446
7447 if (!conn->rx_len) {
7448 BT_ERR("Unexpected continuation frame (len %d)", skb->len);
7449 l2cap_conn_unreliable(conn, ECOMM);
7450 goto drop;
7451 }
7452
7453 if (skb->len > conn->rx_len) {
7454 BT_ERR("Fragment is too long (len %d, expected %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007455 skb->len, conn->rx_len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007456 kfree_skb(conn->rx_skb);
7457 conn->rx_skb = NULL;
7458 conn->rx_len = 0;
7459 l2cap_conn_unreliable(conn, ECOMM);
7460 goto drop;
7461 }
7462
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007463 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007464 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007465 conn->rx_len -= skb->len;
7466
7467 if (!conn->rx_len) {
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007468 /* Complete frame received. l2cap_recv_frame
7469 * takes ownership of the skb so set the global
7470 * rx_skb pointer to NULL first.
7471 */
7472 struct sk_buff *rx_skb = conn->rx_skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007473 conn->rx_skb = NULL;
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007474 l2cap_recv_frame(conn, rx_skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007475 }
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007476 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007477 }
7478
7479drop:
7480 kfree_skb(skb);
7481 return 0;
7482}
7483
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007484static int l2cap_debugfs_show(struct seq_file *f, void *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007485{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007486 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007487
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007488 read_lock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007489
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007490 list_for_each_entry(c, &chan_list, global_l) {
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03007491 seq_printf(f, "%pMR %pMR %d %d 0x%4.4x 0x%4.4x %d %d %d %d\n",
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007492 &c->src, &c->dst,
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03007493 c->state, __le16_to_cpu(c->psm),
7494 c->scid, c->dcid, c->imtu, c->omtu,
7495 c->sec_level, c->mode);
Andrei Emeltchenko61e1b4b2012-01-19 11:19:50 +02007496 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007497
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007498 read_unlock(&chan_list_lock);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007499
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007500 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007501}
7502
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007503static int l2cap_debugfs_open(struct inode *inode, struct file *file)
7504{
7505 return single_open(file, l2cap_debugfs_show, inode->i_private);
7506}
7507
7508static const struct file_operations l2cap_debugfs_fops = {
7509 .open = l2cap_debugfs_open,
7510 .read = seq_read,
7511 .llseek = seq_lseek,
7512 .release = single_release,
7513};
7514
7515static struct dentry *l2cap_debugfs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007516
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007517int __init l2cap_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007518{
7519 int err;
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007520
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007521 err = l2cap_init_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007522 if (err < 0)
7523 return err;
7524
Marcel Holtmann1120e4b2013-10-17 17:24:16 -07007525 if (IS_ERR_OR_NULL(bt_debugfs))
7526 return 0;
7527
7528 l2cap_debugfs = debugfs_create_file("l2cap", 0444, bt_debugfs,
7529 NULL, &l2cap_debugfs_fops);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007530
Samuel Ortiz40b93972014-05-14 17:53:35 +02007531 debugfs_create_u16("l2cap_le_max_credits", 0644, bt_debugfs,
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02007532 &le_max_credits);
Samuel Ortiz40b93972014-05-14 17:53:35 +02007533 debugfs_create_u16("l2cap_le_default_mps", 0644, bt_debugfs,
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02007534 &le_default_mps);
7535
Linus Torvalds1da177e2005-04-16 15:20:36 -07007536 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007537}
7538
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007539void l2cap_exit(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007540{
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007541 debugfs_remove(l2cap_debugfs);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007542 l2cap_cleanup_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007543}
7544
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03007545module_param(disable_ertm, bool, 0644);
7546MODULE_PARM_DESC(disable_ertm, "Disable enhanced retransmission mode");