blob: cb36169ef300fed5fff434976581f107156ee807 [file] [log] [blame]
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2000-2001 Qualcomm Incorporated
Gustavo F. Padovance5706b2010-07-13 11:57:11 -03004 Copyright (C) 2009-2010 Gustavo F. Padovan <gustavo@padovan.org>
Gustavo F. Padovan5d8868f2010-07-16 16:18:39 -03005 Copyright (C) 2010 Google Inc.
Gustavo F. Padovan590051d2011-12-18 13:39:33 -02006 Copyright (C) 2011 ProFUSION Embedded Systems
Mat Martineau422e9252012-04-27 16:50:55 -07007 Copyright (c) 2012 Code Aurora Forum. All rights reserved.
Linus Torvalds1da177e2005-04-16 15:20:36 -07008
9 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
10
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License version 2 as
13 published by the Free Software Foundation;
14
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
18 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090019 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
20 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
21 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
Linus Torvalds1da177e2005-04-16 15:20:36 -070022 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090024 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
25 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
Linus Torvalds1da177e2005-04-16 15:20:36 -070026 SOFTWARE IS DISCLAIMED.
27*/
28
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020029/* Bluetooth L2CAP core. */
Linus Torvalds1da177e2005-04-16 15:20:36 -070030
Linus Torvalds1da177e2005-04-16 15:20:36 -070031#include <linux/module.h>
32
Marcel Holtmannaef7d972010-03-21 05:27:45 +010033#include <linux/debugfs.h>
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -030034#include <linux/crc16.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070035
36#include <net/bluetooth/bluetooth.h>
37#include <net/bluetooth/hci_core.h>
38#include <net/bluetooth/l2cap.h>
Marcel Holtmann7ef9fbf2013-10-10 14:54:14 -070039
Marcel Holtmannac4b7232013-10-10 14:54:16 -070040#include "smp.h"
Marcel Holtmann70247282013-10-10 14:54:15 -070041#include "a2mp.h"
Marcel Holtmann7ef9fbf2013-10-10 14:54:14 -070042#include "amp.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070043
Johan Hedberg0f1bfe42014-01-27 15:11:35 -080044#define LE_FLOWCTL_MAX_CREDITS 65535
45
Mat Martineaud1de6d42012-05-17 20:53:55 -070046bool disable_ertm;
Marcel Holtmannf0709e02007-10-20 13:38:51 +020047
Marcel Holtmann547d1032013-10-12 08:18:19 -070048static u32 l2cap_feat_mask = L2CAP_FEAT_FIXED_CHAN | L2CAP_FEAT_UCD;
Marcel Holtmanna6801ca2014-07-11 06:03:08 +020049static u8 l2cap_fixed_chan[8] = { L2CAP_FC_SIG_BREDR | L2CAP_FC_CONNLESS, };
Linus Torvalds1da177e2005-04-16 15:20:36 -070050
Johannes Bergb5ad8b72011-06-01 08:54:45 +020051static LIST_HEAD(chan_list);
52static DEFINE_RWLOCK(chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -070053
Johan Hedbergf15b8ec2013-12-03 15:08:25 +020054static u16 le_max_credits = L2CAP_LE_MAX_CREDITS;
55static u16 le_default_mps = L2CAP_LE_DEFAULT_MPS;
56
Linus Torvalds1da177e2005-04-16 15:20:36 -070057static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +010058 u8 code, u8 ident, u16 dlen, void *data);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -030059static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len,
Gustavo Padovan2d792812012-10-06 10:07:01 +010060 void *data);
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -030061static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +020062static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err);
Linus Torvalds1da177e2005-04-16 15:20:36 -070063
Gustavo Padovand6603662012-05-21 13:58:22 -030064static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
Gustavo Padovan2d792812012-10-06 10:07:01 +010065 struct sk_buff_head *skbs, u8 event);
Mat Martineau608bcc62012-05-17 20:53:32 -070066
Marcel Holtmann4f1654e2013-10-13 08:50:41 -070067static inline __u8 bdaddr_type(struct hci_conn *hcon, __u8 type)
68{
69 if (hcon->type == LE_LINK) {
70 if (type == ADDR_LE_DEV_PUBLIC)
71 return BDADDR_LE_PUBLIC;
72 else
73 return BDADDR_LE_RANDOM;
74 }
75
76 return BDADDR_BREDR;
77}
78
Marcel Holtmann01394182006-07-03 10:02:46 +020079/* ---- L2CAP channels ---- */
Gustavo F. Padovan71ba0e52011-05-17 14:34:52 -030080
Gustavo Padovan2d792812012-10-06 10:07:01 +010081static struct l2cap_chan *__l2cap_get_chan_by_dcid(struct l2cap_conn *conn,
82 u16 cid)
Marcel Holtmann01394182006-07-03 10:02:46 +020083{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020084 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -030085
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020086 list_for_each_entry(c, &conn->chan_l, list) {
87 if (c->dcid == cid)
88 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +020089 }
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020090 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +020091}
92
Gustavo Padovan2d792812012-10-06 10:07:01 +010093static struct l2cap_chan *__l2cap_get_chan_by_scid(struct l2cap_conn *conn,
94 u16 cid)
Marcel Holtmann01394182006-07-03 10:02:46 +020095{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020096 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -030097
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020098 list_for_each_entry(c, &conn->chan_l, list) {
99 if (c->scid == cid)
100 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +0200101 }
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200102 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200103}
104
105/* Find channel with given SCID.
Mat Martineauef191ad2012-05-02 09:42:00 -0700106 * Returns locked channel. */
Gustavo Padovan2d792812012-10-06 10:07:01 +0100107static struct l2cap_chan *l2cap_get_chan_by_scid(struct l2cap_conn *conn,
108 u16 cid)
Marcel Holtmann01394182006-07-03 10:02:46 +0200109{
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300110 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300111
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200112 mutex_lock(&conn->chan_lock);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300113 c = __l2cap_get_chan_by_scid(conn, cid);
Mat Martineauef191ad2012-05-02 09:42:00 -0700114 if (c)
115 l2cap_chan_lock(c);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200116 mutex_unlock(&conn->chan_lock);
117
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300118 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +0200119}
120
Mat Martineaub1a130b2012-10-23 15:24:09 -0700121/* Find channel with given DCID.
122 * Returns locked channel.
123 */
124static struct l2cap_chan *l2cap_get_chan_by_dcid(struct l2cap_conn *conn,
125 u16 cid)
126{
127 struct l2cap_chan *c;
128
129 mutex_lock(&conn->chan_lock);
130 c = __l2cap_get_chan_by_dcid(conn, cid);
131 if (c)
132 l2cap_chan_lock(c);
133 mutex_unlock(&conn->chan_lock);
134
135 return c;
136}
137
Gustavo Padovan2d792812012-10-06 10:07:01 +0100138static struct l2cap_chan *__l2cap_get_chan_by_ident(struct l2cap_conn *conn,
139 u8 ident)
Marcel Holtmann01394182006-07-03 10:02:46 +0200140{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200141 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300142
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200143 list_for_each_entry(c, &conn->chan_l, list) {
144 if (c->ident == ident)
145 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +0200146 }
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200147 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200148}
149
Mat Martineau5b155ef2012-10-23 15:24:14 -0700150static struct l2cap_chan *l2cap_get_chan_by_ident(struct l2cap_conn *conn,
151 u8 ident)
152{
153 struct l2cap_chan *c;
154
155 mutex_lock(&conn->chan_lock);
156 c = __l2cap_get_chan_by_ident(conn, ident);
157 if (c)
158 l2cap_chan_lock(c);
159 mutex_unlock(&conn->chan_lock);
160
161 return c;
162}
163
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300164static struct l2cap_chan *__l2cap_global_chan_by_addr(__le16 psm, bdaddr_t *src)
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300165{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300166 struct l2cap_chan *c;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300167
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300168 list_for_each_entry(c, &chan_list, global_l) {
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700169 if (c->sport == psm && !bacmp(&c->src, src))
Szymon Janc250938c2011-11-16 09:32:22 +0100170 return c;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300171 }
Szymon Janc250938c2011-11-16 09:32:22 +0100172 return NULL;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300173}
174
175int l2cap_add_psm(struct l2cap_chan *chan, bdaddr_t *src, __le16 psm)
176{
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300177 int err;
178
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200179 write_lock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300180
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300181 if (psm && __l2cap_global_chan_by_addr(psm, src)) {
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300182 err = -EADDRINUSE;
183 goto done;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300184 }
185
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300186 if (psm) {
187 chan->psm = psm;
188 chan->sport = psm;
189 err = 0;
190 } else {
191 u16 p;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300192
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300193 err = -EINVAL;
194 for (p = 0x1001; p < 0x1100; p += 2)
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300195 if (!__l2cap_global_chan_by_addr(cpu_to_le16(p), src)) {
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300196 chan->psm = cpu_to_le16(p);
197 chan->sport = cpu_to_le16(p);
198 err = 0;
199 break;
200 }
201 }
202
203done:
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200204 write_unlock(&chan_list_lock);
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300205 return err;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300206}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300207EXPORT_SYMBOL_GPL(l2cap_add_psm);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300208
209int l2cap_add_scid(struct l2cap_chan *chan, __u16 scid)
210{
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200211 write_lock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300212
Johan Hedberg14824302014-08-07 22:56:50 +0300213 /* Override the defaults (which are for conn-oriented) */
214 chan->omtu = L2CAP_DEFAULT_MTU;
215 chan->chan_type = L2CAP_CHAN_FIXED;
216
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300217 chan->scid = scid;
218
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200219 write_unlock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300220
221 return 0;
222}
223
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300224static u16 l2cap_alloc_cid(struct l2cap_conn *conn)
Marcel Holtmann01394182006-07-03 10:02:46 +0200225{
Johan Hedberge77af752013-10-08 10:31:00 +0200226 u16 cid, dyn_end;
Marcel Holtmann01394182006-07-03 10:02:46 +0200227
Johan Hedberge77af752013-10-08 10:31:00 +0200228 if (conn->hcon->type == LE_LINK)
229 dyn_end = L2CAP_CID_LE_DYN_END;
230 else
231 dyn_end = L2CAP_CID_DYN_END;
232
233 for (cid = L2CAP_CID_DYN_START; cid < dyn_end; cid++) {
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300234 if (!__l2cap_get_chan_by_scid(conn, cid))
Marcel Holtmann01394182006-07-03 10:02:46 +0200235 return cid;
236 }
237
238 return 0;
239}
240
Gustavo Padovanf93fa272013-10-21 14:21:40 -0200241static void l2cap_state_change(struct l2cap_chan *chan, int state)
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300242{
Andrei Emeltchenko42d2d872012-02-17 11:40:57 +0200243 BT_DBG("chan %p %s -> %s", chan, state_to_string(chan->state),
Gustavo Padovan2d792812012-10-06 10:07:01 +0100244 state_to_string(state));
Gustavo F. Padovanbadaaa02011-11-23 20:11:46 -0200245
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300246 chan->state = state;
Gustavo Padovan53f52122013-10-15 19:24:45 -0300247 chan->ops->state_change(chan, state, 0);
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300248}
249
Gustavo Padovanf8e73012013-10-15 19:24:46 -0300250static inline void l2cap_state_change_and_error(struct l2cap_chan *chan,
251 int state, int err)
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +0200252{
Gustavo Padovanf8e73012013-10-15 19:24:46 -0300253 chan->state = state;
Gustavo Padovan53f52122013-10-15 19:24:45 -0300254 chan->ops->state_change(chan, chan->state, err);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +0200255}
256
257static inline void l2cap_chan_set_err(struct l2cap_chan *chan, int err)
258{
Gustavo Padovanf8e73012013-10-15 19:24:46 -0300259 chan->ops->state_change(chan, chan->state, err);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +0200260}
261
Mat Martineau4239d162012-05-17 20:53:49 -0700262static void __set_retrans_timer(struct l2cap_chan *chan)
263{
264 if (!delayed_work_pending(&chan->monitor_timer) &&
265 chan->retrans_timeout) {
266 l2cap_set_timer(chan, &chan->retrans_timer,
267 msecs_to_jiffies(chan->retrans_timeout));
268 }
269}
270
271static void __set_monitor_timer(struct l2cap_chan *chan)
272{
273 __clear_retrans_timer(chan);
274 if (chan->monitor_timeout) {
275 l2cap_set_timer(chan, &chan->monitor_timer,
276 msecs_to_jiffies(chan->monitor_timeout));
277 }
278}
279
Mat Martineau608bcc62012-05-17 20:53:32 -0700280static struct sk_buff *l2cap_ertm_seq_in_queue(struct sk_buff_head *head,
281 u16 seq)
282{
283 struct sk_buff *skb;
284
285 skb_queue_walk(head, skb) {
286 if (bt_cb(skb)->control.txseq == seq)
287 return skb;
288 }
289
290 return NULL;
291}
292
Mat Martineau3c588192012-04-11 10:48:42 -0700293/* ---- L2CAP sequence number lists ---- */
294
295/* For ERTM, ordered lists of sequence numbers must be tracked for
296 * SREJ requests that are received and for frames that are to be
297 * retransmitted. These seq_list functions implement a singly-linked
298 * list in an array, where membership in the list can also be checked
299 * in constant time. Items can also be added to the tail of the list
300 * and removed from the head in constant time, without further memory
301 * allocs or frees.
302 */
303
304static int l2cap_seq_list_init(struct l2cap_seq_list *seq_list, u16 size)
305{
306 size_t alloc_size, i;
307
308 /* Allocated size is a power of 2 to map sequence numbers
309 * (which may be up to 14 bits) in to a smaller array that is
310 * sized for the negotiated ERTM transmit windows.
311 */
312 alloc_size = roundup_pow_of_two(size);
313
314 seq_list->list = kmalloc(sizeof(u16) * alloc_size, GFP_KERNEL);
315 if (!seq_list->list)
316 return -ENOMEM;
317
318 seq_list->mask = alloc_size - 1;
319 seq_list->head = L2CAP_SEQ_LIST_CLEAR;
320 seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
321 for (i = 0; i < alloc_size; i++)
322 seq_list->list[i] = L2CAP_SEQ_LIST_CLEAR;
323
324 return 0;
325}
326
327static inline void l2cap_seq_list_free(struct l2cap_seq_list *seq_list)
328{
329 kfree(seq_list->list);
330}
331
332static inline bool l2cap_seq_list_contains(struct l2cap_seq_list *seq_list,
333 u16 seq)
334{
335 /* Constant-time check for list membership */
336 return seq_list->list[seq & seq_list->mask] != L2CAP_SEQ_LIST_CLEAR;
337}
338
Mat Martineau3c588192012-04-11 10:48:42 -0700339static inline u16 l2cap_seq_list_pop(struct l2cap_seq_list *seq_list)
340{
Johan Hedberg03a0c5d2014-01-18 21:32:59 +0200341 u16 seq = seq_list->head;
342 u16 mask = seq_list->mask;
343
344 seq_list->head = seq_list->list[seq & mask];
345 seq_list->list[seq & mask] = L2CAP_SEQ_LIST_CLEAR;
346
347 if (seq_list->head == L2CAP_SEQ_LIST_TAIL) {
348 seq_list->head = L2CAP_SEQ_LIST_CLEAR;
349 seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
350 }
351
352 return seq;
Mat Martineau3c588192012-04-11 10:48:42 -0700353}
354
355static void l2cap_seq_list_clear(struct l2cap_seq_list *seq_list)
356{
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300357 u16 i;
Mat Martineau3c588192012-04-11 10:48:42 -0700358
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300359 if (seq_list->head == L2CAP_SEQ_LIST_CLEAR)
360 return;
361
362 for (i = 0; i <= seq_list->mask; i++)
363 seq_list->list[i] = L2CAP_SEQ_LIST_CLEAR;
364
365 seq_list->head = L2CAP_SEQ_LIST_CLEAR;
366 seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
Mat Martineau3c588192012-04-11 10:48:42 -0700367}
368
369static void l2cap_seq_list_append(struct l2cap_seq_list *seq_list, u16 seq)
370{
371 u16 mask = seq_list->mask;
372
373 /* All appends happen in constant time */
374
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300375 if (seq_list->list[seq & mask] != L2CAP_SEQ_LIST_CLEAR)
376 return;
Mat Martineau3c588192012-04-11 10:48:42 -0700377
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300378 if (seq_list->tail == L2CAP_SEQ_LIST_CLEAR)
379 seq_list->head = seq;
380 else
381 seq_list->list[seq_list->tail & mask] = seq;
382
383 seq_list->tail = seq;
384 seq_list->list[seq & mask] = L2CAP_SEQ_LIST_TAIL;
Mat Martineau3c588192012-04-11 10:48:42 -0700385}
386
Gustavo F. Padovan721c4182011-06-23 19:29:58 -0300387static void l2cap_chan_timeout(struct work_struct *work)
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300388{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -0300389 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100390 chan_timer.work);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200391 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300392 int reason;
393
Andrei Emeltchenkoe05dcc32012-02-17 11:40:56 +0200394 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300395
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200396 mutex_lock(&conn->chan_lock);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200397 l2cap_chan_lock(chan);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300398
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300399 if (chan->state == BT_CONNECTED || chan->state == BT_CONFIG)
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300400 reason = ECONNREFUSED;
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300401 else if (chan->state == BT_CONNECT &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100402 chan->sec_level != BT_SECURITY_SDP)
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300403 reason = ECONNREFUSED;
404 else
405 reason = ETIMEDOUT;
406
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300407 l2cap_chan_close(chan, reason);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300408
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200409 l2cap_chan_unlock(chan);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300410
Gustavo Padovan80b98022012-05-27 22:27:51 -0300411 chan->ops->close(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200412 mutex_unlock(&conn->chan_lock);
413
Ulisses Furquim371fd832011-12-21 20:02:36 -0200414 l2cap_chan_put(chan);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300415}
416
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -0300417struct l2cap_chan *l2cap_chan_create(void)
Marcel Holtmann01394182006-07-03 10:02:46 +0200418{
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300419 struct l2cap_chan *chan;
Marcel Holtmann01394182006-07-03 10:02:46 +0200420
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300421 chan = kzalloc(sizeof(*chan), GFP_ATOMIC);
422 if (!chan)
423 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200424
Andrei Emeltchenkoc03b3552012-02-21 12:54:56 +0200425 mutex_init(&chan->lock);
426
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200427 write_lock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300428 list_add(&chan->global_l, &chan_list);
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200429 write_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300430
Gustavo F. Padovan721c4182011-06-23 19:29:58 -0300431 INIT_DELAYED_WORK(&chan->chan_timer, l2cap_chan_timeout);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300432
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300433 chan->state = BT_OPEN;
434
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530435 kref_init(&chan->kref);
Gustavo F. Padovan71ba0e52011-05-17 14:34:52 -0300436
Mat Martineau28270112012-05-17 21:14:09 -0700437 /* This flag is cleared in l2cap_chan_ready() */
438 set_bit(CONF_NOT_COMPLETE, &chan->conf_state);
439
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -0300440 BT_DBG("chan %p", chan);
Szymon Jancabc545b2011-11-03 16:05:44 +0100441
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300442 return chan;
Marcel Holtmann01394182006-07-03 10:02:46 +0200443}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300444EXPORT_SYMBOL_GPL(l2cap_chan_create);
Marcel Holtmann01394182006-07-03 10:02:46 +0200445
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530446static void l2cap_chan_destroy(struct kref *kref)
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300447{
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530448 struct l2cap_chan *chan = container_of(kref, struct l2cap_chan, kref);
449
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +0530450 BT_DBG("chan %p", chan);
451
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200452 write_lock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300453 list_del(&chan->global_l);
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200454 write_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300455
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +0530456 kfree(chan);
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300457}
458
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530459void l2cap_chan_hold(struct l2cap_chan *c)
460{
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530461 BT_DBG("chan %p orig refcnt %d", c, atomic_read(&c->kref.refcount));
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530462
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530463 kref_get(&c->kref);
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530464}
465
466void l2cap_chan_put(struct l2cap_chan *c)
467{
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530468 BT_DBG("chan %p orig refcnt %d", c, atomic_read(&c->kref.refcount));
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530469
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530470 kref_put(&c->kref, l2cap_chan_destroy);
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530471}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300472EXPORT_SYMBOL_GPL(l2cap_chan_put);
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530473
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300474void l2cap_chan_set_defaults(struct l2cap_chan *chan)
475{
476 chan->fcs = L2CAP_FCS_CRC16;
477 chan->max_tx = L2CAP_DEFAULT_MAX_TX;
478 chan->tx_win = L2CAP_DEFAULT_TX_WINDOW;
479 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
Jukka Rissanen6a5e8162014-05-28 14:43:04 +0300480 chan->remote_max_tx = chan->max_tx;
481 chan->remote_tx_win = chan->tx_win;
Mat Martineauc20f8e32012-07-10 05:47:07 -0700482 chan->ack_win = L2CAP_DEFAULT_TX_WINDOW;
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300483 chan->sec_level = BT_SECURITY_LOW;
Jukka Rissanen6a5e8162014-05-28 14:43:04 +0300484 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
485 chan->retrans_timeout = L2CAP_DEFAULT_RETRANS_TO;
486 chan->monitor_timeout = L2CAP_DEFAULT_MONITOR_TO;
487 chan->conf_state = 0;
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300488
489 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
490}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300491EXPORT_SYMBOL_GPL(l2cap_chan_set_defaults);
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300492
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200493static void l2cap_le_flowctl_init(struct l2cap_chan *chan)
Johan Hedberg38319712013-05-17 12:49:23 +0300494{
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200495 chan->sdu = NULL;
496 chan->sdu_last_frag = NULL;
497 chan->sdu_len = 0;
Johan Hedberg0cd75f72013-05-17 13:09:05 +0300498 chan->tx_credits = 0;
Johan Hedbergf15b8ec2013-12-03 15:08:25 +0200499 chan->rx_credits = le_max_credits;
Johan Hedbergd1d79412014-01-27 15:11:33 -0800500 chan->mps = min_t(u16, chan->imtu, le_default_mps);
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200501
502 skb_queue_head_init(&chan->tx_q);
Johan Hedberg38319712013-05-17 12:49:23 +0300503}
504
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +0300505void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
Marcel Holtmann01394182006-07-03 10:02:46 +0200506{
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -0300507 BT_DBG("conn %p, psm 0x%2.2x, dcid 0x%4.4x", conn,
Andrei Emeltchenko097db762012-03-09 14:16:17 +0200508 __le16_to_cpu(chan->psm), chan->dcid);
Marcel Holtmann01394182006-07-03 10:02:46 +0200509
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +0200510 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
Marcel Holtmann2950f212009-02-12 14:02:50 +0100511
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300512 chan->conn = conn;
Marcel Holtmann01394182006-07-03 10:02:46 +0200513
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200514 switch (chan->chan_type) {
515 case L2CAP_CHAN_CONN_ORIENTED:
Johan Hedberg21626e62014-01-24 10:35:41 +0200516 /* Alloc CID for connection-oriented socket */
517 chan->scid = l2cap_alloc_cid(conn);
518 if (conn->hcon->type == ACL_LINK)
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300519 chan->omtu = L2CAP_DEFAULT_MTU;
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200520 break;
521
522 case L2CAP_CHAN_CONN_LESS:
Marcel Holtmann01394182006-07-03 10:02:46 +0200523 /* Connectionless socket */
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300524 chan->scid = L2CAP_CID_CONN_LESS;
525 chan->dcid = L2CAP_CID_CONN_LESS;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300526 chan->omtu = L2CAP_DEFAULT_MTU;
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200527 break;
528
Johan Hedberg2338a7e2014-01-24 10:35:40 +0200529 case L2CAP_CHAN_FIXED:
530 /* Caller will set CID and CID specific MTU values */
Andrei Emeltchenko416fa752012-05-29 13:59:16 +0300531 break;
532
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200533 default:
Marcel Holtmann01394182006-07-03 10:02:46 +0200534 /* Raw socket can send/recv signalling messages only */
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300535 chan->scid = L2CAP_CID_SIGNALING;
536 chan->dcid = L2CAP_CID_SIGNALING;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300537 chan->omtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann01394182006-07-03 10:02:46 +0200538 }
539
Andrei Emeltchenko8f7975b2011-10-13 16:18:54 +0300540 chan->local_id = L2CAP_BESTEFFORT_ID;
541 chan->local_stype = L2CAP_SERV_BESTEFFORT;
542 chan->local_msdu = L2CAP_DEFAULT_MAX_SDU_SIZE;
543 chan->local_sdu_itime = L2CAP_DEFAULT_SDU_ITIME;
544 chan->local_acc_lat = L2CAP_DEFAULT_ACC_LAT;
Andrei Emeltchenko8936fa62012-10-08 11:14:41 +0300545 chan->local_flush_to = L2CAP_EFS_DEFAULT_FLUSH_TO;
Andrei Emeltchenko8f7975b2011-10-13 16:18:54 +0300546
Ulisses Furquim371fd832011-12-21 20:02:36 -0200547 l2cap_chan_hold(chan);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300548
Johan 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. Padovan89bc500e2011-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. Padovan89bc500e2011-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. Padovan89bc500e2011-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. Padovan89bc500e2011-06-03 00:19:47 -03001392 } else if (chan->state == BT_CONNECT2) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001393 struct l2cap_conn_rsp rsp;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001394 char buf[128];
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001395 rsp.scid = cpu_to_le16(chan->dcid);
1396 rsp.dcid = cpu_to_le16(chan->scid);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001397
Johan Hedberge7cafc42014-07-17 15:35:38 +03001398 if (l2cap_chan_check_security(chan, false)) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07001399 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001400 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
1401 rsp.status = cpu_to_le16(L2CAP_CS_AUTHOR_PEND);
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001402 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001403
1404 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001405 l2cap_state_change(chan, BT_CONFIG);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001406 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
1407 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001408 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001409 } else {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001410 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
1411 rsp.status = cpu_to_le16(L2CAP_CS_AUTHEN_PEND);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001412 }
1413
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001414 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001415 sizeof(rsp), &rsp);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001416
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001417 if (test_bit(CONF_REQ_SENT, &chan->conf_state) ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01001418 rsp.result != L2CAP_CR_SUCCESS) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001419 l2cap_chan_unlock(chan);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001420 continue;
1421 }
1422
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001423 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001424 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001425 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03001426 chan->num_conf_req++;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001427 }
1428
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001429 l2cap_chan_unlock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001430 }
1431
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001432 mutex_unlock(&conn->chan_lock);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001433}
1434
Ville Tervob62f3282011-02-10 22:38:50 -03001435static void l2cap_le_conn_ready(struct l2cap_conn *conn)
1436{
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001437 struct hci_conn *hcon = conn->hcon;
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001438 struct hci_dev *hdev = hcon->hdev;
Ville Tervob62f3282011-02-10 22:38:50 -03001439
Johan Hedberge760ec12014-08-07 22:56:47 +03001440 BT_DBG("%s conn %p", hdev->name, conn);
Ville Tervob62f3282011-02-10 22:38:50 -03001441
Johan Hedberge760ec12014-08-07 22:56:47 +03001442 /* For outgoing pairing which doesn't necessarily have an
1443 * associated socket (e.g. mgmt_pair_device).
1444 */
1445 if (hcon->out)
1446 smp_conn_security(hcon, hcon->pending_sec_level);
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001447
Marcel Holtmann80afeb62014-06-23 12:18:51 +02001448 /* For LE slave connections, make sure the connection interval
1449 * is in the range of the minium and maximum interval that has
1450 * been configured for this connection. If not, then trigger
1451 * the connection update procedure.
1452 */
Johan Hedberg40bef302014-07-16 11:42:27 +03001453 if (hcon->role == HCI_ROLE_SLAVE &&
Marcel Holtmann80afeb62014-06-23 12:18:51 +02001454 (hcon->le_conn_interval < hcon->le_conn_min_interval ||
1455 hcon->le_conn_interval > hcon->le_conn_max_interval)) {
1456 struct l2cap_conn_param_update_req req;
1457
1458 req.min = cpu_to_le16(hcon->le_conn_min_interval);
1459 req.max = cpu_to_le16(hcon->le_conn_max_interval);
1460 req.latency = cpu_to_le16(hcon->le_conn_latency);
1461 req.to_multiplier = cpu_to_le16(hcon->le_supv_timeout);
1462
1463 l2cap_send_cmd(conn, l2cap_get_ident(conn),
1464 L2CAP_CONN_PARAM_UPDATE_REQ, sizeof(req), &req);
1465 }
Ville Tervob62f3282011-02-10 22:38:50 -03001466}
1467
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001468static void l2cap_conn_ready(struct l2cap_conn *conn)
1469{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001470 struct l2cap_chan *chan;
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001471 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001472
1473 BT_DBG("conn %p", conn);
1474
Johan Hedberge760ec12014-08-07 22:56:47 +03001475 mutex_lock(&conn->chan_lock);
1476
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001477 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03001478
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001479 l2cap_chan_lock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001480
Johan Hedberg2338a7e2014-01-24 10:35:40 +02001481 if (chan->scid == L2CAP_CID_A2MP) {
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001482 l2cap_chan_unlock(chan);
1483 continue;
1484 }
1485
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001486 if (hcon->type == LE_LINK) {
Johan Hedbergf1496de2013-05-13 14:15:56 +03001487 l2cap_le_start(chan);
Vinicius Costa Gomes63128452011-06-17 22:46:26 -03001488 } else if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Gustavo Padovan74e75742013-10-15 19:24:51 -03001489 l2cap_chan_ready(chan);
Anderson Brigliab501d6a2011-06-07 18:46:31 -03001490
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001491 } else if (chan->state == BT_CONNECT) {
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001492 l2cap_do_start(chan);
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001493 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001494
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001495 l2cap_chan_unlock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001496 }
1497
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001498 mutex_unlock(&conn->chan_lock);
Johan Hedberg61a939c2014-01-17 20:45:11 +02001499
Johan Hedberg79a05722014-08-08 09:28:04 +03001500 if (hcon->type == LE_LINK)
1501 l2cap_le_conn_ready(conn);
1502
Johan Hedberg61a939c2014-01-17 20:45:11 +02001503 queue_work(hcon->hdev->workqueue, &conn->pending_rx_work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001504}
1505
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001506/* Notify sockets that we cannot guaranty reliability anymore */
1507static void l2cap_conn_unreliable(struct l2cap_conn *conn, int err)
1508{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001509 struct l2cap_chan *chan;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001510
1511 BT_DBG("conn %p", conn);
1512
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001513 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001514
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001515 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +03001516 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo Padovan1d8b1fd2012-10-06 11:34:52 +01001517 l2cap_chan_set_err(chan, err);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001518 }
1519
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001520 mutex_unlock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001521}
1522
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001523static void l2cap_info_timeout(struct work_struct *work)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001524{
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001525 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001526 info_timer.work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001527
Marcel Holtmann984947d2009-02-06 23:35:19 +01001528 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01001529 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01001530
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001531 l2cap_conn_start(conn);
1532}
1533
David Herrmann2c8e1412013-04-06 20:28:45 +02001534/*
1535 * l2cap_user
1536 * External modules can register l2cap_user objects on l2cap_conn. The ->probe
1537 * callback is called during registration. The ->remove callback is called
1538 * during unregistration.
1539 * An l2cap_user object can either be explicitly unregistered or when the
1540 * underlying l2cap_conn object is deleted. This guarantees that l2cap->hcon,
1541 * l2cap->hchan, .. are valid as long as the remove callback hasn't been called.
1542 * External modules must own a reference to the l2cap_conn object if they intend
1543 * to call l2cap_unregister_user(). The l2cap_conn object might get destroyed at
1544 * any time if they don't.
1545 */
1546
1547int l2cap_register_user(struct l2cap_conn *conn, struct l2cap_user *user)
1548{
1549 struct hci_dev *hdev = conn->hcon->hdev;
1550 int ret;
1551
1552 /* We need to check whether l2cap_conn is registered. If it is not, we
1553 * must not register the l2cap_user. l2cap_conn_del() is unregisters
1554 * l2cap_conn objects, but doesn't provide its own locking. Instead, it
1555 * relies on the parent hci_conn object to be locked. This itself relies
1556 * on the hci_dev object to be locked. So we must lock the hci device
1557 * here, too. */
1558
1559 hci_dev_lock(hdev);
1560
1561 if (user->list.next || user->list.prev) {
1562 ret = -EINVAL;
1563 goto out_unlock;
1564 }
1565
1566 /* conn->hchan is NULL after l2cap_conn_del() was called */
1567 if (!conn->hchan) {
1568 ret = -ENODEV;
1569 goto out_unlock;
1570 }
1571
1572 ret = user->probe(conn, user);
1573 if (ret)
1574 goto out_unlock;
1575
1576 list_add(&user->list, &conn->users);
1577 ret = 0;
1578
1579out_unlock:
1580 hci_dev_unlock(hdev);
1581 return ret;
1582}
1583EXPORT_SYMBOL(l2cap_register_user);
1584
1585void l2cap_unregister_user(struct l2cap_conn *conn, struct l2cap_user *user)
1586{
1587 struct hci_dev *hdev = conn->hcon->hdev;
1588
1589 hci_dev_lock(hdev);
1590
1591 if (!user->list.next || !user->list.prev)
1592 goto out_unlock;
1593
1594 list_del(&user->list);
1595 user->list.next = NULL;
1596 user->list.prev = NULL;
1597 user->remove(conn, user);
1598
1599out_unlock:
1600 hci_dev_unlock(hdev);
1601}
1602EXPORT_SYMBOL(l2cap_unregister_user);
1603
1604static void l2cap_unregister_all_users(struct l2cap_conn *conn)
1605{
1606 struct l2cap_user *user;
1607
1608 while (!list_empty(&conn->users)) {
1609 user = list_first_entry(&conn->users, struct l2cap_user, list);
1610 list_del(&user->list);
1611 user->list.next = NULL;
1612 user->list.prev = NULL;
1613 user->remove(conn, user);
1614 }
1615}
1616
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001617static void l2cap_conn_del(struct hci_conn *hcon, int err)
1618{
1619 struct l2cap_conn *conn = hcon->l2cap_data;
1620 struct l2cap_chan *chan, *l;
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001621
1622 if (!conn)
1623 return;
1624
1625 BT_DBG("hcon %p conn %p, err %d", hcon, conn, err);
1626
1627 kfree_skb(conn->rx_skb);
1628
Johan Hedberg61a939c2014-01-17 20:45:11 +02001629 skb_queue_purge(&conn->pending_rx);
Jukka Taimisto7ab56c32014-06-12 10:15:13 +00001630
1631 /* We can not call flush_work(&conn->pending_rx_work) here since we
1632 * might block if we are running on a worker from the same workqueue
1633 * pending_rx_work is waiting on.
1634 */
1635 if (work_pending(&conn->pending_rx_work))
1636 cancel_work_sync(&conn->pending_rx_work);
Johan Hedberg61a939c2014-01-17 20:45:11 +02001637
Johan Hedbergdec5b492014-08-11 22:06:37 +03001638 if (work_pending(&conn->disconn_work))
1639 cancel_work_sync(&conn->disconn_work);
1640
David Herrmann2c8e1412013-04-06 20:28:45 +02001641 l2cap_unregister_all_users(conn);
1642
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001643 mutex_lock(&conn->chan_lock);
1644
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001645 /* Kill channels */
1646 list_for_each_entry_safe(chan, l, &conn->chan_l, list) {
Mat Martineau61d6ef32012-04-27 16:50:50 -07001647 l2cap_chan_hold(chan);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001648 l2cap_chan_lock(chan);
1649
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001650 l2cap_chan_del(chan, err);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001651
1652 l2cap_chan_unlock(chan);
1653
Gustavo Padovan80b98022012-05-27 22:27:51 -03001654 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07001655 l2cap_chan_put(chan);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001656 }
1657
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001658 mutex_unlock(&conn->chan_lock);
1659
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001660 hci_chan_del(conn->hchan);
1661
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001662 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT)
Ulisses Furquim127074b2012-01-30 18:26:29 -02001663 cancel_delayed_work_sync(&conn->info_timer);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001664
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001665 hcon->l2cap_data = NULL;
David Herrmann9c903e32013-04-06 20:28:44 +02001666 conn->hchan = NULL;
1667 l2cap_conn_put(conn);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001668}
1669
Johan Hedbergdec5b492014-08-11 22:06:37 +03001670static void disconn_work(struct work_struct *work)
1671{
1672 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
1673 disconn_work);
1674
1675 BT_DBG("conn %p", conn);
1676
1677 l2cap_conn_del(conn->hcon, conn->disconn_err);
1678}
1679
1680void l2cap_conn_shutdown(struct l2cap_conn *conn, int err)
1681{
1682 struct hci_dev *hdev = conn->hcon->hdev;
1683
1684 BT_DBG("conn %p err %d", conn, err);
1685
1686 conn->disconn_err = err;
1687 queue_work(hdev->workqueue, &conn->disconn_work);
1688}
1689
David Herrmann9c903e32013-04-06 20:28:44 +02001690static void l2cap_conn_free(struct kref *ref)
1691{
1692 struct l2cap_conn *conn = container_of(ref, struct l2cap_conn, ref);
1693
1694 hci_conn_put(conn->hcon);
1695 kfree(conn);
1696}
1697
Johan Hedberg51bb84572014-08-15 21:06:57 +03001698struct l2cap_conn *l2cap_conn_get(struct l2cap_conn *conn)
David Herrmann9c903e32013-04-06 20:28:44 +02001699{
1700 kref_get(&conn->ref);
Johan Hedberg51bb84572014-08-15 21:06:57 +03001701 return conn;
David Herrmann9c903e32013-04-06 20:28:44 +02001702}
1703EXPORT_SYMBOL(l2cap_conn_get);
1704
1705void l2cap_conn_put(struct l2cap_conn *conn)
1706{
1707 kref_put(&conn->ref, l2cap_conn_free);
1708}
1709EXPORT_SYMBOL(l2cap_conn_put);
1710
Linus Torvalds1da177e2005-04-16 15:20:36 -07001711/* ---- Socket interface ---- */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001712
Ido Yarivc2287682012-04-20 15:46:07 -03001713/* Find socket with psm and source / destination bdaddr.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001714 * Returns closest match.
1715 */
Ido Yarivc2287682012-04-20 15:46:07 -03001716static struct l2cap_chan *l2cap_global_chan_by_psm(int state, __le16 psm,
1717 bdaddr_t *src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001718 bdaddr_t *dst,
1719 u8 link_type)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001720{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001721 struct l2cap_chan *c, *c1 = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001722
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001723 read_lock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001724
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001725 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001726 if (state && c->state != state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001727 continue;
1728
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001729 if (link_type == ACL_LINK && c->src_type != BDADDR_BREDR)
1730 continue;
1731
1732 if (link_type == LE_LINK && c->src_type == BDADDR_BREDR)
1733 continue;
1734
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001735 if (c->psm == psm) {
Ido Yarivc2287682012-04-20 15:46:07 -03001736 int src_match, dst_match;
1737 int src_any, dst_any;
1738
Linus Torvalds1da177e2005-04-16 15:20:36 -07001739 /* Exact match. */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001740 src_match = !bacmp(&c->src, src);
1741 dst_match = !bacmp(&c->dst, dst);
Ido Yarivc2287682012-04-20 15:46:07 -03001742 if (src_match && dst_match) {
Johan Hedberga24cce12014-08-07 22:56:42 +03001743 l2cap_chan_hold(c);
Johannes Berga7567b22011-06-01 08:29:54 +02001744 read_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001745 return c;
1746 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001747
1748 /* Closest match */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001749 src_any = !bacmp(&c->src, BDADDR_ANY);
1750 dst_any = !bacmp(&c->dst, BDADDR_ANY);
Ido Yarivc2287682012-04-20 15:46:07 -03001751 if ((src_match && dst_any) || (src_any && dst_match) ||
1752 (src_any && dst_any))
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001753 c1 = c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001754 }
1755 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001756
Johan Hedberga24cce12014-08-07 22:56:42 +03001757 if (c1)
1758 l2cap_chan_hold(c1);
1759
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001760 read_unlock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001761
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001762 return c1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001763}
1764
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001765static void l2cap_monitor_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001766{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001767 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001768 monitor_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001769
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03001770 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001771
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001772 l2cap_chan_lock(chan);
1773
Mat Martineau80909e02012-05-17 20:53:50 -07001774 if (!chan->conn) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001775 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001776 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001777 return;
1778 }
1779
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001780 l2cap_tx(chan, NULL, NULL, L2CAP_EV_MONITOR_TO);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001781
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001782 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001783 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001784}
1785
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001786static void l2cap_retrans_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001787{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001788 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001789 retrans_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001790
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03001791 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001792
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001793 l2cap_chan_lock(chan);
1794
Mat Martineau80909e02012-05-17 20:53:50 -07001795 if (!chan->conn) {
1796 l2cap_chan_unlock(chan);
1797 l2cap_chan_put(chan);
1798 return;
1799 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001800
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001801 l2cap_tx(chan, NULL, NULL, L2CAP_EV_RETRANS_TO);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001802 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001803 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001804}
1805
Gustavo Padovand6603662012-05-21 13:58:22 -03001806static void l2cap_streaming_send(struct l2cap_chan *chan,
1807 struct sk_buff_head *skbs)
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001808{
Gustavo F. Padovanccbb84a2010-08-30 18:44:44 -03001809 struct sk_buff *skb;
Mat Martineau37339372012-05-17 20:53:33 -07001810 struct l2cap_ctrl *control;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001811
Mat Martineau37339372012-05-17 20:53:33 -07001812 BT_DBG("chan %p, skbs %p", chan, skbs);
1813
Mat Martineaub99e13a2012-10-23 15:24:19 -07001814 if (__chan_is_moving(chan))
1815 return;
1816
Mat Martineau37339372012-05-17 20:53:33 -07001817 skb_queue_splice_tail_init(skbs, &chan->tx_q);
1818
1819 while (!skb_queue_empty(&chan->tx_q)) {
1820
1821 skb = skb_dequeue(&chan->tx_q);
1822
1823 bt_cb(skb)->control.retries = 1;
1824 control = &bt_cb(skb)->control;
1825
1826 control->reqseq = 0;
1827 control->txseq = chan->next_tx_seq;
1828
1829 __pack_control(chan, control, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001830
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001831 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau37339372012-05-17 20:53:33 -07001832 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1833 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001834 }
1835
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001836 l2cap_do_send(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001837
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001838 BT_DBG("Sent txseq %u", control->txseq);
Mat Martineau37339372012-05-17 20:53:33 -07001839
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001840 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau37339372012-05-17 20:53:33 -07001841 chan->frames_sent++;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001842 }
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001843}
1844
Szymon Janc67c9e842011-07-28 16:24:33 +02001845static int l2cap_ertm_send(struct l2cap_chan *chan)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001846{
1847 struct sk_buff *skb, *tx_skb;
Mat Martineau18a48e72012-05-17 20:53:34 -07001848 struct l2cap_ctrl *control;
1849 int sent = 0;
1850
1851 BT_DBG("chan %p", chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001852
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001853 if (chan->state != BT_CONNECTED)
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001854 return -ENOTCONN;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001855
Mat Martineau94122bb2012-05-02 09:42:02 -07001856 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1857 return 0;
1858
Mat Martineaub99e13a2012-10-23 15:24:19 -07001859 if (__chan_is_moving(chan))
1860 return 0;
1861
Mat Martineau18a48e72012-05-17 20:53:34 -07001862 while (chan->tx_send_head &&
1863 chan->unacked_frames < chan->remote_tx_win &&
1864 chan->tx_state == L2CAP_TX_STATE_XMIT) {
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001865
Mat Martineau18a48e72012-05-17 20:53:34 -07001866 skb = chan->tx_send_head;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001867
Mat Martineau18a48e72012-05-17 20:53:34 -07001868 bt_cb(skb)->control.retries = 1;
1869 control = &bt_cb(skb)->control;
Gustavo F. Padovan95ffa972010-06-18 20:37:33 -03001870
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001871 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
Mat Martineau18a48e72012-05-17 20:53:34 -07001872 control->final = 1;
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001873
Mat Martineau18a48e72012-05-17 20:53:34 -07001874 control->reqseq = chan->buffer_seq;
1875 chan->last_acked_seq = chan->buffer_seq;
1876 control->txseq = chan->next_tx_seq;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001877
Mat Martineau18a48e72012-05-17 20:53:34 -07001878 __pack_control(chan, control, skb);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001879
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001880 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau18a48e72012-05-17 20:53:34 -07001881 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1882 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001883 }
1884
Mat Martineau18a48e72012-05-17 20:53:34 -07001885 /* Clone after data has been modified. Data is assumed to be
1886 read-only (for locking purposes) on cloned sk_buffs.
1887 */
1888 tx_skb = skb_clone(skb, GFP_KERNEL);
1889
1890 if (!tx_skb)
1891 break;
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -03001892
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03001893 __set_retrans_timer(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001894
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001895 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau18a48e72012-05-17 20:53:34 -07001896 chan->unacked_frames++;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03001897 chan->frames_sent++;
Mat Martineau18a48e72012-05-17 20:53:34 -07001898 sent++;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001899
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001900 if (skb_queue_is_last(&chan->tx_q, skb))
1901 chan->tx_send_head = NULL;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001902 else
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001903 chan->tx_send_head = skb_queue_next(&chan->tx_q, skb);
Mat Martineau18a48e72012-05-17 20:53:34 -07001904
1905 l2cap_do_send(chan, tx_skb);
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001906 BT_DBG("Sent txseq %u", control->txseq);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001907 }
1908
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001909 BT_DBG("Sent %d, %u unacked, %u in ERTM queue", sent,
1910 chan->unacked_frames, skb_queue_len(&chan->tx_q));
Mat Martineau18a48e72012-05-17 20:53:34 -07001911
1912 return sent;
Gustavo F. Padovan9e917af2010-05-01 16:15:37 -03001913}
1914
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001915static void l2cap_ertm_resend(struct l2cap_chan *chan)
1916{
1917 struct l2cap_ctrl control;
1918 struct sk_buff *skb;
1919 struct sk_buff *tx_skb;
1920 u16 seq;
1921
1922 BT_DBG("chan %p", chan);
1923
1924 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1925 return;
1926
Mat Martineaub99e13a2012-10-23 15:24:19 -07001927 if (__chan_is_moving(chan))
1928 return;
1929
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001930 while (chan->retrans_list.head != L2CAP_SEQ_LIST_CLEAR) {
1931 seq = l2cap_seq_list_pop(&chan->retrans_list);
1932
1933 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, seq);
1934 if (!skb) {
1935 BT_DBG("Error: Can't retransmit seq %d, frame missing",
Gustavo Padovan2d792812012-10-06 10:07:01 +01001936 seq);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001937 continue;
1938 }
1939
1940 bt_cb(skb)->control.retries++;
1941 control = bt_cb(skb)->control;
1942
1943 if (chan->max_tx != 0 &&
1944 bt_cb(skb)->control.retries > chan->max_tx) {
1945 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001946 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001947 l2cap_seq_list_clear(&chan->retrans_list);
1948 break;
1949 }
1950
1951 control.reqseq = chan->buffer_seq;
1952 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
1953 control.final = 1;
1954 else
1955 control.final = 0;
1956
1957 if (skb_cloned(skb)) {
1958 /* Cloned sk_buffs are read-only, so we need a
1959 * writeable copy
1960 */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03001961 tx_skb = skb_copy(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001962 } else {
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03001963 tx_skb = skb_clone(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001964 }
1965
1966 if (!tx_skb) {
1967 l2cap_seq_list_clear(&chan->retrans_list);
1968 break;
1969 }
1970
1971 /* Update skb contents */
1972 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
1973 put_unaligned_le32(__pack_extended_control(&control),
1974 tx_skb->data + L2CAP_HDR_SIZE);
1975 } else {
1976 put_unaligned_le16(__pack_enhanced_control(&control),
1977 tx_skb->data + L2CAP_HDR_SIZE);
1978 }
1979
Lukasz Rymanowski13cac152014-08-14 09:35:34 +02001980 /* Update FCS */
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001981 if (chan->fcs == L2CAP_FCS_CRC16) {
Lukasz Rymanowski13cac152014-08-14 09:35:34 +02001982 u16 fcs = crc16(0, (u8 *) tx_skb->data,
1983 tx_skb->len - L2CAP_FCS_SIZE);
1984 put_unaligned_le16(fcs, skb_tail_pointer(tx_skb) -
1985 L2CAP_FCS_SIZE);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001986 }
1987
1988 l2cap_do_send(chan, tx_skb);
1989
1990 BT_DBG("Resent txseq %d", control.txseq);
1991
1992 chan->last_acked_seq = chan->buffer_seq;
1993 }
1994}
1995
Mat Martineauf80842a2012-05-17 20:53:46 -07001996static void l2cap_retransmit(struct l2cap_chan *chan,
1997 struct l2cap_ctrl *control)
1998{
1999 BT_DBG("chan %p, control %p", chan, control);
2000
2001 l2cap_seq_list_append(&chan->retrans_list, control->reqseq);
2002 l2cap_ertm_resend(chan);
2003}
2004
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002005static void l2cap_retransmit_all(struct l2cap_chan *chan,
2006 struct l2cap_ctrl *control)
2007{
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002008 struct sk_buff *skb;
2009
2010 BT_DBG("chan %p, control %p", chan, control);
2011
2012 if (control->poll)
2013 set_bit(CONN_SEND_FBIT, &chan->conn_state);
2014
2015 l2cap_seq_list_clear(&chan->retrans_list);
2016
2017 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
2018 return;
2019
2020 if (chan->unacked_frames) {
2021 skb_queue_walk(&chan->tx_q, skb) {
2022 if (bt_cb(skb)->control.txseq == control->reqseq ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01002023 skb == chan->tx_send_head)
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002024 break;
2025 }
2026
2027 skb_queue_walk_from(&chan->tx_q, skb) {
2028 if (skb == chan->tx_send_head)
2029 break;
2030
2031 l2cap_seq_list_append(&chan->retrans_list,
2032 bt_cb(skb)->control.txseq);
2033 }
2034
2035 l2cap_ertm_resend(chan);
2036 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002037}
2038
Szymon Jancb17e73b2012-01-11 10:59:47 +01002039static void l2cap_send_ack(struct l2cap_chan *chan)
2040{
Mat Martineau0a0aba42012-05-17 20:53:39 -07002041 struct l2cap_ctrl control;
2042 u16 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
2043 chan->last_acked_seq);
2044 int threshold;
2045
2046 BT_DBG("chan %p last_acked_seq %d buffer_seq %d",
2047 chan, chan->last_acked_seq, chan->buffer_seq);
2048
2049 memset(&control, 0, sizeof(control));
2050 control.sframe = 1;
2051
2052 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
2053 chan->rx_state == L2CAP_RX_STATE_RECV) {
2054 __clear_ack_timer(chan);
2055 control.super = L2CAP_SUPER_RNR;
2056 control.reqseq = chan->buffer_seq;
2057 l2cap_send_sframe(chan, &control);
2058 } else {
2059 if (!test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) {
2060 l2cap_ertm_send(chan);
2061 /* If any i-frames were sent, they included an ack */
2062 if (chan->buffer_seq == chan->last_acked_seq)
2063 frames_to_ack = 0;
2064 }
2065
Mat Martineauc20f8e32012-07-10 05:47:07 -07002066 /* Ack now if the window is 3/4ths full.
Mat Martineau0a0aba42012-05-17 20:53:39 -07002067 * Calculate without mul or div
2068 */
Mat Martineauc20f8e32012-07-10 05:47:07 -07002069 threshold = chan->ack_win;
Mat Martineau0a0aba42012-05-17 20:53:39 -07002070 threshold += threshold << 1;
2071 threshold >>= 2;
2072
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002073 BT_DBG("frames_to_ack %u, threshold %d", frames_to_ack,
Mat Martineau0a0aba42012-05-17 20:53:39 -07002074 threshold);
2075
2076 if (frames_to_ack >= threshold) {
2077 __clear_ack_timer(chan);
2078 control.super = L2CAP_SUPER_RR;
2079 control.reqseq = chan->buffer_seq;
2080 l2cap_send_sframe(chan, &control);
2081 frames_to_ack = 0;
2082 }
2083
2084 if (frames_to_ack)
2085 __set_ack_timer(chan);
2086 }
Szymon Jancb17e73b2012-01-11 10:59:47 +01002087}
2088
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002089static inline int l2cap_skbuff_fromiovec(struct l2cap_chan *chan,
2090 struct msghdr *msg, int len,
2091 int count, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002092{
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002093 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002094 struct sk_buff **frag;
Gustavo Padovan90338942012-04-06 20:15:47 -03002095 int sent = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002096
Jukka Rissanen04988782014-06-18 16:37:07 +03002097 if (chan->ops->memcpy_fromiovec(chan, skb_put(skb, count),
2098 msg->msg_iov, count))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002099 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002100
2101 sent += count;
2102 len -= count;
2103
2104 /* Continuation fragments (no L2CAP header) */
2105 frag = &skb_shinfo(skb)->frag_list;
2106 while (len) {
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002107 struct sk_buff *tmp;
2108
Linus Torvalds1da177e2005-04-16 15:20:36 -07002109 count = min_t(unsigned int, conn->mtu, len);
2110
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002111 tmp = chan->ops->alloc_skb(chan, 0, count,
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002112 msg->msg_flags & MSG_DONTWAIT);
2113 if (IS_ERR(tmp))
2114 return PTR_ERR(tmp);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002115
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002116 *frag = tmp;
2117
Jukka Rissanen04988782014-06-18 16:37:07 +03002118 if (chan->ops->memcpy_fromiovec(chan, skb_put(*frag, count),
2119 msg->msg_iov, count))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002120 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002121
2122 sent += count;
2123 len -= count;
2124
Gustavo Padovan2d0ed3d2012-05-11 13:16:12 -03002125 skb->len += (*frag)->len;
2126 skb->data_len += (*frag)->len;
2127
Linus Torvalds1da177e2005-04-16 15:20:36 -07002128 frag = &(*frag)->next;
2129 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002130
2131 return sent;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002132}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002133
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002134static struct sk_buff *l2cap_create_connless_pdu(struct l2cap_chan *chan,
Marcel Holtmann8d463212014-06-05 15:22:51 +02002135 struct msghdr *msg, size_t len)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002136{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002137 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002138 struct sk_buff *skb;
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002139 int err, count, hlen = L2CAP_HDR_SIZE + L2CAP_PSMLEN_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002140 struct l2cap_hdr *lh;
2141
Marcel Holtmann8d463212014-06-05 15:22:51 +02002142 BT_DBG("chan %p psm 0x%2.2x len %zu", chan,
2143 __le16_to_cpu(chan->psm), len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002144
2145 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002146
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002147 skb = chan->ops->alloc_skb(chan, hlen, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002148 msg->msg_flags & MSG_DONTWAIT);
2149 if (IS_ERR(skb))
2150 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002151
2152 /* Create L2CAP header */
2153 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002154 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenkodaf6a78c2012-05-03 10:55:52 +03002155 lh->len = cpu_to_le16(len + L2CAP_PSMLEN_SIZE);
Marcel Holtmann43b1b8d2013-10-12 06:01:26 -07002156 put_unaligned(chan->psm, (__le16 *) skb_put(skb, L2CAP_PSMLEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002157
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002158 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002159 if (unlikely(err < 0)) {
2160 kfree_skb(skb);
2161 return ERR_PTR(err);
2162 }
2163 return skb;
2164}
2165
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002166static struct sk_buff *l2cap_create_basic_pdu(struct l2cap_chan *chan,
Marcel Holtmann8d463212014-06-05 15:22:51 +02002167 struct msghdr *msg, size_t len)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002168{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002169 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002170 struct sk_buff *skb;
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002171 int err, count;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002172 struct l2cap_hdr *lh;
2173
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002174 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002175
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002176 count = min_t(unsigned int, (conn->mtu - L2CAP_HDR_SIZE), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002177
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002178 skb = chan->ops->alloc_skb(chan, L2CAP_HDR_SIZE, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002179 msg->msg_flags & MSG_DONTWAIT);
2180 if (IS_ERR(skb))
2181 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002182
2183 /* Create L2CAP header */
2184 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002185 lh->cid = cpu_to_le16(chan->dcid);
Gustavo Padovan6ff9b5e2012-05-02 11:56:17 -03002186 lh->len = cpu_to_le16(len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002187
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002188 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002189 if (unlikely(err < 0)) {
2190 kfree_skb(skb);
2191 return ERR_PTR(err);
2192 }
2193 return skb;
2194}
2195
Luiz Augusto von Dentzab0ff762011-09-12 20:00:50 +03002196static struct sk_buff *l2cap_create_iframe_pdu(struct l2cap_chan *chan,
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002197 struct msghdr *msg, size_t len,
2198 u16 sdulen)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002199{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002200 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002201 struct sk_buff *skb;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002202 int err, count, hlen;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002203 struct l2cap_hdr *lh;
2204
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002205 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002206
Gustavo F. Padovan0ee0d202010-05-01 16:15:41 -03002207 if (!conn)
2208 return ERR_PTR(-ENOTCONN);
2209
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002210 hlen = __ertm_hdr_size(chan);
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002211
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002212 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002213 hlen += L2CAP_SDULEN_SIZE;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002214
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03002215 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002216 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03002217
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002218 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002219
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002220 skb = chan->ops->alloc_skb(chan, hlen, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002221 msg->msg_flags & MSG_DONTWAIT);
2222 if (IS_ERR(skb))
2223 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002224
2225 /* Create L2CAP header */
2226 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002227 lh->cid = cpu_to_le16(chan->dcid);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002228 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002229
Mat Martineau18a48e72012-05-17 20:53:34 -07002230 /* Control header is populated later */
2231 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
2232 put_unaligned_le32(0, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
2233 else
2234 put_unaligned_le16(0, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002235
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002236 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002237 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002238
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002239 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002240 if (unlikely(err < 0)) {
2241 kfree_skb(skb);
2242 return ERR_PTR(err);
2243 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03002244
Mat Martineau18a48e72012-05-17 20:53:34 -07002245 bt_cb(skb)->control.fcs = chan->fcs;
Mat Martineau3ce35142012-04-25 16:36:14 -07002246 bt_cb(skb)->control.retries = 0;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002247 return skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002248}
2249
Mat Martineau94122bb2012-05-02 09:42:02 -07002250static int l2cap_segment_sdu(struct l2cap_chan *chan,
2251 struct sk_buff_head *seg_queue,
2252 struct msghdr *msg, size_t len)
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002253{
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002254 struct sk_buff *skb;
Mat Martineau94122bb2012-05-02 09:42:02 -07002255 u16 sdu_len;
2256 size_t pdu_len;
Mat Martineau94122bb2012-05-02 09:42:02 -07002257 u8 sar;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002258
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002259 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002260
Mat Martineau94122bb2012-05-02 09:42:02 -07002261 /* It is critical that ERTM PDUs fit in a single HCI fragment,
2262 * so fragmented skbs are not used. The HCI layer's handling
2263 * of fragmented skbs is not compatible with ERTM's queueing.
2264 */
2265
2266 /* PDU size is derived from the HCI MTU */
2267 pdu_len = chan->conn->mtu;
2268
Mat Martineaua5495742012-10-23 15:24:21 -07002269 /* Constrain PDU size for BR/EDR connections */
2270 if (!chan->hs_hcon)
2271 pdu_len = min_t(size_t, pdu_len, L2CAP_BREDR_MAX_PAYLOAD);
Mat Martineau94122bb2012-05-02 09:42:02 -07002272
2273 /* Adjust for largest possible L2CAP overhead. */
Gustavo Padovan35d401d2012-05-25 18:57:05 -03002274 if (chan->fcs)
2275 pdu_len -= L2CAP_FCS_SIZE;
2276
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002277 pdu_len -= __ertm_hdr_size(chan);
Mat Martineau94122bb2012-05-02 09:42:02 -07002278
2279 /* Remote device may have requested smaller PDUs */
2280 pdu_len = min_t(size_t, pdu_len, chan->remote_mps);
2281
2282 if (len <= pdu_len) {
2283 sar = L2CAP_SAR_UNSEGMENTED;
2284 sdu_len = 0;
2285 pdu_len = len;
2286 } else {
2287 sar = L2CAP_SAR_START;
2288 sdu_len = len;
Mat Martineau94122bb2012-05-02 09:42:02 -07002289 }
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002290
2291 while (len > 0) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002292 skb = l2cap_create_iframe_pdu(chan, msg, pdu_len, sdu_len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002293
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002294 if (IS_ERR(skb)) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002295 __skb_queue_purge(seg_queue);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002296 return PTR_ERR(skb);
2297 }
2298
Mat Martineau94122bb2012-05-02 09:42:02 -07002299 bt_cb(skb)->control.sar = sar;
2300 __skb_queue_tail(seg_queue, skb);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002301
Mat Martineau94122bb2012-05-02 09:42:02 -07002302 len -= pdu_len;
Lukasz Rymanowski069cb272014-08-13 16:01:41 +02002303 if (sdu_len)
Mat Martineau94122bb2012-05-02 09:42:02 -07002304 sdu_len = 0;
Mat Martineau94122bb2012-05-02 09:42:02 -07002305
2306 if (len <= pdu_len) {
2307 sar = L2CAP_SAR_END;
2308 pdu_len = len;
2309 } else {
2310 sar = L2CAP_SAR_CONTINUE;
2311 }
2312 }
2313
Gustavo Padovanf0f62792012-05-29 13:29:17 -03002314 return 0;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002315}
2316
Johan Hedberg177f8f22013-05-31 17:54:51 +03002317static struct sk_buff *l2cap_create_le_flowctl_pdu(struct l2cap_chan *chan,
2318 struct msghdr *msg,
2319 size_t len, u16 sdulen)
2320{
2321 struct l2cap_conn *conn = chan->conn;
2322 struct sk_buff *skb;
2323 int err, count, hlen;
2324 struct l2cap_hdr *lh;
2325
2326 BT_DBG("chan %p len %zu", chan, len);
2327
2328 if (!conn)
2329 return ERR_PTR(-ENOTCONN);
2330
2331 hlen = L2CAP_HDR_SIZE;
2332
2333 if (sdulen)
2334 hlen += L2CAP_SDULEN_SIZE;
2335
2336 count = min_t(unsigned int, (conn->mtu - hlen), len);
2337
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002338 skb = chan->ops->alloc_skb(chan, hlen, count,
Johan Hedberg177f8f22013-05-31 17:54:51 +03002339 msg->msg_flags & MSG_DONTWAIT);
2340 if (IS_ERR(skb))
2341 return skb;
2342
2343 /* Create L2CAP header */
2344 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
2345 lh->cid = cpu_to_le16(chan->dcid);
2346 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
2347
2348 if (sdulen)
2349 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
2350
2351 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
2352 if (unlikely(err < 0)) {
2353 kfree_skb(skb);
2354 return ERR_PTR(err);
2355 }
2356
2357 return skb;
2358}
2359
2360static int l2cap_segment_le_sdu(struct l2cap_chan *chan,
2361 struct sk_buff_head *seg_queue,
2362 struct msghdr *msg, size_t len)
2363{
2364 struct sk_buff *skb;
2365 size_t pdu_len;
2366 u16 sdu_len;
2367
2368 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
2369
Johan Hedberg177f8f22013-05-31 17:54:51 +03002370 sdu_len = len;
Johan Hedberg72c6fb92014-08-15 21:06:51 +03002371 pdu_len = chan->remote_mps - L2CAP_SDULEN_SIZE;
Johan Hedberg177f8f22013-05-31 17:54:51 +03002372
2373 while (len > 0) {
2374 if (len <= pdu_len)
2375 pdu_len = len;
2376
2377 skb = l2cap_create_le_flowctl_pdu(chan, msg, pdu_len, sdu_len);
2378 if (IS_ERR(skb)) {
2379 __skb_queue_purge(seg_queue);
2380 return PTR_ERR(skb);
2381 }
2382
2383 __skb_queue_tail(seg_queue, skb);
2384
2385 len -= pdu_len;
2386
2387 if (sdu_len) {
2388 sdu_len = 0;
2389 pdu_len += L2CAP_SDULEN_SIZE;
2390 }
2391 }
2392
2393 return 0;
2394}
2395
Marcel Holtmann8d463212014-06-05 15:22:51 +02002396int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002397{
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002398 struct sk_buff *skb;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002399 int err;
Mat Martineau94122bb2012-05-02 09:42:02 -07002400 struct sk_buff_head seg_queue;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002401
Seung-Woo Kim31e8ce82013-11-05 18:46:33 +09002402 if (!chan->conn)
2403 return -ENOTCONN;
2404
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002405 /* Connectionless channel */
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002406 if (chan->chan_type == L2CAP_CHAN_CONN_LESS) {
Marcel Holtmann8d463212014-06-05 15:22:51 +02002407 skb = l2cap_create_connless_pdu(chan, msg, len);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002408 if (IS_ERR(skb))
2409 return PTR_ERR(skb);
2410
Andrzej Kaczmarekede81a22014-02-25 17:16:22 +01002411 /* Channel lock is released before requesting new skb and then
2412 * reacquired thus we need to recheck channel state.
2413 */
2414 if (chan->state != BT_CONNECTED) {
2415 kfree_skb(skb);
2416 return -ENOTCONN;
2417 }
2418
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002419 l2cap_do_send(chan, skb);
2420 return len;
2421 }
2422
2423 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03002424 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedberg177f8f22013-05-31 17:54:51 +03002425 /* Check outgoing MTU */
2426 if (len > chan->omtu)
2427 return -EMSGSIZE;
2428
Johan Hedbergfad5fc82013-12-05 09:45:01 +02002429 if (!chan->tx_credits)
2430 return -EAGAIN;
2431
Johan Hedberg177f8f22013-05-31 17:54:51 +03002432 __skb_queue_head_init(&seg_queue);
2433
2434 err = l2cap_segment_le_sdu(chan, &seg_queue, msg, len);
2435
2436 if (chan->state != BT_CONNECTED) {
2437 __skb_queue_purge(&seg_queue);
2438 err = -ENOTCONN;
2439 }
2440
2441 if (err)
2442 return err;
2443
2444 skb_queue_splice_tail_init(&seg_queue, &chan->tx_q);
2445
2446 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
2447 l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
2448 chan->tx_credits--;
2449 }
2450
2451 if (!chan->tx_credits)
2452 chan->ops->suspend(chan);
2453
2454 err = len;
2455
2456 break;
2457
Johan Hedbergfad5fc82013-12-05 09:45:01 +02002458 case L2CAP_MODE_BASIC:
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002459 /* Check outgoing MTU */
2460 if (len > chan->omtu)
2461 return -EMSGSIZE;
2462
2463 /* Create a basic PDU */
Marcel Holtmann8d463212014-06-05 15:22:51 +02002464 skb = l2cap_create_basic_pdu(chan, msg, len);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002465 if (IS_ERR(skb))
2466 return PTR_ERR(skb);
2467
Andrzej Kaczmarekede81a22014-02-25 17:16:22 +01002468 /* Channel lock is released before requesting new skb and then
2469 * reacquired thus we need to recheck channel state.
2470 */
2471 if (chan->state != BT_CONNECTED) {
2472 kfree_skb(skb);
2473 return -ENOTCONN;
2474 }
2475
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002476 l2cap_do_send(chan, skb);
2477 err = len;
2478 break;
2479
2480 case L2CAP_MODE_ERTM:
2481 case L2CAP_MODE_STREAMING:
Mat Martineau94122bb2012-05-02 09:42:02 -07002482 /* Check outgoing MTU */
2483 if (len > chan->omtu) {
2484 err = -EMSGSIZE;
2485 break;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002486 }
2487
Mat Martineau94122bb2012-05-02 09:42:02 -07002488 __skb_queue_head_init(&seg_queue);
2489
2490 /* Do segmentation before calling in to the state machine,
2491 * since it's possible to block while waiting for memory
2492 * allocation.
2493 */
2494 err = l2cap_segment_sdu(chan, &seg_queue, msg, len);
2495
2496 /* The channel could have been closed while segmenting,
2497 * check that it is still connected.
2498 */
2499 if (chan->state != BT_CONNECTED) {
2500 __skb_queue_purge(&seg_queue);
2501 err = -ENOTCONN;
2502 }
2503
2504 if (err)
2505 break;
2506
Mat Martineau37339372012-05-17 20:53:33 -07002507 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo Padovand6603662012-05-21 13:58:22 -03002508 l2cap_tx(chan, NULL, &seg_queue, L2CAP_EV_DATA_REQUEST);
Mat Martineau37339372012-05-17 20:53:33 -07002509 else
Gustavo Padovand6603662012-05-21 13:58:22 -03002510 l2cap_streaming_send(chan, &seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002511
Gustavo Padovand6603662012-05-21 13:58:22 -03002512 err = len;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002513
Mat Martineau94122bb2012-05-02 09:42:02 -07002514 /* If the skbs were not queued for sending, they'll still be in
2515 * seg_queue and need to be purged.
2516 */
2517 __skb_queue_purge(&seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002518 break;
2519
2520 default:
2521 BT_DBG("bad state %1.1x", chan->mode);
2522 err = -EBADFD;
2523 }
2524
2525 return err;
2526}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +03002527EXPORT_SYMBOL_GPL(l2cap_chan_send);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002528
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002529static void l2cap_send_srej(struct l2cap_chan *chan, u16 txseq)
2530{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002531 struct l2cap_ctrl control;
2532 u16 seq;
2533
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002534 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002535
2536 memset(&control, 0, sizeof(control));
2537 control.sframe = 1;
2538 control.super = L2CAP_SUPER_SREJ;
2539
2540 for (seq = chan->expected_tx_seq; seq != txseq;
2541 seq = __next_seq(chan, seq)) {
2542 if (!l2cap_ertm_seq_in_queue(&chan->srej_q, seq)) {
2543 control.reqseq = seq;
2544 l2cap_send_sframe(chan, &control);
2545 l2cap_seq_list_append(&chan->srej_list, seq);
2546 }
2547 }
2548
2549 chan->expected_tx_seq = __next_seq(chan, txseq);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002550}
2551
2552static void l2cap_send_srej_tail(struct l2cap_chan *chan)
2553{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002554 struct l2cap_ctrl control;
2555
2556 BT_DBG("chan %p", chan);
2557
2558 if (chan->srej_list.tail == L2CAP_SEQ_LIST_CLEAR)
2559 return;
2560
2561 memset(&control, 0, sizeof(control));
2562 control.sframe = 1;
2563 control.super = L2CAP_SUPER_SREJ;
2564 control.reqseq = chan->srej_list.tail;
2565 l2cap_send_sframe(chan, &control);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002566}
2567
2568static void l2cap_send_srej_list(struct l2cap_chan *chan, u16 txseq)
2569{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002570 struct l2cap_ctrl control;
2571 u16 initial_head;
2572 u16 seq;
2573
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002574 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002575
2576 memset(&control, 0, sizeof(control));
2577 control.sframe = 1;
2578 control.super = L2CAP_SUPER_SREJ;
2579
2580 /* Capture initial list head to allow only one pass through the list. */
2581 initial_head = chan->srej_list.head;
2582
2583 do {
2584 seq = l2cap_seq_list_pop(&chan->srej_list);
2585 if (seq == txseq || seq == L2CAP_SEQ_LIST_CLEAR)
2586 break;
2587
2588 control.reqseq = seq;
2589 l2cap_send_sframe(chan, &control);
2590 l2cap_seq_list_append(&chan->srej_list, seq);
2591 } while (chan->srej_list.head != initial_head);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002592}
2593
Mat Martineau608bcc62012-05-17 20:53:32 -07002594static void l2cap_process_reqseq(struct l2cap_chan *chan, u16 reqseq)
2595{
2596 struct sk_buff *acked_skb;
2597 u16 ackseq;
2598
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002599 BT_DBG("chan %p, reqseq %u", chan, reqseq);
Mat Martineau608bcc62012-05-17 20:53:32 -07002600
2601 if (chan->unacked_frames == 0 || reqseq == chan->expected_ack_seq)
2602 return;
2603
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002604 BT_DBG("expected_ack_seq %u, unacked_frames %u",
Mat Martineau608bcc62012-05-17 20:53:32 -07002605 chan->expected_ack_seq, chan->unacked_frames);
2606
2607 for (ackseq = chan->expected_ack_seq; ackseq != reqseq;
2608 ackseq = __next_seq(chan, ackseq)) {
2609
2610 acked_skb = l2cap_ertm_seq_in_queue(&chan->tx_q, ackseq);
2611 if (acked_skb) {
2612 skb_unlink(acked_skb, &chan->tx_q);
2613 kfree_skb(acked_skb);
2614 chan->unacked_frames--;
2615 }
2616 }
2617
2618 chan->expected_ack_seq = reqseq;
2619
2620 if (chan->unacked_frames == 0)
2621 __clear_retrans_timer(chan);
2622
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002623 BT_DBG("unacked_frames %u", chan->unacked_frames);
Mat Martineau608bcc62012-05-17 20:53:32 -07002624}
2625
2626static void l2cap_abort_rx_srej_sent(struct l2cap_chan *chan)
2627{
2628 BT_DBG("chan %p", chan);
2629
2630 chan->expected_tx_seq = chan->buffer_seq;
2631 l2cap_seq_list_clear(&chan->srej_list);
2632 skb_queue_purge(&chan->srej_q);
2633 chan->rx_state = L2CAP_RX_STATE_RECV;
2634}
2635
Gustavo Padovand6603662012-05-21 13:58:22 -03002636static void l2cap_tx_state_xmit(struct l2cap_chan *chan,
2637 struct l2cap_ctrl *control,
2638 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002639{
Mat Martineau608bcc62012-05-17 20:53:32 -07002640 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2641 event);
2642
2643 switch (event) {
2644 case L2CAP_EV_DATA_REQUEST:
2645 if (chan->tx_send_head == NULL)
2646 chan->tx_send_head = skb_peek(skbs);
2647
2648 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2649 l2cap_ertm_send(chan);
2650 break;
2651 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2652 BT_DBG("Enter LOCAL_BUSY");
2653 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2654
2655 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2656 /* The SREJ_SENT state must be aborted if we are to
2657 * enter the LOCAL_BUSY state.
2658 */
2659 l2cap_abort_rx_srej_sent(chan);
2660 }
2661
2662 l2cap_send_ack(chan);
2663
2664 break;
2665 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2666 BT_DBG("Exit LOCAL_BUSY");
2667 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2668
2669 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2670 struct l2cap_ctrl local_control;
2671
2672 memset(&local_control, 0, sizeof(local_control));
2673 local_control.sframe = 1;
2674 local_control.super = L2CAP_SUPER_RR;
2675 local_control.poll = 1;
2676 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002677 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002678
2679 chan->retry_count = 1;
2680 __set_monitor_timer(chan);
2681 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2682 }
2683 break;
2684 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2685 l2cap_process_reqseq(chan, control->reqseq);
2686 break;
2687 case L2CAP_EV_EXPLICIT_POLL:
2688 l2cap_send_rr_or_rnr(chan, 1);
2689 chan->retry_count = 1;
2690 __set_monitor_timer(chan);
2691 __clear_ack_timer(chan);
2692 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2693 break;
2694 case L2CAP_EV_RETRANS_TO:
2695 l2cap_send_rr_or_rnr(chan, 1);
2696 chan->retry_count = 1;
2697 __set_monitor_timer(chan);
2698 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2699 break;
2700 case L2CAP_EV_RECV_FBIT:
2701 /* Nothing to process */
2702 break;
2703 default:
2704 break;
2705 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002706}
2707
Gustavo Padovand6603662012-05-21 13:58:22 -03002708static void l2cap_tx_state_wait_f(struct l2cap_chan *chan,
2709 struct l2cap_ctrl *control,
2710 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002711{
Mat Martineau608bcc62012-05-17 20:53:32 -07002712 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2713 event);
2714
2715 switch (event) {
2716 case L2CAP_EV_DATA_REQUEST:
2717 if (chan->tx_send_head == NULL)
2718 chan->tx_send_head = skb_peek(skbs);
2719 /* Queue data, but don't send. */
2720 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2721 break;
2722 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2723 BT_DBG("Enter LOCAL_BUSY");
2724 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2725
2726 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2727 /* The SREJ_SENT state must be aborted if we are to
2728 * enter the LOCAL_BUSY state.
2729 */
2730 l2cap_abort_rx_srej_sent(chan);
2731 }
2732
2733 l2cap_send_ack(chan);
2734
2735 break;
2736 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2737 BT_DBG("Exit LOCAL_BUSY");
2738 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2739
2740 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2741 struct l2cap_ctrl local_control;
2742 memset(&local_control, 0, sizeof(local_control));
2743 local_control.sframe = 1;
2744 local_control.super = L2CAP_SUPER_RR;
2745 local_control.poll = 1;
2746 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002747 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002748
2749 chan->retry_count = 1;
2750 __set_monitor_timer(chan);
2751 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2752 }
2753 break;
2754 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2755 l2cap_process_reqseq(chan, control->reqseq);
2756
2757 /* Fall through */
2758
2759 case L2CAP_EV_RECV_FBIT:
2760 if (control && control->final) {
2761 __clear_monitor_timer(chan);
2762 if (chan->unacked_frames > 0)
2763 __set_retrans_timer(chan);
2764 chan->retry_count = 0;
2765 chan->tx_state = L2CAP_TX_STATE_XMIT;
2766 BT_DBG("recv fbit tx_state 0x2.2%x", chan->tx_state);
2767 }
2768 break;
2769 case L2CAP_EV_EXPLICIT_POLL:
2770 /* Ignore */
2771 break;
2772 case L2CAP_EV_MONITOR_TO:
2773 if (chan->max_tx == 0 || chan->retry_count < chan->max_tx) {
2774 l2cap_send_rr_or_rnr(chan, 1);
2775 __set_monitor_timer(chan);
2776 chan->retry_count++;
2777 } else {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02002778 l2cap_send_disconn_req(chan, ECONNABORTED);
Mat Martineau608bcc62012-05-17 20:53:32 -07002779 }
2780 break;
2781 default:
2782 break;
2783 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002784}
2785
Gustavo Padovand6603662012-05-21 13:58:22 -03002786static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
2787 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002788{
Mat Martineau608bcc62012-05-17 20:53:32 -07002789 BT_DBG("chan %p, control %p, skbs %p, event %d, state %d",
2790 chan, control, skbs, event, chan->tx_state);
2791
2792 switch (chan->tx_state) {
2793 case L2CAP_TX_STATE_XMIT:
Gustavo Padovand6603662012-05-21 13:58:22 -03002794 l2cap_tx_state_xmit(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002795 break;
2796 case L2CAP_TX_STATE_WAIT_F:
Gustavo Padovand6603662012-05-21 13:58:22 -03002797 l2cap_tx_state_wait_f(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002798 break;
2799 default:
2800 /* Ignore event */
2801 break;
2802 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002803}
2804
Mat Martineau4b51dae92012-05-17 20:53:37 -07002805static void l2cap_pass_to_tx(struct l2cap_chan *chan,
2806 struct l2cap_ctrl *control)
2807{
2808 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002809 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_REQSEQ_AND_FBIT);
Mat Martineau4b51dae92012-05-17 20:53:37 -07002810}
2811
Mat Martineauf80842a2012-05-17 20:53:46 -07002812static void l2cap_pass_to_tx_fbit(struct l2cap_chan *chan,
2813 struct l2cap_ctrl *control)
2814{
2815 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002816 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_FBIT);
Mat Martineauf80842a2012-05-17 20:53:46 -07002817}
2818
Linus Torvalds1da177e2005-04-16 15:20:36 -07002819/* Copy frame to all raw sockets on that connection */
2820static void l2cap_raw_recv(struct l2cap_conn *conn, struct sk_buff *skb)
2821{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002822 struct sk_buff *nskb;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03002823 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002824
2825 BT_DBG("conn %p", conn);
2826
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002827 mutex_lock(&conn->chan_lock);
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002828
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002829 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002830 if (chan->chan_type != L2CAP_CHAN_RAW)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002831 continue;
2832
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002833 /* Don't send frame to the channel it came from */
2834 if (bt_cb(skb)->chan == chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002835 continue;
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002836
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002837 nskb = skb_clone(skb, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03002838 if (!nskb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002839 continue;
Gustavo Padovan80b98022012-05-27 22:27:51 -03002840 if (chan->ops->recv(chan, nskb))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002841 kfree_skb(nskb);
2842 }
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002843
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002844 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002845}
2846
2847/* ---- L2CAP signalling commands ---- */
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002848static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn, u8 code,
2849 u8 ident, u16 dlen, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002850{
2851 struct sk_buff *skb, **frag;
2852 struct l2cap_cmd_hdr *cmd;
2853 struct l2cap_hdr *lh;
2854 int len, count;
2855
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002856 BT_DBG("conn %p, code 0x%2.2x, ident 0x%2.2x, len %u",
2857 conn, code, ident, dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002858
Anderson Lizardo300b9622013-06-02 16:30:40 -04002859 if (conn->mtu < L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE)
2860 return NULL;
2861
Linus Torvalds1da177e2005-04-16 15:20:36 -07002862 len = L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE + dlen;
2863 count = min_t(unsigned int, conn->mtu, len);
2864
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002865 skb = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002866 if (!skb)
2867 return NULL;
2868
2869 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002870 lh->len = cpu_to_le16(L2CAP_CMD_HDR_SIZE + dlen);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002871
2872 if (conn->hcon->type == LE_LINK)
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002873 lh->cid = cpu_to_le16(L2CAP_CID_LE_SIGNALING);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002874 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002875 lh->cid = cpu_to_le16(L2CAP_CID_SIGNALING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002876
2877 cmd = (struct l2cap_cmd_hdr *) skb_put(skb, L2CAP_CMD_HDR_SIZE);
2878 cmd->code = code;
2879 cmd->ident = ident;
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002880 cmd->len = cpu_to_le16(dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002881
2882 if (dlen) {
2883 count -= L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE;
2884 memcpy(skb_put(skb, count), data, count);
2885 data += count;
2886 }
2887
2888 len -= skb->len;
2889
2890 /* Continuation fragments (no L2CAP header) */
2891 frag = &skb_shinfo(skb)->frag_list;
2892 while (len) {
2893 count = min_t(unsigned int, conn->mtu, len);
2894
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002895 *frag = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002896 if (!*frag)
2897 goto fail;
2898
2899 memcpy(skb_put(*frag, count), data, count);
2900
2901 len -= count;
2902 data += count;
2903
2904 frag = &(*frag)->next;
2905 }
2906
2907 return skb;
2908
2909fail:
2910 kfree_skb(skb);
2911 return NULL;
2912}
2913
Gustavo Padovan2d792812012-10-06 10:07:01 +01002914static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen,
2915 unsigned long *val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002916{
2917 struct l2cap_conf_opt *opt = *ptr;
2918 int len;
2919
2920 len = L2CAP_CONF_OPT_SIZE + opt->len;
2921 *ptr += len;
2922
2923 *type = opt->type;
2924 *olen = opt->len;
2925
2926 switch (opt->len) {
2927 case 1:
2928 *val = *((u8 *) opt->val);
2929 break;
2930
2931 case 2:
steven miaobfaaeb32010-10-16 18:29:47 -04002932 *val = get_unaligned_le16(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002933 break;
2934
2935 case 4:
steven miaobfaaeb32010-10-16 18:29:47 -04002936 *val = get_unaligned_le32(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002937 break;
2938
2939 default:
2940 *val = (unsigned long) opt->val;
2941 break;
2942 }
2943
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002944 BT_DBG("type 0x%2.2x len %u val 0x%lx", *type, opt->len, *val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002945 return len;
2946}
2947
Linus Torvalds1da177e2005-04-16 15:20:36 -07002948static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val)
2949{
2950 struct l2cap_conf_opt *opt = *ptr;
2951
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002952 BT_DBG("type 0x%2.2x len %u val 0x%lx", type, len, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002953
2954 opt->type = type;
2955 opt->len = len;
2956
2957 switch (len) {
2958 case 1:
2959 *((u8 *) opt->val) = val;
2960 break;
2961
2962 case 2:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02002963 put_unaligned_le16(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002964 break;
2965
2966 case 4:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02002967 put_unaligned_le32(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002968 break;
2969
2970 default:
2971 memcpy(opt->val, (void *) val, len);
2972 break;
2973 }
2974
2975 *ptr += L2CAP_CONF_OPT_SIZE + len;
2976}
2977
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03002978static void l2cap_add_opt_efs(void **ptr, struct l2cap_chan *chan)
2979{
2980 struct l2cap_conf_efs efs;
2981
Szymon Janc1ec918c2011-11-16 09:32:21 +01002982 switch (chan->mode) {
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03002983 case L2CAP_MODE_ERTM:
2984 efs.id = chan->local_id;
2985 efs.stype = chan->local_stype;
2986 efs.msdu = cpu_to_le16(chan->local_msdu);
2987 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002988 efs.acc_lat = cpu_to_le32(L2CAP_DEFAULT_ACC_LAT);
2989 efs.flush_to = cpu_to_le32(L2CAP_EFS_DEFAULT_FLUSH_TO);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03002990 break;
2991
2992 case L2CAP_MODE_STREAMING:
2993 efs.id = 1;
2994 efs.stype = L2CAP_SERV_BESTEFFORT;
2995 efs.msdu = cpu_to_le16(chan->local_msdu);
2996 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
2997 efs.acc_lat = 0;
2998 efs.flush_to = 0;
2999 break;
3000
3001 default:
3002 return;
3003 }
3004
3005 l2cap_add_conf_opt(ptr, L2CAP_CONF_EFS, sizeof(efs),
Andrei Emeltchenko8936fa62012-10-08 11:14:41 +03003006 (unsigned long) &efs);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003007}
3008
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003009static void l2cap_ack_timeout(struct work_struct *work)
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003010{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003011 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau03625202012-05-17 20:53:51 -07003012 ack_timer.work);
3013 u16 frames_to_ack;
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003014
Gustavo F. Padovan2fb9b3d2011-12-22 16:56:05 -02003015 BT_DBG("chan %p", chan);
3016
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003017 l2cap_chan_lock(chan);
3018
Mat Martineau03625202012-05-17 20:53:51 -07003019 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
3020 chan->last_acked_seq);
3021
3022 if (frames_to_ack)
3023 l2cap_send_rr_or_rnr(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003024
3025 l2cap_chan_unlock(chan);
Szymon Janc09bfb2e2012-01-11 10:59:49 +01003026 l2cap_chan_put(chan);
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003027}
3028
Andrei Emeltchenko466f8002012-05-29 13:59:01 +03003029int l2cap_ertm_init(struct l2cap_chan *chan)
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003030{
Mat Martineau3c588192012-04-11 10:48:42 -07003031 int err;
3032
Mat Martineau105bdf92012-04-27 16:50:48 -07003033 chan->next_tx_seq = 0;
3034 chan->expected_tx_seq = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003035 chan->expected_ack_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003036 chan->unacked_frames = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003037 chan->buffer_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003038 chan->frames_sent = 0;
Mat Martineau105bdf92012-04-27 16:50:48 -07003039 chan->last_acked_seq = 0;
3040 chan->sdu = NULL;
3041 chan->sdu_last_frag = NULL;
3042 chan->sdu_len = 0;
3043
Mat Martineaud34c34f2012-05-14 14:49:27 -07003044 skb_queue_head_init(&chan->tx_q);
3045
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003046 chan->local_amp_id = AMP_ID_BREDR;
3047 chan->move_id = AMP_ID_BREDR;
Mat Martineau08333282012-10-23 15:24:06 -07003048 chan->move_state = L2CAP_MOVE_STABLE;
3049 chan->move_role = L2CAP_MOVE_ROLE_NONE;
3050
Mat Martineau105bdf92012-04-27 16:50:48 -07003051 if (chan->mode != L2CAP_MODE_ERTM)
3052 return 0;
3053
3054 chan->rx_state = L2CAP_RX_STATE_RECV;
3055 chan->tx_state = L2CAP_TX_STATE_XMIT;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003056
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003057 INIT_DELAYED_WORK(&chan->retrans_timer, l2cap_retrans_timeout);
3058 INIT_DELAYED_WORK(&chan->monitor_timer, l2cap_monitor_timeout);
3059 INIT_DELAYED_WORK(&chan->ack_timer, l2cap_ack_timeout);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003060
Gustavo F. Padovanf1c67752011-03-25 20:36:10 -03003061 skb_queue_head_init(&chan->srej_q);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03003062
Mat Martineau3c588192012-04-11 10:48:42 -07003063 err = l2cap_seq_list_init(&chan->srej_list, chan->tx_win);
3064 if (err < 0)
3065 return err;
3066
Mat Martineau9dc9aff2012-05-17 16:20:14 -07003067 err = l2cap_seq_list_init(&chan->retrans_list, chan->remote_tx_win);
3068 if (err < 0)
3069 l2cap_seq_list_free(&chan->srej_list);
3070
3071 return err;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003072}
3073
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003074static inline __u8 l2cap_select_mode(__u8 mode, __u16 remote_feat_mask)
3075{
3076 switch (mode) {
3077 case L2CAP_MODE_STREAMING:
3078 case L2CAP_MODE_ERTM:
3079 if (l2cap_mode_supported(mode, remote_feat_mask))
3080 return mode;
3081 /* fall through */
3082 default:
3083 return L2CAP_MODE_BASIC;
3084 }
3085}
3086
Marcel Holtmann848566b2013-10-01 22:59:22 -07003087static inline bool __l2cap_ews_supported(struct l2cap_conn *conn)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003088{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003089 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003090}
3091
Marcel Holtmann848566b2013-10-01 22:59:22 -07003092static inline bool __l2cap_efs_supported(struct l2cap_conn *conn)
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003093{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003094 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_FLOW;
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003095}
3096
Mat Martineau36c86c82012-10-23 15:24:20 -07003097static void __l2cap_set_ertm_timeouts(struct l2cap_chan *chan,
3098 struct l2cap_conf_rfc *rfc)
3099{
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003100 if (chan->local_amp_id != AMP_ID_BREDR && chan->hs_hcon) {
Mat Martineau36c86c82012-10-23 15:24:20 -07003101 u64 ertm_to = chan->hs_hcon->hdev->amp_be_flush_to;
3102
3103 /* Class 1 devices have must have ERTM timeouts
3104 * exceeding the Link Supervision Timeout. The
3105 * default Link Supervision Timeout for AMP
3106 * controllers is 10 seconds.
3107 *
3108 * Class 1 devices use 0xffffffff for their
3109 * best-effort flush timeout, so the clamping logic
3110 * will result in a timeout that meets the above
3111 * requirement. ERTM timeouts are 16-bit values, so
3112 * the maximum timeout is 65.535 seconds.
3113 */
3114
3115 /* Convert timeout to milliseconds and round */
3116 ertm_to = DIV_ROUND_UP_ULL(ertm_to, 1000);
3117
3118 /* This is the recommended formula for class 2 devices
3119 * that start ERTM timers when packets are sent to the
3120 * controller.
3121 */
3122 ertm_to = 3 * ertm_to + 500;
3123
3124 if (ertm_to > 0xffff)
3125 ertm_to = 0xffff;
3126
3127 rfc->retrans_timeout = cpu_to_le16((u16) ertm_to);
3128 rfc->monitor_timeout = rfc->retrans_timeout;
3129 } else {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003130 rfc->retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO);
3131 rfc->monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO);
Mat Martineau36c86c82012-10-23 15:24:20 -07003132 }
3133}
3134
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003135static inline void l2cap_txwin_setup(struct l2cap_chan *chan)
3136{
3137 if (chan->tx_win > L2CAP_DEFAULT_TX_WINDOW &&
Marcel Holtmann848566b2013-10-01 22:59:22 -07003138 __l2cap_ews_supported(chan->conn)) {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003139 /* use extended control field */
3140 set_bit(FLAG_EXT_CTRL, &chan->flags);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003141 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
3142 } else {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003143 chan->tx_win = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003144 L2CAP_DEFAULT_TX_WINDOW);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003145 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
3146 }
Mat Martineauc20f8e32012-07-10 05:47:07 -07003147 chan->ack_win = chan->tx_win;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003148}
3149
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003150static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003151{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003152 struct l2cap_conf_req *req = data;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003153 struct l2cap_conf_rfc rfc = { .mode = chan->mode };
Linus Torvalds1da177e2005-04-16 15:20:36 -07003154 void *ptr = req->data;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003155 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003156
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03003157 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003158
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003159 if (chan->num_conf_req || chan->num_conf_rsp)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003160 goto done;
3161
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003162 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003163 case L2CAP_MODE_STREAMING:
3164 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003165 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state))
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003166 break;
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003167
Marcel Holtmann848566b2013-10-01 22:59:22 -07003168 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003169 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3170
Gustavo F. Padovan2ba13ed2010-06-09 16:39:05 -03003171 /* fall through */
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003172 default:
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003173 chan->mode = l2cap_select_mode(rfc.mode, chan->conn->feat_mask);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003174 break;
3175 }
3176
3177done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003178 if (chan->imtu != L2CAP_DEFAULT_MTU)
3179 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovan7990681c2011-01-24 16:01:43 -02003180
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003181 switch (chan->mode) {
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003182 case L2CAP_MODE_BASIC:
Marcel Holtmann6fea7ad2014-07-09 11:53:35 +02003183 if (disable_ertm)
3184 break;
3185
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003186 if (!(chan->conn->feat_mask & L2CAP_FEAT_ERTM) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003187 !(chan->conn->feat_mask & L2CAP_FEAT_STREAMING))
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003188 break;
3189
Gustavo F. Padovan62547752010-06-08 20:05:31 -03003190 rfc.mode = L2CAP_MODE_BASIC;
3191 rfc.txwin_size = 0;
3192 rfc.max_transmit = 0;
3193 rfc.retrans_timeout = 0;
3194 rfc.monitor_timeout = 0;
3195 rfc.max_pdu_size = 0;
3196
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003197 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003198 (unsigned long) &rfc);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003199 break;
3200
3201 case L2CAP_MODE_ERTM:
3202 rfc.mode = L2CAP_MODE_ERTM;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003203 rfc.max_transmit = chan->max_tx;
Mat Martineau36c86c82012-10-23 15:24:20 -07003204
3205 __l2cap_set_ertm_timeouts(chan, &rfc);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003206
3207 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003208 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3209 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003210 rfc.max_pdu_size = cpu_to_le16(size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003211
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003212 l2cap_txwin_setup(chan);
3213
3214 rfc.txwin_size = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003215 L2CAP_DEFAULT_TX_WINDOW);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003216
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003217 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003218 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003219
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003220 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3221 l2cap_add_opt_efs(&ptr, chan);
3222
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003223 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3224 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003225 chan->tx_win);
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003226
3227 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3228 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003229 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003230 chan->fcs = L2CAP_FCS_NONE;
3231 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3232 chan->fcs);
3233 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003234 break;
3235
3236 case L2CAP_MODE_STREAMING:
Mat Martineau273759e2012-05-17 20:53:53 -07003237 l2cap_txwin_setup(chan);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003238 rfc.mode = L2CAP_MODE_STREAMING;
3239 rfc.txwin_size = 0;
3240 rfc.max_transmit = 0;
3241 rfc.retrans_timeout = 0;
3242 rfc.monitor_timeout = 0;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003243
3244 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003245 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3246 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003247 rfc.max_pdu_size = cpu_to_le16(size);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003248
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003249 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003250 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003251
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003252 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3253 l2cap_add_opt_efs(&ptr, chan);
3254
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003255 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3256 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003257 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003258 chan->fcs = L2CAP_FCS_NONE;
3259 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3260 chan->fcs);
3261 }
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003262 break;
3263 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003264
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003265 req->dcid = cpu_to_le16(chan->dcid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003266 req->flags = cpu_to_le16(0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003267
3268 return ptr - data;
3269}
3270
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003271static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003272{
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003273 struct l2cap_conf_rsp *rsp = data;
3274 void *ptr = rsp->data;
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003275 void *req = chan->conf_req;
3276 int len = chan->conf_len;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003277 int type, hint, olen;
3278 unsigned long val;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003279 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003280 struct l2cap_conf_efs efs;
3281 u8 remote_efs = 0;
Marcel Holtmann861d6882007-10-20 13:37:06 +02003282 u16 mtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003283 u16 result = L2CAP_CONF_SUCCESS;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003284 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003285
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003286 BT_DBG("chan %p", chan);
Marcel Holtmann820ae1b2006-11-18 22:15:00 +01003287
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003288 while (len >= L2CAP_CONF_OPT_SIZE) {
3289 len -= l2cap_get_conf_opt(&req, &type, &olen, &val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003290
Gustavo F. Padovan589d2742009-04-20 01:31:07 -03003291 hint = type & L2CAP_CONF_HINT;
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07003292 type &= L2CAP_CONF_MASK;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003293
3294 switch (type) {
3295 case L2CAP_CONF_MTU:
Marcel Holtmann861d6882007-10-20 13:37:06 +02003296 mtu = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003297 break;
3298
3299 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003300 chan->flush_to = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003301 break;
3302
3303 case L2CAP_CONF_QOS:
3304 break;
3305
Marcel Holtmann6464f352007-10-20 13:39:51 +02003306 case L2CAP_CONF_RFC:
3307 if (olen == sizeof(rfc))
3308 memcpy(&rfc, (void *) val, olen);
3309 break;
3310
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003311 case L2CAP_CONF_FCS:
3312 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003313 set_bit(CONF_RECV_NO_FCS, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003314 break;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003315
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003316 case L2CAP_CONF_EFS:
3317 remote_efs = 1;
3318 if (olen == sizeof(efs))
3319 memcpy(&efs, (void *) val, olen);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003320 break;
3321
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003322 case L2CAP_CONF_EWS:
Marcel Holtmann848566b2013-10-01 22:59:22 -07003323 if (!chan->conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003324 return -ECONNREFUSED;
3325
3326 set_bit(FLAG_EXT_CTRL, &chan->flags);
3327 set_bit(CONF_EWS_RECV, &chan->conf_state);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003328 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003329 chan->remote_tx_win = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003330 break;
3331
3332 default:
3333 if (hint)
3334 break;
3335
3336 result = L2CAP_CONF_UNKNOWN;
3337 *((u8 *) ptr++) = type;
3338 break;
3339 }
3340 }
3341
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003342 if (chan->num_conf_rsp || chan->num_conf_req > 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003343 goto done;
3344
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003345 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003346 case L2CAP_MODE_STREAMING:
3347 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003348 if (!test_bit(CONF_STATE2_DEVICE, &chan->conf_state)) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003349 chan->mode = l2cap_select_mode(rfc.mode,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003350 chan->conn->feat_mask);
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003351 break;
3352 }
3353
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003354 if (remote_efs) {
Marcel Holtmann848566b2013-10-01 22:59:22 -07003355 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003356 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3357 else
3358 return -ECONNREFUSED;
3359 }
3360
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003361 if (chan->mode != rfc.mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003362 return -ECONNREFUSED;
Gustavo F. Padovan742e5192010-06-08 19:09:48 -03003363
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003364 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003365 }
3366
3367done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003368 if (chan->mode != rfc.mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003369 result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003370 rfc.mode = chan->mode;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003371
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003372 if (chan->num_conf_rsp == 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003373 return -ECONNREFUSED;
3374
Gustavo Padovan2d792812012-10-06 10:07:01 +01003375 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3376 (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003377 }
3378
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003379 if (result == L2CAP_CONF_SUCCESS) {
3380 /* Configure output options and let the other side know
3381 * which ones we don't like. */
3382
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003383 if (mtu < L2CAP_DEFAULT_MIN_MTU)
3384 result = L2CAP_CONF_UNACCEPT;
3385 else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003386 chan->omtu = mtu;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003387 set_bit(CONF_MTU_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003388 }
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003389 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->omtu);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003390
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003391 if (remote_efs) {
3392 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003393 efs.stype != L2CAP_SERV_NOTRAFIC &&
3394 efs.stype != chan->local_stype) {
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003395
3396 result = L2CAP_CONF_UNACCEPT;
3397
3398 if (chan->num_conf_req >= 1)
3399 return -ECONNREFUSED;
3400
3401 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003402 sizeof(efs),
3403 (unsigned long) &efs);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003404 } else {
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003405 /* Send PENDING Conf Rsp */
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003406 result = L2CAP_CONF_PENDING;
3407 set_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003408 }
3409 }
3410
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003411 switch (rfc.mode) {
3412 case L2CAP_MODE_BASIC:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003413 chan->fcs = L2CAP_FCS_NONE;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003414 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003415 break;
3416
3417 case L2CAP_MODE_ERTM:
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003418 if (!test_bit(CONF_EWS_RECV, &chan->conf_state))
3419 chan->remote_tx_win = rfc.txwin_size;
3420 else
3421 rfc.txwin_size = L2CAP_DEFAULT_TX_WINDOW;
3422
Gustavo F. Padovan2c03a7a2011-03-25 20:15:28 -03003423 chan->remote_max_tx = rfc.max_transmit;
Mat Martineau86b1b262010-08-05 15:54:22 -07003424
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003425 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003426 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3427 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003428 rfc.max_pdu_size = cpu_to_le16(size);
3429 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003430
Mat Martineau36c86c82012-10-23 15:24:20 -07003431 __l2cap_set_ertm_timeouts(chan, &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003432
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003433 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003434
3435 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003436 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003437
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003438 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3439 chan->remote_id = efs.id;
3440 chan->remote_stype = efs.stype;
3441 chan->remote_msdu = le16_to_cpu(efs.msdu);
3442 chan->remote_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003443 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003444 chan->remote_acc_lat =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003445 le32_to_cpu(efs.acc_lat);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003446 chan->remote_sdu_itime =
3447 le32_to_cpu(efs.sdu_itime);
3448 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003449 sizeof(efs),
3450 (unsigned long) &efs);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003451 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003452 break;
3453
3454 case L2CAP_MODE_STREAMING:
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003455 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003456 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3457 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003458 rfc.max_pdu_size = cpu_to_le16(size);
3459 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003460
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003461 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003462
Gustavo Padovan2d792812012-10-06 10:07:01 +01003463 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3464 (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003465
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003466 break;
3467
3468 default:
Marcel Holtmann6464f352007-10-20 13:39:51 +02003469 result = L2CAP_CONF_UNACCEPT;
3470
3471 memset(&rfc, 0, sizeof(rfc));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003472 rfc.mode = chan->mode;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003473 }
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003474
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003475 if (result == L2CAP_CONF_SUCCESS)
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003476 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003477 }
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003478 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003479 rsp->result = cpu_to_le16(result);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003480 rsp->flags = cpu_to_le16(0);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003481
3482 return ptr - data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003483}
3484
Gustavo Padovan2d792812012-10-06 10:07:01 +01003485static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len,
3486 void *data, u16 *result)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003487{
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003488 struct l2cap_conf_req *req = data;
3489 void *ptr = req->data;
3490 int type, olen;
3491 unsigned long val;
Mat Martineau36e999a2011-12-08 17:23:21 -08003492 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003493 struct l2cap_conf_efs efs;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003494
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003495 BT_DBG("chan %p, rsp %p, len %d, req %p", chan, rsp, len, data);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003496
3497 while (len >= L2CAP_CONF_OPT_SIZE) {
3498 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3499
3500 switch (type) {
3501 case L2CAP_CONF_MTU:
3502 if (val < L2CAP_DEFAULT_MIN_MTU) {
3503 *result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003504 chan->imtu = L2CAP_DEFAULT_MIN_MTU;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003505 } else
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003506 chan->imtu = val;
3507 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003508 break;
3509
3510 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003511 chan->flush_to = val;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003512 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003513 2, chan->flush_to);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003514 break;
3515
3516 case L2CAP_CONF_RFC:
3517 if (olen == sizeof(rfc))
3518 memcpy(&rfc, (void *)val, olen);
3519
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003520 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003521 rfc.mode != chan->mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003522 return -ECONNREFUSED;
3523
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003524 chan->fcs = 0;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003525
3526 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003527 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003528 break;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003529
3530 case L2CAP_CONF_EWS:
Mat Martineauc20f8e32012-07-10 05:47:07 -07003531 chan->ack_win = min_t(u16, val, chan->ack_win);
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003532 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Mat Martineauc20f8e32012-07-10 05:47:07 -07003533 chan->tx_win);
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003534 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003535
3536 case L2CAP_CONF_EFS:
3537 if (olen == sizeof(efs))
3538 memcpy(&efs, (void *)val, olen);
3539
3540 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003541 efs.stype != L2CAP_SERV_NOTRAFIC &&
3542 efs.stype != chan->local_stype)
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003543 return -ECONNREFUSED;
3544
Gustavo Padovan2d792812012-10-06 10:07:01 +01003545 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS, sizeof(efs),
3546 (unsigned long) &efs);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003547 break;
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003548
3549 case L2CAP_CONF_FCS:
3550 if (*result == L2CAP_CONF_PENDING)
3551 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003552 set_bit(CONF_RECV_NO_FCS,
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003553 &chan->conf_state);
3554 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003555 }
3556 }
3557
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003558 if (chan->mode == L2CAP_MODE_BASIC && chan->mode != rfc.mode)
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003559 return -ECONNREFUSED;
3560
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003561 chan->mode = rfc.mode;
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003562
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003563 if (*result == L2CAP_CONF_SUCCESS || *result == L2CAP_CONF_PENDING) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003564 switch (rfc.mode) {
3565 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003566 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3567 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
3568 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003569 if (!test_bit(FLAG_EXT_CTRL, &chan->flags))
3570 chan->ack_win = min_t(u16, chan->ack_win,
3571 rfc.txwin_size);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003572
3573 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3574 chan->local_msdu = le16_to_cpu(efs.msdu);
3575 chan->local_sdu_itime =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003576 le32_to_cpu(efs.sdu_itime);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003577 chan->local_acc_lat = le32_to_cpu(efs.acc_lat);
3578 chan->local_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003579 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003580 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003581 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003582
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003583 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003584 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003585 }
3586 }
3587
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003588 req->dcid = cpu_to_le16(chan->dcid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003589 req->flags = cpu_to_le16(0);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003590
3591 return ptr - data;
3592}
3593
Gustavo Padovan2d792812012-10-06 10:07:01 +01003594static int l2cap_build_conf_rsp(struct l2cap_chan *chan, void *data,
3595 u16 result, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003596{
3597 struct l2cap_conf_rsp *rsp = data;
3598 void *ptr = rsp->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003599
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003600 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003601
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003602 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003603 rsp->result = cpu_to_le16(result);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003604 rsp->flags = cpu_to_le16(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003605
3606 return ptr - data;
3607}
3608
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003609void __l2cap_le_connect_rsp_defer(struct l2cap_chan *chan)
3610{
3611 struct l2cap_le_conn_rsp rsp;
3612 struct l2cap_conn *conn = chan->conn;
3613
3614 BT_DBG("chan %p", chan);
3615
3616 rsp.dcid = cpu_to_le16(chan->scid);
3617 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02003618 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03003619 rsp.credits = cpu_to_le16(chan->rx_credits);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003620 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003621
3622 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp),
3623 &rsp);
3624}
3625
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003626void __l2cap_connect_rsp_defer(struct l2cap_chan *chan)
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003627{
3628 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003629 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003630 u8 buf[128];
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003631 u8 rsp_code;
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003632
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003633 rsp.scid = cpu_to_le16(chan->dcid);
3634 rsp.dcid = cpu_to_le16(chan->scid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003635 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
3636 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003637
3638 if (chan->hs_hcon)
3639 rsp_code = L2CAP_CREATE_CHAN_RSP;
3640 else
3641 rsp_code = L2CAP_CONN_RSP;
3642
3643 BT_DBG("chan %p rsp_code %u", chan, rsp_code);
3644
3645 l2cap_send_cmd(conn, chan->ident, rsp_code, sizeof(rsp), &rsp);
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003646
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003647 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003648 return;
3649
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003650 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003651 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003652 chan->num_conf_req++;
3653}
3654
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003655static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len)
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003656{
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003657 int type, olen;
3658 unsigned long val;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003659 /* Use sane default values in case a misbehaving remote device
3660 * did not send an RFC or extended window size option.
3661 */
3662 u16 txwin_ext = chan->ack_win;
3663 struct l2cap_conf_rfc rfc = {
3664 .mode = chan->mode,
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003665 .retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO),
3666 .monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO),
Mat Martineauc20f8e32012-07-10 05:47:07 -07003667 .max_pdu_size = cpu_to_le16(chan->imtu),
3668 .txwin_size = min_t(u16, chan->ack_win, L2CAP_DEFAULT_TX_WINDOW),
3669 };
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003670
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003671 BT_DBG("chan %p, rsp %p, len %d", chan, rsp, len);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003672
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003673 if ((chan->mode != L2CAP_MODE_ERTM) && (chan->mode != L2CAP_MODE_STREAMING))
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003674 return;
3675
3676 while (len >= L2CAP_CONF_OPT_SIZE) {
3677 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3678
Mat Martineauc20f8e32012-07-10 05:47:07 -07003679 switch (type) {
3680 case L2CAP_CONF_RFC:
3681 if (olen == sizeof(rfc))
3682 memcpy(&rfc, (void *)val, olen);
Szymon Janc8f321f82012-06-08 11:33:33 +02003683 break;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003684 case L2CAP_CONF_EWS:
3685 txwin_ext = val;
3686 break;
3687 }
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003688 }
3689
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003690 switch (rfc.mode) {
3691 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003692 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3693 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003694 chan->mps = le16_to_cpu(rfc.max_pdu_size);
3695 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3696 chan->ack_win = min_t(u16, chan->ack_win, txwin_ext);
3697 else
3698 chan->ack_win = min_t(u16, chan->ack_win,
3699 rfc.txwin_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003700 break;
3701 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003702 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003703 }
3704}
3705
Gustavo Padovan2d792812012-10-06 10:07:01 +01003706static inline int l2cap_command_rej(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003707 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3708 u8 *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003709{
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003710 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003711
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003712 if (cmd_len < sizeof(*rej))
3713 return -EPROTO;
3714
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003715 if (rej->reason != L2CAP_REJ_NOT_UNDERSTOOD)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003716 return 0;
3717
3718 if ((conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003719 cmd->ident == conn->info_ident) {
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02003720 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann984947d2009-02-06 23:35:19 +01003721
3722 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01003723 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01003724
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003725 l2cap_conn_start(conn);
3726 }
3727
3728 return 0;
3729}
3730
Mat Martineau17009152012-10-23 15:24:07 -07003731static struct l2cap_chan *l2cap_connect(struct l2cap_conn *conn,
3732 struct l2cap_cmd_hdr *cmd,
3733 u8 *data, u8 rsp_code, u8 amp_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003734{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003735 struct l2cap_conn_req *req = (struct l2cap_conn_req *) data;
3736 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003737 struct l2cap_chan *chan = NULL, *pchan;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003738 int result, status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003739
3740 u16 dcid = 0, scid = __le16_to_cpu(req->scid);
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003741 __le16 psm = req->psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003742
Andrei Emeltchenko097db762012-03-09 14:16:17 +02003743 BT_DBG("psm 0x%2.2x scid 0x%4.4x", __le16_to_cpu(psm), scid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003744
3745 /* Check if we have socket listening on psm */
Marcel Holtmann6f59b902013-10-13 05:24:01 -07003746 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03003747 &conn->hcon->dst, ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003748 if (!pchan) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003749 result = L2CAP_CR_BAD_PSM;
3750 goto sendresp;
3751 }
3752
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003753 mutex_lock(&conn->chan_lock);
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003754 l2cap_chan_lock(pchan);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00003755
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003756 /* Check if the ACL is secure enough (if not SDP) */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003757 if (psm != cpu_to_le16(L2CAP_PSM_SDP) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003758 !hci_conn_check_link_mode(conn->hcon)) {
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02003759 conn->disc_reason = HCI_ERROR_AUTH_FAILURE;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003760 result = L2CAP_CR_SEC_BLOCK;
3761 goto response;
3762 }
3763
Linus Torvalds1da177e2005-04-16 15:20:36 -07003764 result = L2CAP_CR_NO_MEM;
3765
Gustavo Padovan2dfa1002012-05-27 22:27:58 -03003766 /* Check if we already have channel with that dcid */
3767 if (__l2cap_get_chan_by_dcid(conn, scid))
3768 goto response;
3769
Gustavo Padovan80b98022012-05-27 22:27:51 -03003770 chan = pchan->ops->new_connection(pchan);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03003771 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003772 goto response;
3773
Syam Sidhardhan330b6c12013-08-06 01:59:12 +09003774 /* For certain devices (ex: HID mouse), support for authentication,
3775 * pairing and bonding is optional. For such devices, inorder to avoid
3776 * the ACL alive for too long after L2CAP disconnection, reset the ACL
3777 * disc_timeout back to HCI_DISCONN_TIMEOUT during L2CAP connect.
3778 */
3779 conn->hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
3780
Marcel Holtmann7eafc592013-10-13 08:12:47 -07003781 bacpy(&chan->src, &conn->hcon->src);
3782 bacpy(&chan->dst, &conn->hcon->dst);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -07003783 chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type);
3784 chan->dst_type = bdaddr_type(conn->hcon, conn->hcon->dst_type);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003785 chan->psm = psm;
3786 chan->dcid = scid;
Mat Martineau17009152012-10-23 15:24:07 -07003787 chan->local_amp_id = amp_id;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003788
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003789 __l2cap_chan_add(conn, chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003790
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003791 dcid = chan->scid;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003792
Gustavo Padovan8d836d72013-10-15 19:24:47 -03003793 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003794
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003795 chan->ident = cmd->ident;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003796
Marcel Holtmann984947d2009-02-06 23:35:19 +01003797 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) {
Johan Hedberge7cafc42014-07-17 15:35:38 +03003798 if (l2cap_chan_check_security(chan, false)) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07003799 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003800 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003801 result = L2CAP_CR_PEND;
3802 status = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08003803 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003804 } else {
Mat Martineau17009152012-10-23 15:24:07 -07003805 /* Force pending result for AMP controllers.
3806 * The connection will succeed after the
3807 * physical link is up.
3808 */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003809 if (amp_id == AMP_ID_BREDR) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003810 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau17009152012-10-23 15:24:07 -07003811 result = L2CAP_CR_SUCCESS;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003812 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003813 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003814 result = L2CAP_CR_PEND;
Mat Martineau17009152012-10-23 15:24:07 -07003815 }
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003816 status = L2CAP_CS_NO_INFO;
3817 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003818 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003819 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003820 result = L2CAP_CR_PEND;
3821 status = L2CAP_CS_AUTHEN_PEND;
3822 }
3823 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003824 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003825 result = L2CAP_CR_PEND;
3826 status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003827 }
3828
Linus Torvalds1da177e2005-04-16 15:20:36 -07003829response:
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003830 l2cap_chan_unlock(pchan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003831 mutex_unlock(&conn->chan_lock);
Johan Hedberga24cce12014-08-07 22:56:42 +03003832 l2cap_chan_put(pchan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003833
3834sendresp:
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003835 rsp.scid = cpu_to_le16(scid);
3836 rsp.dcid = cpu_to_le16(dcid);
3837 rsp.result = cpu_to_le16(result);
3838 rsp.status = cpu_to_le16(status);
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003839 l2cap_send_cmd(conn, cmd->ident, rsp_code, sizeof(rsp), &rsp);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003840
3841 if (result == L2CAP_CR_PEND && status == L2CAP_CS_NO_INFO) {
3842 struct l2cap_info_req info;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003843 info.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003844
3845 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
3846 conn->info_ident = l2cap_get_ident(conn);
3847
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08003848 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003849
Gustavo Padovan2d792812012-10-06 10:07:01 +01003850 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
3851 sizeof(info), &info);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003852 }
3853
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003854 if (chan && !test_bit(CONF_REQ_SENT, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003855 result == L2CAP_CR_SUCCESS) {
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003856 u8 buf[128];
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003857 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003858 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003859 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003860 chan->num_conf_req++;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003861 }
Mat Martineau17009152012-10-23 15:24:07 -07003862
3863 return chan;
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003864}
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003865
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003866static int l2cap_connect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003867 struct l2cap_cmd_hdr *cmd, u16 cmd_len, u8 *data)
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003868{
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303869 struct hci_dev *hdev = conn->hcon->hdev;
3870 struct hci_conn *hcon = conn->hcon;
3871
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003872 if (cmd_len < sizeof(struct l2cap_conn_req))
3873 return -EPROTO;
3874
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303875 hci_dev_lock(hdev);
3876 if (test_bit(HCI_MGMT, &hdev->dev_flags) &&
3877 !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &hcon->flags))
3878 mgmt_device_connected(hdev, &hcon->dst, hcon->type,
3879 hcon->dst_type, 0, NULL, 0,
3880 hcon->dev_class);
3881 hci_dev_unlock(hdev);
3882
Gustavo Padovan300229f2012-10-12 19:40:40 +08003883 l2cap_connect(conn, cmd, data, L2CAP_CONN_RSP, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003884 return 0;
3885}
3886
Mat Martineau5909cf32012-10-23 15:24:08 -07003887static int l2cap_connect_create_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003888 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3889 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003890{
3891 struct l2cap_conn_rsp *rsp = (struct l2cap_conn_rsp *) data;
3892 u16 scid, dcid, result, status;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003893 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003894 u8 req[128];
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003895 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003896
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003897 if (cmd_len < sizeof(*rsp))
3898 return -EPROTO;
3899
Linus Torvalds1da177e2005-04-16 15:20:36 -07003900 scid = __le16_to_cpu(rsp->scid);
3901 dcid = __le16_to_cpu(rsp->dcid);
3902 result = __le16_to_cpu(rsp->result);
3903 status = __le16_to_cpu(rsp->status);
3904
Andrei Emeltchenko1b009c92012-02-21 12:54:54 +02003905 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 +01003906 dcid, scid, result, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003907
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003908 mutex_lock(&conn->chan_lock);
3909
Linus Torvalds1da177e2005-04-16 15:20:36 -07003910 if (scid) {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003911 chan = __l2cap_get_chan_by_scid(conn, scid);
3912 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003913 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003914 goto unlock;
3915 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003916 } else {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003917 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
3918 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003919 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003920 goto unlock;
3921 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003922 }
3923
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003924 err = 0;
3925
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003926 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003927
Linus Torvalds1da177e2005-04-16 15:20:36 -07003928 switch (result) {
3929 case L2CAP_CR_SUCCESS:
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03003930 l2cap_state_change(chan, BT_CONFIG);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003931 chan->ident = 0;
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003932 chan->dcid = dcid;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003933 clear_bit(CONF_CONNECT_PEND, &chan->conf_state);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01003934
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003935 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003936 break;
3937
Linus Torvalds1da177e2005-04-16 15:20:36 -07003938 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003939 l2cap_build_conf_req(chan, req), req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003940 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003941 break;
3942
3943 case L2CAP_CR_PEND:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003944 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003945 break;
3946
3947 default:
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003948 l2cap_chan_del(chan, ECONNREFUSED);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003949 break;
3950 }
3951
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003952 l2cap_chan_unlock(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003953
3954unlock:
3955 mutex_unlock(&conn->chan_lock);
3956
3957 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003958}
3959
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003960static inline void set_default_fcs(struct l2cap_chan *chan)
Mat Martineau8c462b62010-08-24 15:35:42 -07003961{
3962 /* FCS is enabled only in ERTM or streaming mode, if one or both
3963 * sides request it.
3964 */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003965 if (chan->mode != L2CAP_MODE_ERTM && chan->mode != L2CAP_MODE_STREAMING)
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003966 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003967 else if (!test_bit(CONF_RECV_NO_FCS, &chan->conf_state))
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003968 chan->fcs = L2CAP_FCS_CRC16;
Mat Martineau8c462b62010-08-24 15:35:42 -07003969}
3970
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03003971static void l2cap_send_efs_conf_rsp(struct l2cap_chan *chan, void *data,
3972 u8 ident, u16 flags)
3973{
3974 struct l2cap_conn *conn = chan->conn;
3975
3976 BT_DBG("conn %p chan %p ident %d flags 0x%4.4x", conn, chan, ident,
3977 flags);
3978
3979 clear_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
3980 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
3981
3982 l2cap_send_cmd(conn, ident, L2CAP_CONF_RSP,
3983 l2cap_build_conf_rsp(chan, data,
3984 L2CAP_CONF_SUCCESS, flags), data);
3985}
3986
Johan Hedberg662d6522013-10-16 11:20:47 +03003987static void cmd_reject_invalid_cid(struct l2cap_conn *conn, u8 ident,
3988 u16 scid, u16 dcid)
3989{
3990 struct l2cap_cmd_rej_cid rej;
3991
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003992 rej.reason = cpu_to_le16(L2CAP_REJ_INVALID_CID);
Johan Hedberg662d6522013-10-16 11:20:47 +03003993 rej.scid = __cpu_to_le16(scid);
3994 rej.dcid = __cpu_to_le16(dcid);
3995
3996 l2cap_send_cmd(conn, ident, L2CAP_COMMAND_REJ, sizeof(rej), &rej);
3997}
3998
Gustavo Padovan2d792812012-10-06 10:07:01 +01003999static inline int l2cap_config_req(struct l2cap_conn *conn,
4000 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4001 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004002{
4003 struct l2cap_conf_req *req = (struct l2cap_conf_req *) data;
4004 u16 dcid, flags;
4005 u8 rsp[64];
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004006 struct l2cap_chan *chan;
Mat Martineau3c588192012-04-11 10:48:42 -07004007 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004008
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004009 if (cmd_len < sizeof(*req))
4010 return -EPROTO;
4011
Linus Torvalds1da177e2005-04-16 15:20:36 -07004012 dcid = __le16_to_cpu(req->dcid);
4013 flags = __le16_to_cpu(req->flags);
4014
4015 BT_DBG("dcid 0x%4.4x flags 0x%2.2x", dcid, flags);
4016
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004017 chan = l2cap_get_chan_by_scid(conn, dcid);
Johan Hedberg662d6522013-10-16 11:20:47 +03004018 if (!chan) {
4019 cmd_reject_invalid_cid(conn, cmd->ident, dcid, 0);
4020 return 0;
4021 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004022
David S. Miller033b1142011-07-21 13:38:42 -07004023 if (chan->state != BT_CONFIG && chan->state != BT_CONNECT2) {
Johan Hedberg662d6522013-10-16 11:20:47 +03004024 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4025 chan->dcid);
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004026 goto unlock;
Gustavo F. Padovandf6bd742010-06-14 02:26:15 -03004027 }
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004028
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004029 /* Reject if config buffer is too small. */
Al Viro88219a02007-07-29 00:17:25 -07004030 len = cmd_len - sizeof(*req);
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004031 if (chan->conf_len + len > sizeof(chan->conf_req)) {
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004032 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004033 l2cap_build_conf_rsp(chan, rsp,
4034 L2CAP_CONF_REJECT, flags), rsp);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004035 goto unlock;
4036 }
4037
4038 /* Store config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004039 memcpy(chan->conf_req + chan->conf_len, req->data, len);
4040 chan->conf_len += len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004041
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004042 if (flags & L2CAP_CONF_FLAG_CONTINUATION) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004043 /* Incomplete config. Send empty response. */
4044 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004045 l2cap_build_conf_rsp(chan, rsp,
4046 L2CAP_CONF_SUCCESS, flags), rsp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004047 goto unlock;
4048 }
4049
4050 /* Complete config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004051 len = l2cap_parse_conf_req(chan, rsp);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004052 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004053 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004054 goto unlock;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004055 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004056
Mat Martineau1500109b2012-10-23 15:24:15 -07004057 chan->ident = cmd->ident;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004058 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004059 chan->num_conf_rsp++;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004060
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004061 /* Reset config buffer. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004062 chan->conf_len = 0;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004063
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004064 if (!test_bit(CONF_OUTPUT_DONE, &chan->conf_state))
Marcel Holtmann876d9482007-10-20 13:35:42 +02004065 goto unlock;
4066
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004067 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004068 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004069
Mat Martineau105bdf92012-04-27 16:50:48 -07004070 if (chan->mode == L2CAP_MODE_ERTM ||
4071 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004072 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004073
Mat Martineau3c588192012-04-11 10:48:42 -07004074 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004075 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004076 else
4077 l2cap_chan_ready(chan);
4078
Marcel Holtmann876d9482007-10-20 13:35:42 +02004079 goto unlock;
4080 }
4081
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004082 if (!test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02004083 u8 buf[64];
Linus Torvalds1da177e2005-04-16 15:20:36 -07004084 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004085 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004086 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004087 }
4088
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004089 /* Got Conf Rsp PENDING from remote side and asume we sent
4090 Conf Rsp PENDING in the code above */
4091 if (test_bit(CONF_REM_CONF_PEND, &chan->conf_state) &&
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03004092 test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004093
4094 /* check compatibility */
4095
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004096 /* Send rsp for BR/EDR channel */
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004097 if (!chan->hs_hcon)
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004098 l2cap_send_efs_conf_rsp(chan, rsp, cmd->ident, flags);
4099 else
4100 chan->ident = cmd->ident;
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004101 }
4102
Linus Torvalds1da177e2005-04-16 15:20:36 -07004103unlock:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004104 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004105 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004106}
4107
Gustavo Padovan2d792812012-10-06 10:07:01 +01004108static inline int l2cap_config_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004109 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4110 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004111{
4112 struct l2cap_conf_rsp *rsp = (struct l2cap_conf_rsp *)data;
4113 u16 scid, flags, result;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004114 struct l2cap_chan *chan;
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004115 int len = cmd_len - sizeof(*rsp);
Mat Martineau3c588192012-04-11 10:48:42 -07004116 int err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004117
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004118 if (cmd_len < sizeof(*rsp))
4119 return -EPROTO;
4120
Linus Torvalds1da177e2005-04-16 15:20:36 -07004121 scid = __le16_to_cpu(rsp->scid);
4122 flags = __le16_to_cpu(rsp->flags);
4123 result = __le16_to_cpu(rsp->result);
4124
Andrei Emeltchenko61386cb2012-03-12 12:13:07 +02004125 BT_DBG("scid 0x%4.4x flags 0x%2.2x result 0x%2.2x len %d", scid, flags,
4126 result, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004127
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004128 chan = l2cap_get_chan_by_scid(conn, scid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004129 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004130 return 0;
4131
4132 switch (result) {
4133 case L2CAP_CONF_SUCCESS:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004134 l2cap_conf_rfc_get(chan, rsp->data, len);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004135 clear_bit(CONF_REM_CONF_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004136 break;
4137
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004138 case L2CAP_CONF_PENDING:
4139 set_bit(CONF_REM_CONF_PEND, &chan->conf_state);
4140
4141 if (test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
4142 char buf[64];
4143
4144 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004145 buf, &result);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004146 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004147 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004148 goto done;
4149 }
4150
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004151 if (!chan->hs_hcon) {
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004152 l2cap_send_efs_conf_rsp(chan, buf, cmd->ident,
4153 0);
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02004154 } else {
4155 if (l2cap_check_efs(chan)) {
4156 amp_create_logical_link(chan);
4157 chan->ident = cmd->ident;
4158 }
4159 }
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004160 }
4161 goto done;
4162
Linus Torvalds1da177e2005-04-16 15:20:36 -07004163 case L2CAP_CONF_UNACCEPT:
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004164 if (chan->num_conf_rsp <= L2CAP_CONF_MAX_CONF_RSP) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004165 char req[64];
4166
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004167 if (len > sizeof(req) - sizeof(struct l2cap_conf_req)) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004168 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004169 goto done;
4170 }
4171
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004172 /* throw out any old stored conf requests */
4173 result = L2CAP_CONF_SUCCESS;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03004174 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004175 req, &result);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004176 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004177 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004178 goto done;
4179 }
4180
4181 l2cap_send_cmd(conn, l2cap_get_ident(conn),
Gustavo Padovan2d792812012-10-06 10:07:01 +01004182 L2CAP_CONF_REQ, len, req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004183 chan->num_conf_req++;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004184 if (result != L2CAP_CONF_SUCCESS)
4185 goto done;
4186 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004187 }
4188
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09004189 default:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004190 l2cap_chan_set_err(chan, ECONNRESET);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +02004191
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08004192 __set_chan_timer(chan, L2CAP_DISC_REJ_TIMEOUT);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004193 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004194 goto done;
4195 }
4196
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004197 if (flags & L2CAP_CONF_FLAG_CONTINUATION)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004198 goto done;
4199
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004200 set_bit(CONF_INPUT_DONE, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004201
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004202 if (test_bit(CONF_OUTPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004203 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004204
Mat Martineau105bdf92012-04-27 16:50:48 -07004205 if (chan->mode == L2CAP_MODE_ERTM ||
4206 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004207 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004208
Mat Martineau3c588192012-04-11 10:48:42 -07004209 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004210 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004211 else
4212 l2cap_chan_ready(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004213 }
4214
4215done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004216 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004217 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004218}
4219
Gustavo Padovan2d792812012-10-06 10:07:01 +01004220static inline int l2cap_disconnect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004221 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4222 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004223{
4224 struct l2cap_disconn_req *req = (struct l2cap_disconn_req *) data;
4225 struct l2cap_disconn_rsp rsp;
4226 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004227 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004228
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004229 if (cmd_len != sizeof(*req))
4230 return -EPROTO;
4231
Linus Torvalds1da177e2005-04-16 15:20:36 -07004232 scid = __le16_to_cpu(req->scid);
4233 dcid = __le16_to_cpu(req->dcid);
4234
4235 BT_DBG("scid 0x%4.4x dcid 0x%4.4x", scid, dcid);
4236
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004237 mutex_lock(&conn->chan_lock);
4238
4239 chan = __l2cap_get_chan_by_scid(conn, dcid);
4240 if (!chan) {
4241 mutex_unlock(&conn->chan_lock);
Johan Hedberg662d6522013-10-16 11:20:47 +03004242 cmd_reject_invalid_cid(conn, cmd->ident, dcid, scid);
4243 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004244 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004245
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004246 l2cap_chan_lock(chan);
4247
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03004248 rsp.dcid = cpu_to_le16(chan->scid);
4249 rsp.scid = cpu_to_le16(chan->dcid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004250 l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp);
4251
Gustavo Padovan5ec1bbe2013-10-15 19:24:48 -03004252 chan->ops->set_shutdown(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004253
Mat Martineau61d6ef32012-04-27 16:50:50 -07004254 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004255 l2cap_chan_del(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004256
4257 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004258
Gustavo Padovan80b98022012-05-27 22:27:51 -03004259 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004260 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004261
4262 mutex_unlock(&conn->chan_lock);
4263
Linus Torvalds1da177e2005-04-16 15:20:36 -07004264 return 0;
4265}
4266
Gustavo Padovan2d792812012-10-06 10:07:01 +01004267static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004268 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4269 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004270{
4271 struct l2cap_disconn_rsp *rsp = (struct l2cap_disconn_rsp *) data;
4272 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004273 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004274
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004275 if (cmd_len != sizeof(*rsp))
4276 return -EPROTO;
4277
Linus Torvalds1da177e2005-04-16 15:20:36 -07004278 scid = __le16_to_cpu(rsp->scid);
4279 dcid = __le16_to_cpu(rsp->dcid);
4280
4281 BT_DBG("dcid 0x%4.4x scid 0x%4.4x", dcid, scid);
4282
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004283 mutex_lock(&conn->chan_lock);
4284
4285 chan = __l2cap_get_chan_by_scid(conn, scid);
4286 if (!chan) {
4287 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004288 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004289 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004290
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004291 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004292
Mat Martineau61d6ef32012-04-27 16:50:50 -07004293 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004294 l2cap_chan_del(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004295
4296 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004297
Gustavo Padovan80b98022012-05-27 22:27:51 -03004298 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004299 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004300
4301 mutex_unlock(&conn->chan_lock);
4302
Linus Torvalds1da177e2005-04-16 15:20:36 -07004303 return 0;
4304}
4305
Gustavo Padovan2d792812012-10-06 10:07:01 +01004306static inline int l2cap_information_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004307 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4308 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004309{
4310 struct l2cap_info_req *req = (struct l2cap_info_req *) data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004311 u16 type;
4312
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004313 if (cmd_len != sizeof(*req))
4314 return -EPROTO;
4315
Linus Torvalds1da177e2005-04-16 15:20:36 -07004316 type = __le16_to_cpu(req->type);
4317
4318 BT_DBG("type 0x%4.4x", type);
4319
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004320 if (type == L2CAP_IT_FEAT_MASK) {
4321 u8 buf[8];
Marcel Holtmann44dd46d2009-05-02 19:09:01 -07004322 u32 feat_mask = l2cap_feat_mask;
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004323 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004324 rsp->type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
4325 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03004326 if (!disable_ertm)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004327 feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING
Gustavo Padovan2d792812012-10-06 10:07:01 +01004328 | L2CAP_FEAT_FCS;
Marcel Holtmann848566b2013-10-01 22:59:22 -07004329 if (conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03004330 feat_mask |= L2CAP_FEAT_EXT_FLOW
Gustavo Padovan2d792812012-10-06 10:07:01 +01004331 | L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenkoa5fd6f32011-09-16 16:26:32 +03004332
Gustavo F. Padovan1b7bf4e2009-08-24 00:45:20 -03004333 put_unaligned_le32(feat_mask, rsp->data);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004334 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4335 buf);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004336 } else if (type == L2CAP_IT_FIXED_CHAN) {
4337 u8 buf[12];
4338 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Mat Martineau50a147c2011-11-02 16:18:34 -07004339
Marcel Holtmann848566b2013-10-01 22:59:22 -07004340 if (conn->hs_enabled)
Mat Martineau50a147c2011-11-02 16:18:34 -07004341 l2cap_fixed_chan[0] |= L2CAP_FC_A2MP;
4342 else
4343 l2cap_fixed_chan[0] &= ~L2CAP_FC_A2MP;
4344
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004345 rsp->type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
4346 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Andrei Emeltchenkoc6337ea2011-10-20 17:02:44 +03004347 memcpy(rsp->data, l2cap_fixed_chan, sizeof(l2cap_fixed_chan));
Gustavo Padovan2d792812012-10-06 10:07:01 +01004348 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4349 buf);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004350 } else {
4351 struct l2cap_info_rsp rsp;
4352 rsp.type = cpu_to_le16(type);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004353 rsp.result = cpu_to_le16(L2CAP_IR_NOTSUPP);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004354 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(rsp),
4355 &rsp);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004356 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004357
4358 return 0;
4359}
4360
Gustavo Padovan2d792812012-10-06 10:07:01 +01004361static inline int l2cap_information_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004362 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4363 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004364{
4365 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) data;
4366 u16 type, result;
4367
Jaganath Kanakkassery3f6fa3d2013-06-21 19:55:11 +05304368 if (cmd_len < sizeof(*rsp))
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004369 return -EPROTO;
4370
Linus Torvalds1da177e2005-04-16 15:20:36 -07004371 type = __le16_to_cpu(rsp->type);
4372 result = __le16_to_cpu(rsp->result);
4373
4374 BT_DBG("type 0x%4.4x result 0x%2.2x", type, result);
4375
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004376 /* L2CAP Info req/rsp are unbound to channels, add extra checks */
4377 if (cmd->ident != conn->info_ident ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01004378 conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004379 return 0;
4380
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02004381 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004382
Ville Tervoadb08ed2010-08-04 09:43:33 +03004383 if (result != L2CAP_IR_SUCCESS) {
4384 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4385 conn->info_ident = 0;
4386
4387 l2cap_conn_start(conn);
4388
4389 return 0;
4390 }
4391
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004392 switch (type) {
4393 case L2CAP_IT_FEAT_MASK:
Harvey Harrison83985312008-05-02 16:25:46 -07004394 conn->feat_mask = get_unaligned_le32(rsp->data);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004395
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07004396 if (conn->feat_mask & L2CAP_FEAT_FIXED_CHAN) {
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004397 struct l2cap_info_req req;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004398 req.type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004399
4400 conn->info_ident = l2cap_get_ident(conn);
4401
4402 l2cap_send_cmd(conn, conn->info_ident,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004403 L2CAP_INFO_REQ, sizeof(req), &req);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004404 } else {
4405 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4406 conn->info_ident = 0;
4407
4408 l2cap_conn_start(conn);
4409 }
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004410 break;
4411
4412 case L2CAP_IT_FIXED_CHAN:
4413 conn->fixed_chan_mask = rsp->data[0];
Marcel Holtmann984947d2009-02-06 23:35:19 +01004414 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004415 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004416
4417 l2cap_conn_start(conn);
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004418 break;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004419 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004420
Linus Torvalds1da177e2005-04-16 15:20:36 -07004421 return 0;
4422}
4423
Mat Martineau17009152012-10-23 15:24:07 -07004424static int l2cap_create_channel_req(struct l2cap_conn *conn,
4425 struct l2cap_cmd_hdr *cmd,
4426 u16 cmd_len, void *data)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004427{
4428 struct l2cap_create_chan_req *req = data;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004429 struct l2cap_create_chan_rsp rsp;
Mat Martineau17009152012-10-23 15:24:07 -07004430 struct l2cap_chan *chan;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004431 struct hci_dev *hdev;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004432 u16 psm, scid;
4433
4434 if (cmd_len != sizeof(*req))
4435 return -EPROTO;
4436
Marcel Holtmann848566b2013-10-01 22:59:22 -07004437 if (!conn->hs_enabled)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004438 return -EINVAL;
4439
4440 psm = le16_to_cpu(req->psm);
4441 scid = le16_to_cpu(req->scid);
4442
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004443 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 -07004444
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004445 /* For controller id 0 make BR/EDR connection */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004446 if (req->amp_id == AMP_ID_BREDR) {
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004447 l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4448 req->amp_id);
4449 return 0;
4450 }
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004451
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004452 /* Validate AMP controller id */
4453 hdev = hci_dev_get(req->amp_id);
4454 if (!hdev)
4455 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004456
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004457 if (hdev->dev_type != HCI_AMP || !test_bit(HCI_UP, &hdev->flags)) {
Mat Martineau17009152012-10-23 15:24:07 -07004458 hci_dev_put(hdev);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004459 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004460 }
4461
4462 chan = l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4463 req->amp_id);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004464 if (chan) {
4465 struct amp_mgr *mgr = conn->hcon->amp_mgr;
4466 struct hci_conn *hs_hcon;
4467
Marcel Holtmann98e0f7e2013-10-13 02:23:40 -07004468 hs_hcon = hci_conn_hash_lookup_ba(hdev, AMP_LINK,
4469 &conn->hcon->dst);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004470 if (!hs_hcon) {
4471 hci_dev_put(hdev);
Johan Hedberg662d6522013-10-16 11:20:47 +03004472 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4473 chan->dcid);
4474 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004475 }
4476
4477 BT_DBG("mgr %p bredr_chan %p hs_hcon %p", mgr, chan, hs_hcon);
4478
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004479 mgr->bredr_chan = chan;
4480 chan->hs_hcon = hs_hcon;
Andrei Emeltchenkofd45bf42012-11-20 17:16:22 +02004481 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004482 conn->mtu = hdev->block_mtu;
4483 }
4484
4485 hci_dev_put(hdev);
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004486
4487 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004488
4489error:
4490 rsp.dcid = 0;
4491 rsp.scid = cpu_to_le16(scid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004492 rsp.result = cpu_to_le16(L2CAP_CR_BAD_AMP);
4493 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004494
4495 l2cap_send_cmd(conn, cmd->ident, L2CAP_CREATE_CHAN_RSP,
4496 sizeof(rsp), &rsp);
4497
Johan Hedbergdc280802013-09-16 13:05:13 +03004498 return 0;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004499}
4500
Mat Martineau8eb200b2012-10-23 15:24:17 -07004501static void l2cap_send_move_chan_req(struct l2cap_chan *chan, u8 dest_amp_id)
4502{
4503 struct l2cap_move_chan_req req;
4504 u8 ident;
4505
4506 BT_DBG("chan %p, dest_amp_id %d", chan, dest_amp_id);
4507
4508 ident = l2cap_get_ident(chan->conn);
4509 chan->ident = ident;
4510
4511 req.icid = cpu_to_le16(chan->scid);
4512 req.dest_amp_id = dest_amp_id;
4513
4514 l2cap_send_cmd(chan->conn, ident, L2CAP_MOVE_CHAN_REQ, sizeof(req),
4515 &req);
4516
4517 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4518}
4519
Mat Martineau1500109b2012-10-23 15:24:15 -07004520static void l2cap_send_move_chan_rsp(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004521{
4522 struct l2cap_move_chan_rsp rsp;
4523
Mat Martineau1500109b2012-10-23 15:24:15 -07004524 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004525
Mat Martineau1500109b2012-10-23 15:24:15 -07004526 rsp.icid = cpu_to_le16(chan->dcid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004527 rsp.result = cpu_to_le16(result);
4528
Mat Martineau1500109b2012-10-23 15:24:15 -07004529 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_RSP,
4530 sizeof(rsp), &rsp);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004531}
4532
Mat Martineau5b155ef2012-10-23 15:24:14 -07004533static void l2cap_send_move_chan_cfm(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004534{
4535 struct l2cap_move_chan_cfm cfm;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004536
Mat Martineau5b155ef2012-10-23 15:24:14 -07004537 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004538
Mat Martineau5b155ef2012-10-23 15:24:14 -07004539 chan->ident = l2cap_get_ident(chan->conn);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004540
Mat Martineau5b155ef2012-10-23 15:24:14 -07004541 cfm.icid = cpu_to_le16(chan->scid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004542 cfm.result = cpu_to_le16(result);
4543
Mat Martineau5b155ef2012-10-23 15:24:14 -07004544 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_CFM,
4545 sizeof(cfm), &cfm);
4546
4547 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4548}
4549
4550static void l2cap_send_move_chan_cfm_icid(struct l2cap_conn *conn, u16 icid)
4551{
4552 struct l2cap_move_chan_cfm cfm;
4553
4554 BT_DBG("conn %p, icid 0x%4.4x", conn, icid);
4555
4556 cfm.icid = cpu_to_le16(icid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004557 cfm.result = cpu_to_le16(L2CAP_MC_UNCONFIRMED);
Mat Martineau5b155ef2012-10-23 15:24:14 -07004558
4559 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_MOVE_CHAN_CFM,
4560 sizeof(cfm), &cfm);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004561}
4562
4563static void l2cap_send_move_chan_cfm_rsp(struct l2cap_conn *conn, u8 ident,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004564 u16 icid)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004565{
4566 struct l2cap_move_chan_cfm_rsp rsp;
4567
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004568 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004569
4570 rsp.icid = cpu_to_le16(icid);
4571 l2cap_send_cmd(conn, ident, L2CAP_MOVE_CHAN_CFM_RSP, sizeof(rsp), &rsp);
4572}
4573
Mat Martineau5f3847a2012-10-23 15:24:12 -07004574static void __release_logical_link(struct l2cap_chan *chan)
4575{
4576 chan->hs_hchan = NULL;
4577 chan->hs_hcon = NULL;
4578
4579 /* Placeholder - release the logical link */
4580}
4581
Mat Martineau1500109b2012-10-23 15:24:15 -07004582static void l2cap_logical_fail(struct l2cap_chan *chan)
4583{
4584 /* Logical link setup failed */
4585 if (chan->state != BT_CONNECTED) {
4586 /* Create channel failure, disconnect */
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004587 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineau1500109b2012-10-23 15:24:15 -07004588 return;
4589 }
4590
4591 switch (chan->move_role) {
4592 case L2CAP_MOVE_ROLE_RESPONDER:
4593 l2cap_move_done(chan);
4594 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_SUPP);
4595 break;
4596 case L2CAP_MOVE_ROLE_INITIATOR:
4597 if (chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_COMP ||
4598 chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_CFM) {
4599 /* Remote has only sent pending or
4600 * success responses, clean up
4601 */
4602 l2cap_move_done(chan);
4603 }
4604
4605 /* Other amp move states imply that the move
4606 * has already aborted
4607 */
4608 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
4609 break;
4610 }
4611}
4612
4613static void l2cap_logical_finish_create(struct l2cap_chan *chan,
4614 struct hci_chan *hchan)
4615{
4616 struct l2cap_conf_rsp rsp;
Mat Martineau1500109b2012-10-23 15:24:15 -07004617
Andrei Emeltchenko336178a2012-10-31 15:46:27 +02004618 chan->hs_hchan = hchan;
Mat Martineau1500109b2012-10-23 15:24:15 -07004619 chan->hs_hcon->l2cap_data = chan->conn;
4620
Andrei Emeltchenko35ba9562012-10-25 15:20:43 +03004621 l2cap_send_efs_conf_rsp(chan, &rsp, chan->ident, 0);
Mat Martineau1500109b2012-10-23 15:24:15 -07004622
4623 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Andrei Emeltchenkofe79c6f2012-10-25 15:20:42 +03004624 int err;
Mat Martineau1500109b2012-10-23 15:24:15 -07004625
4626 set_default_fcs(chan);
4627
4628 err = l2cap_ertm_init(chan);
4629 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004630 l2cap_send_disconn_req(chan, -err);
Mat Martineau1500109b2012-10-23 15:24:15 -07004631 else
4632 l2cap_chan_ready(chan);
4633 }
4634}
4635
4636static void l2cap_logical_finish_move(struct l2cap_chan *chan,
4637 struct hci_chan *hchan)
4638{
4639 chan->hs_hcon = hchan->conn;
4640 chan->hs_hcon->l2cap_data = chan->conn;
4641
4642 BT_DBG("move_state %d", chan->move_state);
4643
4644 switch (chan->move_state) {
4645 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
4646 /* Move confirm will be sent after a success
4647 * response is received
4648 */
4649 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4650 break;
4651 case L2CAP_MOVE_WAIT_LOGICAL_CFM:
4652 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4653 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4654 } else if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
4655 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
4656 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
4657 } else if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4658 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4659 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4660 }
4661 break;
4662 default:
4663 /* Move was not in expected state, free the channel */
4664 __release_logical_link(chan);
4665
4666 chan->move_state = L2CAP_MOVE_STABLE;
4667 }
4668}
4669
4670/* Call with chan locked */
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004671void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan,
4672 u8 status)
Mat Martineau5b155ef2012-10-23 15:24:14 -07004673{
Mat Martineau1500109b2012-10-23 15:24:15 -07004674 BT_DBG("chan %p, hchan %p, status %d", chan, hchan, status);
4675
4676 if (status) {
4677 l2cap_logical_fail(chan);
4678 __release_logical_link(chan);
4679 return;
4680 }
4681
4682 if (chan->state != BT_CONNECTED) {
4683 /* Ignore logical link if channel is on BR/EDR */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004684 if (chan->local_amp_id != AMP_ID_BREDR)
Mat Martineau1500109b2012-10-23 15:24:15 -07004685 l2cap_logical_finish_create(chan, hchan);
4686 } else {
4687 l2cap_logical_finish_move(chan, hchan);
4688 }
Mat Martineau5b155ef2012-10-23 15:24:14 -07004689}
4690
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004691void l2cap_move_start(struct l2cap_chan *chan)
4692{
4693 BT_DBG("chan %p", chan);
4694
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004695 if (chan->local_amp_id == AMP_ID_BREDR) {
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004696 if (chan->chan_policy != BT_CHANNEL_POLICY_AMP_PREFERRED)
4697 return;
4698 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4699 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4700 /* Placeholder - start physical link setup */
4701 } else {
4702 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4703 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4704 chan->move_id = 0;
4705 l2cap_move_setup(chan);
4706 l2cap_send_move_chan_req(chan, 0);
4707 }
4708}
4709
Mat Martineau8eb200b2012-10-23 15:24:17 -07004710static void l2cap_do_create(struct l2cap_chan *chan, int result,
4711 u8 local_amp_id, u8 remote_amp_id)
4712{
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004713 BT_DBG("chan %p state %s %u -> %u", chan, state_to_string(chan->state),
4714 local_amp_id, remote_amp_id);
4715
Andrei Emeltchenko12d6cc62012-11-14 17:39:31 +02004716 chan->fcs = L2CAP_FCS_NONE;
4717
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004718 /* Outgoing channel on AMP */
4719 if (chan->state == BT_CONNECT) {
4720 if (result == L2CAP_CR_SUCCESS) {
4721 chan->local_amp_id = local_amp_id;
4722 l2cap_send_create_chan_req(chan, remote_amp_id);
4723 } else {
4724 /* Revert to BR/EDR connect */
4725 l2cap_send_conn_req(chan);
4726 }
4727
4728 return;
4729 }
4730
4731 /* Incoming channel on AMP */
4732 if (__l2cap_no_conn_pending(chan)) {
Mat Martineau8eb200b2012-10-23 15:24:17 -07004733 struct l2cap_conn_rsp rsp;
4734 char buf[128];
4735 rsp.scid = cpu_to_le16(chan->dcid);
4736 rsp.dcid = cpu_to_le16(chan->scid);
4737
Mat Martineau8eb200b2012-10-23 15:24:17 -07004738 if (result == L2CAP_CR_SUCCESS) {
4739 /* Send successful response */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004740 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
4741 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004742 } else {
4743 /* Send negative response */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004744 rsp.result = cpu_to_le16(L2CAP_CR_NO_MEM);
4745 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004746 }
4747
4748 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_RSP,
4749 sizeof(rsp), &rsp);
4750
4751 if (result == L2CAP_CR_SUCCESS) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02004752 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004753 set_bit(CONF_REQ_SENT, &chan->conf_state);
4754 l2cap_send_cmd(chan->conn, l2cap_get_ident(chan->conn),
4755 L2CAP_CONF_REQ,
4756 l2cap_build_conf_req(chan, buf), buf);
4757 chan->num_conf_req++;
4758 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004759 }
4760}
4761
4762static void l2cap_do_move_initiate(struct l2cap_chan *chan, u8 local_amp_id,
4763 u8 remote_amp_id)
4764{
4765 l2cap_move_setup(chan);
4766 chan->move_id = local_amp_id;
4767 chan->move_state = L2CAP_MOVE_WAIT_RSP;
4768
4769 l2cap_send_move_chan_req(chan, remote_amp_id);
4770}
4771
4772static void l2cap_do_move_respond(struct l2cap_chan *chan, int result)
4773{
4774 struct hci_chan *hchan = NULL;
4775
4776 /* Placeholder - get hci_chan for logical link */
4777
4778 if (hchan) {
4779 if (hchan->state == BT_CONNECTED) {
4780 /* Logical link is ready to go */
4781 chan->hs_hcon = hchan->conn;
4782 chan->hs_hcon->l2cap_data = chan->conn;
4783 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4784 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4785
4786 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
4787 } else {
4788 /* Wait for logical link to be ready */
4789 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4790 }
4791 } else {
4792 /* Logical link not available */
4793 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_ALLOWED);
4794 }
4795}
4796
4797static void l2cap_do_move_cancel(struct l2cap_chan *chan, int result)
4798{
4799 if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4800 u8 rsp_result;
4801 if (result == -EINVAL)
4802 rsp_result = L2CAP_MR_BAD_ID;
4803 else
4804 rsp_result = L2CAP_MR_NOT_ALLOWED;
4805
4806 l2cap_send_move_chan_rsp(chan, rsp_result);
4807 }
4808
4809 chan->move_role = L2CAP_MOVE_ROLE_NONE;
4810 chan->move_state = L2CAP_MOVE_STABLE;
4811
4812 /* Restart data transmission */
4813 l2cap_ertm_send(chan);
4814}
4815
Andrei Emeltchenkoa514b172012-11-14 17:39:30 +02004816/* Invoke with locked chan */
4817void __l2cap_physical_cfm(struct l2cap_chan *chan, int result)
Mat Martineau8eb200b2012-10-23 15:24:17 -07004818{
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004819 u8 local_amp_id = chan->local_amp_id;
Andrei Emeltchenkofffadc02012-11-01 15:37:03 +02004820 u8 remote_amp_id = chan->remote_amp_id;
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004821
Mat Martineau8eb200b2012-10-23 15:24:17 -07004822 BT_DBG("chan %p, result %d, local_amp_id %d, remote_amp_id %d",
4823 chan, result, local_amp_id, remote_amp_id);
4824
Mat Martineau8eb200b2012-10-23 15:24:17 -07004825 if (chan->state == BT_DISCONN || chan->state == BT_CLOSED) {
4826 l2cap_chan_unlock(chan);
4827 return;
4828 }
4829
4830 if (chan->state != BT_CONNECTED) {
4831 l2cap_do_create(chan, result, local_amp_id, remote_amp_id);
4832 } else if (result != L2CAP_MR_SUCCESS) {
4833 l2cap_do_move_cancel(chan, result);
4834 } else {
4835 switch (chan->move_role) {
4836 case L2CAP_MOVE_ROLE_INITIATOR:
4837 l2cap_do_move_initiate(chan, local_amp_id,
4838 remote_amp_id);
4839 break;
4840 case L2CAP_MOVE_ROLE_RESPONDER:
4841 l2cap_do_move_respond(chan, result);
4842 break;
4843 default:
4844 l2cap_do_move_cancel(chan, result);
4845 break;
4846 }
4847 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004848}
4849
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004850static inline int l2cap_move_channel_req(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004851 struct l2cap_cmd_hdr *cmd,
4852 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004853{
4854 struct l2cap_move_chan_req *req = data;
Mat Martineau1500109b2012-10-23 15:24:15 -07004855 struct l2cap_move_chan_rsp rsp;
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004856 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004857 u16 icid = 0;
4858 u16 result = L2CAP_MR_NOT_ALLOWED;
4859
4860 if (cmd_len != sizeof(*req))
4861 return -EPROTO;
4862
4863 icid = le16_to_cpu(req->icid);
4864
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004865 BT_DBG("icid 0x%4.4x, dest_amp_id %d", icid, req->dest_amp_id);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004866
Marcel Holtmann848566b2013-10-01 22:59:22 -07004867 if (!conn->hs_enabled)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004868 return -EINVAL;
4869
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004870 chan = l2cap_get_chan_by_dcid(conn, icid);
4871 if (!chan) {
Mat Martineau1500109b2012-10-23 15:24:15 -07004872 rsp.icid = cpu_to_le16(icid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004873 rsp.result = cpu_to_le16(L2CAP_MR_NOT_ALLOWED);
Mat Martineau1500109b2012-10-23 15:24:15 -07004874 l2cap_send_cmd(conn, cmd->ident, L2CAP_MOVE_CHAN_RSP,
4875 sizeof(rsp), &rsp);
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004876 return 0;
4877 }
4878
Mat Martineau1500109b2012-10-23 15:24:15 -07004879 chan->ident = cmd->ident;
4880
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004881 if (chan->scid < L2CAP_CID_DYN_START ||
4882 chan->chan_policy == BT_CHANNEL_POLICY_BREDR_ONLY ||
4883 (chan->mode != L2CAP_MODE_ERTM &&
4884 chan->mode != L2CAP_MODE_STREAMING)) {
4885 result = L2CAP_MR_NOT_ALLOWED;
4886 goto send_move_response;
4887 }
4888
4889 if (chan->local_amp_id == req->dest_amp_id) {
4890 result = L2CAP_MR_SAME_ID;
4891 goto send_move_response;
4892 }
4893
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004894 if (req->dest_amp_id != AMP_ID_BREDR) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004895 struct hci_dev *hdev;
4896 hdev = hci_dev_get(req->dest_amp_id);
4897 if (!hdev || hdev->dev_type != HCI_AMP ||
4898 !test_bit(HCI_UP, &hdev->flags)) {
4899 if (hdev)
4900 hci_dev_put(hdev);
4901
4902 result = L2CAP_MR_BAD_ID;
4903 goto send_move_response;
4904 }
4905 hci_dev_put(hdev);
4906 }
4907
4908 /* Detect a move collision. Only send a collision response
4909 * if this side has "lost", otherwise proceed with the move.
4910 * The winner has the larger bd_addr.
4911 */
4912 if ((__chan_is_moving(chan) ||
4913 chan->move_role != L2CAP_MOVE_ROLE_NONE) &&
Marcel Holtmann6f59b902013-10-13 05:24:01 -07004914 bacmp(&conn->hcon->src, &conn->hcon->dst) > 0) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004915 result = L2CAP_MR_COLLISION;
4916 goto send_move_response;
4917 }
4918
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004919 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
4920 l2cap_move_setup(chan);
4921 chan->move_id = req->dest_amp_id;
4922 icid = chan->dcid;
4923
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004924 if (req->dest_amp_id == AMP_ID_BREDR) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004925 /* Moving to BR/EDR */
4926 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4927 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4928 result = L2CAP_MR_PEND;
4929 } else {
4930 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4931 result = L2CAP_MR_SUCCESS;
4932 }
4933 } else {
4934 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4935 /* Placeholder - uncomment when amp functions are available */
4936 /*amp_accept_physical(chan, req->dest_amp_id);*/
4937 result = L2CAP_MR_PEND;
4938 }
4939
4940send_move_response:
Mat Martineau1500109b2012-10-23 15:24:15 -07004941 l2cap_send_move_chan_rsp(chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004942
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004943 l2cap_chan_unlock(chan);
4944
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004945 return 0;
4946}
4947
Mat Martineau5b155ef2012-10-23 15:24:14 -07004948static void l2cap_move_continue(struct l2cap_conn *conn, u16 icid, u16 result)
4949{
4950 struct l2cap_chan *chan;
4951 struct hci_chan *hchan = NULL;
4952
4953 chan = l2cap_get_chan_by_scid(conn, icid);
4954 if (!chan) {
4955 l2cap_send_move_chan_cfm_icid(conn, icid);
4956 return;
4957 }
4958
4959 __clear_chan_timer(chan);
4960 if (result == L2CAP_MR_PEND)
4961 __set_chan_timer(chan, L2CAP_MOVE_ERTX_TIMEOUT);
4962
4963 switch (chan->move_state) {
4964 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
4965 /* Move confirm will be sent when logical link
4966 * is complete.
4967 */
4968 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4969 break;
4970 case L2CAP_MOVE_WAIT_RSP_SUCCESS:
4971 if (result == L2CAP_MR_PEND) {
4972 break;
4973 } else if (test_bit(CONN_LOCAL_BUSY,
4974 &chan->conn_state)) {
4975 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4976 } else {
4977 /* Logical link is up or moving to BR/EDR,
4978 * proceed with move
4979 */
4980 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
4981 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
4982 }
4983 break;
4984 case L2CAP_MOVE_WAIT_RSP:
4985 /* Moving to AMP */
4986 if (result == L2CAP_MR_SUCCESS) {
4987 /* Remote is ready, send confirm immediately
4988 * after logical link is ready
4989 */
4990 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4991 } else {
4992 /* Both logical link and move success
4993 * are required to confirm
4994 */
4995 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_COMP;
4996 }
4997
4998 /* Placeholder - get hci_chan for logical link */
4999 if (!hchan) {
5000 /* Logical link not available */
5001 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5002 break;
5003 }
5004
5005 /* If the logical link is not yet connected, do not
5006 * send confirmation.
5007 */
5008 if (hchan->state != BT_CONNECTED)
5009 break;
5010
5011 /* Logical link is already ready to go */
5012
5013 chan->hs_hcon = hchan->conn;
5014 chan->hs_hcon->l2cap_data = chan->conn;
5015
5016 if (result == L2CAP_MR_SUCCESS) {
5017 /* Can confirm now */
5018 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
5019 } else {
5020 /* Now only need move success
5021 * to confirm
5022 */
5023 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
5024 }
5025
5026 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
5027 break;
5028 default:
5029 /* Any other amp move state means the move failed. */
5030 chan->move_id = chan->local_amp_id;
5031 l2cap_move_done(chan);
5032 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5033 }
5034
5035 l2cap_chan_unlock(chan);
5036}
5037
5038static void l2cap_move_fail(struct l2cap_conn *conn, u8 ident, u16 icid,
5039 u16 result)
5040{
5041 struct l2cap_chan *chan;
5042
5043 chan = l2cap_get_chan_by_ident(conn, ident);
5044 if (!chan) {
5045 /* Could not locate channel, icid is best guess */
5046 l2cap_send_move_chan_cfm_icid(conn, icid);
5047 return;
5048 }
5049
5050 __clear_chan_timer(chan);
5051
5052 if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
5053 if (result == L2CAP_MR_COLLISION) {
5054 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
5055 } else {
5056 /* Cleanup - cancel move */
5057 chan->move_id = chan->local_amp_id;
5058 l2cap_move_done(chan);
5059 }
5060 }
5061
5062 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5063
5064 l2cap_chan_unlock(chan);
5065}
5066
5067static int l2cap_move_channel_rsp(struct l2cap_conn *conn,
5068 struct l2cap_cmd_hdr *cmd,
5069 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005070{
5071 struct l2cap_move_chan_rsp *rsp = data;
5072 u16 icid, result;
5073
5074 if (cmd_len != sizeof(*rsp))
5075 return -EPROTO;
5076
5077 icid = le16_to_cpu(rsp->icid);
5078 result = le16_to_cpu(rsp->result);
5079
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005080 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005081
Mat Martineau5b155ef2012-10-23 15:24:14 -07005082 if (result == L2CAP_MR_SUCCESS || result == L2CAP_MR_PEND)
5083 l2cap_move_continue(conn, icid, result);
5084 else
5085 l2cap_move_fail(conn, cmd->ident, icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005086
5087 return 0;
5088}
5089
Mat Martineau5f3847a2012-10-23 15:24:12 -07005090static int l2cap_move_channel_confirm(struct l2cap_conn *conn,
5091 struct l2cap_cmd_hdr *cmd,
5092 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005093{
5094 struct l2cap_move_chan_cfm *cfm = data;
Mat Martineau5f3847a2012-10-23 15:24:12 -07005095 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005096 u16 icid, result;
5097
5098 if (cmd_len != sizeof(*cfm))
5099 return -EPROTO;
5100
5101 icid = le16_to_cpu(cfm->icid);
5102 result = le16_to_cpu(cfm->result);
5103
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005104 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005105
Mat Martineau5f3847a2012-10-23 15:24:12 -07005106 chan = l2cap_get_chan_by_dcid(conn, icid);
5107 if (!chan) {
5108 /* Spec requires a response even if the icid was not found */
5109 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5110 return 0;
5111 }
5112
5113 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM) {
5114 if (result == L2CAP_MC_CONFIRMED) {
5115 chan->local_amp_id = chan->move_id;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005116 if (chan->local_amp_id == AMP_ID_BREDR)
Mat Martineau5f3847a2012-10-23 15:24:12 -07005117 __release_logical_link(chan);
5118 } else {
5119 chan->move_id = chan->local_amp_id;
5120 }
5121
5122 l2cap_move_done(chan);
5123 }
5124
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005125 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5126
Mat Martineau5f3847a2012-10-23 15:24:12 -07005127 l2cap_chan_unlock(chan);
5128
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005129 return 0;
5130}
5131
5132static inline int l2cap_move_channel_confirm_rsp(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005133 struct l2cap_cmd_hdr *cmd,
5134 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005135{
5136 struct l2cap_move_chan_cfm_rsp *rsp = data;
Mat Martineau3fd71a02012-10-23 15:24:16 -07005137 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005138 u16 icid;
5139
5140 if (cmd_len != sizeof(*rsp))
5141 return -EPROTO;
5142
5143 icid = le16_to_cpu(rsp->icid);
5144
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005145 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005146
Mat Martineau3fd71a02012-10-23 15:24:16 -07005147 chan = l2cap_get_chan_by_scid(conn, icid);
5148 if (!chan)
5149 return 0;
5150
5151 __clear_chan_timer(chan);
5152
5153 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM_RSP) {
5154 chan->local_amp_id = chan->move_id;
5155
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005156 if (chan->local_amp_id == AMP_ID_BREDR && chan->hs_hchan)
Mat Martineau3fd71a02012-10-23 15:24:16 -07005157 __release_logical_link(chan);
5158
5159 l2cap_move_done(chan);
5160 }
5161
5162 l2cap_chan_unlock(chan);
5163
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005164 return 0;
5165}
5166
Claudio Takahaside731152011-02-11 19:28:55 -02005167static inline int l2cap_conn_param_update_req(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005168 struct l2cap_cmd_hdr *cmd,
Johan Hedberg203e6392013-05-15 10:07:15 +03005169 u16 cmd_len, u8 *data)
Claudio Takahaside731152011-02-11 19:28:55 -02005170{
5171 struct hci_conn *hcon = conn->hcon;
5172 struct l2cap_conn_param_update_req *req;
5173 struct l2cap_conn_param_update_rsp rsp;
Johan Hedberg203e6392013-05-15 10:07:15 +03005174 u16 min, max, latency, to_multiplier;
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005175 int err;
Claudio Takahaside731152011-02-11 19:28:55 -02005176
Johan Hedberg40bef302014-07-16 11:42:27 +03005177 if (hcon->role != HCI_ROLE_MASTER)
Claudio Takahaside731152011-02-11 19:28:55 -02005178 return -EINVAL;
5179
Claudio Takahaside731152011-02-11 19:28:55 -02005180 if (cmd_len != sizeof(struct l2cap_conn_param_update_req))
5181 return -EPROTO;
5182
5183 req = (struct l2cap_conn_param_update_req *) data;
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03005184 min = __le16_to_cpu(req->min);
5185 max = __le16_to_cpu(req->max);
Claudio Takahaside731152011-02-11 19:28:55 -02005186 latency = __le16_to_cpu(req->latency);
5187 to_multiplier = __le16_to_cpu(req->to_multiplier);
5188
5189 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 +01005190 min, max, latency, to_multiplier);
Claudio Takahaside731152011-02-11 19:28:55 -02005191
5192 memset(&rsp, 0, sizeof(rsp));
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005193
Andre Guedesd4905f22014-06-25 21:52:52 -03005194 err = hci_check_conn_params(min, max, latency, to_multiplier);
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005195 if (err)
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005196 rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_REJECTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005197 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005198 rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_ACCEPTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005199
5200 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONN_PARAM_UPDATE_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005201 sizeof(rsp), &rsp);
Claudio Takahaside731152011-02-11 19:28:55 -02005202
Andre Guedesffb5a8272014-07-01 18:10:11 -03005203 if (!err) {
Johan Hedbergf4869e22014-07-02 17:37:32 +03005204 u8 store_hint;
Andre Guedesffb5a8272014-07-01 18:10:11 -03005205
Johan Hedbergf4869e22014-07-02 17:37:32 +03005206 store_hint = hci_le_conn_update(hcon, min, max, latency,
5207 to_multiplier);
5208 mgmt_new_conn_param(hcon->hdev, &hcon->dst, hcon->dst_type,
5209 store_hint, min, max, latency,
5210 to_multiplier);
5211
Andre Guedesffb5a8272014-07-01 18:10:11 -03005212 }
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005213
Claudio Takahaside731152011-02-11 19:28:55 -02005214 return 0;
5215}
5216
Johan Hedbergf1496de2013-05-13 14:15:56 +03005217static int l2cap_le_connect_rsp(struct l2cap_conn *conn,
5218 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5219 u8 *data)
5220{
5221 struct l2cap_le_conn_rsp *rsp = (struct l2cap_le_conn_rsp *) data;
5222 u16 dcid, mtu, mps, credits, result;
5223 struct l2cap_chan *chan;
5224 int err;
5225
5226 if (cmd_len < sizeof(*rsp))
5227 return -EPROTO;
5228
5229 dcid = __le16_to_cpu(rsp->dcid);
5230 mtu = __le16_to_cpu(rsp->mtu);
5231 mps = __le16_to_cpu(rsp->mps);
5232 credits = __le16_to_cpu(rsp->credits);
5233 result = __le16_to_cpu(rsp->result);
5234
5235 if (result == L2CAP_CR_SUCCESS && (mtu < 23 || mps < 23))
5236 return -EPROTO;
5237
5238 BT_DBG("dcid 0x%4.4x mtu %u mps %u credits %u result 0x%2.2x",
5239 dcid, mtu, mps, credits, result);
5240
5241 mutex_lock(&conn->chan_lock);
5242
5243 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5244 if (!chan) {
5245 err = -EBADSLT;
5246 goto unlock;
5247 }
5248
5249 err = 0;
5250
5251 l2cap_chan_lock(chan);
5252
5253 switch (result) {
5254 case L2CAP_CR_SUCCESS:
5255 chan->ident = 0;
5256 chan->dcid = dcid;
5257 chan->omtu = mtu;
5258 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005259 chan->tx_credits = credits;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005260 l2cap_chan_ready(chan);
5261 break;
5262
5263 default:
5264 l2cap_chan_del(chan, ECONNREFUSED);
5265 break;
5266 }
5267
5268 l2cap_chan_unlock(chan);
5269
5270unlock:
5271 mutex_unlock(&conn->chan_lock);
5272
5273 return err;
5274}
5275
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005276static inline int l2cap_bredr_sig_cmd(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005277 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5278 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005279{
5280 int err = 0;
5281
5282 switch (cmd->code) {
5283 case L2CAP_COMMAND_REJ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005284 l2cap_command_rej(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005285 break;
5286
5287 case L2CAP_CONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005288 err = l2cap_connect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005289 break;
5290
5291 case L2CAP_CONN_RSP:
Mat Martineauf5a25982012-10-11 17:48:21 +03005292 case L2CAP_CREATE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005293 l2cap_connect_create_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005294 break;
5295
5296 case L2CAP_CONF_REQ:
5297 err = l2cap_config_req(conn, cmd, cmd_len, data);
5298 break;
5299
5300 case L2CAP_CONF_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005301 l2cap_config_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005302 break;
5303
5304 case L2CAP_DISCONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005305 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005306 break;
5307
5308 case L2CAP_DISCONN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005309 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005310 break;
5311
5312 case L2CAP_ECHO_REQ:
5313 l2cap_send_cmd(conn, cmd->ident, L2CAP_ECHO_RSP, cmd_len, data);
5314 break;
5315
5316 case L2CAP_ECHO_RSP:
5317 break;
5318
5319 case L2CAP_INFO_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005320 err = l2cap_information_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005321 break;
5322
5323 case L2CAP_INFO_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005324 l2cap_information_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005325 break;
5326
Mat Martineauf94ff6f2011-11-02 16:18:32 -07005327 case L2CAP_CREATE_CHAN_REQ:
5328 err = l2cap_create_channel_req(conn, cmd, cmd_len, data);
5329 break;
5330
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005331 case L2CAP_MOVE_CHAN_REQ:
5332 err = l2cap_move_channel_req(conn, cmd, cmd_len, data);
5333 break;
5334
5335 case L2CAP_MOVE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005336 l2cap_move_channel_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005337 break;
5338
5339 case L2CAP_MOVE_CHAN_CFM:
5340 err = l2cap_move_channel_confirm(conn, cmd, cmd_len, data);
5341 break;
5342
5343 case L2CAP_MOVE_CHAN_CFM_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005344 l2cap_move_channel_confirm_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005345 break;
5346
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005347 default:
5348 BT_ERR("Unknown BR/EDR signaling command 0x%2.2x", cmd->code);
5349 err = -EINVAL;
5350 break;
5351 }
5352
5353 return err;
5354}
5355
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005356static int l2cap_le_connect_req(struct l2cap_conn *conn,
5357 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5358 u8 *data)
5359{
5360 struct l2cap_le_conn_req *req = (struct l2cap_le_conn_req *) data;
5361 struct l2cap_le_conn_rsp rsp;
5362 struct l2cap_chan *chan, *pchan;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005363 u16 dcid, scid, credits, mtu, mps;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005364 __le16 psm;
5365 u8 result;
5366
5367 if (cmd_len != sizeof(*req))
5368 return -EPROTO;
5369
5370 scid = __le16_to_cpu(req->scid);
5371 mtu = __le16_to_cpu(req->mtu);
5372 mps = __le16_to_cpu(req->mps);
5373 psm = req->psm;
5374 dcid = 0;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005375 credits = 0;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005376
5377 if (mtu < 23 || mps < 23)
5378 return -EPROTO;
5379
5380 BT_DBG("psm 0x%2.2x scid 0x%4.4x mtu %u mps %u", __le16_to_cpu(psm),
5381 scid, mtu, mps);
5382
5383 /* Check if we have socket listening on psm */
5384 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
5385 &conn->hcon->dst, LE_LINK);
5386 if (!pchan) {
5387 result = L2CAP_CR_BAD_PSM;
5388 chan = NULL;
5389 goto response;
5390 }
5391
5392 mutex_lock(&conn->chan_lock);
5393 l2cap_chan_lock(pchan);
5394
5395 if (!smp_sufficient_security(conn->hcon, pchan->sec_level)) {
5396 result = L2CAP_CR_AUTHENTICATION;
5397 chan = NULL;
5398 goto response_unlock;
5399 }
5400
5401 /* Check if we already have channel with that dcid */
5402 if (__l2cap_get_chan_by_dcid(conn, scid)) {
5403 result = L2CAP_CR_NO_MEM;
5404 chan = NULL;
5405 goto response_unlock;
5406 }
5407
5408 chan = pchan->ops->new_connection(pchan);
5409 if (!chan) {
5410 result = L2CAP_CR_NO_MEM;
5411 goto response_unlock;
5412 }
5413
Johan Hedberg0ce43ce2013-12-05 14:55:33 +02005414 l2cap_le_flowctl_init(chan);
5415
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005416 bacpy(&chan->src, &conn->hcon->src);
5417 bacpy(&chan->dst, &conn->hcon->dst);
5418 chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type);
5419 chan->dst_type = bdaddr_type(conn->hcon, conn->hcon->dst_type);
5420 chan->psm = psm;
5421 chan->dcid = scid;
5422 chan->omtu = mtu;
5423 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005424 chan->tx_credits = __le16_to_cpu(req->credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005425
5426 __l2cap_chan_add(conn, chan);
5427 dcid = chan->scid;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005428 credits = chan->rx_credits;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005429
5430 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
5431
5432 chan->ident = cmd->ident;
5433
5434 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
5435 l2cap_state_change(chan, BT_CONNECT2);
5436 result = L2CAP_CR_PEND;
5437 chan->ops->defer(chan);
5438 } else {
5439 l2cap_chan_ready(chan);
5440 result = L2CAP_CR_SUCCESS;
5441 }
5442
5443response_unlock:
5444 l2cap_chan_unlock(pchan);
5445 mutex_unlock(&conn->chan_lock);
Johan Hedberga24cce12014-08-07 22:56:42 +03005446 l2cap_chan_put(pchan);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005447
5448 if (result == L2CAP_CR_PEND)
5449 return 0;
5450
5451response:
5452 if (chan) {
5453 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02005454 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005455 } else {
5456 rsp.mtu = 0;
5457 rsp.mps = 0;
5458 }
5459
5460 rsp.dcid = cpu_to_le16(dcid);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005461 rsp.credits = cpu_to_le16(credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005462 rsp.result = cpu_to_le16(result);
5463
5464 l2cap_send_cmd(conn, cmd->ident, L2CAP_LE_CONN_RSP, sizeof(rsp), &rsp);
5465
5466 return 0;
5467}
5468
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005469static inline int l2cap_le_credits(struct l2cap_conn *conn,
5470 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5471 u8 *data)
5472{
5473 struct l2cap_le_credits *pkt;
5474 struct l2cap_chan *chan;
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005475 u16 cid, credits, max_credits;
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005476
5477 if (cmd_len != sizeof(*pkt))
5478 return -EPROTO;
5479
5480 pkt = (struct l2cap_le_credits *) data;
5481 cid = __le16_to_cpu(pkt->cid);
5482 credits = __le16_to_cpu(pkt->credits);
5483
5484 BT_DBG("cid 0x%4.4x credits 0x%4.4x", cid, credits);
5485
5486 chan = l2cap_get_chan_by_dcid(conn, cid);
5487 if (!chan)
5488 return -EBADSLT;
5489
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005490 max_credits = LE_FLOWCTL_MAX_CREDITS - chan->tx_credits;
5491 if (credits > max_credits) {
5492 BT_ERR("LE credits overflow");
5493 l2cap_send_disconn_req(chan, ECONNRESET);
5494
5495 /* Return 0 so that we don't trigger an unnecessary
5496 * command reject packet.
5497 */
5498 return 0;
5499 }
5500
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005501 chan->tx_credits += credits;
5502
5503 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
5504 l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
5505 chan->tx_credits--;
5506 }
5507
5508 if (chan->tx_credits)
5509 chan->ops->resume(chan);
5510
5511 l2cap_chan_unlock(chan);
5512
5513 return 0;
5514}
5515
Johan Hedberg71fb4192013-12-10 10:52:48 +02005516static inline int l2cap_le_command_rej(struct l2cap_conn *conn,
5517 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5518 u8 *data)
5519{
5520 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
5521 struct l2cap_chan *chan;
5522
5523 if (cmd_len < sizeof(*rej))
5524 return -EPROTO;
5525
5526 mutex_lock(&conn->chan_lock);
5527
5528 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5529 if (!chan)
5530 goto done;
5531
5532 l2cap_chan_lock(chan);
5533 l2cap_chan_del(chan, ECONNREFUSED);
5534 l2cap_chan_unlock(chan);
5535
5536done:
5537 mutex_unlock(&conn->chan_lock);
5538 return 0;
5539}
5540
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005541static inline int l2cap_le_sig_cmd(struct l2cap_conn *conn,
Johan Hedberg203e6392013-05-15 10:07:15 +03005542 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5543 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005544{
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005545 int err = 0;
5546
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005547 switch (cmd->code) {
5548 case L2CAP_COMMAND_REJ:
Johan Hedberg71fb4192013-12-10 10:52:48 +02005549 l2cap_le_command_rej(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005550 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005551
5552 case L2CAP_CONN_PARAM_UPDATE_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005553 err = l2cap_conn_param_update_req(conn, cmd, cmd_len, data);
5554 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005555
5556 case L2CAP_CONN_PARAM_UPDATE_RSP:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005557 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005558
Johan Hedbergf1496de2013-05-13 14:15:56 +03005559 case L2CAP_LE_CONN_RSP:
5560 l2cap_le_connect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005561 break;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005562
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005563 case L2CAP_LE_CONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005564 err = l2cap_le_connect_req(conn, cmd, cmd_len, data);
5565 break;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005566
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005567 case L2CAP_LE_CREDITS:
5568 err = l2cap_le_credits(conn, cmd, cmd_len, data);
5569 break;
5570
Johan Hedberg3defe012013-05-15 10:16:06 +03005571 case L2CAP_DISCONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005572 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
5573 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005574
5575 case L2CAP_DISCONN_RSP:
5576 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005577 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005578
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005579 default:
5580 BT_ERR("Unknown LE signaling command 0x%2.2x", cmd->code);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005581 err = -EINVAL;
5582 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005583 }
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005584
5585 return err;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005586}
5587
Johan Hedbergc5623552013-04-29 19:35:33 +03005588static inline void l2cap_le_sig_channel(struct l2cap_conn *conn,
5589 struct sk_buff *skb)
5590{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005591 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005592 struct l2cap_cmd_hdr *cmd;
5593 u16 len;
Johan Hedbergc5623552013-04-29 19:35:33 +03005594 int err;
5595
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005596 if (hcon->type != LE_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005597 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005598
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005599 if (skb->len < L2CAP_CMD_HDR_SIZE)
5600 goto drop;
Johan Hedbergc5623552013-04-29 19:35:33 +03005601
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005602 cmd = (void *) skb->data;
5603 skb_pull(skb, L2CAP_CMD_HDR_SIZE);
Johan Hedbergc5623552013-04-29 19:35:33 +03005604
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005605 len = le16_to_cpu(cmd->len);
Johan Hedbergc5623552013-04-29 19:35:33 +03005606
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005607 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd->code, len, cmd->ident);
Johan Hedbergc5623552013-04-29 19:35:33 +03005608
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005609 if (len != skb->len || !cmd->ident) {
5610 BT_DBG("corrupted command");
5611 goto drop;
5612 }
Johan Hedbergc5623552013-04-29 19:35:33 +03005613
Johan Hedberg203e6392013-05-15 10:07:15 +03005614 err = l2cap_le_sig_cmd(conn, cmd, len, skb->data);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005615 if (err) {
5616 struct l2cap_cmd_rej_unk rej;
Johan Hedbergc5623552013-04-29 19:35:33 +03005617
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005618 BT_ERR("Wrong link type (%d)", err);
Johan Hedbergc5623552013-04-29 19:35:33 +03005619
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005620 rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005621 l2cap_send_cmd(conn, cmd->ident, L2CAP_COMMAND_REJ,
5622 sizeof(rej), &rej);
Johan Hedbergc5623552013-04-29 19:35:33 +03005623 }
5624
Marcel Holtmann3b166292013-10-02 08:28:21 -07005625drop:
Johan Hedbergc5623552013-04-29 19:35:33 +03005626 kfree_skb(skb);
5627}
5628
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005629static inline void l2cap_sig_channel(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005630 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005631{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005632 struct hci_conn *hcon = conn->hcon;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005633 u8 *data = skb->data;
5634 int len = skb->len;
5635 struct l2cap_cmd_hdr cmd;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005636 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005637
5638 l2cap_raw_recv(conn, skb);
5639
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005640 if (hcon->type != ACL_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005641 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005642
Linus Torvalds1da177e2005-04-16 15:20:36 -07005643 while (len >= L2CAP_CMD_HDR_SIZE) {
Al Viro88219a02007-07-29 00:17:25 -07005644 u16 cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005645 memcpy(&cmd, data, L2CAP_CMD_HDR_SIZE);
5646 data += L2CAP_CMD_HDR_SIZE;
5647 len -= L2CAP_CMD_HDR_SIZE;
5648
Al Viro88219a02007-07-29 00:17:25 -07005649 cmd_len = le16_to_cpu(cmd.len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005650
Gustavo Padovan2d792812012-10-06 10:07:01 +01005651 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd.code, cmd_len,
5652 cmd.ident);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005653
Al Viro88219a02007-07-29 00:17:25 -07005654 if (cmd_len > len || !cmd.ident) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005655 BT_DBG("corrupted command");
5656 break;
5657 }
5658
Johan Hedbergc5623552013-04-29 19:35:33 +03005659 err = l2cap_bredr_sig_cmd(conn, &cmd, cmd_len, data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005660 if (err) {
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03005661 struct l2cap_cmd_rej_unk rej;
Gustavo F. Padovan2c6d1a22011-03-23 14:38:32 -03005662
5663 BT_ERR("Wrong link type (%d)", err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005664
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005665 rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Gustavo Padovan2d792812012-10-06 10:07:01 +01005666 l2cap_send_cmd(conn, cmd.ident, L2CAP_COMMAND_REJ,
5667 sizeof(rej), &rej);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005668 }
5669
Al Viro88219a02007-07-29 00:17:25 -07005670 data += cmd_len;
5671 len -= cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005672 }
5673
Marcel Holtmann3b166292013-10-02 08:28:21 -07005674drop:
Linus Torvalds1da177e2005-04-16 15:20:36 -07005675 kfree_skb(skb);
5676}
5677
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005678static int l2cap_check_fcs(struct l2cap_chan *chan, struct sk_buff *skb)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005679{
5680 u16 our_fcs, rcv_fcs;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03005681 int hdr_size;
5682
5683 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
5684 hdr_size = L2CAP_EXT_HDR_SIZE;
5685 else
5686 hdr_size = L2CAP_ENH_HDR_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005687
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005688 if (chan->fcs == L2CAP_FCS_CRC16) {
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005689 skb_trim(skb, skb->len - L2CAP_FCS_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005690 rcv_fcs = get_unaligned_le16(skb->data + skb->len);
5691 our_fcs = crc16(0, skb->data - hdr_size, skb->len + hdr_size);
5692
5693 if (our_fcs != rcv_fcs)
João Paulo Rechi Vita7a560e52010-06-22 13:56:27 -03005694 return -EBADMSG;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005695 }
5696 return 0;
5697}
5698
Mat Martineau6ea00482012-05-17 20:53:52 -07005699static void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan)
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005700{
Mat Martineaue31f7632012-05-17 20:53:41 -07005701 struct l2cap_ctrl control;
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005702
Mat Martineaue31f7632012-05-17 20:53:41 -07005703 BT_DBG("chan %p", chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005704
Mat Martineaue31f7632012-05-17 20:53:41 -07005705 memset(&control, 0, sizeof(control));
5706 control.sframe = 1;
5707 control.final = 1;
5708 control.reqseq = chan->buffer_seq;
5709 set_bit(CONN_SEND_FBIT, &chan->conn_state);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005710
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005711 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
Mat Martineaue31f7632012-05-17 20:53:41 -07005712 control.super = L2CAP_SUPER_RNR;
5713 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005714 }
5715
Mat Martineaue31f7632012-05-17 20:53:41 -07005716 if (test_and_clear_bit(CONN_REMOTE_BUSY, &chan->conn_state) &&
5717 chan->unacked_frames > 0)
5718 __set_retrans_timer(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005719
Mat Martineaue31f7632012-05-17 20:53:41 -07005720 /* Send pending iframes */
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03005721 l2cap_ertm_send(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005722
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005723 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
Mat Martineaue31f7632012-05-17 20:53:41 -07005724 test_bit(CONN_SEND_FBIT, &chan->conn_state)) {
5725 /* F-bit wasn't sent in an s-frame or i-frame yet, so
5726 * send it now.
5727 */
5728 control.super = L2CAP_SUPER_RR;
5729 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005730 }
5731}
5732
Gustavo Padovan2d792812012-10-06 10:07:01 +01005733static void append_skb_frag(struct sk_buff *skb, struct sk_buff *new_frag,
5734 struct sk_buff **last_frag)
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005735{
Mat Martineau84084a32011-07-22 14:54:00 -07005736 /* skb->len reflects data in skb as well as all fragments
5737 * skb->data_len reflects only data in fragments
5738 */
5739 if (!skb_has_frag_list(skb))
5740 skb_shinfo(skb)->frag_list = new_frag;
5741
5742 new_frag->next = NULL;
5743
5744 (*last_frag)->next = new_frag;
5745 *last_frag = new_frag;
5746
5747 skb->len += new_frag->len;
5748 skb->data_len += new_frag->len;
5749 skb->truesize += new_frag->truesize;
5750}
5751
Mat Martineau4b51dae92012-05-17 20:53:37 -07005752static int l2cap_reassemble_sdu(struct l2cap_chan *chan, struct sk_buff *skb,
5753 struct l2cap_ctrl *control)
Mat Martineau84084a32011-07-22 14:54:00 -07005754{
5755 int err = -EINVAL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005756
Mat Martineau4b51dae92012-05-17 20:53:37 -07005757 switch (control->sar) {
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005758 case L2CAP_SAR_UNSEGMENTED:
Mat Martineau84084a32011-07-22 14:54:00 -07005759 if (chan->sdu)
5760 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005761
Gustavo Padovan80b98022012-05-27 22:27:51 -03005762 err = chan->ops->recv(chan, skb);
Mat Martineau84084a32011-07-22 14:54:00 -07005763 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005764
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005765 case L2CAP_SAR_START:
Mat Martineau84084a32011-07-22 14:54:00 -07005766 if (chan->sdu)
5767 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005768
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005769 chan->sdu_len = get_unaligned_le16(skb->data);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005770 skb_pull(skb, L2CAP_SDULEN_SIZE);
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005771
Mat Martineau84084a32011-07-22 14:54:00 -07005772 if (chan->sdu_len > chan->imtu) {
5773 err = -EMSGSIZE;
5774 break;
5775 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005776
Mat Martineau84084a32011-07-22 14:54:00 -07005777 if (skb->len >= chan->sdu_len)
5778 break;
5779
5780 chan->sdu = skb;
5781 chan->sdu_last_frag = skb;
5782
5783 skb = NULL;
5784 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005785 break;
5786
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005787 case L2CAP_SAR_CONTINUE:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005788 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005789 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005790
Mat Martineau84084a32011-07-22 14:54:00 -07005791 append_skb_frag(chan->sdu, skb,
5792 &chan->sdu_last_frag);
5793 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005794
Mat Martineau84084a32011-07-22 14:54:00 -07005795 if (chan->sdu->len >= chan->sdu_len)
5796 break;
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005797
Mat Martineau84084a32011-07-22 14:54:00 -07005798 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005799 break;
5800
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005801 case L2CAP_SAR_END:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005802 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005803 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005804
Mat Martineau84084a32011-07-22 14:54:00 -07005805 append_skb_frag(chan->sdu, skb,
5806 &chan->sdu_last_frag);
5807 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005808
Mat Martineau84084a32011-07-22 14:54:00 -07005809 if (chan->sdu->len != chan->sdu_len)
5810 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005811
Gustavo Padovan80b98022012-05-27 22:27:51 -03005812 err = chan->ops->recv(chan, chan->sdu);
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005813
Mat Martineau84084a32011-07-22 14:54:00 -07005814 if (!err) {
5815 /* Reassembly complete */
5816 chan->sdu = NULL;
5817 chan->sdu_last_frag = NULL;
5818 chan->sdu_len = 0;
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005819 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005820 break;
5821 }
5822
Mat Martineau84084a32011-07-22 14:54:00 -07005823 if (err) {
5824 kfree_skb(skb);
5825 kfree_skb(chan->sdu);
5826 chan->sdu = NULL;
5827 chan->sdu_last_frag = NULL;
5828 chan->sdu_len = 0;
5829 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005830
Mat Martineau84084a32011-07-22 14:54:00 -07005831 return err;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005832}
5833
Mat Martineau32b32732012-10-23 15:24:11 -07005834static int l2cap_resegment(struct l2cap_chan *chan)
5835{
5836 /* Placeholder */
5837 return 0;
5838}
5839
Mat Martineaue3281402011-07-07 09:39:02 -07005840void l2cap_chan_busy(struct l2cap_chan *chan, int busy)
Gustavo F. Padovan712132eb2010-06-21 19:39:50 -03005841{
Mat Martineau61aa4f52012-05-17 20:53:40 -07005842 u8 event;
5843
5844 if (chan->mode != L2CAP_MODE_ERTM)
5845 return;
5846
5847 event = busy ? L2CAP_EV_LOCAL_BUSY_DETECTED : L2CAP_EV_LOCAL_BUSY_CLEAR;
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03005848 l2cap_tx(chan, NULL, NULL, event);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005849}
5850
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005851static int l2cap_rx_queued_iframes(struct l2cap_chan *chan)
5852{
Mat Martineau63838722012-05-17 20:53:45 -07005853 int err = 0;
5854 /* Pass sequential frames to l2cap_reassemble_sdu()
5855 * until a gap is encountered.
5856 */
5857
5858 BT_DBG("chan %p", chan);
5859
5860 while (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
5861 struct sk_buff *skb;
5862 BT_DBG("Searching for skb with txseq %d (queue len %d)",
5863 chan->buffer_seq, skb_queue_len(&chan->srej_q));
5864
5865 skb = l2cap_ertm_seq_in_queue(&chan->srej_q, chan->buffer_seq);
5866
5867 if (!skb)
5868 break;
5869
5870 skb_unlink(skb, &chan->srej_q);
5871 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
5872 err = l2cap_reassemble_sdu(chan, skb, &bt_cb(skb)->control);
5873 if (err)
5874 break;
5875 }
5876
5877 if (skb_queue_empty(&chan->srej_q)) {
5878 chan->rx_state = L2CAP_RX_STATE_RECV;
5879 l2cap_send_ack(chan);
5880 }
5881
5882 return err;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005883}
5884
5885static void l2cap_handle_srej(struct l2cap_chan *chan,
5886 struct l2cap_ctrl *control)
5887{
Mat Martineauf80842a2012-05-17 20:53:46 -07005888 struct sk_buff *skb;
5889
5890 BT_DBG("chan %p, control %p", chan, control);
5891
5892 if (control->reqseq == chan->next_tx_seq) {
5893 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005894 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005895 return;
5896 }
5897
5898 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
5899
5900 if (skb == NULL) {
5901 BT_DBG("Seq %d not available for retransmission",
5902 control->reqseq);
5903 return;
5904 }
5905
5906 if (chan->max_tx != 0 && bt_cb(skb)->control.retries >= chan->max_tx) {
5907 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005908 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005909 return;
5910 }
5911
5912 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
5913
5914 if (control->poll) {
5915 l2cap_pass_to_tx(chan, control);
5916
5917 set_bit(CONN_SEND_FBIT, &chan->conn_state);
5918 l2cap_retransmit(chan, control);
5919 l2cap_ertm_send(chan);
5920
5921 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5922 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5923 chan->srej_save_reqseq = control->reqseq;
5924 }
5925 } else {
5926 l2cap_pass_to_tx_fbit(chan, control);
5927
5928 if (control->final) {
5929 if (chan->srej_save_reqseq != control->reqseq ||
5930 !test_and_clear_bit(CONN_SREJ_ACT,
5931 &chan->conn_state))
5932 l2cap_retransmit(chan, control);
5933 } else {
5934 l2cap_retransmit(chan, control);
5935 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5936 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5937 chan->srej_save_reqseq = control->reqseq;
5938 }
5939 }
5940 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005941}
5942
5943static void l2cap_handle_rej(struct l2cap_chan *chan,
5944 struct l2cap_ctrl *control)
5945{
Mat Martineaufcd289d2012-05-17 20:53:47 -07005946 struct sk_buff *skb;
5947
5948 BT_DBG("chan %p, control %p", chan, control);
5949
5950 if (control->reqseq == chan->next_tx_seq) {
5951 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005952 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07005953 return;
5954 }
5955
5956 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
5957
5958 if (chan->max_tx && skb &&
5959 bt_cb(skb)->control.retries >= chan->max_tx) {
5960 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005961 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07005962 return;
5963 }
5964
5965 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
5966
5967 l2cap_pass_to_tx(chan, control);
5968
5969 if (control->final) {
5970 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state))
5971 l2cap_retransmit_all(chan, control);
5972 } else {
5973 l2cap_retransmit_all(chan, control);
5974 l2cap_ertm_send(chan);
5975 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F)
5976 set_bit(CONN_REJ_ACT, &chan->conn_state);
5977 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005978}
5979
Mat Martineau4b51dae92012-05-17 20:53:37 -07005980static u8 l2cap_classify_txseq(struct l2cap_chan *chan, u16 txseq)
5981{
5982 BT_DBG("chan %p, txseq %d", chan, txseq);
5983
5984 BT_DBG("last_acked_seq %d, expected_tx_seq %d", chan->last_acked_seq,
5985 chan->expected_tx_seq);
5986
5987 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
5988 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
Gustavo Padovan2d792812012-10-06 10:07:01 +01005989 chan->tx_win) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07005990 /* See notes below regarding "double poll" and
5991 * invalid packets.
5992 */
5993 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
5994 BT_DBG("Invalid/Ignore - after SREJ");
5995 return L2CAP_TXSEQ_INVALID_IGNORE;
5996 } else {
5997 BT_DBG("Invalid - in window after SREJ sent");
5998 return L2CAP_TXSEQ_INVALID;
5999 }
6000 }
6001
6002 if (chan->srej_list.head == txseq) {
6003 BT_DBG("Expected SREJ");
6004 return L2CAP_TXSEQ_EXPECTED_SREJ;
6005 }
6006
6007 if (l2cap_ertm_seq_in_queue(&chan->srej_q, txseq)) {
6008 BT_DBG("Duplicate SREJ - txseq already stored");
6009 return L2CAP_TXSEQ_DUPLICATE_SREJ;
6010 }
6011
6012 if (l2cap_seq_list_contains(&chan->srej_list, txseq)) {
6013 BT_DBG("Unexpected SREJ - not requested");
6014 return L2CAP_TXSEQ_UNEXPECTED_SREJ;
6015 }
6016 }
6017
6018 if (chan->expected_tx_seq == txseq) {
6019 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
6020 chan->tx_win) {
6021 BT_DBG("Invalid - txseq outside tx window");
6022 return L2CAP_TXSEQ_INVALID;
6023 } else {
6024 BT_DBG("Expected");
6025 return L2CAP_TXSEQ_EXPECTED;
6026 }
6027 }
6028
6029 if (__seq_offset(chan, txseq, chan->last_acked_seq) <
Gustavo Padovan2d792812012-10-06 10:07:01 +01006030 __seq_offset(chan, chan->expected_tx_seq, chan->last_acked_seq)) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07006031 BT_DBG("Duplicate - expected_tx_seq later than txseq");
6032 return L2CAP_TXSEQ_DUPLICATE;
6033 }
6034
6035 if (__seq_offset(chan, txseq, chan->last_acked_seq) >= chan->tx_win) {
6036 /* A source of invalid packets is a "double poll" condition,
6037 * where delays cause us to send multiple poll packets. If
6038 * the remote stack receives and processes both polls,
6039 * sequence numbers can wrap around in such a way that a
6040 * resent frame has a sequence number that looks like new data
6041 * with a sequence gap. This would trigger an erroneous SREJ
6042 * request.
6043 *
6044 * Fortunately, this is impossible with a tx window that's
6045 * less than half of the maximum sequence number, which allows
6046 * invalid frames to be safely ignored.
6047 *
6048 * With tx window sizes greater than half of the tx window
6049 * maximum, the frame is invalid and cannot be ignored. This
6050 * causes a disconnect.
6051 */
6052
6053 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
6054 BT_DBG("Invalid/Ignore - txseq outside tx window");
6055 return L2CAP_TXSEQ_INVALID_IGNORE;
6056 } else {
6057 BT_DBG("Invalid - txseq outside tx window");
6058 return L2CAP_TXSEQ_INVALID;
6059 }
6060 } else {
6061 BT_DBG("Unexpected - txseq indicates missing frames");
6062 return L2CAP_TXSEQ_UNEXPECTED;
6063 }
6064}
6065
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006066static int l2cap_rx_state_recv(struct l2cap_chan *chan,
6067 struct l2cap_ctrl *control,
6068 struct sk_buff *skb, u8 event)
6069{
6070 int err = 0;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006071 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006072
6073 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6074 event);
6075
6076 switch (event) {
6077 case L2CAP_EV_RECV_IFRAME:
6078 switch (l2cap_classify_txseq(chan, control->txseq)) {
6079 case L2CAP_TXSEQ_EXPECTED:
6080 l2cap_pass_to_tx(chan, control);
6081
6082 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6083 BT_DBG("Busy, discarding expected seq %d",
6084 control->txseq);
6085 break;
6086 }
6087
6088 chan->expected_tx_seq = __next_seq(chan,
6089 control->txseq);
6090
6091 chan->buffer_seq = chan->expected_tx_seq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006092 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006093
6094 err = l2cap_reassemble_sdu(chan, skb, control);
6095 if (err)
6096 break;
6097
6098 if (control->final) {
6099 if (!test_and_clear_bit(CONN_REJ_ACT,
6100 &chan->conn_state)) {
6101 control->final = 0;
6102 l2cap_retransmit_all(chan, control);
6103 l2cap_ertm_send(chan);
6104 }
6105 }
6106
6107 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
6108 l2cap_send_ack(chan);
6109 break;
6110 case L2CAP_TXSEQ_UNEXPECTED:
6111 l2cap_pass_to_tx(chan, control);
6112
6113 /* Can't issue SREJ frames in the local busy state.
6114 * Drop this frame, it will be seen as missing
6115 * when local busy is exited.
6116 */
6117 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6118 BT_DBG("Busy, discarding unexpected seq %d",
6119 control->txseq);
6120 break;
6121 }
6122
6123 /* There was a gap in the sequence, so an SREJ
6124 * must be sent for each missing frame. The
6125 * current frame is stored for later use.
6126 */
6127 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006128 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006129 BT_DBG("Queued %p (queue len %d)", skb,
6130 skb_queue_len(&chan->srej_q));
6131
6132 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
6133 l2cap_seq_list_clear(&chan->srej_list);
6134 l2cap_send_srej(chan, control->txseq);
6135
6136 chan->rx_state = L2CAP_RX_STATE_SREJ_SENT;
6137 break;
6138 case L2CAP_TXSEQ_DUPLICATE:
6139 l2cap_pass_to_tx(chan, control);
6140 break;
6141 case L2CAP_TXSEQ_INVALID_IGNORE:
6142 break;
6143 case L2CAP_TXSEQ_INVALID:
6144 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006145 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006146 break;
6147 }
6148 break;
6149 case L2CAP_EV_RECV_RR:
6150 l2cap_pass_to_tx(chan, control);
6151 if (control->final) {
6152 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6153
Mat Martineaue6a3ee62012-10-23 15:24:22 -07006154 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state) &&
6155 !__chan_is_moving(chan)) {
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006156 control->final = 0;
6157 l2cap_retransmit_all(chan, control);
6158 }
6159
6160 l2cap_ertm_send(chan);
6161 } else if (control->poll) {
6162 l2cap_send_i_or_rr_or_rnr(chan);
6163 } else {
6164 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6165 &chan->conn_state) &&
6166 chan->unacked_frames)
6167 __set_retrans_timer(chan);
6168
6169 l2cap_ertm_send(chan);
6170 }
6171 break;
6172 case L2CAP_EV_RECV_RNR:
6173 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6174 l2cap_pass_to_tx(chan, control);
6175 if (control && control->poll) {
6176 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6177 l2cap_send_rr_or_rnr(chan, 0);
6178 }
6179 __clear_retrans_timer(chan);
6180 l2cap_seq_list_clear(&chan->retrans_list);
6181 break;
6182 case L2CAP_EV_RECV_REJ:
6183 l2cap_handle_rej(chan, control);
6184 break;
6185 case L2CAP_EV_RECV_SREJ:
6186 l2cap_handle_srej(chan, control);
6187 break;
6188 default:
6189 break;
6190 }
6191
6192 if (skb && !skb_in_use) {
6193 BT_DBG("Freeing %p", skb);
6194 kfree_skb(skb);
6195 }
6196
6197 return err;
6198}
6199
6200static int l2cap_rx_state_srej_sent(struct l2cap_chan *chan,
6201 struct l2cap_ctrl *control,
6202 struct sk_buff *skb, u8 event)
6203{
6204 int err = 0;
6205 u16 txseq = control->txseq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006206 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006207
6208 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6209 event);
6210
6211 switch (event) {
6212 case L2CAP_EV_RECV_IFRAME:
6213 switch (l2cap_classify_txseq(chan, txseq)) {
6214 case L2CAP_TXSEQ_EXPECTED:
6215 /* Keep frame for reassembly later */
6216 l2cap_pass_to_tx(chan, control);
6217 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006218 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006219 BT_DBG("Queued %p (queue len %d)", skb,
6220 skb_queue_len(&chan->srej_q));
6221
6222 chan->expected_tx_seq = __next_seq(chan, txseq);
6223 break;
6224 case L2CAP_TXSEQ_EXPECTED_SREJ:
6225 l2cap_seq_list_pop(&chan->srej_list);
6226
6227 l2cap_pass_to_tx(chan, control);
6228 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006229 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006230 BT_DBG("Queued %p (queue len %d)", skb,
6231 skb_queue_len(&chan->srej_q));
6232
6233 err = l2cap_rx_queued_iframes(chan);
6234 if (err)
6235 break;
6236
6237 break;
6238 case L2CAP_TXSEQ_UNEXPECTED:
6239 /* Got a frame that can't be reassembled yet.
6240 * Save it for later, and send SREJs to cover
6241 * the missing frames.
6242 */
6243 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006244 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006245 BT_DBG("Queued %p (queue len %d)", skb,
6246 skb_queue_len(&chan->srej_q));
6247
6248 l2cap_pass_to_tx(chan, control);
6249 l2cap_send_srej(chan, control->txseq);
6250 break;
6251 case L2CAP_TXSEQ_UNEXPECTED_SREJ:
6252 /* This frame was requested with an SREJ, but
6253 * some expected retransmitted frames are
6254 * missing. Request retransmission of missing
6255 * SREJ'd frames.
6256 */
6257 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006258 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006259 BT_DBG("Queued %p (queue len %d)", skb,
6260 skb_queue_len(&chan->srej_q));
6261
6262 l2cap_pass_to_tx(chan, control);
6263 l2cap_send_srej_list(chan, control->txseq);
6264 break;
6265 case L2CAP_TXSEQ_DUPLICATE_SREJ:
6266 /* We've already queued this frame. Drop this copy. */
6267 l2cap_pass_to_tx(chan, control);
6268 break;
6269 case L2CAP_TXSEQ_DUPLICATE:
6270 /* Expecting a later sequence number, so this frame
6271 * was already received. Ignore it completely.
6272 */
6273 break;
6274 case L2CAP_TXSEQ_INVALID_IGNORE:
6275 break;
6276 case L2CAP_TXSEQ_INVALID:
6277 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006278 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006279 break;
6280 }
6281 break;
6282 case L2CAP_EV_RECV_RR:
6283 l2cap_pass_to_tx(chan, control);
6284 if (control->final) {
6285 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6286
6287 if (!test_and_clear_bit(CONN_REJ_ACT,
6288 &chan->conn_state)) {
6289 control->final = 0;
6290 l2cap_retransmit_all(chan, control);
6291 }
6292
6293 l2cap_ertm_send(chan);
6294 } else if (control->poll) {
6295 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6296 &chan->conn_state) &&
6297 chan->unacked_frames) {
6298 __set_retrans_timer(chan);
6299 }
6300
6301 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6302 l2cap_send_srej_tail(chan);
6303 } else {
6304 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6305 &chan->conn_state) &&
6306 chan->unacked_frames)
6307 __set_retrans_timer(chan);
6308
6309 l2cap_send_ack(chan);
6310 }
6311 break;
6312 case L2CAP_EV_RECV_RNR:
6313 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6314 l2cap_pass_to_tx(chan, control);
6315 if (control->poll) {
6316 l2cap_send_srej_tail(chan);
6317 } else {
6318 struct l2cap_ctrl rr_control;
6319 memset(&rr_control, 0, sizeof(rr_control));
6320 rr_control.sframe = 1;
6321 rr_control.super = L2CAP_SUPER_RR;
6322 rr_control.reqseq = chan->buffer_seq;
6323 l2cap_send_sframe(chan, &rr_control);
6324 }
6325
6326 break;
6327 case L2CAP_EV_RECV_REJ:
6328 l2cap_handle_rej(chan, control);
6329 break;
6330 case L2CAP_EV_RECV_SREJ:
6331 l2cap_handle_srej(chan, control);
6332 break;
6333 }
6334
6335 if (skb && !skb_in_use) {
6336 BT_DBG("Freeing %p", skb);
6337 kfree_skb(skb);
6338 }
6339
6340 return err;
6341}
6342
Mat Martineau32b32732012-10-23 15:24:11 -07006343static int l2cap_finish_move(struct l2cap_chan *chan)
6344{
6345 BT_DBG("chan %p", chan);
6346
6347 chan->rx_state = L2CAP_RX_STATE_RECV;
6348
6349 if (chan->hs_hcon)
6350 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6351 else
6352 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6353
6354 return l2cap_resegment(chan);
6355}
6356
6357static int l2cap_rx_state_wait_p(struct l2cap_chan *chan,
6358 struct l2cap_ctrl *control,
6359 struct sk_buff *skb, u8 event)
6360{
6361 int err;
6362
6363 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6364 event);
6365
6366 if (!control->poll)
6367 return -EPROTO;
6368
6369 l2cap_process_reqseq(chan, control->reqseq);
6370
6371 if (!skb_queue_empty(&chan->tx_q))
6372 chan->tx_send_head = skb_peek(&chan->tx_q);
6373 else
6374 chan->tx_send_head = NULL;
6375
6376 /* Rewind next_tx_seq to the point expected
6377 * by the receiver.
6378 */
6379 chan->next_tx_seq = control->reqseq;
6380 chan->unacked_frames = 0;
6381
6382 err = l2cap_finish_move(chan);
6383 if (err)
6384 return err;
6385
6386 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6387 l2cap_send_i_or_rr_or_rnr(chan);
6388
6389 if (event == L2CAP_EV_RECV_IFRAME)
6390 return -EPROTO;
6391
6392 return l2cap_rx_state_recv(chan, control, NULL, event);
6393}
6394
6395static int l2cap_rx_state_wait_f(struct l2cap_chan *chan,
6396 struct l2cap_ctrl *control,
6397 struct sk_buff *skb, u8 event)
6398{
6399 int err;
6400
6401 if (!control->final)
6402 return -EPROTO;
6403
6404 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6405
6406 chan->rx_state = L2CAP_RX_STATE_RECV;
6407 l2cap_process_reqseq(chan, control->reqseq);
6408
6409 if (!skb_queue_empty(&chan->tx_q))
6410 chan->tx_send_head = skb_peek(&chan->tx_q);
6411 else
6412 chan->tx_send_head = NULL;
6413
6414 /* Rewind next_tx_seq to the point expected
6415 * by the receiver.
6416 */
6417 chan->next_tx_seq = control->reqseq;
6418 chan->unacked_frames = 0;
6419
6420 if (chan->hs_hcon)
6421 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6422 else
6423 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6424
6425 err = l2cap_resegment(chan);
6426
6427 if (!err)
6428 err = l2cap_rx_state_recv(chan, control, skb, event);
6429
6430 return err;
6431}
6432
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006433static bool __valid_reqseq(struct l2cap_chan *chan, u16 reqseq)
6434{
6435 /* Make sure reqseq is for a packet that has been sent but not acked */
6436 u16 unacked;
6437
6438 unacked = __seq_offset(chan, chan->next_tx_seq, chan->expected_ack_seq);
6439 return __seq_offset(chan, chan->next_tx_seq, reqseq) <= unacked;
6440}
6441
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006442static int l2cap_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6443 struct sk_buff *skb, u8 event)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006444{
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006445 int err = 0;
6446
6447 BT_DBG("chan %p, control %p, skb %p, event %d, state %d", chan,
6448 control, skb, event, chan->rx_state);
6449
6450 if (__valid_reqseq(chan, control->reqseq)) {
6451 switch (chan->rx_state) {
6452 case L2CAP_RX_STATE_RECV:
6453 err = l2cap_rx_state_recv(chan, control, skb, event);
6454 break;
6455 case L2CAP_RX_STATE_SREJ_SENT:
6456 err = l2cap_rx_state_srej_sent(chan, control, skb,
6457 event);
6458 break;
Mat Martineau32b32732012-10-23 15:24:11 -07006459 case L2CAP_RX_STATE_WAIT_P:
6460 err = l2cap_rx_state_wait_p(chan, control, skb, event);
6461 break;
6462 case L2CAP_RX_STATE_WAIT_F:
6463 err = l2cap_rx_state_wait_f(chan, control, skb, event);
6464 break;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006465 default:
6466 /* shut it down */
6467 break;
6468 }
6469 } else {
6470 BT_DBG("Invalid reqseq %d (next_tx_seq %d, expected_ack_seq %d",
6471 control->reqseq, chan->next_tx_seq,
6472 chan->expected_ack_seq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006473 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006474 }
6475
6476 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006477}
6478
6479static int l2cap_stream_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6480 struct sk_buff *skb)
6481{
Mat Martineau4b51dae92012-05-17 20:53:37 -07006482 int err = 0;
6483
6484 BT_DBG("chan %p, control %p, skb %p, state %d", chan, control, skb,
6485 chan->rx_state);
6486
6487 if (l2cap_classify_txseq(chan, control->txseq) ==
6488 L2CAP_TXSEQ_EXPECTED) {
6489 l2cap_pass_to_tx(chan, control);
6490
6491 BT_DBG("buffer_seq %d->%d", chan->buffer_seq,
6492 __next_seq(chan, chan->buffer_seq));
6493
6494 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
6495
6496 l2cap_reassemble_sdu(chan, skb, control);
6497 } else {
6498 if (chan->sdu) {
6499 kfree_skb(chan->sdu);
6500 chan->sdu = NULL;
6501 }
6502 chan->sdu_last_frag = NULL;
6503 chan->sdu_len = 0;
6504
6505 if (skb) {
6506 BT_DBG("Freeing %p", skb);
6507 kfree_skb(skb);
6508 }
6509 }
6510
6511 chan->last_acked_seq = control->txseq;
6512 chan->expected_tx_seq = __next_seq(chan, control->txseq);
6513
6514 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006515}
6516
6517static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6518{
6519 struct l2cap_ctrl *control = &bt_cb(skb)->control;
6520 u16 len;
6521 u8 event;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006522
Mat Martineaub76bbd62012-04-11 10:48:43 -07006523 __unpack_control(chan, skb);
6524
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006525 len = skb->len;
6526
6527 /*
6528 * We can just drop the corrupted I-frame here.
6529 * Receiver will miss it and start proper recovery
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006530 * procedures and ask for retransmission.
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006531 */
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006532 if (l2cap_check_fcs(chan, skb))
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006533 goto drop;
6534
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006535 if (!control->sframe && control->sar == L2CAP_SAR_START)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006536 len -= L2CAP_SDULEN_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006537
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006538 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006539 len -= L2CAP_FCS_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006540
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006541 if (len > chan->mps) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006542 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006543 goto drop;
6544 }
6545
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006546 if (!control->sframe) {
6547 int err;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006548
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006549 BT_DBG("iframe sar %d, reqseq %d, final %d, txseq %d",
6550 control->sar, control->reqseq, control->final,
6551 control->txseq);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03006552
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006553 /* Validate F-bit - F=0 always valid, F=1 only
6554 * valid in TX WAIT_F
6555 */
6556 if (control->final && chan->tx_state != L2CAP_TX_STATE_WAIT_F)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006557 goto drop;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006558
6559 if (chan->mode != L2CAP_MODE_STREAMING) {
6560 event = L2CAP_EV_RECV_IFRAME;
6561 err = l2cap_rx(chan, control, skb, event);
6562 } else {
6563 err = l2cap_stream_rx(chan, control, skb);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006564 }
6565
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006566 if (err)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006567 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006568 } else {
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006569 const u8 rx_func_to_event[4] = {
6570 L2CAP_EV_RECV_RR, L2CAP_EV_RECV_REJ,
6571 L2CAP_EV_RECV_RNR, L2CAP_EV_RECV_SREJ
6572 };
6573
6574 /* Only I-frames are expected in streaming mode */
6575 if (chan->mode == L2CAP_MODE_STREAMING)
6576 goto drop;
6577
6578 BT_DBG("sframe reqseq %d, final %d, poll %d, super %d",
6579 control->reqseq, control->final, control->poll,
6580 control->super);
6581
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006582 if (len != 0) {
Andrei Emeltchenko1bb166e2012-11-20 17:16:21 +02006583 BT_ERR("Trailing bytes: %d in sframe", len);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006584 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006585 goto drop;
6586 }
6587
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006588 /* Validate F and P bits */
6589 if (control->final && (control->poll ||
6590 chan->tx_state != L2CAP_TX_STATE_WAIT_F))
6591 goto drop;
6592
6593 event = rx_func_to_event[control->super];
6594 if (l2cap_rx(chan, control, skb, event))
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006595 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006596 }
6597
6598 return 0;
6599
6600drop:
6601 kfree_skb(skb);
6602 return 0;
6603}
6604
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006605static void l2cap_chan_le_send_credits(struct l2cap_chan *chan)
6606{
6607 struct l2cap_conn *conn = chan->conn;
6608 struct l2cap_le_credits pkt;
6609 u16 return_credits;
6610
6611 /* We return more credits to the sender only after the amount of
6612 * credits falls below half of the initial amount.
6613 */
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02006614 if (chan->rx_credits >= (le_max_credits + 1) / 2)
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006615 return;
6616
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02006617 return_credits = le_max_credits - chan->rx_credits;
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006618
6619 BT_DBG("chan %p returning %u credits to sender", chan, return_credits);
6620
6621 chan->rx_credits += return_credits;
6622
6623 pkt.cid = cpu_to_le16(chan->scid);
6624 pkt.credits = cpu_to_le16(return_credits);
6625
6626 chan->ident = l2cap_get_ident(conn);
6627
6628 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CREDITS, sizeof(pkt), &pkt);
6629}
6630
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006631static int l2cap_le_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6632{
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006633 int err;
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006634
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006635 if (!chan->rx_credits) {
6636 BT_ERR("No credits to receive LE L2CAP data");
Johan Hedbergdfd97742014-01-27 15:11:34 -08006637 l2cap_send_disconn_req(chan, ECONNRESET);
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006638 return -ENOBUFS;
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006639 }
6640
6641 if (chan->imtu < skb->len) {
6642 BT_ERR("Too big LE L2CAP PDU");
6643 return -ENOBUFS;
6644 }
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006645
6646 chan->rx_credits--;
6647 BT_DBG("rx_credits %u -> %u", chan->rx_credits + 1, chan->rx_credits);
6648
6649 l2cap_chan_le_send_credits(chan);
6650
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006651 err = 0;
6652
6653 if (!chan->sdu) {
6654 u16 sdu_len;
6655
6656 sdu_len = get_unaligned_le16(skb->data);
6657 skb_pull(skb, L2CAP_SDULEN_SIZE);
6658
6659 BT_DBG("Start of new SDU. sdu_len %u skb->len %u imtu %u",
6660 sdu_len, skb->len, chan->imtu);
6661
6662 if (sdu_len > chan->imtu) {
6663 BT_ERR("Too big LE L2CAP SDU length received");
6664 err = -EMSGSIZE;
6665 goto failed;
6666 }
6667
6668 if (skb->len > sdu_len) {
6669 BT_ERR("Too much LE L2CAP data received");
6670 err = -EINVAL;
6671 goto failed;
6672 }
6673
6674 if (skb->len == sdu_len)
6675 return chan->ops->recv(chan, skb);
6676
6677 chan->sdu = skb;
6678 chan->sdu_len = sdu_len;
6679 chan->sdu_last_frag = skb;
6680
6681 return 0;
6682 }
6683
6684 BT_DBG("SDU fragment. chan->sdu->len %u skb->len %u chan->sdu_len %u",
6685 chan->sdu->len, skb->len, chan->sdu_len);
6686
6687 if (chan->sdu->len + skb->len > chan->sdu_len) {
6688 BT_ERR("Too much LE L2CAP data received");
6689 err = -EINVAL;
6690 goto failed;
6691 }
6692
6693 append_skb_frag(chan->sdu, skb, &chan->sdu_last_frag);
6694 skb = NULL;
6695
6696 if (chan->sdu->len == chan->sdu_len) {
6697 err = chan->ops->recv(chan, chan->sdu);
6698 if (!err) {
6699 chan->sdu = NULL;
6700 chan->sdu_last_frag = NULL;
6701 chan->sdu_len = 0;
6702 }
6703 }
6704
6705failed:
6706 if (err) {
6707 kfree_skb(skb);
6708 kfree_skb(chan->sdu);
6709 chan->sdu = NULL;
6710 chan->sdu_last_frag = NULL;
6711 chan->sdu_len = 0;
6712 }
6713
6714 /* We can't return an error here since we took care of the skb
6715 * freeing internally. An error return would cause the caller to
6716 * do a double-free of the skb.
6717 */
6718 return 0;
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006719}
6720
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006721static void l2cap_data_channel(struct l2cap_conn *conn, u16 cid,
6722 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006723{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006724 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006725
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03006726 chan = l2cap_get_chan_by_scid(conn, cid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006727 if (!chan) {
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006728 if (cid == L2CAP_CID_A2MP) {
6729 chan = a2mp_channel_create(conn, skb);
6730 if (!chan) {
6731 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006732 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006733 }
6734
6735 l2cap_chan_lock(chan);
6736 } else {
6737 BT_DBG("unknown cid 0x%4.4x", cid);
6738 /* Drop packet and return */
6739 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006740 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006741 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006742 }
6743
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03006744 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006745
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03006746 if (chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006747 goto drop;
6748
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006749 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03006750 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006751 if (l2cap_le_data_rcv(chan, skb) < 0)
6752 goto drop;
6753
6754 goto done;
6755
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006756 case L2CAP_MODE_BASIC:
6757 /* If socket recv buffers overflows we drop data here
6758 * which is *bad* because L2CAP has to be reliable.
6759 * But we don't have any other choice. L2CAP doesn't
6760 * provide flow control mechanism. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07006761
Szymon Janc2c96e032014-02-18 20:48:34 +01006762 if (chan->imtu < skb->len) {
6763 BT_ERR("Dropping L2CAP data: receive buffer overflow");
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006764 goto drop;
Szymon Janc2c96e032014-02-18 20:48:34 +01006765 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006766
Gustavo Padovan80b98022012-05-27 22:27:51 -03006767 if (!chan->ops->recv(chan, skb))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006768 goto done;
6769 break;
6770
6771 case L2CAP_MODE_ERTM:
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006772 case L2CAP_MODE_STREAMING:
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006773 l2cap_data_rcv(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006774 goto done;
6775
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006776 default:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006777 BT_DBG("chan %p: bad mode 0x%2.2x", chan, chan->mode);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006778 break;
6779 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006780
6781drop:
6782 kfree_skb(skb);
6783
6784done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006785 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006786}
6787
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006788static void l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm,
6789 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006790{
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006791 struct hci_conn *hcon = conn->hcon;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006792 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006793
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006794 if (hcon->type != ACL_LINK)
Johan Hedberga24cce12014-08-07 22:56:42 +03006795 goto free_skb;
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006796
Johan Hedbergbf20fd42013-05-14 13:23:13 +03006797 chan = l2cap_global_chan_by_psm(0, psm, &hcon->src, &hcon->dst,
6798 ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006799 if (!chan)
Johan Hedberga24cce12014-08-07 22:56:42 +03006800 goto free_skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006801
Andrei Emeltchenko5b4ceda2012-02-24 16:35:32 +02006802 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006803
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03006804 if (chan->state != BT_BOUND && chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006805 goto drop;
6806
Vinicius Costa Gomese13e21d2011-06-17 22:46:27 -03006807 if (chan->imtu < skb->len)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006808 goto drop;
6809
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006810 /* Store remote BD_ADDR and PSM for msg_name */
Marcel Holtmann06ae3312013-10-18 03:43:00 -07006811 bacpy(&bt_cb(skb)->bdaddr, &hcon->dst);
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006812 bt_cb(skb)->psm = psm;
6813
Johan Hedberga24cce12014-08-07 22:56:42 +03006814 if (!chan->ops->recv(chan, skb)) {
6815 l2cap_chan_put(chan);
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006816 return;
Johan Hedberga24cce12014-08-07 22:56:42 +03006817 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006818
6819drop:
Johan Hedberga24cce12014-08-07 22:56:42 +03006820 l2cap_chan_put(chan);
6821free_skb:
Linus Torvalds1da177e2005-04-16 15:20:36 -07006822 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006823}
6824
6825static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb)
6826{
6827 struct l2cap_hdr *lh = (void *) skb->data;
Johan Hedberg61a939c2014-01-17 20:45:11 +02006828 struct hci_conn *hcon = conn->hcon;
Al Viro8e036fc2007-07-29 00:16:36 -07006829 u16 cid, len;
6830 __le16 psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006831
Johan Hedberg61a939c2014-01-17 20:45:11 +02006832 if (hcon->state != BT_CONNECTED) {
6833 BT_DBG("queueing pending rx skb");
6834 skb_queue_tail(&conn->pending_rx, skb);
6835 return;
6836 }
6837
Linus Torvalds1da177e2005-04-16 15:20:36 -07006838 skb_pull(skb, L2CAP_HDR_SIZE);
6839 cid = __le16_to_cpu(lh->cid);
6840 len = __le16_to_cpu(lh->len);
6841
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006842 if (len != skb->len) {
6843 kfree_skb(skb);
6844 return;
6845 }
6846
Johan Hedberg9e1d7e12014-07-06 11:03:36 +03006847 /* Since we can't actively block incoming LE connections we must
6848 * at least ensure that we ignore incoming data from them.
6849 */
6850 if (hcon->type == LE_LINK &&
Johan Hedbergdcc36c12014-07-09 12:59:13 +03006851 hci_bdaddr_list_lookup(&hcon->hdev->blacklist, &hcon->dst,
6852 bdaddr_type(hcon, hcon->dst_type))) {
Johan Hedberge4931502014-07-02 09:36:21 +03006853 kfree_skb(skb);
6854 return;
6855 }
6856
Linus Torvalds1da177e2005-04-16 15:20:36 -07006857 BT_DBG("len %d, cid 0x%4.4x", len, cid);
6858
6859 switch (cid) {
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006860 case L2CAP_CID_SIGNALING:
Linus Torvalds1da177e2005-04-16 15:20:36 -07006861 l2cap_sig_channel(conn, skb);
6862 break;
6863
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006864 case L2CAP_CID_CONN_LESS:
Andrei Emeltchenko097db762012-03-09 14:16:17 +02006865 psm = get_unaligned((__le16 *) skb->data);
Andrei Emeltchenko0181a702012-05-29 10:04:05 +03006866 skb_pull(skb, L2CAP_PSMLEN_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006867 l2cap_conless_channel(conn, psm, skb);
6868 break;
6869
Marcel Holtmanna2877622013-10-02 23:46:54 -07006870 case L2CAP_CID_LE_SIGNALING:
6871 l2cap_le_sig_channel(conn, skb);
6872 break;
6873
Linus Torvalds1da177e2005-04-16 15:20:36 -07006874 default:
6875 l2cap_data_channel(conn, cid, skb);
6876 break;
6877 }
6878}
6879
Johan Hedberg61a939c2014-01-17 20:45:11 +02006880static void process_pending_rx(struct work_struct *work)
6881{
6882 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
6883 pending_rx_work);
6884 struct sk_buff *skb;
6885
6886 BT_DBG("");
6887
6888 while ((skb = skb_dequeue(&conn->pending_rx)))
6889 l2cap_recv_frame(conn, skb);
6890}
6891
Johan Hedberg162b49e2014-01-17 20:45:10 +02006892static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon)
6893{
6894 struct l2cap_conn *conn = hcon->l2cap_data;
6895 struct hci_chan *hchan;
6896
6897 if (conn)
6898 return conn;
6899
6900 hchan = hci_chan_create(hcon);
6901 if (!hchan)
6902 return NULL;
6903
Johan Hedberg27f70f32014-07-21 10:50:06 +03006904 conn = kzalloc(sizeof(*conn), GFP_KERNEL);
Johan Hedberg162b49e2014-01-17 20:45:10 +02006905 if (!conn) {
6906 hci_chan_del(hchan);
6907 return NULL;
6908 }
6909
6910 kref_init(&conn->ref);
6911 hcon->l2cap_data = conn;
Johan Hedberg51bb84572014-08-15 21:06:57 +03006912 conn->hcon = hci_conn_get(hcon);
Johan Hedberg162b49e2014-01-17 20:45:10 +02006913 conn->hchan = hchan;
6914
6915 BT_DBG("hcon %p conn %p hchan %p", hcon, conn, hchan);
6916
6917 switch (hcon->type) {
6918 case LE_LINK:
6919 if (hcon->hdev->le_mtu) {
6920 conn->mtu = hcon->hdev->le_mtu;
6921 break;
6922 }
6923 /* fall through */
6924 default:
6925 conn->mtu = hcon->hdev->acl_mtu;
6926 break;
6927 }
6928
6929 conn->feat_mask = 0;
6930
6931 if (hcon->type == ACL_LINK)
6932 conn->hs_enabled = test_bit(HCI_HS_ENABLED,
6933 &hcon->hdev->dev_flags);
6934
Marcel Holtmann5a54e7c2014-07-13 20:50:15 +02006935 mutex_init(&conn->ident_lock);
Johan Hedberg162b49e2014-01-17 20:45:10 +02006936 mutex_init(&conn->chan_lock);
6937
6938 INIT_LIST_HEAD(&conn->chan_l);
6939 INIT_LIST_HEAD(&conn->users);
6940
Johan Hedberg276d8072014-08-11 22:06:41 +03006941 INIT_DELAYED_WORK(&conn->info_timer, l2cap_info_timeout);
Johan Hedberg162b49e2014-01-17 20:45:10 +02006942
Johan Hedbergdec5b492014-08-11 22:06:37 +03006943 INIT_WORK(&conn->disconn_work, disconn_work);
6944
Johan Hedberg61a939c2014-01-17 20:45:11 +02006945 skb_queue_head_init(&conn->pending_rx);
6946 INIT_WORK(&conn->pending_rx_work, process_pending_rx);
6947
Johan Hedberg162b49e2014-01-17 20:45:10 +02006948 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
6949
6950 return conn;
6951}
6952
6953static bool is_valid_psm(u16 psm, u8 dst_type) {
6954 if (!psm)
6955 return false;
6956
6957 if (bdaddr_type_is_le(dst_type))
6958 return (psm <= 0x00ff);
6959
6960 /* PSM must be odd and lsb of upper byte must be 0 */
6961 return ((psm & 0x0101) == 0x0001);
6962}
6963
6964int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
6965 bdaddr_t *dst, u8 dst_type)
6966{
6967 struct l2cap_conn *conn;
6968 struct hci_conn *hcon;
6969 struct hci_dev *hdev;
Johan Hedberg162b49e2014-01-17 20:45:10 +02006970 int err;
6971
6972 BT_DBG("%pMR -> %pMR (type %u) psm 0x%2.2x", &chan->src, dst,
6973 dst_type, __le16_to_cpu(psm));
6974
6975 hdev = hci_get_route(dst, &chan->src);
6976 if (!hdev)
6977 return -EHOSTUNREACH;
6978
6979 hci_dev_lock(hdev);
6980
6981 l2cap_chan_lock(chan);
6982
6983 if (!is_valid_psm(__le16_to_cpu(psm), dst_type) && !cid &&
6984 chan->chan_type != L2CAP_CHAN_RAW) {
6985 err = -EINVAL;
6986 goto done;
6987 }
6988
Johan Hedberg21626e62014-01-24 10:35:41 +02006989 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED && !psm) {
6990 err = -EINVAL;
6991 goto done;
6992 }
6993
6994 if (chan->chan_type == L2CAP_CHAN_FIXED && !cid) {
Johan Hedberg162b49e2014-01-17 20:45:10 +02006995 err = -EINVAL;
6996 goto done;
6997 }
6998
6999 switch (chan->mode) {
7000 case L2CAP_MODE_BASIC:
7001 break;
7002 case L2CAP_MODE_LE_FLOWCTL:
7003 l2cap_le_flowctl_init(chan);
7004 break;
7005 case L2CAP_MODE_ERTM:
7006 case L2CAP_MODE_STREAMING:
7007 if (!disable_ertm)
7008 break;
7009 /* fall through */
7010 default:
Johan Hedbergbeb19e42014-07-18 11:15:26 +03007011 err = -EOPNOTSUPP;
Johan Hedberg162b49e2014-01-17 20:45:10 +02007012 goto done;
7013 }
7014
7015 switch (chan->state) {
7016 case BT_CONNECT:
7017 case BT_CONNECT2:
7018 case BT_CONFIG:
7019 /* Already connecting */
7020 err = 0;
7021 goto done;
7022
7023 case BT_CONNECTED:
7024 /* Already connected */
7025 err = -EISCONN;
7026 goto done;
7027
7028 case BT_OPEN:
7029 case BT_BOUND:
7030 /* Can connect */
7031 break;
7032
7033 default:
7034 err = -EBADFD;
7035 goto done;
7036 }
7037
7038 /* Set destination address and psm */
7039 bacpy(&chan->dst, dst);
7040 chan->dst_type = dst_type;
7041
7042 chan->psm = psm;
7043 chan->dcid = cid;
7044
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007045 if (bdaddr_type_is_le(dst_type)) {
Johan Hedberge804d252014-07-16 11:42:28 +03007046 u8 role;
Johan Hedbergcdd62752014-07-07 15:02:28 +03007047
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007048 /* Convert from L2CAP channel address type to HCI address type
7049 */
7050 if (dst_type == BDADDR_LE_PUBLIC)
7051 dst_type = ADDR_LE_DEV_PUBLIC;
7052 else
7053 dst_type = ADDR_LE_DEV_RANDOM;
7054
Johan Hedberge804d252014-07-16 11:42:28 +03007055 if (test_bit(HCI_ADVERTISING, &hdev->dev_flags))
7056 role = HCI_ROLE_SLAVE;
7057 else
7058 role = HCI_ROLE_MASTER;
Johan Hedbergcdd62752014-07-07 15:02:28 +03007059
Andre Guedes04a6c582014-02-26 20:21:44 -03007060 hcon = hci_connect_le(hdev, dst, dst_type, chan->sec_level,
Johan Hedberge804d252014-07-16 11:42:28 +03007061 HCI_LE_CONN_TIMEOUT, role);
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007062 } else {
Johan Hedbergd93375a2014-07-07 15:02:27 +03007063 u8 auth_type = l2cap_get_auth_type(chan);
Andre Guedes04a6c582014-02-26 20:21:44 -03007064 hcon = hci_connect_acl(hdev, dst, chan->sec_level, auth_type);
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007065 }
Johan Hedberg162b49e2014-01-17 20:45:10 +02007066
7067 if (IS_ERR(hcon)) {
7068 err = PTR_ERR(hcon);
7069 goto done;
7070 }
7071
7072 conn = l2cap_conn_add(hcon);
7073 if (!conn) {
7074 hci_conn_drop(hcon);
7075 err = -ENOMEM;
7076 goto done;
7077 }
7078
7079 if (cid && __l2cap_get_chan_by_dcid(conn, cid)) {
7080 hci_conn_drop(hcon);
7081 err = -EBUSY;
7082 goto done;
7083 }
7084
7085 /* Update source addr of the socket */
7086 bacpy(&chan->src, &hcon->src);
7087 chan->src_type = bdaddr_type(hcon, hcon->src_type);
7088
Johan Hedberg162b49e2014-01-17 20:45:10 +02007089 l2cap_chan_add(conn, chan);
Johan Hedberg162b49e2014-01-17 20:45:10 +02007090
7091 /* l2cap_chan_add takes its own ref so we can drop this one */
7092 hci_conn_drop(hcon);
7093
7094 l2cap_state_change(chan, BT_CONNECT);
7095 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
7096
Johan Hedberg61202e42014-01-28 15:16:48 -08007097 /* Release chan->sport so that it can be reused by other
7098 * sockets (as it's only used for listening sockets).
7099 */
7100 write_lock(&chan_list_lock);
7101 chan->sport = 0;
7102 write_unlock(&chan_list_lock);
7103
Johan Hedberg162b49e2014-01-17 20:45:10 +02007104 if (hcon->state == BT_CONNECTED) {
7105 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
7106 __clear_chan_timer(chan);
Johan Hedberge7cafc42014-07-17 15:35:38 +03007107 if (l2cap_chan_check_security(chan, true))
Johan Hedberg162b49e2014-01-17 20:45:10 +02007108 l2cap_state_change(chan, BT_CONNECTED);
7109 } else
7110 l2cap_do_start(chan);
7111 }
7112
7113 err = 0;
7114
7115done:
7116 l2cap_chan_unlock(chan);
7117 hci_dev_unlock(hdev);
7118 hci_dev_put(hdev);
7119 return err;
7120}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +03007121EXPORT_SYMBOL_GPL(l2cap_chan_connect);
Johan Hedberg162b49e2014-01-17 20:45:10 +02007122
Linus Torvalds1da177e2005-04-16 15:20:36 -07007123/* ---- L2CAP interface with lower layer (HCI) ---- */
7124
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007125int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007126{
7127 int exact = 0, lm1 = 0, lm2 = 0;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007128 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007129
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03007130 BT_DBG("hdev %s, bdaddr %pMR", hdev->name, bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007131
7132 /* Find listening sockets and check their link_mode */
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007133 read_lock(&chan_list_lock);
7134 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007135 if (c->state != BT_LISTEN)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007136 continue;
7137
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007138 if (!bacmp(&c->src, &hdev->bdaddr)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007139 lm1 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03007140 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007141 lm1 |= HCI_LM_MASTER;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007142 exact++;
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007143 } else if (!bacmp(&c->src, BDADDR_ANY)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007144 lm2 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03007145 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007146 lm2 |= HCI_LM_MASTER;
7147 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007148 }
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007149 read_unlock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007150
7151 return exact ? lm1 : lm2;
7152}
7153
Johan Hedberge760ec12014-08-07 22:56:47 +03007154/* Find the next fixed channel in BT_LISTEN state, continue iteration
7155 * from an existing channel in the list or from the beginning of the
7156 * global list (by passing NULL as first parameter).
7157 */
7158static struct l2cap_chan *l2cap_global_fixed_chan(struct l2cap_chan *c,
Johan Hedberg54a1b622014-08-07 22:56:48 +03007159 bdaddr_t *src, u8 link_type)
Johan Hedberge760ec12014-08-07 22:56:47 +03007160{
7161 read_lock(&chan_list_lock);
7162
7163 if (c)
7164 c = list_next_entry(c, global_l);
7165 else
7166 c = list_entry(chan_list.next, typeof(*c), global_l);
7167
7168 list_for_each_entry_from(c, &chan_list, global_l) {
7169 if (c->chan_type != L2CAP_CHAN_FIXED)
7170 continue;
7171 if (c->state != BT_LISTEN)
7172 continue;
7173 if (bacmp(&c->src, src) && bacmp(&c->src, BDADDR_ANY))
7174 continue;
Johan Hedberg54a1b622014-08-07 22:56:48 +03007175 if (link_type == ACL_LINK && c->src_type != BDADDR_BREDR)
7176 continue;
7177 if (link_type == LE_LINK && c->src_type == BDADDR_BREDR)
7178 continue;
Johan Hedberge760ec12014-08-07 22:56:47 +03007179
7180 l2cap_chan_hold(c);
7181 read_unlock(&chan_list_lock);
7182 return c;
7183 }
7184
7185 read_unlock(&chan_list_lock);
7186
7187 return NULL;
7188}
7189
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03007190void l2cap_connect_cfm(struct hci_conn *hcon, u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007191{
Johan Hedberge760ec12014-08-07 22:56:47 +03007192 struct hci_dev *hdev = hcon->hdev;
Marcel Holtmann01394182006-07-03 10:02:46 +02007193 struct l2cap_conn *conn;
Johan Hedberge760ec12014-08-07 22:56:47 +03007194 struct l2cap_chan *pchan;
7195 u8 dst_type;
Marcel Holtmann01394182006-07-03 10:02:46 +02007196
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03007197 BT_DBG("hcon %p bdaddr %pMR status %d", hcon, &hcon->dst, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007198
Johan Hedbergdc0f5082014-08-07 22:56:46 +03007199 if (status) {
Joe Perchese1750722011-06-29 18:18:29 -07007200 l2cap_conn_del(hcon, bt_to_errno(status));
Johan Hedbergdc0f5082014-08-07 22:56:46 +03007201 return;
Andrei Emeltchenkoba6fc312012-10-31 15:46:26 +02007202 }
Johan Hedbergdc0f5082014-08-07 22:56:46 +03007203
7204 conn = l2cap_conn_add(hcon);
7205 if (!conn)
7206 return;
7207
Johan Hedberge760ec12014-08-07 22:56:47 +03007208 dst_type = bdaddr_type(hcon, hcon->dst_type);
7209
7210 /* If device is blocked, do not create channels for it */
7211 if (hci_bdaddr_list_lookup(&hdev->blacklist, &hcon->dst, dst_type))
7212 return;
7213
7214 /* Find fixed channels and notify them of the new connection. We
7215 * use multiple individual lookups, continuing each time where
7216 * we left off, because the list lock would prevent calling the
7217 * potentially sleeping l2cap_chan_lock() function.
7218 */
Johan Hedberg54a1b622014-08-07 22:56:48 +03007219 pchan = l2cap_global_fixed_chan(NULL, &hdev->bdaddr, hcon->type);
Johan Hedberge760ec12014-08-07 22:56:47 +03007220 while (pchan) {
7221 struct l2cap_chan *chan, *next;
7222
7223 /* Client fixed channels should override server ones */
7224 if (__l2cap_get_chan_by_dcid(conn, pchan->scid))
7225 goto next;
7226
7227 l2cap_chan_lock(pchan);
7228 chan = pchan->ops->new_connection(pchan);
7229 if (chan) {
7230 bacpy(&chan->src, &hcon->src);
7231 bacpy(&chan->dst, &hcon->dst);
7232 chan->src_type = bdaddr_type(hcon, hcon->src_type);
7233 chan->dst_type = dst_type;
7234
7235 __l2cap_chan_add(conn, chan);
7236 }
7237
7238 l2cap_chan_unlock(pchan);
7239next:
Johan Hedberg54a1b622014-08-07 22:56:48 +03007240 next = l2cap_global_fixed_chan(pchan, &hdev->bdaddr,
7241 hcon->type);
Johan Hedberge760ec12014-08-07 22:56:47 +03007242 l2cap_chan_put(pchan);
7243 pchan = next;
7244 }
7245
Johan Hedbergdc0f5082014-08-07 22:56:46 +03007246 l2cap_conn_ready(conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007247}
7248
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007249int l2cap_disconn_ind(struct hci_conn *hcon)
Marcel Holtmann2950f212009-02-12 14:02:50 +01007250{
7251 struct l2cap_conn *conn = hcon->l2cap_data;
7252
7253 BT_DBG("hcon %p", hcon);
7254
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007255 if (!conn)
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02007256 return HCI_ERROR_REMOTE_USER_TERM;
Marcel Holtmann2950f212009-02-12 14:02:50 +01007257 return conn->disc_reason;
7258}
7259
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03007260void l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007261{
7262 BT_DBG("hcon %p reason %d", hcon, reason);
7263
Joe Perchese1750722011-06-29 18:18:29 -07007264 l2cap_conn_del(hcon, bt_to_errno(reason));
Linus Torvalds1da177e2005-04-16 15:20:36 -07007265}
7266
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007267static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt)
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007268{
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03007269 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED)
Marcel Holtmann255c7602009-02-04 21:07:19 +01007270 return;
7271
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007272 if (encrypt == 0x00) {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007273 if (chan->sec_level == BT_SECURITY_MEDIUM) {
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007274 __set_chan_timer(chan, L2CAP_ENC_TIMEOUT);
Marcel Holtmann7d513e92014-01-15 22:37:40 -08007275 } else if (chan->sec_level == BT_SECURITY_HIGH ||
7276 chan->sec_level == BT_SECURITY_FIPS)
Gustavo F. Padovan0f852722011-05-04 19:42:50 -03007277 l2cap_chan_close(chan, ECONNREFUSED);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007278 } else {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007279 if (chan->sec_level == BT_SECURITY_MEDIUM)
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -03007280 __clear_chan_timer(chan);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007281 }
7282}
7283
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007284int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007285{
Marcel Holtmann40be4922008-07-14 20:13:50 +02007286 struct l2cap_conn *conn = hcon->l2cap_data;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03007287 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007288
Marcel Holtmann01394182006-07-03 10:02:46 +02007289 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007290 return 0;
Marcel Holtmann01394182006-07-03 10:02:46 +02007291
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03007292 BT_DBG("conn %p status 0x%2.2x encrypt %u", conn, status, encrypt);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007293
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007294 mutex_lock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007295
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007296 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007297 l2cap_chan_lock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007298
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03007299 BT_DBG("chan %p scid 0x%4.4x state %s", chan, chan->scid,
7300 state_to_string(chan->state));
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007301
Johan Hedberg2338a7e2014-01-24 10:35:40 +02007302 if (chan->scid == L2CAP_CID_A2MP) {
Andrei Emeltchenko78eb2f92012-07-19 17:03:47 +03007303 l2cap_chan_unlock(chan);
7304 continue;
7305 }
7306
Johan Hedberg191eb392014-08-07 22:56:45 +03007307 if (!status && encrypt)
7308 chan->sec_level = hcon->sec_level;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007309
Andrei Emeltchenko96eff462012-11-15 18:14:53 +02007310 if (!__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007311 l2cap_chan_unlock(chan);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01007312 continue;
7313 }
7314
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007315 if (!status && (chan->state == BT_CONNECTED ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01007316 chan->state == BT_CONFIG)) {
Marcel Holtmannd97c8992013-10-14 02:53:54 -07007317 chan->ops->resume(chan);
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007318 l2cap_check_encryption(chan, encrypt);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007319 l2cap_chan_unlock(chan);
Marcel Holtmann9719f8a2008-07-14 20:13:45 +02007320 continue;
7321 }
7322
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007323 if (chan->state == BT_CONNECT) {
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007324 if (!status)
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03007325 l2cap_start_connection(chan);
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007326 else
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007327 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007328 } else if (chan->state == BT_CONNECT2) {
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007329 struct l2cap_conn_rsp rsp;
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007330 __u16 res, stat;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007331
7332 if (!status) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07007333 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007334 res = L2CAP_CR_PEND;
7335 stat = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08007336 chan->ops->defer(chan);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007337 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007338 l2cap_state_change(chan, BT_CONFIG);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007339 res = L2CAP_CR_SUCCESS;
7340 stat = L2CAP_CS_NO_INFO;
7341 }
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007342 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007343 l2cap_state_change(chan, BT_DISCONN);
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007344 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007345 res = L2CAP_CR_SEC_BLOCK;
7346 stat = L2CAP_CS_NO_INFO;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007347 }
7348
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03007349 rsp.scid = cpu_to_le16(chan->dcid);
7350 rsp.dcid = cpu_to_le16(chan->scid);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007351 rsp.result = cpu_to_le16(res);
7352 rsp.status = cpu_to_le16(stat);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03007353 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01007354 sizeof(rsp), &rsp);
Mat Martineau2d369352012-05-23 14:59:30 -07007355
7356 if (!test_bit(CONF_REQ_SENT, &chan->conf_state) &&
7357 res == L2CAP_CR_SUCCESS) {
7358 char buf[128];
7359 set_bit(CONF_REQ_SENT, &chan->conf_state);
7360 l2cap_send_cmd(conn, l2cap_get_ident(conn),
7361 L2CAP_CONF_REQ,
7362 l2cap_build_conf_req(chan, buf),
7363 buf);
7364 chan->num_conf_req++;
7365 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007366 }
7367
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007368 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007369 }
7370
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007371 mutex_unlock(&conn->chan_lock);
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007372
Linus Torvalds1da177e2005-04-16 15:20:36 -07007373 return 0;
7374}
7375
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007376int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007377{
7378 struct l2cap_conn *conn = hcon->l2cap_data;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007379 struct l2cap_hdr *hdr;
7380 int len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007381
Andrei Emeltchenko1d13a252012-10-15 11:58:41 +03007382 /* For AMP controller do not create l2cap conn */
7383 if (!conn && hcon->hdev->dev_type != HCI_BREDR)
7384 goto drop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007385
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007386 if (!conn)
Claudio Takahasibaf43252013-04-11 13:55:50 -03007387 conn = l2cap_conn_add(hcon);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007388
7389 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007390 goto drop;
7391
7392 BT_DBG("conn %p len %d flags 0x%x", conn, skb->len, flags);
7393
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007394 switch (flags) {
7395 case ACL_START:
7396 case ACL_START_NO_FLUSH:
7397 case ACL_COMPLETE:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007398 if (conn->rx_len) {
7399 BT_ERR("Unexpected start frame (len %d)", skb->len);
7400 kfree_skb(conn->rx_skb);
7401 conn->rx_skb = NULL;
7402 conn->rx_len = 0;
7403 l2cap_conn_unreliable(conn, ECOMM);
7404 }
7405
Andrei Emeltchenkoaae7fe22010-09-15 14:28:43 +03007406 /* Start fragment always begin with Basic L2CAP header */
7407 if (skb->len < L2CAP_HDR_SIZE) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07007408 BT_ERR("Frame is too short (len %d)", skb->len);
7409 l2cap_conn_unreliable(conn, ECOMM);
7410 goto drop;
7411 }
7412
7413 hdr = (struct l2cap_hdr *) skb->data;
7414 len = __le16_to_cpu(hdr->len) + L2CAP_HDR_SIZE;
7415
7416 if (len == skb->len) {
7417 /* Complete frame received */
7418 l2cap_recv_frame(conn, skb);
7419 return 0;
7420 }
7421
7422 BT_DBG("Start: total len %d, frag len %d", len, skb->len);
7423
7424 if (skb->len > len) {
7425 BT_ERR("Frame is too long (len %d, expected len %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007426 skb->len, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007427 l2cap_conn_unreliable(conn, ECOMM);
7428 goto drop;
7429 }
7430
7431 /* Allocate skb for the complete frame (with header) */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03007432 conn->rx_skb = bt_skb_alloc(len, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03007433 if (!conn->rx_skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007434 goto drop;
7435
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007436 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007437 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007438 conn->rx_len = len - skb->len;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007439 break;
7440
7441 case ACL_CONT:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007442 BT_DBG("Cont: frag len %d (expecting %d)", skb->len, conn->rx_len);
7443
7444 if (!conn->rx_len) {
7445 BT_ERR("Unexpected continuation frame (len %d)", skb->len);
7446 l2cap_conn_unreliable(conn, ECOMM);
7447 goto drop;
7448 }
7449
7450 if (skb->len > conn->rx_len) {
7451 BT_ERR("Fragment is too long (len %d, expected %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007452 skb->len, conn->rx_len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007453 kfree_skb(conn->rx_skb);
7454 conn->rx_skb = NULL;
7455 conn->rx_len = 0;
7456 l2cap_conn_unreliable(conn, ECOMM);
7457 goto drop;
7458 }
7459
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007460 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007461 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007462 conn->rx_len -= skb->len;
7463
7464 if (!conn->rx_len) {
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007465 /* Complete frame received. l2cap_recv_frame
7466 * takes ownership of the skb so set the global
7467 * rx_skb pointer to NULL first.
7468 */
7469 struct sk_buff *rx_skb = conn->rx_skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007470 conn->rx_skb = NULL;
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007471 l2cap_recv_frame(conn, rx_skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007472 }
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007473 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007474 }
7475
7476drop:
7477 kfree_skb(skb);
7478 return 0;
7479}
7480
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007481static int l2cap_debugfs_show(struct seq_file *f, void *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007482{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007483 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007484
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007485 read_lock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007486
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007487 list_for_each_entry(c, &chan_list, global_l) {
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03007488 seq_printf(f, "%pMR %pMR %d %d 0x%4.4x 0x%4.4x %d %d %d %d\n",
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007489 &c->src, &c->dst,
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03007490 c->state, __le16_to_cpu(c->psm),
7491 c->scid, c->dcid, c->imtu, c->omtu,
7492 c->sec_level, c->mode);
Andrei Emeltchenko61e1b4b2012-01-19 11:19:50 +02007493 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007494
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007495 read_unlock(&chan_list_lock);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007496
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007497 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007498}
7499
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007500static int l2cap_debugfs_open(struct inode *inode, struct file *file)
7501{
7502 return single_open(file, l2cap_debugfs_show, inode->i_private);
7503}
7504
7505static const struct file_operations l2cap_debugfs_fops = {
7506 .open = l2cap_debugfs_open,
7507 .read = seq_read,
7508 .llseek = seq_lseek,
7509 .release = single_release,
7510};
7511
7512static struct dentry *l2cap_debugfs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007513
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007514int __init l2cap_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007515{
7516 int err;
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007517
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007518 err = l2cap_init_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007519 if (err < 0)
7520 return err;
7521
Marcel Holtmann1120e4b2013-10-17 17:24:16 -07007522 if (IS_ERR_OR_NULL(bt_debugfs))
7523 return 0;
7524
7525 l2cap_debugfs = debugfs_create_file("l2cap", 0444, bt_debugfs,
7526 NULL, &l2cap_debugfs_fops);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007527
Samuel Ortiz40b93972014-05-14 17:53:35 +02007528 debugfs_create_u16("l2cap_le_max_credits", 0644, bt_debugfs,
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02007529 &le_max_credits);
Samuel Ortiz40b93972014-05-14 17:53:35 +02007530 debugfs_create_u16("l2cap_le_default_mps", 0644, bt_debugfs,
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02007531 &le_default_mps);
7532
Linus Torvalds1da177e2005-04-16 15:20:36 -07007533 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007534}
7535
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007536void l2cap_exit(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007537{
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007538 debugfs_remove(l2cap_debugfs);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007539 l2cap_cleanup_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007540}
7541
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03007542module_param(disable_ertm, bool, 0644);
7543MODULE_PARM_DESC(disable_ertm, "Disable enhanced retransmission mode");