blob: cbf6b9d1c404f3153391997e01ec3abc70afc51f [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 Holtmannd40bffb2013-10-12 08:18:18 -070049static u8 l2cap_fixed_chan[8] = { L2CAP_FC_L2CAP | 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
213 chan->scid = scid;
214
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200215 write_unlock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300216
217 return 0;
218}
219
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300220static u16 l2cap_alloc_cid(struct l2cap_conn *conn)
Marcel Holtmann01394182006-07-03 10:02:46 +0200221{
Johan Hedberge77af752013-10-08 10:31:00 +0200222 u16 cid, dyn_end;
Marcel Holtmann01394182006-07-03 10:02:46 +0200223
Johan Hedberge77af752013-10-08 10:31:00 +0200224 if (conn->hcon->type == LE_LINK)
225 dyn_end = L2CAP_CID_LE_DYN_END;
226 else
227 dyn_end = L2CAP_CID_DYN_END;
228
229 for (cid = L2CAP_CID_DYN_START; cid < dyn_end; cid++) {
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300230 if (!__l2cap_get_chan_by_scid(conn, cid))
Marcel Holtmann01394182006-07-03 10:02:46 +0200231 return cid;
232 }
233
234 return 0;
235}
236
Gustavo Padovanf93fa272013-10-21 14:21:40 -0200237static void l2cap_state_change(struct l2cap_chan *chan, int state)
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300238{
Andrei Emeltchenko42d2d872012-02-17 11:40:57 +0200239 BT_DBG("chan %p %s -> %s", chan, state_to_string(chan->state),
Gustavo Padovan2d792812012-10-06 10:07:01 +0100240 state_to_string(state));
Gustavo F. Padovanbadaaa02011-11-23 20:11:46 -0200241
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300242 chan->state = state;
Gustavo Padovan53f52122013-10-15 19:24:45 -0300243 chan->ops->state_change(chan, state, 0);
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300244}
245
Gustavo Padovanf8e73012013-10-15 19:24:46 -0300246static inline void l2cap_state_change_and_error(struct l2cap_chan *chan,
247 int state, int err)
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +0200248{
Gustavo Padovanf8e73012013-10-15 19:24:46 -0300249 chan->state = state;
Gustavo Padovan53f52122013-10-15 19:24:45 -0300250 chan->ops->state_change(chan, chan->state, err);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +0200251}
252
253static inline void l2cap_chan_set_err(struct l2cap_chan *chan, int err)
254{
Gustavo Padovanf8e73012013-10-15 19:24:46 -0300255 chan->ops->state_change(chan, chan->state, err);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +0200256}
257
Mat Martineau4239d162012-05-17 20:53:49 -0700258static void __set_retrans_timer(struct l2cap_chan *chan)
259{
260 if (!delayed_work_pending(&chan->monitor_timer) &&
261 chan->retrans_timeout) {
262 l2cap_set_timer(chan, &chan->retrans_timer,
263 msecs_to_jiffies(chan->retrans_timeout));
264 }
265}
266
267static void __set_monitor_timer(struct l2cap_chan *chan)
268{
269 __clear_retrans_timer(chan);
270 if (chan->monitor_timeout) {
271 l2cap_set_timer(chan, &chan->monitor_timer,
272 msecs_to_jiffies(chan->monitor_timeout));
273 }
274}
275
Mat Martineau608bcc62012-05-17 20:53:32 -0700276static struct sk_buff *l2cap_ertm_seq_in_queue(struct sk_buff_head *head,
277 u16 seq)
278{
279 struct sk_buff *skb;
280
281 skb_queue_walk(head, skb) {
282 if (bt_cb(skb)->control.txseq == seq)
283 return skb;
284 }
285
286 return NULL;
287}
288
Mat Martineau3c588192012-04-11 10:48:42 -0700289/* ---- L2CAP sequence number lists ---- */
290
291/* For ERTM, ordered lists of sequence numbers must be tracked for
292 * SREJ requests that are received and for frames that are to be
293 * retransmitted. These seq_list functions implement a singly-linked
294 * list in an array, where membership in the list can also be checked
295 * in constant time. Items can also be added to the tail of the list
296 * and removed from the head in constant time, without further memory
297 * allocs or frees.
298 */
299
300static int l2cap_seq_list_init(struct l2cap_seq_list *seq_list, u16 size)
301{
302 size_t alloc_size, i;
303
304 /* Allocated size is a power of 2 to map sequence numbers
305 * (which may be up to 14 bits) in to a smaller array that is
306 * sized for the negotiated ERTM transmit windows.
307 */
308 alloc_size = roundup_pow_of_two(size);
309
310 seq_list->list = kmalloc(sizeof(u16) * alloc_size, GFP_KERNEL);
311 if (!seq_list->list)
312 return -ENOMEM;
313
314 seq_list->mask = alloc_size - 1;
315 seq_list->head = L2CAP_SEQ_LIST_CLEAR;
316 seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
317 for (i = 0; i < alloc_size; i++)
318 seq_list->list[i] = L2CAP_SEQ_LIST_CLEAR;
319
320 return 0;
321}
322
323static inline void l2cap_seq_list_free(struct l2cap_seq_list *seq_list)
324{
325 kfree(seq_list->list);
326}
327
328static inline bool l2cap_seq_list_contains(struct l2cap_seq_list *seq_list,
329 u16 seq)
330{
331 /* Constant-time check for list membership */
332 return seq_list->list[seq & seq_list->mask] != L2CAP_SEQ_LIST_CLEAR;
333}
334
Mat Martineau3c588192012-04-11 10:48:42 -0700335static inline u16 l2cap_seq_list_pop(struct l2cap_seq_list *seq_list)
336{
Johan Hedberg03a0c5d2014-01-18 21:32:59 +0200337 u16 seq = seq_list->head;
338 u16 mask = seq_list->mask;
339
340 seq_list->head = seq_list->list[seq & mask];
341 seq_list->list[seq & mask] = L2CAP_SEQ_LIST_CLEAR;
342
343 if (seq_list->head == L2CAP_SEQ_LIST_TAIL) {
344 seq_list->head = L2CAP_SEQ_LIST_CLEAR;
345 seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
346 }
347
348 return seq;
Mat Martineau3c588192012-04-11 10:48:42 -0700349}
350
351static void l2cap_seq_list_clear(struct l2cap_seq_list *seq_list)
352{
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300353 u16 i;
Mat Martineau3c588192012-04-11 10:48:42 -0700354
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300355 if (seq_list->head == L2CAP_SEQ_LIST_CLEAR)
356 return;
357
358 for (i = 0; i <= seq_list->mask; i++)
359 seq_list->list[i] = L2CAP_SEQ_LIST_CLEAR;
360
361 seq_list->head = L2CAP_SEQ_LIST_CLEAR;
362 seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
Mat Martineau3c588192012-04-11 10:48:42 -0700363}
364
365static void l2cap_seq_list_append(struct l2cap_seq_list *seq_list, u16 seq)
366{
367 u16 mask = seq_list->mask;
368
369 /* All appends happen in constant time */
370
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300371 if (seq_list->list[seq & mask] != L2CAP_SEQ_LIST_CLEAR)
372 return;
Mat Martineau3c588192012-04-11 10:48:42 -0700373
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300374 if (seq_list->tail == L2CAP_SEQ_LIST_CLEAR)
375 seq_list->head = seq;
376 else
377 seq_list->list[seq_list->tail & mask] = seq;
378
379 seq_list->tail = seq;
380 seq_list->list[seq & mask] = L2CAP_SEQ_LIST_TAIL;
Mat Martineau3c588192012-04-11 10:48:42 -0700381}
382
Gustavo F. Padovan721c4182011-06-23 19:29:58 -0300383static void l2cap_chan_timeout(struct work_struct *work)
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300384{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -0300385 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100386 chan_timer.work);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200387 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300388 int reason;
389
Andrei Emeltchenkoe05dcc32012-02-17 11:40:56 +0200390 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300391
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200392 mutex_lock(&conn->chan_lock);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200393 l2cap_chan_lock(chan);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300394
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300395 if (chan->state == BT_CONNECTED || chan->state == BT_CONFIG)
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300396 reason = ECONNREFUSED;
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300397 else if (chan->state == BT_CONNECT &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100398 chan->sec_level != BT_SECURITY_SDP)
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300399 reason = ECONNREFUSED;
400 else
401 reason = ETIMEDOUT;
402
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300403 l2cap_chan_close(chan, reason);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300404
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200405 l2cap_chan_unlock(chan);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300406
Gustavo Padovan80b98022012-05-27 22:27:51 -0300407 chan->ops->close(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200408 mutex_unlock(&conn->chan_lock);
409
Ulisses Furquim371fd832011-12-21 20:02:36 -0200410 l2cap_chan_put(chan);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300411}
412
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -0300413struct l2cap_chan *l2cap_chan_create(void)
Marcel Holtmann01394182006-07-03 10:02:46 +0200414{
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300415 struct l2cap_chan *chan;
Marcel Holtmann01394182006-07-03 10:02:46 +0200416
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300417 chan = kzalloc(sizeof(*chan), GFP_ATOMIC);
418 if (!chan)
419 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200420
Andrei Emeltchenkoc03b3552012-02-21 12:54:56 +0200421 mutex_init(&chan->lock);
422
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200423 write_lock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300424 list_add(&chan->global_l, &chan_list);
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200425 write_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300426
Gustavo F. Padovan721c4182011-06-23 19:29:58 -0300427 INIT_DELAYED_WORK(&chan->chan_timer, l2cap_chan_timeout);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300428
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300429 chan->state = BT_OPEN;
430
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530431 kref_init(&chan->kref);
Gustavo F. Padovan71ba0e52011-05-17 14:34:52 -0300432
Mat Martineau28270112012-05-17 21:14:09 -0700433 /* This flag is cleared in l2cap_chan_ready() */
434 set_bit(CONF_NOT_COMPLETE, &chan->conf_state);
435
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -0300436 BT_DBG("chan %p", chan);
Szymon Jancabc545b2011-11-03 16:05:44 +0100437
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300438 return chan;
Marcel Holtmann01394182006-07-03 10:02:46 +0200439}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300440EXPORT_SYMBOL_GPL(l2cap_chan_create);
Marcel Holtmann01394182006-07-03 10:02:46 +0200441
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530442static void l2cap_chan_destroy(struct kref *kref)
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300443{
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530444 struct l2cap_chan *chan = container_of(kref, struct l2cap_chan, kref);
445
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +0530446 BT_DBG("chan %p", chan);
447
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200448 write_lock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300449 list_del(&chan->global_l);
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200450 write_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300451
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +0530452 kfree(chan);
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300453}
454
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530455void l2cap_chan_hold(struct l2cap_chan *c)
456{
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530457 BT_DBG("chan %p orig refcnt %d", c, atomic_read(&c->kref.refcount));
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530458
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530459 kref_get(&c->kref);
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530460}
461
462void l2cap_chan_put(struct l2cap_chan *c)
463{
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530464 BT_DBG("chan %p orig refcnt %d", c, atomic_read(&c->kref.refcount));
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530465
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530466 kref_put(&c->kref, l2cap_chan_destroy);
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530467}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300468EXPORT_SYMBOL_GPL(l2cap_chan_put);
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530469
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300470void l2cap_chan_set_defaults(struct l2cap_chan *chan)
471{
472 chan->fcs = L2CAP_FCS_CRC16;
473 chan->max_tx = L2CAP_DEFAULT_MAX_TX;
474 chan->tx_win = L2CAP_DEFAULT_TX_WINDOW;
475 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
Jukka Rissanen6a5e8162014-05-28 14:43:04 +0300476 chan->remote_max_tx = chan->max_tx;
477 chan->remote_tx_win = chan->tx_win;
Mat Martineauc20f8e32012-07-10 05:47:07 -0700478 chan->ack_win = L2CAP_DEFAULT_TX_WINDOW;
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300479 chan->sec_level = BT_SECURITY_LOW;
Jukka Rissanen6a5e8162014-05-28 14:43:04 +0300480 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
481 chan->retrans_timeout = L2CAP_DEFAULT_RETRANS_TO;
482 chan->monitor_timeout = L2CAP_DEFAULT_MONITOR_TO;
483 chan->conf_state = 0;
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300484
485 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
486}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300487EXPORT_SYMBOL_GPL(l2cap_chan_set_defaults);
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300488
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200489static void l2cap_le_flowctl_init(struct l2cap_chan *chan)
Johan Hedberg38319712013-05-17 12:49:23 +0300490{
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200491 chan->sdu = NULL;
492 chan->sdu_last_frag = NULL;
493 chan->sdu_len = 0;
Johan Hedberg0cd75f72013-05-17 13:09:05 +0300494 chan->tx_credits = 0;
Johan Hedbergf15b8ec2013-12-03 15:08:25 +0200495 chan->rx_credits = le_max_credits;
Johan Hedbergd1d79412014-01-27 15:11:33 -0800496 chan->mps = min_t(u16, chan->imtu, le_default_mps);
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200497
498 skb_queue_head_init(&chan->tx_q);
Johan Hedberg38319712013-05-17 12:49:23 +0300499}
500
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +0300501void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
Marcel Holtmann01394182006-07-03 10:02:46 +0200502{
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -0300503 BT_DBG("conn %p, psm 0x%2.2x, dcid 0x%4.4x", conn,
Andrei Emeltchenko097db762012-03-09 14:16:17 +0200504 __le16_to_cpu(chan->psm), chan->dcid);
Marcel Holtmann01394182006-07-03 10:02:46 +0200505
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +0200506 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
Marcel Holtmann2950f212009-02-12 14:02:50 +0100507
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300508 chan->conn = conn;
Marcel Holtmann01394182006-07-03 10:02:46 +0200509
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200510 switch (chan->chan_type) {
511 case L2CAP_CHAN_CONN_ORIENTED:
Johan Hedberg21626e62014-01-24 10:35:41 +0200512 /* Alloc CID for connection-oriented socket */
513 chan->scid = l2cap_alloc_cid(conn);
514 if (conn->hcon->type == ACL_LINK)
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300515 chan->omtu = L2CAP_DEFAULT_MTU;
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200516 break;
517
518 case L2CAP_CHAN_CONN_LESS:
Marcel Holtmann01394182006-07-03 10:02:46 +0200519 /* Connectionless socket */
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300520 chan->scid = L2CAP_CID_CONN_LESS;
521 chan->dcid = L2CAP_CID_CONN_LESS;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300522 chan->omtu = L2CAP_DEFAULT_MTU;
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200523 break;
524
Johan Hedberg2338a7e2014-01-24 10:35:40 +0200525 case L2CAP_CHAN_FIXED:
526 /* Caller will set CID and CID specific MTU values */
Andrei Emeltchenko416fa752012-05-29 13:59:16 +0300527 break;
528
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200529 default:
Marcel Holtmann01394182006-07-03 10:02:46 +0200530 /* Raw socket can send/recv signalling messages only */
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300531 chan->scid = L2CAP_CID_SIGNALING;
532 chan->dcid = L2CAP_CID_SIGNALING;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300533 chan->omtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann01394182006-07-03 10:02:46 +0200534 }
535
Andrei Emeltchenko8f7975b2011-10-13 16:18:54 +0300536 chan->local_id = L2CAP_BESTEFFORT_ID;
537 chan->local_stype = L2CAP_SERV_BESTEFFORT;
538 chan->local_msdu = L2CAP_DEFAULT_MAX_SDU_SIZE;
539 chan->local_sdu_itime = L2CAP_DEFAULT_SDU_ITIME;
540 chan->local_acc_lat = L2CAP_DEFAULT_ACC_LAT;
Andrei Emeltchenko8936fa62012-10-08 11:14:41 +0300541 chan->local_flush_to = L2CAP_EFS_DEFAULT_FLUSH_TO;
Andrei Emeltchenko8f7975b2011-10-13 16:18:54 +0300542
Ulisses Furquim371fd832011-12-21 20:02:36 -0200543 l2cap_chan_hold(chan);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300544
Johan Hedberg5ee98912013-04-29 19:35:43 +0300545 hci_conn_hold(conn->hcon);
546
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200547 list_add(&chan->list, &conn->chan_l);
Andrei Emeltchenko643162a2012-02-22 17:11:55 +0200548}
549
Andrei Emeltchenko466f8002012-05-29 13:59:01 +0300550void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
Andrei Emeltchenko643162a2012-02-22 17:11:55 +0200551{
552 mutex_lock(&conn->chan_lock);
553 __l2cap_chan_add(conn, chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200554 mutex_unlock(&conn->chan_lock);
Marcel Holtmann01394182006-07-03 10:02:46 +0200555}
556
Andrei Emeltchenko466f8002012-05-29 13:59:01 +0300557void l2cap_chan_del(struct l2cap_chan *chan, int err)
Marcel Holtmann01394182006-07-03 10:02:46 +0200558{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300559 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann01394182006-07-03 10:02:46 +0200560
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -0300561 __clear_chan_timer(chan);
Marcel Holtmann01394182006-07-03 10:02:46 +0200562
Gustavo F. Padovan49208c92011-04-04 15:59:54 -0300563 BT_DBG("chan %p, conn %p, err %d", chan, conn, err);
Marcel Holtmann01394182006-07-03 10:02:46 +0200564
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900565 if (conn) {
Andrei Emeltchenko56f60982012-10-15 11:58:44 +0300566 struct amp_mgr *mgr = conn->hcon->amp_mgr;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300567 /* Delete from channel list */
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200568 list_del(&chan->list);
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -0200569
Ulisses Furquim371fd832011-12-21 20:02:36 -0200570 l2cap_chan_put(chan);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300571
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300572 chan->conn = NULL;
Andrei Emeltchenko3cabbfd2012-05-31 11:01:37 +0300573
Johan Hedberg2338a7e2014-01-24 10:35:40 +0200574 if (chan->scid != L2CAP_CID_A2MP)
David Herrmann76a68ba2013-04-06 20:28:37 +0200575 hci_conn_drop(conn->hcon);
Andrei Emeltchenko56f60982012-10-15 11:58:44 +0300576
577 if (mgr && mgr->bredr_chan == chan)
578 mgr->bredr_chan = NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200579 }
580
Andrei Emeltchenko419e08c2012-10-31 15:46:34 +0200581 if (chan->hs_hchan) {
582 struct hci_chan *hs_hchan = chan->hs_hchan;
583
584 BT_DBG("chan %p disconnect hs_hchan %p", chan, hs_hchan);
585 amp_disconnect_logical_link(hs_hchan);
586 }
587
Gustavo Padovanb699ec02012-10-06 11:51:54 +0100588 chan->ops->teardown(chan, err);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200589
Mat Martineau28270112012-05-17 21:14:09 -0700590 if (test_bit(CONF_NOT_COMPLETE, &chan->conf_state))
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300591 return;
Gustavo F. Padovan2ead70b2011-04-01 15:13:36 -0300592
Gustavo Padovanee556f62012-05-18 20:22:38 -0300593 switch(chan->mode) {
594 case L2CAP_MODE_BASIC:
595 break;
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300596
Johan Hedberg38319712013-05-17 12:49:23 +0300597 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedberg177f8f22013-05-31 17:54:51 +0300598 skb_queue_purge(&chan->tx_q);
Johan Hedberg38319712013-05-17 12:49:23 +0300599 break;
600
Gustavo Padovanee556f62012-05-18 20:22:38 -0300601 case L2CAP_MODE_ERTM:
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -0300602 __clear_retrans_timer(chan);
603 __clear_monitor_timer(chan);
604 __clear_ack_timer(chan);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300605
Gustavo F. Padovanf1c67752011-03-25 20:36:10 -0300606 skb_queue_purge(&chan->srej_q);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300607
Mat Martineau3c588192012-04-11 10:48:42 -0700608 l2cap_seq_list_free(&chan->srej_list);
609 l2cap_seq_list_free(&chan->retrans_list);
Gustavo Padovanee556f62012-05-18 20:22:38 -0300610
611 /* fall through */
612
613 case L2CAP_MODE_STREAMING:
614 skb_queue_purge(&chan->tx_q);
615 break;
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300616 }
Gustavo Padovanee556f62012-05-18 20:22:38 -0300617
618 return;
Marcel Holtmann01394182006-07-03 10:02:46 +0200619}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300620EXPORT_SYMBOL_GPL(l2cap_chan_del);
Marcel Holtmann01394182006-07-03 10:02:46 +0200621
Johan Hedberg387a33e2014-02-18 21:41:33 +0200622void l2cap_conn_update_id_addr(struct hci_conn *hcon)
623{
624 struct l2cap_conn *conn = hcon->l2cap_data;
625 struct l2cap_chan *chan;
626
627 mutex_lock(&conn->chan_lock);
628
629 list_for_each_entry(chan, &conn->chan_l, list) {
630 l2cap_chan_lock(chan);
631 bacpy(&chan->dst, &hcon->dst);
632 chan->dst_type = bdaddr_type(hcon, hcon->dst_type);
633 l2cap_chan_unlock(chan);
634 }
635
636 mutex_unlock(&conn->chan_lock);
637}
638
Johan Hedberg27e2d4c2013-05-14 13:27:21 +0300639static void l2cap_chan_le_connect_reject(struct l2cap_chan *chan)
640{
641 struct l2cap_conn *conn = chan->conn;
642 struct l2cap_le_conn_rsp rsp;
643 u16 result;
644
645 if (test_bit(FLAG_DEFER_SETUP, &chan->flags))
646 result = L2CAP_CR_AUTHORIZATION;
647 else
648 result = L2CAP_CR_BAD_PSM;
649
650 l2cap_state_change(chan, BT_DISCONN);
651
652 rsp.dcid = cpu_to_le16(chan->scid);
653 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +0200654 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +0300655 rsp.credits = cpu_to_le16(chan->rx_credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +0300656 rsp.result = cpu_to_le16(result);
657
658 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp),
659 &rsp);
660}
661
Johan Hedberg791d60f2013-05-14 22:24:44 +0300662static void l2cap_chan_connect_reject(struct l2cap_chan *chan)
663{
664 struct l2cap_conn *conn = chan->conn;
665 struct l2cap_conn_rsp rsp;
666 u16 result;
667
668 if (test_bit(FLAG_DEFER_SETUP, &chan->flags))
669 result = L2CAP_CR_SEC_BLOCK;
670 else
671 result = L2CAP_CR_BAD_PSM;
672
673 l2cap_state_change(chan, BT_DISCONN);
674
675 rsp.scid = cpu_to_le16(chan->dcid);
676 rsp.dcid = cpu_to_le16(chan->scid);
677 rsp.result = cpu_to_le16(result);
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700678 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Johan Hedberg791d60f2013-05-14 22:24:44 +0300679
680 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, sizeof(rsp), &rsp);
681}
682
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300683void l2cap_chan_close(struct l2cap_chan *chan, int reason)
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300684{
685 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300686
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700687 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300688
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300689 switch (chan->state) {
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300690 case BT_LISTEN:
Gustavo Padovanb699ec02012-10-06 11:51:54 +0100691 chan->ops->teardown(chan, 0);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300692 break;
693
694 case BT_CONNECTED:
695 case BT_CONFIG:
Johan Hedberg7b25c9b2014-01-28 15:28:04 -0800696 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED) {
Gustavo Padovan8d836d72013-10-15 19:24:47 -0300697 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +0200698 l2cap_send_disconn_req(chan, reason);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300699 } else
700 l2cap_chan_del(chan, reason);
701 break;
702
703 case BT_CONNECT2:
Johan Hedberg791d60f2013-05-14 22:24:44 +0300704 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED) {
705 if (conn->hcon->type == ACL_LINK)
706 l2cap_chan_connect_reject(chan);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +0300707 else if (conn->hcon->type == LE_LINK)
708 l2cap_chan_le_connect_reject(chan);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300709 }
710
711 l2cap_chan_del(chan, reason);
712 break;
713
714 case BT_CONNECT:
715 case BT_DISCONN:
716 l2cap_chan_del(chan, reason);
717 break;
718
719 default:
Gustavo Padovanb699ec02012-10-06 11:51:54 +0100720 chan->ops->teardown(chan, 0);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300721 break;
722 }
723}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300724EXPORT_SYMBOL(l2cap_chan_close);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300725
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300726static inline u8 l2cap_get_auth_type(struct l2cap_chan *chan)
Johan Hedberg8556edd32011-01-19 12:06:50 +0530727{
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700728 switch (chan->chan_type) {
729 case L2CAP_CHAN_RAW:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300730 switch (chan->sec_level) {
Johan Hedberg8556edd32011-01-19 12:06:50 +0530731 case BT_SECURITY_HIGH:
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800732 case BT_SECURITY_FIPS:
Johan Hedberg8556edd32011-01-19 12:06:50 +0530733 return HCI_AT_DEDICATED_BONDING_MITM;
734 case BT_SECURITY_MEDIUM:
735 return HCI_AT_DEDICATED_BONDING;
736 default:
737 return HCI_AT_NO_BONDING;
738 }
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700739 break;
Marcel Holtmann3124b842013-10-12 07:19:32 -0700740 case L2CAP_CHAN_CONN_LESS:
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700741 if (chan->psm == cpu_to_le16(L2CAP_PSM_3DSP)) {
Marcel Holtmann3124b842013-10-12 07:19:32 -0700742 if (chan->sec_level == BT_SECURITY_LOW)
743 chan->sec_level = BT_SECURITY_SDP;
744 }
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800745 if (chan->sec_level == BT_SECURITY_HIGH ||
746 chan->sec_level == BT_SECURITY_FIPS)
Marcel Holtmann3124b842013-10-12 07:19:32 -0700747 return HCI_AT_NO_BONDING_MITM;
748 else
749 return HCI_AT_NO_BONDING;
750 break;
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700751 case L2CAP_CHAN_CONN_ORIENTED:
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700752 if (chan->psm == cpu_to_le16(L2CAP_PSM_SDP)) {
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700753 if (chan->sec_level == BT_SECURITY_LOW)
754 chan->sec_level = BT_SECURITY_SDP;
Johan Hedberg8556edd32011-01-19 12:06:50 +0530755
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800756 if (chan->sec_level == BT_SECURITY_HIGH ||
757 chan->sec_level == BT_SECURITY_FIPS)
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700758 return HCI_AT_NO_BONDING_MITM;
759 else
760 return HCI_AT_NO_BONDING;
761 }
762 /* fall through */
763 default:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300764 switch (chan->sec_level) {
Johan Hedberg8556edd32011-01-19 12:06:50 +0530765 case BT_SECURITY_HIGH:
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800766 case BT_SECURITY_FIPS:
Johan Hedberg8556edd32011-01-19 12:06:50 +0530767 return HCI_AT_GENERAL_BONDING_MITM;
768 case BT_SECURITY_MEDIUM:
769 return HCI_AT_GENERAL_BONDING;
770 default:
771 return HCI_AT_NO_BONDING;
772 }
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700773 break;
Johan Hedberg8556edd32011-01-19 12:06:50 +0530774 }
775}
776
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200777/* Service level security */
Gustavo F. Padovand45fc422011-11-05 19:54:24 -0200778int l2cap_chan_check_security(struct l2cap_chan *chan)
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200779{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300780 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100781 __u8 auth_type;
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200782
Johan Hedberga17de2f2013-05-14 13:25:37 +0300783 if (conn->hcon->type == LE_LINK)
784 return smp_conn_security(conn->hcon, chan->sec_level);
785
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300786 auth_type = l2cap_get_auth_type(chan);
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100787
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300788 return hci_conn_security(conn->hcon, chan->sec_level, auth_type);
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200789}
790
Johannes Bergb5ad8b72011-06-01 08:54:45 +0200791static u8 l2cap_get_ident(struct l2cap_conn *conn)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200792{
793 u8 id;
794
795 /* Get next available identificator.
796 * 1 - 128 are used by kernel.
797 * 129 - 199 are reserved.
798 * 200 - 254 are used by utilities like l2ping, etc.
799 */
800
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200801 spin_lock(&conn->lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200802
803 if (++conn->tx_ident > 128)
804 conn->tx_ident = 1;
805
806 id = conn->tx_ident;
807
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200808 spin_unlock(&conn->lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200809
810 return id;
811}
812
Gustavo Padovan2d792812012-10-06 10:07:01 +0100813static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len,
814 void *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200815{
816 struct sk_buff *skb = l2cap_build_cmd(conn, code, ident, len, data);
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +0200817 u8 flags;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200818
819 BT_DBG("code 0x%2.2x", code);
820
821 if (!skb)
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -0300822 return;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200823
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +0200824 if (lmp_no_flush_capable(conn->hcon->hdev))
825 flags = ACL_START_NO_FLUSH;
826 else
827 flags = ACL_START;
828
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700829 bt_cb(skb)->force_active = BT_POWER_FORCE_ACTIVE_ON;
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +0200830 skb->priority = HCI_PRIO_MAX;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700831
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200832 hci_send_acl(conn->hchan, skb, flags);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200833}
834
Mat Martineau02b0fbb2012-10-23 15:24:10 -0700835static bool __chan_is_moving(struct l2cap_chan *chan)
836{
837 return chan->move_state != L2CAP_MOVE_STABLE &&
838 chan->move_state != L2CAP_MOVE_WAIT_PREPARE;
839}
840
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200841static void l2cap_do_send(struct l2cap_chan *chan, struct sk_buff *skb)
842{
843 struct hci_conn *hcon = chan->conn->hcon;
844 u16 flags;
845
846 BT_DBG("chan %p, skb %p len %d priority %u", chan, skb, skb->len,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100847 skb->priority);
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200848
Mat Martineaud5f8a752012-10-23 15:24:18 -0700849 if (chan->hs_hcon && !__chan_is_moving(chan)) {
850 if (chan->hs_hchan)
851 hci_send_acl(chan->hs_hchan, skb, ACL_COMPLETE);
852 else
853 kfree_skb(skb);
854
855 return;
856 }
857
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200858 if (!test_bit(FLAG_FLUSHABLE, &chan->flags) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100859 lmp_no_flush_capable(hcon->hdev))
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200860 flags = ACL_START_NO_FLUSH;
861 else
862 flags = ACL_START;
863
864 bt_cb(skb)->force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
865 hci_send_acl(chan->conn->hchan, skb, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700866}
867
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700868static void __unpack_enhanced_control(u16 enh, struct l2cap_ctrl *control)
869{
870 control->reqseq = (enh & L2CAP_CTRL_REQSEQ) >> L2CAP_CTRL_REQSEQ_SHIFT;
871 control->final = (enh & L2CAP_CTRL_FINAL) >> L2CAP_CTRL_FINAL_SHIFT;
872
873 if (enh & L2CAP_CTRL_FRAME_TYPE) {
874 /* S-Frame */
875 control->sframe = 1;
876 control->poll = (enh & L2CAP_CTRL_POLL) >> L2CAP_CTRL_POLL_SHIFT;
877 control->super = (enh & L2CAP_CTRL_SUPERVISE) >> L2CAP_CTRL_SUPER_SHIFT;
878
879 control->sar = 0;
880 control->txseq = 0;
881 } else {
882 /* I-Frame */
883 control->sframe = 0;
884 control->sar = (enh & L2CAP_CTRL_SAR) >> L2CAP_CTRL_SAR_SHIFT;
885 control->txseq = (enh & L2CAP_CTRL_TXSEQ) >> L2CAP_CTRL_TXSEQ_SHIFT;
886
887 control->poll = 0;
888 control->super = 0;
889 }
890}
891
892static void __unpack_extended_control(u32 ext, struct l2cap_ctrl *control)
893{
894 control->reqseq = (ext & L2CAP_EXT_CTRL_REQSEQ) >> L2CAP_EXT_CTRL_REQSEQ_SHIFT;
895 control->final = (ext & L2CAP_EXT_CTRL_FINAL) >> L2CAP_EXT_CTRL_FINAL_SHIFT;
896
897 if (ext & L2CAP_EXT_CTRL_FRAME_TYPE) {
898 /* S-Frame */
899 control->sframe = 1;
900 control->poll = (ext & L2CAP_EXT_CTRL_POLL) >> L2CAP_EXT_CTRL_POLL_SHIFT;
901 control->super = (ext & L2CAP_EXT_CTRL_SUPERVISE) >> L2CAP_EXT_CTRL_SUPER_SHIFT;
902
903 control->sar = 0;
904 control->txseq = 0;
905 } else {
906 /* I-Frame */
907 control->sframe = 0;
908 control->sar = (ext & L2CAP_EXT_CTRL_SAR) >> L2CAP_EXT_CTRL_SAR_SHIFT;
909 control->txseq = (ext & L2CAP_EXT_CTRL_TXSEQ) >> L2CAP_EXT_CTRL_TXSEQ_SHIFT;
910
911 control->poll = 0;
912 control->super = 0;
913 }
914}
915
916static inline void __unpack_control(struct l2cap_chan *chan,
917 struct sk_buff *skb)
918{
919 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
920 __unpack_extended_control(get_unaligned_le32(skb->data),
921 &bt_cb(skb)->control);
Mat Martineaucec8ab6e2012-05-17 20:53:36 -0700922 skb_pull(skb, L2CAP_EXT_CTRL_SIZE);
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700923 } else {
924 __unpack_enhanced_control(get_unaligned_le16(skb->data),
925 &bt_cb(skb)->control);
Mat Martineaucec8ab6e2012-05-17 20:53:36 -0700926 skb_pull(skb, L2CAP_ENH_CTRL_SIZE);
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700927 }
928}
929
930static u32 __pack_extended_control(struct l2cap_ctrl *control)
931{
932 u32 packed;
933
934 packed = control->reqseq << L2CAP_EXT_CTRL_REQSEQ_SHIFT;
935 packed |= control->final << L2CAP_EXT_CTRL_FINAL_SHIFT;
936
937 if (control->sframe) {
938 packed |= control->poll << L2CAP_EXT_CTRL_POLL_SHIFT;
939 packed |= control->super << L2CAP_EXT_CTRL_SUPER_SHIFT;
940 packed |= L2CAP_EXT_CTRL_FRAME_TYPE;
941 } else {
942 packed |= control->sar << L2CAP_EXT_CTRL_SAR_SHIFT;
943 packed |= control->txseq << L2CAP_EXT_CTRL_TXSEQ_SHIFT;
944 }
945
946 return packed;
947}
948
949static u16 __pack_enhanced_control(struct l2cap_ctrl *control)
950{
951 u16 packed;
952
953 packed = control->reqseq << L2CAP_CTRL_REQSEQ_SHIFT;
954 packed |= control->final << L2CAP_CTRL_FINAL_SHIFT;
955
956 if (control->sframe) {
957 packed |= control->poll << L2CAP_CTRL_POLL_SHIFT;
958 packed |= control->super << L2CAP_CTRL_SUPER_SHIFT;
959 packed |= L2CAP_CTRL_FRAME_TYPE;
960 } else {
961 packed |= control->sar << L2CAP_CTRL_SAR_SHIFT;
962 packed |= control->txseq << L2CAP_CTRL_TXSEQ_SHIFT;
963 }
964
965 return packed;
966}
967
968static inline void __pack_control(struct l2cap_chan *chan,
969 struct l2cap_ctrl *control,
970 struct sk_buff *skb)
971{
972 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
973 put_unaligned_le32(__pack_extended_control(control),
974 skb->data + L2CAP_HDR_SIZE);
975 } else {
976 put_unaligned_le16(__pack_enhanced_control(control),
977 skb->data + L2CAP_HDR_SIZE);
978 }
979}
980
Gustavo Padovanba7aa642012-05-29 13:29:16 -0300981static inline unsigned int __ertm_hdr_size(struct l2cap_chan *chan)
982{
983 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
984 return L2CAP_EXT_HDR_SIZE;
985 else
986 return L2CAP_ENH_HDR_SIZE;
987}
988
Mat Martineaua67d7f62012-05-17 20:53:35 -0700989static struct sk_buff *l2cap_create_sframe_pdu(struct l2cap_chan *chan,
990 u32 control)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300991{
992 struct sk_buff *skb;
993 struct l2cap_hdr *lh;
Gustavo Padovanba7aa642012-05-29 13:29:16 -0300994 int hlen = __ertm_hdr_size(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300995
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300996 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +0300997 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300998
Mat Martineaua67d7f62012-05-17 20:53:35 -0700999 skb = bt_skb_alloc(hlen, GFP_KERNEL);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001000
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001001 if (!skb)
Mat Martineaua67d7f62012-05-17 20:53:35 -07001002 return ERR_PTR(-ENOMEM);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001003
1004 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001005 lh->len = cpu_to_le16(hlen - L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001006 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03001007
Mat Martineaua67d7f62012-05-17 20:53:35 -07001008 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
1009 put_unaligned_le32(control, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
1010 else
1011 put_unaligned_le16(control, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001012
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001013 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineaua67d7f62012-05-17 20:53:35 -07001014 u16 fcs = crc16(0, (u8 *)skb->data, skb->len);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03001015 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001016 }
1017
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001018 skb->priority = HCI_PRIO_MAX;
Mat Martineaua67d7f62012-05-17 20:53:35 -07001019 return skb;
1020}
1021
1022static void l2cap_send_sframe(struct l2cap_chan *chan,
1023 struct l2cap_ctrl *control)
1024{
1025 struct sk_buff *skb;
1026 u32 control_field;
1027
1028 BT_DBG("chan %p, control %p", chan, control);
1029
1030 if (!control->sframe)
1031 return;
1032
Mat Martineaub99e13a2012-10-23 15:24:19 -07001033 if (__chan_is_moving(chan))
1034 return;
1035
Mat Martineaua67d7f62012-05-17 20:53:35 -07001036 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state) &&
1037 !control->poll)
1038 control->final = 1;
1039
1040 if (control->super == L2CAP_SUPER_RR)
1041 clear_bit(CONN_RNR_SENT, &chan->conn_state);
1042 else if (control->super == L2CAP_SUPER_RNR)
1043 set_bit(CONN_RNR_SENT, &chan->conn_state);
1044
1045 if (control->super != L2CAP_SUPER_SREJ) {
1046 chan->last_acked_seq = control->reqseq;
1047 __clear_ack_timer(chan);
1048 }
1049
1050 BT_DBG("reqseq %d, final %d, poll %d, super %d", control->reqseq,
1051 control->final, control->poll, control->super);
1052
1053 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
1054 control_field = __pack_extended_control(control);
1055 else
1056 control_field = __pack_enhanced_control(control);
1057
1058 skb = l2cap_create_sframe_pdu(chan, control_field);
1059 if (!IS_ERR(skb))
1060 l2cap_do_send(chan, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001061}
1062
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001063static void l2cap_send_rr_or_rnr(struct l2cap_chan *chan, bool poll)
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001064{
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001065 struct l2cap_ctrl control;
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001066
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001067 BT_DBG("chan %p, poll %d", chan, poll);
1068
1069 memset(&control, 0, sizeof(control));
1070 control.sframe = 1;
1071 control.poll = poll;
1072
1073 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
1074 control.super = L2CAP_SUPER_RNR;
1075 else
1076 control.super = L2CAP_SUPER_RR;
1077
1078 control.reqseq = chan->buffer_seq;
1079 l2cap_send_sframe(chan, &control);
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001080}
1081
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001082static inline int __l2cap_no_conn_pending(struct l2cap_chan *chan)
Andrei Emeltchenkoe501d052010-07-08 12:14:41 +03001083{
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001084 return !test_bit(CONF_CONNECT_PEND, &chan->conf_state);
Andrei Emeltchenkoe501d052010-07-08 12:14:41 +03001085}
1086
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001087static bool __amp_capable(struct l2cap_chan *chan)
1088{
1089 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann1df7b172013-10-05 11:47:49 -07001090 struct hci_dev *hdev;
1091 bool amp_available = false;
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001092
Marcel Holtmann1df7b172013-10-05 11:47:49 -07001093 if (!conn->hs_enabled)
1094 return false;
1095
1096 if (!(conn->fixed_chan_mask & L2CAP_FC_A2MP))
1097 return false;
1098
1099 read_lock(&hci_dev_list_lock);
1100 list_for_each_entry(hdev, &hci_dev_list, list) {
1101 if (hdev->amp_type != AMP_TYPE_BREDR &&
1102 test_bit(HCI_UP, &hdev->flags)) {
1103 amp_available = true;
1104 break;
1105 }
1106 }
1107 read_unlock(&hci_dev_list_lock);
1108
1109 if (chan->chan_policy == BT_CHANNEL_POLICY_AMP_PREFERRED)
1110 return amp_available;
Marcel Holtmann848566b2013-10-01 22:59:22 -07001111
1112 return false;
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001113}
1114
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02001115static bool l2cap_check_efs(struct l2cap_chan *chan)
1116{
1117 /* Check EFS parameters */
1118 return true;
1119}
1120
Andrei Emeltchenko2766be42012-09-27 17:26:21 +03001121void l2cap_send_conn_req(struct l2cap_chan *chan)
Andrei Emeltchenko9b27f352012-02-24 16:00:00 +02001122{
1123 struct l2cap_conn *conn = chan->conn;
1124 struct l2cap_conn_req req;
1125
1126 req.scid = cpu_to_le16(chan->scid);
1127 req.psm = chan->psm;
1128
1129 chan->ident = l2cap_get_ident(conn);
1130
1131 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
1132
1133 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_REQ, sizeof(req), &req);
1134}
1135
Mat Martineau8eb200b2012-10-23 15:24:17 -07001136static void l2cap_send_create_chan_req(struct l2cap_chan *chan, u8 amp_id)
1137{
1138 struct l2cap_create_chan_req req;
1139 req.scid = cpu_to_le16(chan->scid);
1140 req.psm = chan->psm;
1141 req.amp_id = amp_id;
1142
1143 chan->ident = l2cap_get_ident(chan->conn);
1144
1145 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_REQ,
1146 sizeof(req), &req);
1147}
1148
Mat Martineau02b0fbb2012-10-23 15:24:10 -07001149static void l2cap_move_setup(struct l2cap_chan *chan)
1150{
1151 struct sk_buff *skb;
1152
1153 BT_DBG("chan %p", chan);
1154
1155 if (chan->mode != L2CAP_MODE_ERTM)
1156 return;
1157
1158 __clear_retrans_timer(chan);
1159 __clear_monitor_timer(chan);
1160 __clear_ack_timer(chan);
1161
1162 chan->retry_count = 0;
1163 skb_queue_walk(&chan->tx_q, skb) {
1164 if (bt_cb(skb)->control.retries)
1165 bt_cb(skb)->control.retries = 1;
1166 else
1167 break;
1168 }
1169
1170 chan->expected_tx_seq = chan->buffer_seq;
1171
1172 clear_bit(CONN_REJ_ACT, &chan->conn_state);
1173 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
1174 l2cap_seq_list_clear(&chan->retrans_list);
1175 l2cap_seq_list_clear(&chan->srej_list);
1176 skb_queue_purge(&chan->srej_q);
1177
1178 chan->tx_state = L2CAP_TX_STATE_XMIT;
1179 chan->rx_state = L2CAP_RX_STATE_MOVE;
1180
1181 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
1182}
1183
Mat Martineau5f3847a2012-10-23 15:24:12 -07001184static void l2cap_move_done(struct l2cap_chan *chan)
1185{
1186 u8 move_role = chan->move_role;
1187 BT_DBG("chan %p", chan);
1188
1189 chan->move_state = L2CAP_MOVE_STABLE;
1190 chan->move_role = L2CAP_MOVE_ROLE_NONE;
1191
1192 if (chan->mode != L2CAP_MODE_ERTM)
1193 return;
1194
1195 switch (move_role) {
1196 case L2CAP_MOVE_ROLE_INITIATOR:
1197 l2cap_tx(chan, NULL, NULL, L2CAP_EV_EXPLICIT_POLL);
1198 chan->rx_state = L2CAP_RX_STATE_WAIT_F;
1199 break;
1200 case L2CAP_MOVE_ROLE_RESPONDER:
1201 chan->rx_state = L2CAP_RX_STATE_WAIT_P;
1202 break;
1203 }
1204}
1205
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001206static void l2cap_chan_ready(struct l2cap_chan *chan)
1207{
Mat Martineau28270112012-05-17 21:14:09 -07001208 /* This clears all conf flags, including CONF_NOT_COMPLETE */
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001209 chan->conf_state = 0;
1210 __clear_chan_timer(chan);
1211
Johan Hedberg0ce43ce2013-12-05 14:55:33 +02001212 if (chan->mode == L2CAP_MODE_LE_FLOWCTL && !chan->tx_credits)
1213 chan->ops->suspend(chan);
Johan Hedberg177f8f22013-05-31 17:54:51 +03001214
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001215 chan->state = BT_CONNECTED;
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001216
Andrei Emeltchenkofd83e2c2012-05-30 09:55:32 +03001217 chan->ops->ready(chan);
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001218}
1219
Johan Hedbergf1496de2013-05-13 14:15:56 +03001220static void l2cap_le_connect(struct l2cap_chan *chan)
1221{
1222 struct l2cap_conn *conn = chan->conn;
1223 struct l2cap_le_conn_req req;
1224
Johan Hedberg595177f2013-12-02 22:12:22 +02001225 if (test_and_set_bit(FLAG_LE_CONN_REQ_SENT, &chan->flags))
1226 return;
1227
Johan Hedbergf1496de2013-05-13 14:15:56 +03001228 req.psm = chan->psm;
1229 req.scid = cpu_to_le16(chan->scid);
1230 req.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02001231 req.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03001232 req.credits = cpu_to_le16(chan->rx_credits);
Johan Hedbergf1496de2013-05-13 14:15:56 +03001233
1234 chan->ident = l2cap_get_ident(conn);
1235
1236 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_REQ,
1237 sizeof(req), &req);
1238}
1239
1240static void l2cap_le_start(struct l2cap_chan *chan)
1241{
1242 struct l2cap_conn *conn = chan->conn;
1243
1244 if (!smp_conn_security(conn->hcon, chan->sec_level))
1245 return;
1246
1247 if (!chan->psm) {
1248 l2cap_chan_ready(chan);
1249 return;
1250 }
1251
1252 if (chan->state == BT_CONNECT)
1253 l2cap_le_connect(chan);
1254}
1255
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001256static void l2cap_start_connection(struct l2cap_chan *chan)
1257{
1258 if (__amp_capable(chan)) {
1259 BT_DBG("chan %p AMP capable: discover AMPs", chan);
1260 a2mp_discover_amp(chan);
Johan Hedbergf1496de2013-05-13 14:15:56 +03001261 } else if (chan->conn->hcon->type == LE_LINK) {
1262 l2cap_le_start(chan);
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001263 } else {
1264 l2cap_send_conn_req(chan);
1265 }
1266}
1267
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001268static void l2cap_do_start(struct l2cap_chan *chan)
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001269{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03001270 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001271
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001272 if (conn->hcon->type == LE_LINK) {
Johan Hedberg96ac34f2013-05-13 11:15:07 +03001273 l2cap_le_start(chan);
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001274 return;
1275 }
1276
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001277 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) {
Marcel Holtmann984947d2009-02-06 23:35:19 +01001278 if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE))
1279 return;
1280
Gustavo F. Padovand45fc422011-11-05 19:54:24 -02001281 if (l2cap_chan_check_security(chan) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01001282 __l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001283 l2cap_start_connection(chan);
1284 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001285 } else {
1286 struct l2cap_info_req req;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001287 req.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001288
1289 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
1290 conn->info_ident = l2cap_get_ident(conn);
1291
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08001292 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001293
Gustavo Padovan2d792812012-10-06 10:07:01 +01001294 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
1295 sizeof(req), &req);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001296 }
1297}
1298
Gustavo F. Padovancf6c2c02010-06-07 20:54:45 -03001299static inline int l2cap_mode_supported(__u8 mode, __u32 feat_mask)
1300{
1301 u32 local_feat_mask = l2cap_feat_mask;
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03001302 if (!disable_ertm)
Gustavo F. Padovancf6c2c02010-06-07 20:54:45 -03001303 local_feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING;
1304
1305 switch (mode) {
1306 case L2CAP_MODE_ERTM:
1307 return L2CAP_FEAT_ERTM & feat_mask & local_feat_mask;
1308 case L2CAP_MODE_STREAMING:
1309 return L2CAP_FEAT_STREAMING & feat_mask & local_feat_mask;
1310 default:
1311 return 0x00;
1312 }
1313}
1314
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001315static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err)
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001316{
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001317 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001318 struct l2cap_disconn_req req;
1319
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001320 if (!conn)
1321 return;
1322
Andrei Emeltchenkoaad3d0e2012-09-06 15:05:42 +03001323 if (chan->mode == L2CAP_MODE_ERTM && chan->state == BT_CONNECTED) {
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03001324 __clear_retrans_timer(chan);
1325 __clear_monitor_timer(chan);
1326 __clear_ack_timer(chan);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001327 }
1328
Johan Hedberg2338a7e2014-01-24 10:35:40 +02001329 if (chan->scid == L2CAP_CID_A2MP) {
Gustavo Padovand1177732012-10-06 11:47:38 +01001330 l2cap_state_change(chan, BT_DISCONN);
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001331 return;
1332 }
1333
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001334 req.dcid = cpu_to_le16(chan->dcid);
1335 req.scid = cpu_to_le16(chan->scid);
Gustavo Padovan2d792812012-10-06 10:07:01 +01001336 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_DISCONN_REQ,
1337 sizeof(req), &req);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001338
Gustavo Padovanf8e73012013-10-15 19:24:46 -03001339 l2cap_state_change_and_error(chan, BT_DISCONN, err);
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001340}
1341
Linus Torvalds1da177e2005-04-16 15:20:36 -07001342/* ---- L2CAP connections ---- */
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001343static void l2cap_conn_start(struct l2cap_conn *conn)
1344{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001345 struct l2cap_chan *chan, *tmp;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001346
1347 BT_DBG("conn %p", conn);
1348
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001349 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001350
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001351 list_for_each_entry_safe(chan, tmp, &conn->chan_l, list) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001352 l2cap_chan_lock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001353
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001354 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001355 l2cap_chan_unlock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001356 continue;
1357 }
1358
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001359 if (chan->state == BT_CONNECT) {
Gustavo F. Padovand45fc422011-11-05 19:54:24 -02001360 if (!l2cap_chan_check_security(chan) ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01001361 !__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001362 l2cap_chan_unlock(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001363 continue;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02001364 }
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001365
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001366 if (!l2cap_mode_supported(chan->mode, conn->feat_mask)
Gustavo Padovan2d792812012-10-06 10:07:01 +01001367 && test_bit(CONF_STATE2_DEVICE,
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001368 &chan->conf_state)) {
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001369 l2cap_chan_close(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001370 l2cap_chan_unlock(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001371 continue;
1372 }
1373
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001374 l2cap_start_connection(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001375
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001376 } else if (chan->state == BT_CONNECT2) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001377 struct l2cap_conn_rsp rsp;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001378 char buf[128];
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001379 rsp.scid = cpu_to_le16(chan->dcid);
1380 rsp.dcid = cpu_to_le16(chan->scid);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001381
Gustavo F. Padovand45fc422011-11-05 19:54:24 -02001382 if (l2cap_chan_check_security(chan)) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07001383 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001384 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
1385 rsp.status = cpu_to_le16(L2CAP_CS_AUTHOR_PEND);
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001386 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001387
1388 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001389 l2cap_state_change(chan, BT_CONFIG);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001390 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
1391 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001392 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001393 } else {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001394 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
1395 rsp.status = cpu_to_le16(L2CAP_CS_AUTHEN_PEND);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001396 }
1397
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001398 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001399 sizeof(rsp), &rsp);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001400
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001401 if (test_bit(CONF_REQ_SENT, &chan->conf_state) ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01001402 rsp.result != L2CAP_CR_SUCCESS) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001403 l2cap_chan_unlock(chan);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001404 continue;
1405 }
1406
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001407 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001408 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001409 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03001410 chan->num_conf_req++;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001411 }
1412
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001413 l2cap_chan_unlock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001414 }
1415
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001416 mutex_unlock(&conn->chan_lock);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001417}
1418
Ido Yarivc2287682012-04-20 15:46:07 -03001419/* Find socket with cid and source/destination bdaddr.
Ville Tervob62f3282011-02-10 22:38:50 -03001420 * Returns closest match, locked.
1421 */
Andrei Emeltchenkod9b88702012-03-12 12:13:08 +02001422static struct l2cap_chan *l2cap_global_chan_by_scid(int state, u16 cid,
Ido Yarivc2287682012-04-20 15:46:07 -03001423 bdaddr_t *src,
1424 bdaddr_t *dst)
Ville Tervob62f3282011-02-10 22:38:50 -03001425{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001426 struct l2cap_chan *c, *c1 = NULL;
Ville Tervob62f3282011-02-10 22:38:50 -03001427
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001428 read_lock(&chan_list_lock);
Ville Tervob62f3282011-02-10 22:38:50 -03001429
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001430 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001431 if (state && c->state != state)
Ville Tervob62f3282011-02-10 22:38:50 -03001432 continue;
1433
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001434 if (c->scid == cid) {
Ido Yarivc2287682012-04-20 15:46:07 -03001435 int src_match, dst_match;
1436 int src_any, dst_any;
1437
Ville Tervob62f3282011-02-10 22:38:50 -03001438 /* Exact match. */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001439 src_match = !bacmp(&c->src, src);
1440 dst_match = !bacmp(&c->dst, dst);
Ido Yarivc2287682012-04-20 15:46:07 -03001441 if (src_match && dst_match) {
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001442 read_unlock(&chan_list_lock);
1443 return c;
1444 }
Ville Tervob62f3282011-02-10 22:38:50 -03001445
1446 /* Closest match */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001447 src_any = !bacmp(&c->src, BDADDR_ANY);
1448 dst_any = !bacmp(&c->dst, BDADDR_ANY);
Ido Yarivc2287682012-04-20 15:46:07 -03001449 if ((src_match && dst_any) || (src_any && dst_match) ||
1450 (src_any && dst_any))
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001451 c1 = c;
Ville Tervob62f3282011-02-10 22:38:50 -03001452 }
1453 }
Gustavo F. Padovan280f2942011-04-13 19:01:22 -03001454
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001455 read_unlock(&chan_list_lock);
Ville Tervob62f3282011-02-10 22:38:50 -03001456
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001457 return c1;
Ville Tervob62f3282011-02-10 22:38:50 -03001458}
1459
1460static void l2cap_le_conn_ready(struct l2cap_conn *conn)
1461{
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001462 struct hci_conn *hcon = conn->hcon;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001463 struct l2cap_chan *chan, *pchan;
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001464 u8 dst_type;
Ville Tervob62f3282011-02-10 22:38:50 -03001465
1466 BT_DBG("");
1467
1468 /* Check if we have socket listening on cid */
Johan Hedberg073d1cf2013-04-29 19:35:35 +03001469 pchan = l2cap_global_chan_by_scid(BT_LISTEN, L2CAP_CID_ATT,
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001470 &hcon->src, &hcon->dst);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001471 if (!pchan)
Ville Tervob62f3282011-02-10 22:38:50 -03001472 return;
1473
Johan Hedberg44f3b0f2013-04-29 19:35:45 +03001474 /* Client ATT sockets should override the server one */
1475 if (__l2cap_get_chan_by_dcid(conn, L2CAP_CID_ATT))
1476 return;
1477
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001478 dst_type = bdaddr_type(hcon, hcon->dst_type);
1479
1480 /* If device is blocked, do not create a channel for it */
1481 if (hci_blacklist_lookup(hcon->hdev, &hcon->dst, dst_type))
1482 return;
1483
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001484 l2cap_chan_lock(pchan);
Gustavo F. Padovan62f3a2c2011-04-14 18:34:34 -03001485
Gustavo Padovan80b98022012-05-27 22:27:51 -03001486 chan = pchan->ops->new_connection(pchan);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001487 if (!chan)
Ville Tervob62f3282011-02-10 22:38:50 -03001488 goto clean;
1489
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001490 bacpy(&chan->src, &hcon->src);
1491 bacpy(&chan->dst, &hcon->dst);
1492 chan->src_type = bdaddr_type(hcon, hcon->src_type);
1493 chan->dst_type = dst_type;
Ville Tervob62f3282011-02-10 22:38:50 -03001494
Johan Hedberg44f3b0f2013-04-29 19:35:45 +03001495 __l2cap_chan_add(conn, chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001496
Ville Tervob62f3282011-02-10 22:38:50 -03001497clean:
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001498 l2cap_chan_unlock(pchan);
Ville Tervob62f3282011-02-10 22:38:50 -03001499}
1500
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001501static void l2cap_conn_ready(struct l2cap_conn *conn)
1502{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001503 struct l2cap_chan *chan;
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001504 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001505
1506 BT_DBG("conn %p", conn);
1507
Johan Hedbergd8729922013-04-29 19:35:39 +03001508 /* For outgoing pairing which doesn't necessarily have an
1509 * associated socket (e.g. mgmt_pair_device).
1510 */
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001511 if (hcon->out && hcon->type == LE_LINK)
1512 smp_conn_security(hcon, hcon->pending_sec_level);
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03001513
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001514 mutex_lock(&conn->chan_lock);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001515
Johan Hedberg44f3b0f2013-04-29 19:35:45 +03001516 if (hcon->type == LE_LINK)
1517 l2cap_le_conn_ready(conn);
1518
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001519 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03001520
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001521 l2cap_chan_lock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001522
Johan Hedberg2338a7e2014-01-24 10:35:40 +02001523 if (chan->scid == L2CAP_CID_A2MP) {
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001524 l2cap_chan_unlock(chan);
1525 continue;
1526 }
1527
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001528 if (hcon->type == LE_LINK) {
Johan Hedbergf1496de2013-05-13 14:15:56 +03001529 l2cap_le_start(chan);
Vinicius Costa Gomes63128452011-06-17 22:46:26 -03001530 } else if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Gustavo Padovan74e75742013-10-15 19:24:51 -03001531 l2cap_chan_ready(chan);
Anderson Brigliab501d6a2011-06-07 18:46:31 -03001532
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001533 } else if (chan->state == BT_CONNECT) {
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001534 l2cap_do_start(chan);
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001535 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001536
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001537 l2cap_chan_unlock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001538 }
1539
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001540 mutex_unlock(&conn->chan_lock);
Johan Hedberg61a939c2014-01-17 20:45:11 +02001541
1542 queue_work(hcon->hdev->workqueue, &conn->pending_rx_work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001543}
1544
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001545/* Notify sockets that we cannot guaranty reliability anymore */
1546static void l2cap_conn_unreliable(struct l2cap_conn *conn, int err)
1547{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001548 struct l2cap_chan *chan;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001549
1550 BT_DBG("conn %p", conn);
1551
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001552 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001553
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001554 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +03001555 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo Padovan1d8b1fd2012-10-06 11:34:52 +01001556 l2cap_chan_set_err(chan, err);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001557 }
1558
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001559 mutex_unlock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001560}
1561
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001562static void l2cap_info_timeout(struct work_struct *work)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001563{
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001564 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001565 info_timer.work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001566
Marcel Holtmann984947d2009-02-06 23:35:19 +01001567 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01001568 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01001569
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001570 l2cap_conn_start(conn);
1571}
1572
David Herrmann2c8e1412013-04-06 20:28:45 +02001573/*
1574 * l2cap_user
1575 * External modules can register l2cap_user objects on l2cap_conn. The ->probe
1576 * callback is called during registration. The ->remove callback is called
1577 * during unregistration.
1578 * An l2cap_user object can either be explicitly unregistered or when the
1579 * underlying l2cap_conn object is deleted. This guarantees that l2cap->hcon,
1580 * l2cap->hchan, .. are valid as long as the remove callback hasn't been called.
1581 * External modules must own a reference to the l2cap_conn object if they intend
1582 * to call l2cap_unregister_user(). The l2cap_conn object might get destroyed at
1583 * any time if they don't.
1584 */
1585
1586int l2cap_register_user(struct l2cap_conn *conn, struct l2cap_user *user)
1587{
1588 struct hci_dev *hdev = conn->hcon->hdev;
1589 int ret;
1590
1591 /* We need to check whether l2cap_conn is registered. If it is not, we
1592 * must not register the l2cap_user. l2cap_conn_del() is unregisters
1593 * l2cap_conn objects, but doesn't provide its own locking. Instead, it
1594 * relies on the parent hci_conn object to be locked. This itself relies
1595 * on the hci_dev object to be locked. So we must lock the hci device
1596 * here, too. */
1597
1598 hci_dev_lock(hdev);
1599
1600 if (user->list.next || user->list.prev) {
1601 ret = -EINVAL;
1602 goto out_unlock;
1603 }
1604
1605 /* conn->hchan is NULL after l2cap_conn_del() was called */
1606 if (!conn->hchan) {
1607 ret = -ENODEV;
1608 goto out_unlock;
1609 }
1610
1611 ret = user->probe(conn, user);
1612 if (ret)
1613 goto out_unlock;
1614
1615 list_add(&user->list, &conn->users);
1616 ret = 0;
1617
1618out_unlock:
1619 hci_dev_unlock(hdev);
1620 return ret;
1621}
1622EXPORT_SYMBOL(l2cap_register_user);
1623
1624void l2cap_unregister_user(struct l2cap_conn *conn, struct l2cap_user *user)
1625{
1626 struct hci_dev *hdev = conn->hcon->hdev;
1627
1628 hci_dev_lock(hdev);
1629
1630 if (!user->list.next || !user->list.prev)
1631 goto out_unlock;
1632
1633 list_del(&user->list);
1634 user->list.next = NULL;
1635 user->list.prev = NULL;
1636 user->remove(conn, user);
1637
1638out_unlock:
1639 hci_dev_unlock(hdev);
1640}
1641EXPORT_SYMBOL(l2cap_unregister_user);
1642
1643static void l2cap_unregister_all_users(struct l2cap_conn *conn)
1644{
1645 struct l2cap_user *user;
1646
1647 while (!list_empty(&conn->users)) {
1648 user = list_first_entry(&conn->users, struct l2cap_user, list);
1649 list_del(&user->list);
1650 user->list.next = NULL;
1651 user->list.prev = NULL;
1652 user->remove(conn, user);
1653 }
1654}
1655
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001656static void l2cap_conn_del(struct hci_conn *hcon, int err)
1657{
1658 struct l2cap_conn *conn = hcon->l2cap_data;
1659 struct l2cap_chan *chan, *l;
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001660
1661 if (!conn)
1662 return;
1663
1664 BT_DBG("hcon %p conn %p, err %d", hcon, conn, err);
1665
1666 kfree_skb(conn->rx_skb);
1667
Johan Hedberg61a939c2014-01-17 20:45:11 +02001668 skb_queue_purge(&conn->pending_rx);
Jukka Taimisto7ab56c32014-06-12 10:15:13 +00001669
1670 /* We can not call flush_work(&conn->pending_rx_work) here since we
1671 * might block if we are running on a worker from the same workqueue
1672 * pending_rx_work is waiting on.
1673 */
1674 if (work_pending(&conn->pending_rx_work))
1675 cancel_work_sync(&conn->pending_rx_work);
Johan Hedberg61a939c2014-01-17 20:45:11 +02001676
David Herrmann2c8e1412013-04-06 20:28:45 +02001677 l2cap_unregister_all_users(conn);
1678
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001679 mutex_lock(&conn->chan_lock);
1680
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001681 /* Kill channels */
1682 list_for_each_entry_safe(chan, l, &conn->chan_l, list) {
Mat Martineau61d6ef32012-04-27 16:50:50 -07001683 l2cap_chan_hold(chan);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001684 l2cap_chan_lock(chan);
1685
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001686 l2cap_chan_del(chan, err);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001687
1688 l2cap_chan_unlock(chan);
1689
Gustavo Padovan80b98022012-05-27 22:27:51 -03001690 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07001691 l2cap_chan_put(chan);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001692 }
1693
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001694 mutex_unlock(&conn->chan_lock);
1695
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001696 hci_chan_del(conn->hchan);
1697
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001698 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT)
Ulisses Furquim127074b2012-01-30 18:26:29 -02001699 cancel_delayed_work_sync(&conn->info_timer);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001700
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001701 if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags)) {
Ulisses Furquim127074b2012-01-30 18:26:29 -02001702 cancel_delayed_work_sync(&conn->security_timer);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001703 smp_chan_destroy(conn);
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001704 }
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001705
1706 hcon->l2cap_data = NULL;
David Herrmann9c903e32013-04-06 20:28:44 +02001707 conn->hchan = NULL;
1708 l2cap_conn_put(conn);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001709}
1710
Gustavo F. Padovan6c9d42a2011-12-20 10:57:27 -02001711static void security_timeout(struct work_struct *work)
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001712{
Gustavo F. Padovan6c9d42a2011-12-20 10:57:27 -02001713 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001714 security_timer.work);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001715
Johan Hedbergd06cc412012-06-06 18:44:11 +08001716 BT_DBG("conn %p", conn);
1717
1718 if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags)) {
1719 smp_chan_destroy(conn);
1720 l2cap_conn_del(conn->hcon, ETIMEDOUT);
1721 }
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001722}
1723
David Herrmann9c903e32013-04-06 20:28:44 +02001724static void l2cap_conn_free(struct kref *ref)
1725{
1726 struct l2cap_conn *conn = container_of(ref, struct l2cap_conn, ref);
1727
1728 hci_conn_put(conn->hcon);
1729 kfree(conn);
1730}
1731
1732void l2cap_conn_get(struct l2cap_conn *conn)
1733{
1734 kref_get(&conn->ref);
1735}
1736EXPORT_SYMBOL(l2cap_conn_get);
1737
1738void l2cap_conn_put(struct l2cap_conn *conn)
1739{
1740 kref_put(&conn->ref, l2cap_conn_free);
1741}
1742EXPORT_SYMBOL(l2cap_conn_put);
1743
Linus Torvalds1da177e2005-04-16 15:20:36 -07001744/* ---- Socket interface ---- */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001745
Ido Yarivc2287682012-04-20 15:46:07 -03001746/* Find socket with psm and source / destination bdaddr.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001747 * Returns closest match.
1748 */
Ido Yarivc2287682012-04-20 15:46:07 -03001749static struct l2cap_chan *l2cap_global_chan_by_psm(int state, __le16 psm,
1750 bdaddr_t *src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001751 bdaddr_t *dst,
1752 u8 link_type)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001753{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001754 struct l2cap_chan *c, *c1 = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001755
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001756 read_lock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001757
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001758 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001759 if (state && c->state != state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001760 continue;
1761
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001762 if (link_type == ACL_LINK && c->src_type != BDADDR_BREDR)
1763 continue;
1764
1765 if (link_type == LE_LINK && c->src_type == BDADDR_BREDR)
1766 continue;
1767
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001768 if (c->psm == psm) {
Ido Yarivc2287682012-04-20 15:46:07 -03001769 int src_match, dst_match;
1770 int src_any, dst_any;
1771
Linus Torvalds1da177e2005-04-16 15:20:36 -07001772 /* Exact match. */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001773 src_match = !bacmp(&c->src, src);
1774 dst_match = !bacmp(&c->dst, dst);
Ido Yarivc2287682012-04-20 15:46:07 -03001775 if (src_match && dst_match) {
Johannes Berga7567b22011-06-01 08:29:54 +02001776 read_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001777 return c;
1778 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001779
1780 /* Closest match */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001781 src_any = !bacmp(&c->src, BDADDR_ANY);
1782 dst_any = !bacmp(&c->dst, BDADDR_ANY);
Ido Yarivc2287682012-04-20 15:46:07 -03001783 if ((src_match && dst_any) || (src_any && dst_match) ||
1784 (src_any && dst_any))
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001785 c1 = c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001786 }
1787 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001788
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001789 read_unlock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001790
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001791 return c1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001792}
1793
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001794static void l2cap_monitor_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001795{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001796 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001797 monitor_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001798
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03001799 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001800
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001801 l2cap_chan_lock(chan);
1802
Mat Martineau80909e02012-05-17 20:53:50 -07001803 if (!chan->conn) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001804 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001805 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001806 return;
1807 }
1808
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001809 l2cap_tx(chan, NULL, NULL, L2CAP_EV_MONITOR_TO);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001810
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001811 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001812 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001813}
1814
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001815static void l2cap_retrans_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001816{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001817 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001818 retrans_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001819
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03001820 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001821
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001822 l2cap_chan_lock(chan);
1823
Mat Martineau80909e02012-05-17 20:53:50 -07001824 if (!chan->conn) {
1825 l2cap_chan_unlock(chan);
1826 l2cap_chan_put(chan);
1827 return;
1828 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001829
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001830 l2cap_tx(chan, NULL, NULL, L2CAP_EV_RETRANS_TO);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001831 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001832 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001833}
1834
Gustavo Padovand6603662012-05-21 13:58:22 -03001835static void l2cap_streaming_send(struct l2cap_chan *chan,
1836 struct sk_buff_head *skbs)
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001837{
Gustavo F. Padovanccbb84a2010-08-30 18:44:44 -03001838 struct sk_buff *skb;
Mat Martineau37339372012-05-17 20:53:33 -07001839 struct l2cap_ctrl *control;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001840
Mat Martineau37339372012-05-17 20:53:33 -07001841 BT_DBG("chan %p, skbs %p", chan, skbs);
1842
Mat Martineaub99e13a2012-10-23 15:24:19 -07001843 if (__chan_is_moving(chan))
1844 return;
1845
Mat Martineau37339372012-05-17 20:53:33 -07001846 skb_queue_splice_tail_init(skbs, &chan->tx_q);
1847
1848 while (!skb_queue_empty(&chan->tx_q)) {
1849
1850 skb = skb_dequeue(&chan->tx_q);
1851
1852 bt_cb(skb)->control.retries = 1;
1853 control = &bt_cb(skb)->control;
1854
1855 control->reqseq = 0;
1856 control->txseq = chan->next_tx_seq;
1857
1858 __pack_control(chan, control, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001859
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001860 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau37339372012-05-17 20:53:33 -07001861 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1862 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001863 }
1864
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001865 l2cap_do_send(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001866
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001867 BT_DBG("Sent txseq %u", control->txseq);
Mat Martineau37339372012-05-17 20:53:33 -07001868
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001869 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau37339372012-05-17 20:53:33 -07001870 chan->frames_sent++;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001871 }
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001872}
1873
Szymon Janc67c9e842011-07-28 16:24:33 +02001874static int l2cap_ertm_send(struct l2cap_chan *chan)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001875{
1876 struct sk_buff *skb, *tx_skb;
Mat Martineau18a48e72012-05-17 20:53:34 -07001877 struct l2cap_ctrl *control;
1878 int sent = 0;
1879
1880 BT_DBG("chan %p", chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001881
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001882 if (chan->state != BT_CONNECTED)
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001883 return -ENOTCONN;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001884
Mat Martineau94122bb2012-05-02 09:42:02 -07001885 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1886 return 0;
1887
Mat Martineaub99e13a2012-10-23 15:24:19 -07001888 if (__chan_is_moving(chan))
1889 return 0;
1890
Mat Martineau18a48e72012-05-17 20:53:34 -07001891 while (chan->tx_send_head &&
1892 chan->unacked_frames < chan->remote_tx_win &&
1893 chan->tx_state == L2CAP_TX_STATE_XMIT) {
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001894
Mat Martineau18a48e72012-05-17 20:53:34 -07001895 skb = chan->tx_send_head;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001896
Mat Martineau18a48e72012-05-17 20:53:34 -07001897 bt_cb(skb)->control.retries = 1;
1898 control = &bt_cb(skb)->control;
Gustavo F. Padovan95ffa972010-06-18 20:37:33 -03001899
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001900 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
Mat Martineau18a48e72012-05-17 20:53:34 -07001901 control->final = 1;
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001902
Mat Martineau18a48e72012-05-17 20:53:34 -07001903 control->reqseq = chan->buffer_seq;
1904 chan->last_acked_seq = chan->buffer_seq;
1905 control->txseq = chan->next_tx_seq;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001906
Mat Martineau18a48e72012-05-17 20:53:34 -07001907 __pack_control(chan, control, skb);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001908
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001909 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau18a48e72012-05-17 20:53:34 -07001910 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1911 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001912 }
1913
Mat Martineau18a48e72012-05-17 20:53:34 -07001914 /* Clone after data has been modified. Data is assumed to be
1915 read-only (for locking purposes) on cloned sk_buffs.
1916 */
1917 tx_skb = skb_clone(skb, GFP_KERNEL);
1918
1919 if (!tx_skb)
1920 break;
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -03001921
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03001922 __set_retrans_timer(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001923
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001924 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau18a48e72012-05-17 20:53:34 -07001925 chan->unacked_frames++;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03001926 chan->frames_sent++;
Mat Martineau18a48e72012-05-17 20:53:34 -07001927 sent++;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001928
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001929 if (skb_queue_is_last(&chan->tx_q, skb))
1930 chan->tx_send_head = NULL;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001931 else
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001932 chan->tx_send_head = skb_queue_next(&chan->tx_q, skb);
Mat Martineau18a48e72012-05-17 20:53:34 -07001933
1934 l2cap_do_send(chan, tx_skb);
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001935 BT_DBG("Sent txseq %u", control->txseq);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001936 }
1937
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001938 BT_DBG("Sent %d, %u unacked, %u in ERTM queue", sent,
1939 chan->unacked_frames, skb_queue_len(&chan->tx_q));
Mat Martineau18a48e72012-05-17 20:53:34 -07001940
1941 return sent;
Gustavo F. Padovan9e917af2010-05-01 16:15:37 -03001942}
1943
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001944static void l2cap_ertm_resend(struct l2cap_chan *chan)
1945{
1946 struct l2cap_ctrl control;
1947 struct sk_buff *skb;
1948 struct sk_buff *tx_skb;
1949 u16 seq;
1950
1951 BT_DBG("chan %p", chan);
1952
1953 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1954 return;
1955
Mat Martineaub99e13a2012-10-23 15:24:19 -07001956 if (__chan_is_moving(chan))
1957 return;
1958
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001959 while (chan->retrans_list.head != L2CAP_SEQ_LIST_CLEAR) {
1960 seq = l2cap_seq_list_pop(&chan->retrans_list);
1961
1962 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, seq);
1963 if (!skb) {
1964 BT_DBG("Error: Can't retransmit seq %d, frame missing",
Gustavo Padovan2d792812012-10-06 10:07:01 +01001965 seq);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001966 continue;
1967 }
1968
1969 bt_cb(skb)->control.retries++;
1970 control = bt_cb(skb)->control;
1971
1972 if (chan->max_tx != 0 &&
1973 bt_cb(skb)->control.retries > chan->max_tx) {
1974 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001975 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001976 l2cap_seq_list_clear(&chan->retrans_list);
1977 break;
1978 }
1979
1980 control.reqseq = chan->buffer_seq;
1981 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
1982 control.final = 1;
1983 else
1984 control.final = 0;
1985
1986 if (skb_cloned(skb)) {
1987 /* Cloned sk_buffs are read-only, so we need a
1988 * writeable copy
1989 */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03001990 tx_skb = skb_copy(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001991 } else {
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03001992 tx_skb = skb_clone(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001993 }
1994
1995 if (!tx_skb) {
1996 l2cap_seq_list_clear(&chan->retrans_list);
1997 break;
1998 }
1999
2000 /* Update skb contents */
2001 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
2002 put_unaligned_le32(__pack_extended_control(&control),
2003 tx_skb->data + L2CAP_HDR_SIZE);
2004 } else {
2005 put_unaligned_le16(__pack_enhanced_control(&control),
2006 tx_skb->data + L2CAP_HDR_SIZE);
2007 }
2008
2009 if (chan->fcs == L2CAP_FCS_CRC16) {
2010 u16 fcs = crc16(0, (u8 *) tx_skb->data, tx_skb->len);
2011 put_unaligned_le16(fcs, skb_put(tx_skb,
2012 L2CAP_FCS_SIZE));
2013 }
2014
2015 l2cap_do_send(chan, tx_skb);
2016
2017 BT_DBG("Resent txseq %d", control.txseq);
2018
2019 chan->last_acked_seq = chan->buffer_seq;
2020 }
2021}
2022
Mat Martineauf80842a2012-05-17 20:53:46 -07002023static void l2cap_retransmit(struct l2cap_chan *chan,
2024 struct l2cap_ctrl *control)
2025{
2026 BT_DBG("chan %p, control %p", chan, control);
2027
2028 l2cap_seq_list_append(&chan->retrans_list, control->reqseq);
2029 l2cap_ertm_resend(chan);
2030}
2031
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002032static void l2cap_retransmit_all(struct l2cap_chan *chan,
2033 struct l2cap_ctrl *control)
2034{
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002035 struct sk_buff *skb;
2036
2037 BT_DBG("chan %p, control %p", chan, control);
2038
2039 if (control->poll)
2040 set_bit(CONN_SEND_FBIT, &chan->conn_state);
2041
2042 l2cap_seq_list_clear(&chan->retrans_list);
2043
2044 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
2045 return;
2046
2047 if (chan->unacked_frames) {
2048 skb_queue_walk(&chan->tx_q, skb) {
2049 if (bt_cb(skb)->control.txseq == control->reqseq ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01002050 skb == chan->tx_send_head)
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002051 break;
2052 }
2053
2054 skb_queue_walk_from(&chan->tx_q, skb) {
2055 if (skb == chan->tx_send_head)
2056 break;
2057
2058 l2cap_seq_list_append(&chan->retrans_list,
2059 bt_cb(skb)->control.txseq);
2060 }
2061
2062 l2cap_ertm_resend(chan);
2063 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002064}
2065
Szymon Jancb17e73b2012-01-11 10:59:47 +01002066static void l2cap_send_ack(struct l2cap_chan *chan)
2067{
Mat Martineau0a0aba42012-05-17 20:53:39 -07002068 struct l2cap_ctrl control;
2069 u16 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
2070 chan->last_acked_seq);
2071 int threshold;
2072
2073 BT_DBG("chan %p last_acked_seq %d buffer_seq %d",
2074 chan, chan->last_acked_seq, chan->buffer_seq);
2075
2076 memset(&control, 0, sizeof(control));
2077 control.sframe = 1;
2078
2079 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
2080 chan->rx_state == L2CAP_RX_STATE_RECV) {
2081 __clear_ack_timer(chan);
2082 control.super = L2CAP_SUPER_RNR;
2083 control.reqseq = chan->buffer_seq;
2084 l2cap_send_sframe(chan, &control);
2085 } else {
2086 if (!test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) {
2087 l2cap_ertm_send(chan);
2088 /* If any i-frames were sent, they included an ack */
2089 if (chan->buffer_seq == chan->last_acked_seq)
2090 frames_to_ack = 0;
2091 }
2092
Mat Martineauc20f8e32012-07-10 05:47:07 -07002093 /* Ack now if the window is 3/4ths full.
Mat Martineau0a0aba42012-05-17 20:53:39 -07002094 * Calculate without mul or div
2095 */
Mat Martineauc20f8e32012-07-10 05:47:07 -07002096 threshold = chan->ack_win;
Mat Martineau0a0aba42012-05-17 20:53:39 -07002097 threshold += threshold << 1;
2098 threshold >>= 2;
2099
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002100 BT_DBG("frames_to_ack %u, threshold %d", frames_to_ack,
Mat Martineau0a0aba42012-05-17 20:53:39 -07002101 threshold);
2102
2103 if (frames_to_ack >= threshold) {
2104 __clear_ack_timer(chan);
2105 control.super = L2CAP_SUPER_RR;
2106 control.reqseq = chan->buffer_seq;
2107 l2cap_send_sframe(chan, &control);
2108 frames_to_ack = 0;
2109 }
2110
2111 if (frames_to_ack)
2112 __set_ack_timer(chan);
2113 }
Szymon Jancb17e73b2012-01-11 10:59:47 +01002114}
2115
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002116static inline int l2cap_skbuff_fromiovec(struct l2cap_chan *chan,
2117 struct msghdr *msg, int len,
2118 int count, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002119{
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002120 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002121 struct sk_buff **frag;
Gustavo Padovan90338942012-04-06 20:15:47 -03002122 int sent = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002123
Jukka Rissanen04988782014-06-18 16:37:07 +03002124 if (chan->ops->memcpy_fromiovec(chan, skb_put(skb, count),
2125 msg->msg_iov, count))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002126 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002127
2128 sent += count;
2129 len -= count;
2130
2131 /* Continuation fragments (no L2CAP header) */
2132 frag = &skb_shinfo(skb)->frag_list;
2133 while (len) {
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002134 struct sk_buff *tmp;
2135
Linus Torvalds1da177e2005-04-16 15:20:36 -07002136 count = min_t(unsigned int, conn->mtu, len);
2137
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002138 tmp = chan->ops->alloc_skb(chan, 0, count,
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002139 msg->msg_flags & MSG_DONTWAIT);
2140 if (IS_ERR(tmp))
2141 return PTR_ERR(tmp);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002142
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002143 *frag = tmp;
2144
Jukka Rissanen04988782014-06-18 16:37:07 +03002145 if (chan->ops->memcpy_fromiovec(chan, skb_put(*frag, count),
2146 msg->msg_iov, count))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002147 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002148
2149 sent += count;
2150 len -= count;
2151
Gustavo Padovan2d0ed3d2012-05-11 13:16:12 -03002152 skb->len += (*frag)->len;
2153 skb->data_len += (*frag)->len;
2154
Linus Torvalds1da177e2005-04-16 15:20:36 -07002155 frag = &(*frag)->next;
2156 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002157
2158 return sent;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002159}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002160
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002161static struct sk_buff *l2cap_create_connless_pdu(struct l2cap_chan *chan,
Marcel Holtmann8d463212014-06-05 15:22:51 +02002162 struct msghdr *msg, size_t len)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002163{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002164 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002165 struct sk_buff *skb;
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002166 int err, count, hlen = L2CAP_HDR_SIZE + L2CAP_PSMLEN_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002167 struct l2cap_hdr *lh;
2168
Marcel Holtmann8d463212014-06-05 15:22:51 +02002169 BT_DBG("chan %p psm 0x%2.2x len %zu", chan,
2170 __le16_to_cpu(chan->psm), len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002171
2172 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002173
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002174 skb = chan->ops->alloc_skb(chan, hlen, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002175 msg->msg_flags & MSG_DONTWAIT);
2176 if (IS_ERR(skb))
2177 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002178
2179 /* Create L2CAP header */
2180 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002181 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenkodaf6a78c2012-05-03 10:55:52 +03002182 lh->len = cpu_to_le16(len + L2CAP_PSMLEN_SIZE);
Marcel Holtmann43b1b8d2013-10-12 06:01:26 -07002183 put_unaligned(chan->psm, (__le16 *) skb_put(skb, L2CAP_PSMLEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002184
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002185 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002186 if (unlikely(err < 0)) {
2187 kfree_skb(skb);
2188 return ERR_PTR(err);
2189 }
2190 return skb;
2191}
2192
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002193static struct sk_buff *l2cap_create_basic_pdu(struct l2cap_chan *chan,
Marcel Holtmann8d463212014-06-05 15:22:51 +02002194 struct msghdr *msg, size_t len)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002195{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002196 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002197 struct sk_buff *skb;
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002198 int err, count;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002199 struct l2cap_hdr *lh;
2200
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002201 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002202
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002203 count = min_t(unsigned int, (conn->mtu - L2CAP_HDR_SIZE), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002204
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002205 skb = chan->ops->alloc_skb(chan, L2CAP_HDR_SIZE, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002206 msg->msg_flags & MSG_DONTWAIT);
2207 if (IS_ERR(skb))
2208 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002209
2210 /* Create L2CAP header */
2211 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002212 lh->cid = cpu_to_le16(chan->dcid);
Gustavo Padovan6ff9b5e2012-05-02 11:56:17 -03002213 lh->len = cpu_to_le16(len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002214
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002215 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002216 if (unlikely(err < 0)) {
2217 kfree_skb(skb);
2218 return ERR_PTR(err);
2219 }
2220 return skb;
2221}
2222
Luiz Augusto von Dentzab0ff762011-09-12 20:00:50 +03002223static struct sk_buff *l2cap_create_iframe_pdu(struct l2cap_chan *chan,
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002224 struct msghdr *msg, size_t len,
2225 u16 sdulen)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002226{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002227 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002228 struct sk_buff *skb;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002229 int err, count, hlen;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002230 struct l2cap_hdr *lh;
2231
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002232 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002233
Gustavo F. Padovan0ee0d202010-05-01 16:15:41 -03002234 if (!conn)
2235 return ERR_PTR(-ENOTCONN);
2236
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002237 hlen = __ertm_hdr_size(chan);
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002238
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002239 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002240 hlen += L2CAP_SDULEN_SIZE;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002241
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03002242 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002243 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03002244
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002245 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002246
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002247 skb = chan->ops->alloc_skb(chan, hlen, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002248 msg->msg_flags & MSG_DONTWAIT);
2249 if (IS_ERR(skb))
2250 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002251
2252 /* Create L2CAP header */
2253 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002254 lh->cid = cpu_to_le16(chan->dcid);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002255 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002256
Mat Martineau18a48e72012-05-17 20:53:34 -07002257 /* Control header is populated later */
2258 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
2259 put_unaligned_le32(0, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
2260 else
2261 put_unaligned_le16(0, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002262
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002263 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002264 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002265
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002266 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002267 if (unlikely(err < 0)) {
2268 kfree_skb(skb);
2269 return ERR_PTR(err);
2270 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03002271
Mat Martineau18a48e72012-05-17 20:53:34 -07002272 bt_cb(skb)->control.fcs = chan->fcs;
Mat Martineau3ce35142012-04-25 16:36:14 -07002273 bt_cb(skb)->control.retries = 0;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002274 return skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002275}
2276
Mat Martineau94122bb2012-05-02 09:42:02 -07002277static int l2cap_segment_sdu(struct l2cap_chan *chan,
2278 struct sk_buff_head *seg_queue,
2279 struct msghdr *msg, size_t len)
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002280{
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002281 struct sk_buff *skb;
Mat Martineau94122bb2012-05-02 09:42:02 -07002282 u16 sdu_len;
2283 size_t pdu_len;
Mat Martineau94122bb2012-05-02 09:42:02 -07002284 u8 sar;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002285
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002286 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002287
Mat Martineau94122bb2012-05-02 09:42:02 -07002288 /* It is critical that ERTM PDUs fit in a single HCI fragment,
2289 * so fragmented skbs are not used. The HCI layer's handling
2290 * of fragmented skbs is not compatible with ERTM's queueing.
2291 */
2292
2293 /* PDU size is derived from the HCI MTU */
2294 pdu_len = chan->conn->mtu;
2295
Mat Martineaua5495742012-10-23 15:24:21 -07002296 /* Constrain PDU size for BR/EDR connections */
2297 if (!chan->hs_hcon)
2298 pdu_len = min_t(size_t, pdu_len, L2CAP_BREDR_MAX_PAYLOAD);
Mat Martineau94122bb2012-05-02 09:42:02 -07002299
2300 /* Adjust for largest possible L2CAP overhead. */
Gustavo Padovan35d401d2012-05-25 18:57:05 -03002301 if (chan->fcs)
2302 pdu_len -= L2CAP_FCS_SIZE;
2303
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002304 pdu_len -= __ertm_hdr_size(chan);
Mat Martineau94122bb2012-05-02 09:42:02 -07002305
2306 /* Remote device may have requested smaller PDUs */
2307 pdu_len = min_t(size_t, pdu_len, chan->remote_mps);
2308
2309 if (len <= pdu_len) {
2310 sar = L2CAP_SAR_UNSEGMENTED;
2311 sdu_len = 0;
2312 pdu_len = len;
2313 } else {
2314 sar = L2CAP_SAR_START;
2315 sdu_len = len;
2316 pdu_len -= L2CAP_SDULEN_SIZE;
2317 }
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002318
2319 while (len > 0) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002320 skb = l2cap_create_iframe_pdu(chan, msg, pdu_len, sdu_len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002321
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002322 if (IS_ERR(skb)) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002323 __skb_queue_purge(seg_queue);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002324 return PTR_ERR(skb);
2325 }
2326
Mat Martineau94122bb2012-05-02 09:42:02 -07002327 bt_cb(skb)->control.sar = sar;
2328 __skb_queue_tail(seg_queue, skb);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002329
Mat Martineau94122bb2012-05-02 09:42:02 -07002330 len -= pdu_len;
2331 if (sdu_len) {
2332 sdu_len = 0;
2333 pdu_len += L2CAP_SDULEN_SIZE;
2334 }
2335
2336 if (len <= pdu_len) {
2337 sar = L2CAP_SAR_END;
2338 pdu_len = len;
2339 } else {
2340 sar = L2CAP_SAR_CONTINUE;
2341 }
2342 }
2343
Gustavo Padovanf0f62792012-05-29 13:29:17 -03002344 return 0;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002345}
2346
Johan Hedberg177f8f22013-05-31 17:54:51 +03002347static struct sk_buff *l2cap_create_le_flowctl_pdu(struct l2cap_chan *chan,
2348 struct msghdr *msg,
2349 size_t len, u16 sdulen)
2350{
2351 struct l2cap_conn *conn = chan->conn;
2352 struct sk_buff *skb;
2353 int err, count, hlen;
2354 struct l2cap_hdr *lh;
2355
2356 BT_DBG("chan %p len %zu", chan, len);
2357
2358 if (!conn)
2359 return ERR_PTR(-ENOTCONN);
2360
2361 hlen = L2CAP_HDR_SIZE;
2362
2363 if (sdulen)
2364 hlen += L2CAP_SDULEN_SIZE;
2365
2366 count = min_t(unsigned int, (conn->mtu - hlen), len);
2367
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002368 skb = chan->ops->alloc_skb(chan, hlen, count,
Johan Hedberg177f8f22013-05-31 17:54:51 +03002369 msg->msg_flags & MSG_DONTWAIT);
2370 if (IS_ERR(skb))
2371 return skb;
2372
2373 /* Create L2CAP header */
2374 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
2375 lh->cid = cpu_to_le16(chan->dcid);
2376 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
2377
2378 if (sdulen)
2379 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
2380
2381 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
2382 if (unlikely(err < 0)) {
2383 kfree_skb(skb);
2384 return ERR_PTR(err);
2385 }
2386
2387 return skb;
2388}
2389
2390static int l2cap_segment_le_sdu(struct l2cap_chan *chan,
2391 struct sk_buff_head *seg_queue,
2392 struct msghdr *msg, size_t len)
2393{
2394 struct sk_buff *skb;
2395 size_t pdu_len;
2396 u16 sdu_len;
2397
2398 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
2399
2400 pdu_len = chan->conn->mtu - L2CAP_HDR_SIZE;
2401
2402 pdu_len = min_t(size_t, pdu_len, chan->remote_mps);
2403
2404 sdu_len = len;
2405 pdu_len -= L2CAP_SDULEN_SIZE;
2406
2407 while (len > 0) {
2408 if (len <= pdu_len)
2409 pdu_len = len;
2410
2411 skb = l2cap_create_le_flowctl_pdu(chan, msg, pdu_len, sdu_len);
2412 if (IS_ERR(skb)) {
2413 __skb_queue_purge(seg_queue);
2414 return PTR_ERR(skb);
2415 }
2416
2417 __skb_queue_tail(seg_queue, skb);
2418
2419 len -= pdu_len;
2420
2421 if (sdu_len) {
2422 sdu_len = 0;
2423 pdu_len += L2CAP_SDULEN_SIZE;
2424 }
2425 }
2426
2427 return 0;
2428}
2429
Marcel Holtmann8d463212014-06-05 15:22:51 +02002430int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002431{
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002432 struct sk_buff *skb;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002433 int err;
Mat Martineau94122bb2012-05-02 09:42:02 -07002434 struct sk_buff_head seg_queue;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002435
Seung-Woo Kim31e8ce82013-11-05 18:46:33 +09002436 if (!chan->conn)
2437 return -ENOTCONN;
2438
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002439 /* Connectionless channel */
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002440 if (chan->chan_type == L2CAP_CHAN_CONN_LESS) {
Marcel Holtmann8d463212014-06-05 15:22:51 +02002441 skb = l2cap_create_connless_pdu(chan, msg, len);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002442 if (IS_ERR(skb))
2443 return PTR_ERR(skb);
2444
Andrzej Kaczmarekede81a22014-02-25 17:16:22 +01002445 /* Channel lock is released before requesting new skb and then
2446 * reacquired thus we need to recheck channel state.
2447 */
2448 if (chan->state != BT_CONNECTED) {
2449 kfree_skb(skb);
2450 return -ENOTCONN;
2451 }
2452
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002453 l2cap_do_send(chan, skb);
2454 return len;
2455 }
2456
2457 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03002458 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedberg177f8f22013-05-31 17:54:51 +03002459 /* Check outgoing MTU */
2460 if (len > chan->omtu)
2461 return -EMSGSIZE;
2462
Johan Hedbergfad5fc82013-12-05 09:45:01 +02002463 if (!chan->tx_credits)
2464 return -EAGAIN;
2465
Johan Hedberg177f8f22013-05-31 17:54:51 +03002466 __skb_queue_head_init(&seg_queue);
2467
2468 err = l2cap_segment_le_sdu(chan, &seg_queue, msg, len);
2469
2470 if (chan->state != BT_CONNECTED) {
2471 __skb_queue_purge(&seg_queue);
2472 err = -ENOTCONN;
2473 }
2474
2475 if (err)
2476 return err;
2477
2478 skb_queue_splice_tail_init(&seg_queue, &chan->tx_q);
2479
2480 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
2481 l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
2482 chan->tx_credits--;
2483 }
2484
2485 if (!chan->tx_credits)
2486 chan->ops->suspend(chan);
2487
2488 err = len;
2489
2490 break;
2491
Johan Hedbergfad5fc82013-12-05 09:45:01 +02002492 case L2CAP_MODE_BASIC:
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002493 /* Check outgoing MTU */
2494 if (len > chan->omtu)
2495 return -EMSGSIZE;
2496
2497 /* Create a basic PDU */
Marcel Holtmann8d463212014-06-05 15:22:51 +02002498 skb = l2cap_create_basic_pdu(chan, msg, len);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002499 if (IS_ERR(skb))
2500 return PTR_ERR(skb);
2501
Andrzej Kaczmarekede81a22014-02-25 17:16:22 +01002502 /* Channel lock is released before requesting new skb and then
2503 * reacquired thus we need to recheck channel state.
2504 */
2505 if (chan->state != BT_CONNECTED) {
2506 kfree_skb(skb);
2507 return -ENOTCONN;
2508 }
2509
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002510 l2cap_do_send(chan, skb);
2511 err = len;
2512 break;
2513
2514 case L2CAP_MODE_ERTM:
2515 case L2CAP_MODE_STREAMING:
Mat Martineau94122bb2012-05-02 09:42:02 -07002516 /* Check outgoing MTU */
2517 if (len > chan->omtu) {
2518 err = -EMSGSIZE;
2519 break;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002520 }
2521
Mat Martineau94122bb2012-05-02 09:42:02 -07002522 __skb_queue_head_init(&seg_queue);
2523
2524 /* Do segmentation before calling in to the state machine,
2525 * since it's possible to block while waiting for memory
2526 * allocation.
2527 */
2528 err = l2cap_segment_sdu(chan, &seg_queue, msg, len);
2529
2530 /* The channel could have been closed while segmenting,
2531 * check that it is still connected.
2532 */
2533 if (chan->state != BT_CONNECTED) {
2534 __skb_queue_purge(&seg_queue);
2535 err = -ENOTCONN;
2536 }
2537
2538 if (err)
2539 break;
2540
Mat Martineau37339372012-05-17 20:53:33 -07002541 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo Padovand6603662012-05-21 13:58:22 -03002542 l2cap_tx(chan, NULL, &seg_queue, L2CAP_EV_DATA_REQUEST);
Mat Martineau37339372012-05-17 20:53:33 -07002543 else
Gustavo Padovand6603662012-05-21 13:58:22 -03002544 l2cap_streaming_send(chan, &seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002545
Gustavo Padovand6603662012-05-21 13:58:22 -03002546 err = len;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002547
Mat Martineau94122bb2012-05-02 09:42:02 -07002548 /* If the skbs were not queued for sending, they'll still be in
2549 * seg_queue and need to be purged.
2550 */
2551 __skb_queue_purge(&seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002552 break;
2553
2554 default:
2555 BT_DBG("bad state %1.1x", chan->mode);
2556 err = -EBADFD;
2557 }
2558
2559 return err;
2560}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +03002561EXPORT_SYMBOL_GPL(l2cap_chan_send);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002562
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002563static void l2cap_send_srej(struct l2cap_chan *chan, u16 txseq)
2564{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002565 struct l2cap_ctrl control;
2566 u16 seq;
2567
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002568 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002569
2570 memset(&control, 0, sizeof(control));
2571 control.sframe = 1;
2572 control.super = L2CAP_SUPER_SREJ;
2573
2574 for (seq = chan->expected_tx_seq; seq != txseq;
2575 seq = __next_seq(chan, seq)) {
2576 if (!l2cap_ertm_seq_in_queue(&chan->srej_q, seq)) {
2577 control.reqseq = seq;
2578 l2cap_send_sframe(chan, &control);
2579 l2cap_seq_list_append(&chan->srej_list, seq);
2580 }
2581 }
2582
2583 chan->expected_tx_seq = __next_seq(chan, txseq);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002584}
2585
2586static void l2cap_send_srej_tail(struct l2cap_chan *chan)
2587{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002588 struct l2cap_ctrl control;
2589
2590 BT_DBG("chan %p", chan);
2591
2592 if (chan->srej_list.tail == L2CAP_SEQ_LIST_CLEAR)
2593 return;
2594
2595 memset(&control, 0, sizeof(control));
2596 control.sframe = 1;
2597 control.super = L2CAP_SUPER_SREJ;
2598 control.reqseq = chan->srej_list.tail;
2599 l2cap_send_sframe(chan, &control);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002600}
2601
2602static void l2cap_send_srej_list(struct l2cap_chan *chan, u16 txseq)
2603{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002604 struct l2cap_ctrl control;
2605 u16 initial_head;
2606 u16 seq;
2607
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002608 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002609
2610 memset(&control, 0, sizeof(control));
2611 control.sframe = 1;
2612 control.super = L2CAP_SUPER_SREJ;
2613
2614 /* Capture initial list head to allow only one pass through the list. */
2615 initial_head = chan->srej_list.head;
2616
2617 do {
2618 seq = l2cap_seq_list_pop(&chan->srej_list);
2619 if (seq == txseq || seq == L2CAP_SEQ_LIST_CLEAR)
2620 break;
2621
2622 control.reqseq = seq;
2623 l2cap_send_sframe(chan, &control);
2624 l2cap_seq_list_append(&chan->srej_list, seq);
2625 } while (chan->srej_list.head != initial_head);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002626}
2627
Mat Martineau608bcc62012-05-17 20:53:32 -07002628static void l2cap_process_reqseq(struct l2cap_chan *chan, u16 reqseq)
2629{
2630 struct sk_buff *acked_skb;
2631 u16 ackseq;
2632
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002633 BT_DBG("chan %p, reqseq %u", chan, reqseq);
Mat Martineau608bcc62012-05-17 20:53:32 -07002634
2635 if (chan->unacked_frames == 0 || reqseq == chan->expected_ack_seq)
2636 return;
2637
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002638 BT_DBG("expected_ack_seq %u, unacked_frames %u",
Mat Martineau608bcc62012-05-17 20:53:32 -07002639 chan->expected_ack_seq, chan->unacked_frames);
2640
2641 for (ackseq = chan->expected_ack_seq; ackseq != reqseq;
2642 ackseq = __next_seq(chan, ackseq)) {
2643
2644 acked_skb = l2cap_ertm_seq_in_queue(&chan->tx_q, ackseq);
2645 if (acked_skb) {
2646 skb_unlink(acked_skb, &chan->tx_q);
2647 kfree_skb(acked_skb);
2648 chan->unacked_frames--;
2649 }
2650 }
2651
2652 chan->expected_ack_seq = reqseq;
2653
2654 if (chan->unacked_frames == 0)
2655 __clear_retrans_timer(chan);
2656
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002657 BT_DBG("unacked_frames %u", chan->unacked_frames);
Mat Martineau608bcc62012-05-17 20:53:32 -07002658}
2659
2660static void l2cap_abort_rx_srej_sent(struct l2cap_chan *chan)
2661{
2662 BT_DBG("chan %p", chan);
2663
2664 chan->expected_tx_seq = chan->buffer_seq;
2665 l2cap_seq_list_clear(&chan->srej_list);
2666 skb_queue_purge(&chan->srej_q);
2667 chan->rx_state = L2CAP_RX_STATE_RECV;
2668}
2669
Gustavo Padovand6603662012-05-21 13:58:22 -03002670static void l2cap_tx_state_xmit(struct l2cap_chan *chan,
2671 struct l2cap_ctrl *control,
2672 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002673{
Mat Martineau608bcc62012-05-17 20:53:32 -07002674 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2675 event);
2676
2677 switch (event) {
2678 case L2CAP_EV_DATA_REQUEST:
2679 if (chan->tx_send_head == NULL)
2680 chan->tx_send_head = skb_peek(skbs);
2681
2682 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2683 l2cap_ertm_send(chan);
2684 break;
2685 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2686 BT_DBG("Enter LOCAL_BUSY");
2687 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2688
2689 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2690 /* The SREJ_SENT state must be aborted if we are to
2691 * enter the LOCAL_BUSY state.
2692 */
2693 l2cap_abort_rx_srej_sent(chan);
2694 }
2695
2696 l2cap_send_ack(chan);
2697
2698 break;
2699 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2700 BT_DBG("Exit LOCAL_BUSY");
2701 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2702
2703 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2704 struct l2cap_ctrl local_control;
2705
2706 memset(&local_control, 0, sizeof(local_control));
2707 local_control.sframe = 1;
2708 local_control.super = L2CAP_SUPER_RR;
2709 local_control.poll = 1;
2710 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002711 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002712
2713 chan->retry_count = 1;
2714 __set_monitor_timer(chan);
2715 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2716 }
2717 break;
2718 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2719 l2cap_process_reqseq(chan, control->reqseq);
2720 break;
2721 case L2CAP_EV_EXPLICIT_POLL:
2722 l2cap_send_rr_or_rnr(chan, 1);
2723 chan->retry_count = 1;
2724 __set_monitor_timer(chan);
2725 __clear_ack_timer(chan);
2726 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2727 break;
2728 case L2CAP_EV_RETRANS_TO:
2729 l2cap_send_rr_or_rnr(chan, 1);
2730 chan->retry_count = 1;
2731 __set_monitor_timer(chan);
2732 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2733 break;
2734 case L2CAP_EV_RECV_FBIT:
2735 /* Nothing to process */
2736 break;
2737 default:
2738 break;
2739 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002740}
2741
Gustavo Padovand6603662012-05-21 13:58:22 -03002742static void l2cap_tx_state_wait_f(struct l2cap_chan *chan,
2743 struct l2cap_ctrl *control,
2744 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002745{
Mat Martineau608bcc62012-05-17 20:53:32 -07002746 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2747 event);
2748
2749 switch (event) {
2750 case L2CAP_EV_DATA_REQUEST:
2751 if (chan->tx_send_head == NULL)
2752 chan->tx_send_head = skb_peek(skbs);
2753 /* Queue data, but don't send. */
2754 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2755 break;
2756 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2757 BT_DBG("Enter LOCAL_BUSY");
2758 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2759
2760 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2761 /* The SREJ_SENT state must be aborted if we are to
2762 * enter the LOCAL_BUSY state.
2763 */
2764 l2cap_abort_rx_srej_sent(chan);
2765 }
2766
2767 l2cap_send_ack(chan);
2768
2769 break;
2770 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2771 BT_DBG("Exit LOCAL_BUSY");
2772 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2773
2774 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2775 struct l2cap_ctrl local_control;
2776 memset(&local_control, 0, sizeof(local_control));
2777 local_control.sframe = 1;
2778 local_control.super = L2CAP_SUPER_RR;
2779 local_control.poll = 1;
2780 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002781 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002782
2783 chan->retry_count = 1;
2784 __set_monitor_timer(chan);
2785 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2786 }
2787 break;
2788 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2789 l2cap_process_reqseq(chan, control->reqseq);
2790
2791 /* Fall through */
2792
2793 case L2CAP_EV_RECV_FBIT:
2794 if (control && control->final) {
2795 __clear_monitor_timer(chan);
2796 if (chan->unacked_frames > 0)
2797 __set_retrans_timer(chan);
2798 chan->retry_count = 0;
2799 chan->tx_state = L2CAP_TX_STATE_XMIT;
2800 BT_DBG("recv fbit tx_state 0x2.2%x", chan->tx_state);
2801 }
2802 break;
2803 case L2CAP_EV_EXPLICIT_POLL:
2804 /* Ignore */
2805 break;
2806 case L2CAP_EV_MONITOR_TO:
2807 if (chan->max_tx == 0 || chan->retry_count < chan->max_tx) {
2808 l2cap_send_rr_or_rnr(chan, 1);
2809 __set_monitor_timer(chan);
2810 chan->retry_count++;
2811 } else {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02002812 l2cap_send_disconn_req(chan, ECONNABORTED);
Mat Martineau608bcc62012-05-17 20:53:32 -07002813 }
2814 break;
2815 default:
2816 break;
2817 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002818}
2819
Gustavo Padovand6603662012-05-21 13:58:22 -03002820static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
2821 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002822{
Mat Martineau608bcc62012-05-17 20:53:32 -07002823 BT_DBG("chan %p, control %p, skbs %p, event %d, state %d",
2824 chan, control, skbs, event, chan->tx_state);
2825
2826 switch (chan->tx_state) {
2827 case L2CAP_TX_STATE_XMIT:
Gustavo Padovand6603662012-05-21 13:58:22 -03002828 l2cap_tx_state_xmit(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002829 break;
2830 case L2CAP_TX_STATE_WAIT_F:
Gustavo Padovand6603662012-05-21 13:58:22 -03002831 l2cap_tx_state_wait_f(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002832 break;
2833 default:
2834 /* Ignore event */
2835 break;
2836 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002837}
2838
Mat Martineau4b51dae92012-05-17 20:53:37 -07002839static void l2cap_pass_to_tx(struct l2cap_chan *chan,
2840 struct l2cap_ctrl *control)
2841{
2842 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002843 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_REQSEQ_AND_FBIT);
Mat Martineau4b51dae92012-05-17 20:53:37 -07002844}
2845
Mat Martineauf80842a2012-05-17 20:53:46 -07002846static void l2cap_pass_to_tx_fbit(struct l2cap_chan *chan,
2847 struct l2cap_ctrl *control)
2848{
2849 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002850 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_FBIT);
Mat Martineauf80842a2012-05-17 20:53:46 -07002851}
2852
Linus Torvalds1da177e2005-04-16 15:20:36 -07002853/* Copy frame to all raw sockets on that connection */
2854static void l2cap_raw_recv(struct l2cap_conn *conn, struct sk_buff *skb)
2855{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002856 struct sk_buff *nskb;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03002857 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002858
2859 BT_DBG("conn %p", conn);
2860
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002861 mutex_lock(&conn->chan_lock);
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002862
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002863 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002864 if (chan->chan_type != L2CAP_CHAN_RAW)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002865 continue;
2866
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002867 /* Don't send frame to the channel it came from */
2868 if (bt_cb(skb)->chan == chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002869 continue;
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002870
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002871 nskb = skb_clone(skb, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03002872 if (!nskb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002873 continue;
Gustavo Padovan80b98022012-05-27 22:27:51 -03002874 if (chan->ops->recv(chan, nskb))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002875 kfree_skb(nskb);
2876 }
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002877
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002878 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002879}
2880
2881/* ---- L2CAP signalling commands ---- */
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002882static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn, u8 code,
2883 u8 ident, u16 dlen, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002884{
2885 struct sk_buff *skb, **frag;
2886 struct l2cap_cmd_hdr *cmd;
2887 struct l2cap_hdr *lh;
2888 int len, count;
2889
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002890 BT_DBG("conn %p, code 0x%2.2x, ident 0x%2.2x, len %u",
2891 conn, code, ident, dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002892
Anderson Lizardo300b9622013-06-02 16:30:40 -04002893 if (conn->mtu < L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE)
2894 return NULL;
2895
Linus Torvalds1da177e2005-04-16 15:20:36 -07002896 len = L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE + dlen;
2897 count = min_t(unsigned int, conn->mtu, len);
2898
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002899 skb = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002900 if (!skb)
2901 return NULL;
2902
2903 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002904 lh->len = cpu_to_le16(L2CAP_CMD_HDR_SIZE + dlen);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002905
2906 if (conn->hcon->type == LE_LINK)
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002907 lh->cid = cpu_to_le16(L2CAP_CID_LE_SIGNALING);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002908 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002909 lh->cid = cpu_to_le16(L2CAP_CID_SIGNALING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002910
2911 cmd = (struct l2cap_cmd_hdr *) skb_put(skb, L2CAP_CMD_HDR_SIZE);
2912 cmd->code = code;
2913 cmd->ident = ident;
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002914 cmd->len = cpu_to_le16(dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002915
2916 if (dlen) {
2917 count -= L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE;
2918 memcpy(skb_put(skb, count), data, count);
2919 data += count;
2920 }
2921
2922 len -= skb->len;
2923
2924 /* Continuation fragments (no L2CAP header) */
2925 frag = &skb_shinfo(skb)->frag_list;
2926 while (len) {
2927 count = min_t(unsigned int, conn->mtu, len);
2928
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002929 *frag = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002930 if (!*frag)
2931 goto fail;
2932
2933 memcpy(skb_put(*frag, count), data, count);
2934
2935 len -= count;
2936 data += count;
2937
2938 frag = &(*frag)->next;
2939 }
2940
2941 return skb;
2942
2943fail:
2944 kfree_skb(skb);
2945 return NULL;
2946}
2947
Gustavo Padovan2d792812012-10-06 10:07:01 +01002948static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen,
2949 unsigned long *val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002950{
2951 struct l2cap_conf_opt *opt = *ptr;
2952 int len;
2953
2954 len = L2CAP_CONF_OPT_SIZE + opt->len;
2955 *ptr += len;
2956
2957 *type = opt->type;
2958 *olen = opt->len;
2959
2960 switch (opt->len) {
2961 case 1:
2962 *val = *((u8 *) opt->val);
2963 break;
2964
2965 case 2:
steven miaobfaaeb32010-10-16 18:29:47 -04002966 *val = get_unaligned_le16(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002967 break;
2968
2969 case 4:
steven miaobfaaeb32010-10-16 18:29:47 -04002970 *val = get_unaligned_le32(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002971 break;
2972
2973 default:
2974 *val = (unsigned long) opt->val;
2975 break;
2976 }
2977
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002978 BT_DBG("type 0x%2.2x len %u val 0x%lx", *type, opt->len, *val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002979 return len;
2980}
2981
Linus Torvalds1da177e2005-04-16 15:20:36 -07002982static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val)
2983{
2984 struct l2cap_conf_opt *opt = *ptr;
2985
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002986 BT_DBG("type 0x%2.2x len %u val 0x%lx", type, len, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002987
2988 opt->type = type;
2989 opt->len = len;
2990
2991 switch (len) {
2992 case 1:
2993 *((u8 *) opt->val) = val;
2994 break;
2995
2996 case 2:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02002997 put_unaligned_le16(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002998 break;
2999
3000 case 4:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02003001 put_unaligned_le32(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003002 break;
3003
3004 default:
3005 memcpy(opt->val, (void *) val, len);
3006 break;
3007 }
3008
3009 *ptr += L2CAP_CONF_OPT_SIZE + len;
3010}
3011
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003012static void l2cap_add_opt_efs(void **ptr, struct l2cap_chan *chan)
3013{
3014 struct l2cap_conf_efs efs;
3015
Szymon Janc1ec918c2011-11-16 09:32:21 +01003016 switch (chan->mode) {
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003017 case L2CAP_MODE_ERTM:
3018 efs.id = chan->local_id;
3019 efs.stype = chan->local_stype;
3020 efs.msdu = cpu_to_le16(chan->local_msdu);
3021 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003022 efs.acc_lat = cpu_to_le32(L2CAP_DEFAULT_ACC_LAT);
3023 efs.flush_to = cpu_to_le32(L2CAP_EFS_DEFAULT_FLUSH_TO);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003024 break;
3025
3026 case L2CAP_MODE_STREAMING:
3027 efs.id = 1;
3028 efs.stype = L2CAP_SERV_BESTEFFORT;
3029 efs.msdu = cpu_to_le16(chan->local_msdu);
3030 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
3031 efs.acc_lat = 0;
3032 efs.flush_to = 0;
3033 break;
3034
3035 default:
3036 return;
3037 }
3038
3039 l2cap_add_conf_opt(ptr, L2CAP_CONF_EFS, sizeof(efs),
Andrei Emeltchenko8936fa62012-10-08 11:14:41 +03003040 (unsigned long) &efs);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003041}
3042
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003043static void l2cap_ack_timeout(struct work_struct *work)
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003044{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003045 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau03625202012-05-17 20:53:51 -07003046 ack_timer.work);
3047 u16 frames_to_ack;
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003048
Gustavo F. Padovan2fb9b3d2011-12-22 16:56:05 -02003049 BT_DBG("chan %p", chan);
3050
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003051 l2cap_chan_lock(chan);
3052
Mat Martineau03625202012-05-17 20:53:51 -07003053 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
3054 chan->last_acked_seq);
3055
3056 if (frames_to_ack)
3057 l2cap_send_rr_or_rnr(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003058
3059 l2cap_chan_unlock(chan);
Szymon Janc09bfb2e2012-01-11 10:59:49 +01003060 l2cap_chan_put(chan);
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003061}
3062
Andrei Emeltchenko466f8002012-05-29 13:59:01 +03003063int l2cap_ertm_init(struct l2cap_chan *chan)
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003064{
Mat Martineau3c588192012-04-11 10:48:42 -07003065 int err;
3066
Mat Martineau105bdf92012-04-27 16:50:48 -07003067 chan->next_tx_seq = 0;
3068 chan->expected_tx_seq = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003069 chan->expected_ack_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003070 chan->unacked_frames = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003071 chan->buffer_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003072 chan->frames_sent = 0;
Mat Martineau105bdf92012-04-27 16:50:48 -07003073 chan->last_acked_seq = 0;
3074 chan->sdu = NULL;
3075 chan->sdu_last_frag = NULL;
3076 chan->sdu_len = 0;
3077
Mat Martineaud34c34f2012-05-14 14:49:27 -07003078 skb_queue_head_init(&chan->tx_q);
3079
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003080 chan->local_amp_id = AMP_ID_BREDR;
3081 chan->move_id = AMP_ID_BREDR;
Mat Martineau08333282012-10-23 15:24:06 -07003082 chan->move_state = L2CAP_MOVE_STABLE;
3083 chan->move_role = L2CAP_MOVE_ROLE_NONE;
3084
Mat Martineau105bdf92012-04-27 16:50:48 -07003085 if (chan->mode != L2CAP_MODE_ERTM)
3086 return 0;
3087
3088 chan->rx_state = L2CAP_RX_STATE_RECV;
3089 chan->tx_state = L2CAP_TX_STATE_XMIT;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003090
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003091 INIT_DELAYED_WORK(&chan->retrans_timer, l2cap_retrans_timeout);
3092 INIT_DELAYED_WORK(&chan->monitor_timer, l2cap_monitor_timeout);
3093 INIT_DELAYED_WORK(&chan->ack_timer, l2cap_ack_timeout);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003094
Gustavo F. Padovanf1c67752011-03-25 20:36:10 -03003095 skb_queue_head_init(&chan->srej_q);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03003096
Mat Martineau3c588192012-04-11 10:48:42 -07003097 err = l2cap_seq_list_init(&chan->srej_list, chan->tx_win);
3098 if (err < 0)
3099 return err;
3100
Mat Martineau9dc9aff2012-05-17 16:20:14 -07003101 err = l2cap_seq_list_init(&chan->retrans_list, chan->remote_tx_win);
3102 if (err < 0)
3103 l2cap_seq_list_free(&chan->srej_list);
3104
3105 return err;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003106}
3107
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003108static inline __u8 l2cap_select_mode(__u8 mode, __u16 remote_feat_mask)
3109{
3110 switch (mode) {
3111 case L2CAP_MODE_STREAMING:
3112 case L2CAP_MODE_ERTM:
3113 if (l2cap_mode_supported(mode, remote_feat_mask))
3114 return mode;
3115 /* fall through */
3116 default:
3117 return L2CAP_MODE_BASIC;
3118 }
3119}
3120
Marcel Holtmann848566b2013-10-01 22:59:22 -07003121static inline bool __l2cap_ews_supported(struct l2cap_conn *conn)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003122{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003123 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003124}
3125
Marcel Holtmann848566b2013-10-01 22:59:22 -07003126static inline bool __l2cap_efs_supported(struct l2cap_conn *conn)
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003127{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003128 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_FLOW;
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003129}
3130
Mat Martineau36c86c82012-10-23 15:24:20 -07003131static void __l2cap_set_ertm_timeouts(struct l2cap_chan *chan,
3132 struct l2cap_conf_rfc *rfc)
3133{
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003134 if (chan->local_amp_id != AMP_ID_BREDR && chan->hs_hcon) {
Mat Martineau36c86c82012-10-23 15:24:20 -07003135 u64 ertm_to = chan->hs_hcon->hdev->amp_be_flush_to;
3136
3137 /* Class 1 devices have must have ERTM timeouts
3138 * exceeding the Link Supervision Timeout. The
3139 * default Link Supervision Timeout for AMP
3140 * controllers is 10 seconds.
3141 *
3142 * Class 1 devices use 0xffffffff for their
3143 * best-effort flush timeout, so the clamping logic
3144 * will result in a timeout that meets the above
3145 * requirement. ERTM timeouts are 16-bit values, so
3146 * the maximum timeout is 65.535 seconds.
3147 */
3148
3149 /* Convert timeout to milliseconds and round */
3150 ertm_to = DIV_ROUND_UP_ULL(ertm_to, 1000);
3151
3152 /* This is the recommended formula for class 2 devices
3153 * that start ERTM timers when packets are sent to the
3154 * controller.
3155 */
3156 ertm_to = 3 * ertm_to + 500;
3157
3158 if (ertm_to > 0xffff)
3159 ertm_to = 0xffff;
3160
3161 rfc->retrans_timeout = cpu_to_le16((u16) ertm_to);
3162 rfc->monitor_timeout = rfc->retrans_timeout;
3163 } else {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003164 rfc->retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO);
3165 rfc->monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO);
Mat Martineau36c86c82012-10-23 15:24:20 -07003166 }
3167}
3168
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003169static inline void l2cap_txwin_setup(struct l2cap_chan *chan)
3170{
3171 if (chan->tx_win > L2CAP_DEFAULT_TX_WINDOW &&
Marcel Holtmann848566b2013-10-01 22:59:22 -07003172 __l2cap_ews_supported(chan->conn)) {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003173 /* use extended control field */
3174 set_bit(FLAG_EXT_CTRL, &chan->flags);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003175 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
3176 } else {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003177 chan->tx_win = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003178 L2CAP_DEFAULT_TX_WINDOW);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003179 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
3180 }
Mat Martineauc20f8e32012-07-10 05:47:07 -07003181 chan->ack_win = chan->tx_win;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003182}
3183
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003184static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003185{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003186 struct l2cap_conf_req *req = data;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003187 struct l2cap_conf_rfc rfc = { .mode = chan->mode };
Linus Torvalds1da177e2005-04-16 15:20:36 -07003188 void *ptr = req->data;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003189 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003190
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03003191 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003192
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003193 if (chan->num_conf_req || chan->num_conf_rsp)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003194 goto done;
3195
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003196 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003197 case L2CAP_MODE_STREAMING:
3198 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003199 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state))
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003200 break;
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003201
Marcel Holtmann848566b2013-10-01 22:59:22 -07003202 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003203 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3204
Gustavo F. Padovan2ba13ed2010-06-09 16:39:05 -03003205 /* fall through */
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003206 default:
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003207 chan->mode = l2cap_select_mode(rfc.mode, chan->conn->feat_mask);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003208 break;
3209 }
3210
3211done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003212 if (chan->imtu != L2CAP_DEFAULT_MTU)
3213 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovan7990681c2011-01-24 16:01:43 -02003214
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003215 switch (chan->mode) {
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003216 case L2CAP_MODE_BASIC:
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003217 if (!(chan->conn->feat_mask & L2CAP_FEAT_ERTM) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003218 !(chan->conn->feat_mask & L2CAP_FEAT_STREAMING))
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003219 break;
3220
Gustavo F. Padovan62547752010-06-08 20:05:31 -03003221 rfc.mode = L2CAP_MODE_BASIC;
3222 rfc.txwin_size = 0;
3223 rfc.max_transmit = 0;
3224 rfc.retrans_timeout = 0;
3225 rfc.monitor_timeout = 0;
3226 rfc.max_pdu_size = 0;
3227
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003228 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003229 (unsigned long) &rfc);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003230 break;
3231
3232 case L2CAP_MODE_ERTM:
3233 rfc.mode = L2CAP_MODE_ERTM;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003234 rfc.max_transmit = chan->max_tx;
Mat Martineau36c86c82012-10-23 15:24:20 -07003235
3236 __l2cap_set_ertm_timeouts(chan, &rfc);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003237
3238 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003239 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3240 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003241 rfc.max_pdu_size = cpu_to_le16(size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003242
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003243 l2cap_txwin_setup(chan);
3244
3245 rfc.txwin_size = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003246 L2CAP_DEFAULT_TX_WINDOW);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003247
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003248 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003249 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003250
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003251 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3252 l2cap_add_opt_efs(&ptr, chan);
3253
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003254 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3255 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003256 chan->tx_win);
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003257
3258 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3259 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003260 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003261 chan->fcs = L2CAP_FCS_NONE;
3262 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3263 chan->fcs);
3264 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003265 break;
3266
3267 case L2CAP_MODE_STREAMING:
Mat Martineau273759e2012-05-17 20:53:53 -07003268 l2cap_txwin_setup(chan);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003269 rfc.mode = L2CAP_MODE_STREAMING;
3270 rfc.txwin_size = 0;
3271 rfc.max_transmit = 0;
3272 rfc.retrans_timeout = 0;
3273 rfc.monitor_timeout = 0;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003274
3275 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003276 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3277 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003278 rfc.max_pdu_size = cpu_to_le16(size);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003279
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003280 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003281 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003282
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003283 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3284 l2cap_add_opt_efs(&ptr, chan);
3285
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003286 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3287 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003288 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003289 chan->fcs = L2CAP_FCS_NONE;
3290 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3291 chan->fcs);
3292 }
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003293 break;
3294 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003295
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003296 req->dcid = cpu_to_le16(chan->dcid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003297 req->flags = cpu_to_le16(0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003298
3299 return ptr - data;
3300}
3301
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003302static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003303{
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003304 struct l2cap_conf_rsp *rsp = data;
3305 void *ptr = rsp->data;
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003306 void *req = chan->conf_req;
3307 int len = chan->conf_len;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003308 int type, hint, olen;
3309 unsigned long val;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003310 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003311 struct l2cap_conf_efs efs;
3312 u8 remote_efs = 0;
Marcel Holtmann861d6882007-10-20 13:37:06 +02003313 u16 mtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003314 u16 result = L2CAP_CONF_SUCCESS;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003315 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003316
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003317 BT_DBG("chan %p", chan);
Marcel Holtmann820ae1b2006-11-18 22:15:00 +01003318
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003319 while (len >= L2CAP_CONF_OPT_SIZE) {
3320 len -= l2cap_get_conf_opt(&req, &type, &olen, &val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003321
Gustavo F. Padovan589d2742009-04-20 01:31:07 -03003322 hint = type & L2CAP_CONF_HINT;
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07003323 type &= L2CAP_CONF_MASK;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003324
3325 switch (type) {
3326 case L2CAP_CONF_MTU:
Marcel Holtmann861d6882007-10-20 13:37:06 +02003327 mtu = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003328 break;
3329
3330 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003331 chan->flush_to = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003332 break;
3333
3334 case L2CAP_CONF_QOS:
3335 break;
3336
Marcel Holtmann6464f352007-10-20 13:39:51 +02003337 case L2CAP_CONF_RFC:
3338 if (olen == sizeof(rfc))
3339 memcpy(&rfc, (void *) val, olen);
3340 break;
3341
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003342 case L2CAP_CONF_FCS:
3343 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003344 set_bit(CONF_RECV_NO_FCS, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003345 break;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003346
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003347 case L2CAP_CONF_EFS:
3348 remote_efs = 1;
3349 if (olen == sizeof(efs))
3350 memcpy(&efs, (void *) val, olen);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003351 break;
3352
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003353 case L2CAP_CONF_EWS:
Marcel Holtmann848566b2013-10-01 22:59:22 -07003354 if (!chan->conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003355 return -ECONNREFUSED;
3356
3357 set_bit(FLAG_EXT_CTRL, &chan->flags);
3358 set_bit(CONF_EWS_RECV, &chan->conf_state);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003359 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003360 chan->remote_tx_win = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003361 break;
3362
3363 default:
3364 if (hint)
3365 break;
3366
3367 result = L2CAP_CONF_UNKNOWN;
3368 *((u8 *) ptr++) = type;
3369 break;
3370 }
3371 }
3372
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003373 if (chan->num_conf_rsp || chan->num_conf_req > 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003374 goto done;
3375
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003376 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003377 case L2CAP_MODE_STREAMING:
3378 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003379 if (!test_bit(CONF_STATE2_DEVICE, &chan->conf_state)) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003380 chan->mode = l2cap_select_mode(rfc.mode,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003381 chan->conn->feat_mask);
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003382 break;
3383 }
3384
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003385 if (remote_efs) {
Marcel Holtmann848566b2013-10-01 22:59:22 -07003386 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003387 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3388 else
3389 return -ECONNREFUSED;
3390 }
3391
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003392 if (chan->mode != rfc.mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003393 return -ECONNREFUSED;
Gustavo F. Padovan742e5192010-06-08 19:09:48 -03003394
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003395 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003396 }
3397
3398done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003399 if (chan->mode != rfc.mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003400 result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003401 rfc.mode = chan->mode;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003402
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003403 if (chan->num_conf_rsp == 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003404 return -ECONNREFUSED;
3405
Gustavo Padovan2d792812012-10-06 10:07:01 +01003406 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3407 (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003408 }
3409
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003410 if (result == L2CAP_CONF_SUCCESS) {
3411 /* Configure output options and let the other side know
3412 * which ones we don't like. */
3413
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003414 if (mtu < L2CAP_DEFAULT_MIN_MTU)
3415 result = L2CAP_CONF_UNACCEPT;
3416 else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003417 chan->omtu = mtu;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003418 set_bit(CONF_MTU_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003419 }
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003420 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->omtu);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003421
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003422 if (remote_efs) {
3423 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003424 efs.stype != L2CAP_SERV_NOTRAFIC &&
3425 efs.stype != chan->local_stype) {
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003426
3427 result = L2CAP_CONF_UNACCEPT;
3428
3429 if (chan->num_conf_req >= 1)
3430 return -ECONNREFUSED;
3431
3432 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003433 sizeof(efs),
3434 (unsigned long) &efs);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003435 } else {
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003436 /* Send PENDING Conf Rsp */
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003437 result = L2CAP_CONF_PENDING;
3438 set_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003439 }
3440 }
3441
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003442 switch (rfc.mode) {
3443 case L2CAP_MODE_BASIC:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003444 chan->fcs = L2CAP_FCS_NONE;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003445 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003446 break;
3447
3448 case L2CAP_MODE_ERTM:
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003449 if (!test_bit(CONF_EWS_RECV, &chan->conf_state))
3450 chan->remote_tx_win = rfc.txwin_size;
3451 else
3452 rfc.txwin_size = L2CAP_DEFAULT_TX_WINDOW;
3453
Gustavo F. Padovan2c03a7a2011-03-25 20:15:28 -03003454 chan->remote_max_tx = rfc.max_transmit;
Mat Martineau86b1b262010-08-05 15:54:22 -07003455
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003456 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003457 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3458 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003459 rfc.max_pdu_size = cpu_to_le16(size);
3460 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003461
Mat Martineau36c86c82012-10-23 15:24:20 -07003462 __l2cap_set_ertm_timeouts(chan, &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003463
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003464 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003465
3466 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003467 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003468
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003469 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3470 chan->remote_id = efs.id;
3471 chan->remote_stype = efs.stype;
3472 chan->remote_msdu = le16_to_cpu(efs.msdu);
3473 chan->remote_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003474 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003475 chan->remote_acc_lat =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003476 le32_to_cpu(efs.acc_lat);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003477 chan->remote_sdu_itime =
3478 le32_to_cpu(efs.sdu_itime);
3479 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003480 sizeof(efs),
3481 (unsigned long) &efs);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003482 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003483 break;
3484
3485 case L2CAP_MODE_STREAMING:
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003486 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003487 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3488 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003489 rfc.max_pdu_size = cpu_to_le16(size);
3490 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003491
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003492 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003493
Gustavo Padovan2d792812012-10-06 10:07:01 +01003494 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3495 (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003496
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003497 break;
3498
3499 default:
Marcel Holtmann6464f352007-10-20 13:39:51 +02003500 result = L2CAP_CONF_UNACCEPT;
3501
3502 memset(&rfc, 0, sizeof(rfc));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003503 rfc.mode = chan->mode;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003504 }
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003505
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003506 if (result == L2CAP_CONF_SUCCESS)
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003507 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003508 }
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003509 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003510 rsp->result = cpu_to_le16(result);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003511 rsp->flags = cpu_to_le16(0);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003512
3513 return ptr - data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003514}
3515
Gustavo Padovan2d792812012-10-06 10:07:01 +01003516static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len,
3517 void *data, u16 *result)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003518{
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003519 struct l2cap_conf_req *req = data;
3520 void *ptr = req->data;
3521 int type, olen;
3522 unsigned long val;
Mat Martineau36e999a2011-12-08 17:23:21 -08003523 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003524 struct l2cap_conf_efs efs;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003525
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003526 BT_DBG("chan %p, rsp %p, len %d, req %p", chan, rsp, len, data);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003527
3528 while (len >= L2CAP_CONF_OPT_SIZE) {
3529 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3530
3531 switch (type) {
3532 case L2CAP_CONF_MTU:
3533 if (val < L2CAP_DEFAULT_MIN_MTU) {
3534 *result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003535 chan->imtu = L2CAP_DEFAULT_MIN_MTU;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003536 } else
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003537 chan->imtu = val;
3538 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003539 break;
3540
3541 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003542 chan->flush_to = val;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003543 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003544 2, chan->flush_to);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003545 break;
3546
3547 case L2CAP_CONF_RFC:
3548 if (olen == sizeof(rfc))
3549 memcpy(&rfc, (void *)val, olen);
3550
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003551 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003552 rfc.mode != chan->mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003553 return -ECONNREFUSED;
3554
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003555 chan->fcs = 0;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003556
3557 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003558 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003559 break;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003560
3561 case L2CAP_CONF_EWS:
Mat Martineauc20f8e32012-07-10 05:47:07 -07003562 chan->ack_win = min_t(u16, val, chan->ack_win);
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003563 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Mat Martineauc20f8e32012-07-10 05:47:07 -07003564 chan->tx_win);
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003565 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003566
3567 case L2CAP_CONF_EFS:
3568 if (olen == sizeof(efs))
3569 memcpy(&efs, (void *)val, olen);
3570
3571 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003572 efs.stype != L2CAP_SERV_NOTRAFIC &&
3573 efs.stype != chan->local_stype)
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003574 return -ECONNREFUSED;
3575
Gustavo Padovan2d792812012-10-06 10:07:01 +01003576 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS, sizeof(efs),
3577 (unsigned long) &efs);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003578 break;
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003579
3580 case L2CAP_CONF_FCS:
3581 if (*result == L2CAP_CONF_PENDING)
3582 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003583 set_bit(CONF_RECV_NO_FCS,
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003584 &chan->conf_state);
3585 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003586 }
3587 }
3588
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003589 if (chan->mode == L2CAP_MODE_BASIC && chan->mode != rfc.mode)
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003590 return -ECONNREFUSED;
3591
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003592 chan->mode = rfc.mode;
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003593
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003594 if (*result == L2CAP_CONF_SUCCESS || *result == L2CAP_CONF_PENDING) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003595 switch (rfc.mode) {
3596 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003597 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3598 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
3599 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003600 if (!test_bit(FLAG_EXT_CTRL, &chan->flags))
3601 chan->ack_win = min_t(u16, chan->ack_win,
3602 rfc.txwin_size);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003603
3604 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3605 chan->local_msdu = le16_to_cpu(efs.msdu);
3606 chan->local_sdu_itime =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003607 le32_to_cpu(efs.sdu_itime);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003608 chan->local_acc_lat = le32_to_cpu(efs.acc_lat);
3609 chan->local_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003610 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003611 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003612 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003613
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003614 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003615 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003616 }
3617 }
3618
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003619 req->dcid = cpu_to_le16(chan->dcid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003620 req->flags = cpu_to_le16(0);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003621
3622 return ptr - data;
3623}
3624
Gustavo Padovan2d792812012-10-06 10:07:01 +01003625static int l2cap_build_conf_rsp(struct l2cap_chan *chan, void *data,
3626 u16 result, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003627{
3628 struct l2cap_conf_rsp *rsp = data;
3629 void *ptr = rsp->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003630
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003631 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003632
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003633 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003634 rsp->result = cpu_to_le16(result);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003635 rsp->flags = cpu_to_le16(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003636
3637 return ptr - data;
3638}
3639
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003640void __l2cap_le_connect_rsp_defer(struct l2cap_chan *chan)
3641{
3642 struct l2cap_le_conn_rsp rsp;
3643 struct l2cap_conn *conn = chan->conn;
3644
3645 BT_DBG("chan %p", chan);
3646
3647 rsp.dcid = cpu_to_le16(chan->scid);
3648 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02003649 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03003650 rsp.credits = cpu_to_le16(chan->rx_credits);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003651 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003652
3653 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp),
3654 &rsp);
3655}
3656
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003657void __l2cap_connect_rsp_defer(struct l2cap_chan *chan)
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003658{
3659 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003660 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003661 u8 buf[128];
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003662 u8 rsp_code;
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003663
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003664 rsp.scid = cpu_to_le16(chan->dcid);
3665 rsp.dcid = cpu_to_le16(chan->scid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003666 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
3667 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003668
3669 if (chan->hs_hcon)
3670 rsp_code = L2CAP_CREATE_CHAN_RSP;
3671 else
3672 rsp_code = L2CAP_CONN_RSP;
3673
3674 BT_DBG("chan %p rsp_code %u", chan, rsp_code);
3675
3676 l2cap_send_cmd(conn, chan->ident, rsp_code, sizeof(rsp), &rsp);
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003677
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003678 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003679 return;
3680
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003681 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003682 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003683 chan->num_conf_req++;
3684}
3685
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003686static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len)
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003687{
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003688 int type, olen;
3689 unsigned long val;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003690 /* Use sane default values in case a misbehaving remote device
3691 * did not send an RFC or extended window size option.
3692 */
3693 u16 txwin_ext = chan->ack_win;
3694 struct l2cap_conf_rfc rfc = {
3695 .mode = chan->mode,
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003696 .retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO),
3697 .monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO),
Mat Martineauc20f8e32012-07-10 05:47:07 -07003698 .max_pdu_size = cpu_to_le16(chan->imtu),
3699 .txwin_size = min_t(u16, chan->ack_win, L2CAP_DEFAULT_TX_WINDOW),
3700 };
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003701
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003702 BT_DBG("chan %p, rsp %p, len %d", chan, rsp, len);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003703
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003704 if ((chan->mode != L2CAP_MODE_ERTM) && (chan->mode != L2CAP_MODE_STREAMING))
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003705 return;
3706
3707 while (len >= L2CAP_CONF_OPT_SIZE) {
3708 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3709
Mat Martineauc20f8e32012-07-10 05:47:07 -07003710 switch (type) {
3711 case L2CAP_CONF_RFC:
3712 if (olen == sizeof(rfc))
3713 memcpy(&rfc, (void *)val, olen);
Szymon Janc8f321f82012-06-08 11:33:33 +02003714 break;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003715 case L2CAP_CONF_EWS:
3716 txwin_ext = val;
3717 break;
3718 }
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003719 }
3720
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003721 switch (rfc.mode) {
3722 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003723 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3724 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003725 chan->mps = le16_to_cpu(rfc.max_pdu_size);
3726 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3727 chan->ack_win = min_t(u16, chan->ack_win, txwin_ext);
3728 else
3729 chan->ack_win = min_t(u16, chan->ack_win,
3730 rfc.txwin_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003731 break;
3732 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003733 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003734 }
3735}
3736
Gustavo Padovan2d792812012-10-06 10:07:01 +01003737static inline int l2cap_command_rej(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003738 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3739 u8 *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003740{
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003741 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003742
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003743 if (cmd_len < sizeof(*rej))
3744 return -EPROTO;
3745
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003746 if (rej->reason != L2CAP_REJ_NOT_UNDERSTOOD)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003747 return 0;
3748
3749 if ((conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003750 cmd->ident == conn->info_ident) {
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02003751 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann984947d2009-02-06 23:35:19 +01003752
3753 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01003754 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01003755
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003756 l2cap_conn_start(conn);
3757 }
3758
3759 return 0;
3760}
3761
Mat Martineau17009152012-10-23 15:24:07 -07003762static struct l2cap_chan *l2cap_connect(struct l2cap_conn *conn,
3763 struct l2cap_cmd_hdr *cmd,
3764 u8 *data, u8 rsp_code, u8 amp_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003765{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003766 struct l2cap_conn_req *req = (struct l2cap_conn_req *) data;
3767 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003768 struct l2cap_chan *chan = NULL, *pchan;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003769 int result, status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003770
3771 u16 dcid = 0, scid = __le16_to_cpu(req->scid);
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003772 __le16 psm = req->psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003773
Andrei Emeltchenko097db762012-03-09 14:16:17 +02003774 BT_DBG("psm 0x%2.2x scid 0x%4.4x", __le16_to_cpu(psm), scid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003775
3776 /* Check if we have socket listening on psm */
Marcel Holtmann6f59b902013-10-13 05:24:01 -07003777 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03003778 &conn->hcon->dst, ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003779 if (!pchan) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003780 result = L2CAP_CR_BAD_PSM;
3781 goto sendresp;
3782 }
3783
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003784 mutex_lock(&conn->chan_lock);
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003785 l2cap_chan_lock(pchan);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00003786
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003787 /* Check if the ACL is secure enough (if not SDP) */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003788 if (psm != cpu_to_le16(L2CAP_PSM_SDP) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003789 !hci_conn_check_link_mode(conn->hcon)) {
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02003790 conn->disc_reason = HCI_ERROR_AUTH_FAILURE;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003791 result = L2CAP_CR_SEC_BLOCK;
3792 goto response;
3793 }
3794
Linus Torvalds1da177e2005-04-16 15:20:36 -07003795 result = L2CAP_CR_NO_MEM;
3796
Gustavo Padovan2dfa1002012-05-27 22:27:58 -03003797 /* Check if we already have channel with that dcid */
3798 if (__l2cap_get_chan_by_dcid(conn, scid))
3799 goto response;
3800
Gustavo Padovan80b98022012-05-27 22:27:51 -03003801 chan = pchan->ops->new_connection(pchan);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03003802 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003803 goto response;
3804
Syam Sidhardhan330b6c12013-08-06 01:59:12 +09003805 /* For certain devices (ex: HID mouse), support for authentication,
3806 * pairing and bonding is optional. For such devices, inorder to avoid
3807 * the ACL alive for too long after L2CAP disconnection, reset the ACL
3808 * disc_timeout back to HCI_DISCONN_TIMEOUT during L2CAP connect.
3809 */
3810 conn->hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
3811
Marcel Holtmann7eafc592013-10-13 08:12:47 -07003812 bacpy(&chan->src, &conn->hcon->src);
3813 bacpy(&chan->dst, &conn->hcon->dst);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -07003814 chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type);
3815 chan->dst_type = bdaddr_type(conn->hcon, conn->hcon->dst_type);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003816 chan->psm = psm;
3817 chan->dcid = scid;
Mat Martineau17009152012-10-23 15:24:07 -07003818 chan->local_amp_id = amp_id;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003819
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003820 __l2cap_chan_add(conn, chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003821
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003822 dcid = chan->scid;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003823
Gustavo Padovan8d836d72013-10-15 19:24:47 -03003824 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003825
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003826 chan->ident = cmd->ident;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003827
Marcel Holtmann984947d2009-02-06 23:35:19 +01003828 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) {
Gustavo F. Padovand45fc422011-11-05 19:54:24 -02003829 if (l2cap_chan_check_security(chan)) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07003830 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003831 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003832 result = L2CAP_CR_PEND;
3833 status = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08003834 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003835 } else {
Mat Martineau17009152012-10-23 15:24:07 -07003836 /* Force pending result for AMP controllers.
3837 * The connection will succeed after the
3838 * physical link is up.
3839 */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003840 if (amp_id == AMP_ID_BREDR) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003841 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau17009152012-10-23 15:24:07 -07003842 result = L2CAP_CR_SUCCESS;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003843 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003844 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003845 result = L2CAP_CR_PEND;
Mat Martineau17009152012-10-23 15:24:07 -07003846 }
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003847 status = L2CAP_CS_NO_INFO;
3848 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003849 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003850 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003851 result = L2CAP_CR_PEND;
3852 status = L2CAP_CS_AUTHEN_PEND;
3853 }
3854 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003855 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003856 result = L2CAP_CR_PEND;
3857 status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003858 }
3859
Linus Torvalds1da177e2005-04-16 15:20:36 -07003860response:
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003861 l2cap_chan_unlock(pchan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003862 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003863
3864sendresp:
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003865 rsp.scid = cpu_to_le16(scid);
3866 rsp.dcid = cpu_to_le16(dcid);
3867 rsp.result = cpu_to_le16(result);
3868 rsp.status = cpu_to_le16(status);
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003869 l2cap_send_cmd(conn, cmd->ident, rsp_code, sizeof(rsp), &rsp);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003870
3871 if (result == L2CAP_CR_PEND && status == L2CAP_CS_NO_INFO) {
3872 struct l2cap_info_req info;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003873 info.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003874
3875 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
3876 conn->info_ident = l2cap_get_ident(conn);
3877
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08003878 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003879
Gustavo Padovan2d792812012-10-06 10:07:01 +01003880 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
3881 sizeof(info), &info);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003882 }
3883
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003884 if (chan && !test_bit(CONF_REQ_SENT, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003885 result == L2CAP_CR_SUCCESS) {
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003886 u8 buf[128];
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003887 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003888 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003889 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003890 chan->num_conf_req++;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003891 }
Mat Martineau17009152012-10-23 15:24:07 -07003892
3893 return chan;
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003894}
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003895
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003896static int l2cap_connect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003897 struct l2cap_cmd_hdr *cmd, u16 cmd_len, u8 *data)
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003898{
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303899 struct hci_dev *hdev = conn->hcon->hdev;
3900 struct hci_conn *hcon = conn->hcon;
3901
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003902 if (cmd_len < sizeof(struct l2cap_conn_req))
3903 return -EPROTO;
3904
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303905 hci_dev_lock(hdev);
3906 if (test_bit(HCI_MGMT, &hdev->dev_flags) &&
3907 !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &hcon->flags))
3908 mgmt_device_connected(hdev, &hcon->dst, hcon->type,
3909 hcon->dst_type, 0, NULL, 0,
3910 hcon->dev_class);
3911 hci_dev_unlock(hdev);
3912
Gustavo Padovan300229f2012-10-12 19:40:40 +08003913 l2cap_connect(conn, cmd, data, L2CAP_CONN_RSP, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003914 return 0;
3915}
3916
Mat Martineau5909cf32012-10-23 15:24:08 -07003917static int l2cap_connect_create_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003918 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3919 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003920{
3921 struct l2cap_conn_rsp *rsp = (struct l2cap_conn_rsp *) data;
3922 u16 scid, dcid, result, status;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003923 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003924 u8 req[128];
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003925 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003926
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003927 if (cmd_len < sizeof(*rsp))
3928 return -EPROTO;
3929
Linus Torvalds1da177e2005-04-16 15:20:36 -07003930 scid = __le16_to_cpu(rsp->scid);
3931 dcid = __le16_to_cpu(rsp->dcid);
3932 result = __le16_to_cpu(rsp->result);
3933 status = __le16_to_cpu(rsp->status);
3934
Andrei Emeltchenko1b009c92012-02-21 12:54:54 +02003935 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 +01003936 dcid, scid, result, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003937
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003938 mutex_lock(&conn->chan_lock);
3939
Linus Torvalds1da177e2005-04-16 15:20:36 -07003940 if (scid) {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003941 chan = __l2cap_get_chan_by_scid(conn, scid);
3942 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003943 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003944 goto unlock;
3945 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003946 } else {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003947 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
3948 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003949 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003950 goto unlock;
3951 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003952 }
3953
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003954 err = 0;
3955
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003956 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003957
Linus Torvalds1da177e2005-04-16 15:20:36 -07003958 switch (result) {
3959 case L2CAP_CR_SUCCESS:
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03003960 l2cap_state_change(chan, BT_CONFIG);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003961 chan->ident = 0;
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003962 chan->dcid = dcid;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003963 clear_bit(CONF_CONNECT_PEND, &chan->conf_state);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01003964
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003965 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003966 break;
3967
Linus Torvalds1da177e2005-04-16 15:20:36 -07003968 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003969 l2cap_build_conf_req(chan, req), req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003970 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003971 break;
3972
3973 case L2CAP_CR_PEND:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003974 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003975 break;
3976
3977 default:
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003978 l2cap_chan_del(chan, ECONNREFUSED);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003979 break;
3980 }
3981
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003982 l2cap_chan_unlock(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003983
3984unlock:
3985 mutex_unlock(&conn->chan_lock);
3986
3987 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003988}
3989
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003990static inline void set_default_fcs(struct l2cap_chan *chan)
Mat Martineau8c462b62010-08-24 15:35:42 -07003991{
3992 /* FCS is enabled only in ERTM or streaming mode, if one or both
3993 * sides request it.
3994 */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003995 if (chan->mode != L2CAP_MODE_ERTM && chan->mode != L2CAP_MODE_STREAMING)
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003996 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003997 else if (!test_bit(CONF_RECV_NO_FCS, &chan->conf_state))
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003998 chan->fcs = L2CAP_FCS_CRC16;
Mat Martineau8c462b62010-08-24 15:35:42 -07003999}
4000
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03004001static void l2cap_send_efs_conf_rsp(struct l2cap_chan *chan, void *data,
4002 u8 ident, u16 flags)
4003{
4004 struct l2cap_conn *conn = chan->conn;
4005
4006 BT_DBG("conn %p chan %p ident %d flags 0x%4.4x", conn, chan, ident,
4007 flags);
4008
4009 clear_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
4010 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
4011
4012 l2cap_send_cmd(conn, ident, L2CAP_CONF_RSP,
4013 l2cap_build_conf_rsp(chan, data,
4014 L2CAP_CONF_SUCCESS, flags), data);
4015}
4016
Johan Hedberg662d6522013-10-16 11:20:47 +03004017static void cmd_reject_invalid_cid(struct l2cap_conn *conn, u8 ident,
4018 u16 scid, u16 dcid)
4019{
4020 struct l2cap_cmd_rej_cid rej;
4021
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004022 rej.reason = cpu_to_le16(L2CAP_REJ_INVALID_CID);
Johan Hedberg662d6522013-10-16 11:20:47 +03004023 rej.scid = __cpu_to_le16(scid);
4024 rej.dcid = __cpu_to_le16(dcid);
4025
4026 l2cap_send_cmd(conn, ident, L2CAP_COMMAND_REJ, sizeof(rej), &rej);
4027}
4028
Gustavo Padovan2d792812012-10-06 10:07:01 +01004029static inline int l2cap_config_req(struct l2cap_conn *conn,
4030 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4031 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004032{
4033 struct l2cap_conf_req *req = (struct l2cap_conf_req *) data;
4034 u16 dcid, flags;
4035 u8 rsp[64];
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004036 struct l2cap_chan *chan;
Mat Martineau3c588192012-04-11 10:48:42 -07004037 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004038
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004039 if (cmd_len < sizeof(*req))
4040 return -EPROTO;
4041
Linus Torvalds1da177e2005-04-16 15:20:36 -07004042 dcid = __le16_to_cpu(req->dcid);
4043 flags = __le16_to_cpu(req->flags);
4044
4045 BT_DBG("dcid 0x%4.4x flags 0x%2.2x", dcid, flags);
4046
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004047 chan = l2cap_get_chan_by_scid(conn, dcid);
Johan Hedberg662d6522013-10-16 11:20:47 +03004048 if (!chan) {
4049 cmd_reject_invalid_cid(conn, cmd->ident, dcid, 0);
4050 return 0;
4051 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004052
David S. Miller033b1142011-07-21 13:38:42 -07004053 if (chan->state != BT_CONFIG && chan->state != BT_CONNECT2) {
Johan Hedberg662d6522013-10-16 11:20:47 +03004054 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4055 chan->dcid);
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004056 goto unlock;
Gustavo F. Padovandf6bd742010-06-14 02:26:15 -03004057 }
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004058
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004059 /* Reject if config buffer is too small. */
Al Viro88219a02007-07-29 00:17:25 -07004060 len = cmd_len - sizeof(*req);
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004061 if (chan->conf_len + len > sizeof(chan->conf_req)) {
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004062 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004063 l2cap_build_conf_rsp(chan, rsp,
4064 L2CAP_CONF_REJECT, flags), rsp);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004065 goto unlock;
4066 }
4067
4068 /* Store config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004069 memcpy(chan->conf_req + chan->conf_len, req->data, len);
4070 chan->conf_len += len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004071
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004072 if (flags & L2CAP_CONF_FLAG_CONTINUATION) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004073 /* Incomplete config. Send empty response. */
4074 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004075 l2cap_build_conf_rsp(chan, rsp,
4076 L2CAP_CONF_SUCCESS, flags), rsp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004077 goto unlock;
4078 }
4079
4080 /* Complete config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004081 len = l2cap_parse_conf_req(chan, rsp);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004082 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004083 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004084 goto unlock;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004085 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004086
Mat Martineau1500109b2012-10-23 15:24:15 -07004087 chan->ident = cmd->ident;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004088 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004089 chan->num_conf_rsp++;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004090
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004091 /* Reset config buffer. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004092 chan->conf_len = 0;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004093
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004094 if (!test_bit(CONF_OUTPUT_DONE, &chan->conf_state))
Marcel Holtmann876d9482007-10-20 13:35:42 +02004095 goto unlock;
4096
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004097 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004098 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004099
Mat Martineau105bdf92012-04-27 16:50:48 -07004100 if (chan->mode == L2CAP_MODE_ERTM ||
4101 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004102 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004103
Mat Martineau3c588192012-04-11 10:48:42 -07004104 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004105 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004106 else
4107 l2cap_chan_ready(chan);
4108
Marcel Holtmann876d9482007-10-20 13:35:42 +02004109 goto unlock;
4110 }
4111
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004112 if (!test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02004113 u8 buf[64];
Linus Torvalds1da177e2005-04-16 15:20:36 -07004114 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004115 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004116 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004117 }
4118
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004119 /* Got Conf Rsp PENDING from remote side and asume we sent
4120 Conf Rsp PENDING in the code above */
4121 if (test_bit(CONF_REM_CONF_PEND, &chan->conf_state) &&
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03004122 test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004123
4124 /* check compatibility */
4125
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004126 /* Send rsp for BR/EDR channel */
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004127 if (!chan->hs_hcon)
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004128 l2cap_send_efs_conf_rsp(chan, rsp, cmd->ident, flags);
4129 else
4130 chan->ident = cmd->ident;
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004131 }
4132
Linus Torvalds1da177e2005-04-16 15:20:36 -07004133unlock:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004134 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004135 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004136}
4137
Gustavo Padovan2d792812012-10-06 10:07:01 +01004138static inline int l2cap_config_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004139 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4140 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004141{
4142 struct l2cap_conf_rsp *rsp = (struct l2cap_conf_rsp *)data;
4143 u16 scid, flags, result;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004144 struct l2cap_chan *chan;
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004145 int len = cmd_len - sizeof(*rsp);
Mat Martineau3c588192012-04-11 10:48:42 -07004146 int err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004147
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004148 if (cmd_len < sizeof(*rsp))
4149 return -EPROTO;
4150
Linus Torvalds1da177e2005-04-16 15:20:36 -07004151 scid = __le16_to_cpu(rsp->scid);
4152 flags = __le16_to_cpu(rsp->flags);
4153 result = __le16_to_cpu(rsp->result);
4154
Andrei Emeltchenko61386cb2012-03-12 12:13:07 +02004155 BT_DBG("scid 0x%4.4x flags 0x%2.2x result 0x%2.2x len %d", scid, flags,
4156 result, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004157
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004158 chan = l2cap_get_chan_by_scid(conn, scid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004159 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004160 return 0;
4161
4162 switch (result) {
4163 case L2CAP_CONF_SUCCESS:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004164 l2cap_conf_rfc_get(chan, rsp->data, len);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004165 clear_bit(CONF_REM_CONF_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004166 break;
4167
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004168 case L2CAP_CONF_PENDING:
4169 set_bit(CONF_REM_CONF_PEND, &chan->conf_state);
4170
4171 if (test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
4172 char buf[64];
4173
4174 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004175 buf, &result);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004176 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004177 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004178 goto done;
4179 }
4180
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004181 if (!chan->hs_hcon) {
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004182 l2cap_send_efs_conf_rsp(chan, buf, cmd->ident,
4183 0);
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02004184 } else {
4185 if (l2cap_check_efs(chan)) {
4186 amp_create_logical_link(chan);
4187 chan->ident = cmd->ident;
4188 }
4189 }
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004190 }
4191 goto done;
4192
Linus Torvalds1da177e2005-04-16 15:20:36 -07004193 case L2CAP_CONF_UNACCEPT:
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004194 if (chan->num_conf_rsp <= L2CAP_CONF_MAX_CONF_RSP) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004195 char req[64];
4196
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004197 if (len > sizeof(req) - sizeof(struct l2cap_conf_req)) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004198 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004199 goto done;
4200 }
4201
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004202 /* throw out any old stored conf requests */
4203 result = L2CAP_CONF_SUCCESS;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03004204 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004205 req, &result);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004206 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004207 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004208 goto done;
4209 }
4210
4211 l2cap_send_cmd(conn, l2cap_get_ident(conn),
Gustavo Padovan2d792812012-10-06 10:07:01 +01004212 L2CAP_CONF_REQ, len, req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004213 chan->num_conf_req++;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004214 if (result != L2CAP_CONF_SUCCESS)
4215 goto done;
4216 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004217 }
4218
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09004219 default:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004220 l2cap_chan_set_err(chan, ECONNRESET);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +02004221
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08004222 __set_chan_timer(chan, L2CAP_DISC_REJ_TIMEOUT);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004223 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004224 goto done;
4225 }
4226
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004227 if (flags & L2CAP_CONF_FLAG_CONTINUATION)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004228 goto done;
4229
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004230 set_bit(CONF_INPUT_DONE, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004231
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004232 if (test_bit(CONF_OUTPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004233 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004234
Mat Martineau105bdf92012-04-27 16:50:48 -07004235 if (chan->mode == L2CAP_MODE_ERTM ||
4236 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004237 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004238
Mat Martineau3c588192012-04-11 10:48:42 -07004239 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004240 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004241 else
4242 l2cap_chan_ready(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004243 }
4244
4245done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004246 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004247 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004248}
4249
Gustavo Padovan2d792812012-10-06 10:07:01 +01004250static inline int l2cap_disconnect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004251 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4252 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004253{
4254 struct l2cap_disconn_req *req = (struct l2cap_disconn_req *) data;
4255 struct l2cap_disconn_rsp rsp;
4256 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004257 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004258
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004259 if (cmd_len != sizeof(*req))
4260 return -EPROTO;
4261
Linus Torvalds1da177e2005-04-16 15:20:36 -07004262 scid = __le16_to_cpu(req->scid);
4263 dcid = __le16_to_cpu(req->dcid);
4264
4265 BT_DBG("scid 0x%4.4x dcid 0x%4.4x", scid, dcid);
4266
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004267 mutex_lock(&conn->chan_lock);
4268
4269 chan = __l2cap_get_chan_by_scid(conn, dcid);
4270 if (!chan) {
4271 mutex_unlock(&conn->chan_lock);
Johan Hedberg662d6522013-10-16 11:20:47 +03004272 cmd_reject_invalid_cid(conn, cmd->ident, dcid, scid);
4273 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004274 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004275
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004276 l2cap_chan_lock(chan);
4277
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03004278 rsp.dcid = cpu_to_le16(chan->scid);
4279 rsp.scid = cpu_to_le16(chan->dcid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004280 l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp);
4281
Gustavo Padovan5ec1bbe2013-10-15 19:24:48 -03004282 chan->ops->set_shutdown(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004283
Mat Martineau61d6ef32012-04-27 16:50:50 -07004284 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004285 l2cap_chan_del(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004286
4287 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004288
Gustavo Padovan80b98022012-05-27 22:27:51 -03004289 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004290 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004291
4292 mutex_unlock(&conn->chan_lock);
4293
Linus Torvalds1da177e2005-04-16 15:20:36 -07004294 return 0;
4295}
4296
Gustavo Padovan2d792812012-10-06 10:07:01 +01004297static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004298 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4299 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004300{
4301 struct l2cap_disconn_rsp *rsp = (struct l2cap_disconn_rsp *) data;
4302 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004303 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004304
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004305 if (cmd_len != sizeof(*rsp))
4306 return -EPROTO;
4307
Linus Torvalds1da177e2005-04-16 15:20:36 -07004308 scid = __le16_to_cpu(rsp->scid);
4309 dcid = __le16_to_cpu(rsp->dcid);
4310
4311 BT_DBG("dcid 0x%4.4x scid 0x%4.4x", dcid, scid);
4312
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004313 mutex_lock(&conn->chan_lock);
4314
4315 chan = __l2cap_get_chan_by_scid(conn, scid);
4316 if (!chan) {
4317 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004318 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004319 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004320
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004321 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004322
Mat Martineau61d6ef32012-04-27 16:50:50 -07004323 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004324 l2cap_chan_del(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004325
4326 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004327
Gustavo Padovan80b98022012-05-27 22:27:51 -03004328 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004329 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004330
4331 mutex_unlock(&conn->chan_lock);
4332
Linus Torvalds1da177e2005-04-16 15:20:36 -07004333 return 0;
4334}
4335
Gustavo Padovan2d792812012-10-06 10:07:01 +01004336static inline int l2cap_information_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004337 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4338 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004339{
4340 struct l2cap_info_req *req = (struct l2cap_info_req *) data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004341 u16 type;
4342
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004343 if (cmd_len != sizeof(*req))
4344 return -EPROTO;
4345
Linus Torvalds1da177e2005-04-16 15:20:36 -07004346 type = __le16_to_cpu(req->type);
4347
4348 BT_DBG("type 0x%4.4x", type);
4349
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004350 if (type == L2CAP_IT_FEAT_MASK) {
4351 u8 buf[8];
Marcel Holtmann44dd46d2009-05-02 19:09:01 -07004352 u32 feat_mask = l2cap_feat_mask;
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004353 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004354 rsp->type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
4355 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03004356 if (!disable_ertm)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004357 feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING
Gustavo Padovan2d792812012-10-06 10:07:01 +01004358 | L2CAP_FEAT_FCS;
Marcel Holtmann848566b2013-10-01 22:59:22 -07004359 if (conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03004360 feat_mask |= L2CAP_FEAT_EXT_FLOW
Gustavo Padovan2d792812012-10-06 10:07:01 +01004361 | L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenkoa5fd6f32011-09-16 16:26:32 +03004362
Gustavo F. Padovan1b7bf4e2009-08-24 00:45:20 -03004363 put_unaligned_le32(feat_mask, rsp->data);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004364 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4365 buf);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004366 } else if (type == L2CAP_IT_FIXED_CHAN) {
4367 u8 buf[12];
4368 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Mat Martineau50a147c2011-11-02 16:18:34 -07004369
Marcel Holtmann848566b2013-10-01 22:59:22 -07004370 if (conn->hs_enabled)
Mat Martineau50a147c2011-11-02 16:18:34 -07004371 l2cap_fixed_chan[0] |= L2CAP_FC_A2MP;
4372 else
4373 l2cap_fixed_chan[0] &= ~L2CAP_FC_A2MP;
4374
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004375 rsp->type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
4376 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Andrei Emeltchenkoc6337ea2011-10-20 17:02:44 +03004377 memcpy(rsp->data, l2cap_fixed_chan, sizeof(l2cap_fixed_chan));
Gustavo Padovan2d792812012-10-06 10:07:01 +01004378 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4379 buf);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004380 } else {
4381 struct l2cap_info_rsp rsp;
4382 rsp.type = cpu_to_le16(type);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004383 rsp.result = cpu_to_le16(L2CAP_IR_NOTSUPP);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004384 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(rsp),
4385 &rsp);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004386 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004387
4388 return 0;
4389}
4390
Gustavo Padovan2d792812012-10-06 10:07:01 +01004391static inline int l2cap_information_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004392 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4393 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004394{
4395 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) data;
4396 u16 type, result;
4397
Jaganath Kanakkassery3f6fa3d2013-06-21 19:55:11 +05304398 if (cmd_len < sizeof(*rsp))
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004399 return -EPROTO;
4400
Linus Torvalds1da177e2005-04-16 15:20:36 -07004401 type = __le16_to_cpu(rsp->type);
4402 result = __le16_to_cpu(rsp->result);
4403
4404 BT_DBG("type 0x%4.4x result 0x%2.2x", type, result);
4405
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004406 /* L2CAP Info req/rsp are unbound to channels, add extra checks */
4407 if (cmd->ident != conn->info_ident ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01004408 conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004409 return 0;
4410
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02004411 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004412
Ville Tervoadb08ed2010-08-04 09:43:33 +03004413 if (result != L2CAP_IR_SUCCESS) {
4414 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4415 conn->info_ident = 0;
4416
4417 l2cap_conn_start(conn);
4418
4419 return 0;
4420 }
4421
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004422 switch (type) {
4423 case L2CAP_IT_FEAT_MASK:
Harvey Harrison83985312008-05-02 16:25:46 -07004424 conn->feat_mask = get_unaligned_le32(rsp->data);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004425
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07004426 if (conn->feat_mask & L2CAP_FEAT_FIXED_CHAN) {
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004427 struct l2cap_info_req req;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004428 req.type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004429
4430 conn->info_ident = l2cap_get_ident(conn);
4431
4432 l2cap_send_cmd(conn, conn->info_ident,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004433 L2CAP_INFO_REQ, sizeof(req), &req);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004434 } else {
4435 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4436 conn->info_ident = 0;
4437
4438 l2cap_conn_start(conn);
4439 }
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004440 break;
4441
4442 case L2CAP_IT_FIXED_CHAN:
4443 conn->fixed_chan_mask = rsp->data[0];
Marcel Holtmann984947d2009-02-06 23:35:19 +01004444 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004445 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004446
4447 l2cap_conn_start(conn);
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004448 break;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004449 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004450
Linus Torvalds1da177e2005-04-16 15:20:36 -07004451 return 0;
4452}
4453
Mat Martineau17009152012-10-23 15:24:07 -07004454static int l2cap_create_channel_req(struct l2cap_conn *conn,
4455 struct l2cap_cmd_hdr *cmd,
4456 u16 cmd_len, void *data)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004457{
4458 struct l2cap_create_chan_req *req = data;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004459 struct l2cap_create_chan_rsp rsp;
Mat Martineau17009152012-10-23 15:24:07 -07004460 struct l2cap_chan *chan;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004461 struct hci_dev *hdev;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004462 u16 psm, scid;
4463
4464 if (cmd_len != sizeof(*req))
4465 return -EPROTO;
4466
Marcel Holtmann848566b2013-10-01 22:59:22 -07004467 if (!conn->hs_enabled)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004468 return -EINVAL;
4469
4470 psm = le16_to_cpu(req->psm);
4471 scid = le16_to_cpu(req->scid);
4472
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004473 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 -07004474
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004475 /* For controller id 0 make BR/EDR connection */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004476 if (req->amp_id == AMP_ID_BREDR) {
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004477 l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4478 req->amp_id);
4479 return 0;
4480 }
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004481
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004482 /* Validate AMP controller id */
4483 hdev = hci_dev_get(req->amp_id);
4484 if (!hdev)
4485 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004486
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004487 if (hdev->dev_type != HCI_AMP || !test_bit(HCI_UP, &hdev->flags)) {
Mat Martineau17009152012-10-23 15:24:07 -07004488 hci_dev_put(hdev);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004489 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004490 }
4491
4492 chan = l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4493 req->amp_id);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004494 if (chan) {
4495 struct amp_mgr *mgr = conn->hcon->amp_mgr;
4496 struct hci_conn *hs_hcon;
4497
Marcel Holtmann98e0f7e2013-10-13 02:23:40 -07004498 hs_hcon = hci_conn_hash_lookup_ba(hdev, AMP_LINK,
4499 &conn->hcon->dst);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004500 if (!hs_hcon) {
4501 hci_dev_put(hdev);
Johan Hedberg662d6522013-10-16 11:20:47 +03004502 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4503 chan->dcid);
4504 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004505 }
4506
4507 BT_DBG("mgr %p bredr_chan %p hs_hcon %p", mgr, chan, hs_hcon);
4508
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004509 mgr->bredr_chan = chan;
4510 chan->hs_hcon = hs_hcon;
Andrei Emeltchenkofd45bf42012-11-20 17:16:22 +02004511 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004512 conn->mtu = hdev->block_mtu;
4513 }
4514
4515 hci_dev_put(hdev);
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004516
4517 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004518
4519error:
4520 rsp.dcid = 0;
4521 rsp.scid = cpu_to_le16(scid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004522 rsp.result = cpu_to_le16(L2CAP_CR_BAD_AMP);
4523 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004524
4525 l2cap_send_cmd(conn, cmd->ident, L2CAP_CREATE_CHAN_RSP,
4526 sizeof(rsp), &rsp);
4527
Johan Hedbergdc280802013-09-16 13:05:13 +03004528 return 0;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004529}
4530
Mat Martineau8eb200b2012-10-23 15:24:17 -07004531static void l2cap_send_move_chan_req(struct l2cap_chan *chan, u8 dest_amp_id)
4532{
4533 struct l2cap_move_chan_req req;
4534 u8 ident;
4535
4536 BT_DBG("chan %p, dest_amp_id %d", chan, dest_amp_id);
4537
4538 ident = l2cap_get_ident(chan->conn);
4539 chan->ident = ident;
4540
4541 req.icid = cpu_to_le16(chan->scid);
4542 req.dest_amp_id = dest_amp_id;
4543
4544 l2cap_send_cmd(chan->conn, ident, L2CAP_MOVE_CHAN_REQ, sizeof(req),
4545 &req);
4546
4547 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4548}
4549
Mat Martineau1500109b2012-10-23 15:24:15 -07004550static void l2cap_send_move_chan_rsp(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004551{
4552 struct l2cap_move_chan_rsp rsp;
4553
Mat Martineau1500109b2012-10-23 15:24:15 -07004554 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004555
Mat Martineau1500109b2012-10-23 15:24:15 -07004556 rsp.icid = cpu_to_le16(chan->dcid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004557 rsp.result = cpu_to_le16(result);
4558
Mat Martineau1500109b2012-10-23 15:24:15 -07004559 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_RSP,
4560 sizeof(rsp), &rsp);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004561}
4562
Mat Martineau5b155ef2012-10-23 15:24:14 -07004563static void l2cap_send_move_chan_cfm(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004564{
4565 struct l2cap_move_chan_cfm cfm;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004566
Mat Martineau5b155ef2012-10-23 15:24:14 -07004567 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004568
Mat Martineau5b155ef2012-10-23 15:24:14 -07004569 chan->ident = l2cap_get_ident(chan->conn);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004570
Mat Martineau5b155ef2012-10-23 15:24:14 -07004571 cfm.icid = cpu_to_le16(chan->scid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004572 cfm.result = cpu_to_le16(result);
4573
Mat Martineau5b155ef2012-10-23 15:24:14 -07004574 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_CFM,
4575 sizeof(cfm), &cfm);
4576
4577 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4578}
4579
4580static void l2cap_send_move_chan_cfm_icid(struct l2cap_conn *conn, u16 icid)
4581{
4582 struct l2cap_move_chan_cfm cfm;
4583
4584 BT_DBG("conn %p, icid 0x%4.4x", conn, icid);
4585
4586 cfm.icid = cpu_to_le16(icid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004587 cfm.result = cpu_to_le16(L2CAP_MC_UNCONFIRMED);
Mat Martineau5b155ef2012-10-23 15:24:14 -07004588
4589 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_MOVE_CHAN_CFM,
4590 sizeof(cfm), &cfm);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004591}
4592
4593static void l2cap_send_move_chan_cfm_rsp(struct l2cap_conn *conn, u8 ident,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004594 u16 icid)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004595{
4596 struct l2cap_move_chan_cfm_rsp rsp;
4597
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004598 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004599
4600 rsp.icid = cpu_to_le16(icid);
4601 l2cap_send_cmd(conn, ident, L2CAP_MOVE_CHAN_CFM_RSP, sizeof(rsp), &rsp);
4602}
4603
Mat Martineau5f3847a2012-10-23 15:24:12 -07004604static void __release_logical_link(struct l2cap_chan *chan)
4605{
4606 chan->hs_hchan = NULL;
4607 chan->hs_hcon = NULL;
4608
4609 /* Placeholder - release the logical link */
4610}
4611
Mat Martineau1500109b2012-10-23 15:24:15 -07004612static void l2cap_logical_fail(struct l2cap_chan *chan)
4613{
4614 /* Logical link setup failed */
4615 if (chan->state != BT_CONNECTED) {
4616 /* Create channel failure, disconnect */
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004617 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineau1500109b2012-10-23 15:24:15 -07004618 return;
4619 }
4620
4621 switch (chan->move_role) {
4622 case L2CAP_MOVE_ROLE_RESPONDER:
4623 l2cap_move_done(chan);
4624 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_SUPP);
4625 break;
4626 case L2CAP_MOVE_ROLE_INITIATOR:
4627 if (chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_COMP ||
4628 chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_CFM) {
4629 /* Remote has only sent pending or
4630 * success responses, clean up
4631 */
4632 l2cap_move_done(chan);
4633 }
4634
4635 /* Other amp move states imply that the move
4636 * has already aborted
4637 */
4638 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
4639 break;
4640 }
4641}
4642
4643static void l2cap_logical_finish_create(struct l2cap_chan *chan,
4644 struct hci_chan *hchan)
4645{
4646 struct l2cap_conf_rsp rsp;
Mat Martineau1500109b2012-10-23 15:24:15 -07004647
Andrei Emeltchenko336178a2012-10-31 15:46:27 +02004648 chan->hs_hchan = hchan;
Mat Martineau1500109b2012-10-23 15:24:15 -07004649 chan->hs_hcon->l2cap_data = chan->conn;
4650
Andrei Emeltchenko35ba9562012-10-25 15:20:43 +03004651 l2cap_send_efs_conf_rsp(chan, &rsp, chan->ident, 0);
Mat Martineau1500109b2012-10-23 15:24:15 -07004652
4653 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Andrei Emeltchenkofe79c6f2012-10-25 15:20:42 +03004654 int err;
Mat Martineau1500109b2012-10-23 15:24:15 -07004655
4656 set_default_fcs(chan);
4657
4658 err = l2cap_ertm_init(chan);
4659 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004660 l2cap_send_disconn_req(chan, -err);
Mat Martineau1500109b2012-10-23 15:24:15 -07004661 else
4662 l2cap_chan_ready(chan);
4663 }
4664}
4665
4666static void l2cap_logical_finish_move(struct l2cap_chan *chan,
4667 struct hci_chan *hchan)
4668{
4669 chan->hs_hcon = hchan->conn;
4670 chan->hs_hcon->l2cap_data = chan->conn;
4671
4672 BT_DBG("move_state %d", chan->move_state);
4673
4674 switch (chan->move_state) {
4675 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
4676 /* Move confirm will be sent after a success
4677 * response is received
4678 */
4679 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4680 break;
4681 case L2CAP_MOVE_WAIT_LOGICAL_CFM:
4682 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4683 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4684 } else if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
4685 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
4686 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
4687 } else if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4688 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4689 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4690 }
4691 break;
4692 default:
4693 /* Move was not in expected state, free the channel */
4694 __release_logical_link(chan);
4695
4696 chan->move_state = L2CAP_MOVE_STABLE;
4697 }
4698}
4699
4700/* Call with chan locked */
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004701void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan,
4702 u8 status)
Mat Martineau5b155ef2012-10-23 15:24:14 -07004703{
Mat Martineau1500109b2012-10-23 15:24:15 -07004704 BT_DBG("chan %p, hchan %p, status %d", chan, hchan, status);
4705
4706 if (status) {
4707 l2cap_logical_fail(chan);
4708 __release_logical_link(chan);
4709 return;
4710 }
4711
4712 if (chan->state != BT_CONNECTED) {
4713 /* Ignore logical link if channel is on BR/EDR */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004714 if (chan->local_amp_id != AMP_ID_BREDR)
Mat Martineau1500109b2012-10-23 15:24:15 -07004715 l2cap_logical_finish_create(chan, hchan);
4716 } else {
4717 l2cap_logical_finish_move(chan, hchan);
4718 }
Mat Martineau5b155ef2012-10-23 15:24:14 -07004719}
4720
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004721void l2cap_move_start(struct l2cap_chan *chan)
4722{
4723 BT_DBG("chan %p", chan);
4724
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004725 if (chan->local_amp_id == AMP_ID_BREDR) {
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004726 if (chan->chan_policy != BT_CHANNEL_POLICY_AMP_PREFERRED)
4727 return;
4728 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4729 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4730 /* Placeholder - start physical link setup */
4731 } else {
4732 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4733 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4734 chan->move_id = 0;
4735 l2cap_move_setup(chan);
4736 l2cap_send_move_chan_req(chan, 0);
4737 }
4738}
4739
Mat Martineau8eb200b2012-10-23 15:24:17 -07004740static void l2cap_do_create(struct l2cap_chan *chan, int result,
4741 u8 local_amp_id, u8 remote_amp_id)
4742{
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004743 BT_DBG("chan %p state %s %u -> %u", chan, state_to_string(chan->state),
4744 local_amp_id, remote_amp_id);
4745
Andrei Emeltchenko12d6cc62012-11-14 17:39:31 +02004746 chan->fcs = L2CAP_FCS_NONE;
4747
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004748 /* Outgoing channel on AMP */
4749 if (chan->state == BT_CONNECT) {
4750 if (result == L2CAP_CR_SUCCESS) {
4751 chan->local_amp_id = local_amp_id;
4752 l2cap_send_create_chan_req(chan, remote_amp_id);
4753 } else {
4754 /* Revert to BR/EDR connect */
4755 l2cap_send_conn_req(chan);
4756 }
4757
4758 return;
4759 }
4760
4761 /* Incoming channel on AMP */
4762 if (__l2cap_no_conn_pending(chan)) {
Mat Martineau8eb200b2012-10-23 15:24:17 -07004763 struct l2cap_conn_rsp rsp;
4764 char buf[128];
4765 rsp.scid = cpu_to_le16(chan->dcid);
4766 rsp.dcid = cpu_to_le16(chan->scid);
4767
Mat Martineau8eb200b2012-10-23 15:24:17 -07004768 if (result == L2CAP_CR_SUCCESS) {
4769 /* Send successful response */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004770 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
4771 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004772 } else {
4773 /* Send negative response */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004774 rsp.result = cpu_to_le16(L2CAP_CR_NO_MEM);
4775 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004776 }
4777
4778 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_RSP,
4779 sizeof(rsp), &rsp);
4780
4781 if (result == L2CAP_CR_SUCCESS) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02004782 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004783 set_bit(CONF_REQ_SENT, &chan->conf_state);
4784 l2cap_send_cmd(chan->conn, l2cap_get_ident(chan->conn),
4785 L2CAP_CONF_REQ,
4786 l2cap_build_conf_req(chan, buf), buf);
4787 chan->num_conf_req++;
4788 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004789 }
4790}
4791
4792static void l2cap_do_move_initiate(struct l2cap_chan *chan, u8 local_amp_id,
4793 u8 remote_amp_id)
4794{
4795 l2cap_move_setup(chan);
4796 chan->move_id = local_amp_id;
4797 chan->move_state = L2CAP_MOVE_WAIT_RSP;
4798
4799 l2cap_send_move_chan_req(chan, remote_amp_id);
4800}
4801
4802static void l2cap_do_move_respond(struct l2cap_chan *chan, int result)
4803{
4804 struct hci_chan *hchan = NULL;
4805
4806 /* Placeholder - get hci_chan for logical link */
4807
4808 if (hchan) {
4809 if (hchan->state == BT_CONNECTED) {
4810 /* Logical link is ready to go */
4811 chan->hs_hcon = hchan->conn;
4812 chan->hs_hcon->l2cap_data = chan->conn;
4813 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4814 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4815
4816 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
4817 } else {
4818 /* Wait for logical link to be ready */
4819 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4820 }
4821 } else {
4822 /* Logical link not available */
4823 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_ALLOWED);
4824 }
4825}
4826
4827static void l2cap_do_move_cancel(struct l2cap_chan *chan, int result)
4828{
4829 if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4830 u8 rsp_result;
4831 if (result == -EINVAL)
4832 rsp_result = L2CAP_MR_BAD_ID;
4833 else
4834 rsp_result = L2CAP_MR_NOT_ALLOWED;
4835
4836 l2cap_send_move_chan_rsp(chan, rsp_result);
4837 }
4838
4839 chan->move_role = L2CAP_MOVE_ROLE_NONE;
4840 chan->move_state = L2CAP_MOVE_STABLE;
4841
4842 /* Restart data transmission */
4843 l2cap_ertm_send(chan);
4844}
4845
Andrei Emeltchenkoa514b172012-11-14 17:39:30 +02004846/* Invoke with locked chan */
4847void __l2cap_physical_cfm(struct l2cap_chan *chan, int result)
Mat Martineau8eb200b2012-10-23 15:24:17 -07004848{
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004849 u8 local_amp_id = chan->local_amp_id;
Andrei Emeltchenkofffadc02012-11-01 15:37:03 +02004850 u8 remote_amp_id = chan->remote_amp_id;
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004851
Mat Martineau8eb200b2012-10-23 15:24:17 -07004852 BT_DBG("chan %p, result %d, local_amp_id %d, remote_amp_id %d",
4853 chan, result, local_amp_id, remote_amp_id);
4854
Mat Martineau8eb200b2012-10-23 15:24:17 -07004855 if (chan->state == BT_DISCONN || chan->state == BT_CLOSED) {
4856 l2cap_chan_unlock(chan);
4857 return;
4858 }
4859
4860 if (chan->state != BT_CONNECTED) {
4861 l2cap_do_create(chan, result, local_amp_id, remote_amp_id);
4862 } else if (result != L2CAP_MR_SUCCESS) {
4863 l2cap_do_move_cancel(chan, result);
4864 } else {
4865 switch (chan->move_role) {
4866 case L2CAP_MOVE_ROLE_INITIATOR:
4867 l2cap_do_move_initiate(chan, local_amp_id,
4868 remote_amp_id);
4869 break;
4870 case L2CAP_MOVE_ROLE_RESPONDER:
4871 l2cap_do_move_respond(chan, result);
4872 break;
4873 default:
4874 l2cap_do_move_cancel(chan, result);
4875 break;
4876 }
4877 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004878}
4879
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004880static inline int l2cap_move_channel_req(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004881 struct l2cap_cmd_hdr *cmd,
4882 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004883{
4884 struct l2cap_move_chan_req *req = data;
Mat Martineau1500109b2012-10-23 15:24:15 -07004885 struct l2cap_move_chan_rsp rsp;
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004886 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004887 u16 icid = 0;
4888 u16 result = L2CAP_MR_NOT_ALLOWED;
4889
4890 if (cmd_len != sizeof(*req))
4891 return -EPROTO;
4892
4893 icid = le16_to_cpu(req->icid);
4894
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004895 BT_DBG("icid 0x%4.4x, dest_amp_id %d", icid, req->dest_amp_id);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004896
Marcel Holtmann848566b2013-10-01 22:59:22 -07004897 if (!conn->hs_enabled)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004898 return -EINVAL;
4899
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004900 chan = l2cap_get_chan_by_dcid(conn, icid);
4901 if (!chan) {
Mat Martineau1500109b2012-10-23 15:24:15 -07004902 rsp.icid = cpu_to_le16(icid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004903 rsp.result = cpu_to_le16(L2CAP_MR_NOT_ALLOWED);
Mat Martineau1500109b2012-10-23 15:24:15 -07004904 l2cap_send_cmd(conn, cmd->ident, L2CAP_MOVE_CHAN_RSP,
4905 sizeof(rsp), &rsp);
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004906 return 0;
4907 }
4908
Mat Martineau1500109b2012-10-23 15:24:15 -07004909 chan->ident = cmd->ident;
4910
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004911 if (chan->scid < L2CAP_CID_DYN_START ||
4912 chan->chan_policy == BT_CHANNEL_POLICY_BREDR_ONLY ||
4913 (chan->mode != L2CAP_MODE_ERTM &&
4914 chan->mode != L2CAP_MODE_STREAMING)) {
4915 result = L2CAP_MR_NOT_ALLOWED;
4916 goto send_move_response;
4917 }
4918
4919 if (chan->local_amp_id == req->dest_amp_id) {
4920 result = L2CAP_MR_SAME_ID;
4921 goto send_move_response;
4922 }
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 struct hci_dev *hdev;
4926 hdev = hci_dev_get(req->dest_amp_id);
4927 if (!hdev || hdev->dev_type != HCI_AMP ||
4928 !test_bit(HCI_UP, &hdev->flags)) {
4929 if (hdev)
4930 hci_dev_put(hdev);
4931
4932 result = L2CAP_MR_BAD_ID;
4933 goto send_move_response;
4934 }
4935 hci_dev_put(hdev);
4936 }
4937
4938 /* Detect a move collision. Only send a collision response
4939 * if this side has "lost", otherwise proceed with the move.
4940 * The winner has the larger bd_addr.
4941 */
4942 if ((__chan_is_moving(chan) ||
4943 chan->move_role != L2CAP_MOVE_ROLE_NONE) &&
Marcel Holtmann6f59b902013-10-13 05:24:01 -07004944 bacmp(&conn->hcon->src, &conn->hcon->dst) > 0) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004945 result = L2CAP_MR_COLLISION;
4946 goto send_move_response;
4947 }
4948
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004949 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
4950 l2cap_move_setup(chan);
4951 chan->move_id = req->dest_amp_id;
4952 icid = chan->dcid;
4953
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004954 if (req->dest_amp_id == AMP_ID_BREDR) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004955 /* Moving to BR/EDR */
4956 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4957 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4958 result = L2CAP_MR_PEND;
4959 } else {
4960 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4961 result = L2CAP_MR_SUCCESS;
4962 }
4963 } else {
4964 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4965 /* Placeholder - uncomment when amp functions are available */
4966 /*amp_accept_physical(chan, req->dest_amp_id);*/
4967 result = L2CAP_MR_PEND;
4968 }
4969
4970send_move_response:
Mat Martineau1500109b2012-10-23 15:24:15 -07004971 l2cap_send_move_chan_rsp(chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004972
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004973 l2cap_chan_unlock(chan);
4974
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004975 return 0;
4976}
4977
Mat Martineau5b155ef2012-10-23 15:24:14 -07004978static void l2cap_move_continue(struct l2cap_conn *conn, u16 icid, u16 result)
4979{
4980 struct l2cap_chan *chan;
4981 struct hci_chan *hchan = NULL;
4982
4983 chan = l2cap_get_chan_by_scid(conn, icid);
4984 if (!chan) {
4985 l2cap_send_move_chan_cfm_icid(conn, icid);
4986 return;
4987 }
4988
4989 __clear_chan_timer(chan);
4990 if (result == L2CAP_MR_PEND)
4991 __set_chan_timer(chan, L2CAP_MOVE_ERTX_TIMEOUT);
4992
4993 switch (chan->move_state) {
4994 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
4995 /* Move confirm will be sent when logical link
4996 * is complete.
4997 */
4998 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4999 break;
5000 case L2CAP_MOVE_WAIT_RSP_SUCCESS:
5001 if (result == L2CAP_MR_PEND) {
5002 break;
5003 } else if (test_bit(CONN_LOCAL_BUSY,
5004 &chan->conn_state)) {
5005 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
5006 } else {
5007 /* Logical link is up or moving to BR/EDR,
5008 * proceed with move
5009 */
5010 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
5011 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
5012 }
5013 break;
5014 case L2CAP_MOVE_WAIT_RSP:
5015 /* Moving to AMP */
5016 if (result == L2CAP_MR_SUCCESS) {
5017 /* Remote is ready, send confirm immediately
5018 * after logical link is ready
5019 */
5020 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
5021 } else {
5022 /* Both logical link and move success
5023 * are required to confirm
5024 */
5025 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_COMP;
5026 }
5027
5028 /* Placeholder - get hci_chan for logical link */
5029 if (!hchan) {
5030 /* Logical link not available */
5031 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5032 break;
5033 }
5034
5035 /* If the logical link is not yet connected, do not
5036 * send confirmation.
5037 */
5038 if (hchan->state != BT_CONNECTED)
5039 break;
5040
5041 /* Logical link is already ready to go */
5042
5043 chan->hs_hcon = hchan->conn;
5044 chan->hs_hcon->l2cap_data = chan->conn;
5045
5046 if (result == L2CAP_MR_SUCCESS) {
5047 /* Can confirm now */
5048 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
5049 } else {
5050 /* Now only need move success
5051 * to confirm
5052 */
5053 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
5054 }
5055
5056 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
5057 break;
5058 default:
5059 /* Any other amp move state means the move failed. */
5060 chan->move_id = chan->local_amp_id;
5061 l2cap_move_done(chan);
5062 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5063 }
5064
5065 l2cap_chan_unlock(chan);
5066}
5067
5068static void l2cap_move_fail(struct l2cap_conn *conn, u8 ident, u16 icid,
5069 u16 result)
5070{
5071 struct l2cap_chan *chan;
5072
5073 chan = l2cap_get_chan_by_ident(conn, ident);
5074 if (!chan) {
5075 /* Could not locate channel, icid is best guess */
5076 l2cap_send_move_chan_cfm_icid(conn, icid);
5077 return;
5078 }
5079
5080 __clear_chan_timer(chan);
5081
5082 if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
5083 if (result == L2CAP_MR_COLLISION) {
5084 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
5085 } else {
5086 /* Cleanup - cancel move */
5087 chan->move_id = chan->local_amp_id;
5088 l2cap_move_done(chan);
5089 }
5090 }
5091
5092 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5093
5094 l2cap_chan_unlock(chan);
5095}
5096
5097static int l2cap_move_channel_rsp(struct l2cap_conn *conn,
5098 struct l2cap_cmd_hdr *cmd,
5099 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005100{
5101 struct l2cap_move_chan_rsp *rsp = data;
5102 u16 icid, result;
5103
5104 if (cmd_len != sizeof(*rsp))
5105 return -EPROTO;
5106
5107 icid = le16_to_cpu(rsp->icid);
5108 result = le16_to_cpu(rsp->result);
5109
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005110 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005111
Mat Martineau5b155ef2012-10-23 15:24:14 -07005112 if (result == L2CAP_MR_SUCCESS || result == L2CAP_MR_PEND)
5113 l2cap_move_continue(conn, icid, result);
5114 else
5115 l2cap_move_fail(conn, cmd->ident, icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005116
5117 return 0;
5118}
5119
Mat Martineau5f3847a2012-10-23 15:24:12 -07005120static int l2cap_move_channel_confirm(struct l2cap_conn *conn,
5121 struct l2cap_cmd_hdr *cmd,
5122 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005123{
5124 struct l2cap_move_chan_cfm *cfm = data;
Mat Martineau5f3847a2012-10-23 15:24:12 -07005125 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005126 u16 icid, result;
5127
5128 if (cmd_len != sizeof(*cfm))
5129 return -EPROTO;
5130
5131 icid = le16_to_cpu(cfm->icid);
5132 result = le16_to_cpu(cfm->result);
5133
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005134 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005135
Mat Martineau5f3847a2012-10-23 15:24:12 -07005136 chan = l2cap_get_chan_by_dcid(conn, icid);
5137 if (!chan) {
5138 /* Spec requires a response even if the icid was not found */
5139 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5140 return 0;
5141 }
5142
5143 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM) {
5144 if (result == L2CAP_MC_CONFIRMED) {
5145 chan->local_amp_id = chan->move_id;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005146 if (chan->local_amp_id == AMP_ID_BREDR)
Mat Martineau5f3847a2012-10-23 15:24:12 -07005147 __release_logical_link(chan);
5148 } else {
5149 chan->move_id = chan->local_amp_id;
5150 }
5151
5152 l2cap_move_done(chan);
5153 }
5154
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005155 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5156
Mat Martineau5f3847a2012-10-23 15:24:12 -07005157 l2cap_chan_unlock(chan);
5158
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005159 return 0;
5160}
5161
5162static inline int l2cap_move_channel_confirm_rsp(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005163 struct l2cap_cmd_hdr *cmd,
5164 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005165{
5166 struct l2cap_move_chan_cfm_rsp *rsp = data;
Mat Martineau3fd71a02012-10-23 15:24:16 -07005167 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005168 u16 icid;
5169
5170 if (cmd_len != sizeof(*rsp))
5171 return -EPROTO;
5172
5173 icid = le16_to_cpu(rsp->icid);
5174
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005175 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005176
Mat Martineau3fd71a02012-10-23 15:24:16 -07005177 chan = l2cap_get_chan_by_scid(conn, icid);
5178 if (!chan)
5179 return 0;
5180
5181 __clear_chan_timer(chan);
5182
5183 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM_RSP) {
5184 chan->local_amp_id = chan->move_id;
5185
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005186 if (chan->local_amp_id == AMP_ID_BREDR && chan->hs_hchan)
Mat Martineau3fd71a02012-10-23 15:24:16 -07005187 __release_logical_link(chan);
5188
5189 l2cap_move_done(chan);
5190 }
5191
5192 l2cap_chan_unlock(chan);
5193
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005194 return 0;
5195}
5196
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03005197static inline int l2cap_check_conn_param(u16 min, u16 max, u16 latency,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005198 u16 to_multiplier)
Claudio Takahaside731152011-02-11 19:28:55 -02005199{
5200 u16 max_latency;
5201
5202 if (min > max || min < 6 || max > 3200)
5203 return -EINVAL;
5204
5205 if (to_multiplier < 10 || to_multiplier > 3200)
5206 return -EINVAL;
5207
5208 if (max >= to_multiplier * 8)
5209 return -EINVAL;
5210
5211 max_latency = (to_multiplier * 8 / max) - 1;
5212 if (latency > 499 || latency > max_latency)
5213 return -EINVAL;
5214
5215 return 0;
5216}
5217
5218static inline int l2cap_conn_param_update_req(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005219 struct l2cap_cmd_hdr *cmd,
Johan Hedberg203e6392013-05-15 10:07:15 +03005220 u16 cmd_len, u8 *data)
Claudio Takahaside731152011-02-11 19:28:55 -02005221{
5222 struct hci_conn *hcon = conn->hcon;
5223 struct l2cap_conn_param_update_req *req;
5224 struct l2cap_conn_param_update_rsp rsp;
Johan Hedberg203e6392013-05-15 10:07:15 +03005225 u16 min, max, latency, to_multiplier;
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005226 int err;
Claudio Takahaside731152011-02-11 19:28:55 -02005227
5228 if (!(hcon->link_mode & HCI_LM_MASTER))
5229 return -EINVAL;
5230
Claudio Takahaside731152011-02-11 19:28:55 -02005231 if (cmd_len != sizeof(struct l2cap_conn_param_update_req))
5232 return -EPROTO;
5233
5234 req = (struct l2cap_conn_param_update_req *) data;
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03005235 min = __le16_to_cpu(req->min);
5236 max = __le16_to_cpu(req->max);
Claudio Takahaside731152011-02-11 19:28:55 -02005237 latency = __le16_to_cpu(req->latency);
5238 to_multiplier = __le16_to_cpu(req->to_multiplier);
5239
5240 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 +01005241 min, max, latency, to_multiplier);
Claudio Takahaside731152011-02-11 19:28:55 -02005242
5243 memset(&rsp, 0, sizeof(rsp));
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005244
5245 err = l2cap_check_conn_param(min, max, latency, to_multiplier);
5246 if (err)
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005247 rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_REJECTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005248 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005249 rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_ACCEPTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005250
5251 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONN_PARAM_UPDATE_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005252 sizeof(rsp), &rsp);
Claudio Takahaside731152011-02-11 19:28:55 -02005253
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005254 if (!err)
5255 hci_le_conn_update(hcon, min, max, latency, to_multiplier);
5256
Claudio Takahaside731152011-02-11 19:28:55 -02005257 return 0;
5258}
5259
Johan Hedbergf1496de2013-05-13 14:15:56 +03005260static int l2cap_le_connect_rsp(struct l2cap_conn *conn,
5261 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5262 u8 *data)
5263{
5264 struct l2cap_le_conn_rsp *rsp = (struct l2cap_le_conn_rsp *) data;
5265 u16 dcid, mtu, mps, credits, result;
5266 struct l2cap_chan *chan;
5267 int err;
5268
5269 if (cmd_len < sizeof(*rsp))
5270 return -EPROTO;
5271
5272 dcid = __le16_to_cpu(rsp->dcid);
5273 mtu = __le16_to_cpu(rsp->mtu);
5274 mps = __le16_to_cpu(rsp->mps);
5275 credits = __le16_to_cpu(rsp->credits);
5276 result = __le16_to_cpu(rsp->result);
5277
5278 if (result == L2CAP_CR_SUCCESS && (mtu < 23 || mps < 23))
5279 return -EPROTO;
5280
5281 BT_DBG("dcid 0x%4.4x mtu %u mps %u credits %u result 0x%2.2x",
5282 dcid, mtu, mps, credits, result);
5283
5284 mutex_lock(&conn->chan_lock);
5285
5286 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5287 if (!chan) {
5288 err = -EBADSLT;
5289 goto unlock;
5290 }
5291
5292 err = 0;
5293
5294 l2cap_chan_lock(chan);
5295
5296 switch (result) {
5297 case L2CAP_CR_SUCCESS:
5298 chan->ident = 0;
5299 chan->dcid = dcid;
5300 chan->omtu = mtu;
5301 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005302 chan->tx_credits = credits;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005303 l2cap_chan_ready(chan);
5304 break;
5305
5306 default:
5307 l2cap_chan_del(chan, ECONNREFUSED);
5308 break;
5309 }
5310
5311 l2cap_chan_unlock(chan);
5312
5313unlock:
5314 mutex_unlock(&conn->chan_lock);
5315
5316 return err;
5317}
5318
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005319static inline int l2cap_bredr_sig_cmd(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005320 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5321 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005322{
5323 int err = 0;
5324
5325 switch (cmd->code) {
5326 case L2CAP_COMMAND_REJ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005327 l2cap_command_rej(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005328 break;
5329
5330 case L2CAP_CONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005331 err = l2cap_connect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005332 break;
5333
5334 case L2CAP_CONN_RSP:
Mat Martineauf5a25982012-10-11 17:48:21 +03005335 case L2CAP_CREATE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005336 l2cap_connect_create_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005337 break;
5338
5339 case L2CAP_CONF_REQ:
5340 err = l2cap_config_req(conn, cmd, cmd_len, data);
5341 break;
5342
5343 case L2CAP_CONF_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005344 l2cap_config_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005345 break;
5346
5347 case L2CAP_DISCONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005348 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005349 break;
5350
5351 case L2CAP_DISCONN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005352 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005353 break;
5354
5355 case L2CAP_ECHO_REQ:
5356 l2cap_send_cmd(conn, cmd->ident, L2CAP_ECHO_RSP, cmd_len, data);
5357 break;
5358
5359 case L2CAP_ECHO_RSP:
5360 break;
5361
5362 case L2CAP_INFO_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005363 err = l2cap_information_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005364 break;
5365
5366 case L2CAP_INFO_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005367 l2cap_information_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005368 break;
5369
Mat Martineauf94ff6f2011-11-02 16:18:32 -07005370 case L2CAP_CREATE_CHAN_REQ:
5371 err = l2cap_create_channel_req(conn, cmd, cmd_len, data);
5372 break;
5373
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005374 case L2CAP_MOVE_CHAN_REQ:
5375 err = l2cap_move_channel_req(conn, cmd, cmd_len, data);
5376 break;
5377
5378 case L2CAP_MOVE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005379 l2cap_move_channel_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005380 break;
5381
5382 case L2CAP_MOVE_CHAN_CFM:
5383 err = l2cap_move_channel_confirm(conn, cmd, cmd_len, data);
5384 break;
5385
5386 case L2CAP_MOVE_CHAN_CFM_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005387 l2cap_move_channel_confirm_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005388 break;
5389
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005390 default:
5391 BT_ERR("Unknown BR/EDR signaling command 0x%2.2x", cmd->code);
5392 err = -EINVAL;
5393 break;
5394 }
5395
5396 return err;
5397}
5398
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005399static int l2cap_le_connect_req(struct l2cap_conn *conn,
5400 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5401 u8 *data)
5402{
5403 struct l2cap_le_conn_req *req = (struct l2cap_le_conn_req *) data;
5404 struct l2cap_le_conn_rsp rsp;
5405 struct l2cap_chan *chan, *pchan;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005406 u16 dcid, scid, credits, mtu, mps;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005407 __le16 psm;
5408 u8 result;
5409
5410 if (cmd_len != sizeof(*req))
5411 return -EPROTO;
5412
5413 scid = __le16_to_cpu(req->scid);
5414 mtu = __le16_to_cpu(req->mtu);
5415 mps = __le16_to_cpu(req->mps);
5416 psm = req->psm;
5417 dcid = 0;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005418 credits = 0;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005419
5420 if (mtu < 23 || mps < 23)
5421 return -EPROTO;
5422
5423 BT_DBG("psm 0x%2.2x scid 0x%4.4x mtu %u mps %u", __le16_to_cpu(psm),
5424 scid, mtu, mps);
5425
5426 /* Check if we have socket listening on psm */
5427 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
5428 &conn->hcon->dst, LE_LINK);
5429 if (!pchan) {
5430 result = L2CAP_CR_BAD_PSM;
5431 chan = NULL;
5432 goto response;
5433 }
5434
5435 mutex_lock(&conn->chan_lock);
5436 l2cap_chan_lock(pchan);
5437
5438 if (!smp_sufficient_security(conn->hcon, pchan->sec_level)) {
5439 result = L2CAP_CR_AUTHENTICATION;
5440 chan = NULL;
5441 goto response_unlock;
5442 }
5443
5444 /* Check if we already have channel with that dcid */
5445 if (__l2cap_get_chan_by_dcid(conn, scid)) {
5446 result = L2CAP_CR_NO_MEM;
5447 chan = NULL;
5448 goto response_unlock;
5449 }
5450
5451 chan = pchan->ops->new_connection(pchan);
5452 if (!chan) {
5453 result = L2CAP_CR_NO_MEM;
5454 goto response_unlock;
5455 }
5456
Johan Hedberg0ce43ce2013-12-05 14:55:33 +02005457 l2cap_le_flowctl_init(chan);
5458
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005459 bacpy(&chan->src, &conn->hcon->src);
5460 bacpy(&chan->dst, &conn->hcon->dst);
5461 chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type);
5462 chan->dst_type = bdaddr_type(conn->hcon, conn->hcon->dst_type);
5463 chan->psm = psm;
5464 chan->dcid = scid;
5465 chan->omtu = mtu;
5466 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005467 chan->tx_credits = __le16_to_cpu(req->credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005468
5469 __l2cap_chan_add(conn, chan);
5470 dcid = chan->scid;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005471 credits = chan->rx_credits;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005472
5473 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
5474
5475 chan->ident = cmd->ident;
5476
5477 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
5478 l2cap_state_change(chan, BT_CONNECT2);
5479 result = L2CAP_CR_PEND;
5480 chan->ops->defer(chan);
5481 } else {
5482 l2cap_chan_ready(chan);
5483 result = L2CAP_CR_SUCCESS;
5484 }
5485
5486response_unlock:
5487 l2cap_chan_unlock(pchan);
5488 mutex_unlock(&conn->chan_lock);
5489
5490 if (result == L2CAP_CR_PEND)
5491 return 0;
5492
5493response:
5494 if (chan) {
5495 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02005496 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005497 } else {
5498 rsp.mtu = 0;
5499 rsp.mps = 0;
5500 }
5501
5502 rsp.dcid = cpu_to_le16(dcid);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005503 rsp.credits = cpu_to_le16(credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005504 rsp.result = cpu_to_le16(result);
5505
5506 l2cap_send_cmd(conn, cmd->ident, L2CAP_LE_CONN_RSP, sizeof(rsp), &rsp);
5507
5508 return 0;
5509}
5510
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005511static inline int l2cap_le_credits(struct l2cap_conn *conn,
5512 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5513 u8 *data)
5514{
5515 struct l2cap_le_credits *pkt;
5516 struct l2cap_chan *chan;
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005517 u16 cid, credits, max_credits;
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005518
5519 if (cmd_len != sizeof(*pkt))
5520 return -EPROTO;
5521
5522 pkt = (struct l2cap_le_credits *) data;
5523 cid = __le16_to_cpu(pkt->cid);
5524 credits = __le16_to_cpu(pkt->credits);
5525
5526 BT_DBG("cid 0x%4.4x credits 0x%4.4x", cid, credits);
5527
5528 chan = l2cap_get_chan_by_dcid(conn, cid);
5529 if (!chan)
5530 return -EBADSLT;
5531
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005532 max_credits = LE_FLOWCTL_MAX_CREDITS - chan->tx_credits;
5533 if (credits > max_credits) {
5534 BT_ERR("LE credits overflow");
5535 l2cap_send_disconn_req(chan, ECONNRESET);
5536
5537 /* Return 0 so that we don't trigger an unnecessary
5538 * command reject packet.
5539 */
5540 return 0;
5541 }
5542
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005543 chan->tx_credits += credits;
5544
5545 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
5546 l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
5547 chan->tx_credits--;
5548 }
5549
5550 if (chan->tx_credits)
5551 chan->ops->resume(chan);
5552
5553 l2cap_chan_unlock(chan);
5554
5555 return 0;
5556}
5557
Johan Hedberg71fb4192013-12-10 10:52:48 +02005558static inline int l2cap_le_command_rej(struct l2cap_conn *conn,
5559 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5560 u8 *data)
5561{
5562 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
5563 struct l2cap_chan *chan;
5564
5565 if (cmd_len < sizeof(*rej))
5566 return -EPROTO;
5567
5568 mutex_lock(&conn->chan_lock);
5569
5570 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5571 if (!chan)
5572 goto done;
5573
5574 l2cap_chan_lock(chan);
5575 l2cap_chan_del(chan, ECONNREFUSED);
5576 l2cap_chan_unlock(chan);
5577
5578done:
5579 mutex_unlock(&conn->chan_lock);
5580 return 0;
5581}
5582
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005583static inline int l2cap_le_sig_cmd(struct l2cap_conn *conn,
Johan Hedberg203e6392013-05-15 10:07:15 +03005584 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5585 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005586{
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005587 int err = 0;
5588
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005589 switch (cmd->code) {
5590 case L2CAP_COMMAND_REJ:
Johan Hedberg71fb4192013-12-10 10:52:48 +02005591 l2cap_le_command_rej(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005592 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005593
5594 case L2CAP_CONN_PARAM_UPDATE_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005595 err = l2cap_conn_param_update_req(conn, cmd, cmd_len, data);
5596 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005597
5598 case L2CAP_CONN_PARAM_UPDATE_RSP:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005599 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005600
Johan Hedbergf1496de2013-05-13 14:15:56 +03005601 case L2CAP_LE_CONN_RSP:
5602 l2cap_le_connect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005603 break;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005604
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005605 case L2CAP_LE_CONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005606 err = l2cap_le_connect_req(conn, cmd, cmd_len, data);
5607 break;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005608
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005609 case L2CAP_LE_CREDITS:
5610 err = l2cap_le_credits(conn, cmd, cmd_len, data);
5611 break;
5612
Johan Hedberg3defe012013-05-15 10:16:06 +03005613 case L2CAP_DISCONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005614 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
5615 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005616
5617 case L2CAP_DISCONN_RSP:
5618 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005619 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005620
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005621 default:
5622 BT_ERR("Unknown LE signaling command 0x%2.2x", cmd->code);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005623 err = -EINVAL;
5624 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005625 }
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005626
5627 return err;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005628}
5629
Johan Hedbergc5623552013-04-29 19:35:33 +03005630static inline void l2cap_le_sig_channel(struct l2cap_conn *conn,
5631 struct sk_buff *skb)
5632{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005633 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005634 struct l2cap_cmd_hdr *cmd;
5635 u16 len;
Johan Hedbergc5623552013-04-29 19:35:33 +03005636 int err;
5637
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005638 if (hcon->type != LE_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005639 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005640
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005641 if (skb->len < L2CAP_CMD_HDR_SIZE)
5642 goto drop;
Johan Hedbergc5623552013-04-29 19:35:33 +03005643
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005644 cmd = (void *) skb->data;
5645 skb_pull(skb, L2CAP_CMD_HDR_SIZE);
Johan Hedbergc5623552013-04-29 19:35:33 +03005646
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005647 len = le16_to_cpu(cmd->len);
Johan Hedbergc5623552013-04-29 19:35:33 +03005648
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005649 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd->code, len, cmd->ident);
Johan Hedbergc5623552013-04-29 19:35:33 +03005650
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005651 if (len != skb->len || !cmd->ident) {
5652 BT_DBG("corrupted command");
5653 goto drop;
5654 }
Johan Hedbergc5623552013-04-29 19:35:33 +03005655
Johan Hedberg203e6392013-05-15 10:07:15 +03005656 err = l2cap_le_sig_cmd(conn, cmd, len, skb->data);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005657 if (err) {
5658 struct l2cap_cmd_rej_unk rej;
Johan Hedbergc5623552013-04-29 19:35:33 +03005659
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005660 BT_ERR("Wrong link type (%d)", err);
Johan Hedbergc5623552013-04-29 19:35:33 +03005661
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005662 rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005663 l2cap_send_cmd(conn, cmd->ident, L2CAP_COMMAND_REJ,
5664 sizeof(rej), &rej);
Johan Hedbergc5623552013-04-29 19:35:33 +03005665 }
5666
Marcel Holtmann3b166292013-10-02 08:28:21 -07005667drop:
Johan Hedbergc5623552013-04-29 19:35:33 +03005668 kfree_skb(skb);
5669}
5670
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005671static inline void l2cap_sig_channel(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005672 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005673{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005674 struct hci_conn *hcon = conn->hcon;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005675 u8 *data = skb->data;
5676 int len = skb->len;
5677 struct l2cap_cmd_hdr cmd;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005678 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005679
5680 l2cap_raw_recv(conn, skb);
5681
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005682 if (hcon->type != ACL_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005683 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005684
Linus Torvalds1da177e2005-04-16 15:20:36 -07005685 while (len >= L2CAP_CMD_HDR_SIZE) {
Al Viro88219a02007-07-29 00:17:25 -07005686 u16 cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005687 memcpy(&cmd, data, L2CAP_CMD_HDR_SIZE);
5688 data += L2CAP_CMD_HDR_SIZE;
5689 len -= L2CAP_CMD_HDR_SIZE;
5690
Al Viro88219a02007-07-29 00:17:25 -07005691 cmd_len = le16_to_cpu(cmd.len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005692
Gustavo Padovan2d792812012-10-06 10:07:01 +01005693 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd.code, cmd_len,
5694 cmd.ident);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005695
Al Viro88219a02007-07-29 00:17:25 -07005696 if (cmd_len > len || !cmd.ident) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005697 BT_DBG("corrupted command");
5698 break;
5699 }
5700
Johan Hedbergc5623552013-04-29 19:35:33 +03005701 err = l2cap_bredr_sig_cmd(conn, &cmd, cmd_len, data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005702 if (err) {
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03005703 struct l2cap_cmd_rej_unk rej;
Gustavo F. Padovan2c6d1a22011-03-23 14:38:32 -03005704
5705 BT_ERR("Wrong link type (%d)", err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005706
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005707 rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Gustavo Padovan2d792812012-10-06 10:07:01 +01005708 l2cap_send_cmd(conn, cmd.ident, L2CAP_COMMAND_REJ,
5709 sizeof(rej), &rej);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005710 }
5711
Al Viro88219a02007-07-29 00:17:25 -07005712 data += cmd_len;
5713 len -= cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005714 }
5715
Marcel Holtmann3b166292013-10-02 08:28:21 -07005716drop:
Linus Torvalds1da177e2005-04-16 15:20:36 -07005717 kfree_skb(skb);
5718}
5719
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005720static int l2cap_check_fcs(struct l2cap_chan *chan, struct sk_buff *skb)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005721{
5722 u16 our_fcs, rcv_fcs;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03005723 int hdr_size;
5724
5725 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
5726 hdr_size = L2CAP_EXT_HDR_SIZE;
5727 else
5728 hdr_size = L2CAP_ENH_HDR_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005729
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005730 if (chan->fcs == L2CAP_FCS_CRC16) {
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005731 skb_trim(skb, skb->len - L2CAP_FCS_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005732 rcv_fcs = get_unaligned_le16(skb->data + skb->len);
5733 our_fcs = crc16(0, skb->data - hdr_size, skb->len + hdr_size);
5734
5735 if (our_fcs != rcv_fcs)
João Paulo Rechi Vita7a560e52010-06-22 13:56:27 -03005736 return -EBADMSG;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005737 }
5738 return 0;
5739}
5740
Mat Martineau6ea00482012-05-17 20:53:52 -07005741static void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan)
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005742{
Mat Martineaue31f7632012-05-17 20:53:41 -07005743 struct l2cap_ctrl control;
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005744
Mat Martineaue31f7632012-05-17 20:53:41 -07005745 BT_DBG("chan %p", chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005746
Mat Martineaue31f7632012-05-17 20:53:41 -07005747 memset(&control, 0, sizeof(control));
5748 control.sframe = 1;
5749 control.final = 1;
5750 control.reqseq = chan->buffer_seq;
5751 set_bit(CONN_SEND_FBIT, &chan->conn_state);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005752
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005753 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
Mat Martineaue31f7632012-05-17 20:53:41 -07005754 control.super = L2CAP_SUPER_RNR;
5755 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005756 }
5757
Mat Martineaue31f7632012-05-17 20:53:41 -07005758 if (test_and_clear_bit(CONN_REMOTE_BUSY, &chan->conn_state) &&
5759 chan->unacked_frames > 0)
5760 __set_retrans_timer(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005761
Mat Martineaue31f7632012-05-17 20:53:41 -07005762 /* Send pending iframes */
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03005763 l2cap_ertm_send(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005764
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005765 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
Mat Martineaue31f7632012-05-17 20:53:41 -07005766 test_bit(CONN_SEND_FBIT, &chan->conn_state)) {
5767 /* F-bit wasn't sent in an s-frame or i-frame yet, so
5768 * send it now.
5769 */
5770 control.super = L2CAP_SUPER_RR;
5771 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005772 }
5773}
5774
Gustavo Padovan2d792812012-10-06 10:07:01 +01005775static void append_skb_frag(struct sk_buff *skb, struct sk_buff *new_frag,
5776 struct sk_buff **last_frag)
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005777{
Mat Martineau84084a32011-07-22 14:54:00 -07005778 /* skb->len reflects data in skb as well as all fragments
5779 * skb->data_len reflects only data in fragments
5780 */
5781 if (!skb_has_frag_list(skb))
5782 skb_shinfo(skb)->frag_list = new_frag;
5783
5784 new_frag->next = NULL;
5785
5786 (*last_frag)->next = new_frag;
5787 *last_frag = new_frag;
5788
5789 skb->len += new_frag->len;
5790 skb->data_len += new_frag->len;
5791 skb->truesize += new_frag->truesize;
5792}
5793
Mat Martineau4b51dae92012-05-17 20:53:37 -07005794static int l2cap_reassemble_sdu(struct l2cap_chan *chan, struct sk_buff *skb,
5795 struct l2cap_ctrl *control)
Mat Martineau84084a32011-07-22 14:54:00 -07005796{
5797 int err = -EINVAL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005798
Mat Martineau4b51dae92012-05-17 20:53:37 -07005799 switch (control->sar) {
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005800 case L2CAP_SAR_UNSEGMENTED:
Mat Martineau84084a32011-07-22 14:54:00 -07005801 if (chan->sdu)
5802 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005803
Gustavo Padovan80b98022012-05-27 22:27:51 -03005804 err = chan->ops->recv(chan, skb);
Mat Martineau84084a32011-07-22 14:54:00 -07005805 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005806
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005807 case L2CAP_SAR_START:
Mat Martineau84084a32011-07-22 14:54:00 -07005808 if (chan->sdu)
5809 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005810
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005811 chan->sdu_len = get_unaligned_le16(skb->data);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005812 skb_pull(skb, L2CAP_SDULEN_SIZE);
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005813
Mat Martineau84084a32011-07-22 14:54:00 -07005814 if (chan->sdu_len > chan->imtu) {
5815 err = -EMSGSIZE;
5816 break;
5817 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005818
Mat Martineau84084a32011-07-22 14:54:00 -07005819 if (skb->len >= chan->sdu_len)
5820 break;
5821
5822 chan->sdu = skb;
5823 chan->sdu_last_frag = skb;
5824
5825 skb = NULL;
5826 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005827 break;
5828
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005829 case L2CAP_SAR_CONTINUE:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005830 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005831 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005832
Mat Martineau84084a32011-07-22 14:54:00 -07005833 append_skb_frag(chan->sdu, skb,
5834 &chan->sdu_last_frag);
5835 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005836
Mat Martineau84084a32011-07-22 14:54:00 -07005837 if (chan->sdu->len >= chan->sdu_len)
5838 break;
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005839
Mat Martineau84084a32011-07-22 14:54:00 -07005840 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005841 break;
5842
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005843 case L2CAP_SAR_END:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005844 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005845 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005846
Mat Martineau84084a32011-07-22 14:54:00 -07005847 append_skb_frag(chan->sdu, skb,
5848 &chan->sdu_last_frag);
5849 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005850
Mat Martineau84084a32011-07-22 14:54:00 -07005851 if (chan->sdu->len != chan->sdu_len)
5852 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005853
Gustavo Padovan80b98022012-05-27 22:27:51 -03005854 err = chan->ops->recv(chan, chan->sdu);
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005855
Mat Martineau84084a32011-07-22 14:54:00 -07005856 if (!err) {
5857 /* Reassembly complete */
5858 chan->sdu = NULL;
5859 chan->sdu_last_frag = NULL;
5860 chan->sdu_len = 0;
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005861 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005862 break;
5863 }
5864
Mat Martineau84084a32011-07-22 14:54:00 -07005865 if (err) {
5866 kfree_skb(skb);
5867 kfree_skb(chan->sdu);
5868 chan->sdu = NULL;
5869 chan->sdu_last_frag = NULL;
5870 chan->sdu_len = 0;
5871 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005872
Mat Martineau84084a32011-07-22 14:54:00 -07005873 return err;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005874}
5875
Mat Martineau32b32732012-10-23 15:24:11 -07005876static int l2cap_resegment(struct l2cap_chan *chan)
5877{
5878 /* Placeholder */
5879 return 0;
5880}
5881
Mat Martineaue3281402011-07-07 09:39:02 -07005882void l2cap_chan_busy(struct l2cap_chan *chan, int busy)
Gustavo F. Padovan712132eb2010-06-21 19:39:50 -03005883{
Mat Martineau61aa4f52012-05-17 20:53:40 -07005884 u8 event;
5885
5886 if (chan->mode != L2CAP_MODE_ERTM)
5887 return;
5888
5889 event = busy ? L2CAP_EV_LOCAL_BUSY_DETECTED : L2CAP_EV_LOCAL_BUSY_CLEAR;
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03005890 l2cap_tx(chan, NULL, NULL, event);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005891}
5892
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005893static int l2cap_rx_queued_iframes(struct l2cap_chan *chan)
5894{
Mat Martineau63838722012-05-17 20:53:45 -07005895 int err = 0;
5896 /* Pass sequential frames to l2cap_reassemble_sdu()
5897 * until a gap is encountered.
5898 */
5899
5900 BT_DBG("chan %p", chan);
5901
5902 while (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
5903 struct sk_buff *skb;
5904 BT_DBG("Searching for skb with txseq %d (queue len %d)",
5905 chan->buffer_seq, skb_queue_len(&chan->srej_q));
5906
5907 skb = l2cap_ertm_seq_in_queue(&chan->srej_q, chan->buffer_seq);
5908
5909 if (!skb)
5910 break;
5911
5912 skb_unlink(skb, &chan->srej_q);
5913 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
5914 err = l2cap_reassemble_sdu(chan, skb, &bt_cb(skb)->control);
5915 if (err)
5916 break;
5917 }
5918
5919 if (skb_queue_empty(&chan->srej_q)) {
5920 chan->rx_state = L2CAP_RX_STATE_RECV;
5921 l2cap_send_ack(chan);
5922 }
5923
5924 return err;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005925}
5926
5927static void l2cap_handle_srej(struct l2cap_chan *chan,
5928 struct l2cap_ctrl *control)
5929{
Mat Martineauf80842a2012-05-17 20:53:46 -07005930 struct sk_buff *skb;
5931
5932 BT_DBG("chan %p, control %p", chan, control);
5933
5934 if (control->reqseq == chan->next_tx_seq) {
5935 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005936 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005937 return;
5938 }
5939
5940 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
5941
5942 if (skb == NULL) {
5943 BT_DBG("Seq %d not available for retransmission",
5944 control->reqseq);
5945 return;
5946 }
5947
5948 if (chan->max_tx != 0 && bt_cb(skb)->control.retries >= chan->max_tx) {
5949 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005950 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005951 return;
5952 }
5953
5954 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
5955
5956 if (control->poll) {
5957 l2cap_pass_to_tx(chan, control);
5958
5959 set_bit(CONN_SEND_FBIT, &chan->conn_state);
5960 l2cap_retransmit(chan, control);
5961 l2cap_ertm_send(chan);
5962
5963 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5964 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5965 chan->srej_save_reqseq = control->reqseq;
5966 }
5967 } else {
5968 l2cap_pass_to_tx_fbit(chan, control);
5969
5970 if (control->final) {
5971 if (chan->srej_save_reqseq != control->reqseq ||
5972 !test_and_clear_bit(CONN_SREJ_ACT,
5973 &chan->conn_state))
5974 l2cap_retransmit(chan, control);
5975 } else {
5976 l2cap_retransmit(chan, control);
5977 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5978 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5979 chan->srej_save_reqseq = control->reqseq;
5980 }
5981 }
5982 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005983}
5984
5985static void l2cap_handle_rej(struct l2cap_chan *chan,
5986 struct l2cap_ctrl *control)
5987{
Mat Martineaufcd289d2012-05-17 20:53:47 -07005988 struct sk_buff *skb;
5989
5990 BT_DBG("chan %p, control %p", chan, control);
5991
5992 if (control->reqseq == chan->next_tx_seq) {
5993 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005994 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07005995 return;
5996 }
5997
5998 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
5999
6000 if (chan->max_tx && skb &&
6001 bt_cb(skb)->control.retries >= chan->max_tx) {
6002 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006003 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07006004 return;
6005 }
6006
6007 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6008
6009 l2cap_pass_to_tx(chan, control);
6010
6011 if (control->final) {
6012 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state))
6013 l2cap_retransmit_all(chan, control);
6014 } else {
6015 l2cap_retransmit_all(chan, control);
6016 l2cap_ertm_send(chan);
6017 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F)
6018 set_bit(CONN_REJ_ACT, &chan->conn_state);
6019 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006020}
6021
Mat Martineau4b51dae92012-05-17 20:53:37 -07006022static u8 l2cap_classify_txseq(struct l2cap_chan *chan, u16 txseq)
6023{
6024 BT_DBG("chan %p, txseq %d", chan, txseq);
6025
6026 BT_DBG("last_acked_seq %d, expected_tx_seq %d", chan->last_acked_seq,
6027 chan->expected_tx_seq);
6028
6029 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
6030 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
Gustavo Padovan2d792812012-10-06 10:07:01 +01006031 chan->tx_win) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07006032 /* See notes below regarding "double poll" and
6033 * invalid packets.
6034 */
6035 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
6036 BT_DBG("Invalid/Ignore - after SREJ");
6037 return L2CAP_TXSEQ_INVALID_IGNORE;
6038 } else {
6039 BT_DBG("Invalid - in window after SREJ sent");
6040 return L2CAP_TXSEQ_INVALID;
6041 }
6042 }
6043
6044 if (chan->srej_list.head == txseq) {
6045 BT_DBG("Expected SREJ");
6046 return L2CAP_TXSEQ_EXPECTED_SREJ;
6047 }
6048
6049 if (l2cap_ertm_seq_in_queue(&chan->srej_q, txseq)) {
6050 BT_DBG("Duplicate SREJ - txseq already stored");
6051 return L2CAP_TXSEQ_DUPLICATE_SREJ;
6052 }
6053
6054 if (l2cap_seq_list_contains(&chan->srej_list, txseq)) {
6055 BT_DBG("Unexpected SREJ - not requested");
6056 return L2CAP_TXSEQ_UNEXPECTED_SREJ;
6057 }
6058 }
6059
6060 if (chan->expected_tx_seq == txseq) {
6061 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
6062 chan->tx_win) {
6063 BT_DBG("Invalid - txseq outside tx window");
6064 return L2CAP_TXSEQ_INVALID;
6065 } else {
6066 BT_DBG("Expected");
6067 return L2CAP_TXSEQ_EXPECTED;
6068 }
6069 }
6070
6071 if (__seq_offset(chan, txseq, chan->last_acked_seq) <
Gustavo Padovan2d792812012-10-06 10:07:01 +01006072 __seq_offset(chan, chan->expected_tx_seq, chan->last_acked_seq)) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07006073 BT_DBG("Duplicate - expected_tx_seq later than txseq");
6074 return L2CAP_TXSEQ_DUPLICATE;
6075 }
6076
6077 if (__seq_offset(chan, txseq, chan->last_acked_seq) >= chan->tx_win) {
6078 /* A source of invalid packets is a "double poll" condition,
6079 * where delays cause us to send multiple poll packets. If
6080 * the remote stack receives and processes both polls,
6081 * sequence numbers can wrap around in such a way that a
6082 * resent frame has a sequence number that looks like new data
6083 * with a sequence gap. This would trigger an erroneous SREJ
6084 * request.
6085 *
6086 * Fortunately, this is impossible with a tx window that's
6087 * less than half of the maximum sequence number, which allows
6088 * invalid frames to be safely ignored.
6089 *
6090 * With tx window sizes greater than half of the tx window
6091 * maximum, the frame is invalid and cannot be ignored. This
6092 * causes a disconnect.
6093 */
6094
6095 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
6096 BT_DBG("Invalid/Ignore - txseq outside tx window");
6097 return L2CAP_TXSEQ_INVALID_IGNORE;
6098 } else {
6099 BT_DBG("Invalid - txseq outside tx window");
6100 return L2CAP_TXSEQ_INVALID;
6101 }
6102 } else {
6103 BT_DBG("Unexpected - txseq indicates missing frames");
6104 return L2CAP_TXSEQ_UNEXPECTED;
6105 }
6106}
6107
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006108static int l2cap_rx_state_recv(struct l2cap_chan *chan,
6109 struct l2cap_ctrl *control,
6110 struct sk_buff *skb, u8 event)
6111{
6112 int err = 0;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006113 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006114
6115 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6116 event);
6117
6118 switch (event) {
6119 case L2CAP_EV_RECV_IFRAME:
6120 switch (l2cap_classify_txseq(chan, control->txseq)) {
6121 case L2CAP_TXSEQ_EXPECTED:
6122 l2cap_pass_to_tx(chan, control);
6123
6124 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6125 BT_DBG("Busy, discarding expected seq %d",
6126 control->txseq);
6127 break;
6128 }
6129
6130 chan->expected_tx_seq = __next_seq(chan,
6131 control->txseq);
6132
6133 chan->buffer_seq = chan->expected_tx_seq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006134 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006135
6136 err = l2cap_reassemble_sdu(chan, skb, control);
6137 if (err)
6138 break;
6139
6140 if (control->final) {
6141 if (!test_and_clear_bit(CONN_REJ_ACT,
6142 &chan->conn_state)) {
6143 control->final = 0;
6144 l2cap_retransmit_all(chan, control);
6145 l2cap_ertm_send(chan);
6146 }
6147 }
6148
6149 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
6150 l2cap_send_ack(chan);
6151 break;
6152 case L2CAP_TXSEQ_UNEXPECTED:
6153 l2cap_pass_to_tx(chan, control);
6154
6155 /* Can't issue SREJ frames in the local busy state.
6156 * Drop this frame, it will be seen as missing
6157 * when local busy is exited.
6158 */
6159 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6160 BT_DBG("Busy, discarding unexpected seq %d",
6161 control->txseq);
6162 break;
6163 }
6164
6165 /* There was a gap in the sequence, so an SREJ
6166 * must be sent for each missing frame. The
6167 * current frame is stored for later use.
6168 */
6169 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006170 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006171 BT_DBG("Queued %p (queue len %d)", skb,
6172 skb_queue_len(&chan->srej_q));
6173
6174 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
6175 l2cap_seq_list_clear(&chan->srej_list);
6176 l2cap_send_srej(chan, control->txseq);
6177
6178 chan->rx_state = L2CAP_RX_STATE_SREJ_SENT;
6179 break;
6180 case L2CAP_TXSEQ_DUPLICATE:
6181 l2cap_pass_to_tx(chan, control);
6182 break;
6183 case L2CAP_TXSEQ_INVALID_IGNORE:
6184 break;
6185 case L2CAP_TXSEQ_INVALID:
6186 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006187 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006188 break;
6189 }
6190 break;
6191 case L2CAP_EV_RECV_RR:
6192 l2cap_pass_to_tx(chan, control);
6193 if (control->final) {
6194 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6195
Mat Martineaue6a3ee62012-10-23 15:24:22 -07006196 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state) &&
6197 !__chan_is_moving(chan)) {
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006198 control->final = 0;
6199 l2cap_retransmit_all(chan, control);
6200 }
6201
6202 l2cap_ertm_send(chan);
6203 } else if (control->poll) {
6204 l2cap_send_i_or_rr_or_rnr(chan);
6205 } else {
6206 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6207 &chan->conn_state) &&
6208 chan->unacked_frames)
6209 __set_retrans_timer(chan);
6210
6211 l2cap_ertm_send(chan);
6212 }
6213 break;
6214 case L2CAP_EV_RECV_RNR:
6215 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6216 l2cap_pass_to_tx(chan, control);
6217 if (control && control->poll) {
6218 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6219 l2cap_send_rr_or_rnr(chan, 0);
6220 }
6221 __clear_retrans_timer(chan);
6222 l2cap_seq_list_clear(&chan->retrans_list);
6223 break;
6224 case L2CAP_EV_RECV_REJ:
6225 l2cap_handle_rej(chan, control);
6226 break;
6227 case L2CAP_EV_RECV_SREJ:
6228 l2cap_handle_srej(chan, control);
6229 break;
6230 default:
6231 break;
6232 }
6233
6234 if (skb && !skb_in_use) {
6235 BT_DBG("Freeing %p", skb);
6236 kfree_skb(skb);
6237 }
6238
6239 return err;
6240}
6241
6242static int l2cap_rx_state_srej_sent(struct l2cap_chan *chan,
6243 struct l2cap_ctrl *control,
6244 struct sk_buff *skb, u8 event)
6245{
6246 int err = 0;
6247 u16 txseq = control->txseq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006248 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006249
6250 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6251 event);
6252
6253 switch (event) {
6254 case L2CAP_EV_RECV_IFRAME:
6255 switch (l2cap_classify_txseq(chan, txseq)) {
6256 case L2CAP_TXSEQ_EXPECTED:
6257 /* Keep frame for reassembly later */
6258 l2cap_pass_to_tx(chan, control);
6259 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006260 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006261 BT_DBG("Queued %p (queue len %d)", skb,
6262 skb_queue_len(&chan->srej_q));
6263
6264 chan->expected_tx_seq = __next_seq(chan, txseq);
6265 break;
6266 case L2CAP_TXSEQ_EXPECTED_SREJ:
6267 l2cap_seq_list_pop(&chan->srej_list);
6268
6269 l2cap_pass_to_tx(chan, control);
6270 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006271 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006272 BT_DBG("Queued %p (queue len %d)", skb,
6273 skb_queue_len(&chan->srej_q));
6274
6275 err = l2cap_rx_queued_iframes(chan);
6276 if (err)
6277 break;
6278
6279 break;
6280 case L2CAP_TXSEQ_UNEXPECTED:
6281 /* Got a frame that can't be reassembled yet.
6282 * Save it for later, and send SREJs to cover
6283 * the missing frames.
6284 */
6285 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006286 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006287 BT_DBG("Queued %p (queue len %d)", skb,
6288 skb_queue_len(&chan->srej_q));
6289
6290 l2cap_pass_to_tx(chan, control);
6291 l2cap_send_srej(chan, control->txseq);
6292 break;
6293 case L2CAP_TXSEQ_UNEXPECTED_SREJ:
6294 /* This frame was requested with an SREJ, but
6295 * some expected retransmitted frames are
6296 * missing. Request retransmission of missing
6297 * SREJ'd frames.
6298 */
6299 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006300 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006301 BT_DBG("Queued %p (queue len %d)", skb,
6302 skb_queue_len(&chan->srej_q));
6303
6304 l2cap_pass_to_tx(chan, control);
6305 l2cap_send_srej_list(chan, control->txseq);
6306 break;
6307 case L2CAP_TXSEQ_DUPLICATE_SREJ:
6308 /* We've already queued this frame. Drop this copy. */
6309 l2cap_pass_to_tx(chan, control);
6310 break;
6311 case L2CAP_TXSEQ_DUPLICATE:
6312 /* Expecting a later sequence number, so this frame
6313 * was already received. Ignore it completely.
6314 */
6315 break;
6316 case L2CAP_TXSEQ_INVALID_IGNORE:
6317 break;
6318 case L2CAP_TXSEQ_INVALID:
6319 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006320 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006321 break;
6322 }
6323 break;
6324 case L2CAP_EV_RECV_RR:
6325 l2cap_pass_to_tx(chan, control);
6326 if (control->final) {
6327 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6328
6329 if (!test_and_clear_bit(CONN_REJ_ACT,
6330 &chan->conn_state)) {
6331 control->final = 0;
6332 l2cap_retransmit_all(chan, control);
6333 }
6334
6335 l2cap_ertm_send(chan);
6336 } else if (control->poll) {
6337 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6338 &chan->conn_state) &&
6339 chan->unacked_frames) {
6340 __set_retrans_timer(chan);
6341 }
6342
6343 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6344 l2cap_send_srej_tail(chan);
6345 } else {
6346 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6347 &chan->conn_state) &&
6348 chan->unacked_frames)
6349 __set_retrans_timer(chan);
6350
6351 l2cap_send_ack(chan);
6352 }
6353 break;
6354 case L2CAP_EV_RECV_RNR:
6355 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6356 l2cap_pass_to_tx(chan, control);
6357 if (control->poll) {
6358 l2cap_send_srej_tail(chan);
6359 } else {
6360 struct l2cap_ctrl rr_control;
6361 memset(&rr_control, 0, sizeof(rr_control));
6362 rr_control.sframe = 1;
6363 rr_control.super = L2CAP_SUPER_RR;
6364 rr_control.reqseq = chan->buffer_seq;
6365 l2cap_send_sframe(chan, &rr_control);
6366 }
6367
6368 break;
6369 case L2CAP_EV_RECV_REJ:
6370 l2cap_handle_rej(chan, control);
6371 break;
6372 case L2CAP_EV_RECV_SREJ:
6373 l2cap_handle_srej(chan, control);
6374 break;
6375 }
6376
6377 if (skb && !skb_in_use) {
6378 BT_DBG("Freeing %p", skb);
6379 kfree_skb(skb);
6380 }
6381
6382 return err;
6383}
6384
Mat Martineau32b32732012-10-23 15:24:11 -07006385static int l2cap_finish_move(struct l2cap_chan *chan)
6386{
6387 BT_DBG("chan %p", chan);
6388
6389 chan->rx_state = L2CAP_RX_STATE_RECV;
6390
6391 if (chan->hs_hcon)
6392 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6393 else
6394 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6395
6396 return l2cap_resegment(chan);
6397}
6398
6399static int l2cap_rx_state_wait_p(struct l2cap_chan *chan,
6400 struct l2cap_ctrl *control,
6401 struct sk_buff *skb, u8 event)
6402{
6403 int err;
6404
6405 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6406 event);
6407
6408 if (!control->poll)
6409 return -EPROTO;
6410
6411 l2cap_process_reqseq(chan, control->reqseq);
6412
6413 if (!skb_queue_empty(&chan->tx_q))
6414 chan->tx_send_head = skb_peek(&chan->tx_q);
6415 else
6416 chan->tx_send_head = NULL;
6417
6418 /* Rewind next_tx_seq to the point expected
6419 * by the receiver.
6420 */
6421 chan->next_tx_seq = control->reqseq;
6422 chan->unacked_frames = 0;
6423
6424 err = l2cap_finish_move(chan);
6425 if (err)
6426 return err;
6427
6428 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6429 l2cap_send_i_or_rr_or_rnr(chan);
6430
6431 if (event == L2CAP_EV_RECV_IFRAME)
6432 return -EPROTO;
6433
6434 return l2cap_rx_state_recv(chan, control, NULL, event);
6435}
6436
6437static int l2cap_rx_state_wait_f(struct l2cap_chan *chan,
6438 struct l2cap_ctrl *control,
6439 struct sk_buff *skb, u8 event)
6440{
6441 int err;
6442
6443 if (!control->final)
6444 return -EPROTO;
6445
6446 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6447
6448 chan->rx_state = L2CAP_RX_STATE_RECV;
6449 l2cap_process_reqseq(chan, control->reqseq);
6450
6451 if (!skb_queue_empty(&chan->tx_q))
6452 chan->tx_send_head = skb_peek(&chan->tx_q);
6453 else
6454 chan->tx_send_head = NULL;
6455
6456 /* Rewind next_tx_seq to the point expected
6457 * by the receiver.
6458 */
6459 chan->next_tx_seq = control->reqseq;
6460 chan->unacked_frames = 0;
6461
6462 if (chan->hs_hcon)
6463 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6464 else
6465 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6466
6467 err = l2cap_resegment(chan);
6468
6469 if (!err)
6470 err = l2cap_rx_state_recv(chan, control, skb, event);
6471
6472 return err;
6473}
6474
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006475static bool __valid_reqseq(struct l2cap_chan *chan, u16 reqseq)
6476{
6477 /* Make sure reqseq is for a packet that has been sent but not acked */
6478 u16 unacked;
6479
6480 unacked = __seq_offset(chan, chan->next_tx_seq, chan->expected_ack_seq);
6481 return __seq_offset(chan, chan->next_tx_seq, reqseq) <= unacked;
6482}
6483
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006484static int l2cap_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6485 struct sk_buff *skb, u8 event)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006486{
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006487 int err = 0;
6488
6489 BT_DBG("chan %p, control %p, skb %p, event %d, state %d", chan,
6490 control, skb, event, chan->rx_state);
6491
6492 if (__valid_reqseq(chan, control->reqseq)) {
6493 switch (chan->rx_state) {
6494 case L2CAP_RX_STATE_RECV:
6495 err = l2cap_rx_state_recv(chan, control, skb, event);
6496 break;
6497 case L2CAP_RX_STATE_SREJ_SENT:
6498 err = l2cap_rx_state_srej_sent(chan, control, skb,
6499 event);
6500 break;
Mat Martineau32b32732012-10-23 15:24:11 -07006501 case L2CAP_RX_STATE_WAIT_P:
6502 err = l2cap_rx_state_wait_p(chan, control, skb, event);
6503 break;
6504 case L2CAP_RX_STATE_WAIT_F:
6505 err = l2cap_rx_state_wait_f(chan, control, skb, event);
6506 break;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006507 default:
6508 /* shut it down */
6509 break;
6510 }
6511 } else {
6512 BT_DBG("Invalid reqseq %d (next_tx_seq %d, expected_ack_seq %d",
6513 control->reqseq, chan->next_tx_seq,
6514 chan->expected_ack_seq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006515 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006516 }
6517
6518 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006519}
6520
6521static int l2cap_stream_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6522 struct sk_buff *skb)
6523{
Mat Martineau4b51dae92012-05-17 20:53:37 -07006524 int err = 0;
6525
6526 BT_DBG("chan %p, control %p, skb %p, state %d", chan, control, skb,
6527 chan->rx_state);
6528
6529 if (l2cap_classify_txseq(chan, control->txseq) ==
6530 L2CAP_TXSEQ_EXPECTED) {
6531 l2cap_pass_to_tx(chan, control);
6532
6533 BT_DBG("buffer_seq %d->%d", chan->buffer_seq,
6534 __next_seq(chan, chan->buffer_seq));
6535
6536 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
6537
6538 l2cap_reassemble_sdu(chan, skb, control);
6539 } else {
6540 if (chan->sdu) {
6541 kfree_skb(chan->sdu);
6542 chan->sdu = NULL;
6543 }
6544 chan->sdu_last_frag = NULL;
6545 chan->sdu_len = 0;
6546
6547 if (skb) {
6548 BT_DBG("Freeing %p", skb);
6549 kfree_skb(skb);
6550 }
6551 }
6552
6553 chan->last_acked_seq = control->txseq;
6554 chan->expected_tx_seq = __next_seq(chan, control->txseq);
6555
6556 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006557}
6558
6559static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6560{
6561 struct l2cap_ctrl *control = &bt_cb(skb)->control;
6562 u16 len;
6563 u8 event;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006564
Mat Martineaub76bbd62012-04-11 10:48:43 -07006565 __unpack_control(chan, skb);
6566
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006567 len = skb->len;
6568
6569 /*
6570 * We can just drop the corrupted I-frame here.
6571 * Receiver will miss it and start proper recovery
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006572 * procedures and ask for retransmission.
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006573 */
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006574 if (l2cap_check_fcs(chan, skb))
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006575 goto drop;
6576
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006577 if (!control->sframe && control->sar == L2CAP_SAR_START)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006578 len -= L2CAP_SDULEN_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006579
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006580 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006581 len -= L2CAP_FCS_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006582
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006583 if (len > chan->mps) {
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 if (!control->sframe) {
6589 int err;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006590
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006591 BT_DBG("iframe sar %d, reqseq %d, final %d, txseq %d",
6592 control->sar, control->reqseq, control->final,
6593 control->txseq);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03006594
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006595 /* Validate F-bit - F=0 always valid, F=1 only
6596 * valid in TX WAIT_F
6597 */
6598 if (control->final && chan->tx_state != L2CAP_TX_STATE_WAIT_F)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006599 goto drop;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006600
6601 if (chan->mode != L2CAP_MODE_STREAMING) {
6602 event = L2CAP_EV_RECV_IFRAME;
6603 err = l2cap_rx(chan, control, skb, event);
6604 } else {
6605 err = l2cap_stream_rx(chan, control, skb);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006606 }
6607
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006608 if (err)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006609 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006610 } else {
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006611 const u8 rx_func_to_event[4] = {
6612 L2CAP_EV_RECV_RR, L2CAP_EV_RECV_REJ,
6613 L2CAP_EV_RECV_RNR, L2CAP_EV_RECV_SREJ
6614 };
6615
6616 /* Only I-frames are expected in streaming mode */
6617 if (chan->mode == L2CAP_MODE_STREAMING)
6618 goto drop;
6619
6620 BT_DBG("sframe reqseq %d, final %d, poll %d, super %d",
6621 control->reqseq, control->final, control->poll,
6622 control->super);
6623
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006624 if (len != 0) {
Andrei Emeltchenko1bb166e2012-11-20 17:16:21 +02006625 BT_ERR("Trailing bytes: %d in sframe", len);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006626 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006627 goto drop;
6628 }
6629
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006630 /* Validate F and P bits */
6631 if (control->final && (control->poll ||
6632 chan->tx_state != L2CAP_TX_STATE_WAIT_F))
6633 goto drop;
6634
6635 event = rx_func_to_event[control->super];
6636 if (l2cap_rx(chan, control, skb, event))
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006637 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006638 }
6639
6640 return 0;
6641
6642drop:
6643 kfree_skb(skb);
6644 return 0;
6645}
6646
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006647static void l2cap_chan_le_send_credits(struct l2cap_chan *chan)
6648{
6649 struct l2cap_conn *conn = chan->conn;
6650 struct l2cap_le_credits pkt;
6651 u16 return_credits;
6652
6653 /* We return more credits to the sender only after the amount of
6654 * credits falls below half of the initial amount.
6655 */
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02006656 if (chan->rx_credits >= (le_max_credits + 1) / 2)
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006657 return;
6658
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02006659 return_credits = le_max_credits - chan->rx_credits;
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006660
6661 BT_DBG("chan %p returning %u credits to sender", chan, return_credits);
6662
6663 chan->rx_credits += return_credits;
6664
6665 pkt.cid = cpu_to_le16(chan->scid);
6666 pkt.credits = cpu_to_le16(return_credits);
6667
6668 chan->ident = l2cap_get_ident(conn);
6669
6670 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CREDITS, sizeof(pkt), &pkt);
6671}
6672
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006673static int l2cap_le_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6674{
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006675 int err;
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006676
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006677 if (!chan->rx_credits) {
6678 BT_ERR("No credits to receive LE L2CAP data");
Johan Hedbergdfd97742014-01-27 15:11:34 -08006679 l2cap_send_disconn_req(chan, ECONNRESET);
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006680 return -ENOBUFS;
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006681 }
6682
6683 if (chan->imtu < skb->len) {
6684 BT_ERR("Too big LE L2CAP PDU");
6685 return -ENOBUFS;
6686 }
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006687
6688 chan->rx_credits--;
6689 BT_DBG("rx_credits %u -> %u", chan->rx_credits + 1, chan->rx_credits);
6690
6691 l2cap_chan_le_send_credits(chan);
6692
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006693 err = 0;
6694
6695 if (!chan->sdu) {
6696 u16 sdu_len;
6697
6698 sdu_len = get_unaligned_le16(skb->data);
6699 skb_pull(skb, L2CAP_SDULEN_SIZE);
6700
6701 BT_DBG("Start of new SDU. sdu_len %u skb->len %u imtu %u",
6702 sdu_len, skb->len, chan->imtu);
6703
6704 if (sdu_len > chan->imtu) {
6705 BT_ERR("Too big LE L2CAP SDU length received");
6706 err = -EMSGSIZE;
6707 goto failed;
6708 }
6709
6710 if (skb->len > sdu_len) {
6711 BT_ERR("Too much LE L2CAP data received");
6712 err = -EINVAL;
6713 goto failed;
6714 }
6715
6716 if (skb->len == sdu_len)
6717 return chan->ops->recv(chan, skb);
6718
6719 chan->sdu = skb;
6720 chan->sdu_len = sdu_len;
6721 chan->sdu_last_frag = skb;
6722
6723 return 0;
6724 }
6725
6726 BT_DBG("SDU fragment. chan->sdu->len %u skb->len %u chan->sdu_len %u",
6727 chan->sdu->len, skb->len, chan->sdu_len);
6728
6729 if (chan->sdu->len + skb->len > chan->sdu_len) {
6730 BT_ERR("Too much LE L2CAP data received");
6731 err = -EINVAL;
6732 goto failed;
6733 }
6734
6735 append_skb_frag(chan->sdu, skb, &chan->sdu_last_frag);
6736 skb = NULL;
6737
6738 if (chan->sdu->len == chan->sdu_len) {
6739 err = chan->ops->recv(chan, chan->sdu);
6740 if (!err) {
6741 chan->sdu = NULL;
6742 chan->sdu_last_frag = NULL;
6743 chan->sdu_len = 0;
6744 }
6745 }
6746
6747failed:
6748 if (err) {
6749 kfree_skb(skb);
6750 kfree_skb(chan->sdu);
6751 chan->sdu = NULL;
6752 chan->sdu_last_frag = NULL;
6753 chan->sdu_len = 0;
6754 }
6755
6756 /* We can't return an error here since we took care of the skb
6757 * freeing internally. An error return would cause the caller to
6758 * do a double-free of the skb.
6759 */
6760 return 0;
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006761}
6762
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006763static void l2cap_data_channel(struct l2cap_conn *conn, u16 cid,
6764 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006765{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006766 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006767
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03006768 chan = l2cap_get_chan_by_scid(conn, cid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006769 if (!chan) {
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006770 if (cid == L2CAP_CID_A2MP) {
6771 chan = a2mp_channel_create(conn, skb);
6772 if (!chan) {
6773 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006774 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006775 }
6776
6777 l2cap_chan_lock(chan);
6778 } else {
6779 BT_DBG("unknown cid 0x%4.4x", cid);
6780 /* Drop packet and return */
6781 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006782 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006783 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006784 }
6785
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03006786 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006787
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03006788 if (chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006789 goto drop;
6790
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006791 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03006792 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006793 if (l2cap_le_data_rcv(chan, skb) < 0)
6794 goto drop;
6795
6796 goto done;
6797
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006798 case L2CAP_MODE_BASIC:
6799 /* If socket recv buffers overflows we drop data here
6800 * which is *bad* because L2CAP has to be reliable.
6801 * But we don't have any other choice. L2CAP doesn't
6802 * provide flow control mechanism. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07006803
Szymon Janc2c96e032014-02-18 20:48:34 +01006804 if (chan->imtu < skb->len) {
6805 BT_ERR("Dropping L2CAP data: receive buffer overflow");
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006806 goto drop;
Szymon Janc2c96e032014-02-18 20:48:34 +01006807 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006808
Gustavo Padovan80b98022012-05-27 22:27:51 -03006809 if (!chan->ops->recv(chan, skb))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006810 goto done;
6811 break;
6812
6813 case L2CAP_MODE_ERTM:
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006814 case L2CAP_MODE_STREAMING:
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006815 l2cap_data_rcv(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006816 goto done;
6817
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006818 default:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006819 BT_DBG("chan %p: bad mode 0x%2.2x", chan, chan->mode);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006820 break;
6821 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006822
6823drop:
6824 kfree_skb(skb);
6825
6826done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006827 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006828}
6829
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006830static void l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm,
6831 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006832{
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006833 struct hci_conn *hcon = conn->hcon;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006834 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006835
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006836 if (hcon->type != ACL_LINK)
6837 goto drop;
6838
Johan Hedbergbf20fd42013-05-14 13:23:13 +03006839 chan = l2cap_global_chan_by_psm(0, psm, &hcon->src, &hcon->dst,
6840 ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006841 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006842 goto drop;
6843
Andrei Emeltchenko5b4ceda2012-02-24 16:35:32 +02006844 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006845
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03006846 if (chan->state != BT_BOUND && chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006847 goto drop;
6848
Vinicius Costa Gomese13e21d2011-06-17 22:46:27 -03006849 if (chan->imtu < skb->len)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006850 goto drop;
6851
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006852 /* Store remote BD_ADDR and PSM for msg_name */
Marcel Holtmann06ae3312013-10-18 03:43:00 -07006853 bacpy(&bt_cb(skb)->bdaddr, &hcon->dst);
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006854 bt_cb(skb)->psm = psm;
6855
Gustavo Padovan80b98022012-05-27 22:27:51 -03006856 if (!chan->ops->recv(chan, skb))
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006857 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006858
6859drop:
6860 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006861}
6862
Marcel Holtmann72f78352013-04-23 00:59:00 -07006863static void l2cap_att_channel(struct l2cap_conn *conn,
Andrei Emeltchenko6810fca2012-05-31 11:18:57 +03006864 struct sk_buff *skb)
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006865{
Marcel Holtmannb99707d2013-10-03 02:54:11 -07006866 struct hci_conn *hcon = conn->hcon;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006867 struct l2cap_chan *chan;
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006868
Marcel Holtmannb99707d2013-10-03 02:54:11 -07006869 if (hcon->type != LE_LINK)
6870 goto drop;
6871
Johan Hedbergaf1c0132013-04-29 19:35:42 +03006872 chan = l2cap_global_chan_by_scid(BT_CONNECTED, L2CAP_CID_ATT,
Marcel Holtmann06ae3312013-10-18 03:43:00 -07006873 &hcon->src, &hcon->dst);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006874 if (!chan)
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006875 goto drop;
6876
Andrei Emeltchenko5b4ceda2012-02-24 16:35:32 +02006877 BT_DBG("chan %p, len %d", chan, skb->len);
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006878
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07006879 if (hci_blacklist_lookup(hcon->hdev, &hcon->dst, hcon->dst_type))
6880 goto drop;
6881
Vinicius Costa Gomese13e21d2011-06-17 22:46:27 -03006882 if (chan->imtu < skb->len)
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006883 goto drop;
6884
Gustavo Padovan80b98022012-05-27 22:27:51 -03006885 if (!chan->ops->recv(chan, skb))
Andrei Emeltchenko6810fca2012-05-31 11:18:57 +03006886 return;
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006887
6888drop:
6889 kfree_skb(skb);
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006890}
6891
Linus Torvalds1da177e2005-04-16 15:20:36 -07006892static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb)
6893{
6894 struct l2cap_hdr *lh = (void *) skb->data;
Johan Hedberg61a939c2014-01-17 20:45:11 +02006895 struct hci_conn *hcon = conn->hcon;
Al Viro8e036fc2007-07-29 00:16:36 -07006896 u16 cid, len;
6897 __le16 psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006898
Johan Hedberg61a939c2014-01-17 20:45:11 +02006899 if (hcon->state != BT_CONNECTED) {
6900 BT_DBG("queueing pending rx skb");
6901 skb_queue_tail(&conn->pending_rx, skb);
6902 return;
6903 }
6904
Linus Torvalds1da177e2005-04-16 15:20:36 -07006905 skb_pull(skb, L2CAP_HDR_SIZE);
6906 cid = __le16_to_cpu(lh->cid);
6907 len = __le16_to_cpu(lh->len);
6908
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006909 if (len != skb->len) {
6910 kfree_skb(skb);
6911 return;
6912 }
6913
Linus Torvalds1da177e2005-04-16 15:20:36 -07006914 BT_DBG("len %d, cid 0x%4.4x", len, cid);
6915
6916 switch (cid) {
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006917 case L2CAP_CID_SIGNALING:
Linus Torvalds1da177e2005-04-16 15:20:36 -07006918 l2cap_sig_channel(conn, skb);
6919 break;
6920
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006921 case L2CAP_CID_CONN_LESS:
Andrei Emeltchenko097db762012-03-09 14:16:17 +02006922 psm = get_unaligned((__le16 *) skb->data);
Andrei Emeltchenko0181a702012-05-29 10:04:05 +03006923 skb_pull(skb, L2CAP_PSMLEN_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006924 l2cap_conless_channel(conn, psm, skb);
6925 break;
6926
Johan Hedberg073d1cf2013-04-29 19:35:35 +03006927 case L2CAP_CID_ATT:
Marcel Holtmann72f78352013-04-23 00:59:00 -07006928 l2cap_att_channel(conn, skb);
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006929 break;
6930
Marcel Holtmanna2877622013-10-02 23:46:54 -07006931 case L2CAP_CID_LE_SIGNALING:
6932 l2cap_le_sig_channel(conn, skb);
6933 break;
6934
Anderson Brigliab501d6a2011-06-07 18:46:31 -03006935 case L2CAP_CID_SMP:
6936 if (smp_sig_channel(conn, skb))
6937 l2cap_conn_del(conn->hcon, EACCES);
6938 break;
6939
Linus Torvalds1da177e2005-04-16 15:20:36 -07006940 default:
6941 l2cap_data_channel(conn, cid, skb);
6942 break;
6943 }
6944}
6945
Johan Hedberg61a939c2014-01-17 20:45:11 +02006946static void process_pending_rx(struct work_struct *work)
6947{
6948 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
6949 pending_rx_work);
6950 struct sk_buff *skb;
6951
6952 BT_DBG("");
6953
6954 while ((skb = skb_dequeue(&conn->pending_rx)))
6955 l2cap_recv_frame(conn, skb);
6956}
6957
Johan Hedberg162b49e2014-01-17 20:45:10 +02006958static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon)
6959{
6960 struct l2cap_conn *conn = hcon->l2cap_data;
6961 struct hci_chan *hchan;
6962
6963 if (conn)
6964 return conn;
6965
6966 hchan = hci_chan_create(hcon);
6967 if (!hchan)
6968 return NULL;
6969
6970 conn = kzalloc(sizeof(struct l2cap_conn), GFP_KERNEL);
6971 if (!conn) {
6972 hci_chan_del(hchan);
6973 return NULL;
6974 }
6975
6976 kref_init(&conn->ref);
6977 hcon->l2cap_data = conn;
6978 conn->hcon = hcon;
6979 hci_conn_get(conn->hcon);
6980 conn->hchan = hchan;
6981
6982 BT_DBG("hcon %p conn %p hchan %p", hcon, conn, hchan);
6983
6984 switch (hcon->type) {
6985 case LE_LINK:
6986 if (hcon->hdev->le_mtu) {
6987 conn->mtu = hcon->hdev->le_mtu;
6988 break;
6989 }
6990 /* fall through */
6991 default:
6992 conn->mtu = hcon->hdev->acl_mtu;
6993 break;
6994 }
6995
6996 conn->feat_mask = 0;
6997
6998 if (hcon->type == ACL_LINK)
6999 conn->hs_enabled = test_bit(HCI_HS_ENABLED,
7000 &hcon->hdev->dev_flags);
7001
7002 spin_lock_init(&conn->lock);
7003 mutex_init(&conn->chan_lock);
7004
7005 INIT_LIST_HEAD(&conn->chan_l);
7006 INIT_LIST_HEAD(&conn->users);
7007
7008 if (hcon->type == LE_LINK)
7009 INIT_DELAYED_WORK(&conn->security_timer, security_timeout);
7010 else
7011 INIT_DELAYED_WORK(&conn->info_timer, l2cap_info_timeout);
7012
Johan Hedberg61a939c2014-01-17 20:45:11 +02007013 skb_queue_head_init(&conn->pending_rx);
7014 INIT_WORK(&conn->pending_rx_work, process_pending_rx);
7015
Johan Hedberg162b49e2014-01-17 20:45:10 +02007016 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
7017
7018 return conn;
7019}
7020
7021static bool is_valid_psm(u16 psm, u8 dst_type) {
7022 if (!psm)
7023 return false;
7024
7025 if (bdaddr_type_is_le(dst_type))
7026 return (psm <= 0x00ff);
7027
7028 /* PSM must be odd and lsb of upper byte must be 0 */
7029 return ((psm & 0x0101) == 0x0001);
7030}
7031
7032int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
7033 bdaddr_t *dst, u8 dst_type)
7034{
7035 struct l2cap_conn *conn;
7036 struct hci_conn *hcon;
7037 struct hci_dev *hdev;
7038 __u8 auth_type;
7039 int err;
7040
7041 BT_DBG("%pMR -> %pMR (type %u) psm 0x%2.2x", &chan->src, dst,
7042 dst_type, __le16_to_cpu(psm));
7043
7044 hdev = hci_get_route(dst, &chan->src);
7045 if (!hdev)
7046 return -EHOSTUNREACH;
7047
7048 hci_dev_lock(hdev);
7049
7050 l2cap_chan_lock(chan);
7051
7052 if (!is_valid_psm(__le16_to_cpu(psm), dst_type) && !cid &&
7053 chan->chan_type != L2CAP_CHAN_RAW) {
7054 err = -EINVAL;
7055 goto done;
7056 }
7057
Johan Hedberg21626e62014-01-24 10:35:41 +02007058 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED && !psm) {
7059 err = -EINVAL;
7060 goto done;
7061 }
7062
7063 if (chan->chan_type == L2CAP_CHAN_FIXED && !cid) {
Johan Hedberg162b49e2014-01-17 20:45:10 +02007064 err = -EINVAL;
7065 goto done;
7066 }
7067
7068 switch (chan->mode) {
7069 case L2CAP_MODE_BASIC:
7070 break;
7071 case L2CAP_MODE_LE_FLOWCTL:
7072 l2cap_le_flowctl_init(chan);
7073 break;
7074 case L2CAP_MODE_ERTM:
7075 case L2CAP_MODE_STREAMING:
7076 if (!disable_ertm)
7077 break;
7078 /* fall through */
7079 default:
7080 err = -ENOTSUPP;
7081 goto done;
7082 }
7083
7084 switch (chan->state) {
7085 case BT_CONNECT:
7086 case BT_CONNECT2:
7087 case BT_CONFIG:
7088 /* Already connecting */
7089 err = 0;
7090 goto done;
7091
7092 case BT_CONNECTED:
7093 /* Already connected */
7094 err = -EISCONN;
7095 goto done;
7096
7097 case BT_OPEN:
7098 case BT_BOUND:
7099 /* Can connect */
7100 break;
7101
7102 default:
7103 err = -EBADFD;
7104 goto done;
7105 }
7106
7107 /* Set destination address and psm */
7108 bacpy(&chan->dst, dst);
7109 chan->dst_type = dst_type;
7110
7111 chan->psm = psm;
7112 chan->dcid = cid;
7113
7114 auth_type = l2cap_get_auth_type(chan);
7115
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007116 if (bdaddr_type_is_le(dst_type)) {
7117 /* Convert from L2CAP channel address type to HCI address type
7118 */
7119 if (dst_type == BDADDR_LE_PUBLIC)
7120 dst_type = ADDR_LE_DEV_PUBLIC;
7121 else
7122 dst_type = ADDR_LE_DEV_RANDOM;
7123
Andre Guedes04a6c582014-02-26 20:21:44 -03007124 hcon = hci_connect_le(hdev, dst, dst_type, chan->sec_level,
7125 auth_type);
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007126 } else {
Andre Guedes04a6c582014-02-26 20:21:44 -03007127 hcon = hci_connect_acl(hdev, dst, chan->sec_level, auth_type);
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007128 }
Johan Hedberg162b49e2014-01-17 20:45:10 +02007129
7130 if (IS_ERR(hcon)) {
7131 err = PTR_ERR(hcon);
7132 goto done;
7133 }
7134
7135 conn = l2cap_conn_add(hcon);
7136 if (!conn) {
7137 hci_conn_drop(hcon);
7138 err = -ENOMEM;
7139 goto done;
7140 }
7141
7142 if (cid && __l2cap_get_chan_by_dcid(conn, cid)) {
7143 hci_conn_drop(hcon);
7144 err = -EBUSY;
7145 goto done;
7146 }
7147
7148 /* Update source addr of the socket */
7149 bacpy(&chan->src, &hcon->src);
7150 chan->src_type = bdaddr_type(hcon, hcon->src_type);
7151
7152 l2cap_chan_unlock(chan);
7153 l2cap_chan_add(conn, chan);
7154 l2cap_chan_lock(chan);
7155
7156 /* l2cap_chan_add takes its own ref so we can drop this one */
7157 hci_conn_drop(hcon);
7158
7159 l2cap_state_change(chan, BT_CONNECT);
7160 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
7161
Johan Hedberg61202e42014-01-28 15:16:48 -08007162 /* Release chan->sport so that it can be reused by other
7163 * sockets (as it's only used for listening sockets).
7164 */
7165 write_lock(&chan_list_lock);
7166 chan->sport = 0;
7167 write_unlock(&chan_list_lock);
7168
Johan Hedberg162b49e2014-01-17 20:45:10 +02007169 if (hcon->state == BT_CONNECTED) {
7170 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
7171 __clear_chan_timer(chan);
7172 if (l2cap_chan_check_security(chan))
7173 l2cap_state_change(chan, BT_CONNECTED);
7174 } else
7175 l2cap_do_start(chan);
7176 }
7177
7178 err = 0;
7179
7180done:
7181 l2cap_chan_unlock(chan);
7182 hci_dev_unlock(hdev);
7183 hci_dev_put(hdev);
7184 return err;
7185}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +03007186EXPORT_SYMBOL_GPL(l2cap_chan_connect);
Johan Hedberg162b49e2014-01-17 20:45:10 +02007187
Linus Torvalds1da177e2005-04-16 15:20:36 -07007188/* ---- L2CAP interface with lower layer (HCI) ---- */
7189
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007190int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007191{
7192 int exact = 0, lm1 = 0, lm2 = 0;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007193 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007194
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03007195 BT_DBG("hdev %s, bdaddr %pMR", hdev->name, bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007196
7197 /* Find listening sockets and check their link_mode */
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007198 read_lock(&chan_list_lock);
7199 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007200 if (c->state != BT_LISTEN)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007201 continue;
7202
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007203 if (!bacmp(&c->src, &hdev->bdaddr)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007204 lm1 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03007205 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007206 lm1 |= HCI_LM_MASTER;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007207 exact++;
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007208 } else if (!bacmp(&c->src, BDADDR_ANY)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007209 lm2 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03007210 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007211 lm2 |= HCI_LM_MASTER;
7212 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007213 }
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007214 read_unlock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007215
7216 return exact ? lm1 : lm2;
7217}
7218
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03007219void l2cap_connect_cfm(struct hci_conn *hcon, u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007220{
Marcel Holtmann01394182006-07-03 10:02:46 +02007221 struct l2cap_conn *conn;
7222
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03007223 BT_DBG("hcon %p bdaddr %pMR status %d", hcon, &hcon->dst, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007224
Linus Torvalds1da177e2005-04-16 15:20:36 -07007225 if (!status) {
Claudio Takahasibaf43252013-04-11 13:55:50 -03007226 conn = l2cap_conn_add(hcon);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007227 if (conn)
7228 l2cap_conn_ready(conn);
Andrei Emeltchenkoba6fc312012-10-31 15:46:26 +02007229 } else {
Joe Perchese1750722011-06-29 18:18:29 -07007230 l2cap_conn_del(hcon, bt_to_errno(status));
Andrei Emeltchenkoba6fc312012-10-31 15:46:26 +02007231 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007232}
7233
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007234int l2cap_disconn_ind(struct hci_conn *hcon)
Marcel Holtmann2950f212009-02-12 14:02:50 +01007235{
7236 struct l2cap_conn *conn = hcon->l2cap_data;
7237
7238 BT_DBG("hcon %p", hcon);
7239
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007240 if (!conn)
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02007241 return HCI_ERROR_REMOTE_USER_TERM;
Marcel Holtmann2950f212009-02-12 14:02:50 +01007242 return conn->disc_reason;
7243}
7244
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03007245void l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007246{
7247 BT_DBG("hcon %p reason %d", hcon, reason);
7248
Joe Perchese1750722011-06-29 18:18:29 -07007249 l2cap_conn_del(hcon, bt_to_errno(reason));
Linus Torvalds1da177e2005-04-16 15:20:36 -07007250}
7251
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007252static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt)
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007253{
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03007254 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED)
Marcel Holtmann255c7602009-02-04 21:07:19 +01007255 return;
7256
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007257 if (encrypt == 0x00) {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007258 if (chan->sec_level == BT_SECURITY_MEDIUM) {
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007259 __set_chan_timer(chan, L2CAP_ENC_TIMEOUT);
Marcel Holtmann7d513e92014-01-15 22:37:40 -08007260 } else if (chan->sec_level == BT_SECURITY_HIGH ||
7261 chan->sec_level == BT_SECURITY_FIPS)
Gustavo F. Padovan0f852722011-05-04 19:42:50 -03007262 l2cap_chan_close(chan, ECONNREFUSED);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007263 } else {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007264 if (chan->sec_level == BT_SECURITY_MEDIUM)
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -03007265 __clear_chan_timer(chan);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007266 }
7267}
7268
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007269int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007270{
Marcel Holtmann40be4922008-07-14 20:13:50 +02007271 struct l2cap_conn *conn = hcon->l2cap_data;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03007272 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007273
Marcel Holtmann01394182006-07-03 10:02:46 +02007274 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007275 return 0;
Marcel Holtmann01394182006-07-03 10:02:46 +02007276
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03007277 BT_DBG("conn %p status 0x%2.2x encrypt %u", conn, status, encrypt);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007278
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03007279 if (hcon->type == LE_LINK) {
Hemant Gupta35d4adcc2012-04-18 14:46:26 +05307280 if (!status && encrypt)
Johan Hedberg4bd6d382014-02-26 23:33:45 +02007281 smp_distribute_keys(conn);
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02007282 cancel_delayed_work(&conn->security_timer);
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03007283 }
7284
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007285 mutex_lock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007286
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007287 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007288 l2cap_chan_lock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007289
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03007290 BT_DBG("chan %p scid 0x%4.4x state %s", chan, chan->scid,
7291 state_to_string(chan->state));
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007292
Johan Hedberg2338a7e2014-01-24 10:35:40 +02007293 if (chan->scid == L2CAP_CID_A2MP) {
Andrei Emeltchenko78eb2f92012-07-19 17:03:47 +03007294 l2cap_chan_unlock(chan);
7295 continue;
7296 }
7297
Johan Hedberg073d1cf2013-04-29 19:35:35 +03007298 if (chan->scid == L2CAP_CID_ATT) {
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007299 if (!status && encrypt) {
7300 chan->sec_level = hcon->sec_level;
Andrei Emeltchenkocf4cd002012-02-06 15:03:59 +02007301 l2cap_chan_ready(chan);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007302 }
7303
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007304 l2cap_chan_unlock(chan);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007305 continue;
7306 }
7307
Andrei Emeltchenko96eff462012-11-15 18:14:53 +02007308 if (!__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007309 l2cap_chan_unlock(chan);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01007310 continue;
7311 }
7312
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007313 if (!status && (chan->state == BT_CONNECTED ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01007314 chan->state == BT_CONFIG)) {
Marcel Holtmannd97c8992013-10-14 02:53:54 -07007315 chan->ops->resume(chan);
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007316 l2cap_check_encryption(chan, encrypt);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007317 l2cap_chan_unlock(chan);
Marcel Holtmann9719f8a2008-07-14 20:13:45 +02007318 continue;
7319 }
7320
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007321 if (chan->state == BT_CONNECT) {
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007322 if (!status)
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03007323 l2cap_start_connection(chan);
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007324 else
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007325 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007326 } else if (chan->state == BT_CONNECT2) {
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007327 struct l2cap_conn_rsp rsp;
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007328 __u16 res, stat;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007329
7330 if (!status) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07007331 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007332 res = L2CAP_CR_PEND;
7333 stat = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08007334 chan->ops->defer(chan);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007335 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007336 l2cap_state_change(chan, BT_CONFIG);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007337 res = L2CAP_CR_SUCCESS;
7338 stat = L2CAP_CS_NO_INFO;
7339 }
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007340 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007341 l2cap_state_change(chan, BT_DISCONN);
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007342 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007343 res = L2CAP_CR_SEC_BLOCK;
7344 stat = L2CAP_CS_NO_INFO;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007345 }
7346
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03007347 rsp.scid = cpu_to_le16(chan->dcid);
7348 rsp.dcid = cpu_to_le16(chan->scid);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007349 rsp.result = cpu_to_le16(res);
7350 rsp.status = cpu_to_le16(stat);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03007351 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01007352 sizeof(rsp), &rsp);
Mat Martineau2d369352012-05-23 14:59:30 -07007353
7354 if (!test_bit(CONF_REQ_SENT, &chan->conf_state) &&
7355 res == L2CAP_CR_SUCCESS) {
7356 char buf[128];
7357 set_bit(CONF_REQ_SENT, &chan->conf_state);
7358 l2cap_send_cmd(conn, l2cap_get_ident(conn),
7359 L2CAP_CONF_REQ,
7360 l2cap_build_conf_req(chan, buf),
7361 buf);
7362 chan->num_conf_req++;
7363 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007364 }
7365
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007366 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007367 }
7368
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007369 mutex_unlock(&conn->chan_lock);
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007370
Linus Torvalds1da177e2005-04-16 15:20:36 -07007371 return 0;
7372}
7373
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007374int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007375{
7376 struct l2cap_conn *conn = hcon->l2cap_data;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007377 struct l2cap_hdr *hdr;
7378 int len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007379
Andrei Emeltchenko1d13a252012-10-15 11:58:41 +03007380 /* For AMP controller do not create l2cap conn */
7381 if (!conn && hcon->hdev->dev_type != HCI_BREDR)
7382 goto drop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007383
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007384 if (!conn)
Claudio Takahasibaf43252013-04-11 13:55:50 -03007385 conn = l2cap_conn_add(hcon);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007386
7387 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007388 goto drop;
7389
7390 BT_DBG("conn %p len %d flags 0x%x", conn, skb->len, flags);
7391
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007392 switch (flags) {
7393 case ACL_START:
7394 case ACL_START_NO_FLUSH:
7395 case ACL_COMPLETE:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007396 if (conn->rx_len) {
7397 BT_ERR("Unexpected start frame (len %d)", skb->len);
7398 kfree_skb(conn->rx_skb);
7399 conn->rx_skb = NULL;
7400 conn->rx_len = 0;
7401 l2cap_conn_unreliable(conn, ECOMM);
7402 }
7403
Andrei Emeltchenkoaae7fe22010-09-15 14:28:43 +03007404 /* Start fragment always begin with Basic L2CAP header */
7405 if (skb->len < L2CAP_HDR_SIZE) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07007406 BT_ERR("Frame is too short (len %d)", skb->len);
7407 l2cap_conn_unreliable(conn, ECOMM);
7408 goto drop;
7409 }
7410
7411 hdr = (struct l2cap_hdr *) skb->data;
7412 len = __le16_to_cpu(hdr->len) + L2CAP_HDR_SIZE;
7413
7414 if (len == skb->len) {
7415 /* Complete frame received */
7416 l2cap_recv_frame(conn, skb);
7417 return 0;
7418 }
7419
7420 BT_DBG("Start: total len %d, frag len %d", len, skb->len);
7421
7422 if (skb->len > len) {
7423 BT_ERR("Frame is too long (len %d, expected len %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007424 skb->len, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007425 l2cap_conn_unreliable(conn, ECOMM);
7426 goto drop;
7427 }
7428
7429 /* Allocate skb for the complete frame (with header) */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03007430 conn->rx_skb = bt_skb_alloc(len, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03007431 if (!conn->rx_skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007432 goto drop;
7433
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007434 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007435 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007436 conn->rx_len = len - skb->len;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007437 break;
7438
7439 case ACL_CONT:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007440 BT_DBG("Cont: frag len %d (expecting %d)", skb->len, conn->rx_len);
7441
7442 if (!conn->rx_len) {
7443 BT_ERR("Unexpected continuation frame (len %d)", skb->len);
7444 l2cap_conn_unreliable(conn, ECOMM);
7445 goto drop;
7446 }
7447
7448 if (skb->len > conn->rx_len) {
7449 BT_ERR("Fragment is too long (len %d, expected %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007450 skb->len, conn->rx_len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007451 kfree_skb(conn->rx_skb);
7452 conn->rx_skb = NULL;
7453 conn->rx_len = 0;
7454 l2cap_conn_unreliable(conn, ECOMM);
7455 goto drop;
7456 }
7457
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007458 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007459 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007460 conn->rx_len -= skb->len;
7461
7462 if (!conn->rx_len) {
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007463 /* Complete frame received. l2cap_recv_frame
7464 * takes ownership of the skb so set the global
7465 * rx_skb pointer to NULL first.
7466 */
7467 struct sk_buff *rx_skb = conn->rx_skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007468 conn->rx_skb = NULL;
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007469 l2cap_recv_frame(conn, rx_skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007470 }
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007471 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007472 }
7473
7474drop:
7475 kfree_skb(skb);
7476 return 0;
7477}
7478
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007479static int l2cap_debugfs_show(struct seq_file *f, void *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007480{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007481 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007482
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007483 read_lock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007484
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007485 list_for_each_entry(c, &chan_list, global_l) {
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03007486 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 -07007487 &c->src, &c->dst,
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03007488 c->state, __le16_to_cpu(c->psm),
7489 c->scid, c->dcid, c->imtu, c->omtu,
7490 c->sec_level, c->mode);
Andrei Emeltchenko61e1b4b2012-01-19 11:19:50 +02007491 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007492
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007493 read_unlock(&chan_list_lock);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007494
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007495 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007496}
7497
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007498static int l2cap_debugfs_open(struct inode *inode, struct file *file)
7499{
7500 return single_open(file, l2cap_debugfs_show, inode->i_private);
7501}
7502
7503static const struct file_operations l2cap_debugfs_fops = {
7504 .open = l2cap_debugfs_open,
7505 .read = seq_read,
7506 .llseek = seq_lseek,
7507 .release = single_release,
7508};
7509
7510static struct dentry *l2cap_debugfs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007511
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007512int __init l2cap_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007513{
7514 int err;
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007515
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007516 err = l2cap_init_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007517 if (err < 0)
7518 return err;
7519
Marcel Holtmann1120e4b2013-10-17 17:24:16 -07007520 if (IS_ERR_OR_NULL(bt_debugfs))
7521 return 0;
7522
7523 l2cap_debugfs = debugfs_create_file("l2cap", 0444, bt_debugfs,
7524 NULL, &l2cap_debugfs_fops);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007525
Samuel Ortiz40b93972014-05-14 17:53:35 +02007526 debugfs_create_u16("l2cap_le_max_credits", 0644, bt_debugfs,
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02007527 &le_max_credits);
Samuel Ortiz40b93972014-05-14 17:53:35 +02007528 debugfs_create_u16("l2cap_le_default_mps", 0644, bt_debugfs,
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02007529 &le_default_mps);
7530
Linus Torvalds1da177e2005-04-16 15:20:36 -07007531 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007532}
7533
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007534void l2cap_exit(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007535{
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007536 debugfs_remove(l2cap_debugfs);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007537 l2cap_cleanup_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007538}
7539
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03007540module_param(disable_ertm, bool, 0644);
7541MODULE_PARM_DESC(disable_ertm, "Disable enhanced retransmission mode");