blob: 565afb78296ad72f264bdf84e1c5d5257af810fb [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. Padovan89bc5002011-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. Padovan89bc5002011-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. Padovan89bc5002011-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. Padovan89bc5002011-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. Padovan89bc5002011-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. Padovan89bc5002011-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. Padovan89bc5002011-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. Padovan89bc5002011-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. Padovan89bc5002011-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. Padovan89bc5002011-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. Padovan89bc5002011-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
Marcel Holtmann80afeb62014-06-23 12:18:51 +02001484 /* For LE slave connections, make sure the connection interval
1485 * is in the range of the minium and maximum interval that has
1486 * been configured for this connection. If not, then trigger
1487 * the connection update procedure.
1488 */
1489 if (!(hcon->link_mode & HCI_LM_MASTER) &&
1490 (hcon->le_conn_interval < hcon->le_conn_min_interval ||
1491 hcon->le_conn_interval > hcon->le_conn_max_interval)) {
1492 struct l2cap_conn_param_update_req req;
1493
1494 req.min = cpu_to_le16(hcon->le_conn_min_interval);
1495 req.max = cpu_to_le16(hcon->le_conn_max_interval);
1496 req.latency = cpu_to_le16(hcon->le_conn_latency);
1497 req.to_multiplier = cpu_to_le16(hcon->le_supv_timeout);
1498
1499 l2cap_send_cmd(conn, l2cap_get_ident(conn),
1500 L2CAP_CONN_PARAM_UPDATE_REQ, sizeof(req), &req);
1501 }
1502
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001503 l2cap_chan_lock(pchan);
Gustavo F. Padovan62f3a2c2011-04-14 18:34:34 -03001504
Gustavo Padovan80b98022012-05-27 22:27:51 -03001505 chan = pchan->ops->new_connection(pchan);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001506 if (!chan)
Ville Tervob62f3282011-02-10 22:38:50 -03001507 goto clean;
1508
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001509 bacpy(&chan->src, &hcon->src);
1510 bacpy(&chan->dst, &hcon->dst);
1511 chan->src_type = bdaddr_type(hcon, hcon->src_type);
1512 chan->dst_type = dst_type;
Ville Tervob62f3282011-02-10 22:38:50 -03001513
Johan Hedberg44f3b0f2013-04-29 19:35:45 +03001514 __l2cap_chan_add(conn, chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001515
Ville Tervob62f3282011-02-10 22:38:50 -03001516clean:
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001517 l2cap_chan_unlock(pchan);
Ville Tervob62f3282011-02-10 22:38:50 -03001518}
1519
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001520static void l2cap_conn_ready(struct l2cap_conn *conn)
1521{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001522 struct l2cap_chan *chan;
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001523 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001524
1525 BT_DBG("conn %p", conn);
1526
Johan Hedbergd8729922013-04-29 19:35:39 +03001527 /* For outgoing pairing which doesn't necessarily have an
1528 * associated socket (e.g. mgmt_pair_device).
1529 */
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001530 if (hcon->out && hcon->type == LE_LINK)
1531 smp_conn_security(hcon, hcon->pending_sec_level);
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03001532
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001533 mutex_lock(&conn->chan_lock);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001534
Johan Hedberg44f3b0f2013-04-29 19:35:45 +03001535 if (hcon->type == LE_LINK)
1536 l2cap_le_conn_ready(conn);
1537
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001538 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03001539
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001540 l2cap_chan_lock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001541
Johan Hedberg2338a7e2014-01-24 10:35:40 +02001542 if (chan->scid == L2CAP_CID_A2MP) {
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001543 l2cap_chan_unlock(chan);
1544 continue;
1545 }
1546
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001547 if (hcon->type == LE_LINK) {
Johan Hedbergf1496de2013-05-13 14:15:56 +03001548 l2cap_le_start(chan);
Vinicius Costa Gomes63128452011-06-17 22:46:26 -03001549 } else if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Gustavo Padovan74e75742013-10-15 19:24:51 -03001550 l2cap_chan_ready(chan);
Anderson Brigliab501d6a2011-06-07 18:46:31 -03001551
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001552 } else if (chan->state == BT_CONNECT) {
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001553 l2cap_do_start(chan);
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001554 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001555
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001556 l2cap_chan_unlock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001557 }
1558
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001559 mutex_unlock(&conn->chan_lock);
Johan Hedberg61a939c2014-01-17 20:45:11 +02001560
1561 queue_work(hcon->hdev->workqueue, &conn->pending_rx_work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001562}
1563
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001564/* Notify sockets that we cannot guaranty reliability anymore */
1565static void l2cap_conn_unreliable(struct l2cap_conn *conn, int err)
1566{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001567 struct l2cap_chan *chan;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001568
1569 BT_DBG("conn %p", conn);
1570
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001571 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001572
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001573 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +03001574 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo Padovan1d8b1fd2012-10-06 11:34:52 +01001575 l2cap_chan_set_err(chan, err);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001576 }
1577
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001578 mutex_unlock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001579}
1580
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001581static void l2cap_info_timeout(struct work_struct *work)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001582{
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001583 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001584 info_timer.work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001585
Marcel Holtmann984947d2009-02-06 23:35:19 +01001586 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01001587 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01001588
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001589 l2cap_conn_start(conn);
1590}
1591
David Herrmann2c8e1412013-04-06 20:28:45 +02001592/*
1593 * l2cap_user
1594 * External modules can register l2cap_user objects on l2cap_conn. The ->probe
1595 * callback is called during registration. The ->remove callback is called
1596 * during unregistration.
1597 * An l2cap_user object can either be explicitly unregistered or when the
1598 * underlying l2cap_conn object is deleted. This guarantees that l2cap->hcon,
1599 * l2cap->hchan, .. are valid as long as the remove callback hasn't been called.
1600 * External modules must own a reference to the l2cap_conn object if they intend
1601 * to call l2cap_unregister_user(). The l2cap_conn object might get destroyed at
1602 * any time if they don't.
1603 */
1604
1605int l2cap_register_user(struct l2cap_conn *conn, struct l2cap_user *user)
1606{
1607 struct hci_dev *hdev = conn->hcon->hdev;
1608 int ret;
1609
1610 /* We need to check whether l2cap_conn is registered. If it is not, we
1611 * must not register the l2cap_user. l2cap_conn_del() is unregisters
1612 * l2cap_conn objects, but doesn't provide its own locking. Instead, it
1613 * relies on the parent hci_conn object to be locked. This itself relies
1614 * on the hci_dev object to be locked. So we must lock the hci device
1615 * here, too. */
1616
1617 hci_dev_lock(hdev);
1618
1619 if (user->list.next || user->list.prev) {
1620 ret = -EINVAL;
1621 goto out_unlock;
1622 }
1623
1624 /* conn->hchan is NULL after l2cap_conn_del() was called */
1625 if (!conn->hchan) {
1626 ret = -ENODEV;
1627 goto out_unlock;
1628 }
1629
1630 ret = user->probe(conn, user);
1631 if (ret)
1632 goto out_unlock;
1633
1634 list_add(&user->list, &conn->users);
1635 ret = 0;
1636
1637out_unlock:
1638 hci_dev_unlock(hdev);
1639 return ret;
1640}
1641EXPORT_SYMBOL(l2cap_register_user);
1642
1643void l2cap_unregister_user(struct l2cap_conn *conn, struct l2cap_user *user)
1644{
1645 struct hci_dev *hdev = conn->hcon->hdev;
1646
1647 hci_dev_lock(hdev);
1648
1649 if (!user->list.next || !user->list.prev)
1650 goto out_unlock;
1651
1652 list_del(&user->list);
1653 user->list.next = NULL;
1654 user->list.prev = NULL;
1655 user->remove(conn, user);
1656
1657out_unlock:
1658 hci_dev_unlock(hdev);
1659}
1660EXPORT_SYMBOL(l2cap_unregister_user);
1661
1662static void l2cap_unregister_all_users(struct l2cap_conn *conn)
1663{
1664 struct l2cap_user *user;
1665
1666 while (!list_empty(&conn->users)) {
1667 user = list_first_entry(&conn->users, struct l2cap_user, list);
1668 list_del(&user->list);
1669 user->list.next = NULL;
1670 user->list.prev = NULL;
1671 user->remove(conn, user);
1672 }
1673}
1674
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001675static void l2cap_conn_del(struct hci_conn *hcon, int err)
1676{
1677 struct l2cap_conn *conn = hcon->l2cap_data;
1678 struct l2cap_chan *chan, *l;
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001679
1680 if (!conn)
1681 return;
1682
1683 BT_DBG("hcon %p conn %p, err %d", hcon, conn, err);
1684
1685 kfree_skb(conn->rx_skb);
1686
Johan Hedberg61a939c2014-01-17 20:45:11 +02001687 skb_queue_purge(&conn->pending_rx);
Jukka Taimisto7ab56c32014-06-12 10:15:13 +00001688
1689 /* We can not call flush_work(&conn->pending_rx_work) here since we
1690 * might block if we are running on a worker from the same workqueue
1691 * pending_rx_work is waiting on.
1692 */
1693 if (work_pending(&conn->pending_rx_work))
1694 cancel_work_sync(&conn->pending_rx_work);
Johan Hedberg61a939c2014-01-17 20:45:11 +02001695
David Herrmann2c8e1412013-04-06 20:28:45 +02001696 l2cap_unregister_all_users(conn);
1697
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001698 mutex_lock(&conn->chan_lock);
1699
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001700 /* Kill channels */
1701 list_for_each_entry_safe(chan, l, &conn->chan_l, list) {
Mat Martineau61d6ef32012-04-27 16:50:50 -07001702 l2cap_chan_hold(chan);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001703 l2cap_chan_lock(chan);
1704
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001705 l2cap_chan_del(chan, err);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001706
1707 l2cap_chan_unlock(chan);
1708
Gustavo Padovan80b98022012-05-27 22:27:51 -03001709 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07001710 l2cap_chan_put(chan);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001711 }
1712
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001713 mutex_unlock(&conn->chan_lock);
1714
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001715 hci_chan_del(conn->hchan);
1716
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001717 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT)
Ulisses Furquim127074b2012-01-30 18:26:29 -02001718 cancel_delayed_work_sync(&conn->info_timer);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001719
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001720 if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags)) {
Ulisses Furquim127074b2012-01-30 18:26:29 -02001721 cancel_delayed_work_sync(&conn->security_timer);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001722 smp_chan_destroy(conn);
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001723 }
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001724
1725 hcon->l2cap_data = NULL;
David Herrmann9c903e32013-04-06 20:28:44 +02001726 conn->hchan = NULL;
1727 l2cap_conn_put(conn);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001728}
1729
Gustavo F. Padovan6c9d42a2011-12-20 10:57:27 -02001730static void security_timeout(struct work_struct *work)
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001731{
Gustavo F. Padovan6c9d42a2011-12-20 10:57:27 -02001732 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001733 security_timer.work);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001734
Johan Hedbergd06cc412012-06-06 18:44:11 +08001735 BT_DBG("conn %p", conn);
1736
1737 if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags)) {
1738 smp_chan_destroy(conn);
1739 l2cap_conn_del(conn->hcon, ETIMEDOUT);
1740 }
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001741}
1742
David Herrmann9c903e32013-04-06 20:28:44 +02001743static void l2cap_conn_free(struct kref *ref)
1744{
1745 struct l2cap_conn *conn = container_of(ref, struct l2cap_conn, ref);
1746
1747 hci_conn_put(conn->hcon);
1748 kfree(conn);
1749}
1750
1751void l2cap_conn_get(struct l2cap_conn *conn)
1752{
1753 kref_get(&conn->ref);
1754}
1755EXPORT_SYMBOL(l2cap_conn_get);
1756
1757void l2cap_conn_put(struct l2cap_conn *conn)
1758{
1759 kref_put(&conn->ref, l2cap_conn_free);
1760}
1761EXPORT_SYMBOL(l2cap_conn_put);
1762
Linus Torvalds1da177e2005-04-16 15:20:36 -07001763/* ---- Socket interface ---- */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001764
Ido Yarivc2287682012-04-20 15:46:07 -03001765/* Find socket with psm and source / destination bdaddr.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001766 * Returns closest match.
1767 */
Ido Yarivc2287682012-04-20 15:46:07 -03001768static struct l2cap_chan *l2cap_global_chan_by_psm(int state, __le16 psm,
1769 bdaddr_t *src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001770 bdaddr_t *dst,
1771 u8 link_type)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001772{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001773 struct l2cap_chan *c, *c1 = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001774
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001775 read_lock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001776
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001777 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001778 if (state && c->state != state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001779 continue;
1780
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001781 if (link_type == ACL_LINK && c->src_type != BDADDR_BREDR)
1782 continue;
1783
1784 if (link_type == LE_LINK && c->src_type == BDADDR_BREDR)
1785 continue;
1786
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001787 if (c->psm == psm) {
Ido Yarivc2287682012-04-20 15:46:07 -03001788 int src_match, dst_match;
1789 int src_any, dst_any;
1790
Linus Torvalds1da177e2005-04-16 15:20:36 -07001791 /* Exact match. */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001792 src_match = !bacmp(&c->src, src);
1793 dst_match = !bacmp(&c->dst, dst);
Ido Yarivc2287682012-04-20 15:46:07 -03001794 if (src_match && dst_match) {
Johannes Berga7567b22011-06-01 08:29:54 +02001795 read_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001796 return c;
1797 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001798
1799 /* Closest match */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001800 src_any = !bacmp(&c->src, BDADDR_ANY);
1801 dst_any = !bacmp(&c->dst, BDADDR_ANY);
Ido Yarivc2287682012-04-20 15:46:07 -03001802 if ((src_match && dst_any) || (src_any && dst_match) ||
1803 (src_any && dst_any))
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001804 c1 = c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001805 }
1806 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001807
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001808 read_unlock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001809
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001810 return c1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001811}
1812
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001813static void l2cap_monitor_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001814{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001815 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001816 monitor_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001817
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03001818 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001819
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001820 l2cap_chan_lock(chan);
1821
Mat Martineau80909e02012-05-17 20:53:50 -07001822 if (!chan->conn) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001823 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001824 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001825 return;
1826 }
1827
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001828 l2cap_tx(chan, NULL, NULL, L2CAP_EV_MONITOR_TO);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001829
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001830 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001831 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001832}
1833
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001834static void l2cap_retrans_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001835{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001836 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001837 retrans_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001838
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03001839 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001840
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001841 l2cap_chan_lock(chan);
1842
Mat Martineau80909e02012-05-17 20:53:50 -07001843 if (!chan->conn) {
1844 l2cap_chan_unlock(chan);
1845 l2cap_chan_put(chan);
1846 return;
1847 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001848
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001849 l2cap_tx(chan, NULL, NULL, L2CAP_EV_RETRANS_TO);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001850 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001851 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001852}
1853
Gustavo Padovand6603662012-05-21 13:58:22 -03001854static void l2cap_streaming_send(struct l2cap_chan *chan,
1855 struct sk_buff_head *skbs)
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001856{
Gustavo F. Padovanccbb84a2010-08-30 18:44:44 -03001857 struct sk_buff *skb;
Mat Martineau37339372012-05-17 20:53:33 -07001858 struct l2cap_ctrl *control;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001859
Mat Martineau37339372012-05-17 20:53:33 -07001860 BT_DBG("chan %p, skbs %p", chan, skbs);
1861
Mat Martineaub99e13a2012-10-23 15:24:19 -07001862 if (__chan_is_moving(chan))
1863 return;
1864
Mat Martineau37339372012-05-17 20:53:33 -07001865 skb_queue_splice_tail_init(skbs, &chan->tx_q);
1866
1867 while (!skb_queue_empty(&chan->tx_q)) {
1868
1869 skb = skb_dequeue(&chan->tx_q);
1870
1871 bt_cb(skb)->control.retries = 1;
1872 control = &bt_cb(skb)->control;
1873
1874 control->reqseq = 0;
1875 control->txseq = chan->next_tx_seq;
1876
1877 __pack_control(chan, control, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001878
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001879 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau37339372012-05-17 20:53:33 -07001880 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1881 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001882 }
1883
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001884 l2cap_do_send(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001885
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001886 BT_DBG("Sent txseq %u", control->txseq);
Mat Martineau37339372012-05-17 20:53:33 -07001887
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001888 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau37339372012-05-17 20:53:33 -07001889 chan->frames_sent++;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001890 }
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001891}
1892
Szymon Janc67c9e842011-07-28 16:24:33 +02001893static int l2cap_ertm_send(struct l2cap_chan *chan)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001894{
1895 struct sk_buff *skb, *tx_skb;
Mat Martineau18a48e72012-05-17 20:53:34 -07001896 struct l2cap_ctrl *control;
1897 int sent = 0;
1898
1899 BT_DBG("chan %p", chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001900
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001901 if (chan->state != BT_CONNECTED)
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001902 return -ENOTCONN;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001903
Mat Martineau94122bb2012-05-02 09:42:02 -07001904 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1905 return 0;
1906
Mat Martineaub99e13a2012-10-23 15:24:19 -07001907 if (__chan_is_moving(chan))
1908 return 0;
1909
Mat Martineau18a48e72012-05-17 20:53:34 -07001910 while (chan->tx_send_head &&
1911 chan->unacked_frames < chan->remote_tx_win &&
1912 chan->tx_state == L2CAP_TX_STATE_XMIT) {
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001913
Mat Martineau18a48e72012-05-17 20:53:34 -07001914 skb = chan->tx_send_head;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001915
Mat Martineau18a48e72012-05-17 20:53:34 -07001916 bt_cb(skb)->control.retries = 1;
1917 control = &bt_cb(skb)->control;
Gustavo F. Padovan95ffa972010-06-18 20:37:33 -03001918
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001919 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
Mat Martineau18a48e72012-05-17 20:53:34 -07001920 control->final = 1;
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001921
Mat Martineau18a48e72012-05-17 20:53:34 -07001922 control->reqseq = chan->buffer_seq;
1923 chan->last_acked_seq = chan->buffer_seq;
1924 control->txseq = chan->next_tx_seq;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001925
Mat Martineau18a48e72012-05-17 20:53:34 -07001926 __pack_control(chan, control, skb);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001927
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001928 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau18a48e72012-05-17 20:53:34 -07001929 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1930 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001931 }
1932
Mat Martineau18a48e72012-05-17 20:53:34 -07001933 /* Clone after data has been modified. Data is assumed to be
1934 read-only (for locking purposes) on cloned sk_buffs.
1935 */
1936 tx_skb = skb_clone(skb, GFP_KERNEL);
1937
1938 if (!tx_skb)
1939 break;
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -03001940
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03001941 __set_retrans_timer(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001942
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001943 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau18a48e72012-05-17 20:53:34 -07001944 chan->unacked_frames++;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03001945 chan->frames_sent++;
Mat Martineau18a48e72012-05-17 20:53:34 -07001946 sent++;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001947
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001948 if (skb_queue_is_last(&chan->tx_q, skb))
1949 chan->tx_send_head = NULL;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001950 else
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001951 chan->tx_send_head = skb_queue_next(&chan->tx_q, skb);
Mat Martineau18a48e72012-05-17 20:53:34 -07001952
1953 l2cap_do_send(chan, tx_skb);
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001954 BT_DBG("Sent txseq %u", control->txseq);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001955 }
1956
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001957 BT_DBG("Sent %d, %u unacked, %u in ERTM queue", sent,
1958 chan->unacked_frames, skb_queue_len(&chan->tx_q));
Mat Martineau18a48e72012-05-17 20:53:34 -07001959
1960 return sent;
Gustavo F. Padovan9e917af2010-05-01 16:15:37 -03001961}
1962
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001963static void l2cap_ertm_resend(struct l2cap_chan *chan)
1964{
1965 struct l2cap_ctrl control;
1966 struct sk_buff *skb;
1967 struct sk_buff *tx_skb;
1968 u16 seq;
1969
1970 BT_DBG("chan %p", chan);
1971
1972 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1973 return;
1974
Mat Martineaub99e13a2012-10-23 15:24:19 -07001975 if (__chan_is_moving(chan))
1976 return;
1977
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001978 while (chan->retrans_list.head != L2CAP_SEQ_LIST_CLEAR) {
1979 seq = l2cap_seq_list_pop(&chan->retrans_list);
1980
1981 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, seq);
1982 if (!skb) {
1983 BT_DBG("Error: Can't retransmit seq %d, frame missing",
Gustavo Padovan2d792812012-10-06 10:07:01 +01001984 seq);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001985 continue;
1986 }
1987
1988 bt_cb(skb)->control.retries++;
1989 control = bt_cb(skb)->control;
1990
1991 if (chan->max_tx != 0 &&
1992 bt_cb(skb)->control.retries > chan->max_tx) {
1993 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001994 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001995 l2cap_seq_list_clear(&chan->retrans_list);
1996 break;
1997 }
1998
1999 control.reqseq = chan->buffer_seq;
2000 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
2001 control.final = 1;
2002 else
2003 control.final = 0;
2004
2005 if (skb_cloned(skb)) {
2006 /* Cloned sk_buffs are read-only, so we need a
2007 * writeable copy
2008 */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002009 tx_skb = skb_copy(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002010 } else {
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002011 tx_skb = skb_clone(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002012 }
2013
2014 if (!tx_skb) {
2015 l2cap_seq_list_clear(&chan->retrans_list);
2016 break;
2017 }
2018
2019 /* Update skb contents */
2020 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
2021 put_unaligned_le32(__pack_extended_control(&control),
2022 tx_skb->data + L2CAP_HDR_SIZE);
2023 } else {
2024 put_unaligned_le16(__pack_enhanced_control(&control),
2025 tx_skb->data + L2CAP_HDR_SIZE);
2026 }
2027
2028 if (chan->fcs == L2CAP_FCS_CRC16) {
2029 u16 fcs = crc16(0, (u8 *) tx_skb->data, tx_skb->len);
2030 put_unaligned_le16(fcs, skb_put(tx_skb,
2031 L2CAP_FCS_SIZE));
2032 }
2033
2034 l2cap_do_send(chan, tx_skb);
2035
2036 BT_DBG("Resent txseq %d", control.txseq);
2037
2038 chan->last_acked_seq = chan->buffer_seq;
2039 }
2040}
2041
Mat Martineauf80842a2012-05-17 20:53:46 -07002042static void l2cap_retransmit(struct l2cap_chan *chan,
2043 struct l2cap_ctrl *control)
2044{
2045 BT_DBG("chan %p, control %p", chan, control);
2046
2047 l2cap_seq_list_append(&chan->retrans_list, control->reqseq);
2048 l2cap_ertm_resend(chan);
2049}
2050
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002051static void l2cap_retransmit_all(struct l2cap_chan *chan,
2052 struct l2cap_ctrl *control)
2053{
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002054 struct sk_buff *skb;
2055
2056 BT_DBG("chan %p, control %p", chan, control);
2057
2058 if (control->poll)
2059 set_bit(CONN_SEND_FBIT, &chan->conn_state);
2060
2061 l2cap_seq_list_clear(&chan->retrans_list);
2062
2063 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
2064 return;
2065
2066 if (chan->unacked_frames) {
2067 skb_queue_walk(&chan->tx_q, skb) {
2068 if (bt_cb(skb)->control.txseq == control->reqseq ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01002069 skb == chan->tx_send_head)
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002070 break;
2071 }
2072
2073 skb_queue_walk_from(&chan->tx_q, skb) {
2074 if (skb == chan->tx_send_head)
2075 break;
2076
2077 l2cap_seq_list_append(&chan->retrans_list,
2078 bt_cb(skb)->control.txseq);
2079 }
2080
2081 l2cap_ertm_resend(chan);
2082 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002083}
2084
Szymon Jancb17e73b2012-01-11 10:59:47 +01002085static void l2cap_send_ack(struct l2cap_chan *chan)
2086{
Mat Martineau0a0aba42012-05-17 20:53:39 -07002087 struct l2cap_ctrl control;
2088 u16 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
2089 chan->last_acked_seq);
2090 int threshold;
2091
2092 BT_DBG("chan %p last_acked_seq %d buffer_seq %d",
2093 chan, chan->last_acked_seq, chan->buffer_seq);
2094
2095 memset(&control, 0, sizeof(control));
2096 control.sframe = 1;
2097
2098 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
2099 chan->rx_state == L2CAP_RX_STATE_RECV) {
2100 __clear_ack_timer(chan);
2101 control.super = L2CAP_SUPER_RNR;
2102 control.reqseq = chan->buffer_seq;
2103 l2cap_send_sframe(chan, &control);
2104 } else {
2105 if (!test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) {
2106 l2cap_ertm_send(chan);
2107 /* If any i-frames were sent, they included an ack */
2108 if (chan->buffer_seq == chan->last_acked_seq)
2109 frames_to_ack = 0;
2110 }
2111
Mat Martineauc20f8e32012-07-10 05:47:07 -07002112 /* Ack now if the window is 3/4ths full.
Mat Martineau0a0aba42012-05-17 20:53:39 -07002113 * Calculate without mul or div
2114 */
Mat Martineauc20f8e32012-07-10 05:47:07 -07002115 threshold = chan->ack_win;
Mat Martineau0a0aba42012-05-17 20:53:39 -07002116 threshold += threshold << 1;
2117 threshold >>= 2;
2118
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002119 BT_DBG("frames_to_ack %u, threshold %d", frames_to_ack,
Mat Martineau0a0aba42012-05-17 20:53:39 -07002120 threshold);
2121
2122 if (frames_to_ack >= threshold) {
2123 __clear_ack_timer(chan);
2124 control.super = L2CAP_SUPER_RR;
2125 control.reqseq = chan->buffer_seq;
2126 l2cap_send_sframe(chan, &control);
2127 frames_to_ack = 0;
2128 }
2129
2130 if (frames_to_ack)
2131 __set_ack_timer(chan);
2132 }
Szymon Jancb17e73b2012-01-11 10:59:47 +01002133}
2134
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002135static inline int l2cap_skbuff_fromiovec(struct l2cap_chan *chan,
2136 struct msghdr *msg, int len,
2137 int count, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002138{
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002139 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002140 struct sk_buff **frag;
Gustavo Padovan90338942012-04-06 20:15:47 -03002141 int sent = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002142
Jukka Rissanen04988782014-06-18 16:37:07 +03002143 if (chan->ops->memcpy_fromiovec(chan, skb_put(skb, count),
2144 msg->msg_iov, count))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002145 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002146
2147 sent += count;
2148 len -= count;
2149
2150 /* Continuation fragments (no L2CAP header) */
2151 frag = &skb_shinfo(skb)->frag_list;
2152 while (len) {
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002153 struct sk_buff *tmp;
2154
Linus Torvalds1da177e2005-04-16 15:20:36 -07002155 count = min_t(unsigned int, conn->mtu, len);
2156
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002157 tmp = chan->ops->alloc_skb(chan, 0, count,
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002158 msg->msg_flags & MSG_DONTWAIT);
2159 if (IS_ERR(tmp))
2160 return PTR_ERR(tmp);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002161
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002162 *frag = tmp;
2163
Jukka Rissanen04988782014-06-18 16:37:07 +03002164 if (chan->ops->memcpy_fromiovec(chan, skb_put(*frag, count),
2165 msg->msg_iov, count))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002166 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002167
2168 sent += count;
2169 len -= count;
2170
Gustavo Padovan2d0ed3d2012-05-11 13:16:12 -03002171 skb->len += (*frag)->len;
2172 skb->data_len += (*frag)->len;
2173
Linus Torvalds1da177e2005-04-16 15:20:36 -07002174 frag = &(*frag)->next;
2175 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002176
2177 return sent;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002178}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002179
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002180static struct sk_buff *l2cap_create_connless_pdu(struct l2cap_chan *chan,
Marcel Holtmann8d463212014-06-05 15:22:51 +02002181 struct msghdr *msg, size_t len)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002182{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002183 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002184 struct sk_buff *skb;
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002185 int err, count, hlen = L2CAP_HDR_SIZE + L2CAP_PSMLEN_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002186 struct l2cap_hdr *lh;
2187
Marcel Holtmann8d463212014-06-05 15:22:51 +02002188 BT_DBG("chan %p psm 0x%2.2x len %zu", chan,
2189 __le16_to_cpu(chan->psm), len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002190
2191 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002192
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002193 skb = chan->ops->alloc_skb(chan, hlen, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002194 msg->msg_flags & MSG_DONTWAIT);
2195 if (IS_ERR(skb))
2196 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002197
2198 /* Create L2CAP header */
2199 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002200 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenkodaf6a78c2012-05-03 10:55:52 +03002201 lh->len = cpu_to_le16(len + L2CAP_PSMLEN_SIZE);
Marcel Holtmann43b1b8d2013-10-12 06:01:26 -07002202 put_unaligned(chan->psm, (__le16 *) skb_put(skb, L2CAP_PSMLEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002203
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002204 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002205 if (unlikely(err < 0)) {
2206 kfree_skb(skb);
2207 return ERR_PTR(err);
2208 }
2209 return skb;
2210}
2211
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002212static struct sk_buff *l2cap_create_basic_pdu(struct l2cap_chan *chan,
Marcel Holtmann8d463212014-06-05 15:22:51 +02002213 struct msghdr *msg, size_t len)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002214{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002215 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002216 struct sk_buff *skb;
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002217 int err, count;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002218 struct l2cap_hdr *lh;
2219
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002220 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002221
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002222 count = min_t(unsigned int, (conn->mtu - L2CAP_HDR_SIZE), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002223
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002224 skb = chan->ops->alloc_skb(chan, L2CAP_HDR_SIZE, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002225 msg->msg_flags & MSG_DONTWAIT);
2226 if (IS_ERR(skb))
2227 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002228
2229 /* Create L2CAP header */
2230 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002231 lh->cid = cpu_to_le16(chan->dcid);
Gustavo Padovan6ff9b5e2012-05-02 11:56:17 -03002232 lh->len = cpu_to_le16(len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002233
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002234 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002235 if (unlikely(err < 0)) {
2236 kfree_skb(skb);
2237 return ERR_PTR(err);
2238 }
2239 return skb;
2240}
2241
Luiz Augusto von Dentzab0ff762011-09-12 20:00:50 +03002242static struct sk_buff *l2cap_create_iframe_pdu(struct l2cap_chan *chan,
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002243 struct msghdr *msg, size_t len,
2244 u16 sdulen)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002245{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002246 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002247 struct sk_buff *skb;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002248 int err, count, hlen;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002249 struct l2cap_hdr *lh;
2250
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002251 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002252
Gustavo F. Padovan0ee0d202010-05-01 16:15:41 -03002253 if (!conn)
2254 return ERR_PTR(-ENOTCONN);
2255
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002256 hlen = __ertm_hdr_size(chan);
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002257
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002258 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002259 hlen += L2CAP_SDULEN_SIZE;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002260
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03002261 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002262 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03002263
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002264 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002265
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002266 skb = chan->ops->alloc_skb(chan, hlen, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002267 msg->msg_flags & MSG_DONTWAIT);
2268 if (IS_ERR(skb))
2269 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002270
2271 /* Create L2CAP header */
2272 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002273 lh->cid = cpu_to_le16(chan->dcid);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002274 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002275
Mat Martineau18a48e72012-05-17 20:53:34 -07002276 /* Control header is populated later */
2277 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
2278 put_unaligned_le32(0, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
2279 else
2280 put_unaligned_le16(0, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002281
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002282 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002283 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002284
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002285 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002286 if (unlikely(err < 0)) {
2287 kfree_skb(skb);
2288 return ERR_PTR(err);
2289 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03002290
Mat Martineau18a48e72012-05-17 20:53:34 -07002291 bt_cb(skb)->control.fcs = chan->fcs;
Mat Martineau3ce35142012-04-25 16:36:14 -07002292 bt_cb(skb)->control.retries = 0;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002293 return skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002294}
2295
Mat Martineau94122bb2012-05-02 09:42:02 -07002296static int l2cap_segment_sdu(struct l2cap_chan *chan,
2297 struct sk_buff_head *seg_queue,
2298 struct msghdr *msg, size_t len)
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002299{
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002300 struct sk_buff *skb;
Mat Martineau94122bb2012-05-02 09:42:02 -07002301 u16 sdu_len;
2302 size_t pdu_len;
Mat Martineau94122bb2012-05-02 09:42:02 -07002303 u8 sar;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002304
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002305 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002306
Mat Martineau94122bb2012-05-02 09:42:02 -07002307 /* It is critical that ERTM PDUs fit in a single HCI fragment,
2308 * so fragmented skbs are not used. The HCI layer's handling
2309 * of fragmented skbs is not compatible with ERTM's queueing.
2310 */
2311
2312 /* PDU size is derived from the HCI MTU */
2313 pdu_len = chan->conn->mtu;
2314
Mat Martineaua5495742012-10-23 15:24:21 -07002315 /* Constrain PDU size for BR/EDR connections */
2316 if (!chan->hs_hcon)
2317 pdu_len = min_t(size_t, pdu_len, L2CAP_BREDR_MAX_PAYLOAD);
Mat Martineau94122bb2012-05-02 09:42:02 -07002318
2319 /* Adjust for largest possible L2CAP overhead. */
Gustavo Padovan35d401d2012-05-25 18:57:05 -03002320 if (chan->fcs)
2321 pdu_len -= L2CAP_FCS_SIZE;
2322
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002323 pdu_len -= __ertm_hdr_size(chan);
Mat Martineau94122bb2012-05-02 09:42:02 -07002324
2325 /* Remote device may have requested smaller PDUs */
2326 pdu_len = min_t(size_t, pdu_len, chan->remote_mps);
2327
2328 if (len <= pdu_len) {
2329 sar = L2CAP_SAR_UNSEGMENTED;
2330 sdu_len = 0;
2331 pdu_len = len;
2332 } else {
2333 sar = L2CAP_SAR_START;
2334 sdu_len = len;
2335 pdu_len -= L2CAP_SDULEN_SIZE;
2336 }
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002337
2338 while (len > 0) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002339 skb = l2cap_create_iframe_pdu(chan, msg, pdu_len, sdu_len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002340
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002341 if (IS_ERR(skb)) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002342 __skb_queue_purge(seg_queue);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002343 return PTR_ERR(skb);
2344 }
2345
Mat Martineau94122bb2012-05-02 09:42:02 -07002346 bt_cb(skb)->control.sar = sar;
2347 __skb_queue_tail(seg_queue, skb);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002348
Mat Martineau94122bb2012-05-02 09:42:02 -07002349 len -= pdu_len;
2350 if (sdu_len) {
2351 sdu_len = 0;
2352 pdu_len += L2CAP_SDULEN_SIZE;
2353 }
2354
2355 if (len <= pdu_len) {
2356 sar = L2CAP_SAR_END;
2357 pdu_len = len;
2358 } else {
2359 sar = L2CAP_SAR_CONTINUE;
2360 }
2361 }
2362
Gustavo Padovanf0f62792012-05-29 13:29:17 -03002363 return 0;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002364}
2365
Johan Hedberg177f8f22013-05-31 17:54:51 +03002366static struct sk_buff *l2cap_create_le_flowctl_pdu(struct l2cap_chan *chan,
2367 struct msghdr *msg,
2368 size_t len, u16 sdulen)
2369{
2370 struct l2cap_conn *conn = chan->conn;
2371 struct sk_buff *skb;
2372 int err, count, hlen;
2373 struct l2cap_hdr *lh;
2374
2375 BT_DBG("chan %p len %zu", chan, len);
2376
2377 if (!conn)
2378 return ERR_PTR(-ENOTCONN);
2379
2380 hlen = L2CAP_HDR_SIZE;
2381
2382 if (sdulen)
2383 hlen += L2CAP_SDULEN_SIZE;
2384
2385 count = min_t(unsigned int, (conn->mtu - hlen), len);
2386
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002387 skb = chan->ops->alloc_skb(chan, hlen, count,
Johan Hedberg177f8f22013-05-31 17:54:51 +03002388 msg->msg_flags & MSG_DONTWAIT);
2389 if (IS_ERR(skb))
2390 return skb;
2391
2392 /* Create L2CAP header */
2393 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
2394 lh->cid = cpu_to_le16(chan->dcid);
2395 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
2396
2397 if (sdulen)
2398 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
2399
2400 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
2401 if (unlikely(err < 0)) {
2402 kfree_skb(skb);
2403 return ERR_PTR(err);
2404 }
2405
2406 return skb;
2407}
2408
2409static int l2cap_segment_le_sdu(struct l2cap_chan *chan,
2410 struct sk_buff_head *seg_queue,
2411 struct msghdr *msg, size_t len)
2412{
2413 struct sk_buff *skb;
2414 size_t pdu_len;
2415 u16 sdu_len;
2416
2417 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
2418
2419 pdu_len = chan->conn->mtu - L2CAP_HDR_SIZE;
2420
2421 pdu_len = min_t(size_t, pdu_len, chan->remote_mps);
2422
2423 sdu_len = len;
2424 pdu_len -= L2CAP_SDULEN_SIZE;
2425
2426 while (len > 0) {
2427 if (len <= pdu_len)
2428 pdu_len = len;
2429
2430 skb = l2cap_create_le_flowctl_pdu(chan, msg, pdu_len, sdu_len);
2431 if (IS_ERR(skb)) {
2432 __skb_queue_purge(seg_queue);
2433 return PTR_ERR(skb);
2434 }
2435
2436 __skb_queue_tail(seg_queue, skb);
2437
2438 len -= pdu_len;
2439
2440 if (sdu_len) {
2441 sdu_len = 0;
2442 pdu_len += L2CAP_SDULEN_SIZE;
2443 }
2444 }
2445
2446 return 0;
2447}
2448
Marcel Holtmann8d463212014-06-05 15:22:51 +02002449int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002450{
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002451 struct sk_buff *skb;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002452 int err;
Mat Martineau94122bb2012-05-02 09:42:02 -07002453 struct sk_buff_head seg_queue;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002454
Seung-Woo Kim31e8ce82013-11-05 18:46:33 +09002455 if (!chan->conn)
2456 return -ENOTCONN;
2457
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002458 /* Connectionless channel */
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002459 if (chan->chan_type == L2CAP_CHAN_CONN_LESS) {
Marcel Holtmann8d463212014-06-05 15:22:51 +02002460 skb = l2cap_create_connless_pdu(chan, msg, len);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002461 if (IS_ERR(skb))
2462 return PTR_ERR(skb);
2463
Andrzej Kaczmarekede81a22014-02-25 17:16:22 +01002464 /* Channel lock is released before requesting new skb and then
2465 * reacquired thus we need to recheck channel state.
2466 */
2467 if (chan->state != BT_CONNECTED) {
2468 kfree_skb(skb);
2469 return -ENOTCONN;
2470 }
2471
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002472 l2cap_do_send(chan, skb);
2473 return len;
2474 }
2475
2476 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03002477 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedberg177f8f22013-05-31 17:54:51 +03002478 /* Check outgoing MTU */
2479 if (len > chan->omtu)
2480 return -EMSGSIZE;
2481
Johan Hedbergfad5fc82013-12-05 09:45:01 +02002482 if (!chan->tx_credits)
2483 return -EAGAIN;
2484
Johan Hedberg177f8f22013-05-31 17:54:51 +03002485 __skb_queue_head_init(&seg_queue);
2486
2487 err = l2cap_segment_le_sdu(chan, &seg_queue, msg, len);
2488
2489 if (chan->state != BT_CONNECTED) {
2490 __skb_queue_purge(&seg_queue);
2491 err = -ENOTCONN;
2492 }
2493
2494 if (err)
2495 return err;
2496
2497 skb_queue_splice_tail_init(&seg_queue, &chan->tx_q);
2498
2499 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
2500 l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
2501 chan->tx_credits--;
2502 }
2503
2504 if (!chan->tx_credits)
2505 chan->ops->suspend(chan);
2506
2507 err = len;
2508
2509 break;
2510
Johan Hedbergfad5fc82013-12-05 09:45:01 +02002511 case L2CAP_MODE_BASIC:
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002512 /* Check outgoing MTU */
2513 if (len > chan->omtu)
2514 return -EMSGSIZE;
2515
2516 /* Create a basic PDU */
Marcel Holtmann8d463212014-06-05 15:22:51 +02002517 skb = l2cap_create_basic_pdu(chan, msg, len);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002518 if (IS_ERR(skb))
2519 return PTR_ERR(skb);
2520
Andrzej Kaczmarekede81a22014-02-25 17:16:22 +01002521 /* Channel lock is released before requesting new skb and then
2522 * reacquired thus we need to recheck channel state.
2523 */
2524 if (chan->state != BT_CONNECTED) {
2525 kfree_skb(skb);
2526 return -ENOTCONN;
2527 }
2528
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002529 l2cap_do_send(chan, skb);
2530 err = len;
2531 break;
2532
2533 case L2CAP_MODE_ERTM:
2534 case L2CAP_MODE_STREAMING:
Mat Martineau94122bb2012-05-02 09:42:02 -07002535 /* Check outgoing MTU */
2536 if (len > chan->omtu) {
2537 err = -EMSGSIZE;
2538 break;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002539 }
2540
Mat Martineau94122bb2012-05-02 09:42:02 -07002541 __skb_queue_head_init(&seg_queue);
2542
2543 /* Do segmentation before calling in to the state machine,
2544 * since it's possible to block while waiting for memory
2545 * allocation.
2546 */
2547 err = l2cap_segment_sdu(chan, &seg_queue, msg, len);
2548
2549 /* The channel could have been closed while segmenting,
2550 * check that it is still connected.
2551 */
2552 if (chan->state != BT_CONNECTED) {
2553 __skb_queue_purge(&seg_queue);
2554 err = -ENOTCONN;
2555 }
2556
2557 if (err)
2558 break;
2559
Mat Martineau37339372012-05-17 20:53:33 -07002560 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo Padovand6603662012-05-21 13:58:22 -03002561 l2cap_tx(chan, NULL, &seg_queue, L2CAP_EV_DATA_REQUEST);
Mat Martineau37339372012-05-17 20:53:33 -07002562 else
Gustavo Padovand6603662012-05-21 13:58:22 -03002563 l2cap_streaming_send(chan, &seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002564
Gustavo Padovand6603662012-05-21 13:58:22 -03002565 err = len;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002566
Mat Martineau94122bb2012-05-02 09:42:02 -07002567 /* If the skbs were not queued for sending, they'll still be in
2568 * seg_queue and need to be purged.
2569 */
2570 __skb_queue_purge(&seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002571 break;
2572
2573 default:
2574 BT_DBG("bad state %1.1x", chan->mode);
2575 err = -EBADFD;
2576 }
2577
2578 return err;
2579}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +03002580EXPORT_SYMBOL_GPL(l2cap_chan_send);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002581
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002582static void l2cap_send_srej(struct l2cap_chan *chan, u16 txseq)
2583{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002584 struct l2cap_ctrl control;
2585 u16 seq;
2586
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002587 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002588
2589 memset(&control, 0, sizeof(control));
2590 control.sframe = 1;
2591 control.super = L2CAP_SUPER_SREJ;
2592
2593 for (seq = chan->expected_tx_seq; seq != txseq;
2594 seq = __next_seq(chan, seq)) {
2595 if (!l2cap_ertm_seq_in_queue(&chan->srej_q, seq)) {
2596 control.reqseq = seq;
2597 l2cap_send_sframe(chan, &control);
2598 l2cap_seq_list_append(&chan->srej_list, seq);
2599 }
2600 }
2601
2602 chan->expected_tx_seq = __next_seq(chan, txseq);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002603}
2604
2605static void l2cap_send_srej_tail(struct l2cap_chan *chan)
2606{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002607 struct l2cap_ctrl control;
2608
2609 BT_DBG("chan %p", chan);
2610
2611 if (chan->srej_list.tail == L2CAP_SEQ_LIST_CLEAR)
2612 return;
2613
2614 memset(&control, 0, sizeof(control));
2615 control.sframe = 1;
2616 control.super = L2CAP_SUPER_SREJ;
2617 control.reqseq = chan->srej_list.tail;
2618 l2cap_send_sframe(chan, &control);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002619}
2620
2621static void l2cap_send_srej_list(struct l2cap_chan *chan, u16 txseq)
2622{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002623 struct l2cap_ctrl control;
2624 u16 initial_head;
2625 u16 seq;
2626
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002627 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002628
2629 memset(&control, 0, sizeof(control));
2630 control.sframe = 1;
2631 control.super = L2CAP_SUPER_SREJ;
2632
2633 /* Capture initial list head to allow only one pass through the list. */
2634 initial_head = chan->srej_list.head;
2635
2636 do {
2637 seq = l2cap_seq_list_pop(&chan->srej_list);
2638 if (seq == txseq || seq == L2CAP_SEQ_LIST_CLEAR)
2639 break;
2640
2641 control.reqseq = seq;
2642 l2cap_send_sframe(chan, &control);
2643 l2cap_seq_list_append(&chan->srej_list, seq);
2644 } while (chan->srej_list.head != initial_head);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002645}
2646
Mat Martineau608bcc62012-05-17 20:53:32 -07002647static void l2cap_process_reqseq(struct l2cap_chan *chan, u16 reqseq)
2648{
2649 struct sk_buff *acked_skb;
2650 u16 ackseq;
2651
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002652 BT_DBG("chan %p, reqseq %u", chan, reqseq);
Mat Martineau608bcc62012-05-17 20:53:32 -07002653
2654 if (chan->unacked_frames == 0 || reqseq == chan->expected_ack_seq)
2655 return;
2656
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002657 BT_DBG("expected_ack_seq %u, unacked_frames %u",
Mat Martineau608bcc62012-05-17 20:53:32 -07002658 chan->expected_ack_seq, chan->unacked_frames);
2659
2660 for (ackseq = chan->expected_ack_seq; ackseq != reqseq;
2661 ackseq = __next_seq(chan, ackseq)) {
2662
2663 acked_skb = l2cap_ertm_seq_in_queue(&chan->tx_q, ackseq);
2664 if (acked_skb) {
2665 skb_unlink(acked_skb, &chan->tx_q);
2666 kfree_skb(acked_skb);
2667 chan->unacked_frames--;
2668 }
2669 }
2670
2671 chan->expected_ack_seq = reqseq;
2672
2673 if (chan->unacked_frames == 0)
2674 __clear_retrans_timer(chan);
2675
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002676 BT_DBG("unacked_frames %u", chan->unacked_frames);
Mat Martineau608bcc62012-05-17 20:53:32 -07002677}
2678
2679static void l2cap_abort_rx_srej_sent(struct l2cap_chan *chan)
2680{
2681 BT_DBG("chan %p", chan);
2682
2683 chan->expected_tx_seq = chan->buffer_seq;
2684 l2cap_seq_list_clear(&chan->srej_list);
2685 skb_queue_purge(&chan->srej_q);
2686 chan->rx_state = L2CAP_RX_STATE_RECV;
2687}
2688
Gustavo Padovand6603662012-05-21 13:58:22 -03002689static void l2cap_tx_state_xmit(struct l2cap_chan *chan,
2690 struct l2cap_ctrl *control,
2691 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002692{
Mat Martineau608bcc62012-05-17 20:53:32 -07002693 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2694 event);
2695
2696 switch (event) {
2697 case L2CAP_EV_DATA_REQUEST:
2698 if (chan->tx_send_head == NULL)
2699 chan->tx_send_head = skb_peek(skbs);
2700
2701 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2702 l2cap_ertm_send(chan);
2703 break;
2704 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2705 BT_DBG("Enter LOCAL_BUSY");
2706 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2707
2708 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2709 /* The SREJ_SENT state must be aborted if we are to
2710 * enter the LOCAL_BUSY state.
2711 */
2712 l2cap_abort_rx_srej_sent(chan);
2713 }
2714
2715 l2cap_send_ack(chan);
2716
2717 break;
2718 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2719 BT_DBG("Exit LOCAL_BUSY");
2720 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2721
2722 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2723 struct l2cap_ctrl local_control;
2724
2725 memset(&local_control, 0, sizeof(local_control));
2726 local_control.sframe = 1;
2727 local_control.super = L2CAP_SUPER_RR;
2728 local_control.poll = 1;
2729 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002730 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002731
2732 chan->retry_count = 1;
2733 __set_monitor_timer(chan);
2734 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2735 }
2736 break;
2737 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2738 l2cap_process_reqseq(chan, control->reqseq);
2739 break;
2740 case L2CAP_EV_EXPLICIT_POLL:
2741 l2cap_send_rr_or_rnr(chan, 1);
2742 chan->retry_count = 1;
2743 __set_monitor_timer(chan);
2744 __clear_ack_timer(chan);
2745 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2746 break;
2747 case L2CAP_EV_RETRANS_TO:
2748 l2cap_send_rr_or_rnr(chan, 1);
2749 chan->retry_count = 1;
2750 __set_monitor_timer(chan);
2751 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2752 break;
2753 case L2CAP_EV_RECV_FBIT:
2754 /* Nothing to process */
2755 break;
2756 default:
2757 break;
2758 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002759}
2760
Gustavo Padovand6603662012-05-21 13:58:22 -03002761static void l2cap_tx_state_wait_f(struct l2cap_chan *chan,
2762 struct l2cap_ctrl *control,
2763 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002764{
Mat Martineau608bcc62012-05-17 20:53:32 -07002765 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2766 event);
2767
2768 switch (event) {
2769 case L2CAP_EV_DATA_REQUEST:
2770 if (chan->tx_send_head == NULL)
2771 chan->tx_send_head = skb_peek(skbs);
2772 /* Queue data, but don't send. */
2773 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2774 break;
2775 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2776 BT_DBG("Enter LOCAL_BUSY");
2777 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2778
2779 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2780 /* The SREJ_SENT state must be aborted if we are to
2781 * enter the LOCAL_BUSY state.
2782 */
2783 l2cap_abort_rx_srej_sent(chan);
2784 }
2785
2786 l2cap_send_ack(chan);
2787
2788 break;
2789 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2790 BT_DBG("Exit LOCAL_BUSY");
2791 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2792
2793 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2794 struct l2cap_ctrl local_control;
2795 memset(&local_control, 0, sizeof(local_control));
2796 local_control.sframe = 1;
2797 local_control.super = L2CAP_SUPER_RR;
2798 local_control.poll = 1;
2799 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002800 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002801
2802 chan->retry_count = 1;
2803 __set_monitor_timer(chan);
2804 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2805 }
2806 break;
2807 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2808 l2cap_process_reqseq(chan, control->reqseq);
2809
2810 /* Fall through */
2811
2812 case L2CAP_EV_RECV_FBIT:
2813 if (control && control->final) {
2814 __clear_monitor_timer(chan);
2815 if (chan->unacked_frames > 0)
2816 __set_retrans_timer(chan);
2817 chan->retry_count = 0;
2818 chan->tx_state = L2CAP_TX_STATE_XMIT;
2819 BT_DBG("recv fbit tx_state 0x2.2%x", chan->tx_state);
2820 }
2821 break;
2822 case L2CAP_EV_EXPLICIT_POLL:
2823 /* Ignore */
2824 break;
2825 case L2CAP_EV_MONITOR_TO:
2826 if (chan->max_tx == 0 || chan->retry_count < chan->max_tx) {
2827 l2cap_send_rr_or_rnr(chan, 1);
2828 __set_monitor_timer(chan);
2829 chan->retry_count++;
2830 } else {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02002831 l2cap_send_disconn_req(chan, ECONNABORTED);
Mat Martineau608bcc62012-05-17 20:53:32 -07002832 }
2833 break;
2834 default:
2835 break;
2836 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002837}
2838
Gustavo Padovand6603662012-05-21 13:58:22 -03002839static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
2840 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002841{
Mat Martineau608bcc62012-05-17 20:53:32 -07002842 BT_DBG("chan %p, control %p, skbs %p, event %d, state %d",
2843 chan, control, skbs, event, chan->tx_state);
2844
2845 switch (chan->tx_state) {
2846 case L2CAP_TX_STATE_XMIT:
Gustavo Padovand6603662012-05-21 13:58:22 -03002847 l2cap_tx_state_xmit(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002848 break;
2849 case L2CAP_TX_STATE_WAIT_F:
Gustavo Padovand6603662012-05-21 13:58:22 -03002850 l2cap_tx_state_wait_f(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002851 break;
2852 default:
2853 /* Ignore event */
2854 break;
2855 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002856}
2857
Mat Martineau4b51dae92012-05-17 20:53:37 -07002858static void l2cap_pass_to_tx(struct l2cap_chan *chan,
2859 struct l2cap_ctrl *control)
2860{
2861 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002862 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_REQSEQ_AND_FBIT);
Mat Martineau4b51dae92012-05-17 20:53:37 -07002863}
2864
Mat Martineauf80842a2012-05-17 20:53:46 -07002865static void l2cap_pass_to_tx_fbit(struct l2cap_chan *chan,
2866 struct l2cap_ctrl *control)
2867{
2868 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002869 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_FBIT);
Mat Martineauf80842a2012-05-17 20:53:46 -07002870}
2871
Linus Torvalds1da177e2005-04-16 15:20:36 -07002872/* Copy frame to all raw sockets on that connection */
2873static void l2cap_raw_recv(struct l2cap_conn *conn, struct sk_buff *skb)
2874{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002875 struct sk_buff *nskb;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03002876 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002877
2878 BT_DBG("conn %p", conn);
2879
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002880 mutex_lock(&conn->chan_lock);
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002881
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002882 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002883 if (chan->chan_type != L2CAP_CHAN_RAW)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002884 continue;
2885
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002886 /* Don't send frame to the channel it came from */
2887 if (bt_cb(skb)->chan == chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002888 continue;
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002889
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002890 nskb = skb_clone(skb, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03002891 if (!nskb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002892 continue;
Gustavo Padovan80b98022012-05-27 22:27:51 -03002893 if (chan->ops->recv(chan, nskb))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002894 kfree_skb(nskb);
2895 }
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002896
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002897 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002898}
2899
2900/* ---- L2CAP signalling commands ---- */
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002901static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn, u8 code,
2902 u8 ident, u16 dlen, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002903{
2904 struct sk_buff *skb, **frag;
2905 struct l2cap_cmd_hdr *cmd;
2906 struct l2cap_hdr *lh;
2907 int len, count;
2908
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002909 BT_DBG("conn %p, code 0x%2.2x, ident 0x%2.2x, len %u",
2910 conn, code, ident, dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002911
Anderson Lizardo300b9622013-06-02 16:30:40 -04002912 if (conn->mtu < L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE)
2913 return NULL;
2914
Linus Torvalds1da177e2005-04-16 15:20:36 -07002915 len = L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE + dlen;
2916 count = min_t(unsigned int, conn->mtu, len);
2917
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002918 skb = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002919 if (!skb)
2920 return NULL;
2921
2922 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002923 lh->len = cpu_to_le16(L2CAP_CMD_HDR_SIZE + dlen);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002924
2925 if (conn->hcon->type == LE_LINK)
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002926 lh->cid = cpu_to_le16(L2CAP_CID_LE_SIGNALING);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002927 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002928 lh->cid = cpu_to_le16(L2CAP_CID_SIGNALING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002929
2930 cmd = (struct l2cap_cmd_hdr *) skb_put(skb, L2CAP_CMD_HDR_SIZE);
2931 cmd->code = code;
2932 cmd->ident = ident;
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002933 cmd->len = cpu_to_le16(dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002934
2935 if (dlen) {
2936 count -= L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE;
2937 memcpy(skb_put(skb, count), data, count);
2938 data += count;
2939 }
2940
2941 len -= skb->len;
2942
2943 /* Continuation fragments (no L2CAP header) */
2944 frag = &skb_shinfo(skb)->frag_list;
2945 while (len) {
2946 count = min_t(unsigned int, conn->mtu, len);
2947
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002948 *frag = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002949 if (!*frag)
2950 goto fail;
2951
2952 memcpy(skb_put(*frag, count), data, count);
2953
2954 len -= count;
2955 data += count;
2956
2957 frag = &(*frag)->next;
2958 }
2959
2960 return skb;
2961
2962fail:
2963 kfree_skb(skb);
2964 return NULL;
2965}
2966
Gustavo Padovan2d792812012-10-06 10:07:01 +01002967static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen,
2968 unsigned long *val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002969{
2970 struct l2cap_conf_opt *opt = *ptr;
2971 int len;
2972
2973 len = L2CAP_CONF_OPT_SIZE + opt->len;
2974 *ptr += len;
2975
2976 *type = opt->type;
2977 *olen = opt->len;
2978
2979 switch (opt->len) {
2980 case 1:
2981 *val = *((u8 *) opt->val);
2982 break;
2983
2984 case 2:
steven miaobfaaeb32010-10-16 18:29:47 -04002985 *val = get_unaligned_le16(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002986 break;
2987
2988 case 4:
steven miaobfaaeb32010-10-16 18:29:47 -04002989 *val = get_unaligned_le32(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002990 break;
2991
2992 default:
2993 *val = (unsigned long) opt->val;
2994 break;
2995 }
2996
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002997 BT_DBG("type 0x%2.2x len %u val 0x%lx", *type, opt->len, *val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002998 return len;
2999}
3000
Linus Torvalds1da177e2005-04-16 15:20:36 -07003001static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val)
3002{
3003 struct l2cap_conf_opt *opt = *ptr;
3004
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03003005 BT_DBG("type 0x%2.2x len %u val 0x%lx", type, len, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003006
3007 opt->type = type;
3008 opt->len = len;
3009
3010 switch (len) {
3011 case 1:
3012 *((u8 *) opt->val) = val;
3013 break;
3014
3015 case 2:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02003016 put_unaligned_le16(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003017 break;
3018
3019 case 4:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02003020 put_unaligned_le32(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003021 break;
3022
3023 default:
3024 memcpy(opt->val, (void *) val, len);
3025 break;
3026 }
3027
3028 *ptr += L2CAP_CONF_OPT_SIZE + len;
3029}
3030
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003031static void l2cap_add_opt_efs(void **ptr, struct l2cap_chan *chan)
3032{
3033 struct l2cap_conf_efs efs;
3034
Szymon Janc1ec918c2011-11-16 09:32:21 +01003035 switch (chan->mode) {
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003036 case L2CAP_MODE_ERTM:
3037 efs.id = chan->local_id;
3038 efs.stype = chan->local_stype;
3039 efs.msdu = cpu_to_le16(chan->local_msdu);
3040 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003041 efs.acc_lat = cpu_to_le32(L2CAP_DEFAULT_ACC_LAT);
3042 efs.flush_to = cpu_to_le32(L2CAP_EFS_DEFAULT_FLUSH_TO);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003043 break;
3044
3045 case L2CAP_MODE_STREAMING:
3046 efs.id = 1;
3047 efs.stype = L2CAP_SERV_BESTEFFORT;
3048 efs.msdu = cpu_to_le16(chan->local_msdu);
3049 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
3050 efs.acc_lat = 0;
3051 efs.flush_to = 0;
3052 break;
3053
3054 default:
3055 return;
3056 }
3057
3058 l2cap_add_conf_opt(ptr, L2CAP_CONF_EFS, sizeof(efs),
Andrei Emeltchenko8936fa62012-10-08 11:14:41 +03003059 (unsigned long) &efs);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003060}
3061
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003062static void l2cap_ack_timeout(struct work_struct *work)
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003063{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003064 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau03625202012-05-17 20:53:51 -07003065 ack_timer.work);
3066 u16 frames_to_ack;
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003067
Gustavo F. Padovan2fb9b3d2011-12-22 16:56:05 -02003068 BT_DBG("chan %p", chan);
3069
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003070 l2cap_chan_lock(chan);
3071
Mat Martineau03625202012-05-17 20:53:51 -07003072 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
3073 chan->last_acked_seq);
3074
3075 if (frames_to_ack)
3076 l2cap_send_rr_or_rnr(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003077
3078 l2cap_chan_unlock(chan);
Szymon Janc09bfb2e2012-01-11 10:59:49 +01003079 l2cap_chan_put(chan);
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003080}
3081
Andrei Emeltchenko466f8002012-05-29 13:59:01 +03003082int l2cap_ertm_init(struct l2cap_chan *chan)
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003083{
Mat Martineau3c588192012-04-11 10:48:42 -07003084 int err;
3085
Mat Martineau105bdf92012-04-27 16:50:48 -07003086 chan->next_tx_seq = 0;
3087 chan->expected_tx_seq = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003088 chan->expected_ack_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003089 chan->unacked_frames = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003090 chan->buffer_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003091 chan->frames_sent = 0;
Mat Martineau105bdf92012-04-27 16:50:48 -07003092 chan->last_acked_seq = 0;
3093 chan->sdu = NULL;
3094 chan->sdu_last_frag = NULL;
3095 chan->sdu_len = 0;
3096
Mat Martineaud34c34f2012-05-14 14:49:27 -07003097 skb_queue_head_init(&chan->tx_q);
3098
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003099 chan->local_amp_id = AMP_ID_BREDR;
3100 chan->move_id = AMP_ID_BREDR;
Mat Martineau08333282012-10-23 15:24:06 -07003101 chan->move_state = L2CAP_MOVE_STABLE;
3102 chan->move_role = L2CAP_MOVE_ROLE_NONE;
3103
Mat Martineau105bdf92012-04-27 16:50:48 -07003104 if (chan->mode != L2CAP_MODE_ERTM)
3105 return 0;
3106
3107 chan->rx_state = L2CAP_RX_STATE_RECV;
3108 chan->tx_state = L2CAP_TX_STATE_XMIT;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003109
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003110 INIT_DELAYED_WORK(&chan->retrans_timer, l2cap_retrans_timeout);
3111 INIT_DELAYED_WORK(&chan->monitor_timer, l2cap_monitor_timeout);
3112 INIT_DELAYED_WORK(&chan->ack_timer, l2cap_ack_timeout);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003113
Gustavo F. Padovanf1c67752011-03-25 20:36:10 -03003114 skb_queue_head_init(&chan->srej_q);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03003115
Mat Martineau3c588192012-04-11 10:48:42 -07003116 err = l2cap_seq_list_init(&chan->srej_list, chan->tx_win);
3117 if (err < 0)
3118 return err;
3119
Mat Martineau9dc9aff2012-05-17 16:20:14 -07003120 err = l2cap_seq_list_init(&chan->retrans_list, chan->remote_tx_win);
3121 if (err < 0)
3122 l2cap_seq_list_free(&chan->srej_list);
3123
3124 return err;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003125}
3126
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003127static inline __u8 l2cap_select_mode(__u8 mode, __u16 remote_feat_mask)
3128{
3129 switch (mode) {
3130 case L2CAP_MODE_STREAMING:
3131 case L2CAP_MODE_ERTM:
3132 if (l2cap_mode_supported(mode, remote_feat_mask))
3133 return mode;
3134 /* fall through */
3135 default:
3136 return L2CAP_MODE_BASIC;
3137 }
3138}
3139
Marcel Holtmann848566b2013-10-01 22:59:22 -07003140static inline bool __l2cap_ews_supported(struct l2cap_conn *conn)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003141{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003142 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003143}
3144
Marcel Holtmann848566b2013-10-01 22:59:22 -07003145static inline bool __l2cap_efs_supported(struct l2cap_conn *conn)
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003146{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003147 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_FLOW;
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003148}
3149
Mat Martineau36c86c82012-10-23 15:24:20 -07003150static void __l2cap_set_ertm_timeouts(struct l2cap_chan *chan,
3151 struct l2cap_conf_rfc *rfc)
3152{
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003153 if (chan->local_amp_id != AMP_ID_BREDR && chan->hs_hcon) {
Mat Martineau36c86c82012-10-23 15:24:20 -07003154 u64 ertm_to = chan->hs_hcon->hdev->amp_be_flush_to;
3155
3156 /* Class 1 devices have must have ERTM timeouts
3157 * exceeding the Link Supervision Timeout. The
3158 * default Link Supervision Timeout for AMP
3159 * controllers is 10 seconds.
3160 *
3161 * Class 1 devices use 0xffffffff for their
3162 * best-effort flush timeout, so the clamping logic
3163 * will result in a timeout that meets the above
3164 * requirement. ERTM timeouts are 16-bit values, so
3165 * the maximum timeout is 65.535 seconds.
3166 */
3167
3168 /* Convert timeout to milliseconds and round */
3169 ertm_to = DIV_ROUND_UP_ULL(ertm_to, 1000);
3170
3171 /* This is the recommended formula for class 2 devices
3172 * that start ERTM timers when packets are sent to the
3173 * controller.
3174 */
3175 ertm_to = 3 * ertm_to + 500;
3176
3177 if (ertm_to > 0xffff)
3178 ertm_to = 0xffff;
3179
3180 rfc->retrans_timeout = cpu_to_le16((u16) ertm_to);
3181 rfc->monitor_timeout = rfc->retrans_timeout;
3182 } else {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003183 rfc->retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO);
3184 rfc->monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO);
Mat Martineau36c86c82012-10-23 15:24:20 -07003185 }
3186}
3187
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003188static inline void l2cap_txwin_setup(struct l2cap_chan *chan)
3189{
3190 if (chan->tx_win > L2CAP_DEFAULT_TX_WINDOW &&
Marcel Holtmann848566b2013-10-01 22:59:22 -07003191 __l2cap_ews_supported(chan->conn)) {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003192 /* use extended control field */
3193 set_bit(FLAG_EXT_CTRL, &chan->flags);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003194 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
3195 } else {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003196 chan->tx_win = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003197 L2CAP_DEFAULT_TX_WINDOW);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003198 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
3199 }
Mat Martineauc20f8e32012-07-10 05:47:07 -07003200 chan->ack_win = chan->tx_win;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003201}
3202
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003203static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003204{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003205 struct l2cap_conf_req *req = data;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003206 struct l2cap_conf_rfc rfc = { .mode = chan->mode };
Linus Torvalds1da177e2005-04-16 15:20:36 -07003207 void *ptr = req->data;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003208 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003209
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03003210 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003211
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003212 if (chan->num_conf_req || chan->num_conf_rsp)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003213 goto done;
3214
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003215 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003216 case L2CAP_MODE_STREAMING:
3217 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003218 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state))
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003219 break;
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003220
Marcel Holtmann848566b2013-10-01 22:59:22 -07003221 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003222 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3223
Gustavo F. Padovan2ba13ed2010-06-09 16:39:05 -03003224 /* fall through */
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003225 default:
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003226 chan->mode = l2cap_select_mode(rfc.mode, chan->conn->feat_mask);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003227 break;
3228 }
3229
3230done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003231 if (chan->imtu != L2CAP_DEFAULT_MTU)
3232 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovan7990681c2011-01-24 16:01:43 -02003233
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003234 switch (chan->mode) {
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003235 case L2CAP_MODE_BASIC:
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003236 if (!(chan->conn->feat_mask & L2CAP_FEAT_ERTM) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003237 !(chan->conn->feat_mask & L2CAP_FEAT_STREAMING))
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003238 break;
3239
Gustavo F. Padovan62547752010-06-08 20:05:31 -03003240 rfc.mode = L2CAP_MODE_BASIC;
3241 rfc.txwin_size = 0;
3242 rfc.max_transmit = 0;
3243 rfc.retrans_timeout = 0;
3244 rfc.monitor_timeout = 0;
3245 rfc.max_pdu_size = 0;
3246
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003247 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003248 (unsigned long) &rfc);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003249 break;
3250
3251 case L2CAP_MODE_ERTM:
3252 rfc.mode = L2CAP_MODE_ERTM;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003253 rfc.max_transmit = chan->max_tx;
Mat Martineau36c86c82012-10-23 15:24:20 -07003254
3255 __l2cap_set_ertm_timeouts(chan, &rfc);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003256
3257 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003258 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3259 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003260 rfc.max_pdu_size = cpu_to_le16(size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003261
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003262 l2cap_txwin_setup(chan);
3263
3264 rfc.txwin_size = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003265 L2CAP_DEFAULT_TX_WINDOW);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003266
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003267 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003268 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003269
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003270 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3271 l2cap_add_opt_efs(&ptr, chan);
3272
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003273 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3274 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003275 chan->tx_win);
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003276
3277 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3278 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003279 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003280 chan->fcs = L2CAP_FCS_NONE;
3281 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3282 chan->fcs);
3283 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003284 break;
3285
3286 case L2CAP_MODE_STREAMING:
Mat Martineau273759e2012-05-17 20:53:53 -07003287 l2cap_txwin_setup(chan);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003288 rfc.mode = L2CAP_MODE_STREAMING;
3289 rfc.txwin_size = 0;
3290 rfc.max_transmit = 0;
3291 rfc.retrans_timeout = 0;
3292 rfc.monitor_timeout = 0;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003293
3294 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003295 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3296 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003297 rfc.max_pdu_size = cpu_to_le16(size);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003298
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003299 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003300 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003301
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003302 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3303 l2cap_add_opt_efs(&ptr, chan);
3304
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003305 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3306 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003307 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003308 chan->fcs = L2CAP_FCS_NONE;
3309 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3310 chan->fcs);
3311 }
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003312 break;
3313 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003314
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003315 req->dcid = cpu_to_le16(chan->dcid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003316 req->flags = cpu_to_le16(0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003317
3318 return ptr - data;
3319}
3320
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003321static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003322{
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003323 struct l2cap_conf_rsp *rsp = data;
3324 void *ptr = rsp->data;
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003325 void *req = chan->conf_req;
3326 int len = chan->conf_len;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003327 int type, hint, olen;
3328 unsigned long val;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003329 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003330 struct l2cap_conf_efs efs;
3331 u8 remote_efs = 0;
Marcel Holtmann861d6882007-10-20 13:37:06 +02003332 u16 mtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003333 u16 result = L2CAP_CONF_SUCCESS;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003334 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003335
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003336 BT_DBG("chan %p", chan);
Marcel Holtmann820ae1b2006-11-18 22:15:00 +01003337
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003338 while (len >= L2CAP_CONF_OPT_SIZE) {
3339 len -= l2cap_get_conf_opt(&req, &type, &olen, &val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003340
Gustavo F. Padovan589d2742009-04-20 01:31:07 -03003341 hint = type & L2CAP_CONF_HINT;
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07003342 type &= L2CAP_CONF_MASK;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003343
3344 switch (type) {
3345 case L2CAP_CONF_MTU:
Marcel Holtmann861d6882007-10-20 13:37:06 +02003346 mtu = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003347 break;
3348
3349 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003350 chan->flush_to = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003351 break;
3352
3353 case L2CAP_CONF_QOS:
3354 break;
3355
Marcel Holtmann6464f352007-10-20 13:39:51 +02003356 case L2CAP_CONF_RFC:
3357 if (olen == sizeof(rfc))
3358 memcpy(&rfc, (void *) val, olen);
3359 break;
3360
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003361 case L2CAP_CONF_FCS:
3362 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003363 set_bit(CONF_RECV_NO_FCS, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003364 break;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003365
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003366 case L2CAP_CONF_EFS:
3367 remote_efs = 1;
3368 if (olen == sizeof(efs))
3369 memcpy(&efs, (void *) val, olen);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003370 break;
3371
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003372 case L2CAP_CONF_EWS:
Marcel Holtmann848566b2013-10-01 22:59:22 -07003373 if (!chan->conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003374 return -ECONNREFUSED;
3375
3376 set_bit(FLAG_EXT_CTRL, &chan->flags);
3377 set_bit(CONF_EWS_RECV, &chan->conf_state);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003378 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003379 chan->remote_tx_win = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003380 break;
3381
3382 default:
3383 if (hint)
3384 break;
3385
3386 result = L2CAP_CONF_UNKNOWN;
3387 *((u8 *) ptr++) = type;
3388 break;
3389 }
3390 }
3391
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003392 if (chan->num_conf_rsp || chan->num_conf_req > 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003393 goto done;
3394
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003395 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003396 case L2CAP_MODE_STREAMING:
3397 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003398 if (!test_bit(CONF_STATE2_DEVICE, &chan->conf_state)) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003399 chan->mode = l2cap_select_mode(rfc.mode,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003400 chan->conn->feat_mask);
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003401 break;
3402 }
3403
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003404 if (remote_efs) {
Marcel Holtmann848566b2013-10-01 22:59:22 -07003405 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003406 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3407 else
3408 return -ECONNREFUSED;
3409 }
3410
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003411 if (chan->mode != rfc.mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003412 return -ECONNREFUSED;
Gustavo F. Padovan742e5192010-06-08 19:09:48 -03003413
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003414 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003415 }
3416
3417done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003418 if (chan->mode != rfc.mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003419 result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003420 rfc.mode = chan->mode;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003421
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003422 if (chan->num_conf_rsp == 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003423 return -ECONNREFUSED;
3424
Gustavo Padovan2d792812012-10-06 10:07:01 +01003425 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3426 (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003427 }
3428
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003429 if (result == L2CAP_CONF_SUCCESS) {
3430 /* Configure output options and let the other side know
3431 * which ones we don't like. */
3432
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003433 if (mtu < L2CAP_DEFAULT_MIN_MTU)
3434 result = L2CAP_CONF_UNACCEPT;
3435 else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003436 chan->omtu = mtu;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003437 set_bit(CONF_MTU_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003438 }
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003439 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->omtu);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003440
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003441 if (remote_efs) {
3442 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003443 efs.stype != L2CAP_SERV_NOTRAFIC &&
3444 efs.stype != chan->local_stype) {
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003445
3446 result = L2CAP_CONF_UNACCEPT;
3447
3448 if (chan->num_conf_req >= 1)
3449 return -ECONNREFUSED;
3450
3451 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003452 sizeof(efs),
3453 (unsigned long) &efs);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003454 } else {
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003455 /* Send PENDING Conf Rsp */
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003456 result = L2CAP_CONF_PENDING;
3457 set_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003458 }
3459 }
3460
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003461 switch (rfc.mode) {
3462 case L2CAP_MODE_BASIC:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003463 chan->fcs = L2CAP_FCS_NONE;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003464 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003465 break;
3466
3467 case L2CAP_MODE_ERTM:
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003468 if (!test_bit(CONF_EWS_RECV, &chan->conf_state))
3469 chan->remote_tx_win = rfc.txwin_size;
3470 else
3471 rfc.txwin_size = L2CAP_DEFAULT_TX_WINDOW;
3472
Gustavo F. Padovan2c03a7a2011-03-25 20:15:28 -03003473 chan->remote_max_tx = rfc.max_transmit;
Mat Martineau86b1b262010-08-05 15:54:22 -07003474
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003475 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003476 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3477 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003478 rfc.max_pdu_size = cpu_to_le16(size);
3479 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003480
Mat Martineau36c86c82012-10-23 15:24:20 -07003481 __l2cap_set_ertm_timeouts(chan, &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003482
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003483 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003484
3485 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003486 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003487
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003488 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3489 chan->remote_id = efs.id;
3490 chan->remote_stype = efs.stype;
3491 chan->remote_msdu = le16_to_cpu(efs.msdu);
3492 chan->remote_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003493 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003494 chan->remote_acc_lat =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003495 le32_to_cpu(efs.acc_lat);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003496 chan->remote_sdu_itime =
3497 le32_to_cpu(efs.sdu_itime);
3498 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003499 sizeof(efs),
3500 (unsigned long) &efs);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003501 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003502 break;
3503
3504 case L2CAP_MODE_STREAMING:
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003505 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003506 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3507 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003508 rfc.max_pdu_size = cpu_to_le16(size);
3509 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003510
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003511 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003512
Gustavo Padovan2d792812012-10-06 10:07:01 +01003513 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3514 (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003515
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003516 break;
3517
3518 default:
Marcel Holtmann6464f352007-10-20 13:39:51 +02003519 result = L2CAP_CONF_UNACCEPT;
3520
3521 memset(&rfc, 0, sizeof(rfc));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003522 rfc.mode = chan->mode;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003523 }
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003524
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003525 if (result == L2CAP_CONF_SUCCESS)
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003526 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003527 }
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003528 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003529 rsp->result = cpu_to_le16(result);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003530 rsp->flags = cpu_to_le16(0);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003531
3532 return ptr - data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003533}
3534
Gustavo Padovan2d792812012-10-06 10:07:01 +01003535static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len,
3536 void *data, u16 *result)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003537{
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003538 struct l2cap_conf_req *req = data;
3539 void *ptr = req->data;
3540 int type, olen;
3541 unsigned long val;
Mat Martineau36e999a2011-12-08 17:23:21 -08003542 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003543 struct l2cap_conf_efs efs;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003544
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003545 BT_DBG("chan %p, rsp %p, len %d, req %p", chan, rsp, len, data);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003546
3547 while (len >= L2CAP_CONF_OPT_SIZE) {
3548 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3549
3550 switch (type) {
3551 case L2CAP_CONF_MTU:
3552 if (val < L2CAP_DEFAULT_MIN_MTU) {
3553 *result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003554 chan->imtu = L2CAP_DEFAULT_MIN_MTU;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003555 } else
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003556 chan->imtu = val;
3557 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003558 break;
3559
3560 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003561 chan->flush_to = val;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003562 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003563 2, chan->flush_to);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003564 break;
3565
3566 case L2CAP_CONF_RFC:
3567 if (olen == sizeof(rfc))
3568 memcpy(&rfc, (void *)val, olen);
3569
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003570 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003571 rfc.mode != chan->mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003572 return -ECONNREFUSED;
3573
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003574 chan->fcs = 0;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003575
3576 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003577 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003578 break;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003579
3580 case L2CAP_CONF_EWS:
Mat Martineauc20f8e32012-07-10 05:47:07 -07003581 chan->ack_win = min_t(u16, val, chan->ack_win);
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003582 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Mat Martineauc20f8e32012-07-10 05:47:07 -07003583 chan->tx_win);
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003584 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003585
3586 case L2CAP_CONF_EFS:
3587 if (olen == sizeof(efs))
3588 memcpy(&efs, (void *)val, olen);
3589
3590 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003591 efs.stype != L2CAP_SERV_NOTRAFIC &&
3592 efs.stype != chan->local_stype)
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003593 return -ECONNREFUSED;
3594
Gustavo Padovan2d792812012-10-06 10:07:01 +01003595 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS, sizeof(efs),
3596 (unsigned long) &efs);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003597 break;
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003598
3599 case L2CAP_CONF_FCS:
3600 if (*result == L2CAP_CONF_PENDING)
3601 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003602 set_bit(CONF_RECV_NO_FCS,
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003603 &chan->conf_state);
3604 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003605 }
3606 }
3607
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003608 if (chan->mode == L2CAP_MODE_BASIC && chan->mode != rfc.mode)
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003609 return -ECONNREFUSED;
3610
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003611 chan->mode = rfc.mode;
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003612
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003613 if (*result == L2CAP_CONF_SUCCESS || *result == L2CAP_CONF_PENDING) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003614 switch (rfc.mode) {
3615 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003616 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3617 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
3618 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003619 if (!test_bit(FLAG_EXT_CTRL, &chan->flags))
3620 chan->ack_win = min_t(u16, chan->ack_win,
3621 rfc.txwin_size);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003622
3623 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3624 chan->local_msdu = le16_to_cpu(efs.msdu);
3625 chan->local_sdu_itime =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003626 le32_to_cpu(efs.sdu_itime);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003627 chan->local_acc_lat = le32_to_cpu(efs.acc_lat);
3628 chan->local_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003629 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003630 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003631 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003632
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003633 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003634 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003635 }
3636 }
3637
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003638 req->dcid = cpu_to_le16(chan->dcid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003639 req->flags = cpu_to_le16(0);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003640
3641 return ptr - data;
3642}
3643
Gustavo Padovan2d792812012-10-06 10:07:01 +01003644static int l2cap_build_conf_rsp(struct l2cap_chan *chan, void *data,
3645 u16 result, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003646{
3647 struct l2cap_conf_rsp *rsp = data;
3648 void *ptr = rsp->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003649
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003650 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003651
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003652 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003653 rsp->result = cpu_to_le16(result);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003654 rsp->flags = cpu_to_le16(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003655
3656 return ptr - data;
3657}
3658
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003659void __l2cap_le_connect_rsp_defer(struct l2cap_chan *chan)
3660{
3661 struct l2cap_le_conn_rsp rsp;
3662 struct l2cap_conn *conn = chan->conn;
3663
3664 BT_DBG("chan %p", chan);
3665
3666 rsp.dcid = cpu_to_le16(chan->scid);
3667 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02003668 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03003669 rsp.credits = cpu_to_le16(chan->rx_credits);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003670 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003671
3672 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp),
3673 &rsp);
3674}
3675
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003676void __l2cap_connect_rsp_defer(struct l2cap_chan *chan)
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003677{
3678 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003679 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003680 u8 buf[128];
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003681 u8 rsp_code;
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003682
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003683 rsp.scid = cpu_to_le16(chan->dcid);
3684 rsp.dcid = cpu_to_le16(chan->scid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003685 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
3686 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003687
3688 if (chan->hs_hcon)
3689 rsp_code = L2CAP_CREATE_CHAN_RSP;
3690 else
3691 rsp_code = L2CAP_CONN_RSP;
3692
3693 BT_DBG("chan %p rsp_code %u", chan, rsp_code);
3694
3695 l2cap_send_cmd(conn, chan->ident, rsp_code, sizeof(rsp), &rsp);
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003696
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003697 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003698 return;
3699
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003700 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003701 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003702 chan->num_conf_req++;
3703}
3704
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003705static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len)
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003706{
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003707 int type, olen;
3708 unsigned long val;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003709 /* Use sane default values in case a misbehaving remote device
3710 * did not send an RFC or extended window size option.
3711 */
3712 u16 txwin_ext = chan->ack_win;
3713 struct l2cap_conf_rfc rfc = {
3714 .mode = chan->mode,
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003715 .retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO),
3716 .monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO),
Mat Martineauc20f8e32012-07-10 05:47:07 -07003717 .max_pdu_size = cpu_to_le16(chan->imtu),
3718 .txwin_size = min_t(u16, chan->ack_win, L2CAP_DEFAULT_TX_WINDOW),
3719 };
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003720
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003721 BT_DBG("chan %p, rsp %p, len %d", chan, rsp, len);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003722
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003723 if ((chan->mode != L2CAP_MODE_ERTM) && (chan->mode != L2CAP_MODE_STREAMING))
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003724 return;
3725
3726 while (len >= L2CAP_CONF_OPT_SIZE) {
3727 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3728
Mat Martineauc20f8e32012-07-10 05:47:07 -07003729 switch (type) {
3730 case L2CAP_CONF_RFC:
3731 if (olen == sizeof(rfc))
3732 memcpy(&rfc, (void *)val, olen);
Szymon Janc8f321f82012-06-08 11:33:33 +02003733 break;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003734 case L2CAP_CONF_EWS:
3735 txwin_ext = val;
3736 break;
3737 }
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003738 }
3739
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003740 switch (rfc.mode) {
3741 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003742 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3743 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003744 chan->mps = le16_to_cpu(rfc.max_pdu_size);
3745 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3746 chan->ack_win = min_t(u16, chan->ack_win, txwin_ext);
3747 else
3748 chan->ack_win = min_t(u16, chan->ack_win,
3749 rfc.txwin_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003750 break;
3751 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003752 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003753 }
3754}
3755
Gustavo Padovan2d792812012-10-06 10:07:01 +01003756static inline int l2cap_command_rej(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003757 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3758 u8 *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003759{
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003760 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003761
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003762 if (cmd_len < sizeof(*rej))
3763 return -EPROTO;
3764
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003765 if (rej->reason != L2CAP_REJ_NOT_UNDERSTOOD)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003766 return 0;
3767
3768 if ((conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003769 cmd->ident == conn->info_ident) {
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02003770 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann984947d2009-02-06 23:35:19 +01003771
3772 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01003773 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01003774
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003775 l2cap_conn_start(conn);
3776 }
3777
3778 return 0;
3779}
3780
Mat Martineau17009152012-10-23 15:24:07 -07003781static struct l2cap_chan *l2cap_connect(struct l2cap_conn *conn,
3782 struct l2cap_cmd_hdr *cmd,
3783 u8 *data, u8 rsp_code, u8 amp_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003784{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003785 struct l2cap_conn_req *req = (struct l2cap_conn_req *) data;
3786 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003787 struct l2cap_chan *chan = NULL, *pchan;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003788 int result, status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003789
3790 u16 dcid = 0, scid = __le16_to_cpu(req->scid);
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003791 __le16 psm = req->psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003792
Andrei Emeltchenko097db762012-03-09 14:16:17 +02003793 BT_DBG("psm 0x%2.2x scid 0x%4.4x", __le16_to_cpu(psm), scid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003794
3795 /* Check if we have socket listening on psm */
Marcel Holtmann6f59b902013-10-13 05:24:01 -07003796 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03003797 &conn->hcon->dst, ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003798 if (!pchan) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003799 result = L2CAP_CR_BAD_PSM;
3800 goto sendresp;
3801 }
3802
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003803 mutex_lock(&conn->chan_lock);
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003804 l2cap_chan_lock(pchan);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00003805
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003806 /* Check if the ACL is secure enough (if not SDP) */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003807 if (psm != cpu_to_le16(L2CAP_PSM_SDP) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003808 !hci_conn_check_link_mode(conn->hcon)) {
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02003809 conn->disc_reason = HCI_ERROR_AUTH_FAILURE;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003810 result = L2CAP_CR_SEC_BLOCK;
3811 goto response;
3812 }
3813
Linus Torvalds1da177e2005-04-16 15:20:36 -07003814 result = L2CAP_CR_NO_MEM;
3815
Gustavo Padovan2dfa1002012-05-27 22:27:58 -03003816 /* Check if we already have channel with that dcid */
3817 if (__l2cap_get_chan_by_dcid(conn, scid))
3818 goto response;
3819
Gustavo Padovan80b98022012-05-27 22:27:51 -03003820 chan = pchan->ops->new_connection(pchan);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03003821 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003822 goto response;
3823
Syam Sidhardhan330b6c12013-08-06 01:59:12 +09003824 /* For certain devices (ex: HID mouse), support for authentication,
3825 * pairing and bonding is optional. For such devices, inorder to avoid
3826 * the ACL alive for too long after L2CAP disconnection, reset the ACL
3827 * disc_timeout back to HCI_DISCONN_TIMEOUT during L2CAP connect.
3828 */
3829 conn->hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
3830
Marcel Holtmann7eafc592013-10-13 08:12:47 -07003831 bacpy(&chan->src, &conn->hcon->src);
3832 bacpy(&chan->dst, &conn->hcon->dst);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -07003833 chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type);
3834 chan->dst_type = bdaddr_type(conn->hcon, conn->hcon->dst_type);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003835 chan->psm = psm;
3836 chan->dcid = scid;
Mat Martineau17009152012-10-23 15:24:07 -07003837 chan->local_amp_id = amp_id;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003838
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003839 __l2cap_chan_add(conn, chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003840
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003841 dcid = chan->scid;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003842
Gustavo Padovan8d836d72013-10-15 19:24:47 -03003843 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003844
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003845 chan->ident = cmd->ident;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003846
Marcel Holtmann984947d2009-02-06 23:35:19 +01003847 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) {
Gustavo F. Padovand45fc422011-11-05 19:54:24 -02003848 if (l2cap_chan_check_security(chan)) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07003849 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003850 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003851 result = L2CAP_CR_PEND;
3852 status = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08003853 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003854 } else {
Mat Martineau17009152012-10-23 15:24:07 -07003855 /* Force pending result for AMP controllers.
3856 * The connection will succeed after the
3857 * physical link is up.
3858 */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003859 if (amp_id == AMP_ID_BREDR) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003860 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau17009152012-10-23 15:24:07 -07003861 result = L2CAP_CR_SUCCESS;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003862 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003863 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003864 result = L2CAP_CR_PEND;
Mat Martineau17009152012-10-23 15:24:07 -07003865 }
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003866 status = L2CAP_CS_NO_INFO;
3867 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003868 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003869 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003870 result = L2CAP_CR_PEND;
3871 status = L2CAP_CS_AUTHEN_PEND;
3872 }
3873 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003874 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003875 result = L2CAP_CR_PEND;
3876 status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003877 }
3878
Linus Torvalds1da177e2005-04-16 15:20:36 -07003879response:
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003880 l2cap_chan_unlock(pchan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003881 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003882
3883sendresp:
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003884 rsp.scid = cpu_to_le16(scid);
3885 rsp.dcid = cpu_to_le16(dcid);
3886 rsp.result = cpu_to_le16(result);
3887 rsp.status = cpu_to_le16(status);
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003888 l2cap_send_cmd(conn, cmd->ident, rsp_code, sizeof(rsp), &rsp);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003889
3890 if (result == L2CAP_CR_PEND && status == L2CAP_CS_NO_INFO) {
3891 struct l2cap_info_req info;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003892 info.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003893
3894 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
3895 conn->info_ident = l2cap_get_ident(conn);
3896
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08003897 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003898
Gustavo Padovan2d792812012-10-06 10:07:01 +01003899 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
3900 sizeof(info), &info);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003901 }
3902
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003903 if (chan && !test_bit(CONF_REQ_SENT, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003904 result == L2CAP_CR_SUCCESS) {
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003905 u8 buf[128];
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003906 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003907 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003908 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003909 chan->num_conf_req++;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003910 }
Mat Martineau17009152012-10-23 15:24:07 -07003911
3912 return chan;
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003913}
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003914
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003915static int l2cap_connect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003916 struct l2cap_cmd_hdr *cmd, u16 cmd_len, u8 *data)
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003917{
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303918 struct hci_dev *hdev = conn->hcon->hdev;
3919 struct hci_conn *hcon = conn->hcon;
3920
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003921 if (cmd_len < sizeof(struct l2cap_conn_req))
3922 return -EPROTO;
3923
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303924 hci_dev_lock(hdev);
3925 if (test_bit(HCI_MGMT, &hdev->dev_flags) &&
3926 !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &hcon->flags))
3927 mgmt_device_connected(hdev, &hcon->dst, hcon->type,
3928 hcon->dst_type, 0, NULL, 0,
3929 hcon->dev_class);
3930 hci_dev_unlock(hdev);
3931
Gustavo Padovan300229f2012-10-12 19:40:40 +08003932 l2cap_connect(conn, cmd, data, L2CAP_CONN_RSP, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003933 return 0;
3934}
3935
Mat Martineau5909cf32012-10-23 15:24:08 -07003936static int l2cap_connect_create_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003937 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3938 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003939{
3940 struct l2cap_conn_rsp *rsp = (struct l2cap_conn_rsp *) data;
3941 u16 scid, dcid, result, status;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003942 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003943 u8 req[128];
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003944 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003945
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003946 if (cmd_len < sizeof(*rsp))
3947 return -EPROTO;
3948
Linus Torvalds1da177e2005-04-16 15:20:36 -07003949 scid = __le16_to_cpu(rsp->scid);
3950 dcid = __le16_to_cpu(rsp->dcid);
3951 result = __le16_to_cpu(rsp->result);
3952 status = __le16_to_cpu(rsp->status);
3953
Andrei Emeltchenko1b009c92012-02-21 12:54:54 +02003954 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 +01003955 dcid, scid, result, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003956
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003957 mutex_lock(&conn->chan_lock);
3958
Linus Torvalds1da177e2005-04-16 15:20:36 -07003959 if (scid) {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003960 chan = __l2cap_get_chan_by_scid(conn, scid);
3961 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003962 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003963 goto unlock;
3964 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003965 } else {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003966 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
3967 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003968 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003969 goto unlock;
3970 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003971 }
3972
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003973 err = 0;
3974
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003975 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003976
Linus Torvalds1da177e2005-04-16 15:20:36 -07003977 switch (result) {
3978 case L2CAP_CR_SUCCESS:
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03003979 l2cap_state_change(chan, BT_CONFIG);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003980 chan->ident = 0;
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003981 chan->dcid = dcid;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003982 clear_bit(CONF_CONNECT_PEND, &chan->conf_state);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01003983
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003984 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003985 break;
3986
Linus Torvalds1da177e2005-04-16 15:20:36 -07003987 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003988 l2cap_build_conf_req(chan, req), req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003989 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003990 break;
3991
3992 case L2CAP_CR_PEND:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003993 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003994 break;
3995
3996 default:
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003997 l2cap_chan_del(chan, ECONNREFUSED);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003998 break;
3999 }
4000
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004001 l2cap_chan_unlock(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004002
4003unlock:
4004 mutex_unlock(&conn->chan_lock);
4005
4006 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004007}
4008
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004009static inline void set_default_fcs(struct l2cap_chan *chan)
Mat Martineau8c462b62010-08-24 15:35:42 -07004010{
4011 /* FCS is enabled only in ERTM or streaming mode, if one or both
4012 * sides request it.
4013 */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03004014 if (chan->mode != L2CAP_MODE_ERTM && chan->mode != L2CAP_MODE_STREAMING)
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004015 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02004016 else if (!test_bit(CONF_RECV_NO_FCS, &chan->conf_state))
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004017 chan->fcs = L2CAP_FCS_CRC16;
Mat Martineau8c462b62010-08-24 15:35:42 -07004018}
4019
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03004020static void l2cap_send_efs_conf_rsp(struct l2cap_chan *chan, void *data,
4021 u8 ident, u16 flags)
4022{
4023 struct l2cap_conn *conn = chan->conn;
4024
4025 BT_DBG("conn %p chan %p ident %d flags 0x%4.4x", conn, chan, ident,
4026 flags);
4027
4028 clear_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
4029 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
4030
4031 l2cap_send_cmd(conn, ident, L2CAP_CONF_RSP,
4032 l2cap_build_conf_rsp(chan, data,
4033 L2CAP_CONF_SUCCESS, flags), data);
4034}
4035
Johan Hedberg662d6522013-10-16 11:20:47 +03004036static void cmd_reject_invalid_cid(struct l2cap_conn *conn, u8 ident,
4037 u16 scid, u16 dcid)
4038{
4039 struct l2cap_cmd_rej_cid rej;
4040
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004041 rej.reason = cpu_to_le16(L2CAP_REJ_INVALID_CID);
Johan Hedberg662d6522013-10-16 11:20:47 +03004042 rej.scid = __cpu_to_le16(scid);
4043 rej.dcid = __cpu_to_le16(dcid);
4044
4045 l2cap_send_cmd(conn, ident, L2CAP_COMMAND_REJ, sizeof(rej), &rej);
4046}
4047
Gustavo Padovan2d792812012-10-06 10:07:01 +01004048static inline int l2cap_config_req(struct l2cap_conn *conn,
4049 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4050 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004051{
4052 struct l2cap_conf_req *req = (struct l2cap_conf_req *) data;
4053 u16 dcid, flags;
4054 u8 rsp[64];
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004055 struct l2cap_chan *chan;
Mat Martineau3c588192012-04-11 10:48:42 -07004056 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004057
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004058 if (cmd_len < sizeof(*req))
4059 return -EPROTO;
4060
Linus Torvalds1da177e2005-04-16 15:20:36 -07004061 dcid = __le16_to_cpu(req->dcid);
4062 flags = __le16_to_cpu(req->flags);
4063
4064 BT_DBG("dcid 0x%4.4x flags 0x%2.2x", dcid, flags);
4065
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004066 chan = l2cap_get_chan_by_scid(conn, dcid);
Johan Hedberg662d6522013-10-16 11:20:47 +03004067 if (!chan) {
4068 cmd_reject_invalid_cid(conn, cmd->ident, dcid, 0);
4069 return 0;
4070 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004071
David S. Miller033b1142011-07-21 13:38:42 -07004072 if (chan->state != BT_CONFIG && chan->state != BT_CONNECT2) {
Johan Hedberg662d6522013-10-16 11:20:47 +03004073 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4074 chan->dcid);
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004075 goto unlock;
Gustavo F. Padovandf6bd742010-06-14 02:26:15 -03004076 }
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004077
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004078 /* Reject if config buffer is too small. */
Al Viro88219a02007-07-29 00:17:25 -07004079 len = cmd_len - sizeof(*req);
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004080 if (chan->conf_len + len > sizeof(chan->conf_req)) {
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004081 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004082 l2cap_build_conf_rsp(chan, rsp,
4083 L2CAP_CONF_REJECT, flags), rsp);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004084 goto unlock;
4085 }
4086
4087 /* Store config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004088 memcpy(chan->conf_req + chan->conf_len, req->data, len);
4089 chan->conf_len += len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004090
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004091 if (flags & L2CAP_CONF_FLAG_CONTINUATION) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004092 /* Incomplete config. Send empty response. */
4093 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004094 l2cap_build_conf_rsp(chan, rsp,
4095 L2CAP_CONF_SUCCESS, flags), rsp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004096 goto unlock;
4097 }
4098
4099 /* Complete config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004100 len = l2cap_parse_conf_req(chan, rsp);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004101 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004102 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004103 goto unlock;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004104 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004105
Mat Martineau1500109b2012-10-23 15:24:15 -07004106 chan->ident = cmd->ident;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004107 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004108 chan->num_conf_rsp++;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004109
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004110 /* Reset config buffer. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004111 chan->conf_len = 0;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004112
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004113 if (!test_bit(CONF_OUTPUT_DONE, &chan->conf_state))
Marcel Holtmann876d9482007-10-20 13:35:42 +02004114 goto unlock;
4115
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004116 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004117 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004118
Mat Martineau105bdf92012-04-27 16:50:48 -07004119 if (chan->mode == L2CAP_MODE_ERTM ||
4120 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004121 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004122
Mat Martineau3c588192012-04-11 10:48:42 -07004123 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004124 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004125 else
4126 l2cap_chan_ready(chan);
4127
Marcel Holtmann876d9482007-10-20 13:35:42 +02004128 goto unlock;
4129 }
4130
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004131 if (!test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02004132 u8 buf[64];
Linus Torvalds1da177e2005-04-16 15:20:36 -07004133 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004134 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004135 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004136 }
4137
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004138 /* Got Conf Rsp PENDING from remote side and asume we sent
4139 Conf Rsp PENDING in the code above */
4140 if (test_bit(CONF_REM_CONF_PEND, &chan->conf_state) &&
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03004141 test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004142
4143 /* check compatibility */
4144
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004145 /* Send rsp for BR/EDR channel */
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004146 if (!chan->hs_hcon)
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004147 l2cap_send_efs_conf_rsp(chan, rsp, cmd->ident, flags);
4148 else
4149 chan->ident = cmd->ident;
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004150 }
4151
Linus Torvalds1da177e2005-04-16 15:20:36 -07004152unlock:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004153 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004154 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004155}
4156
Gustavo Padovan2d792812012-10-06 10:07:01 +01004157static inline int l2cap_config_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004158 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4159 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004160{
4161 struct l2cap_conf_rsp *rsp = (struct l2cap_conf_rsp *)data;
4162 u16 scid, flags, result;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004163 struct l2cap_chan *chan;
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004164 int len = cmd_len - sizeof(*rsp);
Mat Martineau3c588192012-04-11 10:48:42 -07004165 int err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004166
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004167 if (cmd_len < sizeof(*rsp))
4168 return -EPROTO;
4169
Linus Torvalds1da177e2005-04-16 15:20:36 -07004170 scid = __le16_to_cpu(rsp->scid);
4171 flags = __le16_to_cpu(rsp->flags);
4172 result = __le16_to_cpu(rsp->result);
4173
Andrei Emeltchenko61386cb2012-03-12 12:13:07 +02004174 BT_DBG("scid 0x%4.4x flags 0x%2.2x result 0x%2.2x len %d", scid, flags,
4175 result, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004176
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004177 chan = l2cap_get_chan_by_scid(conn, scid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004178 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004179 return 0;
4180
4181 switch (result) {
4182 case L2CAP_CONF_SUCCESS:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004183 l2cap_conf_rfc_get(chan, rsp->data, len);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004184 clear_bit(CONF_REM_CONF_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004185 break;
4186
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004187 case L2CAP_CONF_PENDING:
4188 set_bit(CONF_REM_CONF_PEND, &chan->conf_state);
4189
4190 if (test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
4191 char buf[64];
4192
4193 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004194 buf, &result);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004195 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004196 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004197 goto done;
4198 }
4199
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004200 if (!chan->hs_hcon) {
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004201 l2cap_send_efs_conf_rsp(chan, buf, cmd->ident,
4202 0);
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02004203 } else {
4204 if (l2cap_check_efs(chan)) {
4205 amp_create_logical_link(chan);
4206 chan->ident = cmd->ident;
4207 }
4208 }
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004209 }
4210 goto done;
4211
Linus Torvalds1da177e2005-04-16 15:20:36 -07004212 case L2CAP_CONF_UNACCEPT:
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004213 if (chan->num_conf_rsp <= L2CAP_CONF_MAX_CONF_RSP) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004214 char req[64];
4215
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004216 if (len > sizeof(req) - sizeof(struct l2cap_conf_req)) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004217 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004218 goto done;
4219 }
4220
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004221 /* throw out any old stored conf requests */
4222 result = L2CAP_CONF_SUCCESS;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03004223 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004224 req, &result);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004225 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004226 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004227 goto done;
4228 }
4229
4230 l2cap_send_cmd(conn, l2cap_get_ident(conn),
Gustavo Padovan2d792812012-10-06 10:07:01 +01004231 L2CAP_CONF_REQ, len, req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004232 chan->num_conf_req++;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004233 if (result != L2CAP_CONF_SUCCESS)
4234 goto done;
4235 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004236 }
4237
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09004238 default:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004239 l2cap_chan_set_err(chan, ECONNRESET);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +02004240
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08004241 __set_chan_timer(chan, L2CAP_DISC_REJ_TIMEOUT);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004242 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004243 goto done;
4244 }
4245
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004246 if (flags & L2CAP_CONF_FLAG_CONTINUATION)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004247 goto done;
4248
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004249 set_bit(CONF_INPUT_DONE, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004250
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004251 if (test_bit(CONF_OUTPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004252 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004253
Mat Martineau105bdf92012-04-27 16:50:48 -07004254 if (chan->mode == L2CAP_MODE_ERTM ||
4255 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004256 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004257
Mat Martineau3c588192012-04-11 10:48:42 -07004258 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004259 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004260 else
4261 l2cap_chan_ready(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004262 }
4263
4264done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004265 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004266 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004267}
4268
Gustavo Padovan2d792812012-10-06 10:07:01 +01004269static inline int l2cap_disconnect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004270 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4271 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004272{
4273 struct l2cap_disconn_req *req = (struct l2cap_disconn_req *) data;
4274 struct l2cap_disconn_rsp rsp;
4275 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004276 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004277
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004278 if (cmd_len != sizeof(*req))
4279 return -EPROTO;
4280
Linus Torvalds1da177e2005-04-16 15:20:36 -07004281 scid = __le16_to_cpu(req->scid);
4282 dcid = __le16_to_cpu(req->dcid);
4283
4284 BT_DBG("scid 0x%4.4x dcid 0x%4.4x", scid, dcid);
4285
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004286 mutex_lock(&conn->chan_lock);
4287
4288 chan = __l2cap_get_chan_by_scid(conn, dcid);
4289 if (!chan) {
4290 mutex_unlock(&conn->chan_lock);
Johan Hedberg662d6522013-10-16 11:20:47 +03004291 cmd_reject_invalid_cid(conn, cmd->ident, dcid, scid);
4292 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004293 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004294
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004295 l2cap_chan_lock(chan);
4296
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03004297 rsp.dcid = cpu_to_le16(chan->scid);
4298 rsp.scid = cpu_to_le16(chan->dcid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004299 l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp);
4300
Gustavo Padovan5ec1bbe2013-10-15 19:24:48 -03004301 chan->ops->set_shutdown(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004302
Mat Martineau61d6ef32012-04-27 16:50:50 -07004303 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004304 l2cap_chan_del(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004305
4306 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004307
Gustavo Padovan80b98022012-05-27 22:27:51 -03004308 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004309 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004310
4311 mutex_unlock(&conn->chan_lock);
4312
Linus Torvalds1da177e2005-04-16 15:20:36 -07004313 return 0;
4314}
4315
Gustavo Padovan2d792812012-10-06 10:07:01 +01004316static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004317 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4318 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004319{
4320 struct l2cap_disconn_rsp *rsp = (struct l2cap_disconn_rsp *) data;
4321 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004322 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004323
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004324 if (cmd_len != sizeof(*rsp))
4325 return -EPROTO;
4326
Linus Torvalds1da177e2005-04-16 15:20:36 -07004327 scid = __le16_to_cpu(rsp->scid);
4328 dcid = __le16_to_cpu(rsp->dcid);
4329
4330 BT_DBG("dcid 0x%4.4x scid 0x%4.4x", dcid, scid);
4331
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004332 mutex_lock(&conn->chan_lock);
4333
4334 chan = __l2cap_get_chan_by_scid(conn, scid);
4335 if (!chan) {
4336 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004337 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004338 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004339
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004340 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004341
Mat Martineau61d6ef32012-04-27 16:50:50 -07004342 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004343 l2cap_chan_del(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004344
4345 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004346
Gustavo Padovan80b98022012-05-27 22:27:51 -03004347 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004348 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004349
4350 mutex_unlock(&conn->chan_lock);
4351
Linus Torvalds1da177e2005-04-16 15:20:36 -07004352 return 0;
4353}
4354
Gustavo Padovan2d792812012-10-06 10:07:01 +01004355static inline int l2cap_information_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004356 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4357 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004358{
4359 struct l2cap_info_req *req = (struct l2cap_info_req *) data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004360 u16 type;
4361
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004362 if (cmd_len != sizeof(*req))
4363 return -EPROTO;
4364
Linus Torvalds1da177e2005-04-16 15:20:36 -07004365 type = __le16_to_cpu(req->type);
4366
4367 BT_DBG("type 0x%4.4x", type);
4368
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004369 if (type == L2CAP_IT_FEAT_MASK) {
4370 u8 buf[8];
Marcel Holtmann44dd46d2009-05-02 19:09:01 -07004371 u32 feat_mask = l2cap_feat_mask;
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004372 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004373 rsp->type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
4374 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03004375 if (!disable_ertm)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004376 feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING
Gustavo Padovan2d792812012-10-06 10:07:01 +01004377 | L2CAP_FEAT_FCS;
Marcel Holtmann848566b2013-10-01 22:59:22 -07004378 if (conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03004379 feat_mask |= L2CAP_FEAT_EXT_FLOW
Gustavo Padovan2d792812012-10-06 10:07:01 +01004380 | L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenkoa5fd6f32011-09-16 16:26:32 +03004381
Gustavo F. Padovan1b7bf4e2009-08-24 00:45:20 -03004382 put_unaligned_le32(feat_mask, rsp->data);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004383 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4384 buf);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004385 } else if (type == L2CAP_IT_FIXED_CHAN) {
4386 u8 buf[12];
4387 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Mat Martineau50a147c2011-11-02 16:18:34 -07004388
Marcel Holtmann848566b2013-10-01 22:59:22 -07004389 if (conn->hs_enabled)
Mat Martineau50a147c2011-11-02 16:18:34 -07004390 l2cap_fixed_chan[0] |= L2CAP_FC_A2MP;
4391 else
4392 l2cap_fixed_chan[0] &= ~L2CAP_FC_A2MP;
4393
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004394 rsp->type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
4395 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Andrei Emeltchenkoc6337ea2011-10-20 17:02:44 +03004396 memcpy(rsp->data, l2cap_fixed_chan, sizeof(l2cap_fixed_chan));
Gustavo Padovan2d792812012-10-06 10:07:01 +01004397 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4398 buf);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004399 } else {
4400 struct l2cap_info_rsp rsp;
4401 rsp.type = cpu_to_le16(type);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004402 rsp.result = cpu_to_le16(L2CAP_IR_NOTSUPP);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004403 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(rsp),
4404 &rsp);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004405 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004406
4407 return 0;
4408}
4409
Gustavo Padovan2d792812012-10-06 10:07:01 +01004410static inline int l2cap_information_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004411 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4412 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004413{
4414 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) data;
4415 u16 type, result;
4416
Jaganath Kanakkassery3f6fa3d2013-06-21 19:55:11 +05304417 if (cmd_len < sizeof(*rsp))
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004418 return -EPROTO;
4419
Linus Torvalds1da177e2005-04-16 15:20:36 -07004420 type = __le16_to_cpu(rsp->type);
4421 result = __le16_to_cpu(rsp->result);
4422
4423 BT_DBG("type 0x%4.4x result 0x%2.2x", type, result);
4424
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004425 /* L2CAP Info req/rsp are unbound to channels, add extra checks */
4426 if (cmd->ident != conn->info_ident ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01004427 conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004428 return 0;
4429
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02004430 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004431
Ville Tervoadb08ed2010-08-04 09:43:33 +03004432 if (result != L2CAP_IR_SUCCESS) {
4433 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4434 conn->info_ident = 0;
4435
4436 l2cap_conn_start(conn);
4437
4438 return 0;
4439 }
4440
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004441 switch (type) {
4442 case L2CAP_IT_FEAT_MASK:
Harvey Harrison83985312008-05-02 16:25:46 -07004443 conn->feat_mask = get_unaligned_le32(rsp->data);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004444
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07004445 if (conn->feat_mask & L2CAP_FEAT_FIXED_CHAN) {
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004446 struct l2cap_info_req req;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004447 req.type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004448
4449 conn->info_ident = l2cap_get_ident(conn);
4450
4451 l2cap_send_cmd(conn, conn->info_ident,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004452 L2CAP_INFO_REQ, sizeof(req), &req);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004453 } else {
4454 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4455 conn->info_ident = 0;
4456
4457 l2cap_conn_start(conn);
4458 }
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004459 break;
4460
4461 case L2CAP_IT_FIXED_CHAN:
4462 conn->fixed_chan_mask = rsp->data[0];
Marcel Holtmann984947d2009-02-06 23:35:19 +01004463 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004464 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004465
4466 l2cap_conn_start(conn);
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004467 break;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004468 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004469
Linus Torvalds1da177e2005-04-16 15:20:36 -07004470 return 0;
4471}
4472
Mat Martineau17009152012-10-23 15:24:07 -07004473static int l2cap_create_channel_req(struct l2cap_conn *conn,
4474 struct l2cap_cmd_hdr *cmd,
4475 u16 cmd_len, void *data)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004476{
4477 struct l2cap_create_chan_req *req = data;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004478 struct l2cap_create_chan_rsp rsp;
Mat Martineau17009152012-10-23 15:24:07 -07004479 struct l2cap_chan *chan;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004480 struct hci_dev *hdev;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004481 u16 psm, scid;
4482
4483 if (cmd_len != sizeof(*req))
4484 return -EPROTO;
4485
Marcel Holtmann848566b2013-10-01 22:59:22 -07004486 if (!conn->hs_enabled)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004487 return -EINVAL;
4488
4489 psm = le16_to_cpu(req->psm);
4490 scid = le16_to_cpu(req->scid);
4491
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004492 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 -07004493
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004494 /* For controller id 0 make BR/EDR connection */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004495 if (req->amp_id == AMP_ID_BREDR) {
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004496 l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4497 req->amp_id);
4498 return 0;
4499 }
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004500
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004501 /* Validate AMP controller id */
4502 hdev = hci_dev_get(req->amp_id);
4503 if (!hdev)
4504 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004505
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004506 if (hdev->dev_type != HCI_AMP || !test_bit(HCI_UP, &hdev->flags)) {
Mat Martineau17009152012-10-23 15:24:07 -07004507 hci_dev_put(hdev);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004508 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004509 }
4510
4511 chan = l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4512 req->amp_id);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004513 if (chan) {
4514 struct amp_mgr *mgr = conn->hcon->amp_mgr;
4515 struct hci_conn *hs_hcon;
4516
Marcel Holtmann98e0f7e2013-10-13 02:23:40 -07004517 hs_hcon = hci_conn_hash_lookup_ba(hdev, AMP_LINK,
4518 &conn->hcon->dst);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004519 if (!hs_hcon) {
4520 hci_dev_put(hdev);
Johan Hedberg662d6522013-10-16 11:20:47 +03004521 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4522 chan->dcid);
4523 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004524 }
4525
4526 BT_DBG("mgr %p bredr_chan %p hs_hcon %p", mgr, chan, hs_hcon);
4527
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004528 mgr->bredr_chan = chan;
4529 chan->hs_hcon = hs_hcon;
Andrei Emeltchenkofd45bf42012-11-20 17:16:22 +02004530 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004531 conn->mtu = hdev->block_mtu;
4532 }
4533
4534 hci_dev_put(hdev);
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004535
4536 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004537
4538error:
4539 rsp.dcid = 0;
4540 rsp.scid = cpu_to_le16(scid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004541 rsp.result = cpu_to_le16(L2CAP_CR_BAD_AMP);
4542 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004543
4544 l2cap_send_cmd(conn, cmd->ident, L2CAP_CREATE_CHAN_RSP,
4545 sizeof(rsp), &rsp);
4546
Johan Hedbergdc280802013-09-16 13:05:13 +03004547 return 0;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004548}
4549
Mat Martineau8eb200b2012-10-23 15:24:17 -07004550static void l2cap_send_move_chan_req(struct l2cap_chan *chan, u8 dest_amp_id)
4551{
4552 struct l2cap_move_chan_req req;
4553 u8 ident;
4554
4555 BT_DBG("chan %p, dest_amp_id %d", chan, dest_amp_id);
4556
4557 ident = l2cap_get_ident(chan->conn);
4558 chan->ident = ident;
4559
4560 req.icid = cpu_to_le16(chan->scid);
4561 req.dest_amp_id = dest_amp_id;
4562
4563 l2cap_send_cmd(chan->conn, ident, L2CAP_MOVE_CHAN_REQ, sizeof(req),
4564 &req);
4565
4566 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4567}
4568
Mat Martineau1500109b2012-10-23 15:24:15 -07004569static void l2cap_send_move_chan_rsp(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004570{
4571 struct l2cap_move_chan_rsp rsp;
4572
Mat Martineau1500109b2012-10-23 15:24:15 -07004573 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004574
Mat Martineau1500109b2012-10-23 15:24:15 -07004575 rsp.icid = cpu_to_le16(chan->dcid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004576 rsp.result = cpu_to_le16(result);
4577
Mat Martineau1500109b2012-10-23 15:24:15 -07004578 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_RSP,
4579 sizeof(rsp), &rsp);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004580}
4581
Mat Martineau5b155ef2012-10-23 15:24:14 -07004582static void l2cap_send_move_chan_cfm(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004583{
4584 struct l2cap_move_chan_cfm cfm;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004585
Mat Martineau5b155ef2012-10-23 15:24:14 -07004586 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004587
Mat Martineau5b155ef2012-10-23 15:24:14 -07004588 chan->ident = l2cap_get_ident(chan->conn);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004589
Mat Martineau5b155ef2012-10-23 15:24:14 -07004590 cfm.icid = cpu_to_le16(chan->scid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004591 cfm.result = cpu_to_le16(result);
4592
Mat Martineau5b155ef2012-10-23 15:24:14 -07004593 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_CFM,
4594 sizeof(cfm), &cfm);
4595
4596 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4597}
4598
4599static void l2cap_send_move_chan_cfm_icid(struct l2cap_conn *conn, u16 icid)
4600{
4601 struct l2cap_move_chan_cfm cfm;
4602
4603 BT_DBG("conn %p, icid 0x%4.4x", conn, icid);
4604
4605 cfm.icid = cpu_to_le16(icid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004606 cfm.result = cpu_to_le16(L2CAP_MC_UNCONFIRMED);
Mat Martineau5b155ef2012-10-23 15:24:14 -07004607
4608 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_MOVE_CHAN_CFM,
4609 sizeof(cfm), &cfm);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004610}
4611
4612static void l2cap_send_move_chan_cfm_rsp(struct l2cap_conn *conn, u8 ident,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004613 u16 icid)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004614{
4615 struct l2cap_move_chan_cfm_rsp rsp;
4616
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004617 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004618
4619 rsp.icid = cpu_to_le16(icid);
4620 l2cap_send_cmd(conn, ident, L2CAP_MOVE_CHAN_CFM_RSP, sizeof(rsp), &rsp);
4621}
4622
Mat Martineau5f3847a2012-10-23 15:24:12 -07004623static void __release_logical_link(struct l2cap_chan *chan)
4624{
4625 chan->hs_hchan = NULL;
4626 chan->hs_hcon = NULL;
4627
4628 /* Placeholder - release the logical link */
4629}
4630
Mat Martineau1500109b2012-10-23 15:24:15 -07004631static void l2cap_logical_fail(struct l2cap_chan *chan)
4632{
4633 /* Logical link setup failed */
4634 if (chan->state != BT_CONNECTED) {
4635 /* Create channel failure, disconnect */
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004636 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineau1500109b2012-10-23 15:24:15 -07004637 return;
4638 }
4639
4640 switch (chan->move_role) {
4641 case L2CAP_MOVE_ROLE_RESPONDER:
4642 l2cap_move_done(chan);
4643 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_SUPP);
4644 break;
4645 case L2CAP_MOVE_ROLE_INITIATOR:
4646 if (chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_COMP ||
4647 chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_CFM) {
4648 /* Remote has only sent pending or
4649 * success responses, clean up
4650 */
4651 l2cap_move_done(chan);
4652 }
4653
4654 /* Other amp move states imply that the move
4655 * has already aborted
4656 */
4657 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
4658 break;
4659 }
4660}
4661
4662static void l2cap_logical_finish_create(struct l2cap_chan *chan,
4663 struct hci_chan *hchan)
4664{
4665 struct l2cap_conf_rsp rsp;
Mat Martineau1500109b2012-10-23 15:24:15 -07004666
Andrei Emeltchenko336178a2012-10-31 15:46:27 +02004667 chan->hs_hchan = hchan;
Mat Martineau1500109b2012-10-23 15:24:15 -07004668 chan->hs_hcon->l2cap_data = chan->conn;
4669
Andrei Emeltchenko35ba9562012-10-25 15:20:43 +03004670 l2cap_send_efs_conf_rsp(chan, &rsp, chan->ident, 0);
Mat Martineau1500109b2012-10-23 15:24:15 -07004671
4672 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Andrei Emeltchenkofe79c6f2012-10-25 15:20:42 +03004673 int err;
Mat Martineau1500109b2012-10-23 15:24:15 -07004674
4675 set_default_fcs(chan);
4676
4677 err = l2cap_ertm_init(chan);
4678 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004679 l2cap_send_disconn_req(chan, -err);
Mat Martineau1500109b2012-10-23 15:24:15 -07004680 else
4681 l2cap_chan_ready(chan);
4682 }
4683}
4684
4685static void l2cap_logical_finish_move(struct l2cap_chan *chan,
4686 struct hci_chan *hchan)
4687{
4688 chan->hs_hcon = hchan->conn;
4689 chan->hs_hcon->l2cap_data = chan->conn;
4690
4691 BT_DBG("move_state %d", chan->move_state);
4692
4693 switch (chan->move_state) {
4694 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
4695 /* Move confirm will be sent after a success
4696 * response is received
4697 */
4698 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4699 break;
4700 case L2CAP_MOVE_WAIT_LOGICAL_CFM:
4701 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4702 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4703 } else if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
4704 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
4705 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
4706 } else if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4707 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4708 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4709 }
4710 break;
4711 default:
4712 /* Move was not in expected state, free the channel */
4713 __release_logical_link(chan);
4714
4715 chan->move_state = L2CAP_MOVE_STABLE;
4716 }
4717}
4718
4719/* Call with chan locked */
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004720void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan,
4721 u8 status)
Mat Martineau5b155ef2012-10-23 15:24:14 -07004722{
Mat Martineau1500109b2012-10-23 15:24:15 -07004723 BT_DBG("chan %p, hchan %p, status %d", chan, hchan, status);
4724
4725 if (status) {
4726 l2cap_logical_fail(chan);
4727 __release_logical_link(chan);
4728 return;
4729 }
4730
4731 if (chan->state != BT_CONNECTED) {
4732 /* Ignore logical link if channel is on BR/EDR */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004733 if (chan->local_amp_id != AMP_ID_BREDR)
Mat Martineau1500109b2012-10-23 15:24:15 -07004734 l2cap_logical_finish_create(chan, hchan);
4735 } else {
4736 l2cap_logical_finish_move(chan, hchan);
4737 }
Mat Martineau5b155ef2012-10-23 15:24:14 -07004738}
4739
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004740void l2cap_move_start(struct l2cap_chan *chan)
4741{
4742 BT_DBG("chan %p", chan);
4743
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004744 if (chan->local_amp_id == AMP_ID_BREDR) {
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004745 if (chan->chan_policy != BT_CHANNEL_POLICY_AMP_PREFERRED)
4746 return;
4747 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4748 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4749 /* Placeholder - start physical link setup */
4750 } else {
4751 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4752 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4753 chan->move_id = 0;
4754 l2cap_move_setup(chan);
4755 l2cap_send_move_chan_req(chan, 0);
4756 }
4757}
4758
Mat Martineau8eb200b2012-10-23 15:24:17 -07004759static void l2cap_do_create(struct l2cap_chan *chan, int result,
4760 u8 local_amp_id, u8 remote_amp_id)
4761{
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004762 BT_DBG("chan %p state %s %u -> %u", chan, state_to_string(chan->state),
4763 local_amp_id, remote_amp_id);
4764
Andrei Emeltchenko12d6cc62012-11-14 17:39:31 +02004765 chan->fcs = L2CAP_FCS_NONE;
4766
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004767 /* Outgoing channel on AMP */
4768 if (chan->state == BT_CONNECT) {
4769 if (result == L2CAP_CR_SUCCESS) {
4770 chan->local_amp_id = local_amp_id;
4771 l2cap_send_create_chan_req(chan, remote_amp_id);
4772 } else {
4773 /* Revert to BR/EDR connect */
4774 l2cap_send_conn_req(chan);
4775 }
4776
4777 return;
4778 }
4779
4780 /* Incoming channel on AMP */
4781 if (__l2cap_no_conn_pending(chan)) {
Mat Martineau8eb200b2012-10-23 15:24:17 -07004782 struct l2cap_conn_rsp rsp;
4783 char buf[128];
4784 rsp.scid = cpu_to_le16(chan->dcid);
4785 rsp.dcid = cpu_to_le16(chan->scid);
4786
Mat Martineau8eb200b2012-10-23 15:24:17 -07004787 if (result == L2CAP_CR_SUCCESS) {
4788 /* Send successful response */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004789 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
4790 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004791 } else {
4792 /* Send negative response */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004793 rsp.result = cpu_to_le16(L2CAP_CR_NO_MEM);
4794 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004795 }
4796
4797 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_RSP,
4798 sizeof(rsp), &rsp);
4799
4800 if (result == L2CAP_CR_SUCCESS) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02004801 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004802 set_bit(CONF_REQ_SENT, &chan->conf_state);
4803 l2cap_send_cmd(chan->conn, l2cap_get_ident(chan->conn),
4804 L2CAP_CONF_REQ,
4805 l2cap_build_conf_req(chan, buf), buf);
4806 chan->num_conf_req++;
4807 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004808 }
4809}
4810
4811static void l2cap_do_move_initiate(struct l2cap_chan *chan, u8 local_amp_id,
4812 u8 remote_amp_id)
4813{
4814 l2cap_move_setup(chan);
4815 chan->move_id = local_amp_id;
4816 chan->move_state = L2CAP_MOVE_WAIT_RSP;
4817
4818 l2cap_send_move_chan_req(chan, remote_amp_id);
4819}
4820
4821static void l2cap_do_move_respond(struct l2cap_chan *chan, int result)
4822{
4823 struct hci_chan *hchan = NULL;
4824
4825 /* Placeholder - get hci_chan for logical link */
4826
4827 if (hchan) {
4828 if (hchan->state == BT_CONNECTED) {
4829 /* Logical link is ready to go */
4830 chan->hs_hcon = hchan->conn;
4831 chan->hs_hcon->l2cap_data = chan->conn;
4832 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4833 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4834
4835 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
4836 } else {
4837 /* Wait for logical link to be ready */
4838 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4839 }
4840 } else {
4841 /* Logical link not available */
4842 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_ALLOWED);
4843 }
4844}
4845
4846static void l2cap_do_move_cancel(struct l2cap_chan *chan, int result)
4847{
4848 if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4849 u8 rsp_result;
4850 if (result == -EINVAL)
4851 rsp_result = L2CAP_MR_BAD_ID;
4852 else
4853 rsp_result = L2CAP_MR_NOT_ALLOWED;
4854
4855 l2cap_send_move_chan_rsp(chan, rsp_result);
4856 }
4857
4858 chan->move_role = L2CAP_MOVE_ROLE_NONE;
4859 chan->move_state = L2CAP_MOVE_STABLE;
4860
4861 /* Restart data transmission */
4862 l2cap_ertm_send(chan);
4863}
4864
Andrei Emeltchenkoa514b172012-11-14 17:39:30 +02004865/* Invoke with locked chan */
4866void __l2cap_physical_cfm(struct l2cap_chan *chan, int result)
Mat Martineau8eb200b2012-10-23 15:24:17 -07004867{
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004868 u8 local_amp_id = chan->local_amp_id;
Andrei Emeltchenkofffadc02012-11-01 15:37:03 +02004869 u8 remote_amp_id = chan->remote_amp_id;
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004870
Mat Martineau8eb200b2012-10-23 15:24:17 -07004871 BT_DBG("chan %p, result %d, local_amp_id %d, remote_amp_id %d",
4872 chan, result, local_amp_id, remote_amp_id);
4873
Mat Martineau8eb200b2012-10-23 15:24:17 -07004874 if (chan->state == BT_DISCONN || chan->state == BT_CLOSED) {
4875 l2cap_chan_unlock(chan);
4876 return;
4877 }
4878
4879 if (chan->state != BT_CONNECTED) {
4880 l2cap_do_create(chan, result, local_amp_id, remote_amp_id);
4881 } else if (result != L2CAP_MR_SUCCESS) {
4882 l2cap_do_move_cancel(chan, result);
4883 } else {
4884 switch (chan->move_role) {
4885 case L2CAP_MOVE_ROLE_INITIATOR:
4886 l2cap_do_move_initiate(chan, local_amp_id,
4887 remote_amp_id);
4888 break;
4889 case L2CAP_MOVE_ROLE_RESPONDER:
4890 l2cap_do_move_respond(chan, result);
4891 break;
4892 default:
4893 l2cap_do_move_cancel(chan, result);
4894 break;
4895 }
4896 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004897}
4898
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004899static inline int l2cap_move_channel_req(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004900 struct l2cap_cmd_hdr *cmd,
4901 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004902{
4903 struct l2cap_move_chan_req *req = data;
Mat Martineau1500109b2012-10-23 15:24:15 -07004904 struct l2cap_move_chan_rsp rsp;
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004905 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004906 u16 icid = 0;
4907 u16 result = L2CAP_MR_NOT_ALLOWED;
4908
4909 if (cmd_len != sizeof(*req))
4910 return -EPROTO;
4911
4912 icid = le16_to_cpu(req->icid);
4913
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004914 BT_DBG("icid 0x%4.4x, dest_amp_id %d", icid, req->dest_amp_id);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004915
Marcel Holtmann848566b2013-10-01 22:59:22 -07004916 if (!conn->hs_enabled)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004917 return -EINVAL;
4918
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004919 chan = l2cap_get_chan_by_dcid(conn, icid);
4920 if (!chan) {
Mat Martineau1500109b2012-10-23 15:24:15 -07004921 rsp.icid = cpu_to_le16(icid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004922 rsp.result = cpu_to_le16(L2CAP_MR_NOT_ALLOWED);
Mat Martineau1500109b2012-10-23 15:24:15 -07004923 l2cap_send_cmd(conn, cmd->ident, L2CAP_MOVE_CHAN_RSP,
4924 sizeof(rsp), &rsp);
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004925 return 0;
4926 }
4927
Mat Martineau1500109b2012-10-23 15:24:15 -07004928 chan->ident = cmd->ident;
4929
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004930 if (chan->scid < L2CAP_CID_DYN_START ||
4931 chan->chan_policy == BT_CHANNEL_POLICY_BREDR_ONLY ||
4932 (chan->mode != L2CAP_MODE_ERTM &&
4933 chan->mode != L2CAP_MODE_STREAMING)) {
4934 result = L2CAP_MR_NOT_ALLOWED;
4935 goto send_move_response;
4936 }
4937
4938 if (chan->local_amp_id == req->dest_amp_id) {
4939 result = L2CAP_MR_SAME_ID;
4940 goto send_move_response;
4941 }
4942
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004943 if (req->dest_amp_id != AMP_ID_BREDR) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004944 struct hci_dev *hdev;
4945 hdev = hci_dev_get(req->dest_amp_id);
4946 if (!hdev || hdev->dev_type != HCI_AMP ||
4947 !test_bit(HCI_UP, &hdev->flags)) {
4948 if (hdev)
4949 hci_dev_put(hdev);
4950
4951 result = L2CAP_MR_BAD_ID;
4952 goto send_move_response;
4953 }
4954 hci_dev_put(hdev);
4955 }
4956
4957 /* Detect a move collision. Only send a collision response
4958 * if this side has "lost", otherwise proceed with the move.
4959 * The winner has the larger bd_addr.
4960 */
4961 if ((__chan_is_moving(chan) ||
4962 chan->move_role != L2CAP_MOVE_ROLE_NONE) &&
Marcel Holtmann6f59b902013-10-13 05:24:01 -07004963 bacmp(&conn->hcon->src, &conn->hcon->dst) > 0) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004964 result = L2CAP_MR_COLLISION;
4965 goto send_move_response;
4966 }
4967
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004968 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
4969 l2cap_move_setup(chan);
4970 chan->move_id = req->dest_amp_id;
4971 icid = chan->dcid;
4972
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004973 if (req->dest_amp_id == AMP_ID_BREDR) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004974 /* Moving to BR/EDR */
4975 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4976 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4977 result = L2CAP_MR_PEND;
4978 } else {
4979 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4980 result = L2CAP_MR_SUCCESS;
4981 }
4982 } else {
4983 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4984 /* Placeholder - uncomment when amp functions are available */
4985 /*amp_accept_physical(chan, req->dest_amp_id);*/
4986 result = L2CAP_MR_PEND;
4987 }
4988
4989send_move_response:
Mat Martineau1500109b2012-10-23 15:24:15 -07004990 l2cap_send_move_chan_rsp(chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004991
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004992 l2cap_chan_unlock(chan);
4993
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004994 return 0;
4995}
4996
Mat Martineau5b155ef2012-10-23 15:24:14 -07004997static void l2cap_move_continue(struct l2cap_conn *conn, u16 icid, u16 result)
4998{
4999 struct l2cap_chan *chan;
5000 struct hci_chan *hchan = NULL;
5001
5002 chan = l2cap_get_chan_by_scid(conn, icid);
5003 if (!chan) {
5004 l2cap_send_move_chan_cfm_icid(conn, icid);
5005 return;
5006 }
5007
5008 __clear_chan_timer(chan);
5009 if (result == L2CAP_MR_PEND)
5010 __set_chan_timer(chan, L2CAP_MOVE_ERTX_TIMEOUT);
5011
5012 switch (chan->move_state) {
5013 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
5014 /* Move confirm will be sent when logical link
5015 * is complete.
5016 */
5017 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
5018 break;
5019 case L2CAP_MOVE_WAIT_RSP_SUCCESS:
5020 if (result == L2CAP_MR_PEND) {
5021 break;
5022 } else if (test_bit(CONN_LOCAL_BUSY,
5023 &chan->conn_state)) {
5024 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
5025 } else {
5026 /* Logical link is up or moving to BR/EDR,
5027 * proceed with move
5028 */
5029 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
5030 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
5031 }
5032 break;
5033 case L2CAP_MOVE_WAIT_RSP:
5034 /* Moving to AMP */
5035 if (result == L2CAP_MR_SUCCESS) {
5036 /* Remote is ready, send confirm immediately
5037 * after logical link is ready
5038 */
5039 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
5040 } else {
5041 /* Both logical link and move success
5042 * are required to confirm
5043 */
5044 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_COMP;
5045 }
5046
5047 /* Placeholder - get hci_chan for logical link */
5048 if (!hchan) {
5049 /* Logical link not available */
5050 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5051 break;
5052 }
5053
5054 /* If the logical link is not yet connected, do not
5055 * send confirmation.
5056 */
5057 if (hchan->state != BT_CONNECTED)
5058 break;
5059
5060 /* Logical link is already ready to go */
5061
5062 chan->hs_hcon = hchan->conn;
5063 chan->hs_hcon->l2cap_data = chan->conn;
5064
5065 if (result == L2CAP_MR_SUCCESS) {
5066 /* Can confirm now */
5067 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
5068 } else {
5069 /* Now only need move success
5070 * to confirm
5071 */
5072 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
5073 }
5074
5075 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
5076 break;
5077 default:
5078 /* Any other amp move state means the move failed. */
5079 chan->move_id = chan->local_amp_id;
5080 l2cap_move_done(chan);
5081 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5082 }
5083
5084 l2cap_chan_unlock(chan);
5085}
5086
5087static void l2cap_move_fail(struct l2cap_conn *conn, u8 ident, u16 icid,
5088 u16 result)
5089{
5090 struct l2cap_chan *chan;
5091
5092 chan = l2cap_get_chan_by_ident(conn, ident);
5093 if (!chan) {
5094 /* Could not locate channel, icid is best guess */
5095 l2cap_send_move_chan_cfm_icid(conn, icid);
5096 return;
5097 }
5098
5099 __clear_chan_timer(chan);
5100
5101 if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
5102 if (result == L2CAP_MR_COLLISION) {
5103 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
5104 } else {
5105 /* Cleanup - cancel move */
5106 chan->move_id = chan->local_amp_id;
5107 l2cap_move_done(chan);
5108 }
5109 }
5110
5111 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5112
5113 l2cap_chan_unlock(chan);
5114}
5115
5116static int l2cap_move_channel_rsp(struct l2cap_conn *conn,
5117 struct l2cap_cmd_hdr *cmd,
5118 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005119{
5120 struct l2cap_move_chan_rsp *rsp = data;
5121 u16 icid, result;
5122
5123 if (cmd_len != sizeof(*rsp))
5124 return -EPROTO;
5125
5126 icid = le16_to_cpu(rsp->icid);
5127 result = le16_to_cpu(rsp->result);
5128
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005129 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005130
Mat Martineau5b155ef2012-10-23 15:24:14 -07005131 if (result == L2CAP_MR_SUCCESS || result == L2CAP_MR_PEND)
5132 l2cap_move_continue(conn, icid, result);
5133 else
5134 l2cap_move_fail(conn, cmd->ident, icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005135
5136 return 0;
5137}
5138
Mat Martineau5f3847a2012-10-23 15:24:12 -07005139static int l2cap_move_channel_confirm(struct l2cap_conn *conn,
5140 struct l2cap_cmd_hdr *cmd,
5141 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005142{
5143 struct l2cap_move_chan_cfm *cfm = data;
Mat Martineau5f3847a2012-10-23 15:24:12 -07005144 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005145 u16 icid, result;
5146
5147 if (cmd_len != sizeof(*cfm))
5148 return -EPROTO;
5149
5150 icid = le16_to_cpu(cfm->icid);
5151 result = le16_to_cpu(cfm->result);
5152
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005153 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005154
Mat Martineau5f3847a2012-10-23 15:24:12 -07005155 chan = l2cap_get_chan_by_dcid(conn, icid);
5156 if (!chan) {
5157 /* Spec requires a response even if the icid was not found */
5158 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5159 return 0;
5160 }
5161
5162 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM) {
5163 if (result == L2CAP_MC_CONFIRMED) {
5164 chan->local_amp_id = chan->move_id;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005165 if (chan->local_amp_id == AMP_ID_BREDR)
Mat Martineau5f3847a2012-10-23 15:24:12 -07005166 __release_logical_link(chan);
5167 } else {
5168 chan->move_id = chan->local_amp_id;
5169 }
5170
5171 l2cap_move_done(chan);
5172 }
5173
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005174 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5175
Mat Martineau5f3847a2012-10-23 15:24:12 -07005176 l2cap_chan_unlock(chan);
5177
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005178 return 0;
5179}
5180
5181static inline int l2cap_move_channel_confirm_rsp(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005182 struct l2cap_cmd_hdr *cmd,
5183 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005184{
5185 struct l2cap_move_chan_cfm_rsp *rsp = data;
Mat Martineau3fd71a02012-10-23 15:24:16 -07005186 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005187 u16 icid;
5188
5189 if (cmd_len != sizeof(*rsp))
5190 return -EPROTO;
5191
5192 icid = le16_to_cpu(rsp->icid);
5193
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005194 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005195
Mat Martineau3fd71a02012-10-23 15:24:16 -07005196 chan = l2cap_get_chan_by_scid(conn, icid);
5197 if (!chan)
5198 return 0;
5199
5200 __clear_chan_timer(chan);
5201
5202 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM_RSP) {
5203 chan->local_amp_id = chan->move_id;
5204
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005205 if (chan->local_amp_id == AMP_ID_BREDR && chan->hs_hchan)
Mat Martineau3fd71a02012-10-23 15:24:16 -07005206 __release_logical_link(chan);
5207
5208 l2cap_move_done(chan);
5209 }
5210
5211 l2cap_chan_unlock(chan);
5212
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005213 return 0;
5214}
5215
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03005216static inline int l2cap_check_conn_param(u16 min, u16 max, u16 latency,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005217 u16 to_multiplier)
Claudio Takahaside731152011-02-11 19:28:55 -02005218{
5219 u16 max_latency;
5220
5221 if (min > max || min < 6 || max > 3200)
5222 return -EINVAL;
5223
5224 if (to_multiplier < 10 || to_multiplier > 3200)
5225 return -EINVAL;
5226
5227 if (max >= to_multiplier * 8)
5228 return -EINVAL;
5229
5230 max_latency = (to_multiplier * 8 / max) - 1;
5231 if (latency > 499 || latency > max_latency)
5232 return -EINVAL;
5233
5234 return 0;
5235}
5236
5237static inline int l2cap_conn_param_update_req(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005238 struct l2cap_cmd_hdr *cmd,
Johan Hedberg203e6392013-05-15 10:07:15 +03005239 u16 cmd_len, u8 *data)
Claudio Takahaside731152011-02-11 19:28:55 -02005240{
5241 struct hci_conn *hcon = conn->hcon;
5242 struct l2cap_conn_param_update_req *req;
5243 struct l2cap_conn_param_update_rsp rsp;
Johan Hedberg203e6392013-05-15 10:07:15 +03005244 u16 min, max, latency, to_multiplier;
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005245 int err;
Claudio Takahaside731152011-02-11 19:28:55 -02005246
5247 if (!(hcon->link_mode & HCI_LM_MASTER))
5248 return -EINVAL;
5249
Claudio Takahaside731152011-02-11 19:28:55 -02005250 if (cmd_len != sizeof(struct l2cap_conn_param_update_req))
5251 return -EPROTO;
5252
5253 req = (struct l2cap_conn_param_update_req *) data;
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03005254 min = __le16_to_cpu(req->min);
5255 max = __le16_to_cpu(req->max);
Claudio Takahaside731152011-02-11 19:28:55 -02005256 latency = __le16_to_cpu(req->latency);
5257 to_multiplier = __le16_to_cpu(req->to_multiplier);
5258
5259 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 +01005260 min, max, latency, to_multiplier);
Claudio Takahaside731152011-02-11 19:28:55 -02005261
5262 memset(&rsp, 0, sizeof(rsp));
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005263
5264 err = l2cap_check_conn_param(min, max, latency, to_multiplier);
5265 if (err)
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005266 rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_REJECTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005267 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005268 rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_ACCEPTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005269
5270 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONN_PARAM_UPDATE_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005271 sizeof(rsp), &rsp);
Claudio Takahaside731152011-02-11 19:28:55 -02005272
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005273 if (!err)
5274 hci_le_conn_update(hcon, min, max, latency, to_multiplier);
5275
Claudio Takahaside731152011-02-11 19:28:55 -02005276 return 0;
5277}
5278
Johan Hedbergf1496de2013-05-13 14:15:56 +03005279static int l2cap_le_connect_rsp(struct l2cap_conn *conn,
5280 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5281 u8 *data)
5282{
5283 struct l2cap_le_conn_rsp *rsp = (struct l2cap_le_conn_rsp *) data;
5284 u16 dcid, mtu, mps, credits, result;
5285 struct l2cap_chan *chan;
5286 int err;
5287
5288 if (cmd_len < sizeof(*rsp))
5289 return -EPROTO;
5290
5291 dcid = __le16_to_cpu(rsp->dcid);
5292 mtu = __le16_to_cpu(rsp->mtu);
5293 mps = __le16_to_cpu(rsp->mps);
5294 credits = __le16_to_cpu(rsp->credits);
5295 result = __le16_to_cpu(rsp->result);
5296
5297 if (result == L2CAP_CR_SUCCESS && (mtu < 23 || mps < 23))
5298 return -EPROTO;
5299
5300 BT_DBG("dcid 0x%4.4x mtu %u mps %u credits %u result 0x%2.2x",
5301 dcid, mtu, mps, credits, result);
5302
5303 mutex_lock(&conn->chan_lock);
5304
5305 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5306 if (!chan) {
5307 err = -EBADSLT;
5308 goto unlock;
5309 }
5310
5311 err = 0;
5312
5313 l2cap_chan_lock(chan);
5314
5315 switch (result) {
5316 case L2CAP_CR_SUCCESS:
5317 chan->ident = 0;
5318 chan->dcid = dcid;
5319 chan->omtu = mtu;
5320 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005321 chan->tx_credits = credits;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005322 l2cap_chan_ready(chan);
5323 break;
5324
5325 default:
5326 l2cap_chan_del(chan, ECONNREFUSED);
5327 break;
5328 }
5329
5330 l2cap_chan_unlock(chan);
5331
5332unlock:
5333 mutex_unlock(&conn->chan_lock);
5334
5335 return err;
5336}
5337
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005338static inline int l2cap_bredr_sig_cmd(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005339 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5340 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005341{
5342 int err = 0;
5343
5344 switch (cmd->code) {
5345 case L2CAP_COMMAND_REJ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005346 l2cap_command_rej(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005347 break;
5348
5349 case L2CAP_CONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005350 err = l2cap_connect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005351 break;
5352
5353 case L2CAP_CONN_RSP:
Mat Martineauf5a25982012-10-11 17:48:21 +03005354 case L2CAP_CREATE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005355 l2cap_connect_create_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005356 break;
5357
5358 case L2CAP_CONF_REQ:
5359 err = l2cap_config_req(conn, cmd, cmd_len, data);
5360 break;
5361
5362 case L2CAP_CONF_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005363 l2cap_config_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005364 break;
5365
5366 case L2CAP_DISCONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005367 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005368 break;
5369
5370 case L2CAP_DISCONN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005371 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005372 break;
5373
5374 case L2CAP_ECHO_REQ:
5375 l2cap_send_cmd(conn, cmd->ident, L2CAP_ECHO_RSP, cmd_len, data);
5376 break;
5377
5378 case L2CAP_ECHO_RSP:
5379 break;
5380
5381 case L2CAP_INFO_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005382 err = l2cap_information_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005383 break;
5384
5385 case L2CAP_INFO_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005386 l2cap_information_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005387 break;
5388
Mat Martineauf94ff6f2011-11-02 16:18:32 -07005389 case L2CAP_CREATE_CHAN_REQ:
5390 err = l2cap_create_channel_req(conn, cmd, cmd_len, data);
5391 break;
5392
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005393 case L2CAP_MOVE_CHAN_REQ:
5394 err = l2cap_move_channel_req(conn, cmd, cmd_len, data);
5395 break;
5396
5397 case L2CAP_MOVE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005398 l2cap_move_channel_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005399 break;
5400
5401 case L2CAP_MOVE_CHAN_CFM:
5402 err = l2cap_move_channel_confirm(conn, cmd, cmd_len, data);
5403 break;
5404
5405 case L2CAP_MOVE_CHAN_CFM_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005406 l2cap_move_channel_confirm_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005407 break;
5408
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005409 default:
5410 BT_ERR("Unknown BR/EDR signaling command 0x%2.2x", cmd->code);
5411 err = -EINVAL;
5412 break;
5413 }
5414
5415 return err;
5416}
5417
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005418static int l2cap_le_connect_req(struct l2cap_conn *conn,
5419 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5420 u8 *data)
5421{
5422 struct l2cap_le_conn_req *req = (struct l2cap_le_conn_req *) data;
5423 struct l2cap_le_conn_rsp rsp;
5424 struct l2cap_chan *chan, *pchan;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005425 u16 dcid, scid, credits, mtu, mps;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005426 __le16 psm;
5427 u8 result;
5428
5429 if (cmd_len != sizeof(*req))
5430 return -EPROTO;
5431
5432 scid = __le16_to_cpu(req->scid);
5433 mtu = __le16_to_cpu(req->mtu);
5434 mps = __le16_to_cpu(req->mps);
5435 psm = req->psm;
5436 dcid = 0;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005437 credits = 0;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005438
5439 if (mtu < 23 || mps < 23)
5440 return -EPROTO;
5441
5442 BT_DBG("psm 0x%2.2x scid 0x%4.4x mtu %u mps %u", __le16_to_cpu(psm),
5443 scid, mtu, mps);
5444
5445 /* Check if we have socket listening on psm */
5446 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
5447 &conn->hcon->dst, LE_LINK);
5448 if (!pchan) {
5449 result = L2CAP_CR_BAD_PSM;
5450 chan = NULL;
5451 goto response;
5452 }
5453
5454 mutex_lock(&conn->chan_lock);
5455 l2cap_chan_lock(pchan);
5456
5457 if (!smp_sufficient_security(conn->hcon, pchan->sec_level)) {
5458 result = L2CAP_CR_AUTHENTICATION;
5459 chan = NULL;
5460 goto response_unlock;
5461 }
5462
5463 /* Check if we already have channel with that dcid */
5464 if (__l2cap_get_chan_by_dcid(conn, scid)) {
5465 result = L2CAP_CR_NO_MEM;
5466 chan = NULL;
5467 goto response_unlock;
5468 }
5469
5470 chan = pchan->ops->new_connection(pchan);
5471 if (!chan) {
5472 result = L2CAP_CR_NO_MEM;
5473 goto response_unlock;
5474 }
5475
Johan Hedberg0ce43ce2013-12-05 14:55:33 +02005476 l2cap_le_flowctl_init(chan);
5477
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005478 bacpy(&chan->src, &conn->hcon->src);
5479 bacpy(&chan->dst, &conn->hcon->dst);
5480 chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type);
5481 chan->dst_type = bdaddr_type(conn->hcon, conn->hcon->dst_type);
5482 chan->psm = psm;
5483 chan->dcid = scid;
5484 chan->omtu = mtu;
5485 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005486 chan->tx_credits = __le16_to_cpu(req->credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005487
5488 __l2cap_chan_add(conn, chan);
5489 dcid = chan->scid;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005490 credits = chan->rx_credits;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005491
5492 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
5493
5494 chan->ident = cmd->ident;
5495
5496 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
5497 l2cap_state_change(chan, BT_CONNECT2);
5498 result = L2CAP_CR_PEND;
5499 chan->ops->defer(chan);
5500 } else {
5501 l2cap_chan_ready(chan);
5502 result = L2CAP_CR_SUCCESS;
5503 }
5504
5505response_unlock:
5506 l2cap_chan_unlock(pchan);
5507 mutex_unlock(&conn->chan_lock);
5508
5509 if (result == L2CAP_CR_PEND)
5510 return 0;
5511
5512response:
5513 if (chan) {
5514 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02005515 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005516 } else {
5517 rsp.mtu = 0;
5518 rsp.mps = 0;
5519 }
5520
5521 rsp.dcid = cpu_to_le16(dcid);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005522 rsp.credits = cpu_to_le16(credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005523 rsp.result = cpu_to_le16(result);
5524
5525 l2cap_send_cmd(conn, cmd->ident, L2CAP_LE_CONN_RSP, sizeof(rsp), &rsp);
5526
5527 return 0;
5528}
5529
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005530static inline int l2cap_le_credits(struct l2cap_conn *conn,
5531 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5532 u8 *data)
5533{
5534 struct l2cap_le_credits *pkt;
5535 struct l2cap_chan *chan;
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005536 u16 cid, credits, max_credits;
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005537
5538 if (cmd_len != sizeof(*pkt))
5539 return -EPROTO;
5540
5541 pkt = (struct l2cap_le_credits *) data;
5542 cid = __le16_to_cpu(pkt->cid);
5543 credits = __le16_to_cpu(pkt->credits);
5544
5545 BT_DBG("cid 0x%4.4x credits 0x%4.4x", cid, credits);
5546
5547 chan = l2cap_get_chan_by_dcid(conn, cid);
5548 if (!chan)
5549 return -EBADSLT;
5550
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005551 max_credits = LE_FLOWCTL_MAX_CREDITS - chan->tx_credits;
5552 if (credits > max_credits) {
5553 BT_ERR("LE credits overflow");
5554 l2cap_send_disconn_req(chan, ECONNRESET);
5555
5556 /* Return 0 so that we don't trigger an unnecessary
5557 * command reject packet.
5558 */
5559 return 0;
5560 }
5561
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005562 chan->tx_credits += credits;
5563
5564 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
5565 l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
5566 chan->tx_credits--;
5567 }
5568
5569 if (chan->tx_credits)
5570 chan->ops->resume(chan);
5571
5572 l2cap_chan_unlock(chan);
5573
5574 return 0;
5575}
5576
Johan Hedberg71fb4192013-12-10 10:52:48 +02005577static inline int l2cap_le_command_rej(struct l2cap_conn *conn,
5578 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5579 u8 *data)
5580{
5581 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
5582 struct l2cap_chan *chan;
5583
5584 if (cmd_len < sizeof(*rej))
5585 return -EPROTO;
5586
5587 mutex_lock(&conn->chan_lock);
5588
5589 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5590 if (!chan)
5591 goto done;
5592
5593 l2cap_chan_lock(chan);
5594 l2cap_chan_del(chan, ECONNREFUSED);
5595 l2cap_chan_unlock(chan);
5596
5597done:
5598 mutex_unlock(&conn->chan_lock);
5599 return 0;
5600}
5601
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005602static inline int l2cap_le_sig_cmd(struct l2cap_conn *conn,
Johan Hedberg203e6392013-05-15 10:07:15 +03005603 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5604 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005605{
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005606 int err = 0;
5607
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005608 switch (cmd->code) {
5609 case L2CAP_COMMAND_REJ:
Johan Hedberg71fb4192013-12-10 10:52:48 +02005610 l2cap_le_command_rej(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005611 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005612
5613 case L2CAP_CONN_PARAM_UPDATE_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005614 err = l2cap_conn_param_update_req(conn, cmd, cmd_len, data);
5615 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005616
5617 case L2CAP_CONN_PARAM_UPDATE_RSP:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005618 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005619
Johan Hedbergf1496de2013-05-13 14:15:56 +03005620 case L2CAP_LE_CONN_RSP:
5621 l2cap_le_connect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005622 break;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005623
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005624 case L2CAP_LE_CONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005625 err = l2cap_le_connect_req(conn, cmd, cmd_len, data);
5626 break;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005627
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005628 case L2CAP_LE_CREDITS:
5629 err = l2cap_le_credits(conn, cmd, cmd_len, data);
5630 break;
5631
Johan Hedberg3defe012013-05-15 10:16:06 +03005632 case L2CAP_DISCONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005633 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
5634 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005635
5636 case L2CAP_DISCONN_RSP:
5637 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005638 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005639
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005640 default:
5641 BT_ERR("Unknown LE signaling command 0x%2.2x", cmd->code);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005642 err = -EINVAL;
5643 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005644 }
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005645
5646 return err;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005647}
5648
Johan Hedbergc5623552013-04-29 19:35:33 +03005649static inline void l2cap_le_sig_channel(struct l2cap_conn *conn,
5650 struct sk_buff *skb)
5651{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005652 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005653 struct l2cap_cmd_hdr *cmd;
5654 u16 len;
Johan Hedbergc5623552013-04-29 19:35:33 +03005655 int err;
5656
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005657 if (hcon->type != LE_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005658 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005659
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005660 if (skb->len < L2CAP_CMD_HDR_SIZE)
5661 goto drop;
Johan Hedbergc5623552013-04-29 19:35:33 +03005662
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005663 cmd = (void *) skb->data;
5664 skb_pull(skb, L2CAP_CMD_HDR_SIZE);
Johan Hedbergc5623552013-04-29 19:35:33 +03005665
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005666 len = le16_to_cpu(cmd->len);
Johan Hedbergc5623552013-04-29 19:35:33 +03005667
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005668 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd->code, len, cmd->ident);
Johan Hedbergc5623552013-04-29 19:35:33 +03005669
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005670 if (len != skb->len || !cmd->ident) {
5671 BT_DBG("corrupted command");
5672 goto drop;
5673 }
Johan Hedbergc5623552013-04-29 19:35:33 +03005674
Johan Hedberg203e6392013-05-15 10:07:15 +03005675 err = l2cap_le_sig_cmd(conn, cmd, len, skb->data);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005676 if (err) {
5677 struct l2cap_cmd_rej_unk rej;
Johan Hedbergc5623552013-04-29 19:35:33 +03005678
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005679 BT_ERR("Wrong link type (%d)", err);
Johan Hedbergc5623552013-04-29 19:35:33 +03005680
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005681 rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005682 l2cap_send_cmd(conn, cmd->ident, L2CAP_COMMAND_REJ,
5683 sizeof(rej), &rej);
Johan Hedbergc5623552013-04-29 19:35:33 +03005684 }
5685
Marcel Holtmann3b166292013-10-02 08:28:21 -07005686drop:
Johan Hedbergc5623552013-04-29 19:35:33 +03005687 kfree_skb(skb);
5688}
5689
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005690static inline void l2cap_sig_channel(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005691 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005692{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005693 struct hci_conn *hcon = conn->hcon;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005694 u8 *data = skb->data;
5695 int len = skb->len;
5696 struct l2cap_cmd_hdr cmd;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005697 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005698
5699 l2cap_raw_recv(conn, skb);
5700
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005701 if (hcon->type != ACL_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005702 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005703
Linus Torvalds1da177e2005-04-16 15:20:36 -07005704 while (len >= L2CAP_CMD_HDR_SIZE) {
Al Viro88219a02007-07-29 00:17:25 -07005705 u16 cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005706 memcpy(&cmd, data, L2CAP_CMD_HDR_SIZE);
5707 data += L2CAP_CMD_HDR_SIZE;
5708 len -= L2CAP_CMD_HDR_SIZE;
5709
Al Viro88219a02007-07-29 00:17:25 -07005710 cmd_len = le16_to_cpu(cmd.len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005711
Gustavo Padovan2d792812012-10-06 10:07:01 +01005712 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd.code, cmd_len,
5713 cmd.ident);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005714
Al Viro88219a02007-07-29 00:17:25 -07005715 if (cmd_len > len || !cmd.ident) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005716 BT_DBG("corrupted command");
5717 break;
5718 }
5719
Johan Hedbergc5623552013-04-29 19:35:33 +03005720 err = l2cap_bredr_sig_cmd(conn, &cmd, cmd_len, data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005721 if (err) {
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03005722 struct l2cap_cmd_rej_unk rej;
Gustavo F. Padovan2c6d1a22011-03-23 14:38:32 -03005723
5724 BT_ERR("Wrong link type (%d)", err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005725
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005726 rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Gustavo Padovan2d792812012-10-06 10:07:01 +01005727 l2cap_send_cmd(conn, cmd.ident, L2CAP_COMMAND_REJ,
5728 sizeof(rej), &rej);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005729 }
5730
Al Viro88219a02007-07-29 00:17:25 -07005731 data += cmd_len;
5732 len -= cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005733 }
5734
Marcel Holtmann3b166292013-10-02 08:28:21 -07005735drop:
Linus Torvalds1da177e2005-04-16 15:20:36 -07005736 kfree_skb(skb);
5737}
5738
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005739static int l2cap_check_fcs(struct l2cap_chan *chan, struct sk_buff *skb)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005740{
5741 u16 our_fcs, rcv_fcs;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03005742 int hdr_size;
5743
5744 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
5745 hdr_size = L2CAP_EXT_HDR_SIZE;
5746 else
5747 hdr_size = L2CAP_ENH_HDR_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005748
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005749 if (chan->fcs == L2CAP_FCS_CRC16) {
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005750 skb_trim(skb, skb->len - L2CAP_FCS_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005751 rcv_fcs = get_unaligned_le16(skb->data + skb->len);
5752 our_fcs = crc16(0, skb->data - hdr_size, skb->len + hdr_size);
5753
5754 if (our_fcs != rcv_fcs)
João Paulo Rechi Vita7a560e52010-06-22 13:56:27 -03005755 return -EBADMSG;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005756 }
5757 return 0;
5758}
5759
Mat Martineau6ea00482012-05-17 20:53:52 -07005760static void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan)
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005761{
Mat Martineaue31f7632012-05-17 20:53:41 -07005762 struct l2cap_ctrl control;
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005763
Mat Martineaue31f7632012-05-17 20:53:41 -07005764 BT_DBG("chan %p", chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005765
Mat Martineaue31f7632012-05-17 20:53:41 -07005766 memset(&control, 0, sizeof(control));
5767 control.sframe = 1;
5768 control.final = 1;
5769 control.reqseq = chan->buffer_seq;
5770 set_bit(CONN_SEND_FBIT, &chan->conn_state);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005771
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005772 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
Mat Martineaue31f7632012-05-17 20:53:41 -07005773 control.super = L2CAP_SUPER_RNR;
5774 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005775 }
5776
Mat Martineaue31f7632012-05-17 20:53:41 -07005777 if (test_and_clear_bit(CONN_REMOTE_BUSY, &chan->conn_state) &&
5778 chan->unacked_frames > 0)
5779 __set_retrans_timer(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005780
Mat Martineaue31f7632012-05-17 20:53:41 -07005781 /* Send pending iframes */
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03005782 l2cap_ertm_send(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005783
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005784 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
Mat Martineaue31f7632012-05-17 20:53:41 -07005785 test_bit(CONN_SEND_FBIT, &chan->conn_state)) {
5786 /* F-bit wasn't sent in an s-frame or i-frame yet, so
5787 * send it now.
5788 */
5789 control.super = L2CAP_SUPER_RR;
5790 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005791 }
5792}
5793
Gustavo Padovan2d792812012-10-06 10:07:01 +01005794static void append_skb_frag(struct sk_buff *skb, struct sk_buff *new_frag,
5795 struct sk_buff **last_frag)
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005796{
Mat Martineau84084a32011-07-22 14:54:00 -07005797 /* skb->len reflects data in skb as well as all fragments
5798 * skb->data_len reflects only data in fragments
5799 */
5800 if (!skb_has_frag_list(skb))
5801 skb_shinfo(skb)->frag_list = new_frag;
5802
5803 new_frag->next = NULL;
5804
5805 (*last_frag)->next = new_frag;
5806 *last_frag = new_frag;
5807
5808 skb->len += new_frag->len;
5809 skb->data_len += new_frag->len;
5810 skb->truesize += new_frag->truesize;
5811}
5812
Mat Martineau4b51dae92012-05-17 20:53:37 -07005813static int l2cap_reassemble_sdu(struct l2cap_chan *chan, struct sk_buff *skb,
5814 struct l2cap_ctrl *control)
Mat Martineau84084a32011-07-22 14:54:00 -07005815{
5816 int err = -EINVAL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005817
Mat Martineau4b51dae92012-05-17 20:53:37 -07005818 switch (control->sar) {
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005819 case L2CAP_SAR_UNSEGMENTED:
Mat Martineau84084a32011-07-22 14:54:00 -07005820 if (chan->sdu)
5821 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005822
Gustavo Padovan80b98022012-05-27 22:27:51 -03005823 err = chan->ops->recv(chan, skb);
Mat Martineau84084a32011-07-22 14:54:00 -07005824 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005825
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005826 case L2CAP_SAR_START:
Mat Martineau84084a32011-07-22 14:54:00 -07005827 if (chan->sdu)
5828 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005829
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005830 chan->sdu_len = get_unaligned_le16(skb->data);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005831 skb_pull(skb, L2CAP_SDULEN_SIZE);
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005832
Mat Martineau84084a32011-07-22 14:54:00 -07005833 if (chan->sdu_len > chan->imtu) {
5834 err = -EMSGSIZE;
5835 break;
5836 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005837
Mat Martineau84084a32011-07-22 14:54:00 -07005838 if (skb->len >= chan->sdu_len)
5839 break;
5840
5841 chan->sdu = skb;
5842 chan->sdu_last_frag = skb;
5843
5844 skb = NULL;
5845 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005846 break;
5847
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005848 case L2CAP_SAR_CONTINUE:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005849 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005850 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005851
Mat Martineau84084a32011-07-22 14:54:00 -07005852 append_skb_frag(chan->sdu, skb,
5853 &chan->sdu_last_frag);
5854 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005855
Mat Martineau84084a32011-07-22 14:54:00 -07005856 if (chan->sdu->len >= chan->sdu_len)
5857 break;
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005858
Mat Martineau84084a32011-07-22 14:54:00 -07005859 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005860 break;
5861
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005862 case L2CAP_SAR_END:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005863 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005864 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005865
Mat Martineau84084a32011-07-22 14:54:00 -07005866 append_skb_frag(chan->sdu, skb,
5867 &chan->sdu_last_frag);
5868 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005869
Mat Martineau84084a32011-07-22 14:54:00 -07005870 if (chan->sdu->len != chan->sdu_len)
5871 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005872
Gustavo Padovan80b98022012-05-27 22:27:51 -03005873 err = chan->ops->recv(chan, chan->sdu);
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005874
Mat Martineau84084a32011-07-22 14:54:00 -07005875 if (!err) {
5876 /* Reassembly complete */
5877 chan->sdu = NULL;
5878 chan->sdu_last_frag = NULL;
5879 chan->sdu_len = 0;
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005880 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005881 break;
5882 }
5883
Mat Martineau84084a32011-07-22 14:54:00 -07005884 if (err) {
5885 kfree_skb(skb);
5886 kfree_skb(chan->sdu);
5887 chan->sdu = NULL;
5888 chan->sdu_last_frag = NULL;
5889 chan->sdu_len = 0;
5890 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005891
Mat Martineau84084a32011-07-22 14:54:00 -07005892 return err;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005893}
5894
Mat Martineau32b32732012-10-23 15:24:11 -07005895static int l2cap_resegment(struct l2cap_chan *chan)
5896{
5897 /* Placeholder */
5898 return 0;
5899}
5900
Mat Martineaue3281402011-07-07 09:39:02 -07005901void l2cap_chan_busy(struct l2cap_chan *chan, int busy)
Gustavo F. Padovan712132e2010-06-21 19:39:50 -03005902{
Mat Martineau61aa4f52012-05-17 20:53:40 -07005903 u8 event;
5904
5905 if (chan->mode != L2CAP_MODE_ERTM)
5906 return;
5907
5908 event = busy ? L2CAP_EV_LOCAL_BUSY_DETECTED : L2CAP_EV_LOCAL_BUSY_CLEAR;
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03005909 l2cap_tx(chan, NULL, NULL, event);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005910}
5911
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005912static int l2cap_rx_queued_iframes(struct l2cap_chan *chan)
5913{
Mat Martineau63838722012-05-17 20:53:45 -07005914 int err = 0;
5915 /* Pass sequential frames to l2cap_reassemble_sdu()
5916 * until a gap is encountered.
5917 */
5918
5919 BT_DBG("chan %p", chan);
5920
5921 while (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
5922 struct sk_buff *skb;
5923 BT_DBG("Searching for skb with txseq %d (queue len %d)",
5924 chan->buffer_seq, skb_queue_len(&chan->srej_q));
5925
5926 skb = l2cap_ertm_seq_in_queue(&chan->srej_q, chan->buffer_seq);
5927
5928 if (!skb)
5929 break;
5930
5931 skb_unlink(skb, &chan->srej_q);
5932 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
5933 err = l2cap_reassemble_sdu(chan, skb, &bt_cb(skb)->control);
5934 if (err)
5935 break;
5936 }
5937
5938 if (skb_queue_empty(&chan->srej_q)) {
5939 chan->rx_state = L2CAP_RX_STATE_RECV;
5940 l2cap_send_ack(chan);
5941 }
5942
5943 return err;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005944}
5945
5946static void l2cap_handle_srej(struct l2cap_chan *chan,
5947 struct l2cap_ctrl *control)
5948{
Mat Martineauf80842a2012-05-17 20:53:46 -07005949 struct sk_buff *skb;
5950
5951 BT_DBG("chan %p, control %p", chan, control);
5952
5953 if (control->reqseq == chan->next_tx_seq) {
5954 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005955 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005956 return;
5957 }
5958
5959 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
5960
5961 if (skb == NULL) {
5962 BT_DBG("Seq %d not available for retransmission",
5963 control->reqseq);
5964 return;
5965 }
5966
5967 if (chan->max_tx != 0 && bt_cb(skb)->control.retries >= chan->max_tx) {
5968 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005969 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005970 return;
5971 }
5972
5973 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
5974
5975 if (control->poll) {
5976 l2cap_pass_to_tx(chan, control);
5977
5978 set_bit(CONN_SEND_FBIT, &chan->conn_state);
5979 l2cap_retransmit(chan, control);
5980 l2cap_ertm_send(chan);
5981
5982 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5983 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5984 chan->srej_save_reqseq = control->reqseq;
5985 }
5986 } else {
5987 l2cap_pass_to_tx_fbit(chan, control);
5988
5989 if (control->final) {
5990 if (chan->srej_save_reqseq != control->reqseq ||
5991 !test_and_clear_bit(CONN_SREJ_ACT,
5992 &chan->conn_state))
5993 l2cap_retransmit(chan, control);
5994 } else {
5995 l2cap_retransmit(chan, control);
5996 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5997 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5998 chan->srej_save_reqseq = control->reqseq;
5999 }
6000 }
6001 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006002}
6003
6004static void l2cap_handle_rej(struct l2cap_chan *chan,
6005 struct l2cap_ctrl *control)
6006{
Mat Martineaufcd289d2012-05-17 20:53:47 -07006007 struct sk_buff *skb;
6008
6009 BT_DBG("chan %p, control %p", chan, control);
6010
6011 if (control->reqseq == chan->next_tx_seq) {
6012 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006013 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07006014 return;
6015 }
6016
6017 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
6018
6019 if (chan->max_tx && skb &&
6020 bt_cb(skb)->control.retries >= chan->max_tx) {
6021 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006022 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07006023 return;
6024 }
6025
6026 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6027
6028 l2cap_pass_to_tx(chan, control);
6029
6030 if (control->final) {
6031 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state))
6032 l2cap_retransmit_all(chan, control);
6033 } else {
6034 l2cap_retransmit_all(chan, control);
6035 l2cap_ertm_send(chan);
6036 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F)
6037 set_bit(CONN_REJ_ACT, &chan->conn_state);
6038 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006039}
6040
Mat Martineau4b51dae92012-05-17 20:53:37 -07006041static u8 l2cap_classify_txseq(struct l2cap_chan *chan, u16 txseq)
6042{
6043 BT_DBG("chan %p, txseq %d", chan, txseq);
6044
6045 BT_DBG("last_acked_seq %d, expected_tx_seq %d", chan->last_acked_seq,
6046 chan->expected_tx_seq);
6047
6048 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
6049 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
Gustavo Padovan2d792812012-10-06 10:07:01 +01006050 chan->tx_win) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07006051 /* See notes below regarding "double poll" and
6052 * invalid packets.
6053 */
6054 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
6055 BT_DBG("Invalid/Ignore - after SREJ");
6056 return L2CAP_TXSEQ_INVALID_IGNORE;
6057 } else {
6058 BT_DBG("Invalid - in window after SREJ sent");
6059 return L2CAP_TXSEQ_INVALID;
6060 }
6061 }
6062
6063 if (chan->srej_list.head == txseq) {
6064 BT_DBG("Expected SREJ");
6065 return L2CAP_TXSEQ_EXPECTED_SREJ;
6066 }
6067
6068 if (l2cap_ertm_seq_in_queue(&chan->srej_q, txseq)) {
6069 BT_DBG("Duplicate SREJ - txseq already stored");
6070 return L2CAP_TXSEQ_DUPLICATE_SREJ;
6071 }
6072
6073 if (l2cap_seq_list_contains(&chan->srej_list, txseq)) {
6074 BT_DBG("Unexpected SREJ - not requested");
6075 return L2CAP_TXSEQ_UNEXPECTED_SREJ;
6076 }
6077 }
6078
6079 if (chan->expected_tx_seq == txseq) {
6080 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
6081 chan->tx_win) {
6082 BT_DBG("Invalid - txseq outside tx window");
6083 return L2CAP_TXSEQ_INVALID;
6084 } else {
6085 BT_DBG("Expected");
6086 return L2CAP_TXSEQ_EXPECTED;
6087 }
6088 }
6089
6090 if (__seq_offset(chan, txseq, chan->last_acked_seq) <
Gustavo Padovan2d792812012-10-06 10:07:01 +01006091 __seq_offset(chan, chan->expected_tx_seq, chan->last_acked_seq)) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07006092 BT_DBG("Duplicate - expected_tx_seq later than txseq");
6093 return L2CAP_TXSEQ_DUPLICATE;
6094 }
6095
6096 if (__seq_offset(chan, txseq, chan->last_acked_seq) >= chan->tx_win) {
6097 /* A source of invalid packets is a "double poll" condition,
6098 * where delays cause us to send multiple poll packets. If
6099 * the remote stack receives and processes both polls,
6100 * sequence numbers can wrap around in such a way that a
6101 * resent frame has a sequence number that looks like new data
6102 * with a sequence gap. This would trigger an erroneous SREJ
6103 * request.
6104 *
6105 * Fortunately, this is impossible with a tx window that's
6106 * less than half of the maximum sequence number, which allows
6107 * invalid frames to be safely ignored.
6108 *
6109 * With tx window sizes greater than half of the tx window
6110 * maximum, the frame is invalid and cannot be ignored. This
6111 * causes a disconnect.
6112 */
6113
6114 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
6115 BT_DBG("Invalid/Ignore - txseq outside tx window");
6116 return L2CAP_TXSEQ_INVALID_IGNORE;
6117 } else {
6118 BT_DBG("Invalid - txseq outside tx window");
6119 return L2CAP_TXSEQ_INVALID;
6120 }
6121 } else {
6122 BT_DBG("Unexpected - txseq indicates missing frames");
6123 return L2CAP_TXSEQ_UNEXPECTED;
6124 }
6125}
6126
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006127static int l2cap_rx_state_recv(struct l2cap_chan *chan,
6128 struct l2cap_ctrl *control,
6129 struct sk_buff *skb, u8 event)
6130{
6131 int err = 0;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006132 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006133
6134 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6135 event);
6136
6137 switch (event) {
6138 case L2CAP_EV_RECV_IFRAME:
6139 switch (l2cap_classify_txseq(chan, control->txseq)) {
6140 case L2CAP_TXSEQ_EXPECTED:
6141 l2cap_pass_to_tx(chan, control);
6142
6143 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6144 BT_DBG("Busy, discarding expected seq %d",
6145 control->txseq);
6146 break;
6147 }
6148
6149 chan->expected_tx_seq = __next_seq(chan,
6150 control->txseq);
6151
6152 chan->buffer_seq = chan->expected_tx_seq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006153 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006154
6155 err = l2cap_reassemble_sdu(chan, skb, control);
6156 if (err)
6157 break;
6158
6159 if (control->final) {
6160 if (!test_and_clear_bit(CONN_REJ_ACT,
6161 &chan->conn_state)) {
6162 control->final = 0;
6163 l2cap_retransmit_all(chan, control);
6164 l2cap_ertm_send(chan);
6165 }
6166 }
6167
6168 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
6169 l2cap_send_ack(chan);
6170 break;
6171 case L2CAP_TXSEQ_UNEXPECTED:
6172 l2cap_pass_to_tx(chan, control);
6173
6174 /* Can't issue SREJ frames in the local busy state.
6175 * Drop this frame, it will be seen as missing
6176 * when local busy is exited.
6177 */
6178 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6179 BT_DBG("Busy, discarding unexpected seq %d",
6180 control->txseq);
6181 break;
6182 }
6183
6184 /* There was a gap in the sequence, so an SREJ
6185 * must be sent for each missing frame. The
6186 * current frame is stored for later use.
6187 */
6188 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006189 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006190 BT_DBG("Queued %p (queue len %d)", skb,
6191 skb_queue_len(&chan->srej_q));
6192
6193 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
6194 l2cap_seq_list_clear(&chan->srej_list);
6195 l2cap_send_srej(chan, control->txseq);
6196
6197 chan->rx_state = L2CAP_RX_STATE_SREJ_SENT;
6198 break;
6199 case L2CAP_TXSEQ_DUPLICATE:
6200 l2cap_pass_to_tx(chan, control);
6201 break;
6202 case L2CAP_TXSEQ_INVALID_IGNORE:
6203 break;
6204 case L2CAP_TXSEQ_INVALID:
6205 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006206 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006207 break;
6208 }
6209 break;
6210 case L2CAP_EV_RECV_RR:
6211 l2cap_pass_to_tx(chan, control);
6212 if (control->final) {
6213 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6214
Mat Martineaue6a3ee62012-10-23 15:24:22 -07006215 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state) &&
6216 !__chan_is_moving(chan)) {
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006217 control->final = 0;
6218 l2cap_retransmit_all(chan, control);
6219 }
6220
6221 l2cap_ertm_send(chan);
6222 } else if (control->poll) {
6223 l2cap_send_i_or_rr_or_rnr(chan);
6224 } else {
6225 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6226 &chan->conn_state) &&
6227 chan->unacked_frames)
6228 __set_retrans_timer(chan);
6229
6230 l2cap_ertm_send(chan);
6231 }
6232 break;
6233 case L2CAP_EV_RECV_RNR:
6234 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6235 l2cap_pass_to_tx(chan, control);
6236 if (control && control->poll) {
6237 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6238 l2cap_send_rr_or_rnr(chan, 0);
6239 }
6240 __clear_retrans_timer(chan);
6241 l2cap_seq_list_clear(&chan->retrans_list);
6242 break;
6243 case L2CAP_EV_RECV_REJ:
6244 l2cap_handle_rej(chan, control);
6245 break;
6246 case L2CAP_EV_RECV_SREJ:
6247 l2cap_handle_srej(chan, control);
6248 break;
6249 default:
6250 break;
6251 }
6252
6253 if (skb && !skb_in_use) {
6254 BT_DBG("Freeing %p", skb);
6255 kfree_skb(skb);
6256 }
6257
6258 return err;
6259}
6260
6261static int l2cap_rx_state_srej_sent(struct l2cap_chan *chan,
6262 struct l2cap_ctrl *control,
6263 struct sk_buff *skb, u8 event)
6264{
6265 int err = 0;
6266 u16 txseq = control->txseq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006267 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006268
6269 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6270 event);
6271
6272 switch (event) {
6273 case L2CAP_EV_RECV_IFRAME:
6274 switch (l2cap_classify_txseq(chan, txseq)) {
6275 case L2CAP_TXSEQ_EXPECTED:
6276 /* Keep frame for reassembly later */
6277 l2cap_pass_to_tx(chan, control);
6278 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006279 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006280 BT_DBG("Queued %p (queue len %d)", skb,
6281 skb_queue_len(&chan->srej_q));
6282
6283 chan->expected_tx_seq = __next_seq(chan, txseq);
6284 break;
6285 case L2CAP_TXSEQ_EXPECTED_SREJ:
6286 l2cap_seq_list_pop(&chan->srej_list);
6287
6288 l2cap_pass_to_tx(chan, control);
6289 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006290 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006291 BT_DBG("Queued %p (queue len %d)", skb,
6292 skb_queue_len(&chan->srej_q));
6293
6294 err = l2cap_rx_queued_iframes(chan);
6295 if (err)
6296 break;
6297
6298 break;
6299 case L2CAP_TXSEQ_UNEXPECTED:
6300 /* Got a frame that can't be reassembled yet.
6301 * Save it for later, and send SREJs to cover
6302 * the missing frames.
6303 */
6304 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006305 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006306 BT_DBG("Queued %p (queue len %d)", skb,
6307 skb_queue_len(&chan->srej_q));
6308
6309 l2cap_pass_to_tx(chan, control);
6310 l2cap_send_srej(chan, control->txseq);
6311 break;
6312 case L2CAP_TXSEQ_UNEXPECTED_SREJ:
6313 /* This frame was requested with an SREJ, but
6314 * some expected retransmitted frames are
6315 * missing. Request retransmission of missing
6316 * SREJ'd frames.
6317 */
6318 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006319 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006320 BT_DBG("Queued %p (queue len %d)", skb,
6321 skb_queue_len(&chan->srej_q));
6322
6323 l2cap_pass_to_tx(chan, control);
6324 l2cap_send_srej_list(chan, control->txseq);
6325 break;
6326 case L2CAP_TXSEQ_DUPLICATE_SREJ:
6327 /* We've already queued this frame. Drop this copy. */
6328 l2cap_pass_to_tx(chan, control);
6329 break;
6330 case L2CAP_TXSEQ_DUPLICATE:
6331 /* Expecting a later sequence number, so this frame
6332 * was already received. Ignore it completely.
6333 */
6334 break;
6335 case L2CAP_TXSEQ_INVALID_IGNORE:
6336 break;
6337 case L2CAP_TXSEQ_INVALID:
6338 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006339 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006340 break;
6341 }
6342 break;
6343 case L2CAP_EV_RECV_RR:
6344 l2cap_pass_to_tx(chan, control);
6345 if (control->final) {
6346 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6347
6348 if (!test_and_clear_bit(CONN_REJ_ACT,
6349 &chan->conn_state)) {
6350 control->final = 0;
6351 l2cap_retransmit_all(chan, control);
6352 }
6353
6354 l2cap_ertm_send(chan);
6355 } else if (control->poll) {
6356 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6357 &chan->conn_state) &&
6358 chan->unacked_frames) {
6359 __set_retrans_timer(chan);
6360 }
6361
6362 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6363 l2cap_send_srej_tail(chan);
6364 } else {
6365 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6366 &chan->conn_state) &&
6367 chan->unacked_frames)
6368 __set_retrans_timer(chan);
6369
6370 l2cap_send_ack(chan);
6371 }
6372 break;
6373 case L2CAP_EV_RECV_RNR:
6374 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6375 l2cap_pass_to_tx(chan, control);
6376 if (control->poll) {
6377 l2cap_send_srej_tail(chan);
6378 } else {
6379 struct l2cap_ctrl rr_control;
6380 memset(&rr_control, 0, sizeof(rr_control));
6381 rr_control.sframe = 1;
6382 rr_control.super = L2CAP_SUPER_RR;
6383 rr_control.reqseq = chan->buffer_seq;
6384 l2cap_send_sframe(chan, &rr_control);
6385 }
6386
6387 break;
6388 case L2CAP_EV_RECV_REJ:
6389 l2cap_handle_rej(chan, control);
6390 break;
6391 case L2CAP_EV_RECV_SREJ:
6392 l2cap_handle_srej(chan, control);
6393 break;
6394 }
6395
6396 if (skb && !skb_in_use) {
6397 BT_DBG("Freeing %p", skb);
6398 kfree_skb(skb);
6399 }
6400
6401 return err;
6402}
6403
Mat Martineau32b32732012-10-23 15:24:11 -07006404static int l2cap_finish_move(struct l2cap_chan *chan)
6405{
6406 BT_DBG("chan %p", chan);
6407
6408 chan->rx_state = L2CAP_RX_STATE_RECV;
6409
6410 if (chan->hs_hcon)
6411 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6412 else
6413 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6414
6415 return l2cap_resegment(chan);
6416}
6417
6418static int l2cap_rx_state_wait_p(struct l2cap_chan *chan,
6419 struct l2cap_ctrl *control,
6420 struct sk_buff *skb, u8 event)
6421{
6422 int err;
6423
6424 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6425 event);
6426
6427 if (!control->poll)
6428 return -EPROTO;
6429
6430 l2cap_process_reqseq(chan, control->reqseq);
6431
6432 if (!skb_queue_empty(&chan->tx_q))
6433 chan->tx_send_head = skb_peek(&chan->tx_q);
6434 else
6435 chan->tx_send_head = NULL;
6436
6437 /* Rewind next_tx_seq to the point expected
6438 * by the receiver.
6439 */
6440 chan->next_tx_seq = control->reqseq;
6441 chan->unacked_frames = 0;
6442
6443 err = l2cap_finish_move(chan);
6444 if (err)
6445 return err;
6446
6447 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6448 l2cap_send_i_or_rr_or_rnr(chan);
6449
6450 if (event == L2CAP_EV_RECV_IFRAME)
6451 return -EPROTO;
6452
6453 return l2cap_rx_state_recv(chan, control, NULL, event);
6454}
6455
6456static int l2cap_rx_state_wait_f(struct l2cap_chan *chan,
6457 struct l2cap_ctrl *control,
6458 struct sk_buff *skb, u8 event)
6459{
6460 int err;
6461
6462 if (!control->final)
6463 return -EPROTO;
6464
6465 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6466
6467 chan->rx_state = L2CAP_RX_STATE_RECV;
6468 l2cap_process_reqseq(chan, control->reqseq);
6469
6470 if (!skb_queue_empty(&chan->tx_q))
6471 chan->tx_send_head = skb_peek(&chan->tx_q);
6472 else
6473 chan->tx_send_head = NULL;
6474
6475 /* Rewind next_tx_seq to the point expected
6476 * by the receiver.
6477 */
6478 chan->next_tx_seq = control->reqseq;
6479 chan->unacked_frames = 0;
6480
6481 if (chan->hs_hcon)
6482 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6483 else
6484 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6485
6486 err = l2cap_resegment(chan);
6487
6488 if (!err)
6489 err = l2cap_rx_state_recv(chan, control, skb, event);
6490
6491 return err;
6492}
6493
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006494static bool __valid_reqseq(struct l2cap_chan *chan, u16 reqseq)
6495{
6496 /* Make sure reqseq is for a packet that has been sent but not acked */
6497 u16 unacked;
6498
6499 unacked = __seq_offset(chan, chan->next_tx_seq, chan->expected_ack_seq);
6500 return __seq_offset(chan, chan->next_tx_seq, reqseq) <= unacked;
6501}
6502
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006503static int l2cap_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6504 struct sk_buff *skb, u8 event)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006505{
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006506 int err = 0;
6507
6508 BT_DBG("chan %p, control %p, skb %p, event %d, state %d", chan,
6509 control, skb, event, chan->rx_state);
6510
6511 if (__valid_reqseq(chan, control->reqseq)) {
6512 switch (chan->rx_state) {
6513 case L2CAP_RX_STATE_RECV:
6514 err = l2cap_rx_state_recv(chan, control, skb, event);
6515 break;
6516 case L2CAP_RX_STATE_SREJ_SENT:
6517 err = l2cap_rx_state_srej_sent(chan, control, skb,
6518 event);
6519 break;
Mat Martineau32b32732012-10-23 15:24:11 -07006520 case L2CAP_RX_STATE_WAIT_P:
6521 err = l2cap_rx_state_wait_p(chan, control, skb, event);
6522 break;
6523 case L2CAP_RX_STATE_WAIT_F:
6524 err = l2cap_rx_state_wait_f(chan, control, skb, event);
6525 break;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006526 default:
6527 /* shut it down */
6528 break;
6529 }
6530 } else {
6531 BT_DBG("Invalid reqseq %d (next_tx_seq %d, expected_ack_seq %d",
6532 control->reqseq, chan->next_tx_seq,
6533 chan->expected_ack_seq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006534 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006535 }
6536
6537 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006538}
6539
6540static int l2cap_stream_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6541 struct sk_buff *skb)
6542{
Mat Martineau4b51dae92012-05-17 20:53:37 -07006543 int err = 0;
6544
6545 BT_DBG("chan %p, control %p, skb %p, state %d", chan, control, skb,
6546 chan->rx_state);
6547
6548 if (l2cap_classify_txseq(chan, control->txseq) ==
6549 L2CAP_TXSEQ_EXPECTED) {
6550 l2cap_pass_to_tx(chan, control);
6551
6552 BT_DBG("buffer_seq %d->%d", chan->buffer_seq,
6553 __next_seq(chan, chan->buffer_seq));
6554
6555 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
6556
6557 l2cap_reassemble_sdu(chan, skb, control);
6558 } else {
6559 if (chan->sdu) {
6560 kfree_skb(chan->sdu);
6561 chan->sdu = NULL;
6562 }
6563 chan->sdu_last_frag = NULL;
6564 chan->sdu_len = 0;
6565
6566 if (skb) {
6567 BT_DBG("Freeing %p", skb);
6568 kfree_skb(skb);
6569 }
6570 }
6571
6572 chan->last_acked_seq = control->txseq;
6573 chan->expected_tx_seq = __next_seq(chan, control->txseq);
6574
6575 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006576}
6577
6578static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6579{
6580 struct l2cap_ctrl *control = &bt_cb(skb)->control;
6581 u16 len;
6582 u8 event;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006583
Mat Martineaub76bbd62012-04-11 10:48:43 -07006584 __unpack_control(chan, skb);
6585
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006586 len = skb->len;
6587
6588 /*
6589 * We can just drop the corrupted I-frame here.
6590 * Receiver will miss it and start proper recovery
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006591 * procedures and ask for retransmission.
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006592 */
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006593 if (l2cap_check_fcs(chan, skb))
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006594 goto drop;
6595
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006596 if (!control->sframe && control->sar == L2CAP_SAR_START)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006597 len -= L2CAP_SDULEN_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006598
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006599 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006600 len -= L2CAP_FCS_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006601
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006602 if (len > chan->mps) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006603 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006604 goto drop;
6605 }
6606
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006607 if (!control->sframe) {
6608 int err;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006609
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006610 BT_DBG("iframe sar %d, reqseq %d, final %d, txseq %d",
6611 control->sar, control->reqseq, control->final,
6612 control->txseq);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03006613
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006614 /* Validate F-bit - F=0 always valid, F=1 only
6615 * valid in TX WAIT_F
6616 */
6617 if (control->final && chan->tx_state != L2CAP_TX_STATE_WAIT_F)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006618 goto drop;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006619
6620 if (chan->mode != L2CAP_MODE_STREAMING) {
6621 event = L2CAP_EV_RECV_IFRAME;
6622 err = l2cap_rx(chan, control, skb, event);
6623 } else {
6624 err = l2cap_stream_rx(chan, control, skb);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006625 }
6626
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006627 if (err)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006628 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006629 } else {
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006630 const u8 rx_func_to_event[4] = {
6631 L2CAP_EV_RECV_RR, L2CAP_EV_RECV_REJ,
6632 L2CAP_EV_RECV_RNR, L2CAP_EV_RECV_SREJ
6633 };
6634
6635 /* Only I-frames are expected in streaming mode */
6636 if (chan->mode == L2CAP_MODE_STREAMING)
6637 goto drop;
6638
6639 BT_DBG("sframe reqseq %d, final %d, poll %d, super %d",
6640 control->reqseq, control->final, control->poll,
6641 control->super);
6642
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006643 if (len != 0) {
Andrei Emeltchenko1bb166e2012-11-20 17:16:21 +02006644 BT_ERR("Trailing bytes: %d in sframe", len);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006645 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006646 goto drop;
6647 }
6648
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006649 /* Validate F and P bits */
6650 if (control->final && (control->poll ||
6651 chan->tx_state != L2CAP_TX_STATE_WAIT_F))
6652 goto drop;
6653
6654 event = rx_func_to_event[control->super];
6655 if (l2cap_rx(chan, control, skb, event))
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006656 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006657 }
6658
6659 return 0;
6660
6661drop:
6662 kfree_skb(skb);
6663 return 0;
6664}
6665
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006666static void l2cap_chan_le_send_credits(struct l2cap_chan *chan)
6667{
6668 struct l2cap_conn *conn = chan->conn;
6669 struct l2cap_le_credits pkt;
6670 u16 return_credits;
6671
6672 /* We return more credits to the sender only after the amount of
6673 * credits falls below half of the initial amount.
6674 */
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02006675 if (chan->rx_credits >= (le_max_credits + 1) / 2)
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006676 return;
6677
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02006678 return_credits = le_max_credits - chan->rx_credits;
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006679
6680 BT_DBG("chan %p returning %u credits to sender", chan, return_credits);
6681
6682 chan->rx_credits += return_credits;
6683
6684 pkt.cid = cpu_to_le16(chan->scid);
6685 pkt.credits = cpu_to_le16(return_credits);
6686
6687 chan->ident = l2cap_get_ident(conn);
6688
6689 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CREDITS, sizeof(pkt), &pkt);
6690}
6691
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006692static int l2cap_le_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6693{
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006694 int err;
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006695
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006696 if (!chan->rx_credits) {
6697 BT_ERR("No credits to receive LE L2CAP data");
Johan Hedbergdfd97742014-01-27 15:11:34 -08006698 l2cap_send_disconn_req(chan, ECONNRESET);
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006699 return -ENOBUFS;
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006700 }
6701
6702 if (chan->imtu < skb->len) {
6703 BT_ERR("Too big LE L2CAP PDU");
6704 return -ENOBUFS;
6705 }
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006706
6707 chan->rx_credits--;
6708 BT_DBG("rx_credits %u -> %u", chan->rx_credits + 1, chan->rx_credits);
6709
6710 l2cap_chan_le_send_credits(chan);
6711
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006712 err = 0;
6713
6714 if (!chan->sdu) {
6715 u16 sdu_len;
6716
6717 sdu_len = get_unaligned_le16(skb->data);
6718 skb_pull(skb, L2CAP_SDULEN_SIZE);
6719
6720 BT_DBG("Start of new SDU. sdu_len %u skb->len %u imtu %u",
6721 sdu_len, skb->len, chan->imtu);
6722
6723 if (sdu_len > chan->imtu) {
6724 BT_ERR("Too big LE L2CAP SDU length received");
6725 err = -EMSGSIZE;
6726 goto failed;
6727 }
6728
6729 if (skb->len > sdu_len) {
6730 BT_ERR("Too much LE L2CAP data received");
6731 err = -EINVAL;
6732 goto failed;
6733 }
6734
6735 if (skb->len == sdu_len)
6736 return chan->ops->recv(chan, skb);
6737
6738 chan->sdu = skb;
6739 chan->sdu_len = sdu_len;
6740 chan->sdu_last_frag = skb;
6741
6742 return 0;
6743 }
6744
6745 BT_DBG("SDU fragment. chan->sdu->len %u skb->len %u chan->sdu_len %u",
6746 chan->sdu->len, skb->len, chan->sdu_len);
6747
6748 if (chan->sdu->len + skb->len > chan->sdu_len) {
6749 BT_ERR("Too much LE L2CAP data received");
6750 err = -EINVAL;
6751 goto failed;
6752 }
6753
6754 append_skb_frag(chan->sdu, skb, &chan->sdu_last_frag);
6755 skb = NULL;
6756
6757 if (chan->sdu->len == chan->sdu_len) {
6758 err = chan->ops->recv(chan, chan->sdu);
6759 if (!err) {
6760 chan->sdu = NULL;
6761 chan->sdu_last_frag = NULL;
6762 chan->sdu_len = 0;
6763 }
6764 }
6765
6766failed:
6767 if (err) {
6768 kfree_skb(skb);
6769 kfree_skb(chan->sdu);
6770 chan->sdu = NULL;
6771 chan->sdu_last_frag = NULL;
6772 chan->sdu_len = 0;
6773 }
6774
6775 /* We can't return an error here since we took care of the skb
6776 * freeing internally. An error return would cause the caller to
6777 * do a double-free of the skb.
6778 */
6779 return 0;
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006780}
6781
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006782static void l2cap_data_channel(struct l2cap_conn *conn, u16 cid,
6783 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006784{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006785 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006786
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03006787 chan = l2cap_get_chan_by_scid(conn, cid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006788 if (!chan) {
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006789 if (cid == L2CAP_CID_A2MP) {
6790 chan = a2mp_channel_create(conn, skb);
6791 if (!chan) {
6792 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006793 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006794 }
6795
6796 l2cap_chan_lock(chan);
6797 } else {
6798 BT_DBG("unknown cid 0x%4.4x", cid);
6799 /* Drop packet and return */
6800 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006801 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006802 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006803 }
6804
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03006805 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006806
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03006807 if (chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006808 goto drop;
6809
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006810 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03006811 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006812 if (l2cap_le_data_rcv(chan, skb) < 0)
6813 goto drop;
6814
6815 goto done;
6816
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006817 case L2CAP_MODE_BASIC:
6818 /* If socket recv buffers overflows we drop data here
6819 * which is *bad* because L2CAP has to be reliable.
6820 * But we don't have any other choice. L2CAP doesn't
6821 * provide flow control mechanism. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07006822
Szymon Janc2c96e032014-02-18 20:48:34 +01006823 if (chan->imtu < skb->len) {
6824 BT_ERR("Dropping L2CAP data: receive buffer overflow");
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006825 goto drop;
Szymon Janc2c96e032014-02-18 20:48:34 +01006826 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006827
Gustavo Padovan80b98022012-05-27 22:27:51 -03006828 if (!chan->ops->recv(chan, skb))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006829 goto done;
6830 break;
6831
6832 case L2CAP_MODE_ERTM:
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006833 case L2CAP_MODE_STREAMING:
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006834 l2cap_data_rcv(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006835 goto done;
6836
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006837 default:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006838 BT_DBG("chan %p: bad mode 0x%2.2x", chan, chan->mode);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006839 break;
6840 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006841
6842drop:
6843 kfree_skb(skb);
6844
6845done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006846 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006847}
6848
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006849static void l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm,
6850 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006851{
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006852 struct hci_conn *hcon = conn->hcon;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006853 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006854
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006855 if (hcon->type != ACL_LINK)
6856 goto drop;
6857
Johan Hedbergbf20fd42013-05-14 13:23:13 +03006858 chan = l2cap_global_chan_by_psm(0, psm, &hcon->src, &hcon->dst,
6859 ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006860 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006861 goto drop;
6862
Andrei Emeltchenko5b4ceda2012-02-24 16:35:32 +02006863 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006864
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03006865 if (chan->state != BT_BOUND && chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006866 goto drop;
6867
Vinicius Costa Gomese13e21d2011-06-17 22:46:27 -03006868 if (chan->imtu < skb->len)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006869 goto drop;
6870
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006871 /* Store remote BD_ADDR and PSM for msg_name */
Marcel Holtmann06ae3312013-10-18 03:43:00 -07006872 bacpy(&bt_cb(skb)->bdaddr, &hcon->dst);
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006873 bt_cb(skb)->psm = psm;
6874
Gustavo Padovan80b98022012-05-27 22:27:51 -03006875 if (!chan->ops->recv(chan, skb))
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006876 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006877
6878drop:
6879 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006880}
6881
Marcel Holtmann72f78352013-04-23 00:59:00 -07006882static void l2cap_att_channel(struct l2cap_conn *conn,
Andrei Emeltchenko6810fca2012-05-31 11:18:57 +03006883 struct sk_buff *skb)
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006884{
Marcel Holtmannb99707d2013-10-03 02:54:11 -07006885 struct hci_conn *hcon = conn->hcon;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006886 struct l2cap_chan *chan;
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006887
Marcel Holtmannb99707d2013-10-03 02:54:11 -07006888 if (hcon->type != LE_LINK)
6889 goto drop;
6890
Johan Hedbergaf1c0132013-04-29 19:35:42 +03006891 chan = l2cap_global_chan_by_scid(BT_CONNECTED, L2CAP_CID_ATT,
Marcel Holtmann06ae3312013-10-18 03:43:00 -07006892 &hcon->src, &hcon->dst);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006893 if (!chan)
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006894 goto drop;
6895
Andrei Emeltchenko5b4ceda2012-02-24 16:35:32 +02006896 BT_DBG("chan %p, len %d", chan, skb->len);
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006897
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07006898 if (hci_blacklist_lookup(hcon->hdev, &hcon->dst, hcon->dst_type))
6899 goto drop;
6900
Vinicius Costa Gomese13e21d2011-06-17 22:46:27 -03006901 if (chan->imtu < skb->len)
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006902 goto drop;
6903
Gustavo Padovan80b98022012-05-27 22:27:51 -03006904 if (!chan->ops->recv(chan, skb))
Andrei Emeltchenko6810fca2012-05-31 11:18:57 +03006905 return;
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006906
6907drop:
6908 kfree_skb(skb);
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006909}
6910
Linus Torvalds1da177e2005-04-16 15:20:36 -07006911static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb)
6912{
6913 struct l2cap_hdr *lh = (void *) skb->data;
Johan Hedberg61a939c2014-01-17 20:45:11 +02006914 struct hci_conn *hcon = conn->hcon;
Al Viro8e036fc2007-07-29 00:16:36 -07006915 u16 cid, len;
6916 __le16 psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006917
Johan Hedberg61a939c2014-01-17 20:45:11 +02006918 if (hcon->state != BT_CONNECTED) {
6919 BT_DBG("queueing pending rx skb");
6920 skb_queue_tail(&conn->pending_rx, skb);
6921 return;
6922 }
6923
Linus Torvalds1da177e2005-04-16 15:20:36 -07006924 skb_pull(skb, L2CAP_HDR_SIZE);
6925 cid = __le16_to_cpu(lh->cid);
6926 len = __le16_to_cpu(lh->len);
6927
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006928 if (len != skb->len) {
6929 kfree_skb(skb);
6930 return;
6931 }
6932
Linus Torvalds1da177e2005-04-16 15:20:36 -07006933 BT_DBG("len %d, cid 0x%4.4x", len, cid);
6934
6935 switch (cid) {
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006936 case L2CAP_CID_SIGNALING:
Linus Torvalds1da177e2005-04-16 15:20:36 -07006937 l2cap_sig_channel(conn, skb);
6938 break;
6939
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006940 case L2CAP_CID_CONN_LESS:
Andrei Emeltchenko097db762012-03-09 14:16:17 +02006941 psm = get_unaligned((__le16 *) skb->data);
Andrei Emeltchenko0181a702012-05-29 10:04:05 +03006942 skb_pull(skb, L2CAP_PSMLEN_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006943 l2cap_conless_channel(conn, psm, skb);
6944 break;
6945
Johan Hedberg073d1cf2013-04-29 19:35:35 +03006946 case L2CAP_CID_ATT:
Marcel Holtmann72f78352013-04-23 00:59:00 -07006947 l2cap_att_channel(conn, skb);
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006948 break;
6949
Marcel Holtmanna2877622013-10-02 23:46:54 -07006950 case L2CAP_CID_LE_SIGNALING:
6951 l2cap_le_sig_channel(conn, skb);
6952 break;
6953
Anderson Brigliab501d6a2011-06-07 18:46:31 -03006954 case L2CAP_CID_SMP:
6955 if (smp_sig_channel(conn, skb))
6956 l2cap_conn_del(conn->hcon, EACCES);
6957 break;
6958
Linus Torvalds1da177e2005-04-16 15:20:36 -07006959 default:
6960 l2cap_data_channel(conn, cid, skb);
6961 break;
6962 }
6963}
6964
Johan Hedberg61a939c2014-01-17 20:45:11 +02006965static void process_pending_rx(struct work_struct *work)
6966{
6967 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
6968 pending_rx_work);
6969 struct sk_buff *skb;
6970
6971 BT_DBG("");
6972
6973 while ((skb = skb_dequeue(&conn->pending_rx)))
6974 l2cap_recv_frame(conn, skb);
6975}
6976
Johan Hedberg162b49e2014-01-17 20:45:10 +02006977static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon)
6978{
6979 struct l2cap_conn *conn = hcon->l2cap_data;
6980 struct hci_chan *hchan;
6981
6982 if (conn)
6983 return conn;
6984
6985 hchan = hci_chan_create(hcon);
6986 if (!hchan)
6987 return NULL;
6988
6989 conn = kzalloc(sizeof(struct l2cap_conn), GFP_KERNEL);
6990 if (!conn) {
6991 hci_chan_del(hchan);
6992 return NULL;
6993 }
6994
6995 kref_init(&conn->ref);
6996 hcon->l2cap_data = conn;
6997 conn->hcon = hcon;
6998 hci_conn_get(conn->hcon);
6999 conn->hchan = hchan;
7000
7001 BT_DBG("hcon %p conn %p hchan %p", hcon, conn, hchan);
7002
7003 switch (hcon->type) {
7004 case LE_LINK:
7005 if (hcon->hdev->le_mtu) {
7006 conn->mtu = hcon->hdev->le_mtu;
7007 break;
7008 }
7009 /* fall through */
7010 default:
7011 conn->mtu = hcon->hdev->acl_mtu;
7012 break;
7013 }
7014
7015 conn->feat_mask = 0;
7016
7017 if (hcon->type == ACL_LINK)
7018 conn->hs_enabled = test_bit(HCI_HS_ENABLED,
7019 &hcon->hdev->dev_flags);
7020
7021 spin_lock_init(&conn->lock);
7022 mutex_init(&conn->chan_lock);
7023
7024 INIT_LIST_HEAD(&conn->chan_l);
7025 INIT_LIST_HEAD(&conn->users);
7026
7027 if (hcon->type == LE_LINK)
7028 INIT_DELAYED_WORK(&conn->security_timer, security_timeout);
7029 else
7030 INIT_DELAYED_WORK(&conn->info_timer, l2cap_info_timeout);
7031
Johan Hedberg61a939c2014-01-17 20:45:11 +02007032 skb_queue_head_init(&conn->pending_rx);
7033 INIT_WORK(&conn->pending_rx_work, process_pending_rx);
7034
Johan Hedberg162b49e2014-01-17 20:45:10 +02007035 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
7036
7037 return conn;
7038}
7039
7040static bool is_valid_psm(u16 psm, u8 dst_type) {
7041 if (!psm)
7042 return false;
7043
7044 if (bdaddr_type_is_le(dst_type))
7045 return (psm <= 0x00ff);
7046
7047 /* PSM must be odd and lsb of upper byte must be 0 */
7048 return ((psm & 0x0101) == 0x0001);
7049}
7050
7051int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
7052 bdaddr_t *dst, u8 dst_type)
7053{
7054 struct l2cap_conn *conn;
7055 struct hci_conn *hcon;
7056 struct hci_dev *hdev;
7057 __u8 auth_type;
7058 int err;
7059
7060 BT_DBG("%pMR -> %pMR (type %u) psm 0x%2.2x", &chan->src, dst,
7061 dst_type, __le16_to_cpu(psm));
7062
7063 hdev = hci_get_route(dst, &chan->src);
7064 if (!hdev)
7065 return -EHOSTUNREACH;
7066
7067 hci_dev_lock(hdev);
7068
7069 l2cap_chan_lock(chan);
7070
7071 if (!is_valid_psm(__le16_to_cpu(psm), dst_type) && !cid &&
7072 chan->chan_type != L2CAP_CHAN_RAW) {
7073 err = -EINVAL;
7074 goto done;
7075 }
7076
Johan Hedberg21626e62014-01-24 10:35:41 +02007077 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED && !psm) {
7078 err = -EINVAL;
7079 goto done;
7080 }
7081
7082 if (chan->chan_type == L2CAP_CHAN_FIXED && !cid) {
Johan Hedberg162b49e2014-01-17 20:45:10 +02007083 err = -EINVAL;
7084 goto done;
7085 }
7086
7087 switch (chan->mode) {
7088 case L2CAP_MODE_BASIC:
7089 break;
7090 case L2CAP_MODE_LE_FLOWCTL:
7091 l2cap_le_flowctl_init(chan);
7092 break;
7093 case L2CAP_MODE_ERTM:
7094 case L2CAP_MODE_STREAMING:
7095 if (!disable_ertm)
7096 break;
7097 /* fall through */
7098 default:
7099 err = -ENOTSUPP;
7100 goto done;
7101 }
7102
7103 switch (chan->state) {
7104 case BT_CONNECT:
7105 case BT_CONNECT2:
7106 case BT_CONFIG:
7107 /* Already connecting */
7108 err = 0;
7109 goto done;
7110
7111 case BT_CONNECTED:
7112 /* Already connected */
7113 err = -EISCONN;
7114 goto done;
7115
7116 case BT_OPEN:
7117 case BT_BOUND:
7118 /* Can connect */
7119 break;
7120
7121 default:
7122 err = -EBADFD;
7123 goto done;
7124 }
7125
7126 /* Set destination address and psm */
7127 bacpy(&chan->dst, dst);
7128 chan->dst_type = dst_type;
7129
7130 chan->psm = psm;
7131 chan->dcid = cid;
7132
7133 auth_type = l2cap_get_auth_type(chan);
7134
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007135 if (bdaddr_type_is_le(dst_type)) {
7136 /* Convert from L2CAP channel address type to HCI address type
7137 */
7138 if (dst_type == BDADDR_LE_PUBLIC)
7139 dst_type = ADDR_LE_DEV_PUBLIC;
7140 else
7141 dst_type = ADDR_LE_DEV_RANDOM;
7142
Andre Guedes04a6c582014-02-26 20:21:44 -03007143 hcon = hci_connect_le(hdev, dst, dst_type, chan->sec_level,
7144 auth_type);
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007145 } else {
Andre Guedes04a6c582014-02-26 20:21:44 -03007146 hcon = hci_connect_acl(hdev, dst, chan->sec_level, auth_type);
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007147 }
Johan Hedberg162b49e2014-01-17 20:45:10 +02007148
7149 if (IS_ERR(hcon)) {
7150 err = PTR_ERR(hcon);
7151 goto done;
7152 }
7153
7154 conn = l2cap_conn_add(hcon);
7155 if (!conn) {
7156 hci_conn_drop(hcon);
7157 err = -ENOMEM;
7158 goto done;
7159 }
7160
7161 if (cid && __l2cap_get_chan_by_dcid(conn, cid)) {
7162 hci_conn_drop(hcon);
7163 err = -EBUSY;
7164 goto done;
7165 }
7166
7167 /* Update source addr of the socket */
7168 bacpy(&chan->src, &hcon->src);
7169 chan->src_type = bdaddr_type(hcon, hcon->src_type);
7170
7171 l2cap_chan_unlock(chan);
7172 l2cap_chan_add(conn, chan);
7173 l2cap_chan_lock(chan);
7174
7175 /* l2cap_chan_add takes its own ref so we can drop this one */
7176 hci_conn_drop(hcon);
7177
7178 l2cap_state_change(chan, BT_CONNECT);
7179 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
7180
Johan Hedberg61202e42014-01-28 15:16:48 -08007181 /* Release chan->sport so that it can be reused by other
7182 * sockets (as it's only used for listening sockets).
7183 */
7184 write_lock(&chan_list_lock);
7185 chan->sport = 0;
7186 write_unlock(&chan_list_lock);
7187
Johan Hedberg162b49e2014-01-17 20:45:10 +02007188 if (hcon->state == BT_CONNECTED) {
7189 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
7190 __clear_chan_timer(chan);
7191 if (l2cap_chan_check_security(chan))
7192 l2cap_state_change(chan, BT_CONNECTED);
7193 } else
7194 l2cap_do_start(chan);
7195 }
7196
7197 err = 0;
7198
7199done:
7200 l2cap_chan_unlock(chan);
7201 hci_dev_unlock(hdev);
7202 hci_dev_put(hdev);
7203 return err;
7204}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +03007205EXPORT_SYMBOL_GPL(l2cap_chan_connect);
Johan Hedberg162b49e2014-01-17 20:45:10 +02007206
Linus Torvalds1da177e2005-04-16 15:20:36 -07007207/* ---- L2CAP interface with lower layer (HCI) ---- */
7208
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007209int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007210{
7211 int exact = 0, lm1 = 0, lm2 = 0;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007212 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007213
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03007214 BT_DBG("hdev %s, bdaddr %pMR", hdev->name, bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007215
7216 /* Find listening sockets and check their link_mode */
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007217 read_lock(&chan_list_lock);
7218 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03007219 if (c->state != BT_LISTEN)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007220 continue;
7221
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007222 if (!bacmp(&c->src, &hdev->bdaddr)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007223 lm1 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03007224 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007225 lm1 |= HCI_LM_MASTER;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007226 exact++;
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007227 } else if (!bacmp(&c->src, BDADDR_ANY)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007228 lm2 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03007229 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007230 lm2 |= HCI_LM_MASTER;
7231 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007232 }
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007233 read_unlock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007234
7235 return exact ? lm1 : lm2;
7236}
7237
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03007238void l2cap_connect_cfm(struct hci_conn *hcon, u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007239{
Marcel Holtmann01394182006-07-03 10:02:46 +02007240 struct l2cap_conn *conn;
7241
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03007242 BT_DBG("hcon %p bdaddr %pMR status %d", hcon, &hcon->dst, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007243
Linus Torvalds1da177e2005-04-16 15:20:36 -07007244 if (!status) {
Claudio Takahasibaf43252013-04-11 13:55:50 -03007245 conn = l2cap_conn_add(hcon);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007246 if (conn)
7247 l2cap_conn_ready(conn);
Andrei Emeltchenkoba6fc312012-10-31 15:46:26 +02007248 } else {
Joe Perchese1750722011-06-29 18:18:29 -07007249 l2cap_conn_del(hcon, bt_to_errno(status));
Andrei Emeltchenkoba6fc312012-10-31 15:46:26 +02007250 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007251}
7252
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007253int l2cap_disconn_ind(struct hci_conn *hcon)
Marcel Holtmann2950f212009-02-12 14:02:50 +01007254{
7255 struct l2cap_conn *conn = hcon->l2cap_data;
7256
7257 BT_DBG("hcon %p", hcon);
7258
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007259 if (!conn)
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02007260 return HCI_ERROR_REMOTE_USER_TERM;
Marcel Holtmann2950f212009-02-12 14:02:50 +01007261 return conn->disc_reason;
7262}
7263
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03007264void l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007265{
7266 BT_DBG("hcon %p reason %d", hcon, reason);
7267
Joe Perchese1750722011-06-29 18:18:29 -07007268 l2cap_conn_del(hcon, bt_to_errno(reason));
Linus Torvalds1da177e2005-04-16 15:20:36 -07007269}
7270
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007271static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt)
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007272{
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03007273 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED)
Marcel Holtmann255c7602009-02-04 21:07:19 +01007274 return;
7275
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007276 if (encrypt == 0x00) {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007277 if (chan->sec_level == BT_SECURITY_MEDIUM) {
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007278 __set_chan_timer(chan, L2CAP_ENC_TIMEOUT);
Marcel Holtmann7d513e92014-01-15 22:37:40 -08007279 } else if (chan->sec_level == BT_SECURITY_HIGH ||
7280 chan->sec_level == BT_SECURITY_FIPS)
Gustavo F. Padovan0f852722011-05-04 19:42:50 -03007281 l2cap_chan_close(chan, ECONNREFUSED);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007282 } else {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007283 if (chan->sec_level == BT_SECURITY_MEDIUM)
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -03007284 __clear_chan_timer(chan);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007285 }
7286}
7287
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007288int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007289{
Marcel Holtmann40be4922008-07-14 20:13:50 +02007290 struct l2cap_conn *conn = hcon->l2cap_data;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03007291 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007292
Marcel Holtmann01394182006-07-03 10:02:46 +02007293 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007294 return 0;
Marcel Holtmann01394182006-07-03 10:02:46 +02007295
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03007296 BT_DBG("conn %p status 0x%2.2x encrypt %u", conn, status, encrypt);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007297
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03007298 if (hcon->type == LE_LINK) {
Hemant Gupta35d4adcc2012-04-18 14:46:26 +05307299 if (!status && encrypt)
Johan Hedberg4bd6d382014-02-26 23:33:45 +02007300 smp_distribute_keys(conn);
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02007301 cancel_delayed_work(&conn->security_timer);
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03007302 }
7303
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007304 mutex_lock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007305
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007306 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007307 l2cap_chan_lock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007308
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03007309 BT_DBG("chan %p scid 0x%4.4x state %s", chan, chan->scid,
7310 state_to_string(chan->state));
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007311
Johan Hedberg2338a7e2014-01-24 10:35:40 +02007312 if (chan->scid == L2CAP_CID_A2MP) {
Andrei Emeltchenko78eb2f92012-07-19 17:03:47 +03007313 l2cap_chan_unlock(chan);
7314 continue;
7315 }
7316
Johan Hedberg073d1cf2013-04-29 19:35:35 +03007317 if (chan->scid == L2CAP_CID_ATT) {
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007318 if (!status && encrypt) {
7319 chan->sec_level = hcon->sec_level;
Andrei Emeltchenkocf4cd002012-02-06 15:03:59 +02007320 l2cap_chan_ready(chan);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007321 }
7322
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007323 l2cap_chan_unlock(chan);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007324 continue;
7325 }
7326
Andrei Emeltchenko96eff462012-11-15 18:14:53 +02007327 if (!__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007328 l2cap_chan_unlock(chan);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01007329 continue;
7330 }
7331
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03007332 if (!status && (chan->state == BT_CONNECTED ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01007333 chan->state == BT_CONFIG)) {
Marcel Holtmannd97c8992013-10-14 02:53:54 -07007334 chan->ops->resume(chan);
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007335 l2cap_check_encryption(chan, encrypt);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007336 l2cap_chan_unlock(chan);
Marcel Holtmann9719f8a2008-07-14 20:13:45 +02007337 continue;
7338 }
7339
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03007340 if (chan->state == BT_CONNECT) {
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007341 if (!status)
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03007342 l2cap_start_connection(chan);
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007343 else
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007344 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03007345 } else if (chan->state == BT_CONNECT2) {
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007346 struct l2cap_conn_rsp rsp;
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007347 __u16 res, stat;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007348
7349 if (!status) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07007350 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007351 res = L2CAP_CR_PEND;
7352 stat = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08007353 chan->ops->defer(chan);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007354 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007355 l2cap_state_change(chan, BT_CONFIG);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007356 res = L2CAP_CR_SUCCESS;
7357 stat = L2CAP_CS_NO_INFO;
7358 }
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007359 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007360 l2cap_state_change(chan, BT_DISCONN);
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007361 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007362 res = L2CAP_CR_SEC_BLOCK;
7363 stat = L2CAP_CS_NO_INFO;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007364 }
7365
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03007366 rsp.scid = cpu_to_le16(chan->dcid);
7367 rsp.dcid = cpu_to_le16(chan->scid);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007368 rsp.result = cpu_to_le16(res);
7369 rsp.status = cpu_to_le16(stat);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03007370 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01007371 sizeof(rsp), &rsp);
Mat Martineau2d369352012-05-23 14:59:30 -07007372
7373 if (!test_bit(CONF_REQ_SENT, &chan->conf_state) &&
7374 res == L2CAP_CR_SUCCESS) {
7375 char buf[128];
7376 set_bit(CONF_REQ_SENT, &chan->conf_state);
7377 l2cap_send_cmd(conn, l2cap_get_ident(conn),
7378 L2CAP_CONF_REQ,
7379 l2cap_build_conf_req(chan, buf),
7380 buf);
7381 chan->num_conf_req++;
7382 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007383 }
7384
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007385 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007386 }
7387
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007388 mutex_unlock(&conn->chan_lock);
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007389
Linus Torvalds1da177e2005-04-16 15:20:36 -07007390 return 0;
7391}
7392
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007393int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007394{
7395 struct l2cap_conn *conn = hcon->l2cap_data;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007396 struct l2cap_hdr *hdr;
7397 int len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007398
Andrei Emeltchenko1d13a252012-10-15 11:58:41 +03007399 /* For AMP controller do not create l2cap conn */
7400 if (!conn && hcon->hdev->dev_type != HCI_BREDR)
7401 goto drop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007402
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007403 if (!conn)
Claudio Takahasibaf43252013-04-11 13:55:50 -03007404 conn = l2cap_conn_add(hcon);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007405
7406 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007407 goto drop;
7408
7409 BT_DBG("conn %p len %d flags 0x%x", conn, skb->len, flags);
7410
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007411 switch (flags) {
7412 case ACL_START:
7413 case ACL_START_NO_FLUSH:
7414 case ACL_COMPLETE:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007415 if (conn->rx_len) {
7416 BT_ERR("Unexpected start frame (len %d)", skb->len);
7417 kfree_skb(conn->rx_skb);
7418 conn->rx_skb = NULL;
7419 conn->rx_len = 0;
7420 l2cap_conn_unreliable(conn, ECOMM);
7421 }
7422
Andrei Emeltchenkoaae7fe22010-09-15 14:28:43 +03007423 /* Start fragment always begin with Basic L2CAP header */
7424 if (skb->len < L2CAP_HDR_SIZE) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07007425 BT_ERR("Frame is too short (len %d)", skb->len);
7426 l2cap_conn_unreliable(conn, ECOMM);
7427 goto drop;
7428 }
7429
7430 hdr = (struct l2cap_hdr *) skb->data;
7431 len = __le16_to_cpu(hdr->len) + L2CAP_HDR_SIZE;
7432
7433 if (len == skb->len) {
7434 /* Complete frame received */
7435 l2cap_recv_frame(conn, skb);
7436 return 0;
7437 }
7438
7439 BT_DBG("Start: total len %d, frag len %d", len, skb->len);
7440
7441 if (skb->len > len) {
7442 BT_ERR("Frame is too long (len %d, expected len %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007443 skb->len, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007444 l2cap_conn_unreliable(conn, ECOMM);
7445 goto drop;
7446 }
7447
7448 /* Allocate skb for the complete frame (with header) */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03007449 conn->rx_skb = bt_skb_alloc(len, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03007450 if (!conn->rx_skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007451 goto drop;
7452
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007453 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007454 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007455 conn->rx_len = len - skb->len;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007456 break;
7457
7458 case ACL_CONT:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007459 BT_DBG("Cont: frag len %d (expecting %d)", skb->len, conn->rx_len);
7460
7461 if (!conn->rx_len) {
7462 BT_ERR("Unexpected continuation frame (len %d)", skb->len);
7463 l2cap_conn_unreliable(conn, ECOMM);
7464 goto drop;
7465 }
7466
7467 if (skb->len > conn->rx_len) {
7468 BT_ERR("Fragment is too long (len %d, expected %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007469 skb->len, conn->rx_len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007470 kfree_skb(conn->rx_skb);
7471 conn->rx_skb = NULL;
7472 conn->rx_len = 0;
7473 l2cap_conn_unreliable(conn, ECOMM);
7474 goto drop;
7475 }
7476
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007477 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007478 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007479 conn->rx_len -= skb->len;
7480
7481 if (!conn->rx_len) {
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007482 /* Complete frame received. l2cap_recv_frame
7483 * takes ownership of the skb so set the global
7484 * rx_skb pointer to NULL first.
7485 */
7486 struct sk_buff *rx_skb = conn->rx_skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007487 conn->rx_skb = NULL;
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007488 l2cap_recv_frame(conn, rx_skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007489 }
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007490 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007491 }
7492
7493drop:
7494 kfree_skb(skb);
7495 return 0;
7496}
7497
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007498static int l2cap_debugfs_show(struct seq_file *f, void *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007499{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007500 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007501
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007502 read_lock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007503
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007504 list_for_each_entry(c, &chan_list, global_l) {
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03007505 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 -07007506 &c->src, &c->dst,
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03007507 c->state, __le16_to_cpu(c->psm),
7508 c->scid, c->dcid, c->imtu, c->omtu,
7509 c->sec_level, c->mode);
Andrei Emeltchenko61e1b4b2012-01-19 11:19:50 +02007510 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007511
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007512 read_unlock(&chan_list_lock);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007513
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007514 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007515}
7516
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007517static int l2cap_debugfs_open(struct inode *inode, struct file *file)
7518{
7519 return single_open(file, l2cap_debugfs_show, inode->i_private);
7520}
7521
7522static const struct file_operations l2cap_debugfs_fops = {
7523 .open = l2cap_debugfs_open,
7524 .read = seq_read,
7525 .llseek = seq_lseek,
7526 .release = single_release,
7527};
7528
7529static struct dentry *l2cap_debugfs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007530
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007531int __init l2cap_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007532{
7533 int err;
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007534
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007535 err = l2cap_init_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007536 if (err < 0)
7537 return err;
7538
Marcel Holtmann1120e4b2013-10-17 17:24:16 -07007539 if (IS_ERR_OR_NULL(bt_debugfs))
7540 return 0;
7541
7542 l2cap_debugfs = debugfs_create_file("l2cap", 0444, bt_debugfs,
7543 NULL, &l2cap_debugfs_fops);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007544
Samuel Ortiz40b93972014-05-14 17:53:35 +02007545 debugfs_create_u16("l2cap_le_max_credits", 0644, bt_debugfs,
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02007546 &le_max_credits);
Samuel Ortiz40b93972014-05-14 17:53:35 +02007547 debugfs_create_u16("l2cap_le_default_mps", 0644, bt_debugfs,
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02007548 &le_default_mps);
7549
Linus Torvalds1da177e2005-04-16 15:20:36 -07007550 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007551}
7552
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007553void l2cap_exit(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007554{
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007555 debugfs_remove(l2cap_debugfs);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007556 l2cap_cleanup_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007557}
7558
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03007559module_param(disable_ertm, bool, 0644);
7560MODULE_PARM_DESC(disable_ertm, "Disable enhanced retransmission mode");