blob: ebe7454362f095a8cdaf89fe5bd7ed4868ca3ea2 [file] [log] [blame]
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2000-2001 Qualcomm Incorporated
Gustavo F. Padovance5706b2010-07-13 11:57:11 -03004 Copyright (C) 2009-2010 Gustavo F. Padovan <gustavo@padovan.org>
Gustavo F. Padovan5d8868f2010-07-16 16:18:39 -03005 Copyright (C) 2010 Google Inc.
Gustavo F. Padovan590051d2011-12-18 13:39:33 -02006 Copyright (C) 2011 ProFUSION Embedded Systems
Mat Martineau422e9252012-04-27 16:50:55 -07007 Copyright (c) 2012 Code Aurora Forum. All rights reserved.
Linus Torvalds1da177e2005-04-16 15:20:36 -07008
9 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
10
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License version 2 as
13 published by the Free Software Foundation;
14
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
18 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090019 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
20 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
21 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
Linus Torvalds1da177e2005-04-16 15:20:36 -070022 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090024 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
25 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
Linus Torvalds1da177e2005-04-16 15:20:36 -070026 SOFTWARE IS DISCLAIMED.
27*/
28
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020029/* Bluetooth L2CAP core. */
Linus Torvalds1da177e2005-04-16 15:20:36 -070030
Linus Torvalds1da177e2005-04-16 15:20:36 -070031#include <linux/module.h>
32
Marcel Holtmannaef7d972010-03-21 05:27:45 +010033#include <linux/debugfs.h>
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -030034#include <linux/crc16.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070035
36#include <net/bluetooth/bluetooth.h>
37#include <net/bluetooth/hci_core.h>
38#include <net/bluetooth/l2cap.h>
Marcel Holtmann7ef9fbf2013-10-10 14:54:14 -070039
Marcel Holtmannac4b7232013-10-10 14:54:16 -070040#include "smp.h"
Marcel Holtmann70247282013-10-10 14:54:15 -070041#include "a2mp.h"
Marcel Holtmann7ef9fbf2013-10-10 14:54:14 -070042#include "amp.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070043
Johan Hedberg0f1bfe42014-01-27 15:11:35 -080044#define LE_FLOWCTL_MAX_CREDITS 65535
45
Mat Martineaud1de6d42012-05-17 20:53:55 -070046bool disable_ertm;
Marcel Holtmannf0709e02007-10-20 13:38:51 +020047
Marcel Holtmann547d1032013-10-12 08:18:19 -070048static u32 l2cap_feat_mask = L2CAP_FEAT_FIXED_CHAN | L2CAP_FEAT_UCD;
Marcel Holtmanna6801ca2014-07-11 06:03:08 +020049static u8 l2cap_fixed_chan[8] = { L2CAP_FC_SIG_BREDR | L2CAP_FC_CONNLESS, };
Linus Torvalds1da177e2005-04-16 15:20:36 -070050
Johannes Bergb5ad8b72011-06-01 08:54:45 +020051static LIST_HEAD(chan_list);
52static DEFINE_RWLOCK(chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -070053
Johan Hedbergf15b8ec2013-12-03 15:08:25 +020054static u16 le_max_credits = L2CAP_LE_MAX_CREDITS;
55static u16 le_default_mps = L2CAP_LE_DEFAULT_MPS;
56
Linus Torvalds1da177e2005-04-16 15:20:36 -070057static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +010058 u8 code, u8 ident, u16 dlen, void *data);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -030059static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len,
Gustavo Padovan2d792812012-10-06 10:07:01 +010060 void *data);
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -030061static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +020062static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err);
Linus Torvalds1da177e2005-04-16 15:20:36 -070063
Gustavo Padovand6603662012-05-21 13:58:22 -030064static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
Gustavo Padovan2d792812012-10-06 10:07:01 +010065 struct sk_buff_head *skbs, u8 event);
Mat Martineau608bcc62012-05-17 20:53:32 -070066
Marcel Holtmann4f1654e2013-10-13 08:50:41 -070067static inline __u8 bdaddr_type(struct hci_conn *hcon, __u8 type)
68{
69 if (hcon->type == LE_LINK) {
70 if (type == ADDR_LE_DEV_PUBLIC)
71 return BDADDR_LE_PUBLIC;
72 else
73 return BDADDR_LE_RANDOM;
74 }
75
76 return BDADDR_BREDR;
77}
78
Marcel Holtmann01394182006-07-03 10:02:46 +020079/* ---- L2CAP channels ---- */
Gustavo F. Padovan71ba0e52011-05-17 14:34:52 -030080
Gustavo Padovan2d792812012-10-06 10:07:01 +010081static struct l2cap_chan *__l2cap_get_chan_by_dcid(struct l2cap_conn *conn,
82 u16 cid)
Marcel Holtmann01394182006-07-03 10:02:46 +020083{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020084 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -030085
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020086 list_for_each_entry(c, &conn->chan_l, list) {
87 if (c->dcid == cid)
88 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +020089 }
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020090 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +020091}
92
Gustavo Padovan2d792812012-10-06 10:07:01 +010093static struct l2cap_chan *__l2cap_get_chan_by_scid(struct l2cap_conn *conn,
94 u16 cid)
Marcel Holtmann01394182006-07-03 10:02:46 +020095{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020096 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -030097
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020098 list_for_each_entry(c, &conn->chan_l, list) {
99 if (c->scid == cid)
100 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +0200101 }
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200102 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200103}
104
105/* Find channel with given SCID.
Mat Martineauef191ad2012-05-02 09:42:00 -0700106 * Returns locked channel. */
Gustavo Padovan2d792812012-10-06 10:07:01 +0100107static struct l2cap_chan *l2cap_get_chan_by_scid(struct l2cap_conn *conn,
108 u16 cid)
Marcel Holtmann01394182006-07-03 10:02:46 +0200109{
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300110 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300111
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200112 mutex_lock(&conn->chan_lock);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300113 c = __l2cap_get_chan_by_scid(conn, cid);
Mat Martineauef191ad2012-05-02 09:42:00 -0700114 if (c)
115 l2cap_chan_lock(c);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200116 mutex_unlock(&conn->chan_lock);
117
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300118 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +0200119}
120
Mat Martineaub1a130b2012-10-23 15:24:09 -0700121/* Find channel with given DCID.
122 * Returns locked channel.
123 */
124static struct l2cap_chan *l2cap_get_chan_by_dcid(struct l2cap_conn *conn,
125 u16 cid)
126{
127 struct l2cap_chan *c;
128
129 mutex_lock(&conn->chan_lock);
130 c = __l2cap_get_chan_by_dcid(conn, cid);
131 if (c)
132 l2cap_chan_lock(c);
133 mutex_unlock(&conn->chan_lock);
134
135 return c;
136}
137
Gustavo Padovan2d792812012-10-06 10:07:01 +0100138static struct l2cap_chan *__l2cap_get_chan_by_ident(struct l2cap_conn *conn,
139 u8 ident)
Marcel Holtmann01394182006-07-03 10:02:46 +0200140{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200141 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300142
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200143 list_for_each_entry(c, &conn->chan_l, list) {
144 if (c->ident == ident)
145 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +0200146 }
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200147 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200148}
149
Mat Martineau5b155ef2012-10-23 15:24:14 -0700150static struct l2cap_chan *l2cap_get_chan_by_ident(struct l2cap_conn *conn,
151 u8 ident)
152{
153 struct l2cap_chan *c;
154
155 mutex_lock(&conn->chan_lock);
156 c = __l2cap_get_chan_by_ident(conn, ident);
157 if (c)
158 l2cap_chan_lock(c);
159 mutex_unlock(&conn->chan_lock);
160
161 return c;
162}
163
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300164static struct l2cap_chan *__l2cap_global_chan_by_addr(__le16 psm, bdaddr_t *src)
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300165{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300166 struct l2cap_chan *c;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300167
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300168 list_for_each_entry(c, &chan_list, global_l) {
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700169 if (c->sport == psm && !bacmp(&c->src, src))
Szymon Janc250938c2011-11-16 09:32:22 +0100170 return c;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300171 }
Szymon Janc250938c2011-11-16 09:32:22 +0100172 return NULL;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300173}
174
175int l2cap_add_psm(struct l2cap_chan *chan, bdaddr_t *src, __le16 psm)
176{
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300177 int err;
178
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200179 write_lock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300180
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300181 if (psm && __l2cap_global_chan_by_addr(psm, src)) {
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300182 err = -EADDRINUSE;
183 goto done;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300184 }
185
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300186 if (psm) {
187 chan->psm = psm;
188 chan->sport = psm;
189 err = 0;
190 } else {
191 u16 p;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300192
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300193 err = -EINVAL;
194 for (p = 0x1001; p < 0x1100; p += 2)
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300195 if (!__l2cap_global_chan_by_addr(cpu_to_le16(p), src)) {
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300196 chan->psm = cpu_to_le16(p);
197 chan->sport = cpu_to_le16(p);
198 err = 0;
199 break;
200 }
201 }
202
203done:
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200204 write_unlock(&chan_list_lock);
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300205 return err;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300206}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300207EXPORT_SYMBOL_GPL(l2cap_add_psm);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300208
209int l2cap_add_scid(struct l2cap_chan *chan, __u16 scid)
210{
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200211 write_lock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300212
Johan Hedberg14824302014-08-07 22:56:50 +0300213 /* Override the defaults (which are for conn-oriented) */
214 chan->omtu = L2CAP_DEFAULT_MTU;
215 chan->chan_type = L2CAP_CHAN_FIXED;
216
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300217 chan->scid = scid;
218
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200219 write_unlock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300220
221 return 0;
222}
223
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300224static u16 l2cap_alloc_cid(struct l2cap_conn *conn)
Marcel Holtmann01394182006-07-03 10:02:46 +0200225{
Johan Hedberge77af752013-10-08 10:31:00 +0200226 u16 cid, dyn_end;
Marcel Holtmann01394182006-07-03 10:02:46 +0200227
Johan Hedberge77af752013-10-08 10:31:00 +0200228 if (conn->hcon->type == LE_LINK)
229 dyn_end = L2CAP_CID_LE_DYN_END;
230 else
231 dyn_end = L2CAP_CID_DYN_END;
232
233 for (cid = L2CAP_CID_DYN_START; cid < dyn_end; cid++) {
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300234 if (!__l2cap_get_chan_by_scid(conn, cid))
Marcel Holtmann01394182006-07-03 10:02:46 +0200235 return cid;
236 }
237
238 return 0;
239}
240
Gustavo Padovanf93fa272013-10-21 14:21:40 -0200241static void l2cap_state_change(struct l2cap_chan *chan, int state)
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300242{
Andrei Emeltchenko42d2d872012-02-17 11:40:57 +0200243 BT_DBG("chan %p %s -> %s", chan, state_to_string(chan->state),
Gustavo Padovan2d792812012-10-06 10:07:01 +0100244 state_to_string(state));
Gustavo F. Padovanbadaaa02011-11-23 20:11:46 -0200245
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300246 chan->state = state;
Gustavo Padovan53f52122013-10-15 19:24:45 -0300247 chan->ops->state_change(chan, state, 0);
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300248}
249
Gustavo Padovanf8e73012013-10-15 19:24:46 -0300250static inline void l2cap_state_change_and_error(struct l2cap_chan *chan,
251 int state, int err)
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +0200252{
Gustavo Padovanf8e73012013-10-15 19:24:46 -0300253 chan->state = state;
Gustavo Padovan53f52122013-10-15 19:24:45 -0300254 chan->ops->state_change(chan, chan->state, err);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +0200255}
256
257static inline void l2cap_chan_set_err(struct l2cap_chan *chan, int err)
258{
Gustavo Padovanf8e73012013-10-15 19:24:46 -0300259 chan->ops->state_change(chan, chan->state, err);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +0200260}
261
Mat Martineau4239d162012-05-17 20:53:49 -0700262static void __set_retrans_timer(struct l2cap_chan *chan)
263{
264 if (!delayed_work_pending(&chan->monitor_timer) &&
265 chan->retrans_timeout) {
266 l2cap_set_timer(chan, &chan->retrans_timer,
267 msecs_to_jiffies(chan->retrans_timeout));
268 }
269}
270
271static void __set_monitor_timer(struct l2cap_chan *chan)
272{
273 __clear_retrans_timer(chan);
274 if (chan->monitor_timeout) {
275 l2cap_set_timer(chan, &chan->monitor_timer,
276 msecs_to_jiffies(chan->monitor_timeout));
277 }
278}
279
Mat Martineau608bcc62012-05-17 20:53:32 -0700280static struct sk_buff *l2cap_ertm_seq_in_queue(struct sk_buff_head *head,
281 u16 seq)
282{
283 struct sk_buff *skb;
284
285 skb_queue_walk(head, skb) {
286 if (bt_cb(skb)->control.txseq == seq)
287 return skb;
288 }
289
290 return NULL;
291}
292
Mat Martineau3c588192012-04-11 10:48:42 -0700293/* ---- L2CAP sequence number lists ---- */
294
295/* For ERTM, ordered lists of sequence numbers must be tracked for
296 * SREJ requests that are received and for frames that are to be
297 * retransmitted. These seq_list functions implement a singly-linked
298 * list in an array, where membership in the list can also be checked
299 * in constant time. Items can also be added to the tail of the list
300 * and removed from the head in constant time, without further memory
301 * allocs or frees.
302 */
303
304static int l2cap_seq_list_init(struct l2cap_seq_list *seq_list, u16 size)
305{
306 size_t alloc_size, i;
307
308 /* Allocated size is a power of 2 to map sequence numbers
309 * (which may be up to 14 bits) in to a smaller array that is
310 * sized for the negotiated ERTM transmit windows.
311 */
312 alloc_size = roundup_pow_of_two(size);
313
314 seq_list->list = kmalloc(sizeof(u16) * alloc_size, GFP_KERNEL);
315 if (!seq_list->list)
316 return -ENOMEM;
317
318 seq_list->mask = alloc_size - 1;
319 seq_list->head = L2CAP_SEQ_LIST_CLEAR;
320 seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
321 for (i = 0; i < alloc_size; i++)
322 seq_list->list[i] = L2CAP_SEQ_LIST_CLEAR;
323
324 return 0;
325}
326
327static inline void l2cap_seq_list_free(struct l2cap_seq_list *seq_list)
328{
329 kfree(seq_list->list);
330}
331
332static inline bool l2cap_seq_list_contains(struct l2cap_seq_list *seq_list,
333 u16 seq)
334{
335 /* Constant-time check for list membership */
336 return seq_list->list[seq & seq_list->mask] != L2CAP_SEQ_LIST_CLEAR;
337}
338
Mat Martineau3c588192012-04-11 10:48:42 -0700339static inline u16 l2cap_seq_list_pop(struct l2cap_seq_list *seq_list)
340{
Johan Hedberg03a0c5d2014-01-18 21:32:59 +0200341 u16 seq = seq_list->head;
342 u16 mask = seq_list->mask;
343
344 seq_list->head = seq_list->list[seq & mask];
345 seq_list->list[seq & mask] = L2CAP_SEQ_LIST_CLEAR;
346
347 if (seq_list->head == L2CAP_SEQ_LIST_TAIL) {
348 seq_list->head = L2CAP_SEQ_LIST_CLEAR;
349 seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
350 }
351
352 return seq;
Mat Martineau3c588192012-04-11 10:48:42 -0700353}
354
355static void l2cap_seq_list_clear(struct l2cap_seq_list *seq_list)
356{
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300357 u16 i;
Mat Martineau3c588192012-04-11 10:48:42 -0700358
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300359 if (seq_list->head == L2CAP_SEQ_LIST_CLEAR)
360 return;
361
362 for (i = 0; i <= seq_list->mask; i++)
363 seq_list->list[i] = L2CAP_SEQ_LIST_CLEAR;
364
365 seq_list->head = L2CAP_SEQ_LIST_CLEAR;
366 seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
Mat Martineau3c588192012-04-11 10:48:42 -0700367}
368
369static void l2cap_seq_list_append(struct l2cap_seq_list *seq_list, u16 seq)
370{
371 u16 mask = seq_list->mask;
372
373 /* All appends happen in constant time */
374
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300375 if (seq_list->list[seq & mask] != L2CAP_SEQ_LIST_CLEAR)
376 return;
Mat Martineau3c588192012-04-11 10:48:42 -0700377
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300378 if (seq_list->tail == L2CAP_SEQ_LIST_CLEAR)
379 seq_list->head = seq;
380 else
381 seq_list->list[seq_list->tail & mask] = seq;
382
383 seq_list->tail = seq;
384 seq_list->list[seq & mask] = L2CAP_SEQ_LIST_TAIL;
Mat Martineau3c588192012-04-11 10:48:42 -0700385}
386
Gustavo F. Padovan721c4182011-06-23 19:29:58 -0300387static void l2cap_chan_timeout(struct work_struct *work)
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300388{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -0300389 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100390 chan_timer.work);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200391 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300392 int reason;
393
Andrei Emeltchenkoe05dcc32012-02-17 11:40:56 +0200394 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300395
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200396 mutex_lock(&conn->chan_lock);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200397 l2cap_chan_lock(chan);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300398
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300399 if (chan->state == BT_CONNECTED || chan->state == BT_CONFIG)
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300400 reason = ECONNREFUSED;
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300401 else if (chan->state == BT_CONNECT &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100402 chan->sec_level != BT_SECURITY_SDP)
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300403 reason = ECONNREFUSED;
404 else
405 reason = ETIMEDOUT;
406
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300407 l2cap_chan_close(chan, reason);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300408
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200409 l2cap_chan_unlock(chan);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300410
Gustavo Padovan80b98022012-05-27 22:27:51 -0300411 chan->ops->close(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200412 mutex_unlock(&conn->chan_lock);
413
Ulisses Furquim371fd832011-12-21 20:02:36 -0200414 l2cap_chan_put(chan);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300415}
416
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -0300417struct l2cap_chan *l2cap_chan_create(void)
Marcel Holtmann01394182006-07-03 10:02:46 +0200418{
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300419 struct l2cap_chan *chan;
Marcel Holtmann01394182006-07-03 10:02:46 +0200420
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300421 chan = kzalloc(sizeof(*chan), GFP_ATOMIC);
422 if (!chan)
423 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200424
Andrei Emeltchenkoc03b3552012-02-21 12:54:56 +0200425 mutex_init(&chan->lock);
426
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200427 write_lock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300428 list_add(&chan->global_l, &chan_list);
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200429 write_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300430
Gustavo F. Padovan721c4182011-06-23 19:29:58 -0300431 INIT_DELAYED_WORK(&chan->chan_timer, l2cap_chan_timeout);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300432
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300433 chan->state = BT_OPEN;
434
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530435 kref_init(&chan->kref);
Gustavo F. Padovan71ba0e52011-05-17 14:34:52 -0300436
Mat Martineau28270112012-05-17 21:14:09 -0700437 /* This flag is cleared in l2cap_chan_ready() */
438 set_bit(CONF_NOT_COMPLETE, &chan->conf_state);
439
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -0300440 BT_DBG("chan %p", chan);
Szymon Jancabc545b2011-11-03 16:05:44 +0100441
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300442 return chan;
Marcel Holtmann01394182006-07-03 10:02:46 +0200443}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300444EXPORT_SYMBOL_GPL(l2cap_chan_create);
Marcel Holtmann01394182006-07-03 10:02:46 +0200445
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530446static void l2cap_chan_destroy(struct kref *kref)
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300447{
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530448 struct l2cap_chan *chan = container_of(kref, struct l2cap_chan, kref);
449
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +0530450 BT_DBG("chan %p", chan);
451
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200452 write_lock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300453 list_del(&chan->global_l);
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200454 write_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300455
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +0530456 kfree(chan);
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300457}
458
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530459void l2cap_chan_hold(struct l2cap_chan *c)
460{
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530461 BT_DBG("chan %p orig refcnt %d", c, atomic_read(&c->kref.refcount));
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530462
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530463 kref_get(&c->kref);
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530464}
465
466void l2cap_chan_put(struct l2cap_chan *c)
467{
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530468 BT_DBG("chan %p orig refcnt %d", c, atomic_read(&c->kref.refcount));
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530469
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530470 kref_put(&c->kref, l2cap_chan_destroy);
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530471}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300472EXPORT_SYMBOL_GPL(l2cap_chan_put);
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530473
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300474void l2cap_chan_set_defaults(struct l2cap_chan *chan)
475{
476 chan->fcs = L2CAP_FCS_CRC16;
477 chan->max_tx = L2CAP_DEFAULT_MAX_TX;
478 chan->tx_win = L2CAP_DEFAULT_TX_WINDOW;
479 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
Jukka Rissanen6a5e8162014-05-28 14:43:04 +0300480 chan->remote_max_tx = chan->max_tx;
481 chan->remote_tx_win = chan->tx_win;
Mat Martineauc20f8e32012-07-10 05:47:07 -0700482 chan->ack_win = L2CAP_DEFAULT_TX_WINDOW;
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300483 chan->sec_level = BT_SECURITY_LOW;
Jukka Rissanen6a5e8162014-05-28 14:43:04 +0300484 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
485 chan->retrans_timeout = L2CAP_DEFAULT_RETRANS_TO;
486 chan->monitor_timeout = L2CAP_DEFAULT_MONITOR_TO;
487 chan->conf_state = 0;
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300488
489 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
490}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300491EXPORT_SYMBOL_GPL(l2cap_chan_set_defaults);
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300492
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200493static void l2cap_le_flowctl_init(struct l2cap_chan *chan)
Johan Hedberg38319712013-05-17 12:49:23 +0300494{
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200495 chan->sdu = NULL;
496 chan->sdu_last_frag = NULL;
497 chan->sdu_len = 0;
Johan Hedberg0cd75f72013-05-17 13:09:05 +0300498 chan->tx_credits = 0;
Johan Hedbergf15b8ec2013-12-03 15:08:25 +0200499 chan->rx_credits = le_max_credits;
Johan Hedbergd1d79412014-01-27 15:11:33 -0800500 chan->mps = min_t(u16, chan->imtu, le_default_mps);
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200501
502 skb_queue_head_init(&chan->tx_q);
Johan Hedberg38319712013-05-17 12:49:23 +0300503}
504
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +0300505void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
Marcel Holtmann01394182006-07-03 10:02:46 +0200506{
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -0300507 BT_DBG("conn %p, psm 0x%2.2x, dcid 0x%4.4x", conn,
Andrei Emeltchenko097db762012-03-09 14:16:17 +0200508 __le16_to_cpu(chan->psm), chan->dcid);
Marcel Holtmann01394182006-07-03 10:02:46 +0200509
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +0200510 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
Marcel Holtmann2950f212009-02-12 14:02:50 +0100511
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300512 chan->conn = conn;
Marcel Holtmann01394182006-07-03 10:02:46 +0200513
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200514 switch (chan->chan_type) {
515 case L2CAP_CHAN_CONN_ORIENTED:
Johan Hedberg21626e62014-01-24 10:35:41 +0200516 /* Alloc CID for connection-oriented socket */
517 chan->scid = l2cap_alloc_cid(conn);
518 if (conn->hcon->type == ACL_LINK)
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300519 chan->omtu = L2CAP_DEFAULT_MTU;
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200520 break;
521
522 case L2CAP_CHAN_CONN_LESS:
Marcel Holtmann01394182006-07-03 10:02:46 +0200523 /* Connectionless socket */
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300524 chan->scid = L2CAP_CID_CONN_LESS;
525 chan->dcid = L2CAP_CID_CONN_LESS;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300526 chan->omtu = L2CAP_DEFAULT_MTU;
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200527 break;
528
Johan Hedberg2338a7e2014-01-24 10:35:40 +0200529 case L2CAP_CHAN_FIXED:
530 /* Caller will set CID and CID specific MTU values */
Andrei Emeltchenko416fa752012-05-29 13:59:16 +0300531 break;
532
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200533 default:
Marcel Holtmann01394182006-07-03 10:02:46 +0200534 /* Raw socket can send/recv signalling messages only */
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300535 chan->scid = L2CAP_CID_SIGNALING;
536 chan->dcid = L2CAP_CID_SIGNALING;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300537 chan->omtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann01394182006-07-03 10:02:46 +0200538 }
539
Andrei Emeltchenko8f7975b2011-10-13 16:18:54 +0300540 chan->local_id = L2CAP_BESTEFFORT_ID;
541 chan->local_stype = L2CAP_SERV_BESTEFFORT;
542 chan->local_msdu = L2CAP_DEFAULT_MAX_SDU_SIZE;
543 chan->local_sdu_itime = L2CAP_DEFAULT_SDU_ITIME;
544 chan->local_acc_lat = L2CAP_DEFAULT_ACC_LAT;
Andrei Emeltchenko8936fa62012-10-08 11:14:41 +0300545 chan->local_flush_to = L2CAP_EFS_DEFAULT_FLUSH_TO;
Andrei Emeltchenko8f7975b2011-10-13 16:18:54 +0300546
Ulisses Furquim371fd832011-12-21 20:02:36 -0200547 l2cap_chan_hold(chan);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300548
Johan Hedberg5ee98912013-04-29 19:35:43 +0300549 hci_conn_hold(conn->hcon);
550
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200551 list_add(&chan->list, &conn->chan_l);
Andrei Emeltchenko643162a2012-02-22 17:11:55 +0200552}
553
Andrei Emeltchenko466f8002012-05-29 13:59:01 +0300554void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
Andrei Emeltchenko643162a2012-02-22 17:11:55 +0200555{
556 mutex_lock(&conn->chan_lock);
557 __l2cap_chan_add(conn, chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200558 mutex_unlock(&conn->chan_lock);
Marcel Holtmann01394182006-07-03 10:02:46 +0200559}
560
Andrei Emeltchenko466f8002012-05-29 13:59:01 +0300561void l2cap_chan_del(struct l2cap_chan *chan, int err)
Marcel Holtmann01394182006-07-03 10:02:46 +0200562{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300563 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann01394182006-07-03 10:02:46 +0200564
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -0300565 __clear_chan_timer(chan);
Marcel Holtmann01394182006-07-03 10:02:46 +0200566
Gustavo F. Padovan49208c92011-04-04 15:59:54 -0300567 BT_DBG("chan %p, conn %p, err %d", chan, conn, err);
Marcel Holtmann01394182006-07-03 10:02:46 +0200568
Johan Hedberg72847ce2014-08-08 09:28:03 +0300569 chan->ops->teardown(chan, err);
570
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900571 if (conn) {
Andrei Emeltchenko56f60982012-10-15 11:58:44 +0300572 struct amp_mgr *mgr = conn->hcon->amp_mgr;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300573 /* Delete from channel list */
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200574 list_del(&chan->list);
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -0200575
Ulisses Furquim371fd832011-12-21 20:02:36 -0200576 l2cap_chan_put(chan);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300577
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300578 chan->conn = NULL;
Andrei Emeltchenko3cabbfd2012-05-31 11:01:37 +0300579
Johan Hedberg2338a7e2014-01-24 10:35:40 +0200580 if (chan->scid != L2CAP_CID_A2MP)
David Herrmann76a68ba2013-04-06 20:28:37 +0200581 hci_conn_drop(conn->hcon);
Andrei Emeltchenko56f60982012-10-15 11:58:44 +0300582
583 if (mgr && mgr->bredr_chan == chan)
584 mgr->bredr_chan = NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200585 }
586
Andrei Emeltchenko419e08c2012-10-31 15:46:34 +0200587 if (chan->hs_hchan) {
588 struct hci_chan *hs_hchan = chan->hs_hchan;
589
590 BT_DBG("chan %p disconnect hs_hchan %p", chan, hs_hchan);
591 amp_disconnect_logical_link(hs_hchan);
592 }
593
Mat Martineau28270112012-05-17 21:14:09 -0700594 if (test_bit(CONF_NOT_COMPLETE, &chan->conf_state))
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300595 return;
Gustavo F. Padovan2ead70b2011-04-01 15:13:36 -0300596
Gustavo Padovanee556f62012-05-18 20:22:38 -0300597 switch(chan->mode) {
598 case L2CAP_MODE_BASIC:
599 break;
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300600
Johan Hedberg38319712013-05-17 12:49:23 +0300601 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedberg177f8f22013-05-31 17:54:51 +0300602 skb_queue_purge(&chan->tx_q);
Johan Hedberg38319712013-05-17 12:49:23 +0300603 break;
604
Gustavo Padovanee556f62012-05-18 20:22:38 -0300605 case L2CAP_MODE_ERTM:
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -0300606 __clear_retrans_timer(chan);
607 __clear_monitor_timer(chan);
608 __clear_ack_timer(chan);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300609
Gustavo F. Padovanf1c67752011-03-25 20:36:10 -0300610 skb_queue_purge(&chan->srej_q);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300611
Mat Martineau3c588192012-04-11 10:48:42 -0700612 l2cap_seq_list_free(&chan->srej_list);
613 l2cap_seq_list_free(&chan->retrans_list);
Gustavo Padovanee556f62012-05-18 20:22:38 -0300614
615 /* fall through */
616
617 case L2CAP_MODE_STREAMING:
618 skb_queue_purge(&chan->tx_q);
619 break;
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300620 }
Gustavo Padovanee556f62012-05-18 20:22:38 -0300621
622 return;
Marcel Holtmann01394182006-07-03 10:02:46 +0200623}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300624EXPORT_SYMBOL_GPL(l2cap_chan_del);
Marcel Holtmann01394182006-07-03 10:02:46 +0200625
Johan Hedberg387a33e2014-02-18 21:41:33 +0200626void l2cap_conn_update_id_addr(struct hci_conn *hcon)
627{
628 struct l2cap_conn *conn = hcon->l2cap_data;
629 struct l2cap_chan *chan;
630
631 mutex_lock(&conn->chan_lock);
632
633 list_for_each_entry(chan, &conn->chan_l, list) {
634 l2cap_chan_lock(chan);
635 bacpy(&chan->dst, &hcon->dst);
636 chan->dst_type = bdaddr_type(hcon, hcon->dst_type);
637 l2cap_chan_unlock(chan);
638 }
639
640 mutex_unlock(&conn->chan_lock);
641}
642
Johan Hedberg27e2d4c2013-05-14 13:27:21 +0300643static void l2cap_chan_le_connect_reject(struct l2cap_chan *chan)
644{
645 struct l2cap_conn *conn = chan->conn;
646 struct l2cap_le_conn_rsp rsp;
647 u16 result;
648
649 if (test_bit(FLAG_DEFER_SETUP, &chan->flags))
650 result = L2CAP_CR_AUTHORIZATION;
651 else
652 result = L2CAP_CR_BAD_PSM;
653
654 l2cap_state_change(chan, BT_DISCONN);
655
656 rsp.dcid = cpu_to_le16(chan->scid);
657 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +0200658 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +0300659 rsp.credits = cpu_to_le16(chan->rx_credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +0300660 rsp.result = cpu_to_le16(result);
661
662 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp),
663 &rsp);
664}
665
Johan Hedberg791d60f2013-05-14 22:24:44 +0300666static void l2cap_chan_connect_reject(struct l2cap_chan *chan)
667{
668 struct l2cap_conn *conn = chan->conn;
669 struct l2cap_conn_rsp rsp;
670 u16 result;
671
672 if (test_bit(FLAG_DEFER_SETUP, &chan->flags))
673 result = L2CAP_CR_SEC_BLOCK;
674 else
675 result = L2CAP_CR_BAD_PSM;
676
677 l2cap_state_change(chan, BT_DISCONN);
678
679 rsp.scid = cpu_to_le16(chan->dcid);
680 rsp.dcid = cpu_to_le16(chan->scid);
681 rsp.result = cpu_to_le16(result);
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700682 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Johan Hedberg791d60f2013-05-14 22:24:44 +0300683
684 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, sizeof(rsp), &rsp);
685}
686
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300687void l2cap_chan_close(struct l2cap_chan *chan, int reason)
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300688{
689 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300690
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700691 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300692
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300693 switch (chan->state) {
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300694 case BT_LISTEN:
Gustavo Padovanb699ec02012-10-06 11:51:54 +0100695 chan->ops->teardown(chan, 0);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300696 break;
697
698 case BT_CONNECTED:
699 case BT_CONFIG:
Johan Hedberg7b25c9b2014-01-28 15:28:04 -0800700 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED) {
Gustavo Padovan8d836d72013-10-15 19:24:47 -0300701 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +0200702 l2cap_send_disconn_req(chan, reason);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300703 } else
704 l2cap_chan_del(chan, reason);
705 break;
706
707 case BT_CONNECT2:
Johan Hedberg791d60f2013-05-14 22:24:44 +0300708 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED) {
709 if (conn->hcon->type == ACL_LINK)
710 l2cap_chan_connect_reject(chan);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +0300711 else if (conn->hcon->type == LE_LINK)
712 l2cap_chan_le_connect_reject(chan);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300713 }
714
715 l2cap_chan_del(chan, reason);
716 break;
717
718 case BT_CONNECT:
719 case BT_DISCONN:
720 l2cap_chan_del(chan, reason);
721 break;
722
723 default:
Gustavo Padovanb699ec02012-10-06 11:51:54 +0100724 chan->ops->teardown(chan, 0);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300725 break;
726 }
727}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300728EXPORT_SYMBOL(l2cap_chan_close);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300729
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300730static inline u8 l2cap_get_auth_type(struct l2cap_chan *chan)
Johan Hedberg8556edd32011-01-19 12:06:50 +0530731{
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700732 switch (chan->chan_type) {
733 case L2CAP_CHAN_RAW:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300734 switch (chan->sec_level) {
Johan Hedberg8556edd32011-01-19 12:06:50 +0530735 case BT_SECURITY_HIGH:
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800736 case BT_SECURITY_FIPS:
Johan Hedberg8556edd32011-01-19 12:06:50 +0530737 return HCI_AT_DEDICATED_BONDING_MITM;
738 case BT_SECURITY_MEDIUM:
739 return HCI_AT_DEDICATED_BONDING;
740 default:
741 return HCI_AT_NO_BONDING;
742 }
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700743 break;
Marcel Holtmann3124b842013-10-12 07:19:32 -0700744 case L2CAP_CHAN_CONN_LESS:
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700745 if (chan->psm == cpu_to_le16(L2CAP_PSM_3DSP)) {
Marcel Holtmann3124b842013-10-12 07:19:32 -0700746 if (chan->sec_level == BT_SECURITY_LOW)
747 chan->sec_level = BT_SECURITY_SDP;
748 }
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800749 if (chan->sec_level == BT_SECURITY_HIGH ||
750 chan->sec_level == BT_SECURITY_FIPS)
Marcel Holtmann3124b842013-10-12 07:19:32 -0700751 return HCI_AT_NO_BONDING_MITM;
752 else
753 return HCI_AT_NO_BONDING;
754 break;
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700755 case L2CAP_CHAN_CONN_ORIENTED:
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700756 if (chan->psm == cpu_to_le16(L2CAP_PSM_SDP)) {
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700757 if (chan->sec_level == BT_SECURITY_LOW)
758 chan->sec_level = BT_SECURITY_SDP;
Johan Hedberg8556edd32011-01-19 12:06:50 +0530759
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800760 if (chan->sec_level == BT_SECURITY_HIGH ||
761 chan->sec_level == BT_SECURITY_FIPS)
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700762 return HCI_AT_NO_BONDING_MITM;
763 else
764 return HCI_AT_NO_BONDING;
765 }
766 /* fall through */
767 default:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300768 switch (chan->sec_level) {
Johan Hedberg8556edd32011-01-19 12:06:50 +0530769 case BT_SECURITY_HIGH:
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800770 case BT_SECURITY_FIPS:
Johan Hedberg8556edd32011-01-19 12:06:50 +0530771 return HCI_AT_GENERAL_BONDING_MITM;
772 case BT_SECURITY_MEDIUM:
773 return HCI_AT_GENERAL_BONDING;
774 default:
775 return HCI_AT_NO_BONDING;
776 }
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700777 break;
Johan Hedberg8556edd32011-01-19 12:06:50 +0530778 }
779}
780
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200781/* Service level security */
Johan Hedberge7cafc42014-07-17 15:35:38 +0300782int l2cap_chan_check_security(struct l2cap_chan *chan, bool initiator)
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200783{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300784 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100785 __u8 auth_type;
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200786
Johan Hedberga17de2f2013-05-14 13:25:37 +0300787 if (conn->hcon->type == LE_LINK)
788 return smp_conn_security(conn->hcon, chan->sec_level);
789
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300790 auth_type = l2cap_get_auth_type(chan);
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100791
Johan Hedberge7cafc42014-07-17 15:35:38 +0300792 return hci_conn_security(conn->hcon, chan->sec_level, auth_type,
793 initiator);
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200794}
795
Johannes Bergb5ad8b72011-06-01 08:54:45 +0200796static u8 l2cap_get_ident(struct l2cap_conn *conn)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200797{
798 u8 id;
799
800 /* Get next available identificator.
801 * 1 - 128 are used by kernel.
802 * 129 - 199 are reserved.
803 * 200 - 254 are used by utilities like l2ping, etc.
804 */
805
Marcel Holtmann5a54e7c2014-07-13 20:50:15 +0200806 mutex_lock(&conn->ident_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200807
808 if (++conn->tx_ident > 128)
809 conn->tx_ident = 1;
810
811 id = conn->tx_ident;
812
Marcel Holtmann5a54e7c2014-07-13 20:50:15 +0200813 mutex_unlock(&conn->ident_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200814
815 return id;
816}
817
Gustavo Padovan2d792812012-10-06 10:07:01 +0100818static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len,
819 void *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200820{
821 struct sk_buff *skb = l2cap_build_cmd(conn, code, ident, len, data);
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +0200822 u8 flags;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200823
824 BT_DBG("code 0x%2.2x", code);
825
826 if (!skb)
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -0300827 return;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200828
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +0200829 if (lmp_no_flush_capable(conn->hcon->hdev))
830 flags = ACL_START_NO_FLUSH;
831 else
832 flags = ACL_START;
833
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700834 bt_cb(skb)->force_active = BT_POWER_FORCE_ACTIVE_ON;
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +0200835 skb->priority = HCI_PRIO_MAX;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700836
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200837 hci_send_acl(conn->hchan, skb, flags);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200838}
839
Mat Martineau02b0fbb2012-10-23 15:24:10 -0700840static bool __chan_is_moving(struct l2cap_chan *chan)
841{
842 return chan->move_state != L2CAP_MOVE_STABLE &&
843 chan->move_state != L2CAP_MOVE_WAIT_PREPARE;
844}
845
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200846static void l2cap_do_send(struct l2cap_chan *chan, struct sk_buff *skb)
847{
848 struct hci_conn *hcon = chan->conn->hcon;
849 u16 flags;
850
851 BT_DBG("chan %p, skb %p len %d priority %u", chan, skb, skb->len,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100852 skb->priority);
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200853
Mat Martineaud5f8a752012-10-23 15:24:18 -0700854 if (chan->hs_hcon && !__chan_is_moving(chan)) {
855 if (chan->hs_hchan)
856 hci_send_acl(chan->hs_hchan, skb, ACL_COMPLETE);
857 else
858 kfree_skb(skb);
859
860 return;
861 }
862
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200863 if (!test_bit(FLAG_FLUSHABLE, &chan->flags) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100864 lmp_no_flush_capable(hcon->hdev))
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200865 flags = ACL_START_NO_FLUSH;
866 else
867 flags = ACL_START;
868
869 bt_cb(skb)->force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
870 hci_send_acl(chan->conn->hchan, skb, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700871}
872
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700873static void __unpack_enhanced_control(u16 enh, struct l2cap_ctrl *control)
874{
875 control->reqseq = (enh & L2CAP_CTRL_REQSEQ) >> L2CAP_CTRL_REQSEQ_SHIFT;
876 control->final = (enh & L2CAP_CTRL_FINAL) >> L2CAP_CTRL_FINAL_SHIFT;
877
878 if (enh & L2CAP_CTRL_FRAME_TYPE) {
879 /* S-Frame */
880 control->sframe = 1;
881 control->poll = (enh & L2CAP_CTRL_POLL) >> L2CAP_CTRL_POLL_SHIFT;
882 control->super = (enh & L2CAP_CTRL_SUPERVISE) >> L2CAP_CTRL_SUPER_SHIFT;
883
884 control->sar = 0;
885 control->txseq = 0;
886 } else {
887 /* I-Frame */
888 control->sframe = 0;
889 control->sar = (enh & L2CAP_CTRL_SAR) >> L2CAP_CTRL_SAR_SHIFT;
890 control->txseq = (enh & L2CAP_CTRL_TXSEQ) >> L2CAP_CTRL_TXSEQ_SHIFT;
891
892 control->poll = 0;
893 control->super = 0;
894 }
895}
896
897static void __unpack_extended_control(u32 ext, struct l2cap_ctrl *control)
898{
899 control->reqseq = (ext & L2CAP_EXT_CTRL_REQSEQ) >> L2CAP_EXT_CTRL_REQSEQ_SHIFT;
900 control->final = (ext & L2CAP_EXT_CTRL_FINAL) >> L2CAP_EXT_CTRL_FINAL_SHIFT;
901
902 if (ext & L2CAP_EXT_CTRL_FRAME_TYPE) {
903 /* S-Frame */
904 control->sframe = 1;
905 control->poll = (ext & L2CAP_EXT_CTRL_POLL) >> L2CAP_EXT_CTRL_POLL_SHIFT;
906 control->super = (ext & L2CAP_EXT_CTRL_SUPERVISE) >> L2CAP_EXT_CTRL_SUPER_SHIFT;
907
908 control->sar = 0;
909 control->txseq = 0;
910 } else {
911 /* I-Frame */
912 control->sframe = 0;
913 control->sar = (ext & L2CAP_EXT_CTRL_SAR) >> L2CAP_EXT_CTRL_SAR_SHIFT;
914 control->txseq = (ext & L2CAP_EXT_CTRL_TXSEQ) >> L2CAP_EXT_CTRL_TXSEQ_SHIFT;
915
916 control->poll = 0;
917 control->super = 0;
918 }
919}
920
921static inline void __unpack_control(struct l2cap_chan *chan,
922 struct sk_buff *skb)
923{
924 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
925 __unpack_extended_control(get_unaligned_le32(skb->data),
926 &bt_cb(skb)->control);
Mat Martineaucec8ab6e2012-05-17 20:53:36 -0700927 skb_pull(skb, L2CAP_EXT_CTRL_SIZE);
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700928 } else {
929 __unpack_enhanced_control(get_unaligned_le16(skb->data),
930 &bt_cb(skb)->control);
Mat Martineaucec8ab6e2012-05-17 20:53:36 -0700931 skb_pull(skb, L2CAP_ENH_CTRL_SIZE);
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700932 }
933}
934
935static u32 __pack_extended_control(struct l2cap_ctrl *control)
936{
937 u32 packed;
938
939 packed = control->reqseq << L2CAP_EXT_CTRL_REQSEQ_SHIFT;
940 packed |= control->final << L2CAP_EXT_CTRL_FINAL_SHIFT;
941
942 if (control->sframe) {
943 packed |= control->poll << L2CAP_EXT_CTRL_POLL_SHIFT;
944 packed |= control->super << L2CAP_EXT_CTRL_SUPER_SHIFT;
945 packed |= L2CAP_EXT_CTRL_FRAME_TYPE;
946 } else {
947 packed |= control->sar << L2CAP_EXT_CTRL_SAR_SHIFT;
948 packed |= control->txseq << L2CAP_EXT_CTRL_TXSEQ_SHIFT;
949 }
950
951 return packed;
952}
953
954static u16 __pack_enhanced_control(struct l2cap_ctrl *control)
955{
956 u16 packed;
957
958 packed = control->reqseq << L2CAP_CTRL_REQSEQ_SHIFT;
959 packed |= control->final << L2CAP_CTRL_FINAL_SHIFT;
960
961 if (control->sframe) {
962 packed |= control->poll << L2CAP_CTRL_POLL_SHIFT;
963 packed |= control->super << L2CAP_CTRL_SUPER_SHIFT;
964 packed |= L2CAP_CTRL_FRAME_TYPE;
965 } else {
966 packed |= control->sar << L2CAP_CTRL_SAR_SHIFT;
967 packed |= control->txseq << L2CAP_CTRL_TXSEQ_SHIFT;
968 }
969
970 return packed;
971}
972
973static inline void __pack_control(struct l2cap_chan *chan,
974 struct l2cap_ctrl *control,
975 struct sk_buff *skb)
976{
977 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
978 put_unaligned_le32(__pack_extended_control(control),
979 skb->data + L2CAP_HDR_SIZE);
980 } else {
981 put_unaligned_le16(__pack_enhanced_control(control),
982 skb->data + L2CAP_HDR_SIZE);
983 }
984}
985
Gustavo Padovanba7aa642012-05-29 13:29:16 -0300986static inline unsigned int __ertm_hdr_size(struct l2cap_chan *chan)
987{
988 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
989 return L2CAP_EXT_HDR_SIZE;
990 else
991 return L2CAP_ENH_HDR_SIZE;
992}
993
Mat Martineaua67d7f62012-05-17 20:53:35 -0700994static struct sk_buff *l2cap_create_sframe_pdu(struct l2cap_chan *chan,
995 u32 control)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300996{
997 struct sk_buff *skb;
998 struct l2cap_hdr *lh;
Gustavo Padovanba7aa642012-05-29 13:29:16 -0300999 int hlen = __ertm_hdr_size(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001000
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001001 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03001002 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001003
Mat Martineaua67d7f62012-05-17 20:53:35 -07001004 skb = bt_skb_alloc(hlen, GFP_KERNEL);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001005
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001006 if (!skb)
Mat Martineaua67d7f62012-05-17 20:53:35 -07001007 return ERR_PTR(-ENOMEM);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001008
1009 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001010 lh->len = cpu_to_le16(hlen - L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001011 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03001012
Mat Martineaua67d7f62012-05-17 20:53:35 -07001013 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
1014 put_unaligned_le32(control, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
1015 else
1016 put_unaligned_le16(control, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001017
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001018 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineaua67d7f62012-05-17 20:53:35 -07001019 u16 fcs = crc16(0, (u8 *)skb->data, skb->len);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03001020 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001021 }
1022
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001023 skb->priority = HCI_PRIO_MAX;
Mat Martineaua67d7f62012-05-17 20:53:35 -07001024 return skb;
1025}
1026
1027static void l2cap_send_sframe(struct l2cap_chan *chan,
1028 struct l2cap_ctrl *control)
1029{
1030 struct sk_buff *skb;
1031 u32 control_field;
1032
1033 BT_DBG("chan %p, control %p", chan, control);
1034
1035 if (!control->sframe)
1036 return;
1037
Mat Martineaub99e13a2012-10-23 15:24:19 -07001038 if (__chan_is_moving(chan))
1039 return;
1040
Mat Martineaua67d7f62012-05-17 20:53:35 -07001041 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state) &&
1042 !control->poll)
1043 control->final = 1;
1044
1045 if (control->super == L2CAP_SUPER_RR)
1046 clear_bit(CONN_RNR_SENT, &chan->conn_state);
1047 else if (control->super == L2CAP_SUPER_RNR)
1048 set_bit(CONN_RNR_SENT, &chan->conn_state);
1049
1050 if (control->super != L2CAP_SUPER_SREJ) {
1051 chan->last_acked_seq = control->reqseq;
1052 __clear_ack_timer(chan);
1053 }
1054
1055 BT_DBG("reqseq %d, final %d, poll %d, super %d", control->reqseq,
1056 control->final, control->poll, control->super);
1057
1058 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
1059 control_field = __pack_extended_control(control);
1060 else
1061 control_field = __pack_enhanced_control(control);
1062
1063 skb = l2cap_create_sframe_pdu(chan, control_field);
1064 if (!IS_ERR(skb))
1065 l2cap_do_send(chan, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001066}
1067
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001068static void l2cap_send_rr_or_rnr(struct l2cap_chan *chan, bool poll)
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001069{
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001070 struct l2cap_ctrl control;
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001071
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001072 BT_DBG("chan %p, poll %d", chan, poll);
1073
1074 memset(&control, 0, sizeof(control));
1075 control.sframe = 1;
1076 control.poll = poll;
1077
1078 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
1079 control.super = L2CAP_SUPER_RNR;
1080 else
1081 control.super = L2CAP_SUPER_RR;
1082
1083 control.reqseq = chan->buffer_seq;
1084 l2cap_send_sframe(chan, &control);
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001085}
1086
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001087static inline int __l2cap_no_conn_pending(struct l2cap_chan *chan)
Andrei Emeltchenkoe501d052010-07-08 12:14:41 +03001088{
Johan Hedberg5ff6f342014-08-07 22:56:43 +03001089 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED)
1090 return true;
1091
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001092 return !test_bit(CONF_CONNECT_PEND, &chan->conf_state);
Andrei Emeltchenkoe501d052010-07-08 12:14:41 +03001093}
1094
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001095static bool __amp_capable(struct l2cap_chan *chan)
1096{
1097 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann1df7b172013-10-05 11:47:49 -07001098 struct hci_dev *hdev;
1099 bool amp_available = false;
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001100
Marcel Holtmann1df7b172013-10-05 11:47:49 -07001101 if (!conn->hs_enabled)
1102 return false;
1103
1104 if (!(conn->fixed_chan_mask & L2CAP_FC_A2MP))
1105 return false;
1106
1107 read_lock(&hci_dev_list_lock);
1108 list_for_each_entry(hdev, &hci_dev_list, list) {
1109 if (hdev->amp_type != AMP_TYPE_BREDR &&
1110 test_bit(HCI_UP, &hdev->flags)) {
1111 amp_available = true;
1112 break;
1113 }
1114 }
1115 read_unlock(&hci_dev_list_lock);
1116
1117 if (chan->chan_policy == BT_CHANNEL_POLICY_AMP_PREFERRED)
1118 return amp_available;
Marcel Holtmann848566b2013-10-01 22:59:22 -07001119
1120 return false;
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001121}
1122
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02001123static bool l2cap_check_efs(struct l2cap_chan *chan)
1124{
1125 /* Check EFS parameters */
1126 return true;
1127}
1128
Andrei Emeltchenko2766be42012-09-27 17:26:21 +03001129void l2cap_send_conn_req(struct l2cap_chan *chan)
Andrei Emeltchenko9b27f352012-02-24 16:00:00 +02001130{
1131 struct l2cap_conn *conn = chan->conn;
1132 struct l2cap_conn_req req;
1133
1134 req.scid = cpu_to_le16(chan->scid);
1135 req.psm = chan->psm;
1136
1137 chan->ident = l2cap_get_ident(conn);
1138
1139 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
1140
1141 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_REQ, sizeof(req), &req);
1142}
1143
Mat Martineau8eb200b2012-10-23 15:24:17 -07001144static void l2cap_send_create_chan_req(struct l2cap_chan *chan, u8 amp_id)
1145{
1146 struct l2cap_create_chan_req req;
1147 req.scid = cpu_to_le16(chan->scid);
1148 req.psm = chan->psm;
1149 req.amp_id = amp_id;
1150
1151 chan->ident = l2cap_get_ident(chan->conn);
1152
1153 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_REQ,
1154 sizeof(req), &req);
1155}
1156
Mat Martineau02b0fbb2012-10-23 15:24:10 -07001157static void l2cap_move_setup(struct l2cap_chan *chan)
1158{
1159 struct sk_buff *skb;
1160
1161 BT_DBG("chan %p", chan);
1162
1163 if (chan->mode != L2CAP_MODE_ERTM)
1164 return;
1165
1166 __clear_retrans_timer(chan);
1167 __clear_monitor_timer(chan);
1168 __clear_ack_timer(chan);
1169
1170 chan->retry_count = 0;
1171 skb_queue_walk(&chan->tx_q, skb) {
1172 if (bt_cb(skb)->control.retries)
1173 bt_cb(skb)->control.retries = 1;
1174 else
1175 break;
1176 }
1177
1178 chan->expected_tx_seq = chan->buffer_seq;
1179
1180 clear_bit(CONN_REJ_ACT, &chan->conn_state);
1181 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
1182 l2cap_seq_list_clear(&chan->retrans_list);
1183 l2cap_seq_list_clear(&chan->srej_list);
1184 skb_queue_purge(&chan->srej_q);
1185
1186 chan->tx_state = L2CAP_TX_STATE_XMIT;
1187 chan->rx_state = L2CAP_RX_STATE_MOVE;
1188
1189 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
1190}
1191
Mat Martineau5f3847a2012-10-23 15:24:12 -07001192static void l2cap_move_done(struct l2cap_chan *chan)
1193{
1194 u8 move_role = chan->move_role;
1195 BT_DBG("chan %p", chan);
1196
1197 chan->move_state = L2CAP_MOVE_STABLE;
1198 chan->move_role = L2CAP_MOVE_ROLE_NONE;
1199
1200 if (chan->mode != L2CAP_MODE_ERTM)
1201 return;
1202
1203 switch (move_role) {
1204 case L2CAP_MOVE_ROLE_INITIATOR:
1205 l2cap_tx(chan, NULL, NULL, L2CAP_EV_EXPLICIT_POLL);
1206 chan->rx_state = L2CAP_RX_STATE_WAIT_F;
1207 break;
1208 case L2CAP_MOVE_ROLE_RESPONDER:
1209 chan->rx_state = L2CAP_RX_STATE_WAIT_P;
1210 break;
1211 }
1212}
1213
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001214static void l2cap_chan_ready(struct l2cap_chan *chan)
1215{
Mat Martineau28270112012-05-17 21:14:09 -07001216 /* This clears all conf flags, including CONF_NOT_COMPLETE */
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001217 chan->conf_state = 0;
1218 __clear_chan_timer(chan);
1219
Johan Hedberg0ce43ce2013-12-05 14:55:33 +02001220 if (chan->mode == L2CAP_MODE_LE_FLOWCTL && !chan->tx_credits)
1221 chan->ops->suspend(chan);
Johan Hedberg177f8f22013-05-31 17:54:51 +03001222
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001223 chan->state = BT_CONNECTED;
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001224
Andrei Emeltchenkofd83e2c2012-05-30 09:55:32 +03001225 chan->ops->ready(chan);
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001226}
1227
Johan Hedbergf1496de2013-05-13 14:15:56 +03001228static void l2cap_le_connect(struct l2cap_chan *chan)
1229{
1230 struct l2cap_conn *conn = chan->conn;
1231 struct l2cap_le_conn_req req;
1232
Johan Hedberg595177f2013-12-02 22:12:22 +02001233 if (test_and_set_bit(FLAG_LE_CONN_REQ_SENT, &chan->flags))
1234 return;
1235
Johan Hedbergf1496de2013-05-13 14:15:56 +03001236 req.psm = chan->psm;
1237 req.scid = cpu_to_le16(chan->scid);
1238 req.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02001239 req.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03001240 req.credits = cpu_to_le16(chan->rx_credits);
Johan Hedbergf1496de2013-05-13 14:15:56 +03001241
1242 chan->ident = l2cap_get_ident(conn);
1243
1244 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_REQ,
1245 sizeof(req), &req);
1246}
1247
1248static void l2cap_le_start(struct l2cap_chan *chan)
1249{
1250 struct l2cap_conn *conn = chan->conn;
1251
1252 if (!smp_conn_security(conn->hcon, chan->sec_level))
1253 return;
1254
1255 if (!chan->psm) {
1256 l2cap_chan_ready(chan);
1257 return;
1258 }
1259
1260 if (chan->state == BT_CONNECT)
1261 l2cap_le_connect(chan);
1262}
1263
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001264static void l2cap_start_connection(struct l2cap_chan *chan)
1265{
1266 if (__amp_capable(chan)) {
1267 BT_DBG("chan %p AMP capable: discover AMPs", chan);
1268 a2mp_discover_amp(chan);
Johan Hedbergf1496de2013-05-13 14:15:56 +03001269 } else if (chan->conn->hcon->type == LE_LINK) {
1270 l2cap_le_start(chan);
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001271 } else {
1272 l2cap_send_conn_req(chan);
1273 }
1274}
1275
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001276static void l2cap_do_start(struct l2cap_chan *chan)
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001277{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03001278 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001279
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001280 if (conn->hcon->type == LE_LINK) {
Johan Hedberg96ac34f2013-05-13 11:15:07 +03001281 l2cap_le_start(chan);
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001282 return;
1283 }
1284
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001285 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) {
Marcel Holtmann984947d2009-02-06 23:35:19 +01001286 if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE))
1287 return;
1288
Johan Hedberge7cafc42014-07-17 15:35:38 +03001289 if (l2cap_chan_check_security(chan, true) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01001290 __l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001291 l2cap_start_connection(chan);
1292 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001293 } else {
1294 struct l2cap_info_req req;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001295 req.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001296
1297 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
1298 conn->info_ident = l2cap_get_ident(conn);
1299
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08001300 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001301
Gustavo Padovan2d792812012-10-06 10:07:01 +01001302 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
1303 sizeof(req), &req);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001304 }
1305}
1306
Gustavo F. Padovancf6c2c02010-06-07 20:54:45 -03001307static inline int l2cap_mode_supported(__u8 mode, __u32 feat_mask)
1308{
1309 u32 local_feat_mask = l2cap_feat_mask;
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03001310 if (!disable_ertm)
Gustavo F. Padovancf6c2c02010-06-07 20:54:45 -03001311 local_feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING;
1312
1313 switch (mode) {
1314 case L2CAP_MODE_ERTM:
1315 return L2CAP_FEAT_ERTM & feat_mask & local_feat_mask;
1316 case L2CAP_MODE_STREAMING:
1317 return L2CAP_FEAT_STREAMING & feat_mask & local_feat_mask;
1318 default:
1319 return 0x00;
1320 }
1321}
1322
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001323static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err)
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001324{
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001325 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001326 struct l2cap_disconn_req req;
1327
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001328 if (!conn)
1329 return;
1330
Andrei Emeltchenkoaad3d0e2012-09-06 15:05:42 +03001331 if (chan->mode == L2CAP_MODE_ERTM && chan->state == BT_CONNECTED) {
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03001332 __clear_retrans_timer(chan);
1333 __clear_monitor_timer(chan);
1334 __clear_ack_timer(chan);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001335 }
1336
Johan Hedberg2338a7e2014-01-24 10:35:40 +02001337 if (chan->scid == L2CAP_CID_A2MP) {
Gustavo Padovand1177732012-10-06 11:47:38 +01001338 l2cap_state_change(chan, BT_DISCONN);
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001339 return;
1340 }
1341
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001342 req.dcid = cpu_to_le16(chan->dcid);
1343 req.scid = cpu_to_le16(chan->scid);
Gustavo Padovan2d792812012-10-06 10:07:01 +01001344 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_DISCONN_REQ,
1345 sizeof(req), &req);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001346
Gustavo Padovanf8e73012013-10-15 19:24:46 -03001347 l2cap_state_change_and_error(chan, BT_DISCONN, err);
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001348}
1349
Linus Torvalds1da177e2005-04-16 15:20:36 -07001350/* ---- L2CAP connections ---- */
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001351static void l2cap_conn_start(struct l2cap_conn *conn)
1352{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001353 struct l2cap_chan *chan, *tmp;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001354
1355 BT_DBG("conn %p", conn);
1356
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001357 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001358
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001359 list_for_each_entry_safe(chan, tmp, &conn->chan_l, list) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001360 l2cap_chan_lock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001361
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001362 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001363 l2cap_chan_unlock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001364 continue;
1365 }
1366
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001367 if (chan->state == BT_CONNECT) {
Johan Hedberge7cafc42014-07-17 15:35:38 +03001368 if (!l2cap_chan_check_security(chan, true) ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01001369 !__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001370 l2cap_chan_unlock(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001371 continue;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02001372 }
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001373
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001374 if (!l2cap_mode_supported(chan->mode, conn->feat_mask)
Gustavo Padovan2d792812012-10-06 10:07:01 +01001375 && test_bit(CONF_STATE2_DEVICE,
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001376 &chan->conf_state)) {
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001377 l2cap_chan_close(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001378 l2cap_chan_unlock(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001379 continue;
1380 }
1381
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001382 l2cap_start_connection(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001383
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001384 } else if (chan->state == BT_CONNECT2) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001385 struct l2cap_conn_rsp rsp;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001386 char buf[128];
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001387 rsp.scid = cpu_to_le16(chan->dcid);
1388 rsp.dcid = cpu_to_le16(chan->scid);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001389
Johan Hedberge7cafc42014-07-17 15:35:38 +03001390 if (l2cap_chan_check_security(chan, false)) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07001391 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001392 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
1393 rsp.status = cpu_to_le16(L2CAP_CS_AUTHOR_PEND);
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001394 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001395
1396 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001397 l2cap_state_change(chan, BT_CONFIG);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001398 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
1399 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001400 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001401 } else {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001402 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
1403 rsp.status = cpu_to_le16(L2CAP_CS_AUTHEN_PEND);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001404 }
1405
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001406 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001407 sizeof(rsp), &rsp);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001408
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001409 if (test_bit(CONF_REQ_SENT, &chan->conf_state) ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01001410 rsp.result != L2CAP_CR_SUCCESS) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001411 l2cap_chan_unlock(chan);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001412 continue;
1413 }
1414
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001415 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001416 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001417 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03001418 chan->num_conf_req++;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001419 }
1420
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001421 l2cap_chan_unlock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001422 }
1423
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001424 mutex_unlock(&conn->chan_lock);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001425}
1426
Ville Tervob62f3282011-02-10 22:38:50 -03001427static void l2cap_le_conn_ready(struct l2cap_conn *conn)
1428{
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001429 struct hci_conn *hcon = conn->hcon;
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001430 struct hci_dev *hdev = hcon->hdev;
Ville Tervob62f3282011-02-10 22:38:50 -03001431
Johan Hedberge760ec12014-08-07 22:56:47 +03001432 BT_DBG("%s conn %p", hdev->name, conn);
Ville Tervob62f3282011-02-10 22:38:50 -03001433
Johan Hedberge760ec12014-08-07 22:56:47 +03001434 /* For outgoing pairing which doesn't necessarily have an
1435 * associated socket (e.g. mgmt_pair_device).
1436 */
1437 if (hcon->out)
1438 smp_conn_security(hcon, hcon->pending_sec_level);
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001439
Marcel Holtmann80afeb62014-06-23 12:18:51 +02001440 /* For LE slave connections, make sure the connection interval
1441 * is in the range of the minium and maximum interval that has
1442 * been configured for this connection. If not, then trigger
1443 * the connection update procedure.
1444 */
Johan Hedberg40bef302014-07-16 11:42:27 +03001445 if (hcon->role == HCI_ROLE_SLAVE &&
Marcel Holtmann80afeb62014-06-23 12:18:51 +02001446 (hcon->le_conn_interval < hcon->le_conn_min_interval ||
1447 hcon->le_conn_interval > hcon->le_conn_max_interval)) {
1448 struct l2cap_conn_param_update_req req;
1449
1450 req.min = cpu_to_le16(hcon->le_conn_min_interval);
1451 req.max = cpu_to_le16(hcon->le_conn_max_interval);
1452 req.latency = cpu_to_le16(hcon->le_conn_latency);
1453 req.to_multiplier = cpu_to_le16(hcon->le_supv_timeout);
1454
1455 l2cap_send_cmd(conn, l2cap_get_ident(conn),
1456 L2CAP_CONN_PARAM_UPDATE_REQ, sizeof(req), &req);
1457 }
Ville Tervob62f3282011-02-10 22:38:50 -03001458}
1459
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001460static void l2cap_conn_ready(struct l2cap_conn *conn)
1461{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001462 struct l2cap_chan *chan;
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001463 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001464
1465 BT_DBG("conn %p", conn);
1466
Johan Hedberge760ec12014-08-07 22:56:47 +03001467 mutex_lock(&conn->chan_lock);
1468
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001469 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03001470
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001471 l2cap_chan_lock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001472
Johan Hedberg2338a7e2014-01-24 10:35:40 +02001473 if (chan->scid == L2CAP_CID_A2MP) {
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001474 l2cap_chan_unlock(chan);
1475 continue;
1476 }
1477
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001478 if (hcon->type == LE_LINK) {
Johan Hedbergf1496de2013-05-13 14:15:56 +03001479 l2cap_le_start(chan);
Vinicius Costa Gomes63128452011-06-17 22:46:26 -03001480 } else if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Gustavo Padovan74e75742013-10-15 19:24:51 -03001481 l2cap_chan_ready(chan);
Anderson Brigliab501d6a2011-06-07 18:46:31 -03001482
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001483 } else if (chan->state == BT_CONNECT) {
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001484 l2cap_do_start(chan);
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001485 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001486
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001487 l2cap_chan_unlock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001488 }
1489
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001490 mutex_unlock(&conn->chan_lock);
Johan Hedberg61a939c2014-01-17 20:45:11 +02001491
Johan Hedberg79a05722014-08-08 09:28:04 +03001492 if (hcon->type == LE_LINK)
1493 l2cap_le_conn_ready(conn);
1494
Johan Hedberg61a939c2014-01-17 20:45:11 +02001495 queue_work(hcon->hdev->workqueue, &conn->pending_rx_work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001496}
1497
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001498/* Notify sockets that we cannot guaranty reliability anymore */
1499static void l2cap_conn_unreliable(struct l2cap_conn *conn, int err)
1500{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001501 struct l2cap_chan *chan;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001502
1503 BT_DBG("conn %p", conn);
1504
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001505 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001506
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001507 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +03001508 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo Padovan1d8b1fd2012-10-06 11:34:52 +01001509 l2cap_chan_set_err(chan, err);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001510 }
1511
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001512 mutex_unlock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001513}
1514
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001515static void l2cap_info_timeout(struct work_struct *work)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001516{
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001517 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001518 info_timer.work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001519
Marcel Holtmann984947d2009-02-06 23:35:19 +01001520 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01001521 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01001522
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001523 l2cap_conn_start(conn);
1524}
1525
David Herrmann2c8e1412013-04-06 20:28:45 +02001526/*
1527 * l2cap_user
1528 * External modules can register l2cap_user objects on l2cap_conn. The ->probe
1529 * callback is called during registration. The ->remove callback is called
1530 * during unregistration.
1531 * An l2cap_user object can either be explicitly unregistered or when the
1532 * underlying l2cap_conn object is deleted. This guarantees that l2cap->hcon,
1533 * l2cap->hchan, .. are valid as long as the remove callback hasn't been called.
1534 * External modules must own a reference to the l2cap_conn object if they intend
1535 * to call l2cap_unregister_user(). The l2cap_conn object might get destroyed at
1536 * any time if they don't.
1537 */
1538
1539int l2cap_register_user(struct l2cap_conn *conn, struct l2cap_user *user)
1540{
1541 struct hci_dev *hdev = conn->hcon->hdev;
1542 int ret;
1543
1544 /* We need to check whether l2cap_conn is registered. If it is not, we
1545 * must not register the l2cap_user. l2cap_conn_del() is unregisters
1546 * l2cap_conn objects, but doesn't provide its own locking. Instead, it
1547 * relies on the parent hci_conn object to be locked. This itself relies
1548 * on the hci_dev object to be locked. So we must lock the hci device
1549 * here, too. */
1550
1551 hci_dev_lock(hdev);
1552
1553 if (user->list.next || user->list.prev) {
1554 ret = -EINVAL;
1555 goto out_unlock;
1556 }
1557
1558 /* conn->hchan is NULL after l2cap_conn_del() was called */
1559 if (!conn->hchan) {
1560 ret = -ENODEV;
1561 goto out_unlock;
1562 }
1563
1564 ret = user->probe(conn, user);
1565 if (ret)
1566 goto out_unlock;
1567
1568 list_add(&user->list, &conn->users);
1569 ret = 0;
1570
1571out_unlock:
1572 hci_dev_unlock(hdev);
1573 return ret;
1574}
1575EXPORT_SYMBOL(l2cap_register_user);
1576
1577void l2cap_unregister_user(struct l2cap_conn *conn, struct l2cap_user *user)
1578{
1579 struct hci_dev *hdev = conn->hcon->hdev;
1580
1581 hci_dev_lock(hdev);
1582
1583 if (!user->list.next || !user->list.prev)
1584 goto out_unlock;
1585
1586 list_del(&user->list);
1587 user->list.next = NULL;
1588 user->list.prev = NULL;
1589 user->remove(conn, user);
1590
1591out_unlock:
1592 hci_dev_unlock(hdev);
1593}
1594EXPORT_SYMBOL(l2cap_unregister_user);
1595
1596static void l2cap_unregister_all_users(struct l2cap_conn *conn)
1597{
1598 struct l2cap_user *user;
1599
1600 while (!list_empty(&conn->users)) {
1601 user = list_first_entry(&conn->users, struct l2cap_user, list);
1602 list_del(&user->list);
1603 user->list.next = NULL;
1604 user->list.prev = NULL;
1605 user->remove(conn, user);
1606 }
1607}
1608
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001609static void l2cap_conn_del(struct hci_conn *hcon, int err)
1610{
1611 struct l2cap_conn *conn = hcon->l2cap_data;
1612 struct l2cap_chan *chan, *l;
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001613
1614 if (!conn)
1615 return;
1616
1617 BT_DBG("hcon %p conn %p, err %d", hcon, conn, err);
1618
1619 kfree_skb(conn->rx_skb);
1620
Johan Hedberg61a939c2014-01-17 20:45:11 +02001621 skb_queue_purge(&conn->pending_rx);
Jukka Taimisto7ab56c32014-06-12 10:15:13 +00001622
1623 /* We can not call flush_work(&conn->pending_rx_work) here since we
1624 * might block if we are running on a worker from the same workqueue
1625 * pending_rx_work is waiting on.
1626 */
1627 if (work_pending(&conn->pending_rx_work))
1628 cancel_work_sync(&conn->pending_rx_work);
Johan Hedberg61a939c2014-01-17 20:45:11 +02001629
Johan Hedbergdec5b492014-08-11 22:06:37 +03001630 if (work_pending(&conn->disconn_work))
1631 cancel_work_sync(&conn->disconn_work);
1632
David Herrmann2c8e1412013-04-06 20:28:45 +02001633 l2cap_unregister_all_users(conn);
1634
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001635 mutex_lock(&conn->chan_lock);
1636
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001637 /* Kill channels */
1638 list_for_each_entry_safe(chan, l, &conn->chan_l, list) {
Mat Martineau61d6ef32012-04-27 16:50:50 -07001639 l2cap_chan_hold(chan);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001640 l2cap_chan_lock(chan);
1641
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001642 l2cap_chan_del(chan, err);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001643
1644 l2cap_chan_unlock(chan);
1645
Gustavo Padovan80b98022012-05-27 22:27:51 -03001646 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07001647 l2cap_chan_put(chan);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001648 }
1649
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001650 mutex_unlock(&conn->chan_lock);
1651
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001652 hci_chan_del(conn->hchan);
1653
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001654 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT)
Ulisses Furquim127074b2012-01-30 18:26:29 -02001655 cancel_delayed_work_sync(&conn->info_timer);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001656
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001657 hcon->l2cap_data = NULL;
David Herrmann9c903e32013-04-06 20:28:44 +02001658 conn->hchan = NULL;
1659 l2cap_conn_put(conn);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001660}
1661
Johan Hedbergdec5b492014-08-11 22:06:37 +03001662static void disconn_work(struct work_struct *work)
1663{
1664 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
1665 disconn_work);
1666
1667 BT_DBG("conn %p", conn);
1668
1669 l2cap_conn_del(conn->hcon, conn->disconn_err);
1670}
1671
1672void l2cap_conn_shutdown(struct l2cap_conn *conn, int err)
1673{
1674 struct hci_dev *hdev = conn->hcon->hdev;
1675
1676 BT_DBG("conn %p err %d", conn, err);
1677
1678 conn->disconn_err = err;
1679 queue_work(hdev->workqueue, &conn->disconn_work);
1680}
1681
David Herrmann9c903e32013-04-06 20:28:44 +02001682static void l2cap_conn_free(struct kref *ref)
1683{
1684 struct l2cap_conn *conn = container_of(ref, struct l2cap_conn, ref);
1685
1686 hci_conn_put(conn->hcon);
1687 kfree(conn);
1688}
1689
1690void l2cap_conn_get(struct l2cap_conn *conn)
1691{
1692 kref_get(&conn->ref);
1693}
1694EXPORT_SYMBOL(l2cap_conn_get);
1695
1696void l2cap_conn_put(struct l2cap_conn *conn)
1697{
1698 kref_put(&conn->ref, l2cap_conn_free);
1699}
1700EXPORT_SYMBOL(l2cap_conn_put);
1701
Linus Torvalds1da177e2005-04-16 15:20:36 -07001702/* ---- Socket interface ---- */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001703
Ido Yarivc2287682012-04-20 15:46:07 -03001704/* Find socket with psm and source / destination bdaddr.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001705 * Returns closest match.
1706 */
Ido Yarivc2287682012-04-20 15:46:07 -03001707static struct l2cap_chan *l2cap_global_chan_by_psm(int state, __le16 psm,
1708 bdaddr_t *src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001709 bdaddr_t *dst,
1710 u8 link_type)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001711{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001712 struct l2cap_chan *c, *c1 = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001713
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001714 read_lock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001715
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001716 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001717 if (state && c->state != state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001718 continue;
1719
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001720 if (link_type == ACL_LINK && c->src_type != BDADDR_BREDR)
1721 continue;
1722
1723 if (link_type == LE_LINK && c->src_type == BDADDR_BREDR)
1724 continue;
1725
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001726 if (c->psm == psm) {
Ido Yarivc2287682012-04-20 15:46:07 -03001727 int src_match, dst_match;
1728 int src_any, dst_any;
1729
Linus Torvalds1da177e2005-04-16 15:20:36 -07001730 /* Exact match. */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001731 src_match = !bacmp(&c->src, src);
1732 dst_match = !bacmp(&c->dst, dst);
Ido Yarivc2287682012-04-20 15:46:07 -03001733 if (src_match && dst_match) {
Johan Hedberga24cce12014-08-07 22:56:42 +03001734 l2cap_chan_hold(c);
Johannes Berga7567b22011-06-01 08:29:54 +02001735 read_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001736 return c;
1737 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001738
1739 /* Closest match */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001740 src_any = !bacmp(&c->src, BDADDR_ANY);
1741 dst_any = !bacmp(&c->dst, BDADDR_ANY);
Ido Yarivc2287682012-04-20 15:46:07 -03001742 if ((src_match && dst_any) || (src_any && dst_match) ||
1743 (src_any && dst_any))
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001744 c1 = c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001745 }
1746 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001747
Johan Hedberga24cce12014-08-07 22:56:42 +03001748 if (c1)
1749 l2cap_chan_hold(c1);
1750
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001751 read_unlock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001752
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001753 return c1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001754}
1755
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001756static void l2cap_monitor_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001757{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001758 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001759 monitor_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001760
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03001761 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001762
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001763 l2cap_chan_lock(chan);
1764
Mat Martineau80909e02012-05-17 20:53:50 -07001765 if (!chan->conn) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001766 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001767 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001768 return;
1769 }
1770
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001771 l2cap_tx(chan, NULL, NULL, L2CAP_EV_MONITOR_TO);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001772
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001773 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001774 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001775}
1776
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001777static void l2cap_retrans_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001778{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001779 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001780 retrans_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001781
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03001782 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001783
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001784 l2cap_chan_lock(chan);
1785
Mat Martineau80909e02012-05-17 20:53:50 -07001786 if (!chan->conn) {
1787 l2cap_chan_unlock(chan);
1788 l2cap_chan_put(chan);
1789 return;
1790 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001791
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001792 l2cap_tx(chan, NULL, NULL, L2CAP_EV_RETRANS_TO);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001793 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001794 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001795}
1796
Gustavo Padovand6603662012-05-21 13:58:22 -03001797static void l2cap_streaming_send(struct l2cap_chan *chan,
1798 struct sk_buff_head *skbs)
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001799{
Gustavo F. Padovanccbb84a2010-08-30 18:44:44 -03001800 struct sk_buff *skb;
Mat Martineau37339372012-05-17 20:53:33 -07001801 struct l2cap_ctrl *control;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001802
Mat Martineau37339372012-05-17 20:53:33 -07001803 BT_DBG("chan %p, skbs %p", chan, skbs);
1804
Mat Martineaub99e13a2012-10-23 15:24:19 -07001805 if (__chan_is_moving(chan))
1806 return;
1807
Mat Martineau37339372012-05-17 20:53:33 -07001808 skb_queue_splice_tail_init(skbs, &chan->tx_q);
1809
1810 while (!skb_queue_empty(&chan->tx_q)) {
1811
1812 skb = skb_dequeue(&chan->tx_q);
1813
1814 bt_cb(skb)->control.retries = 1;
1815 control = &bt_cb(skb)->control;
1816
1817 control->reqseq = 0;
1818 control->txseq = chan->next_tx_seq;
1819
1820 __pack_control(chan, control, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001821
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001822 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau37339372012-05-17 20:53:33 -07001823 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1824 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001825 }
1826
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001827 l2cap_do_send(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001828
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001829 BT_DBG("Sent txseq %u", control->txseq);
Mat Martineau37339372012-05-17 20:53:33 -07001830
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001831 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau37339372012-05-17 20:53:33 -07001832 chan->frames_sent++;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001833 }
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001834}
1835
Szymon Janc67c9e842011-07-28 16:24:33 +02001836static int l2cap_ertm_send(struct l2cap_chan *chan)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001837{
1838 struct sk_buff *skb, *tx_skb;
Mat Martineau18a48e72012-05-17 20:53:34 -07001839 struct l2cap_ctrl *control;
1840 int sent = 0;
1841
1842 BT_DBG("chan %p", chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001843
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001844 if (chan->state != BT_CONNECTED)
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001845 return -ENOTCONN;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001846
Mat Martineau94122bb2012-05-02 09:42:02 -07001847 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1848 return 0;
1849
Mat Martineaub99e13a2012-10-23 15:24:19 -07001850 if (__chan_is_moving(chan))
1851 return 0;
1852
Mat Martineau18a48e72012-05-17 20:53:34 -07001853 while (chan->tx_send_head &&
1854 chan->unacked_frames < chan->remote_tx_win &&
1855 chan->tx_state == L2CAP_TX_STATE_XMIT) {
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001856
Mat Martineau18a48e72012-05-17 20:53:34 -07001857 skb = chan->tx_send_head;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001858
Mat Martineau18a48e72012-05-17 20:53:34 -07001859 bt_cb(skb)->control.retries = 1;
1860 control = &bt_cb(skb)->control;
Gustavo F. Padovan95ffa972010-06-18 20:37:33 -03001861
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001862 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
Mat Martineau18a48e72012-05-17 20:53:34 -07001863 control->final = 1;
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001864
Mat Martineau18a48e72012-05-17 20:53:34 -07001865 control->reqseq = chan->buffer_seq;
1866 chan->last_acked_seq = chan->buffer_seq;
1867 control->txseq = chan->next_tx_seq;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001868
Mat Martineau18a48e72012-05-17 20:53:34 -07001869 __pack_control(chan, control, skb);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001870
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001871 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau18a48e72012-05-17 20:53:34 -07001872 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1873 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001874 }
1875
Mat Martineau18a48e72012-05-17 20:53:34 -07001876 /* Clone after data has been modified. Data is assumed to be
1877 read-only (for locking purposes) on cloned sk_buffs.
1878 */
1879 tx_skb = skb_clone(skb, GFP_KERNEL);
1880
1881 if (!tx_skb)
1882 break;
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -03001883
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03001884 __set_retrans_timer(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001885
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001886 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau18a48e72012-05-17 20:53:34 -07001887 chan->unacked_frames++;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03001888 chan->frames_sent++;
Mat Martineau18a48e72012-05-17 20:53:34 -07001889 sent++;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001890
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001891 if (skb_queue_is_last(&chan->tx_q, skb))
1892 chan->tx_send_head = NULL;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001893 else
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001894 chan->tx_send_head = skb_queue_next(&chan->tx_q, skb);
Mat Martineau18a48e72012-05-17 20:53:34 -07001895
1896 l2cap_do_send(chan, tx_skb);
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001897 BT_DBG("Sent txseq %u", control->txseq);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001898 }
1899
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001900 BT_DBG("Sent %d, %u unacked, %u in ERTM queue", sent,
1901 chan->unacked_frames, skb_queue_len(&chan->tx_q));
Mat Martineau18a48e72012-05-17 20:53:34 -07001902
1903 return sent;
Gustavo F. Padovan9e917af2010-05-01 16:15:37 -03001904}
1905
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001906static void l2cap_ertm_resend(struct l2cap_chan *chan)
1907{
1908 struct l2cap_ctrl control;
1909 struct sk_buff *skb;
1910 struct sk_buff *tx_skb;
1911 u16 seq;
1912
1913 BT_DBG("chan %p", chan);
1914
1915 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1916 return;
1917
Mat Martineaub99e13a2012-10-23 15:24:19 -07001918 if (__chan_is_moving(chan))
1919 return;
1920
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001921 while (chan->retrans_list.head != L2CAP_SEQ_LIST_CLEAR) {
1922 seq = l2cap_seq_list_pop(&chan->retrans_list);
1923
1924 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, seq);
1925 if (!skb) {
1926 BT_DBG("Error: Can't retransmit seq %d, frame missing",
Gustavo Padovan2d792812012-10-06 10:07:01 +01001927 seq);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001928 continue;
1929 }
1930
1931 bt_cb(skb)->control.retries++;
1932 control = bt_cb(skb)->control;
1933
1934 if (chan->max_tx != 0 &&
1935 bt_cb(skb)->control.retries > chan->max_tx) {
1936 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001937 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001938 l2cap_seq_list_clear(&chan->retrans_list);
1939 break;
1940 }
1941
1942 control.reqseq = chan->buffer_seq;
1943 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
1944 control.final = 1;
1945 else
1946 control.final = 0;
1947
1948 if (skb_cloned(skb)) {
1949 /* Cloned sk_buffs are read-only, so we need a
1950 * writeable copy
1951 */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03001952 tx_skb = skb_copy(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001953 } else {
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03001954 tx_skb = skb_clone(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001955 }
1956
1957 if (!tx_skb) {
1958 l2cap_seq_list_clear(&chan->retrans_list);
1959 break;
1960 }
1961
1962 /* Update skb contents */
1963 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
1964 put_unaligned_le32(__pack_extended_control(&control),
1965 tx_skb->data + L2CAP_HDR_SIZE);
1966 } else {
1967 put_unaligned_le16(__pack_enhanced_control(&control),
1968 tx_skb->data + L2CAP_HDR_SIZE);
1969 }
1970
1971 if (chan->fcs == L2CAP_FCS_CRC16) {
1972 u16 fcs = crc16(0, (u8 *) tx_skb->data, tx_skb->len);
1973 put_unaligned_le16(fcs, skb_put(tx_skb,
1974 L2CAP_FCS_SIZE));
1975 }
1976
1977 l2cap_do_send(chan, tx_skb);
1978
1979 BT_DBG("Resent txseq %d", control.txseq);
1980
1981 chan->last_acked_seq = chan->buffer_seq;
1982 }
1983}
1984
Mat Martineauf80842a2012-05-17 20:53:46 -07001985static void l2cap_retransmit(struct l2cap_chan *chan,
1986 struct l2cap_ctrl *control)
1987{
1988 BT_DBG("chan %p, control %p", chan, control);
1989
1990 l2cap_seq_list_append(&chan->retrans_list, control->reqseq);
1991 l2cap_ertm_resend(chan);
1992}
1993
Mat Martineaud2a7ac52012-05-17 20:53:42 -07001994static void l2cap_retransmit_all(struct l2cap_chan *chan,
1995 struct l2cap_ctrl *control)
1996{
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001997 struct sk_buff *skb;
1998
1999 BT_DBG("chan %p, control %p", chan, control);
2000
2001 if (control->poll)
2002 set_bit(CONN_SEND_FBIT, &chan->conn_state);
2003
2004 l2cap_seq_list_clear(&chan->retrans_list);
2005
2006 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
2007 return;
2008
2009 if (chan->unacked_frames) {
2010 skb_queue_walk(&chan->tx_q, skb) {
2011 if (bt_cb(skb)->control.txseq == control->reqseq ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01002012 skb == chan->tx_send_head)
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002013 break;
2014 }
2015
2016 skb_queue_walk_from(&chan->tx_q, skb) {
2017 if (skb == chan->tx_send_head)
2018 break;
2019
2020 l2cap_seq_list_append(&chan->retrans_list,
2021 bt_cb(skb)->control.txseq);
2022 }
2023
2024 l2cap_ertm_resend(chan);
2025 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002026}
2027
Szymon Jancb17e73b2012-01-11 10:59:47 +01002028static void l2cap_send_ack(struct l2cap_chan *chan)
2029{
Mat Martineau0a0aba42012-05-17 20:53:39 -07002030 struct l2cap_ctrl control;
2031 u16 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
2032 chan->last_acked_seq);
2033 int threshold;
2034
2035 BT_DBG("chan %p last_acked_seq %d buffer_seq %d",
2036 chan, chan->last_acked_seq, chan->buffer_seq);
2037
2038 memset(&control, 0, sizeof(control));
2039 control.sframe = 1;
2040
2041 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
2042 chan->rx_state == L2CAP_RX_STATE_RECV) {
2043 __clear_ack_timer(chan);
2044 control.super = L2CAP_SUPER_RNR;
2045 control.reqseq = chan->buffer_seq;
2046 l2cap_send_sframe(chan, &control);
2047 } else {
2048 if (!test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) {
2049 l2cap_ertm_send(chan);
2050 /* If any i-frames were sent, they included an ack */
2051 if (chan->buffer_seq == chan->last_acked_seq)
2052 frames_to_ack = 0;
2053 }
2054
Mat Martineauc20f8e32012-07-10 05:47:07 -07002055 /* Ack now if the window is 3/4ths full.
Mat Martineau0a0aba42012-05-17 20:53:39 -07002056 * Calculate without mul or div
2057 */
Mat Martineauc20f8e32012-07-10 05:47:07 -07002058 threshold = chan->ack_win;
Mat Martineau0a0aba42012-05-17 20:53:39 -07002059 threshold += threshold << 1;
2060 threshold >>= 2;
2061
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002062 BT_DBG("frames_to_ack %u, threshold %d", frames_to_ack,
Mat Martineau0a0aba42012-05-17 20:53:39 -07002063 threshold);
2064
2065 if (frames_to_ack >= threshold) {
2066 __clear_ack_timer(chan);
2067 control.super = L2CAP_SUPER_RR;
2068 control.reqseq = chan->buffer_seq;
2069 l2cap_send_sframe(chan, &control);
2070 frames_to_ack = 0;
2071 }
2072
2073 if (frames_to_ack)
2074 __set_ack_timer(chan);
2075 }
Szymon Jancb17e73b2012-01-11 10:59:47 +01002076}
2077
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002078static inline int l2cap_skbuff_fromiovec(struct l2cap_chan *chan,
2079 struct msghdr *msg, int len,
2080 int count, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002081{
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002082 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002083 struct sk_buff **frag;
Gustavo Padovan90338942012-04-06 20:15:47 -03002084 int sent = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002085
Jukka Rissanen04988782014-06-18 16:37:07 +03002086 if (chan->ops->memcpy_fromiovec(chan, skb_put(skb, count),
2087 msg->msg_iov, count))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002088 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002089
2090 sent += count;
2091 len -= count;
2092
2093 /* Continuation fragments (no L2CAP header) */
2094 frag = &skb_shinfo(skb)->frag_list;
2095 while (len) {
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002096 struct sk_buff *tmp;
2097
Linus Torvalds1da177e2005-04-16 15:20:36 -07002098 count = min_t(unsigned int, conn->mtu, len);
2099
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002100 tmp = chan->ops->alloc_skb(chan, 0, count,
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002101 msg->msg_flags & MSG_DONTWAIT);
2102 if (IS_ERR(tmp))
2103 return PTR_ERR(tmp);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002104
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002105 *frag = tmp;
2106
Jukka Rissanen04988782014-06-18 16:37:07 +03002107 if (chan->ops->memcpy_fromiovec(chan, skb_put(*frag, count),
2108 msg->msg_iov, count))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002109 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002110
2111 sent += count;
2112 len -= count;
2113
Gustavo Padovan2d0ed3d2012-05-11 13:16:12 -03002114 skb->len += (*frag)->len;
2115 skb->data_len += (*frag)->len;
2116
Linus Torvalds1da177e2005-04-16 15:20:36 -07002117 frag = &(*frag)->next;
2118 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002119
2120 return sent;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002121}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002122
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002123static struct sk_buff *l2cap_create_connless_pdu(struct l2cap_chan *chan,
Marcel Holtmann8d463212014-06-05 15:22:51 +02002124 struct msghdr *msg, size_t len)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002125{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002126 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002127 struct sk_buff *skb;
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002128 int err, count, hlen = L2CAP_HDR_SIZE + L2CAP_PSMLEN_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002129 struct l2cap_hdr *lh;
2130
Marcel Holtmann8d463212014-06-05 15:22:51 +02002131 BT_DBG("chan %p psm 0x%2.2x len %zu", chan,
2132 __le16_to_cpu(chan->psm), len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002133
2134 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002135
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002136 skb = chan->ops->alloc_skb(chan, hlen, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002137 msg->msg_flags & MSG_DONTWAIT);
2138 if (IS_ERR(skb))
2139 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002140
2141 /* Create L2CAP header */
2142 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002143 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenkodaf6a78c2012-05-03 10:55:52 +03002144 lh->len = cpu_to_le16(len + L2CAP_PSMLEN_SIZE);
Marcel Holtmann43b1b8d2013-10-12 06:01:26 -07002145 put_unaligned(chan->psm, (__le16 *) skb_put(skb, L2CAP_PSMLEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002146
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002147 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002148 if (unlikely(err < 0)) {
2149 kfree_skb(skb);
2150 return ERR_PTR(err);
2151 }
2152 return skb;
2153}
2154
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002155static struct sk_buff *l2cap_create_basic_pdu(struct l2cap_chan *chan,
Marcel Holtmann8d463212014-06-05 15:22:51 +02002156 struct msghdr *msg, size_t len)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002157{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002158 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002159 struct sk_buff *skb;
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002160 int err, count;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002161 struct l2cap_hdr *lh;
2162
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002163 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002164
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002165 count = min_t(unsigned int, (conn->mtu - L2CAP_HDR_SIZE), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002166
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002167 skb = chan->ops->alloc_skb(chan, L2CAP_HDR_SIZE, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002168 msg->msg_flags & MSG_DONTWAIT);
2169 if (IS_ERR(skb))
2170 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002171
2172 /* Create L2CAP header */
2173 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002174 lh->cid = cpu_to_le16(chan->dcid);
Gustavo Padovan6ff9b5e2012-05-02 11:56:17 -03002175 lh->len = cpu_to_le16(len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002176
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002177 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002178 if (unlikely(err < 0)) {
2179 kfree_skb(skb);
2180 return ERR_PTR(err);
2181 }
2182 return skb;
2183}
2184
Luiz Augusto von Dentzab0ff762011-09-12 20:00:50 +03002185static struct sk_buff *l2cap_create_iframe_pdu(struct l2cap_chan *chan,
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002186 struct msghdr *msg, size_t len,
2187 u16 sdulen)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002188{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002189 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002190 struct sk_buff *skb;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002191 int err, count, hlen;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002192 struct l2cap_hdr *lh;
2193
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002194 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002195
Gustavo F. Padovan0ee0d202010-05-01 16:15:41 -03002196 if (!conn)
2197 return ERR_PTR(-ENOTCONN);
2198
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002199 hlen = __ertm_hdr_size(chan);
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002200
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002201 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002202 hlen += L2CAP_SDULEN_SIZE;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002203
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03002204 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002205 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03002206
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002207 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002208
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002209 skb = chan->ops->alloc_skb(chan, hlen, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002210 msg->msg_flags & MSG_DONTWAIT);
2211 if (IS_ERR(skb))
2212 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002213
2214 /* Create L2CAP header */
2215 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002216 lh->cid = cpu_to_le16(chan->dcid);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002217 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002218
Mat Martineau18a48e72012-05-17 20:53:34 -07002219 /* Control header is populated later */
2220 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
2221 put_unaligned_le32(0, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
2222 else
2223 put_unaligned_le16(0, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002224
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002225 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002226 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002227
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002228 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002229 if (unlikely(err < 0)) {
2230 kfree_skb(skb);
2231 return ERR_PTR(err);
2232 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03002233
Mat Martineau18a48e72012-05-17 20:53:34 -07002234 bt_cb(skb)->control.fcs = chan->fcs;
Mat Martineau3ce35142012-04-25 16:36:14 -07002235 bt_cb(skb)->control.retries = 0;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002236 return skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002237}
2238
Mat Martineau94122bb2012-05-02 09:42:02 -07002239static int l2cap_segment_sdu(struct l2cap_chan *chan,
2240 struct sk_buff_head *seg_queue,
2241 struct msghdr *msg, size_t len)
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002242{
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002243 struct sk_buff *skb;
Mat Martineau94122bb2012-05-02 09:42:02 -07002244 u16 sdu_len;
2245 size_t pdu_len;
Mat Martineau94122bb2012-05-02 09:42:02 -07002246 u8 sar;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002247
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002248 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002249
Mat Martineau94122bb2012-05-02 09:42:02 -07002250 /* It is critical that ERTM PDUs fit in a single HCI fragment,
2251 * so fragmented skbs are not used. The HCI layer's handling
2252 * of fragmented skbs is not compatible with ERTM's queueing.
2253 */
2254
2255 /* PDU size is derived from the HCI MTU */
2256 pdu_len = chan->conn->mtu;
2257
Mat Martineaua5495742012-10-23 15:24:21 -07002258 /* Constrain PDU size for BR/EDR connections */
2259 if (!chan->hs_hcon)
2260 pdu_len = min_t(size_t, pdu_len, L2CAP_BREDR_MAX_PAYLOAD);
Mat Martineau94122bb2012-05-02 09:42:02 -07002261
2262 /* Adjust for largest possible L2CAP overhead. */
Gustavo Padovan35d401d2012-05-25 18:57:05 -03002263 if (chan->fcs)
2264 pdu_len -= L2CAP_FCS_SIZE;
2265
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002266 pdu_len -= __ertm_hdr_size(chan);
Mat Martineau94122bb2012-05-02 09:42:02 -07002267
2268 /* Remote device may have requested smaller PDUs */
2269 pdu_len = min_t(size_t, pdu_len, chan->remote_mps);
2270
2271 if (len <= pdu_len) {
2272 sar = L2CAP_SAR_UNSEGMENTED;
2273 sdu_len = 0;
2274 pdu_len = len;
2275 } else {
2276 sar = L2CAP_SAR_START;
2277 sdu_len = len;
Mat Martineau94122bb2012-05-02 09:42:02 -07002278 }
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002279
2280 while (len > 0) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002281 skb = l2cap_create_iframe_pdu(chan, msg, pdu_len, sdu_len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002282
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002283 if (IS_ERR(skb)) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002284 __skb_queue_purge(seg_queue);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002285 return PTR_ERR(skb);
2286 }
2287
Mat Martineau94122bb2012-05-02 09:42:02 -07002288 bt_cb(skb)->control.sar = sar;
2289 __skb_queue_tail(seg_queue, skb);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002290
Mat Martineau94122bb2012-05-02 09:42:02 -07002291 len -= pdu_len;
Lukasz Rymanowski069cb272014-08-13 16:01:41 +02002292 if (sdu_len)
Mat Martineau94122bb2012-05-02 09:42:02 -07002293 sdu_len = 0;
Mat Martineau94122bb2012-05-02 09:42:02 -07002294
2295 if (len <= pdu_len) {
2296 sar = L2CAP_SAR_END;
2297 pdu_len = len;
2298 } else {
2299 sar = L2CAP_SAR_CONTINUE;
2300 }
2301 }
2302
Gustavo Padovanf0f62792012-05-29 13:29:17 -03002303 return 0;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002304}
2305
Johan Hedberg177f8f22013-05-31 17:54:51 +03002306static struct sk_buff *l2cap_create_le_flowctl_pdu(struct l2cap_chan *chan,
2307 struct msghdr *msg,
2308 size_t len, u16 sdulen)
2309{
2310 struct l2cap_conn *conn = chan->conn;
2311 struct sk_buff *skb;
2312 int err, count, hlen;
2313 struct l2cap_hdr *lh;
2314
2315 BT_DBG("chan %p len %zu", chan, len);
2316
2317 if (!conn)
2318 return ERR_PTR(-ENOTCONN);
2319
2320 hlen = L2CAP_HDR_SIZE;
2321
2322 if (sdulen)
2323 hlen += L2CAP_SDULEN_SIZE;
2324
2325 count = min_t(unsigned int, (conn->mtu - hlen), len);
2326
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002327 skb = chan->ops->alloc_skb(chan, hlen, count,
Johan Hedberg177f8f22013-05-31 17:54:51 +03002328 msg->msg_flags & MSG_DONTWAIT);
2329 if (IS_ERR(skb))
2330 return skb;
2331
2332 /* Create L2CAP header */
2333 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
2334 lh->cid = cpu_to_le16(chan->dcid);
2335 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
2336
2337 if (sdulen)
2338 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
2339
2340 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
2341 if (unlikely(err < 0)) {
2342 kfree_skb(skb);
2343 return ERR_PTR(err);
2344 }
2345
2346 return skb;
2347}
2348
2349static int l2cap_segment_le_sdu(struct l2cap_chan *chan,
2350 struct sk_buff_head *seg_queue,
2351 struct msghdr *msg, size_t len)
2352{
2353 struct sk_buff *skb;
2354 size_t pdu_len;
2355 u16 sdu_len;
2356
2357 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
2358
2359 pdu_len = chan->conn->mtu - L2CAP_HDR_SIZE;
2360
2361 pdu_len = min_t(size_t, pdu_len, chan->remote_mps);
2362
2363 sdu_len = len;
2364 pdu_len -= L2CAP_SDULEN_SIZE;
2365
2366 while (len > 0) {
2367 if (len <= pdu_len)
2368 pdu_len = len;
2369
2370 skb = l2cap_create_le_flowctl_pdu(chan, msg, pdu_len, sdu_len);
2371 if (IS_ERR(skb)) {
2372 __skb_queue_purge(seg_queue);
2373 return PTR_ERR(skb);
2374 }
2375
2376 __skb_queue_tail(seg_queue, skb);
2377
2378 len -= pdu_len;
2379
2380 if (sdu_len) {
2381 sdu_len = 0;
2382 pdu_len += L2CAP_SDULEN_SIZE;
2383 }
2384 }
2385
2386 return 0;
2387}
2388
Marcel Holtmann8d463212014-06-05 15:22:51 +02002389int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002390{
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002391 struct sk_buff *skb;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002392 int err;
Mat Martineau94122bb2012-05-02 09:42:02 -07002393 struct sk_buff_head seg_queue;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002394
Seung-Woo Kim31e8ce82013-11-05 18:46:33 +09002395 if (!chan->conn)
2396 return -ENOTCONN;
2397
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002398 /* Connectionless channel */
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002399 if (chan->chan_type == L2CAP_CHAN_CONN_LESS) {
Marcel Holtmann8d463212014-06-05 15:22:51 +02002400 skb = l2cap_create_connless_pdu(chan, msg, len);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002401 if (IS_ERR(skb))
2402 return PTR_ERR(skb);
2403
Andrzej Kaczmarekede81a22014-02-25 17:16:22 +01002404 /* Channel lock is released before requesting new skb and then
2405 * reacquired thus we need to recheck channel state.
2406 */
2407 if (chan->state != BT_CONNECTED) {
2408 kfree_skb(skb);
2409 return -ENOTCONN;
2410 }
2411
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002412 l2cap_do_send(chan, skb);
2413 return len;
2414 }
2415
2416 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03002417 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedberg177f8f22013-05-31 17:54:51 +03002418 /* Check outgoing MTU */
2419 if (len > chan->omtu)
2420 return -EMSGSIZE;
2421
Johan Hedbergfad5fc82013-12-05 09:45:01 +02002422 if (!chan->tx_credits)
2423 return -EAGAIN;
2424
Johan Hedberg177f8f22013-05-31 17:54:51 +03002425 __skb_queue_head_init(&seg_queue);
2426
2427 err = l2cap_segment_le_sdu(chan, &seg_queue, msg, len);
2428
2429 if (chan->state != BT_CONNECTED) {
2430 __skb_queue_purge(&seg_queue);
2431 err = -ENOTCONN;
2432 }
2433
2434 if (err)
2435 return err;
2436
2437 skb_queue_splice_tail_init(&seg_queue, &chan->tx_q);
2438
2439 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
2440 l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
2441 chan->tx_credits--;
2442 }
2443
2444 if (!chan->tx_credits)
2445 chan->ops->suspend(chan);
2446
2447 err = len;
2448
2449 break;
2450
Johan Hedbergfad5fc82013-12-05 09:45:01 +02002451 case L2CAP_MODE_BASIC:
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002452 /* Check outgoing MTU */
2453 if (len > chan->omtu)
2454 return -EMSGSIZE;
2455
2456 /* Create a basic PDU */
Marcel Holtmann8d463212014-06-05 15:22:51 +02002457 skb = l2cap_create_basic_pdu(chan, msg, len);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002458 if (IS_ERR(skb))
2459 return PTR_ERR(skb);
2460
Andrzej Kaczmarekede81a22014-02-25 17:16:22 +01002461 /* Channel lock is released before requesting new skb and then
2462 * reacquired thus we need to recheck channel state.
2463 */
2464 if (chan->state != BT_CONNECTED) {
2465 kfree_skb(skb);
2466 return -ENOTCONN;
2467 }
2468
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002469 l2cap_do_send(chan, skb);
2470 err = len;
2471 break;
2472
2473 case L2CAP_MODE_ERTM:
2474 case L2CAP_MODE_STREAMING:
Mat Martineau94122bb2012-05-02 09:42:02 -07002475 /* Check outgoing MTU */
2476 if (len > chan->omtu) {
2477 err = -EMSGSIZE;
2478 break;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002479 }
2480
Mat Martineau94122bb2012-05-02 09:42:02 -07002481 __skb_queue_head_init(&seg_queue);
2482
2483 /* Do segmentation before calling in to the state machine,
2484 * since it's possible to block while waiting for memory
2485 * allocation.
2486 */
2487 err = l2cap_segment_sdu(chan, &seg_queue, msg, len);
2488
2489 /* The channel could have been closed while segmenting,
2490 * check that it is still connected.
2491 */
2492 if (chan->state != BT_CONNECTED) {
2493 __skb_queue_purge(&seg_queue);
2494 err = -ENOTCONN;
2495 }
2496
2497 if (err)
2498 break;
2499
Mat Martineau37339372012-05-17 20:53:33 -07002500 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo Padovand6603662012-05-21 13:58:22 -03002501 l2cap_tx(chan, NULL, &seg_queue, L2CAP_EV_DATA_REQUEST);
Mat Martineau37339372012-05-17 20:53:33 -07002502 else
Gustavo Padovand6603662012-05-21 13:58:22 -03002503 l2cap_streaming_send(chan, &seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002504
Gustavo Padovand6603662012-05-21 13:58:22 -03002505 err = len;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002506
Mat Martineau94122bb2012-05-02 09:42:02 -07002507 /* If the skbs were not queued for sending, they'll still be in
2508 * seg_queue and need to be purged.
2509 */
2510 __skb_queue_purge(&seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002511 break;
2512
2513 default:
2514 BT_DBG("bad state %1.1x", chan->mode);
2515 err = -EBADFD;
2516 }
2517
2518 return err;
2519}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +03002520EXPORT_SYMBOL_GPL(l2cap_chan_send);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002521
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002522static void l2cap_send_srej(struct l2cap_chan *chan, u16 txseq)
2523{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002524 struct l2cap_ctrl control;
2525 u16 seq;
2526
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002527 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002528
2529 memset(&control, 0, sizeof(control));
2530 control.sframe = 1;
2531 control.super = L2CAP_SUPER_SREJ;
2532
2533 for (seq = chan->expected_tx_seq; seq != txseq;
2534 seq = __next_seq(chan, seq)) {
2535 if (!l2cap_ertm_seq_in_queue(&chan->srej_q, seq)) {
2536 control.reqseq = seq;
2537 l2cap_send_sframe(chan, &control);
2538 l2cap_seq_list_append(&chan->srej_list, seq);
2539 }
2540 }
2541
2542 chan->expected_tx_seq = __next_seq(chan, txseq);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002543}
2544
2545static void l2cap_send_srej_tail(struct l2cap_chan *chan)
2546{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002547 struct l2cap_ctrl control;
2548
2549 BT_DBG("chan %p", chan);
2550
2551 if (chan->srej_list.tail == L2CAP_SEQ_LIST_CLEAR)
2552 return;
2553
2554 memset(&control, 0, sizeof(control));
2555 control.sframe = 1;
2556 control.super = L2CAP_SUPER_SREJ;
2557 control.reqseq = chan->srej_list.tail;
2558 l2cap_send_sframe(chan, &control);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002559}
2560
2561static void l2cap_send_srej_list(struct l2cap_chan *chan, u16 txseq)
2562{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002563 struct l2cap_ctrl control;
2564 u16 initial_head;
2565 u16 seq;
2566
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002567 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002568
2569 memset(&control, 0, sizeof(control));
2570 control.sframe = 1;
2571 control.super = L2CAP_SUPER_SREJ;
2572
2573 /* Capture initial list head to allow only one pass through the list. */
2574 initial_head = chan->srej_list.head;
2575
2576 do {
2577 seq = l2cap_seq_list_pop(&chan->srej_list);
2578 if (seq == txseq || seq == L2CAP_SEQ_LIST_CLEAR)
2579 break;
2580
2581 control.reqseq = seq;
2582 l2cap_send_sframe(chan, &control);
2583 l2cap_seq_list_append(&chan->srej_list, seq);
2584 } while (chan->srej_list.head != initial_head);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002585}
2586
Mat Martineau608bcc62012-05-17 20:53:32 -07002587static void l2cap_process_reqseq(struct l2cap_chan *chan, u16 reqseq)
2588{
2589 struct sk_buff *acked_skb;
2590 u16 ackseq;
2591
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002592 BT_DBG("chan %p, reqseq %u", chan, reqseq);
Mat Martineau608bcc62012-05-17 20:53:32 -07002593
2594 if (chan->unacked_frames == 0 || reqseq == chan->expected_ack_seq)
2595 return;
2596
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002597 BT_DBG("expected_ack_seq %u, unacked_frames %u",
Mat Martineau608bcc62012-05-17 20:53:32 -07002598 chan->expected_ack_seq, chan->unacked_frames);
2599
2600 for (ackseq = chan->expected_ack_seq; ackseq != reqseq;
2601 ackseq = __next_seq(chan, ackseq)) {
2602
2603 acked_skb = l2cap_ertm_seq_in_queue(&chan->tx_q, ackseq);
2604 if (acked_skb) {
2605 skb_unlink(acked_skb, &chan->tx_q);
2606 kfree_skb(acked_skb);
2607 chan->unacked_frames--;
2608 }
2609 }
2610
2611 chan->expected_ack_seq = reqseq;
2612
2613 if (chan->unacked_frames == 0)
2614 __clear_retrans_timer(chan);
2615
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002616 BT_DBG("unacked_frames %u", chan->unacked_frames);
Mat Martineau608bcc62012-05-17 20:53:32 -07002617}
2618
2619static void l2cap_abort_rx_srej_sent(struct l2cap_chan *chan)
2620{
2621 BT_DBG("chan %p", chan);
2622
2623 chan->expected_tx_seq = chan->buffer_seq;
2624 l2cap_seq_list_clear(&chan->srej_list);
2625 skb_queue_purge(&chan->srej_q);
2626 chan->rx_state = L2CAP_RX_STATE_RECV;
2627}
2628
Gustavo Padovand6603662012-05-21 13:58:22 -03002629static void l2cap_tx_state_xmit(struct l2cap_chan *chan,
2630 struct l2cap_ctrl *control,
2631 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002632{
Mat Martineau608bcc62012-05-17 20:53:32 -07002633 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2634 event);
2635
2636 switch (event) {
2637 case L2CAP_EV_DATA_REQUEST:
2638 if (chan->tx_send_head == NULL)
2639 chan->tx_send_head = skb_peek(skbs);
2640
2641 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2642 l2cap_ertm_send(chan);
2643 break;
2644 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2645 BT_DBG("Enter LOCAL_BUSY");
2646 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2647
2648 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2649 /* The SREJ_SENT state must be aborted if we are to
2650 * enter the LOCAL_BUSY state.
2651 */
2652 l2cap_abort_rx_srej_sent(chan);
2653 }
2654
2655 l2cap_send_ack(chan);
2656
2657 break;
2658 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2659 BT_DBG("Exit LOCAL_BUSY");
2660 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2661
2662 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2663 struct l2cap_ctrl local_control;
2664
2665 memset(&local_control, 0, sizeof(local_control));
2666 local_control.sframe = 1;
2667 local_control.super = L2CAP_SUPER_RR;
2668 local_control.poll = 1;
2669 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002670 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002671
2672 chan->retry_count = 1;
2673 __set_monitor_timer(chan);
2674 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2675 }
2676 break;
2677 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2678 l2cap_process_reqseq(chan, control->reqseq);
2679 break;
2680 case L2CAP_EV_EXPLICIT_POLL:
2681 l2cap_send_rr_or_rnr(chan, 1);
2682 chan->retry_count = 1;
2683 __set_monitor_timer(chan);
2684 __clear_ack_timer(chan);
2685 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2686 break;
2687 case L2CAP_EV_RETRANS_TO:
2688 l2cap_send_rr_or_rnr(chan, 1);
2689 chan->retry_count = 1;
2690 __set_monitor_timer(chan);
2691 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2692 break;
2693 case L2CAP_EV_RECV_FBIT:
2694 /* Nothing to process */
2695 break;
2696 default:
2697 break;
2698 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002699}
2700
Gustavo Padovand6603662012-05-21 13:58:22 -03002701static void l2cap_tx_state_wait_f(struct l2cap_chan *chan,
2702 struct l2cap_ctrl *control,
2703 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002704{
Mat Martineau608bcc62012-05-17 20:53:32 -07002705 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2706 event);
2707
2708 switch (event) {
2709 case L2CAP_EV_DATA_REQUEST:
2710 if (chan->tx_send_head == NULL)
2711 chan->tx_send_head = skb_peek(skbs);
2712 /* Queue data, but don't send. */
2713 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2714 break;
2715 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2716 BT_DBG("Enter LOCAL_BUSY");
2717 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2718
2719 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2720 /* The SREJ_SENT state must be aborted if we are to
2721 * enter the LOCAL_BUSY state.
2722 */
2723 l2cap_abort_rx_srej_sent(chan);
2724 }
2725
2726 l2cap_send_ack(chan);
2727
2728 break;
2729 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2730 BT_DBG("Exit LOCAL_BUSY");
2731 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2732
2733 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2734 struct l2cap_ctrl local_control;
2735 memset(&local_control, 0, sizeof(local_control));
2736 local_control.sframe = 1;
2737 local_control.super = L2CAP_SUPER_RR;
2738 local_control.poll = 1;
2739 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002740 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002741
2742 chan->retry_count = 1;
2743 __set_monitor_timer(chan);
2744 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2745 }
2746 break;
2747 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2748 l2cap_process_reqseq(chan, control->reqseq);
2749
2750 /* Fall through */
2751
2752 case L2CAP_EV_RECV_FBIT:
2753 if (control && control->final) {
2754 __clear_monitor_timer(chan);
2755 if (chan->unacked_frames > 0)
2756 __set_retrans_timer(chan);
2757 chan->retry_count = 0;
2758 chan->tx_state = L2CAP_TX_STATE_XMIT;
2759 BT_DBG("recv fbit tx_state 0x2.2%x", chan->tx_state);
2760 }
2761 break;
2762 case L2CAP_EV_EXPLICIT_POLL:
2763 /* Ignore */
2764 break;
2765 case L2CAP_EV_MONITOR_TO:
2766 if (chan->max_tx == 0 || chan->retry_count < chan->max_tx) {
2767 l2cap_send_rr_or_rnr(chan, 1);
2768 __set_monitor_timer(chan);
2769 chan->retry_count++;
2770 } else {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02002771 l2cap_send_disconn_req(chan, ECONNABORTED);
Mat Martineau608bcc62012-05-17 20:53:32 -07002772 }
2773 break;
2774 default:
2775 break;
2776 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002777}
2778
Gustavo Padovand6603662012-05-21 13:58:22 -03002779static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
2780 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002781{
Mat Martineau608bcc62012-05-17 20:53:32 -07002782 BT_DBG("chan %p, control %p, skbs %p, event %d, state %d",
2783 chan, control, skbs, event, chan->tx_state);
2784
2785 switch (chan->tx_state) {
2786 case L2CAP_TX_STATE_XMIT:
Gustavo Padovand6603662012-05-21 13:58:22 -03002787 l2cap_tx_state_xmit(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002788 break;
2789 case L2CAP_TX_STATE_WAIT_F:
Gustavo Padovand6603662012-05-21 13:58:22 -03002790 l2cap_tx_state_wait_f(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002791 break;
2792 default:
2793 /* Ignore event */
2794 break;
2795 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002796}
2797
Mat Martineau4b51dae92012-05-17 20:53:37 -07002798static void l2cap_pass_to_tx(struct l2cap_chan *chan,
2799 struct l2cap_ctrl *control)
2800{
2801 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002802 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_REQSEQ_AND_FBIT);
Mat Martineau4b51dae92012-05-17 20:53:37 -07002803}
2804
Mat Martineauf80842a2012-05-17 20:53:46 -07002805static void l2cap_pass_to_tx_fbit(struct l2cap_chan *chan,
2806 struct l2cap_ctrl *control)
2807{
2808 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002809 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_FBIT);
Mat Martineauf80842a2012-05-17 20:53:46 -07002810}
2811
Linus Torvalds1da177e2005-04-16 15:20:36 -07002812/* Copy frame to all raw sockets on that connection */
2813static void l2cap_raw_recv(struct l2cap_conn *conn, struct sk_buff *skb)
2814{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002815 struct sk_buff *nskb;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03002816 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002817
2818 BT_DBG("conn %p", conn);
2819
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002820 mutex_lock(&conn->chan_lock);
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002821
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002822 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002823 if (chan->chan_type != L2CAP_CHAN_RAW)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002824 continue;
2825
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002826 /* Don't send frame to the channel it came from */
2827 if (bt_cb(skb)->chan == chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002828 continue;
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002829
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002830 nskb = skb_clone(skb, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03002831 if (!nskb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002832 continue;
Gustavo Padovan80b98022012-05-27 22:27:51 -03002833 if (chan->ops->recv(chan, nskb))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002834 kfree_skb(nskb);
2835 }
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002836
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002837 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002838}
2839
2840/* ---- L2CAP signalling commands ---- */
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002841static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn, u8 code,
2842 u8 ident, u16 dlen, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002843{
2844 struct sk_buff *skb, **frag;
2845 struct l2cap_cmd_hdr *cmd;
2846 struct l2cap_hdr *lh;
2847 int len, count;
2848
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002849 BT_DBG("conn %p, code 0x%2.2x, ident 0x%2.2x, len %u",
2850 conn, code, ident, dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002851
Anderson Lizardo300b9622013-06-02 16:30:40 -04002852 if (conn->mtu < L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE)
2853 return NULL;
2854
Linus Torvalds1da177e2005-04-16 15:20:36 -07002855 len = L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE + dlen;
2856 count = min_t(unsigned int, conn->mtu, len);
2857
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002858 skb = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002859 if (!skb)
2860 return NULL;
2861
2862 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002863 lh->len = cpu_to_le16(L2CAP_CMD_HDR_SIZE + dlen);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002864
2865 if (conn->hcon->type == LE_LINK)
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002866 lh->cid = cpu_to_le16(L2CAP_CID_LE_SIGNALING);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002867 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002868 lh->cid = cpu_to_le16(L2CAP_CID_SIGNALING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002869
2870 cmd = (struct l2cap_cmd_hdr *) skb_put(skb, L2CAP_CMD_HDR_SIZE);
2871 cmd->code = code;
2872 cmd->ident = ident;
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002873 cmd->len = cpu_to_le16(dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002874
2875 if (dlen) {
2876 count -= L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE;
2877 memcpy(skb_put(skb, count), data, count);
2878 data += count;
2879 }
2880
2881 len -= skb->len;
2882
2883 /* Continuation fragments (no L2CAP header) */
2884 frag = &skb_shinfo(skb)->frag_list;
2885 while (len) {
2886 count = min_t(unsigned int, conn->mtu, len);
2887
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002888 *frag = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002889 if (!*frag)
2890 goto fail;
2891
2892 memcpy(skb_put(*frag, count), data, count);
2893
2894 len -= count;
2895 data += count;
2896
2897 frag = &(*frag)->next;
2898 }
2899
2900 return skb;
2901
2902fail:
2903 kfree_skb(skb);
2904 return NULL;
2905}
2906
Gustavo Padovan2d792812012-10-06 10:07:01 +01002907static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen,
2908 unsigned long *val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002909{
2910 struct l2cap_conf_opt *opt = *ptr;
2911 int len;
2912
2913 len = L2CAP_CONF_OPT_SIZE + opt->len;
2914 *ptr += len;
2915
2916 *type = opt->type;
2917 *olen = opt->len;
2918
2919 switch (opt->len) {
2920 case 1:
2921 *val = *((u8 *) opt->val);
2922 break;
2923
2924 case 2:
steven miaobfaaeb32010-10-16 18:29:47 -04002925 *val = get_unaligned_le16(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002926 break;
2927
2928 case 4:
steven miaobfaaeb32010-10-16 18:29:47 -04002929 *val = get_unaligned_le32(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002930 break;
2931
2932 default:
2933 *val = (unsigned long) opt->val;
2934 break;
2935 }
2936
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002937 BT_DBG("type 0x%2.2x len %u val 0x%lx", *type, opt->len, *val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002938 return len;
2939}
2940
Linus Torvalds1da177e2005-04-16 15:20:36 -07002941static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val)
2942{
2943 struct l2cap_conf_opt *opt = *ptr;
2944
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002945 BT_DBG("type 0x%2.2x len %u val 0x%lx", type, len, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002946
2947 opt->type = type;
2948 opt->len = len;
2949
2950 switch (len) {
2951 case 1:
2952 *((u8 *) opt->val) = val;
2953 break;
2954
2955 case 2:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02002956 put_unaligned_le16(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002957 break;
2958
2959 case 4:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02002960 put_unaligned_le32(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002961 break;
2962
2963 default:
2964 memcpy(opt->val, (void *) val, len);
2965 break;
2966 }
2967
2968 *ptr += L2CAP_CONF_OPT_SIZE + len;
2969}
2970
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03002971static void l2cap_add_opt_efs(void **ptr, struct l2cap_chan *chan)
2972{
2973 struct l2cap_conf_efs efs;
2974
Szymon Janc1ec918c2011-11-16 09:32:21 +01002975 switch (chan->mode) {
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03002976 case L2CAP_MODE_ERTM:
2977 efs.id = chan->local_id;
2978 efs.stype = chan->local_stype;
2979 efs.msdu = cpu_to_le16(chan->local_msdu);
2980 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002981 efs.acc_lat = cpu_to_le32(L2CAP_DEFAULT_ACC_LAT);
2982 efs.flush_to = cpu_to_le32(L2CAP_EFS_DEFAULT_FLUSH_TO);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03002983 break;
2984
2985 case L2CAP_MODE_STREAMING:
2986 efs.id = 1;
2987 efs.stype = L2CAP_SERV_BESTEFFORT;
2988 efs.msdu = cpu_to_le16(chan->local_msdu);
2989 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
2990 efs.acc_lat = 0;
2991 efs.flush_to = 0;
2992 break;
2993
2994 default:
2995 return;
2996 }
2997
2998 l2cap_add_conf_opt(ptr, L2CAP_CONF_EFS, sizeof(efs),
Andrei Emeltchenko8936fa62012-10-08 11:14:41 +03002999 (unsigned long) &efs);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003000}
3001
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003002static void l2cap_ack_timeout(struct work_struct *work)
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003003{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003004 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau03625202012-05-17 20:53:51 -07003005 ack_timer.work);
3006 u16 frames_to_ack;
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003007
Gustavo F. Padovan2fb9b3d2011-12-22 16:56:05 -02003008 BT_DBG("chan %p", chan);
3009
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003010 l2cap_chan_lock(chan);
3011
Mat Martineau03625202012-05-17 20:53:51 -07003012 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
3013 chan->last_acked_seq);
3014
3015 if (frames_to_ack)
3016 l2cap_send_rr_or_rnr(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003017
3018 l2cap_chan_unlock(chan);
Szymon Janc09bfb2e2012-01-11 10:59:49 +01003019 l2cap_chan_put(chan);
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003020}
3021
Andrei Emeltchenko466f8002012-05-29 13:59:01 +03003022int l2cap_ertm_init(struct l2cap_chan *chan)
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003023{
Mat Martineau3c588192012-04-11 10:48:42 -07003024 int err;
3025
Mat Martineau105bdf92012-04-27 16:50:48 -07003026 chan->next_tx_seq = 0;
3027 chan->expected_tx_seq = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003028 chan->expected_ack_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003029 chan->unacked_frames = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003030 chan->buffer_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003031 chan->frames_sent = 0;
Mat Martineau105bdf92012-04-27 16:50:48 -07003032 chan->last_acked_seq = 0;
3033 chan->sdu = NULL;
3034 chan->sdu_last_frag = NULL;
3035 chan->sdu_len = 0;
3036
Mat Martineaud34c34f2012-05-14 14:49:27 -07003037 skb_queue_head_init(&chan->tx_q);
3038
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003039 chan->local_amp_id = AMP_ID_BREDR;
3040 chan->move_id = AMP_ID_BREDR;
Mat Martineau08333282012-10-23 15:24:06 -07003041 chan->move_state = L2CAP_MOVE_STABLE;
3042 chan->move_role = L2CAP_MOVE_ROLE_NONE;
3043
Mat Martineau105bdf92012-04-27 16:50:48 -07003044 if (chan->mode != L2CAP_MODE_ERTM)
3045 return 0;
3046
3047 chan->rx_state = L2CAP_RX_STATE_RECV;
3048 chan->tx_state = L2CAP_TX_STATE_XMIT;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003049
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003050 INIT_DELAYED_WORK(&chan->retrans_timer, l2cap_retrans_timeout);
3051 INIT_DELAYED_WORK(&chan->monitor_timer, l2cap_monitor_timeout);
3052 INIT_DELAYED_WORK(&chan->ack_timer, l2cap_ack_timeout);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003053
Gustavo F. Padovanf1c67752011-03-25 20:36:10 -03003054 skb_queue_head_init(&chan->srej_q);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03003055
Mat Martineau3c588192012-04-11 10:48:42 -07003056 err = l2cap_seq_list_init(&chan->srej_list, chan->tx_win);
3057 if (err < 0)
3058 return err;
3059
Mat Martineau9dc9aff2012-05-17 16:20:14 -07003060 err = l2cap_seq_list_init(&chan->retrans_list, chan->remote_tx_win);
3061 if (err < 0)
3062 l2cap_seq_list_free(&chan->srej_list);
3063
3064 return err;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003065}
3066
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003067static inline __u8 l2cap_select_mode(__u8 mode, __u16 remote_feat_mask)
3068{
3069 switch (mode) {
3070 case L2CAP_MODE_STREAMING:
3071 case L2CAP_MODE_ERTM:
3072 if (l2cap_mode_supported(mode, remote_feat_mask))
3073 return mode;
3074 /* fall through */
3075 default:
3076 return L2CAP_MODE_BASIC;
3077 }
3078}
3079
Marcel Holtmann848566b2013-10-01 22:59:22 -07003080static inline bool __l2cap_ews_supported(struct l2cap_conn *conn)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003081{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003082 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003083}
3084
Marcel Holtmann848566b2013-10-01 22:59:22 -07003085static inline bool __l2cap_efs_supported(struct l2cap_conn *conn)
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003086{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003087 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_FLOW;
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003088}
3089
Mat Martineau36c86c82012-10-23 15:24:20 -07003090static void __l2cap_set_ertm_timeouts(struct l2cap_chan *chan,
3091 struct l2cap_conf_rfc *rfc)
3092{
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003093 if (chan->local_amp_id != AMP_ID_BREDR && chan->hs_hcon) {
Mat Martineau36c86c82012-10-23 15:24:20 -07003094 u64 ertm_to = chan->hs_hcon->hdev->amp_be_flush_to;
3095
3096 /* Class 1 devices have must have ERTM timeouts
3097 * exceeding the Link Supervision Timeout. The
3098 * default Link Supervision Timeout for AMP
3099 * controllers is 10 seconds.
3100 *
3101 * Class 1 devices use 0xffffffff for their
3102 * best-effort flush timeout, so the clamping logic
3103 * will result in a timeout that meets the above
3104 * requirement. ERTM timeouts are 16-bit values, so
3105 * the maximum timeout is 65.535 seconds.
3106 */
3107
3108 /* Convert timeout to milliseconds and round */
3109 ertm_to = DIV_ROUND_UP_ULL(ertm_to, 1000);
3110
3111 /* This is the recommended formula for class 2 devices
3112 * that start ERTM timers when packets are sent to the
3113 * controller.
3114 */
3115 ertm_to = 3 * ertm_to + 500;
3116
3117 if (ertm_to > 0xffff)
3118 ertm_to = 0xffff;
3119
3120 rfc->retrans_timeout = cpu_to_le16((u16) ertm_to);
3121 rfc->monitor_timeout = rfc->retrans_timeout;
3122 } else {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003123 rfc->retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO);
3124 rfc->monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO);
Mat Martineau36c86c82012-10-23 15:24:20 -07003125 }
3126}
3127
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003128static inline void l2cap_txwin_setup(struct l2cap_chan *chan)
3129{
3130 if (chan->tx_win > L2CAP_DEFAULT_TX_WINDOW &&
Marcel Holtmann848566b2013-10-01 22:59:22 -07003131 __l2cap_ews_supported(chan->conn)) {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003132 /* use extended control field */
3133 set_bit(FLAG_EXT_CTRL, &chan->flags);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003134 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
3135 } else {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003136 chan->tx_win = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003137 L2CAP_DEFAULT_TX_WINDOW);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003138 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
3139 }
Mat Martineauc20f8e32012-07-10 05:47:07 -07003140 chan->ack_win = chan->tx_win;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003141}
3142
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003143static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003144{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003145 struct l2cap_conf_req *req = data;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003146 struct l2cap_conf_rfc rfc = { .mode = chan->mode };
Linus Torvalds1da177e2005-04-16 15:20:36 -07003147 void *ptr = req->data;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003148 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003149
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03003150 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003151
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003152 if (chan->num_conf_req || chan->num_conf_rsp)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003153 goto done;
3154
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003155 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003156 case L2CAP_MODE_STREAMING:
3157 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003158 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state))
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003159 break;
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003160
Marcel Holtmann848566b2013-10-01 22:59:22 -07003161 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003162 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3163
Gustavo F. Padovan2ba13ed2010-06-09 16:39:05 -03003164 /* fall through */
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003165 default:
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003166 chan->mode = l2cap_select_mode(rfc.mode, chan->conn->feat_mask);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003167 break;
3168 }
3169
3170done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003171 if (chan->imtu != L2CAP_DEFAULT_MTU)
3172 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovan7990681c2011-01-24 16:01:43 -02003173
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003174 switch (chan->mode) {
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003175 case L2CAP_MODE_BASIC:
Marcel Holtmann6fea7ad2014-07-09 11:53:35 +02003176 if (disable_ertm)
3177 break;
3178
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003179 if (!(chan->conn->feat_mask & L2CAP_FEAT_ERTM) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003180 !(chan->conn->feat_mask & L2CAP_FEAT_STREAMING))
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003181 break;
3182
Gustavo F. Padovan62547752010-06-08 20:05:31 -03003183 rfc.mode = L2CAP_MODE_BASIC;
3184 rfc.txwin_size = 0;
3185 rfc.max_transmit = 0;
3186 rfc.retrans_timeout = 0;
3187 rfc.monitor_timeout = 0;
3188 rfc.max_pdu_size = 0;
3189
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003190 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003191 (unsigned long) &rfc);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003192 break;
3193
3194 case L2CAP_MODE_ERTM:
3195 rfc.mode = L2CAP_MODE_ERTM;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003196 rfc.max_transmit = chan->max_tx;
Mat Martineau36c86c82012-10-23 15:24:20 -07003197
3198 __l2cap_set_ertm_timeouts(chan, &rfc);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003199
3200 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003201 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3202 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003203 rfc.max_pdu_size = cpu_to_le16(size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003204
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003205 l2cap_txwin_setup(chan);
3206
3207 rfc.txwin_size = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003208 L2CAP_DEFAULT_TX_WINDOW);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003209
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003210 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003211 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003212
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003213 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3214 l2cap_add_opt_efs(&ptr, chan);
3215
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003216 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3217 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003218 chan->tx_win);
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003219
3220 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3221 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003222 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003223 chan->fcs = L2CAP_FCS_NONE;
3224 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3225 chan->fcs);
3226 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003227 break;
3228
3229 case L2CAP_MODE_STREAMING:
Mat Martineau273759e2012-05-17 20:53:53 -07003230 l2cap_txwin_setup(chan);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003231 rfc.mode = L2CAP_MODE_STREAMING;
3232 rfc.txwin_size = 0;
3233 rfc.max_transmit = 0;
3234 rfc.retrans_timeout = 0;
3235 rfc.monitor_timeout = 0;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003236
3237 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003238 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3239 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003240 rfc.max_pdu_size = cpu_to_le16(size);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003241
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003242 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003243 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003244
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003245 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3246 l2cap_add_opt_efs(&ptr, chan);
3247
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003248 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3249 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003250 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003251 chan->fcs = L2CAP_FCS_NONE;
3252 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3253 chan->fcs);
3254 }
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003255 break;
3256 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003257
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003258 req->dcid = cpu_to_le16(chan->dcid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003259 req->flags = cpu_to_le16(0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003260
3261 return ptr - data;
3262}
3263
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003264static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003265{
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003266 struct l2cap_conf_rsp *rsp = data;
3267 void *ptr = rsp->data;
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003268 void *req = chan->conf_req;
3269 int len = chan->conf_len;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003270 int type, hint, olen;
3271 unsigned long val;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003272 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003273 struct l2cap_conf_efs efs;
3274 u8 remote_efs = 0;
Marcel Holtmann861d6882007-10-20 13:37:06 +02003275 u16 mtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003276 u16 result = L2CAP_CONF_SUCCESS;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003277 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003278
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003279 BT_DBG("chan %p", chan);
Marcel Holtmann820ae1b2006-11-18 22:15:00 +01003280
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003281 while (len >= L2CAP_CONF_OPT_SIZE) {
3282 len -= l2cap_get_conf_opt(&req, &type, &olen, &val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003283
Gustavo F. Padovan589d2742009-04-20 01:31:07 -03003284 hint = type & L2CAP_CONF_HINT;
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07003285 type &= L2CAP_CONF_MASK;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003286
3287 switch (type) {
3288 case L2CAP_CONF_MTU:
Marcel Holtmann861d6882007-10-20 13:37:06 +02003289 mtu = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003290 break;
3291
3292 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003293 chan->flush_to = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003294 break;
3295
3296 case L2CAP_CONF_QOS:
3297 break;
3298
Marcel Holtmann6464f352007-10-20 13:39:51 +02003299 case L2CAP_CONF_RFC:
3300 if (olen == sizeof(rfc))
3301 memcpy(&rfc, (void *) val, olen);
3302 break;
3303
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003304 case L2CAP_CONF_FCS:
3305 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003306 set_bit(CONF_RECV_NO_FCS, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003307 break;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003308
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003309 case L2CAP_CONF_EFS:
3310 remote_efs = 1;
3311 if (olen == sizeof(efs))
3312 memcpy(&efs, (void *) val, olen);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003313 break;
3314
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003315 case L2CAP_CONF_EWS:
Marcel Holtmann848566b2013-10-01 22:59:22 -07003316 if (!chan->conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003317 return -ECONNREFUSED;
3318
3319 set_bit(FLAG_EXT_CTRL, &chan->flags);
3320 set_bit(CONF_EWS_RECV, &chan->conf_state);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003321 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003322 chan->remote_tx_win = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003323 break;
3324
3325 default:
3326 if (hint)
3327 break;
3328
3329 result = L2CAP_CONF_UNKNOWN;
3330 *((u8 *) ptr++) = type;
3331 break;
3332 }
3333 }
3334
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003335 if (chan->num_conf_rsp || chan->num_conf_req > 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003336 goto done;
3337
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003338 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003339 case L2CAP_MODE_STREAMING:
3340 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003341 if (!test_bit(CONF_STATE2_DEVICE, &chan->conf_state)) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003342 chan->mode = l2cap_select_mode(rfc.mode,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003343 chan->conn->feat_mask);
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003344 break;
3345 }
3346
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003347 if (remote_efs) {
Marcel Holtmann848566b2013-10-01 22:59:22 -07003348 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003349 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3350 else
3351 return -ECONNREFUSED;
3352 }
3353
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003354 if (chan->mode != rfc.mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003355 return -ECONNREFUSED;
Gustavo F. Padovan742e5192010-06-08 19:09:48 -03003356
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003357 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003358 }
3359
3360done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003361 if (chan->mode != rfc.mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003362 result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003363 rfc.mode = chan->mode;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003364
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003365 if (chan->num_conf_rsp == 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003366 return -ECONNREFUSED;
3367
Gustavo Padovan2d792812012-10-06 10:07:01 +01003368 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3369 (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003370 }
3371
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003372 if (result == L2CAP_CONF_SUCCESS) {
3373 /* Configure output options and let the other side know
3374 * which ones we don't like. */
3375
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003376 if (mtu < L2CAP_DEFAULT_MIN_MTU)
3377 result = L2CAP_CONF_UNACCEPT;
3378 else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003379 chan->omtu = mtu;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003380 set_bit(CONF_MTU_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003381 }
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003382 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->omtu);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003383
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003384 if (remote_efs) {
3385 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003386 efs.stype != L2CAP_SERV_NOTRAFIC &&
3387 efs.stype != chan->local_stype) {
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003388
3389 result = L2CAP_CONF_UNACCEPT;
3390
3391 if (chan->num_conf_req >= 1)
3392 return -ECONNREFUSED;
3393
3394 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003395 sizeof(efs),
3396 (unsigned long) &efs);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003397 } else {
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003398 /* Send PENDING Conf Rsp */
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003399 result = L2CAP_CONF_PENDING;
3400 set_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003401 }
3402 }
3403
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003404 switch (rfc.mode) {
3405 case L2CAP_MODE_BASIC:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003406 chan->fcs = L2CAP_FCS_NONE;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003407 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003408 break;
3409
3410 case L2CAP_MODE_ERTM:
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003411 if (!test_bit(CONF_EWS_RECV, &chan->conf_state))
3412 chan->remote_tx_win = rfc.txwin_size;
3413 else
3414 rfc.txwin_size = L2CAP_DEFAULT_TX_WINDOW;
3415
Gustavo F. Padovan2c03a7a2011-03-25 20:15:28 -03003416 chan->remote_max_tx = rfc.max_transmit;
Mat Martineau86b1b262010-08-05 15:54:22 -07003417
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003418 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003419 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3420 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003421 rfc.max_pdu_size = cpu_to_le16(size);
3422 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003423
Mat Martineau36c86c82012-10-23 15:24:20 -07003424 __l2cap_set_ertm_timeouts(chan, &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003425
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003426 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003427
3428 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003429 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003430
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003431 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3432 chan->remote_id = efs.id;
3433 chan->remote_stype = efs.stype;
3434 chan->remote_msdu = le16_to_cpu(efs.msdu);
3435 chan->remote_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003436 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003437 chan->remote_acc_lat =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003438 le32_to_cpu(efs.acc_lat);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003439 chan->remote_sdu_itime =
3440 le32_to_cpu(efs.sdu_itime);
3441 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003442 sizeof(efs),
3443 (unsigned long) &efs);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003444 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003445 break;
3446
3447 case L2CAP_MODE_STREAMING:
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003448 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003449 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3450 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003451 rfc.max_pdu_size = cpu_to_le16(size);
3452 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003453
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003454 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003455
Gustavo Padovan2d792812012-10-06 10:07:01 +01003456 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3457 (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003458
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003459 break;
3460
3461 default:
Marcel Holtmann6464f352007-10-20 13:39:51 +02003462 result = L2CAP_CONF_UNACCEPT;
3463
3464 memset(&rfc, 0, sizeof(rfc));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003465 rfc.mode = chan->mode;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003466 }
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003467
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003468 if (result == L2CAP_CONF_SUCCESS)
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003469 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003470 }
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003471 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003472 rsp->result = cpu_to_le16(result);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003473 rsp->flags = cpu_to_le16(0);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003474
3475 return ptr - data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003476}
3477
Gustavo Padovan2d792812012-10-06 10:07:01 +01003478static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len,
3479 void *data, u16 *result)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003480{
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003481 struct l2cap_conf_req *req = data;
3482 void *ptr = req->data;
3483 int type, olen;
3484 unsigned long val;
Mat Martineau36e999a2011-12-08 17:23:21 -08003485 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003486 struct l2cap_conf_efs efs;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003487
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003488 BT_DBG("chan %p, rsp %p, len %d, req %p", chan, rsp, len, data);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003489
3490 while (len >= L2CAP_CONF_OPT_SIZE) {
3491 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3492
3493 switch (type) {
3494 case L2CAP_CONF_MTU:
3495 if (val < L2CAP_DEFAULT_MIN_MTU) {
3496 *result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003497 chan->imtu = L2CAP_DEFAULT_MIN_MTU;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003498 } else
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003499 chan->imtu = val;
3500 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003501 break;
3502
3503 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003504 chan->flush_to = val;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003505 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003506 2, chan->flush_to);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003507 break;
3508
3509 case L2CAP_CONF_RFC:
3510 if (olen == sizeof(rfc))
3511 memcpy(&rfc, (void *)val, olen);
3512
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003513 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003514 rfc.mode != chan->mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003515 return -ECONNREFUSED;
3516
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003517 chan->fcs = 0;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003518
3519 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003520 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003521 break;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003522
3523 case L2CAP_CONF_EWS:
Mat Martineauc20f8e32012-07-10 05:47:07 -07003524 chan->ack_win = min_t(u16, val, chan->ack_win);
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003525 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Mat Martineauc20f8e32012-07-10 05:47:07 -07003526 chan->tx_win);
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003527 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003528
3529 case L2CAP_CONF_EFS:
3530 if (olen == sizeof(efs))
3531 memcpy(&efs, (void *)val, olen);
3532
3533 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003534 efs.stype != L2CAP_SERV_NOTRAFIC &&
3535 efs.stype != chan->local_stype)
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003536 return -ECONNREFUSED;
3537
Gustavo Padovan2d792812012-10-06 10:07:01 +01003538 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS, sizeof(efs),
3539 (unsigned long) &efs);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003540 break;
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003541
3542 case L2CAP_CONF_FCS:
3543 if (*result == L2CAP_CONF_PENDING)
3544 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003545 set_bit(CONF_RECV_NO_FCS,
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003546 &chan->conf_state);
3547 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003548 }
3549 }
3550
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003551 if (chan->mode == L2CAP_MODE_BASIC && chan->mode != rfc.mode)
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003552 return -ECONNREFUSED;
3553
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003554 chan->mode = rfc.mode;
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003555
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003556 if (*result == L2CAP_CONF_SUCCESS || *result == L2CAP_CONF_PENDING) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003557 switch (rfc.mode) {
3558 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003559 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3560 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
3561 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003562 if (!test_bit(FLAG_EXT_CTRL, &chan->flags))
3563 chan->ack_win = min_t(u16, chan->ack_win,
3564 rfc.txwin_size);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003565
3566 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3567 chan->local_msdu = le16_to_cpu(efs.msdu);
3568 chan->local_sdu_itime =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003569 le32_to_cpu(efs.sdu_itime);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003570 chan->local_acc_lat = le32_to_cpu(efs.acc_lat);
3571 chan->local_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003572 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003573 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003574 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003575
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003576 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003577 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003578 }
3579 }
3580
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003581 req->dcid = cpu_to_le16(chan->dcid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003582 req->flags = cpu_to_le16(0);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003583
3584 return ptr - data;
3585}
3586
Gustavo Padovan2d792812012-10-06 10:07:01 +01003587static int l2cap_build_conf_rsp(struct l2cap_chan *chan, void *data,
3588 u16 result, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003589{
3590 struct l2cap_conf_rsp *rsp = data;
3591 void *ptr = rsp->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003592
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003593 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003594
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003595 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003596 rsp->result = cpu_to_le16(result);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003597 rsp->flags = cpu_to_le16(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003598
3599 return ptr - data;
3600}
3601
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003602void __l2cap_le_connect_rsp_defer(struct l2cap_chan *chan)
3603{
3604 struct l2cap_le_conn_rsp rsp;
3605 struct l2cap_conn *conn = chan->conn;
3606
3607 BT_DBG("chan %p", chan);
3608
3609 rsp.dcid = cpu_to_le16(chan->scid);
3610 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02003611 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03003612 rsp.credits = cpu_to_le16(chan->rx_credits);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003613 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003614
3615 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp),
3616 &rsp);
3617}
3618
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003619void __l2cap_connect_rsp_defer(struct l2cap_chan *chan)
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003620{
3621 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003622 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003623 u8 buf[128];
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003624 u8 rsp_code;
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003625
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003626 rsp.scid = cpu_to_le16(chan->dcid);
3627 rsp.dcid = cpu_to_le16(chan->scid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003628 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
3629 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003630
3631 if (chan->hs_hcon)
3632 rsp_code = L2CAP_CREATE_CHAN_RSP;
3633 else
3634 rsp_code = L2CAP_CONN_RSP;
3635
3636 BT_DBG("chan %p rsp_code %u", chan, rsp_code);
3637
3638 l2cap_send_cmd(conn, chan->ident, rsp_code, sizeof(rsp), &rsp);
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003639
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003640 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003641 return;
3642
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003643 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003644 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003645 chan->num_conf_req++;
3646}
3647
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003648static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len)
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003649{
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003650 int type, olen;
3651 unsigned long val;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003652 /* Use sane default values in case a misbehaving remote device
3653 * did not send an RFC or extended window size option.
3654 */
3655 u16 txwin_ext = chan->ack_win;
3656 struct l2cap_conf_rfc rfc = {
3657 .mode = chan->mode,
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003658 .retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO),
3659 .monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO),
Mat Martineauc20f8e32012-07-10 05:47:07 -07003660 .max_pdu_size = cpu_to_le16(chan->imtu),
3661 .txwin_size = min_t(u16, chan->ack_win, L2CAP_DEFAULT_TX_WINDOW),
3662 };
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003663
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003664 BT_DBG("chan %p, rsp %p, len %d", chan, rsp, len);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003665
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003666 if ((chan->mode != L2CAP_MODE_ERTM) && (chan->mode != L2CAP_MODE_STREAMING))
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003667 return;
3668
3669 while (len >= L2CAP_CONF_OPT_SIZE) {
3670 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3671
Mat Martineauc20f8e32012-07-10 05:47:07 -07003672 switch (type) {
3673 case L2CAP_CONF_RFC:
3674 if (olen == sizeof(rfc))
3675 memcpy(&rfc, (void *)val, olen);
Szymon Janc8f321f82012-06-08 11:33:33 +02003676 break;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003677 case L2CAP_CONF_EWS:
3678 txwin_ext = val;
3679 break;
3680 }
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003681 }
3682
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003683 switch (rfc.mode) {
3684 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003685 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3686 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003687 chan->mps = le16_to_cpu(rfc.max_pdu_size);
3688 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3689 chan->ack_win = min_t(u16, chan->ack_win, txwin_ext);
3690 else
3691 chan->ack_win = min_t(u16, chan->ack_win,
3692 rfc.txwin_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003693 break;
3694 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003695 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003696 }
3697}
3698
Gustavo Padovan2d792812012-10-06 10:07:01 +01003699static inline int l2cap_command_rej(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003700 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3701 u8 *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003702{
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003703 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003704
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003705 if (cmd_len < sizeof(*rej))
3706 return -EPROTO;
3707
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003708 if (rej->reason != L2CAP_REJ_NOT_UNDERSTOOD)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003709 return 0;
3710
3711 if ((conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003712 cmd->ident == conn->info_ident) {
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02003713 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann984947d2009-02-06 23:35:19 +01003714
3715 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01003716 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01003717
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003718 l2cap_conn_start(conn);
3719 }
3720
3721 return 0;
3722}
3723
Mat Martineau17009152012-10-23 15:24:07 -07003724static struct l2cap_chan *l2cap_connect(struct l2cap_conn *conn,
3725 struct l2cap_cmd_hdr *cmd,
3726 u8 *data, u8 rsp_code, u8 amp_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003727{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003728 struct l2cap_conn_req *req = (struct l2cap_conn_req *) data;
3729 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003730 struct l2cap_chan *chan = NULL, *pchan;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003731 int result, status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003732
3733 u16 dcid = 0, scid = __le16_to_cpu(req->scid);
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003734 __le16 psm = req->psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003735
Andrei Emeltchenko097db762012-03-09 14:16:17 +02003736 BT_DBG("psm 0x%2.2x scid 0x%4.4x", __le16_to_cpu(psm), scid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003737
3738 /* Check if we have socket listening on psm */
Marcel Holtmann6f59b902013-10-13 05:24:01 -07003739 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03003740 &conn->hcon->dst, ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003741 if (!pchan) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003742 result = L2CAP_CR_BAD_PSM;
3743 goto sendresp;
3744 }
3745
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003746 mutex_lock(&conn->chan_lock);
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003747 l2cap_chan_lock(pchan);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00003748
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003749 /* Check if the ACL is secure enough (if not SDP) */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003750 if (psm != cpu_to_le16(L2CAP_PSM_SDP) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003751 !hci_conn_check_link_mode(conn->hcon)) {
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02003752 conn->disc_reason = HCI_ERROR_AUTH_FAILURE;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003753 result = L2CAP_CR_SEC_BLOCK;
3754 goto response;
3755 }
3756
Linus Torvalds1da177e2005-04-16 15:20:36 -07003757 result = L2CAP_CR_NO_MEM;
3758
Gustavo Padovan2dfa1002012-05-27 22:27:58 -03003759 /* Check if we already have channel with that dcid */
3760 if (__l2cap_get_chan_by_dcid(conn, scid))
3761 goto response;
3762
Gustavo Padovan80b98022012-05-27 22:27:51 -03003763 chan = pchan->ops->new_connection(pchan);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03003764 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003765 goto response;
3766
Syam Sidhardhan330b6c12013-08-06 01:59:12 +09003767 /* For certain devices (ex: HID mouse), support for authentication,
3768 * pairing and bonding is optional. For such devices, inorder to avoid
3769 * the ACL alive for too long after L2CAP disconnection, reset the ACL
3770 * disc_timeout back to HCI_DISCONN_TIMEOUT during L2CAP connect.
3771 */
3772 conn->hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
3773
Marcel Holtmann7eafc592013-10-13 08:12:47 -07003774 bacpy(&chan->src, &conn->hcon->src);
3775 bacpy(&chan->dst, &conn->hcon->dst);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -07003776 chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type);
3777 chan->dst_type = bdaddr_type(conn->hcon, conn->hcon->dst_type);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003778 chan->psm = psm;
3779 chan->dcid = scid;
Mat Martineau17009152012-10-23 15:24:07 -07003780 chan->local_amp_id = amp_id;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003781
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003782 __l2cap_chan_add(conn, chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003783
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003784 dcid = chan->scid;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003785
Gustavo Padovan8d836d72013-10-15 19:24:47 -03003786 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003787
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003788 chan->ident = cmd->ident;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003789
Marcel Holtmann984947d2009-02-06 23:35:19 +01003790 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) {
Johan Hedberge7cafc42014-07-17 15:35:38 +03003791 if (l2cap_chan_check_security(chan, false)) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07003792 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003793 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003794 result = L2CAP_CR_PEND;
3795 status = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08003796 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003797 } else {
Mat Martineau17009152012-10-23 15:24:07 -07003798 /* Force pending result for AMP controllers.
3799 * The connection will succeed after the
3800 * physical link is up.
3801 */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003802 if (amp_id == AMP_ID_BREDR) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003803 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau17009152012-10-23 15:24:07 -07003804 result = L2CAP_CR_SUCCESS;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003805 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003806 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003807 result = L2CAP_CR_PEND;
Mat Martineau17009152012-10-23 15:24:07 -07003808 }
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003809 status = L2CAP_CS_NO_INFO;
3810 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003811 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003812 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003813 result = L2CAP_CR_PEND;
3814 status = L2CAP_CS_AUTHEN_PEND;
3815 }
3816 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003817 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003818 result = L2CAP_CR_PEND;
3819 status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003820 }
3821
Linus Torvalds1da177e2005-04-16 15:20:36 -07003822response:
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003823 l2cap_chan_unlock(pchan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003824 mutex_unlock(&conn->chan_lock);
Johan Hedberga24cce12014-08-07 22:56:42 +03003825 l2cap_chan_put(pchan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003826
3827sendresp:
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003828 rsp.scid = cpu_to_le16(scid);
3829 rsp.dcid = cpu_to_le16(dcid);
3830 rsp.result = cpu_to_le16(result);
3831 rsp.status = cpu_to_le16(status);
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003832 l2cap_send_cmd(conn, cmd->ident, rsp_code, sizeof(rsp), &rsp);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003833
3834 if (result == L2CAP_CR_PEND && status == L2CAP_CS_NO_INFO) {
3835 struct l2cap_info_req info;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003836 info.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003837
3838 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
3839 conn->info_ident = l2cap_get_ident(conn);
3840
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08003841 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003842
Gustavo Padovan2d792812012-10-06 10:07:01 +01003843 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
3844 sizeof(info), &info);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003845 }
3846
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003847 if (chan && !test_bit(CONF_REQ_SENT, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003848 result == L2CAP_CR_SUCCESS) {
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003849 u8 buf[128];
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003850 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003851 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003852 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003853 chan->num_conf_req++;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003854 }
Mat Martineau17009152012-10-23 15:24:07 -07003855
3856 return chan;
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003857}
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003858
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003859static int l2cap_connect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003860 struct l2cap_cmd_hdr *cmd, u16 cmd_len, u8 *data)
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003861{
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303862 struct hci_dev *hdev = conn->hcon->hdev;
3863 struct hci_conn *hcon = conn->hcon;
3864
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003865 if (cmd_len < sizeof(struct l2cap_conn_req))
3866 return -EPROTO;
3867
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303868 hci_dev_lock(hdev);
3869 if (test_bit(HCI_MGMT, &hdev->dev_flags) &&
3870 !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &hcon->flags))
3871 mgmt_device_connected(hdev, &hcon->dst, hcon->type,
3872 hcon->dst_type, 0, NULL, 0,
3873 hcon->dev_class);
3874 hci_dev_unlock(hdev);
3875
Gustavo Padovan300229f2012-10-12 19:40:40 +08003876 l2cap_connect(conn, cmd, data, L2CAP_CONN_RSP, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003877 return 0;
3878}
3879
Mat Martineau5909cf32012-10-23 15:24:08 -07003880static int l2cap_connect_create_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003881 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3882 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003883{
3884 struct l2cap_conn_rsp *rsp = (struct l2cap_conn_rsp *) data;
3885 u16 scid, dcid, result, status;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003886 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003887 u8 req[128];
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003888 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003889
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003890 if (cmd_len < sizeof(*rsp))
3891 return -EPROTO;
3892
Linus Torvalds1da177e2005-04-16 15:20:36 -07003893 scid = __le16_to_cpu(rsp->scid);
3894 dcid = __le16_to_cpu(rsp->dcid);
3895 result = __le16_to_cpu(rsp->result);
3896 status = __le16_to_cpu(rsp->status);
3897
Andrei Emeltchenko1b009c92012-02-21 12:54:54 +02003898 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 +01003899 dcid, scid, result, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003900
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003901 mutex_lock(&conn->chan_lock);
3902
Linus Torvalds1da177e2005-04-16 15:20:36 -07003903 if (scid) {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003904 chan = __l2cap_get_chan_by_scid(conn, scid);
3905 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003906 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003907 goto unlock;
3908 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003909 } else {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003910 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
3911 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003912 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003913 goto unlock;
3914 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003915 }
3916
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003917 err = 0;
3918
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003919 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003920
Linus Torvalds1da177e2005-04-16 15:20:36 -07003921 switch (result) {
3922 case L2CAP_CR_SUCCESS:
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03003923 l2cap_state_change(chan, BT_CONFIG);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003924 chan->ident = 0;
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003925 chan->dcid = dcid;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003926 clear_bit(CONF_CONNECT_PEND, &chan->conf_state);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01003927
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003928 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003929 break;
3930
Linus Torvalds1da177e2005-04-16 15:20:36 -07003931 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003932 l2cap_build_conf_req(chan, req), req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003933 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003934 break;
3935
3936 case L2CAP_CR_PEND:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003937 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003938 break;
3939
3940 default:
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003941 l2cap_chan_del(chan, ECONNREFUSED);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003942 break;
3943 }
3944
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003945 l2cap_chan_unlock(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003946
3947unlock:
3948 mutex_unlock(&conn->chan_lock);
3949
3950 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003951}
3952
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003953static inline void set_default_fcs(struct l2cap_chan *chan)
Mat Martineau8c462b62010-08-24 15:35:42 -07003954{
3955 /* FCS is enabled only in ERTM or streaming mode, if one or both
3956 * sides request it.
3957 */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003958 if (chan->mode != L2CAP_MODE_ERTM && chan->mode != L2CAP_MODE_STREAMING)
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003959 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003960 else if (!test_bit(CONF_RECV_NO_FCS, &chan->conf_state))
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003961 chan->fcs = L2CAP_FCS_CRC16;
Mat Martineau8c462b62010-08-24 15:35:42 -07003962}
3963
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03003964static void l2cap_send_efs_conf_rsp(struct l2cap_chan *chan, void *data,
3965 u8 ident, u16 flags)
3966{
3967 struct l2cap_conn *conn = chan->conn;
3968
3969 BT_DBG("conn %p chan %p ident %d flags 0x%4.4x", conn, chan, ident,
3970 flags);
3971
3972 clear_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
3973 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
3974
3975 l2cap_send_cmd(conn, ident, L2CAP_CONF_RSP,
3976 l2cap_build_conf_rsp(chan, data,
3977 L2CAP_CONF_SUCCESS, flags), data);
3978}
3979
Johan Hedberg662d6522013-10-16 11:20:47 +03003980static void cmd_reject_invalid_cid(struct l2cap_conn *conn, u8 ident,
3981 u16 scid, u16 dcid)
3982{
3983 struct l2cap_cmd_rej_cid rej;
3984
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003985 rej.reason = cpu_to_le16(L2CAP_REJ_INVALID_CID);
Johan Hedberg662d6522013-10-16 11:20:47 +03003986 rej.scid = __cpu_to_le16(scid);
3987 rej.dcid = __cpu_to_le16(dcid);
3988
3989 l2cap_send_cmd(conn, ident, L2CAP_COMMAND_REJ, sizeof(rej), &rej);
3990}
3991
Gustavo Padovan2d792812012-10-06 10:07:01 +01003992static inline int l2cap_config_req(struct l2cap_conn *conn,
3993 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3994 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003995{
3996 struct l2cap_conf_req *req = (struct l2cap_conf_req *) data;
3997 u16 dcid, flags;
3998 u8 rsp[64];
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003999 struct l2cap_chan *chan;
Mat Martineau3c588192012-04-11 10:48:42 -07004000 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004001
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004002 if (cmd_len < sizeof(*req))
4003 return -EPROTO;
4004
Linus Torvalds1da177e2005-04-16 15:20:36 -07004005 dcid = __le16_to_cpu(req->dcid);
4006 flags = __le16_to_cpu(req->flags);
4007
4008 BT_DBG("dcid 0x%4.4x flags 0x%2.2x", dcid, flags);
4009
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004010 chan = l2cap_get_chan_by_scid(conn, dcid);
Johan Hedberg662d6522013-10-16 11:20:47 +03004011 if (!chan) {
4012 cmd_reject_invalid_cid(conn, cmd->ident, dcid, 0);
4013 return 0;
4014 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004015
David S. Miller033b1142011-07-21 13:38:42 -07004016 if (chan->state != BT_CONFIG && chan->state != BT_CONNECT2) {
Johan Hedberg662d6522013-10-16 11:20:47 +03004017 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4018 chan->dcid);
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004019 goto unlock;
Gustavo F. Padovandf6bd742010-06-14 02:26:15 -03004020 }
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004021
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004022 /* Reject if config buffer is too small. */
Al Viro88219a02007-07-29 00:17:25 -07004023 len = cmd_len - sizeof(*req);
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004024 if (chan->conf_len + len > sizeof(chan->conf_req)) {
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004025 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004026 l2cap_build_conf_rsp(chan, rsp,
4027 L2CAP_CONF_REJECT, flags), rsp);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004028 goto unlock;
4029 }
4030
4031 /* Store config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004032 memcpy(chan->conf_req + chan->conf_len, req->data, len);
4033 chan->conf_len += len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004034
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004035 if (flags & L2CAP_CONF_FLAG_CONTINUATION) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004036 /* Incomplete config. Send empty response. */
4037 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004038 l2cap_build_conf_rsp(chan, rsp,
4039 L2CAP_CONF_SUCCESS, flags), rsp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004040 goto unlock;
4041 }
4042
4043 /* Complete config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004044 len = l2cap_parse_conf_req(chan, rsp);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004045 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004046 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004047 goto unlock;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004048 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004049
Mat Martineau1500109b2012-10-23 15:24:15 -07004050 chan->ident = cmd->ident;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004051 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004052 chan->num_conf_rsp++;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004053
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004054 /* Reset config buffer. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004055 chan->conf_len = 0;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004056
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004057 if (!test_bit(CONF_OUTPUT_DONE, &chan->conf_state))
Marcel Holtmann876d9482007-10-20 13:35:42 +02004058 goto unlock;
4059
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004060 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004061 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004062
Mat Martineau105bdf92012-04-27 16:50:48 -07004063 if (chan->mode == L2CAP_MODE_ERTM ||
4064 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004065 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004066
Mat Martineau3c588192012-04-11 10:48:42 -07004067 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004068 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004069 else
4070 l2cap_chan_ready(chan);
4071
Marcel Holtmann876d9482007-10-20 13:35:42 +02004072 goto unlock;
4073 }
4074
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004075 if (!test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02004076 u8 buf[64];
Linus Torvalds1da177e2005-04-16 15:20:36 -07004077 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004078 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004079 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004080 }
4081
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004082 /* Got Conf Rsp PENDING from remote side and asume we sent
4083 Conf Rsp PENDING in the code above */
4084 if (test_bit(CONF_REM_CONF_PEND, &chan->conf_state) &&
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03004085 test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004086
4087 /* check compatibility */
4088
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004089 /* Send rsp for BR/EDR channel */
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004090 if (!chan->hs_hcon)
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004091 l2cap_send_efs_conf_rsp(chan, rsp, cmd->ident, flags);
4092 else
4093 chan->ident = cmd->ident;
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004094 }
4095
Linus Torvalds1da177e2005-04-16 15:20:36 -07004096unlock:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004097 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004098 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004099}
4100
Gustavo Padovan2d792812012-10-06 10:07:01 +01004101static inline int l2cap_config_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004102 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4103 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004104{
4105 struct l2cap_conf_rsp *rsp = (struct l2cap_conf_rsp *)data;
4106 u16 scid, flags, result;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004107 struct l2cap_chan *chan;
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004108 int len = cmd_len - sizeof(*rsp);
Mat Martineau3c588192012-04-11 10:48:42 -07004109 int err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004110
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004111 if (cmd_len < sizeof(*rsp))
4112 return -EPROTO;
4113
Linus Torvalds1da177e2005-04-16 15:20:36 -07004114 scid = __le16_to_cpu(rsp->scid);
4115 flags = __le16_to_cpu(rsp->flags);
4116 result = __le16_to_cpu(rsp->result);
4117
Andrei Emeltchenko61386cb2012-03-12 12:13:07 +02004118 BT_DBG("scid 0x%4.4x flags 0x%2.2x result 0x%2.2x len %d", scid, flags,
4119 result, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004120
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004121 chan = l2cap_get_chan_by_scid(conn, scid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004122 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004123 return 0;
4124
4125 switch (result) {
4126 case L2CAP_CONF_SUCCESS:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004127 l2cap_conf_rfc_get(chan, rsp->data, len);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004128 clear_bit(CONF_REM_CONF_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004129 break;
4130
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004131 case L2CAP_CONF_PENDING:
4132 set_bit(CONF_REM_CONF_PEND, &chan->conf_state);
4133
4134 if (test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
4135 char buf[64];
4136
4137 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004138 buf, &result);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004139 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004140 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004141 goto done;
4142 }
4143
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004144 if (!chan->hs_hcon) {
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004145 l2cap_send_efs_conf_rsp(chan, buf, cmd->ident,
4146 0);
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02004147 } else {
4148 if (l2cap_check_efs(chan)) {
4149 amp_create_logical_link(chan);
4150 chan->ident = cmd->ident;
4151 }
4152 }
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004153 }
4154 goto done;
4155
Linus Torvalds1da177e2005-04-16 15:20:36 -07004156 case L2CAP_CONF_UNACCEPT:
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004157 if (chan->num_conf_rsp <= L2CAP_CONF_MAX_CONF_RSP) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004158 char req[64];
4159
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004160 if (len > sizeof(req) - sizeof(struct l2cap_conf_req)) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004161 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004162 goto done;
4163 }
4164
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004165 /* throw out any old stored conf requests */
4166 result = L2CAP_CONF_SUCCESS;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03004167 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004168 req, &result);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004169 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004170 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004171 goto done;
4172 }
4173
4174 l2cap_send_cmd(conn, l2cap_get_ident(conn),
Gustavo Padovan2d792812012-10-06 10:07:01 +01004175 L2CAP_CONF_REQ, len, req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004176 chan->num_conf_req++;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004177 if (result != L2CAP_CONF_SUCCESS)
4178 goto done;
4179 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004180 }
4181
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09004182 default:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004183 l2cap_chan_set_err(chan, ECONNRESET);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +02004184
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08004185 __set_chan_timer(chan, L2CAP_DISC_REJ_TIMEOUT);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004186 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004187 goto done;
4188 }
4189
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004190 if (flags & L2CAP_CONF_FLAG_CONTINUATION)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004191 goto done;
4192
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004193 set_bit(CONF_INPUT_DONE, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004194
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004195 if (test_bit(CONF_OUTPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004196 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004197
Mat Martineau105bdf92012-04-27 16:50:48 -07004198 if (chan->mode == L2CAP_MODE_ERTM ||
4199 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004200 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004201
Mat Martineau3c588192012-04-11 10:48:42 -07004202 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004203 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004204 else
4205 l2cap_chan_ready(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004206 }
4207
4208done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004209 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004210 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004211}
4212
Gustavo Padovan2d792812012-10-06 10:07:01 +01004213static inline int l2cap_disconnect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004214 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4215 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004216{
4217 struct l2cap_disconn_req *req = (struct l2cap_disconn_req *) data;
4218 struct l2cap_disconn_rsp rsp;
4219 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004220 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004221
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004222 if (cmd_len != sizeof(*req))
4223 return -EPROTO;
4224
Linus Torvalds1da177e2005-04-16 15:20:36 -07004225 scid = __le16_to_cpu(req->scid);
4226 dcid = __le16_to_cpu(req->dcid);
4227
4228 BT_DBG("scid 0x%4.4x dcid 0x%4.4x", scid, dcid);
4229
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004230 mutex_lock(&conn->chan_lock);
4231
4232 chan = __l2cap_get_chan_by_scid(conn, dcid);
4233 if (!chan) {
4234 mutex_unlock(&conn->chan_lock);
Johan Hedberg662d6522013-10-16 11:20:47 +03004235 cmd_reject_invalid_cid(conn, cmd->ident, dcid, scid);
4236 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004237 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004238
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004239 l2cap_chan_lock(chan);
4240
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03004241 rsp.dcid = cpu_to_le16(chan->scid);
4242 rsp.scid = cpu_to_le16(chan->dcid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004243 l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp);
4244
Gustavo Padovan5ec1bbe2013-10-15 19:24:48 -03004245 chan->ops->set_shutdown(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004246
Mat Martineau61d6ef32012-04-27 16:50:50 -07004247 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004248 l2cap_chan_del(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004249
4250 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004251
Gustavo Padovan80b98022012-05-27 22:27:51 -03004252 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004253 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004254
4255 mutex_unlock(&conn->chan_lock);
4256
Linus Torvalds1da177e2005-04-16 15:20:36 -07004257 return 0;
4258}
4259
Gustavo Padovan2d792812012-10-06 10:07:01 +01004260static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004261 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4262 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004263{
4264 struct l2cap_disconn_rsp *rsp = (struct l2cap_disconn_rsp *) data;
4265 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004266 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004267
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004268 if (cmd_len != sizeof(*rsp))
4269 return -EPROTO;
4270
Linus Torvalds1da177e2005-04-16 15:20:36 -07004271 scid = __le16_to_cpu(rsp->scid);
4272 dcid = __le16_to_cpu(rsp->dcid);
4273
4274 BT_DBG("dcid 0x%4.4x scid 0x%4.4x", dcid, scid);
4275
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004276 mutex_lock(&conn->chan_lock);
4277
4278 chan = __l2cap_get_chan_by_scid(conn, scid);
4279 if (!chan) {
4280 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004281 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004282 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004283
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004284 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004285
Mat Martineau61d6ef32012-04-27 16:50:50 -07004286 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004287 l2cap_chan_del(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004288
4289 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004290
Gustavo Padovan80b98022012-05-27 22:27:51 -03004291 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004292 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004293
4294 mutex_unlock(&conn->chan_lock);
4295
Linus Torvalds1da177e2005-04-16 15:20:36 -07004296 return 0;
4297}
4298
Gustavo Padovan2d792812012-10-06 10:07:01 +01004299static inline int l2cap_information_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004300 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4301 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004302{
4303 struct l2cap_info_req *req = (struct l2cap_info_req *) data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004304 u16 type;
4305
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004306 if (cmd_len != sizeof(*req))
4307 return -EPROTO;
4308
Linus Torvalds1da177e2005-04-16 15:20:36 -07004309 type = __le16_to_cpu(req->type);
4310
4311 BT_DBG("type 0x%4.4x", type);
4312
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004313 if (type == L2CAP_IT_FEAT_MASK) {
4314 u8 buf[8];
Marcel Holtmann44dd46d2009-05-02 19:09:01 -07004315 u32 feat_mask = l2cap_feat_mask;
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004316 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004317 rsp->type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
4318 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03004319 if (!disable_ertm)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004320 feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING
Gustavo Padovan2d792812012-10-06 10:07:01 +01004321 | L2CAP_FEAT_FCS;
Marcel Holtmann848566b2013-10-01 22:59:22 -07004322 if (conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03004323 feat_mask |= L2CAP_FEAT_EXT_FLOW
Gustavo Padovan2d792812012-10-06 10:07:01 +01004324 | L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenkoa5fd6f32011-09-16 16:26:32 +03004325
Gustavo F. Padovan1b7bf4e2009-08-24 00:45:20 -03004326 put_unaligned_le32(feat_mask, rsp->data);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004327 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4328 buf);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004329 } else if (type == L2CAP_IT_FIXED_CHAN) {
4330 u8 buf[12];
4331 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Mat Martineau50a147c2011-11-02 16:18:34 -07004332
Marcel Holtmann848566b2013-10-01 22:59:22 -07004333 if (conn->hs_enabled)
Mat Martineau50a147c2011-11-02 16:18:34 -07004334 l2cap_fixed_chan[0] |= L2CAP_FC_A2MP;
4335 else
4336 l2cap_fixed_chan[0] &= ~L2CAP_FC_A2MP;
4337
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004338 rsp->type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
4339 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Andrei Emeltchenkoc6337ea2011-10-20 17:02:44 +03004340 memcpy(rsp->data, l2cap_fixed_chan, sizeof(l2cap_fixed_chan));
Gustavo Padovan2d792812012-10-06 10:07:01 +01004341 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4342 buf);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004343 } else {
4344 struct l2cap_info_rsp rsp;
4345 rsp.type = cpu_to_le16(type);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004346 rsp.result = cpu_to_le16(L2CAP_IR_NOTSUPP);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004347 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(rsp),
4348 &rsp);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004349 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004350
4351 return 0;
4352}
4353
Gustavo Padovan2d792812012-10-06 10:07:01 +01004354static inline int l2cap_information_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004355 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4356 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004357{
4358 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) data;
4359 u16 type, result;
4360
Jaganath Kanakkassery3f6fa3d2013-06-21 19:55:11 +05304361 if (cmd_len < sizeof(*rsp))
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004362 return -EPROTO;
4363
Linus Torvalds1da177e2005-04-16 15:20:36 -07004364 type = __le16_to_cpu(rsp->type);
4365 result = __le16_to_cpu(rsp->result);
4366
4367 BT_DBG("type 0x%4.4x result 0x%2.2x", type, result);
4368
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004369 /* L2CAP Info req/rsp are unbound to channels, add extra checks */
4370 if (cmd->ident != conn->info_ident ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01004371 conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004372 return 0;
4373
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02004374 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004375
Ville Tervoadb08ed2010-08-04 09:43:33 +03004376 if (result != L2CAP_IR_SUCCESS) {
4377 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4378 conn->info_ident = 0;
4379
4380 l2cap_conn_start(conn);
4381
4382 return 0;
4383 }
4384
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004385 switch (type) {
4386 case L2CAP_IT_FEAT_MASK:
Harvey Harrison83985312008-05-02 16:25:46 -07004387 conn->feat_mask = get_unaligned_le32(rsp->data);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004388
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07004389 if (conn->feat_mask & L2CAP_FEAT_FIXED_CHAN) {
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004390 struct l2cap_info_req req;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004391 req.type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004392
4393 conn->info_ident = l2cap_get_ident(conn);
4394
4395 l2cap_send_cmd(conn, conn->info_ident,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004396 L2CAP_INFO_REQ, sizeof(req), &req);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004397 } else {
4398 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4399 conn->info_ident = 0;
4400
4401 l2cap_conn_start(conn);
4402 }
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004403 break;
4404
4405 case L2CAP_IT_FIXED_CHAN:
4406 conn->fixed_chan_mask = rsp->data[0];
Marcel Holtmann984947d2009-02-06 23:35:19 +01004407 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004408 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004409
4410 l2cap_conn_start(conn);
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004411 break;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004412 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004413
Linus Torvalds1da177e2005-04-16 15:20:36 -07004414 return 0;
4415}
4416
Mat Martineau17009152012-10-23 15:24:07 -07004417static int l2cap_create_channel_req(struct l2cap_conn *conn,
4418 struct l2cap_cmd_hdr *cmd,
4419 u16 cmd_len, void *data)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004420{
4421 struct l2cap_create_chan_req *req = data;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004422 struct l2cap_create_chan_rsp rsp;
Mat Martineau17009152012-10-23 15:24:07 -07004423 struct l2cap_chan *chan;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004424 struct hci_dev *hdev;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004425 u16 psm, scid;
4426
4427 if (cmd_len != sizeof(*req))
4428 return -EPROTO;
4429
Marcel Holtmann848566b2013-10-01 22:59:22 -07004430 if (!conn->hs_enabled)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004431 return -EINVAL;
4432
4433 psm = le16_to_cpu(req->psm);
4434 scid = le16_to_cpu(req->scid);
4435
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004436 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 -07004437
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004438 /* For controller id 0 make BR/EDR connection */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004439 if (req->amp_id == AMP_ID_BREDR) {
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004440 l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4441 req->amp_id);
4442 return 0;
4443 }
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004444
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004445 /* Validate AMP controller id */
4446 hdev = hci_dev_get(req->amp_id);
4447 if (!hdev)
4448 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004449
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004450 if (hdev->dev_type != HCI_AMP || !test_bit(HCI_UP, &hdev->flags)) {
Mat Martineau17009152012-10-23 15:24:07 -07004451 hci_dev_put(hdev);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004452 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004453 }
4454
4455 chan = l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4456 req->amp_id);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004457 if (chan) {
4458 struct amp_mgr *mgr = conn->hcon->amp_mgr;
4459 struct hci_conn *hs_hcon;
4460
Marcel Holtmann98e0f7e2013-10-13 02:23:40 -07004461 hs_hcon = hci_conn_hash_lookup_ba(hdev, AMP_LINK,
4462 &conn->hcon->dst);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004463 if (!hs_hcon) {
4464 hci_dev_put(hdev);
Johan Hedberg662d6522013-10-16 11:20:47 +03004465 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4466 chan->dcid);
4467 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004468 }
4469
4470 BT_DBG("mgr %p bredr_chan %p hs_hcon %p", mgr, chan, hs_hcon);
4471
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004472 mgr->bredr_chan = chan;
4473 chan->hs_hcon = hs_hcon;
Andrei Emeltchenkofd45bf42012-11-20 17:16:22 +02004474 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004475 conn->mtu = hdev->block_mtu;
4476 }
4477
4478 hci_dev_put(hdev);
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004479
4480 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004481
4482error:
4483 rsp.dcid = 0;
4484 rsp.scid = cpu_to_le16(scid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004485 rsp.result = cpu_to_le16(L2CAP_CR_BAD_AMP);
4486 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004487
4488 l2cap_send_cmd(conn, cmd->ident, L2CAP_CREATE_CHAN_RSP,
4489 sizeof(rsp), &rsp);
4490
Johan Hedbergdc280802013-09-16 13:05:13 +03004491 return 0;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004492}
4493
Mat Martineau8eb200b2012-10-23 15:24:17 -07004494static void l2cap_send_move_chan_req(struct l2cap_chan *chan, u8 dest_amp_id)
4495{
4496 struct l2cap_move_chan_req req;
4497 u8 ident;
4498
4499 BT_DBG("chan %p, dest_amp_id %d", chan, dest_amp_id);
4500
4501 ident = l2cap_get_ident(chan->conn);
4502 chan->ident = ident;
4503
4504 req.icid = cpu_to_le16(chan->scid);
4505 req.dest_amp_id = dest_amp_id;
4506
4507 l2cap_send_cmd(chan->conn, ident, L2CAP_MOVE_CHAN_REQ, sizeof(req),
4508 &req);
4509
4510 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4511}
4512
Mat Martineau1500109b2012-10-23 15:24:15 -07004513static void l2cap_send_move_chan_rsp(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004514{
4515 struct l2cap_move_chan_rsp rsp;
4516
Mat Martineau1500109b2012-10-23 15:24:15 -07004517 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004518
Mat Martineau1500109b2012-10-23 15:24:15 -07004519 rsp.icid = cpu_to_le16(chan->dcid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004520 rsp.result = cpu_to_le16(result);
4521
Mat Martineau1500109b2012-10-23 15:24:15 -07004522 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_RSP,
4523 sizeof(rsp), &rsp);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004524}
4525
Mat Martineau5b155ef2012-10-23 15:24:14 -07004526static void l2cap_send_move_chan_cfm(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004527{
4528 struct l2cap_move_chan_cfm cfm;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004529
Mat Martineau5b155ef2012-10-23 15:24:14 -07004530 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004531
Mat Martineau5b155ef2012-10-23 15:24:14 -07004532 chan->ident = l2cap_get_ident(chan->conn);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004533
Mat Martineau5b155ef2012-10-23 15:24:14 -07004534 cfm.icid = cpu_to_le16(chan->scid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004535 cfm.result = cpu_to_le16(result);
4536
Mat Martineau5b155ef2012-10-23 15:24:14 -07004537 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_CFM,
4538 sizeof(cfm), &cfm);
4539
4540 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4541}
4542
4543static void l2cap_send_move_chan_cfm_icid(struct l2cap_conn *conn, u16 icid)
4544{
4545 struct l2cap_move_chan_cfm cfm;
4546
4547 BT_DBG("conn %p, icid 0x%4.4x", conn, icid);
4548
4549 cfm.icid = cpu_to_le16(icid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004550 cfm.result = cpu_to_le16(L2CAP_MC_UNCONFIRMED);
Mat Martineau5b155ef2012-10-23 15:24:14 -07004551
4552 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_MOVE_CHAN_CFM,
4553 sizeof(cfm), &cfm);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004554}
4555
4556static void l2cap_send_move_chan_cfm_rsp(struct l2cap_conn *conn, u8 ident,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004557 u16 icid)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004558{
4559 struct l2cap_move_chan_cfm_rsp rsp;
4560
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004561 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004562
4563 rsp.icid = cpu_to_le16(icid);
4564 l2cap_send_cmd(conn, ident, L2CAP_MOVE_CHAN_CFM_RSP, sizeof(rsp), &rsp);
4565}
4566
Mat Martineau5f3847a2012-10-23 15:24:12 -07004567static void __release_logical_link(struct l2cap_chan *chan)
4568{
4569 chan->hs_hchan = NULL;
4570 chan->hs_hcon = NULL;
4571
4572 /* Placeholder - release the logical link */
4573}
4574
Mat Martineau1500109b2012-10-23 15:24:15 -07004575static void l2cap_logical_fail(struct l2cap_chan *chan)
4576{
4577 /* Logical link setup failed */
4578 if (chan->state != BT_CONNECTED) {
4579 /* Create channel failure, disconnect */
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004580 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineau1500109b2012-10-23 15:24:15 -07004581 return;
4582 }
4583
4584 switch (chan->move_role) {
4585 case L2CAP_MOVE_ROLE_RESPONDER:
4586 l2cap_move_done(chan);
4587 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_SUPP);
4588 break;
4589 case L2CAP_MOVE_ROLE_INITIATOR:
4590 if (chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_COMP ||
4591 chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_CFM) {
4592 /* Remote has only sent pending or
4593 * success responses, clean up
4594 */
4595 l2cap_move_done(chan);
4596 }
4597
4598 /* Other amp move states imply that the move
4599 * has already aborted
4600 */
4601 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
4602 break;
4603 }
4604}
4605
4606static void l2cap_logical_finish_create(struct l2cap_chan *chan,
4607 struct hci_chan *hchan)
4608{
4609 struct l2cap_conf_rsp rsp;
Mat Martineau1500109b2012-10-23 15:24:15 -07004610
Andrei Emeltchenko336178a2012-10-31 15:46:27 +02004611 chan->hs_hchan = hchan;
Mat Martineau1500109b2012-10-23 15:24:15 -07004612 chan->hs_hcon->l2cap_data = chan->conn;
4613
Andrei Emeltchenko35ba9562012-10-25 15:20:43 +03004614 l2cap_send_efs_conf_rsp(chan, &rsp, chan->ident, 0);
Mat Martineau1500109b2012-10-23 15:24:15 -07004615
4616 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Andrei Emeltchenkofe79c6f2012-10-25 15:20:42 +03004617 int err;
Mat Martineau1500109b2012-10-23 15:24:15 -07004618
4619 set_default_fcs(chan);
4620
4621 err = l2cap_ertm_init(chan);
4622 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004623 l2cap_send_disconn_req(chan, -err);
Mat Martineau1500109b2012-10-23 15:24:15 -07004624 else
4625 l2cap_chan_ready(chan);
4626 }
4627}
4628
4629static void l2cap_logical_finish_move(struct l2cap_chan *chan,
4630 struct hci_chan *hchan)
4631{
4632 chan->hs_hcon = hchan->conn;
4633 chan->hs_hcon->l2cap_data = chan->conn;
4634
4635 BT_DBG("move_state %d", chan->move_state);
4636
4637 switch (chan->move_state) {
4638 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
4639 /* Move confirm will be sent after a success
4640 * response is received
4641 */
4642 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4643 break;
4644 case L2CAP_MOVE_WAIT_LOGICAL_CFM:
4645 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4646 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4647 } else if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
4648 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
4649 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
4650 } else if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4651 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4652 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4653 }
4654 break;
4655 default:
4656 /* Move was not in expected state, free the channel */
4657 __release_logical_link(chan);
4658
4659 chan->move_state = L2CAP_MOVE_STABLE;
4660 }
4661}
4662
4663/* Call with chan locked */
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004664void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan,
4665 u8 status)
Mat Martineau5b155ef2012-10-23 15:24:14 -07004666{
Mat Martineau1500109b2012-10-23 15:24:15 -07004667 BT_DBG("chan %p, hchan %p, status %d", chan, hchan, status);
4668
4669 if (status) {
4670 l2cap_logical_fail(chan);
4671 __release_logical_link(chan);
4672 return;
4673 }
4674
4675 if (chan->state != BT_CONNECTED) {
4676 /* Ignore logical link if channel is on BR/EDR */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004677 if (chan->local_amp_id != AMP_ID_BREDR)
Mat Martineau1500109b2012-10-23 15:24:15 -07004678 l2cap_logical_finish_create(chan, hchan);
4679 } else {
4680 l2cap_logical_finish_move(chan, hchan);
4681 }
Mat Martineau5b155ef2012-10-23 15:24:14 -07004682}
4683
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004684void l2cap_move_start(struct l2cap_chan *chan)
4685{
4686 BT_DBG("chan %p", chan);
4687
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004688 if (chan->local_amp_id == AMP_ID_BREDR) {
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004689 if (chan->chan_policy != BT_CHANNEL_POLICY_AMP_PREFERRED)
4690 return;
4691 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4692 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4693 /* Placeholder - start physical link setup */
4694 } else {
4695 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4696 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4697 chan->move_id = 0;
4698 l2cap_move_setup(chan);
4699 l2cap_send_move_chan_req(chan, 0);
4700 }
4701}
4702
Mat Martineau8eb200b2012-10-23 15:24:17 -07004703static void l2cap_do_create(struct l2cap_chan *chan, int result,
4704 u8 local_amp_id, u8 remote_amp_id)
4705{
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004706 BT_DBG("chan %p state %s %u -> %u", chan, state_to_string(chan->state),
4707 local_amp_id, remote_amp_id);
4708
Andrei Emeltchenko12d6cc62012-11-14 17:39:31 +02004709 chan->fcs = L2CAP_FCS_NONE;
4710
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004711 /* Outgoing channel on AMP */
4712 if (chan->state == BT_CONNECT) {
4713 if (result == L2CAP_CR_SUCCESS) {
4714 chan->local_amp_id = local_amp_id;
4715 l2cap_send_create_chan_req(chan, remote_amp_id);
4716 } else {
4717 /* Revert to BR/EDR connect */
4718 l2cap_send_conn_req(chan);
4719 }
4720
4721 return;
4722 }
4723
4724 /* Incoming channel on AMP */
4725 if (__l2cap_no_conn_pending(chan)) {
Mat Martineau8eb200b2012-10-23 15:24:17 -07004726 struct l2cap_conn_rsp rsp;
4727 char buf[128];
4728 rsp.scid = cpu_to_le16(chan->dcid);
4729 rsp.dcid = cpu_to_le16(chan->scid);
4730
Mat Martineau8eb200b2012-10-23 15:24:17 -07004731 if (result == L2CAP_CR_SUCCESS) {
4732 /* Send successful response */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004733 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
4734 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004735 } else {
4736 /* Send negative response */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004737 rsp.result = cpu_to_le16(L2CAP_CR_NO_MEM);
4738 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004739 }
4740
4741 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_RSP,
4742 sizeof(rsp), &rsp);
4743
4744 if (result == L2CAP_CR_SUCCESS) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02004745 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004746 set_bit(CONF_REQ_SENT, &chan->conf_state);
4747 l2cap_send_cmd(chan->conn, l2cap_get_ident(chan->conn),
4748 L2CAP_CONF_REQ,
4749 l2cap_build_conf_req(chan, buf), buf);
4750 chan->num_conf_req++;
4751 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004752 }
4753}
4754
4755static void l2cap_do_move_initiate(struct l2cap_chan *chan, u8 local_amp_id,
4756 u8 remote_amp_id)
4757{
4758 l2cap_move_setup(chan);
4759 chan->move_id = local_amp_id;
4760 chan->move_state = L2CAP_MOVE_WAIT_RSP;
4761
4762 l2cap_send_move_chan_req(chan, remote_amp_id);
4763}
4764
4765static void l2cap_do_move_respond(struct l2cap_chan *chan, int result)
4766{
4767 struct hci_chan *hchan = NULL;
4768
4769 /* Placeholder - get hci_chan for logical link */
4770
4771 if (hchan) {
4772 if (hchan->state == BT_CONNECTED) {
4773 /* Logical link is ready to go */
4774 chan->hs_hcon = hchan->conn;
4775 chan->hs_hcon->l2cap_data = chan->conn;
4776 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4777 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4778
4779 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
4780 } else {
4781 /* Wait for logical link to be ready */
4782 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4783 }
4784 } else {
4785 /* Logical link not available */
4786 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_ALLOWED);
4787 }
4788}
4789
4790static void l2cap_do_move_cancel(struct l2cap_chan *chan, int result)
4791{
4792 if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4793 u8 rsp_result;
4794 if (result == -EINVAL)
4795 rsp_result = L2CAP_MR_BAD_ID;
4796 else
4797 rsp_result = L2CAP_MR_NOT_ALLOWED;
4798
4799 l2cap_send_move_chan_rsp(chan, rsp_result);
4800 }
4801
4802 chan->move_role = L2CAP_MOVE_ROLE_NONE;
4803 chan->move_state = L2CAP_MOVE_STABLE;
4804
4805 /* Restart data transmission */
4806 l2cap_ertm_send(chan);
4807}
4808
Andrei Emeltchenkoa514b172012-11-14 17:39:30 +02004809/* Invoke with locked chan */
4810void __l2cap_physical_cfm(struct l2cap_chan *chan, int result)
Mat Martineau8eb200b2012-10-23 15:24:17 -07004811{
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004812 u8 local_amp_id = chan->local_amp_id;
Andrei Emeltchenkofffadc02012-11-01 15:37:03 +02004813 u8 remote_amp_id = chan->remote_amp_id;
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004814
Mat Martineau8eb200b2012-10-23 15:24:17 -07004815 BT_DBG("chan %p, result %d, local_amp_id %d, remote_amp_id %d",
4816 chan, result, local_amp_id, remote_amp_id);
4817
Mat Martineau8eb200b2012-10-23 15:24:17 -07004818 if (chan->state == BT_DISCONN || chan->state == BT_CLOSED) {
4819 l2cap_chan_unlock(chan);
4820 return;
4821 }
4822
4823 if (chan->state != BT_CONNECTED) {
4824 l2cap_do_create(chan, result, local_amp_id, remote_amp_id);
4825 } else if (result != L2CAP_MR_SUCCESS) {
4826 l2cap_do_move_cancel(chan, result);
4827 } else {
4828 switch (chan->move_role) {
4829 case L2CAP_MOVE_ROLE_INITIATOR:
4830 l2cap_do_move_initiate(chan, local_amp_id,
4831 remote_amp_id);
4832 break;
4833 case L2CAP_MOVE_ROLE_RESPONDER:
4834 l2cap_do_move_respond(chan, result);
4835 break;
4836 default:
4837 l2cap_do_move_cancel(chan, result);
4838 break;
4839 }
4840 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004841}
4842
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004843static inline int l2cap_move_channel_req(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004844 struct l2cap_cmd_hdr *cmd,
4845 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004846{
4847 struct l2cap_move_chan_req *req = data;
Mat Martineau1500109b2012-10-23 15:24:15 -07004848 struct l2cap_move_chan_rsp rsp;
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004849 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004850 u16 icid = 0;
4851 u16 result = L2CAP_MR_NOT_ALLOWED;
4852
4853 if (cmd_len != sizeof(*req))
4854 return -EPROTO;
4855
4856 icid = le16_to_cpu(req->icid);
4857
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004858 BT_DBG("icid 0x%4.4x, dest_amp_id %d", icid, req->dest_amp_id);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004859
Marcel Holtmann848566b2013-10-01 22:59:22 -07004860 if (!conn->hs_enabled)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004861 return -EINVAL;
4862
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004863 chan = l2cap_get_chan_by_dcid(conn, icid);
4864 if (!chan) {
Mat Martineau1500109b2012-10-23 15:24:15 -07004865 rsp.icid = cpu_to_le16(icid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004866 rsp.result = cpu_to_le16(L2CAP_MR_NOT_ALLOWED);
Mat Martineau1500109b2012-10-23 15:24:15 -07004867 l2cap_send_cmd(conn, cmd->ident, L2CAP_MOVE_CHAN_RSP,
4868 sizeof(rsp), &rsp);
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004869 return 0;
4870 }
4871
Mat Martineau1500109b2012-10-23 15:24:15 -07004872 chan->ident = cmd->ident;
4873
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004874 if (chan->scid < L2CAP_CID_DYN_START ||
4875 chan->chan_policy == BT_CHANNEL_POLICY_BREDR_ONLY ||
4876 (chan->mode != L2CAP_MODE_ERTM &&
4877 chan->mode != L2CAP_MODE_STREAMING)) {
4878 result = L2CAP_MR_NOT_ALLOWED;
4879 goto send_move_response;
4880 }
4881
4882 if (chan->local_amp_id == req->dest_amp_id) {
4883 result = L2CAP_MR_SAME_ID;
4884 goto send_move_response;
4885 }
4886
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004887 if (req->dest_amp_id != AMP_ID_BREDR) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004888 struct hci_dev *hdev;
4889 hdev = hci_dev_get(req->dest_amp_id);
4890 if (!hdev || hdev->dev_type != HCI_AMP ||
4891 !test_bit(HCI_UP, &hdev->flags)) {
4892 if (hdev)
4893 hci_dev_put(hdev);
4894
4895 result = L2CAP_MR_BAD_ID;
4896 goto send_move_response;
4897 }
4898 hci_dev_put(hdev);
4899 }
4900
4901 /* Detect a move collision. Only send a collision response
4902 * if this side has "lost", otherwise proceed with the move.
4903 * The winner has the larger bd_addr.
4904 */
4905 if ((__chan_is_moving(chan) ||
4906 chan->move_role != L2CAP_MOVE_ROLE_NONE) &&
Marcel Holtmann6f59b902013-10-13 05:24:01 -07004907 bacmp(&conn->hcon->src, &conn->hcon->dst) > 0) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004908 result = L2CAP_MR_COLLISION;
4909 goto send_move_response;
4910 }
4911
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004912 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
4913 l2cap_move_setup(chan);
4914 chan->move_id = req->dest_amp_id;
4915 icid = chan->dcid;
4916
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004917 if (req->dest_amp_id == AMP_ID_BREDR) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004918 /* Moving to BR/EDR */
4919 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4920 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4921 result = L2CAP_MR_PEND;
4922 } else {
4923 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4924 result = L2CAP_MR_SUCCESS;
4925 }
4926 } else {
4927 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4928 /* Placeholder - uncomment when amp functions are available */
4929 /*amp_accept_physical(chan, req->dest_amp_id);*/
4930 result = L2CAP_MR_PEND;
4931 }
4932
4933send_move_response:
Mat Martineau1500109b2012-10-23 15:24:15 -07004934 l2cap_send_move_chan_rsp(chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004935
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004936 l2cap_chan_unlock(chan);
4937
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004938 return 0;
4939}
4940
Mat Martineau5b155ef2012-10-23 15:24:14 -07004941static void l2cap_move_continue(struct l2cap_conn *conn, u16 icid, u16 result)
4942{
4943 struct l2cap_chan *chan;
4944 struct hci_chan *hchan = NULL;
4945
4946 chan = l2cap_get_chan_by_scid(conn, icid);
4947 if (!chan) {
4948 l2cap_send_move_chan_cfm_icid(conn, icid);
4949 return;
4950 }
4951
4952 __clear_chan_timer(chan);
4953 if (result == L2CAP_MR_PEND)
4954 __set_chan_timer(chan, L2CAP_MOVE_ERTX_TIMEOUT);
4955
4956 switch (chan->move_state) {
4957 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
4958 /* Move confirm will be sent when logical link
4959 * is complete.
4960 */
4961 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4962 break;
4963 case L2CAP_MOVE_WAIT_RSP_SUCCESS:
4964 if (result == L2CAP_MR_PEND) {
4965 break;
4966 } else if (test_bit(CONN_LOCAL_BUSY,
4967 &chan->conn_state)) {
4968 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4969 } else {
4970 /* Logical link is up or moving to BR/EDR,
4971 * proceed with move
4972 */
4973 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
4974 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
4975 }
4976 break;
4977 case L2CAP_MOVE_WAIT_RSP:
4978 /* Moving to AMP */
4979 if (result == L2CAP_MR_SUCCESS) {
4980 /* Remote is ready, send confirm immediately
4981 * after logical link is ready
4982 */
4983 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4984 } else {
4985 /* Both logical link and move success
4986 * are required to confirm
4987 */
4988 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_COMP;
4989 }
4990
4991 /* Placeholder - get hci_chan for logical link */
4992 if (!hchan) {
4993 /* Logical link not available */
4994 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
4995 break;
4996 }
4997
4998 /* If the logical link is not yet connected, do not
4999 * send confirmation.
5000 */
5001 if (hchan->state != BT_CONNECTED)
5002 break;
5003
5004 /* Logical link is already ready to go */
5005
5006 chan->hs_hcon = hchan->conn;
5007 chan->hs_hcon->l2cap_data = chan->conn;
5008
5009 if (result == L2CAP_MR_SUCCESS) {
5010 /* Can confirm now */
5011 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
5012 } else {
5013 /* Now only need move success
5014 * to confirm
5015 */
5016 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
5017 }
5018
5019 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
5020 break;
5021 default:
5022 /* Any other amp move state means the move failed. */
5023 chan->move_id = chan->local_amp_id;
5024 l2cap_move_done(chan);
5025 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5026 }
5027
5028 l2cap_chan_unlock(chan);
5029}
5030
5031static void l2cap_move_fail(struct l2cap_conn *conn, u8 ident, u16 icid,
5032 u16 result)
5033{
5034 struct l2cap_chan *chan;
5035
5036 chan = l2cap_get_chan_by_ident(conn, ident);
5037 if (!chan) {
5038 /* Could not locate channel, icid is best guess */
5039 l2cap_send_move_chan_cfm_icid(conn, icid);
5040 return;
5041 }
5042
5043 __clear_chan_timer(chan);
5044
5045 if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
5046 if (result == L2CAP_MR_COLLISION) {
5047 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
5048 } else {
5049 /* Cleanup - cancel move */
5050 chan->move_id = chan->local_amp_id;
5051 l2cap_move_done(chan);
5052 }
5053 }
5054
5055 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5056
5057 l2cap_chan_unlock(chan);
5058}
5059
5060static int l2cap_move_channel_rsp(struct l2cap_conn *conn,
5061 struct l2cap_cmd_hdr *cmd,
5062 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005063{
5064 struct l2cap_move_chan_rsp *rsp = data;
5065 u16 icid, result;
5066
5067 if (cmd_len != sizeof(*rsp))
5068 return -EPROTO;
5069
5070 icid = le16_to_cpu(rsp->icid);
5071 result = le16_to_cpu(rsp->result);
5072
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005073 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005074
Mat Martineau5b155ef2012-10-23 15:24:14 -07005075 if (result == L2CAP_MR_SUCCESS || result == L2CAP_MR_PEND)
5076 l2cap_move_continue(conn, icid, result);
5077 else
5078 l2cap_move_fail(conn, cmd->ident, icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005079
5080 return 0;
5081}
5082
Mat Martineau5f3847a2012-10-23 15:24:12 -07005083static int l2cap_move_channel_confirm(struct l2cap_conn *conn,
5084 struct l2cap_cmd_hdr *cmd,
5085 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005086{
5087 struct l2cap_move_chan_cfm *cfm = data;
Mat Martineau5f3847a2012-10-23 15:24:12 -07005088 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005089 u16 icid, result;
5090
5091 if (cmd_len != sizeof(*cfm))
5092 return -EPROTO;
5093
5094 icid = le16_to_cpu(cfm->icid);
5095 result = le16_to_cpu(cfm->result);
5096
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005097 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005098
Mat Martineau5f3847a2012-10-23 15:24:12 -07005099 chan = l2cap_get_chan_by_dcid(conn, icid);
5100 if (!chan) {
5101 /* Spec requires a response even if the icid was not found */
5102 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5103 return 0;
5104 }
5105
5106 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM) {
5107 if (result == L2CAP_MC_CONFIRMED) {
5108 chan->local_amp_id = chan->move_id;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005109 if (chan->local_amp_id == AMP_ID_BREDR)
Mat Martineau5f3847a2012-10-23 15:24:12 -07005110 __release_logical_link(chan);
5111 } else {
5112 chan->move_id = chan->local_amp_id;
5113 }
5114
5115 l2cap_move_done(chan);
5116 }
5117
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005118 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5119
Mat Martineau5f3847a2012-10-23 15:24:12 -07005120 l2cap_chan_unlock(chan);
5121
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005122 return 0;
5123}
5124
5125static inline int l2cap_move_channel_confirm_rsp(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005126 struct l2cap_cmd_hdr *cmd,
5127 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005128{
5129 struct l2cap_move_chan_cfm_rsp *rsp = data;
Mat Martineau3fd71a02012-10-23 15:24:16 -07005130 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005131 u16 icid;
5132
5133 if (cmd_len != sizeof(*rsp))
5134 return -EPROTO;
5135
5136 icid = le16_to_cpu(rsp->icid);
5137
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005138 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005139
Mat Martineau3fd71a02012-10-23 15:24:16 -07005140 chan = l2cap_get_chan_by_scid(conn, icid);
5141 if (!chan)
5142 return 0;
5143
5144 __clear_chan_timer(chan);
5145
5146 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM_RSP) {
5147 chan->local_amp_id = chan->move_id;
5148
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005149 if (chan->local_amp_id == AMP_ID_BREDR && chan->hs_hchan)
Mat Martineau3fd71a02012-10-23 15:24:16 -07005150 __release_logical_link(chan);
5151
5152 l2cap_move_done(chan);
5153 }
5154
5155 l2cap_chan_unlock(chan);
5156
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005157 return 0;
5158}
5159
Claudio Takahaside731152011-02-11 19:28:55 -02005160static inline int l2cap_conn_param_update_req(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005161 struct l2cap_cmd_hdr *cmd,
Johan Hedberg203e6392013-05-15 10:07:15 +03005162 u16 cmd_len, u8 *data)
Claudio Takahaside731152011-02-11 19:28:55 -02005163{
5164 struct hci_conn *hcon = conn->hcon;
5165 struct l2cap_conn_param_update_req *req;
5166 struct l2cap_conn_param_update_rsp rsp;
Johan Hedberg203e6392013-05-15 10:07:15 +03005167 u16 min, max, latency, to_multiplier;
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005168 int err;
Claudio Takahaside731152011-02-11 19:28:55 -02005169
Johan Hedberg40bef302014-07-16 11:42:27 +03005170 if (hcon->role != HCI_ROLE_MASTER)
Claudio Takahaside731152011-02-11 19:28:55 -02005171 return -EINVAL;
5172
Claudio Takahaside731152011-02-11 19:28:55 -02005173 if (cmd_len != sizeof(struct l2cap_conn_param_update_req))
5174 return -EPROTO;
5175
5176 req = (struct l2cap_conn_param_update_req *) data;
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03005177 min = __le16_to_cpu(req->min);
5178 max = __le16_to_cpu(req->max);
Claudio Takahaside731152011-02-11 19:28:55 -02005179 latency = __le16_to_cpu(req->latency);
5180 to_multiplier = __le16_to_cpu(req->to_multiplier);
5181
5182 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 +01005183 min, max, latency, to_multiplier);
Claudio Takahaside731152011-02-11 19:28:55 -02005184
5185 memset(&rsp, 0, sizeof(rsp));
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005186
Andre Guedesd4905f22014-06-25 21:52:52 -03005187 err = hci_check_conn_params(min, max, latency, to_multiplier);
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005188 if (err)
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005189 rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_REJECTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005190 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005191 rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_ACCEPTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005192
5193 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONN_PARAM_UPDATE_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005194 sizeof(rsp), &rsp);
Claudio Takahaside731152011-02-11 19:28:55 -02005195
Andre Guedesffb5a8272014-07-01 18:10:11 -03005196 if (!err) {
Johan Hedbergf4869e22014-07-02 17:37:32 +03005197 u8 store_hint;
Andre Guedesffb5a8272014-07-01 18:10:11 -03005198
Johan Hedbergf4869e22014-07-02 17:37:32 +03005199 store_hint = hci_le_conn_update(hcon, min, max, latency,
5200 to_multiplier);
5201 mgmt_new_conn_param(hcon->hdev, &hcon->dst, hcon->dst_type,
5202 store_hint, min, max, latency,
5203 to_multiplier);
5204
Andre Guedesffb5a8272014-07-01 18:10:11 -03005205 }
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005206
Claudio Takahaside731152011-02-11 19:28:55 -02005207 return 0;
5208}
5209
Johan Hedbergf1496de2013-05-13 14:15:56 +03005210static int l2cap_le_connect_rsp(struct l2cap_conn *conn,
5211 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5212 u8 *data)
5213{
5214 struct l2cap_le_conn_rsp *rsp = (struct l2cap_le_conn_rsp *) data;
5215 u16 dcid, mtu, mps, credits, result;
5216 struct l2cap_chan *chan;
5217 int err;
5218
5219 if (cmd_len < sizeof(*rsp))
5220 return -EPROTO;
5221
5222 dcid = __le16_to_cpu(rsp->dcid);
5223 mtu = __le16_to_cpu(rsp->mtu);
5224 mps = __le16_to_cpu(rsp->mps);
5225 credits = __le16_to_cpu(rsp->credits);
5226 result = __le16_to_cpu(rsp->result);
5227
5228 if (result == L2CAP_CR_SUCCESS && (mtu < 23 || mps < 23))
5229 return -EPROTO;
5230
5231 BT_DBG("dcid 0x%4.4x mtu %u mps %u credits %u result 0x%2.2x",
5232 dcid, mtu, mps, credits, result);
5233
5234 mutex_lock(&conn->chan_lock);
5235
5236 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5237 if (!chan) {
5238 err = -EBADSLT;
5239 goto unlock;
5240 }
5241
5242 err = 0;
5243
5244 l2cap_chan_lock(chan);
5245
5246 switch (result) {
5247 case L2CAP_CR_SUCCESS:
5248 chan->ident = 0;
5249 chan->dcid = dcid;
5250 chan->omtu = mtu;
5251 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005252 chan->tx_credits = credits;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005253 l2cap_chan_ready(chan);
5254 break;
5255
5256 default:
5257 l2cap_chan_del(chan, ECONNREFUSED);
5258 break;
5259 }
5260
5261 l2cap_chan_unlock(chan);
5262
5263unlock:
5264 mutex_unlock(&conn->chan_lock);
5265
5266 return err;
5267}
5268
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005269static inline int l2cap_bredr_sig_cmd(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005270 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5271 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005272{
5273 int err = 0;
5274
5275 switch (cmd->code) {
5276 case L2CAP_COMMAND_REJ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005277 l2cap_command_rej(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005278 break;
5279
5280 case L2CAP_CONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005281 err = l2cap_connect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005282 break;
5283
5284 case L2CAP_CONN_RSP:
Mat Martineauf5a25982012-10-11 17:48:21 +03005285 case L2CAP_CREATE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005286 l2cap_connect_create_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005287 break;
5288
5289 case L2CAP_CONF_REQ:
5290 err = l2cap_config_req(conn, cmd, cmd_len, data);
5291 break;
5292
5293 case L2CAP_CONF_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005294 l2cap_config_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005295 break;
5296
5297 case L2CAP_DISCONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005298 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005299 break;
5300
5301 case L2CAP_DISCONN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005302 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005303 break;
5304
5305 case L2CAP_ECHO_REQ:
5306 l2cap_send_cmd(conn, cmd->ident, L2CAP_ECHO_RSP, cmd_len, data);
5307 break;
5308
5309 case L2CAP_ECHO_RSP:
5310 break;
5311
5312 case L2CAP_INFO_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005313 err = l2cap_information_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005314 break;
5315
5316 case L2CAP_INFO_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005317 l2cap_information_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005318 break;
5319
Mat Martineauf94ff6f2011-11-02 16:18:32 -07005320 case L2CAP_CREATE_CHAN_REQ:
5321 err = l2cap_create_channel_req(conn, cmd, cmd_len, data);
5322 break;
5323
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005324 case L2CAP_MOVE_CHAN_REQ:
5325 err = l2cap_move_channel_req(conn, cmd, cmd_len, data);
5326 break;
5327
5328 case L2CAP_MOVE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005329 l2cap_move_channel_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005330 break;
5331
5332 case L2CAP_MOVE_CHAN_CFM:
5333 err = l2cap_move_channel_confirm(conn, cmd, cmd_len, data);
5334 break;
5335
5336 case L2CAP_MOVE_CHAN_CFM_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005337 l2cap_move_channel_confirm_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005338 break;
5339
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005340 default:
5341 BT_ERR("Unknown BR/EDR signaling command 0x%2.2x", cmd->code);
5342 err = -EINVAL;
5343 break;
5344 }
5345
5346 return err;
5347}
5348
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005349static int l2cap_le_connect_req(struct l2cap_conn *conn,
5350 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5351 u8 *data)
5352{
5353 struct l2cap_le_conn_req *req = (struct l2cap_le_conn_req *) data;
5354 struct l2cap_le_conn_rsp rsp;
5355 struct l2cap_chan *chan, *pchan;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005356 u16 dcid, scid, credits, mtu, mps;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005357 __le16 psm;
5358 u8 result;
5359
5360 if (cmd_len != sizeof(*req))
5361 return -EPROTO;
5362
5363 scid = __le16_to_cpu(req->scid);
5364 mtu = __le16_to_cpu(req->mtu);
5365 mps = __le16_to_cpu(req->mps);
5366 psm = req->psm;
5367 dcid = 0;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005368 credits = 0;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005369
5370 if (mtu < 23 || mps < 23)
5371 return -EPROTO;
5372
5373 BT_DBG("psm 0x%2.2x scid 0x%4.4x mtu %u mps %u", __le16_to_cpu(psm),
5374 scid, mtu, mps);
5375
5376 /* Check if we have socket listening on psm */
5377 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
5378 &conn->hcon->dst, LE_LINK);
5379 if (!pchan) {
5380 result = L2CAP_CR_BAD_PSM;
5381 chan = NULL;
5382 goto response;
5383 }
5384
5385 mutex_lock(&conn->chan_lock);
5386 l2cap_chan_lock(pchan);
5387
5388 if (!smp_sufficient_security(conn->hcon, pchan->sec_level)) {
5389 result = L2CAP_CR_AUTHENTICATION;
5390 chan = NULL;
5391 goto response_unlock;
5392 }
5393
5394 /* Check if we already have channel with that dcid */
5395 if (__l2cap_get_chan_by_dcid(conn, scid)) {
5396 result = L2CAP_CR_NO_MEM;
5397 chan = NULL;
5398 goto response_unlock;
5399 }
5400
5401 chan = pchan->ops->new_connection(pchan);
5402 if (!chan) {
5403 result = L2CAP_CR_NO_MEM;
5404 goto response_unlock;
5405 }
5406
Johan Hedberg0ce43ce2013-12-05 14:55:33 +02005407 l2cap_le_flowctl_init(chan);
5408
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005409 bacpy(&chan->src, &conn->hcon->src);
5410 bacpy(&chan->dst, &conn->hcon->dst);
5411 chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type);
5412 chan->dst_type = bdaddr_type(conn->hcon, conn->hcon->dst_type);
5413 chan->psm = psm;
5414 chan->dcid = scid;
5415 chan->omtu = mtu;
5416 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005417 chan->tx_credits = __le16_to_cpu(req->credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005418
5419 __l2cap_chan_add(conn, chan);
5420 dcid = chan->scid;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005421 credits = chan->rx_credits;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005422
5423 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
5424
5425 chan->ident = cmd->ident;
5426
5427 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
5428 l2cap_state_change(chan, BT_CONNECT2);
5429 result = L2CAP_CR_PEND;
5430 chan->ops->defer(chan);
5431 } else {
5432 l2cap_chan_ready(chan);
5433 result = L2CAP_CR_SUCCESS;
5434 }
5435
5436response_unlock:
5437 l2cap_chan_unlock(pchan);
5438 mutex_unlock(&conn->chan_lock);
Johan Hedberga24cce12014-08-07 22:56:42 +03005439 l2cap_chan_put(pchan);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005440
5441 if (result == L2CAP_CR_PEND)
5442 return 0;
5443
5444response:
5445 if (chan) {
5446 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02005447 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005448 } else {
5449 rsp.mtu = 0;
5450 rsp.mps = 0;
5451 }
5452
5453 rsp.dcid = cpu_to_le16(dcid);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005454 rsp.credits = cpu_to_le16(credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005455 rsp.result = cpu_to_le16(result);
5456
5457 l2cap_send_cmd(conn, cmd->ident, L2CAP_LE_CONN_RSP, sizeof(rsp), &rsp);
5458
5459 return 0;
5460}
5461
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005462static inline int l2cap_le_credits(struct l2cap_conn *conn,
5463 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5464 u8 *data)
5465{
5466 struct l2cap_le_credits *pkt;
5467 struct l2cap_chan *chan;
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005468 u16 cid, credits, max_credits;
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005469
5470 if (cmd_len != sizeof(*pkt))
5471 return -EPROTO;
5472
5473 pkt = (struct l2cap_le_credits *) data;
5474 cid = __le16_to_cpu(pkt->cid);
5475 credits = __le16_to_cpu(pkt->credits);
5476
5477 BT_DBG("cid 0x%4.4x credits 0x%4.4x", cid, credits);
5478
5479 chan = l2cap_get_chan_by_dcid(conn, cid);
5480 if (!chan)
5481 return -EBADSLT;
5482
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005483 max_credits = LE_FLOWCTL_MAX_CREDITS - chan->tx_credits;
5484 if (credits > max_credits) {
5485 BT_ERR("LE credits overflow");
5486 l2cap_send_disconn_req(chan, ECONNRESET);
5487
5488 /* Return 0 so that we don't trigger an unnecessary
5489 * command reject packet.
5490 */
5491 return 0;
5492 }
5493
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005494 chan->tx_credits += credits;
5495
5496 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
5497 l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
5498 chan->tx_credits--;
5499 }
5500
5501 if (chan->tx_credits)
5502 chan->ops->resume(chan);
5503
5504 l2cap_chan_unlock(chan);
5505
5506 return 0;
5507}
5508
Johan Hedberg71fb4192013-12-10 10:52:48 +02005509static inline int l2cap_le_command_rej(struct l2cap_conn *conn,
5510 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5511 u8 *data)
5512{
5513 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
5514 struct l2cap_chan *chan;
5515
5516 if (cmd_len < sizeof(*rej))
5517 return -EPROTO;
5518
5519 mutex_lock(&conn->chan_lock);
5520
5521 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5522 if (!chan)
5523 goto done;
5524
5525 l2cap_chan_lock(chan);
5526 l2cap_chan_del(chan, ECONNREFUSED);
5527 l2cap_chan_unlock(chan);
5528
5529done:
5530 mutex_unlock(&conn->chan_lock);
5531 return 0;
5532}
5533
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005534static inline int l2cap_le_sig_cmd(struct l2cap_conn *conn,
Johan Hedberg203e6392013-05-15 10:07:15 +03005535 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5536 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005537{
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005538 int err = 0;
5539
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005540 switch (cmd->code) {
5541 case L2CAP_COMMAND_REJ:
Johan Hedberg71fb4192013-12-10 10:52:48 +02005542 l2cap_le_command_rej(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005543 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005544
5545 case L2CAP_CONN_PARAM_UPDATE_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005546 err = l2cap_conn_param_update_req(conn, cmd, cmd_len, data);
5547 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005548
5549 case L2CAP_CONN_PARAM_UPDATE_RSP:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005550 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005551
Johan Hedbergf1496de2013-05-13 14:15:56 +03005552 case L2CAP_LE_CONN_RSP:
5553 l2cap_le_connect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005554 break;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005555
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005556 case L2CAP_LE_CONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005557 err = l2cap_le_connect_req(conn, cmd, cmd_len, data);
5558 break;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005559
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005560 case L2CAP_LE_CREDITS:
5561 err = l2cap_le_credits(conn, cmd, cmd_len, data);
5562 break;
5563
Johan Hedberg3defe012013-05-15 10:16:06 +03005564 case L2CAP_DISCONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005565 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
5566 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005567
5568 case L2CAP_DISCONN_RSP:
5569 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005570 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005571
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005572 default:
5573 BT_ERR("Unknown LE signaling command 0x%2.2x", cmd->code);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005574 err = -EINVAL;
5575 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005576 }
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005577
5578 return err;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005579}
5580
Johan Hedbergc5623552013-04-29 19:35:33 +03005581static inline void l2cap_le_sig_channel(struct l2cap_conn *conn,
5582 struct sk_buff *skb)
5583{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005584 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005585 struct l2cap_cmd_hdr *cmd;
5586 u16 len;
Johan Hedbergc5623552013-04-29 19:35:33 +03005587 int err;
5588
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005589 if (hcon->type != LE_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005590 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005591
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005592 if (skb->len < L2CAP_CMD_HDR_SIZE)
5593 goto drop;
Johan Hedbergc5623552013-04-29 19:35:33 +03005594
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005595 cmd = (void *) skb->data;
5596 skb_pull(skb, L2CAP_CMD_HDR_SIZE);
Johan Hedbergc5623552013-04-29 19:35:33 +03005597
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005598 len = le16_to_cpu(cmd->len);
Johan Hedbergc5623552013-04-29 19:35:33 +03005599
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005600 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd->code, len, cmd->ident);
Johan Hedbergc5623552013-04-29 19:35:33 +03005601
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005602 if (len != skb->len || !cmd->ident) {
5603 BT_DBG("corrupted command");
5604 goto drop;
5605 }
Johan Hedbergc5623552013-04-29 19:35:33 +03005606
Johan Hedberg203e6392013-05-15 10:07:15 +03005607 err = l2cap_le_sig_cmd(conn, cmd, len, skb->data);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005608 if (err) {
5609 struct l2cap_cmd_rej_unk rej;
Johan Hedbergc5623552013-04-29 19:35:33 +03005610
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005611 BT_ERR("Wrong link type (%d)", err);
Johan Hedbergc5623552013-04-29 19:35:33 +03005612
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005613 rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005614 l2cap_send_cmd(conn, cmd->ident, L2CAP_COMMAND_REJ,
5615 sizeof(rej), &rej);
Johan Hedbergc5623552013-04-29 19:35:33 +03005616 }
5617
Marcel Holtmann3b166292013-10-02 08:28:21 -07005618drop:
Johan Hedbergc5623552013-04-29 19:35:33 +03005619 kfree_skb(skb);
5620}
5621
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005622static inline void l2cap_sig_channel(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005623 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005624{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005625 struct hci_conn *hcon = conn->hcon;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005626 u8 *data = skb->data;
5627 int len = skb->len;
5628 struct l2cap_cmd_hdr cmd;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005629 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005630
5631 l2cap_raw_recv(conn, skb);
5632
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005633 if (hcon->type != ACL_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005634 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005635
Linus Torvalds1da177e2005-04-16 15:20:36 -07005636 while (len >= L2CAP_CMD_HDR_SIZE) {
Al Viro88219a02007-07-29 00:17:25 -07005637 u16 cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005638 memcpy(&cmd, data, L2CAP_CMD_HDR_SIZE);
5639 data += L2CAP_CMD_HDR_SIZE;
5640 len -= L2CAP_CMD_HDR_SIZE;
5641
Al Viro88219a02007-07-29 00:17:25 -07005642 cmd_len = le16_to_cpu(cmd.len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005643
Gustavo Padovan2d792812012-10-06 10:07:01 +01005644 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd.code, cmd_len,
5645 cmd.ident);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005646
Al Viro88219a02007-07-29 00:17:25 -07005647 if (cmd_len > len || !cmd.ident) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005648 BT_DBG("corrupted command");
5649 break;
5650 }
5651
Johan Hedbergc5623552013-04-29 19:35:33 +03005652 err = l2cap_bredr_sig_cmd(conn, &cmd, cmd_len, data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005653 if (err) {
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03005654 struct l2cap_cmd_rej_unk rej;
Gustavo F. Padovan2c6d1a22011-03-23 14:38:32 -03005655
5656 BT_ERR("Wrong link type (%d)", err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005657
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005658 rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Gustavo Padovan2d792812012-10-06 10:07:01 +01005659 l2cap_send_cmd(conn, cmd.ident, L2CAP_COMMAND_REJ,
5660 sizeof(rej), &rej);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005661 }
5662
Al Viro88219a02007-07-29 00:17:25 -07005663 data += cmd_len;
5664 len -= cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005665 }
5666
Marcel Holtmann3b166292013-10-02 08:28:21 -07005667drop:
Linus Torvalds1da177e2005-04-16 15:20:36 -07005668 kfree_skb(skb);
5669}
5670
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005671static int l2cap_check_fcs(struct l2cap_chan *chan, struct sk_buff *skb)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005672{
5673 u16 our_fcs, rcv_fcs;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03005674 int hdr_size;
5675
5676 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
5677 hdr_size = L2CAP_EXT_HDR_SIZE;
5678 else
5679 hdr_size = L2CAP_ENH_HDR_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005680
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005681 if (chan->fcs == L2CAP_FCS_CRC16) {
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005682 skb_trim(skb, skb->len - L2CAP_FCS_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005683 rcv_fcs = get_unaligned_le16(skb->data + skb->len);
5684 our_fcs = crc16(0, skb->data - hdr_size, skb->len + hdr_size);
5685
5686 if (our_fcs != rcv_fcs)
João Paulo Rechi Vita7a560e52010-06-22 13:56:27 -03005687 return -EBADMSG;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005688 }
5689 return 0;
5690}
5691
Mat Martineau6ea00482012-05-17 20:53:52 -07005692static void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan)
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005693{
Mat Martineaue31f7632012-05-17 20:53:41 -07005694 struct l2cap_ctrl control;
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005695
Mat Martineaue31f7632012-05-17 20:53:41 -07005696 BT_DBG("chan %p", chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005697
Mat Martineaue31f7632012-05-17 20:53:41 -07005698 memset(&control, 0, sizeof(control));
5699 control.sframe = 1;
5700 control.final = 1;
5701 control.reqseq = chan->buffer_seq;
5702 set_bit(CONN_SEND_FBIT, &chan->conn_state);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005703
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005704 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
Mat Martineaue31f7632012-05-17 20:53:41 -07005705 control.super = L2CAP_SUPER_RNR;
5706 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005707 }
5708
Mat Martineaue31f7632012-05-17 20:53:41 -07005709 if (test_and_clear_bit(CONN_REMOTE_BUSY, &chan->conn_state) &&
5710 chan->unacked_frames > 0)
5711 __set_retrans_timer(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005712
Mat Martineaue31f7632012-05-17 20:53:41 -07005713 /* Send pending iframes */
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03005714 l2cap_ertm_send(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005715
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005716 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
Mat Martineaue31f7632012-05-17 20:53:41 -07005717 test_bit(CONN_SEND_FBIT, &chan->conn_state)) {
5718 /* F-bit wasn't sent in an s-frame or i-frame yet, so
5719 * send it now.
5720 */
5721 control.super = L2CAP_SUPER_RR;
5722 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005723 }
5724}
5725
Gustavo Padovan2d792812012-10-06 10:07:01 +01005726static void append_skb_frag(struct sk_buff *skb, struct sk_buff *new_frag,
5727 struct sk_buff **last_frag)
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005728{
Mat Martineau84084a32011-07-22 14:54:00 -07005729 /* skb->len reflects data in skb as well as all fragments
5730 * skb->data_len reflects only data in fragments
5731 */
5732 if (!skb_has_frag_list(skb))
5733 skb_shinfo(skb)->frag_list = new_frag;
5734
5735 new_frag->next = NULL;
5736
5737 (*last_frag)->next = new_frag;
5738 *last_frag = new_frag;
5739
5740 skb->len += new_frag->len;
5741 skb->data_len += new_frag->len;
5742 skb->truesize += new_frag->truesize;
5743}
5744
Mat Martineau4b51dae92012-05-17 20:53:37 -07005745static int l2cap_reassemble_sdu(struct l2cap_chan *chan, struct sk_buff *skb,
5746 struct l2cap_ctrl *control)
Mat Martineau84084a32011-07-22 14:54:00 -07005747{
5748 int err = -EINVAL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005749
Mat Martineau4b51dae92012-05-17 20:53:37 -07005750 switch (control->sar) {
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005751 case L2CAP_SAR_UNSEGMENTED:
Mat Martineau84084a32011-07-22 14:54:00 -07005752 if (chan->sdu)
5753 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005754
Gustavo Padovan80b98022012-05-27 22:27:51 -03005755 err = chan->ops->recv(chan, skb);
Mat Martineau84084a32011-07-22 14:54:00 -07005756 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005757
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005758 case L2CAP_SAR_START:
Mat Martineau84084a32011-07-22 14:54:00 -07005759 if (chan->sdu)
5760 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005761
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005762 chan->sdu_len = get_unaligned_le16(skb->data);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005763 skb_pull(skb, L2CAP_SDULEN_SIZE);
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005764
Mat Martineau84084a32011-07-22 14:54:00 -07005765 if (chan->sdu_len > chan->imtu) {
5766 err = -EMSGSIZE;
5767 break;
5768 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005769
Mat Martineau84084a32011-07-22 14:54:00 -07005770 if (skb->len >= chan->sdu_len)
5771 break;
5772
5773 chan->sdu = skb;
5774 chan->sdu_last_frag = skb;
5775
5776 skb = NULL;
5777 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005778 break;
5779
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005780 case L2CAP_SAR_CONTINUE:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005781 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005782 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005783
Mat Martineau84084a32011-07-22 14:54:00 -07005784 append_skb_frag(chan->sdu, skb,
5785 &chan->sdu_last_frag);
5786 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005787
Mat Martineau84084a32011-07-22 14:54:00 -07005788 if (chan->sdu->len >= chan->sdu_len)
5789 break;
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005790
Mat Martineau84084a32011-07-22 14:54:00 -07005791 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005792 break;
5793
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005794 case L2CAP_SAR_END:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005795 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005796 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005797
Mat Martineau84084a32011-07-22 14:54:00 -07005798 append_skb_frag(chan->sdu, skb,
5799 &chan->sdu_last_frag);
5800 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005801
Mat Martineau84084a32011-07-22 14:54:00 -07005802 if (chan->sdu->len != chan->sdu_len)
5803 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005804
Gustavo Padovan80b98022012-05-27 22:27:51 -03005805 err = chan->ops->recv(chan, chan->sdu);
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005806
Mat Martineau84084a32011-07-22 14:54:00 -07005807 if (!err) {
5808 /* Reassembly complete */
5809 chan->sdu = NULL;
5810 chan->sdu_last_frag = NULL;
5811 chan->sdu_len = 0;
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005812 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005813 break;
5814 }
5815
Mat Martineau84084a32011-07-22 14:54:00 -07005816 if (err) {
5817 kfree_skb(skb);
5818 kfree_skb(chan->sdu);
5819 chan->sdu = NULL;
5820 chan->sdu_last_frag = NULL;
5821 chan->sdu_len = 0;
5822 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005823
Mat Martineau84084a32011-07-22 14:54:00 -07005824 return err;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005825}
5826
Mat Martineau32b32732012-10-23 15:24:11 -07005827static int l2cap_resegment(struct l2cap_chan *chan)
5828{
5829 /* Placeholder */
5830 return 0;
5831}
5832
Mat Martineaue3281402011-07-07 09:39:02 -07005833void l2cap_chan_busy(struct l2cap_chan *chan, int busy)
Gustavo F. Padovan712132eb2010-06-21 19:39:50 -03005834{
Mat Martineau61aa4f52012-05-17 20:53:40 -07005835 u8 event;
5836
5837 if (chan->mode != L2CAP_MODE_ERTM)
5838 return;
5839
5840 event = busy ? L2CAP_EV_LOCAL_BUSY_DETECTED : L2CAP_EV_LOCAL_BUSY_CLEAR;
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03005841 l2cap_tx(chan, NULL, NULL, event);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005842}
5843
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005844static int l2cap_rx_queued_iframes(struct l2cap_chan *chan)
5845{
Mat Martineau63838722012-05-17 20:53:45 -07005846 int err = 0;
5847 /* Pass sequential frames to l2cap_reassemble_sdu()
5848 * until a gap is encountered.
5849 */
5850
5851 BT_DBG("chan %p", chan);
5852
5853 while (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
5854 struct sk_buff *skb;
5855 BT_DBG("Searching for skb with txseq %d (queue len %d)",
5856 chan->buffer_seq, skb_queue_len(&chan->srej_q));
5857
5858 skb = l2cap_ertm_seq_in_queue(&chan->srej_q, chan->buffer_seq);
5859
5860 if (!skb)
5861 break;
5862
5863 skb_unlink(skb, &chan->srej_q);
5864 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
5865 err = l2cap_reassemble_sdu(chan, skb, &bt_cb(skb)->control);
5866 if (err)
5867 break;
5868 }
5869
5870 if (skb_queue_empty(&chan->srej_q)) {
5871 chan->rx_state = L2CAP_RX_STATE_RECV;
5872 l2cap_send_ack(chan);
5873 }
5874
5875 return err;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005876}
5877
5878static void l2cap_handle_srej(struct l2cap_chan *chan,
5879 struct l2cap_ctrl *control)
5880{
Mat Martineauf80842a2012-05-17 20:53:46 -07005881 struct sk_buff *skb;
5882
5883 BT_DBG("chan %p, control %p", chan, control);
5884
5885 if (control->reqseq == chan->next_tx_seq) {
5886 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005887 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005888 return;
5889 }
5890
5891 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
5892
5893 if (skb == NULL) {
5894 BT_DBG("Seq %d not available for retransmission",
5895 control->reqseq);
5896 return;
5897 }
5898
5899 if (chan->max_tx != 0 && bt_cb(skb)->control.retries >= chan->max_tx) {
5900 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005901 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005902 return;
5903 }
5904
5905 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
5906
5907 if (control->poll) {
5908 l2cap_pass_to_tx(chan, control);
5909
5910 set_bit(CONN_SEND_FBIT, &chan->conn_state);
5911 l2cap_retransmit(chan, control);
5912 l2cap_ertm_send(chan);
5913
5914 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5915 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5916 chan->srej_save_reqseq = control->reqseq;
5917 }
5918 } else {
5919 l2cap_pass_to_tx_fbit(chan, control);
5920
5921 if (control->final) {
5922 if (chan->srej_save_reqseq != control->reqseq ||
5923 !test_and_clear_bit(CONN_SREJ_ACT,
5924 &chan->conn_state))
5925 l2cap_retransmit(chan, control);
5926 } else {
5927 l2cap_retransmit(chan, control);
5928 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5929 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5930 chan->srej_save_reqseq = control->reqseq;
5931 }
5932 }
5933 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005934}
5935
5936static void l2cap_handle_rej(struct l2cap_chan *chan,
5937 struct l2cap_ctrl *control)
5938{
Mat Martineaufcd289d2012-05-17 20:53:47 -07005939 struct sk_buff *skb;
5940
5941 BT_DBG("chan %p, control %p", chan, control);
5942
5943 if (control->reqseq == chan->next_tx_seq) {
5944 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005945 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07005946 return;
5947 }
5948
5949 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
5950
5951 if (chan->max_tx && skb &&
5952 bt_cb(skb)->control.retries >= chan->max_tx) {
5953 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005954 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07005955 return;
5956 }
5957
5958 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
5959
5960 l2cap_pass_to_tx(chan, control);
5961
5962 if (control->final) {
5963 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state))
5964 l2cap_retransmit_all(chan, control);
5965 } else {
5966 l2cap_retransmit_all(chan, control);
5967 l2cap_ertm_send(chan);
5968 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F)
5969 set_bit(CONN_REJ_ACT, &chan->conn_state);
5970 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005971}
5972
Mat Martineau4b51dae92012-05-17 20:53:37 -07005973static u8 l2cap_classify_txseq(struct l2cap_chan *chan, u16 txseq)
5974{
5975 BT_DBG("chan %p, txseq %d", chan, txseq);
5976
5977 BT_DBG("last_acked_seq %d, expected_tx_seq %d", chan->last_acked_seq,
5978 chan->expected_tx_seq);
5979
5980 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
5981 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
Gustavo Padovan2d792812012-10-06 10:07:01 +01005982 chan->tx_win) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07005983 /* See notes below regarding "double poll" and
5984 * invalid packets.
5985 */
5986 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
5987 BT_DBG("Invalid/Ignore - after SREJ");
5988 return L2CAP_TXSEQ_INVALID_IGNORE;
5989 } else {
5990 BT_DBG("Invalid - in window after SREJ sent");
5991 return L2CAP_TXSEQ_INVALID;
5992 }
5993 }
5994
5995 if (chan->srej_list.head == txseq) {
5996 BT_DBG("Expected SREJ");
5997 return L2CAP_TXSEQ_EXPECTED_SREJ;
5998 }
5999
6000 if (l2cap_ertm_seq_in_queue(&chan->srej_q, txseq)) {
6001 BT_DBG("Duplicate SREJ - txseq already stored");
6002 return L2CAP_TXSEQ_DUPLICATE_SREJ;
6003 }
6004
6005 if (l2cap_seq_list_contains(&chan->srej_list, txseq)) {
6006 BT_DBG("Unexpected SREJ - not requested");
6007 return L2CAP_TXSEQ_UNEXPECTED_SREJ;
6008 }
6009 }
6010
6011 if (chan->expected_tx_seq == txseq) {
6012 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
6013 chan->tx_win) {
6014 BT_DBG("Invalid - txseq outside tx window");
6015 return L2CAP_TXSEQ_INVALID;
6016 } else {
6017 BT_DBG("Expected");
6018 return L2CAP_TXSEQ_EXPECTED;
6019 }
6020 }
6021
6022 if (__seq_offset(chan, txseq, chan->last_acked_seq) <
Gustavo Padovan2d792812012-10-06 10:07:01 +01006023 __seq_offset(chan, chan->expected_tx_seq, chan->last_acked_seq)) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07006024 BT_DBG("Duplicate - expected_tx_seq later than txseq");
6025 return L2CAP_TXSEQ_DUPLICATE;
6026 }
6027
6028 if (__seq_offset(chan, txseq, chan->last_acked_seq) >= chan->tx_win) {
6029 /* A source of invalid packets is a "double poll" condition,
6030 * where delays cause us to send multiple poll packets. If
6031 * the remote stack receives and processes both polls,
6032 * sequence numbers can wrap around in such a way that a
6033 * resent frame has a sequence number that looks like new data
6034 * with a sequence gap. This would trigger an erroneous SREJ
6035 * request.
6036 *
6037 * Fortunately, this is impossible with a tx window that's
6038 * less than half of the maximum sequence number, which allows
6039 * invalid frames to be safely ignored.
6040 *
6041 * With tx window sizes greater than half of the tx window
6042 * maximum, the frame is invalid and cannot be ignored. This
6043 * causes a disconnect.
6044 */
6045
6046 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
6047 BT_DBG("Invalid/Ignore - txseq outside tx window");
6048 return L2CAP_TXSEQ_INVALID_IGNORE;
6049 } else {
6050 BT_DBG("Invalid - txseq outside tx window");
6051 return L2CAP_TXSEQ_INVALID;
6052 }
6053 } else {
6054 BT_DBG("Unexpected - txseq indicates missing frames");
6055 return L2CAP_TXSEQ_UNEXPECTED;
6056 }
6057}
6058
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006059static int l2cap_rx_state_recv(struct l2cap_chan *chan,
6060 struct l2cap_ctrl *control,
6061 struct sk_buff *skb, u8 event)
6062{
6063 int err = 0;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006064 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006065
6066 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6067 event);
6068
6069 switch (event) {
6070 case L2CAP_EV_RECV_IFRAME:
6071 switch (l2cap_classify_txseq(chan, control->txseq)) {
6072 case L2CAP_TXSEQ_EXPECTED:
6073 l2cap_pass_to_tx(chan, control);
6074
6075 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6076 BT_DBG("Busy, discarding expected seq %d",
6077 control->txseq);
6078 break;
6079 }
6080
6081 chan->expected_tx_seq = __next_seq(chan,
6082 control->txseq);
6083
6084 chan->buffer_seq = chan->expected_tx_seq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006085 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006086
6087 err = l2cap_reassemble_sdu(chan, skb, control);
6088 if (err)
6089 break;
6090
6091 if (control->final) {
6092 if (!test_and_clear_bit(CONN_REJ_ACT,
6093 &chan->conn_state)) {
6094 control->final = 0;
6095 l2cap_retransmit_all(chan, control);
6096 l2cap_ertm_send(chan);
6097 }
6098 }
6099
6100 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
6101 l2cap_send_ack(chan);
6102 break;
6103 case L2CAP_TXSEQ_UNEXPECTED:
6104 l2cap_pass_to_tx(chan, control);
6105
6106 /* Can't issue SREJ frames in the local busy state.
6107 * Drop this frame, it will be seen as missing
6108 * when local busy is exited.
6109 */
6110 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6111 BT_DBG("Busy, discarding unexpected seq %d",
6112 control->txseq);
6113 break;
6114 }
6115
6116 /* There was a gap in the sequence, so an SREJ
6117 * must be sent for each missing frame. The
6118 * current frame is stored for later use.
6119 */
6120 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006121 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006122 BT_DBG("Queued %p (queue len %d)", skb,
6123 skb_queue_len(&chan->srej_q));
6124
6125 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
6126 l2cap_seq_list_clear(&chan->srej_list);
6127 l2cap_send_srej(chan, control->txseq);
6128
6129 chan->rx_state = L2CAP_RX_STATE_SREJ_SENT;
6130 break;
6131 case L2CAP_TXSEQ_DUPLICATE:
6132 l2cap_pass_to_tx(chan, control);
6133 break;
6134 case L2CAP_TXSEQ_INVALID_IGNORE:
6135 break;
6136 case L2CAP_TXSEQ_INVALID:
6137 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006138 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006139 break;
6140 }
6141 break;
6142 case L2CAP_EV_RECV_RR:
6143 l2cap_pass_to_tx(chan, control);
6144 if (control->final) {
6145 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6146
Mat Martineaue6a3ee62012-10-23 15:24:22 -07006147 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state) &&
6148 !__chan_is_moving(chan)) {
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006149 control->final = 0;
6150 l2cap_retransmit_all(chan, control);
6151 }
6152
6153 l2cap_ertm_send(chan);
6154 } else if (control->poll) {
6155 l2cap_send_i_or_rr_or_rnr(chan);
6156 } else {
6157 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6158 &chan->conn_state) &&
6159 chan->unacked_frames)
6160 __set_retrans_timer(chan);
6161
6162 l2cap_ertm_send(chan);
6163 }
6164 break;
6165 case L2CAP_EV_RECV_RNR:
6166 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6167 l2cap_pass_to_tx(chan, control);
6168 if (control && control->poll) {
6169 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6170 l2cap_send_rr_or_rnr(chan, 0);
6171 }
6172 __clear_retrans_timer(chan);
6173 l2cap_seq_list_clear(&chan->retrans_list);
6174 break;
6175 case L2CAP_EV_RECV_REJ:
6176 l2cap_handle_rej(chan, control);
6177 break;
6178 case L2CAP_EV_RECV_SREJ:
6179 l2cap_handle_srej(chan, control);
6180 break;
6181 default:
6182 break;
6183 }
6184
6185 if (skb && !skb_in_use) {
6186 BT_DBG("Freeing %p", skb);
6187 kfree_skb(skb);
6188 }
6189
6190 return err;
6191}
6192
6193static int l2cap_rx_state_srej_sent(struct l2cap_chan *chan,
6194 struct l2cap_ctrl *control,
6195 struct sk_buff *skb, u8 event)
6196{
6197 int err = 0;
6198 u16 txseq = control->txseq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006199 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006200
6201 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6202 event);
6203
6204 switch (event) {
6205 case L2CAP_EV_RECV_IFRAME:
6206 switch (l2cap_classify_txseq(chan, txseq)) {
6207 case L2CAP_TXSEQ_EXPECTED:
6208 /* Keep frame for reassembly later */
6209 l2cap_pass_to_tx(chan, control);
6210 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006211 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006212 BT_DBG("Queued %p (queue len %d)", skb,
6213 skb_queue_len(&chan->srej_q));
6214
6215 chan->expected_tx_seq = __next_seq(chan, txseq);
6216 break;
6217 case L2CAP_TXSEQ_EXPECTED_SREJ:
6218 l2cap_seq_list_pop(&chan->srej_list);
6219
6220 l2cap_pass_to_tx(chan, control);
6221 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006222 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006223 BT_DBG("Queued %p (queue len %d)", skb,
6224 skb_queue_len(&chan->srej_q));
6225
6226 err = l2cap_rx_queued_iframes(chan);
6227 if (err)
6228 break;
6229
6230 break;
6231 case L2CAP_TXSEQ_UNEXPECTED:
6232 /* Got a frame that can't be reassembled yet.
6233 * Save it for later, and send SREJs to cover
6234 * the missing frames.
6235 */
6236 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006237 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006238 BT_DBG("Queued %p (queue len %d)", skb,
6239 skb_queue_len(&chan->srej_q));
6240
6241 l2cap_pass_to_tx(chan, control);
6242 l2cap_send_srej(chan, control->txseq);
6243 break;
6244 case L2CAP_TXSEQ_UNEXPECTED_SREJ:
6245 /* This frame was requested with an SREJ, but
6246 * some expected retransmitted frames are
6247 * missing. Request retransmission of missing
6248 * SREJ'd frames.
6249 */
6250 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006251 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006252 BT_DBG("Queued %p (queue len %d)", skb,
6253 skb_queue_len(&chan->srej_q));
6254
6255 l2cap_pass_to_tx(chan, control);
6256 l2cap_send_srej_list(chan, control->txseq);
6257 break;
6258 case L2CAP_TXSEQ_DUPLICATE_SREJ:
6259 /* We've already queued this frame. Drop this copy. */
6260 l2cap_pass_to_tx(chan, control);
6261 break;
6262 case L2CAP_TXSEQ_DUPLICATE:
6263 /* Expecting a later sequence number, so this frame
6264 * was already received. Ignore it completely.
6265 */
6266 break;
6267 case L2CAP_TXSEQ_INVALID_IGNORE:
6268 break;
6269 case L2CAP_TXSEQ_INVALID:
6270 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006271 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006272 break;
6273 }
6274 break;
6275 case L2CAP_EV_RECV_RR:
6276 l2cap_pass_to_tx(chan, control);
6277 if (control->final) {
6278 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6279
6280 if (!test_and_clear_bit(CONN_REJ_ACT,
6281 &chan->conn_state)) {
6282 control->final = 0;
6283 l2cap_retransmit_all(chan, control);
6284 }
6285
6286 l2cap_ertm_send(chan);
6287 } else if (control->poll) {
6288 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6289 &chan->conn_state) &&
6290 chan->unacked_frames) {
6291 __set_retrans_timer(chan);
6292 }
6293
6294 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6295 l2cap_send_srej_tail(chan);
6296 } else {
6297 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6298 &chan->conn_state) &&
6299 chan->unacked_frames)
6300 __set_retrans_timer(chan);
6301
6302 l2cap_send_ack(chan);
6303 }
6304 break;
6305 case L2CAP_EV_RECV_RNR:
6306 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6307 l2cap_pass_to_tx(chan, control);
6308 if (control->poll) {
6309 l2cap_send_srej_tail(chan);
6310 } else {
6311 struct l2cap_ctrl rr_control;
6312 memset(&rr_control, 0, sizeof(rr_control));
6313 rr_control.sframe = 1;
6314 rr_control.super = L2CAP_SUPER_RR;
6315 rr_control.reqseq = chan->buffer_seq;
6316 l2cap_send_sframe(chan, &rr_control);
6317 }
6318
6319 break;
6320 case L2CAP_EV_RECV_REJ:
6321 l2cap_handle_rej(chan, control);
6322 break;
6323 case L2CAP_EV_RECV_SREJ:
6324 l2cap_handle_srej(chan, control);
6325 break;
6326 }
6327
6328 if (skb && !skb_in_use) {
6329 BT_DBG("Freeing %p", skb);
6330 kfree_skb(skb);
6331 }
6332
6333 return err;
6334}
6335
Mat Martineau32b32732012-10-23 15:24:11 -07006336static int l2cap_finish_move(struct l2cap_chan *chan)
6337{
6338 BT_DBG("chan %p", chan);
6339
6340 chan->rx_state = L2CAP_RX_STATE_RECV;
6341
6342 if (chan->hs_hcon)
6343 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6344 else
6345 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6346
6347 return l2cap_resegment(chan);
6348}
6349
6350static int l2cap_rx_state_wait_p(struct l2cap_chan *chan,
6351 struct l2cap_ctrl *control,
6352 struct sk_buff *skb, u8 event)
6353{
6354 int err;
6355
6356 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6357 event);
6358
6359 if (!control->poll)
6360 return -EPROTO;
6361
6362 l2cap_process_reqseq(chan, control->reqseq);
6363
6364 if (!skb_queue_empty(&chan->tx_q))
6365 chan->tx_send_head = skb_peek(&chan->tx_q);
6366 else
6367 chan->tx_send_head = NULL;
6368
6369 /* Rewind next_tx_seq to the point expected
6370 * by the receiver.
6371 */
6372 chan->next_tx_seq = control->reqseq;
6373 chan->unacked_frames = 0;
6374
6375 err = l2cap_finish_move(chan);
6376 if (err)
6377 return err;
6378
6379 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6380 l2cap_send_i_or_rr_or_rnr(chan);
6381
6382 if (event == L2CAP_EV_RECV_IFRAME)
6383 return -EPROTO;
6384
6385 return l2cap_rx_state_recv(chan, control, NULL, event);
6386}
6387
6388static int l2cap_rx_state_wait_f(struct l2cap_chan *chan,
6389 struct l2cap_ctrl *control,
6390 struct sk_buff *skb, u8 event)
6391{
6392 int err;
6393
6394 if (!control->final)
6395 return -EPROTO;
6396
6397 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6398
6399 chan->rx_state = L2CAP_RX_STATE_RECV;
6400 l2cap_process_reqseq(chan, control->reqseq);
6401
6402 if (!skb_queue_empty(&chan->tx_q))
6403 chan->tx_send_head = skb_peek(&chan->tx_q);
6404 else
6405 chan->tx_send_head = NULL;
6406
6407 /* Rewind next_tx_seq to the point expected
6408 * by the receiver.
6409 */
6410 chan->next_tx_seq = control->reqseq;
6411 chan->unacked_frames = 0;
6412
6413 if (chan->hs_hcon)
6414 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6415 else
6416 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6417
6418 err = l2cap_resegment(chan);
6419
6420 if (!err)
6421 err = l2cap_rx_state_recv(chan, control, skb, event);
6422
6423 return err;
6424}
6425
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006426static bool __valid_reqseq(struct l2cap_chan *chan, u16 reqseq)
6427{
6428 /* Make sure reqseq is for a packet that has been sent but not acked */
6429 u16 unacked;
6430
6431 unacked = __seq_offset(chan, chan->next_tx_seq, chan->expected_ack_seq);
6432 return __seq_offset(chan, chan->next_tx_seq, reqseq) <= unacked;
6433}
6434
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006435static int l2cap_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6436 struct sk_buff *skb, u8 event)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006437{
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006438 int err = 0;
6439
6440 BT_DBG("chan %p, control %p, skb %p, event %d, state %d", chan,
6441 control, skb, event, chan->rx_state);
6442
6443 if (__valid_reqseq(chan, control->reqseq)) {
6444 switch (chan->rx_state) {
6445 case L2CAP_RX_STATE_RECV:
6446 err = l2cap_rx_state_recv(chan, control, skb, event);
6447 break;
6448 case L2CAP_RX_STATE_SREJ_SENT:
6449 err = l2cap_rx_state_srej_sent(chan, control, skb,
6450 event);
6451 break;
Mat Martineau32b32732012-10-23 15:24:11 -07006452 case L2CAP_RX_STATE_WAIT_P:
6453 err = l2cap_rx_state_wait_p(chan, control, skb, event);
6454 break;
6455 case L2CAP_RX_STATE_WAIT_F:
6456 err = l2cap_rx_state_wait_f(chan, control, skb, event);
6457 break;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006458 default:
6459 /* shut it down */
6460 break;
6461 }
6462 } else {
6463 BT_DBG("Invalid reqseq %d (next_tx_seq %d, expected_ack_seq %d",
6464 control->reqseq, chan->next_tx_seq,
6465 chan->expected_ack_seq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006466 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006467 }
6468
6469 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006470}
6471
6472static int l2cap_stream_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6473 struct sk_buff *skb)
6474{
Mat Martineau4b51dae92012-05-17 20:53:37 -07006475 int err = 0;
6476
6477 BT_DBG("chan %p, control %p, skb %p, state %d", chan, control, skb,
6478 chan->rx_state);
6479
6480 if (l2cap_classify_txseq(chan, control->txseq) ==
6481 L2CAP_TXSEQ_EXPECTED) {
6482 l2cap_pass_to_tx(chan, control);
6483
6484 BT_DBG("buffer_seq %d->%d", chan->buffer_seq,
6485 __next_seq(chan, chan->buffer_seq));
6486
6487 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
6488
6489 l2cap_reassemble_sdu(chan, skb, control);
6490 } else {
6491 if (chan->sdu) {
6492 kfree_skb(chan->sdu);
6493 chan->sdu = NULL;
6494 }
6495 chan->sdu_last_frag = NULL;
6496 chan->sdu_len = 0;
6497
6498 if (skb) {
6499 BT_DBG("Freeing %p", skb);
6500 kfree_skb(skb);
6501 }
6502 }
6503
6504 chan->last_acked_seq = control->txseq;
6505 chan->expected_tx_seq = __next_seq(chan, control->txseq);
6506
6507 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006508}
6509
6510static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6511{
6512 struct l2cap_ctrl *control = &bt_cb(skb)->control;
6513 u16 len;
6514 u8 event;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006515
Mat Martineaub76bbd62012-04-11 10:48:43 -07006516 __unpack_control(chan, skb);
6517
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006518 len = skb->len;
6519
6520 /*
6521 * We can just drop the corrupted I-frame here.
6522 * Receiver will miss it and start proper recovery
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006523 * procedures and ask for retransmission.
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006524 */
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006525 if (l2cap_check_fcs(chan, skb))
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006526 goto drop;
6527
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006528 if (!control->sframe && control->sar == L2CAP_SAR_START)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006529 len -= L2CAP_SDULEN_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006530
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006531 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006532 len -= L2CAP_FCS_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006533
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006534 if (len > chan->mps) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006535 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006536 goto drop;
6537 }
6538
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006539 if (!control->sframe) {
6540 int err;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006541
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006542 BT_DBG("iframe sar %d, reqseq %d, final %d, txseq %d",
6543 control->sar, control->reqseq, control->final,
6544 control->txseq);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03006545
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006546 /* Validate F-bit - F=0 always valid, F=1 only
6547 * valid in TX WAIT_F
6548 */
6549 if (control->final && chan->tx_state != L2CAP_TX_STATE_WAIT_F)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006550 goto drop;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006551
6552 if (chan->mode != L2CAP_MODE_STREAMING) {
6553 event = L2CAP_EV_RECV_IFRAME;
6554 err = l2cap_rx(chan, control, skb, event);
6555 } else {
6556 err = l2cap_stream_rx(chan, control, skb);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006557 }
6558
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006559 if (err)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006560 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006561 } else {
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006562 const u8 rx_func_to_event[4] = {
6563 L2CAP_EV_RECV_RR, L2CAP_EV_RECV_REJ,
6564 L2CAP_EV_RECV_RNR, L2CAP_EV_RECV_SREJ
6565 };
6566
6567 /* Only I-frames are expected in streaming mode */
6568 if (chan->mode == L2CAP_MODE_STREAMING)
6569 goto drop;
6570
6571 BT_DBG("sframe reqseq %d, final %d, poll %d, super %d",
6572 control->reqseq, control->final, control->poll,
6573 control->super);
6574
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006575 if (len != 0) {
Andrei Emeltchenko1bb166e2012-11-20 17:16:21 +02006576 BT_ERR("Trailing bytes: %d in sframe", len);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006577 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006578 goto drop;
6579 }
6580
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006581 /* Validate F and P bits */
6582 if (control->final && (control->poll ||
6583 chan->tx_state != L2CAP_TX_STATE_WAIT_F))
6584 goto drop;
6585
6586 event = rx_func_to_event[control->super];
6587 if (l2cap_rx(chan, control, skb, event))
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006588 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006589 }
6590
6591 return 0;
6592
6593drop:
6594 kfree_skb(skb);
6595 return 0;
6596}
6597
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006598static void l2cap_chan_le_send_credits(struct l2cap_chan *chan)
6599{
6600 struct l2cap_conn *conn = chan->conn;
6601 struct l2cap_le_credits pkt;
6602 u16 return_credits;
6603
6604 /* We return more credits to the sender only after the amount of
6605 * credits falls below half of the initial amount.
6606 */
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02006607 if (chan->rx_credits >= (le_max_credits + 1) / 2)
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006608 return;
6609
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02006610 return_credits = le_max_credits - chan->rx_credits;
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006611
6612 BT_DBG("chan %p returning %u credits to sender", chan, return_credits);
6613
6614 chan->rx_credits += return_credits;
6615
6616 pkt.cid = cpu_to_le16(chan->scid);
6617 pkt.credits = cpu_to_le16(return_credits);
6618
6619 chan->ident = l2cap_get_ident(conn);
6620
6621 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CREDITS, sizeof(pkt), &pkt);
6622}
6623
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006624static int l2cap_le_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6625{
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006626 int err;
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006627
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006628 if (!chan->rx_credits) {
6629 BT_ERR("No credits to receive LE L2CAP data");
Johan Hedbergdfd97742014-01-27 15:11:34 -08006630 l2cap_send_disconn_req(chan, ECONNRESET);
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006631 return -ENOBUFS;
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006632 }
6633
6634 if (chan->imtu < skb->len) {
6635 BT_ERR("Too big LE L2CAP PDU");
6636 return -ENOBUFS;
6637 }
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006638
6639 chan->rx_credits--;
6640 BT_DBG("rx_credits %u -> %u", chan->rx_credits + 1, chan->rx_credits);
6641
6642 l2cap_chan_le_send_credits(chan);
6643
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006644 err = 0;
6645
6646 if (!chan->sdu) {
6647 u16 sdu_len;
6648
6649 sdu_len = get_unaligned_le16(skb->data);
6650 skb_pull(skb, L2CAP_SDULEN_SIZE);
6651
6652 BT_DBG("Start of new SDU. sdu_len %u skb->len %u imtu %u",
6653 sdu_len, skb->len, chan->imtu);
6654
6655 if (sdu_len > chan->imtu) {
6656 BT_ERR("Too big LE L2CAP SDU length received");
6657 err = -EMSGSIZE;
6658 goto failed;
6659 }
6660
6661 if (skb->len > sdu_len) {
6662 BT_ERR("Too much LE L2CAP data received");
6663 err = -EINVAL;
6664 goto failed;
6665 }
6666
6667 if (skb->len == sdu_len)
6668 return chan->ops->recv(chan, skb);
6669
6670 chan->sdu = skb;
6671 chan->sdu_len = sdu_len;
6672 chan->sdu_last_frag = skb;
6673
6674 return 0;
6675 }
6676
6677 BT_DBG("SDU fragment. chan->sdu->len %u skb->len %u chan->sdu_len %u",
6678 chan->sdu->len, skb->len, chan->sdu_len);
6679
6680 if (chan->sdu->len + skb->len > chan->sdu_len) {
6681 BT_ERR("Too much LE L2CAP data received");
6682 err = -EINVAL;
6683 goto failed;
6684 }
6685
6686 append_skb_frag(chan->sdu, skb, &chan->sdu_last_frag);
6687 skb = NULL;
6688
6689 if (chan->sdu->len == chan->sdu_len) {
6690 err = chan->ops->recv(chan, chan->sdu);
6691 if (!err) {
6692 chan->sdu = NULL;
6693 chan->sdu_last_frag = NULL;
6694 chan->sdu_len = 0;
6695 }
6696 }
6697
6698failed:
6699 if (err) {
6700 kfree_skb(skb);
6701 kfree_skb(chan->sdu);
6702 chan->sdu = NULL;
6703 chan->sdu_last_frag = NULL;
6704 chan->sdu_len = 0;
6705 }
6706
6707 /* We can't return an error here since we took care of the skb
6708 * freeing internally. An error return would cause the caller to
6709 * do a double-free of the skb.
6710 */
6711 return 0;
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006712}
6713
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006714static void l2cap_data_channel(struct l2cap_conn *conn, u16 cid,
6715 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006716{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006717 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006718
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03006719 chan = l2cap_get_chan_by_scid(conn, cid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006720 if (!chan) {
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006721 if (cid == L2CAP_CID_A2MP) {
6722 chan = a2mp_channel_create(conn, skb);
6723 if (!chan) {
6724 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006725 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006726 }
6727
6728 l2cap_chan_lock(chan);
6729 } else {
6730 BT_DBG("unknown cid 0x%4.4x", cid);
6731 /* Drop packet and return */
6732 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006733 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006734 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006735 }
6736
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03006737 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006738
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03006739 if (chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006740 goto drop;
6741
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006742 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03006743 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006744 if (l2cap_le_data_rcv(chan, skb) < 0)
6745 goto drop;
6746
6747 goto done;
6748
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006749 case L2CAP_MODE_BASIC:
6750 /* If socket recv buffers overflows we drop data here
6751 * which is *bad* because L2CAP has to be reliable.
6752 * But we don't have any other choice. L2CAP doesn't
6753 * provide flow control mechanism. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07006754
Szymon Janc2c96e032014-02-18 20:48:34 +01006755 if (chan->imtu < skb->len) {
6756 BT_ERR("Dropping L2CAP data: receive buffer overflow");
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006757 goto drop;
Szymon Janc2c96e032014-02-18 20:48:34 +01006758 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006759
Gustavo Padovan80b98022012-05-27 22:27:51 -03006760 if (!chan->ops->recv(chan, skb))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006761 goto done;
6762 break;
6763
6764 case L2CAP_MODE_ERTM:
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006765 case L2CAP_MODE_STREAMING:
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006766 l2cap_data_rcv(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006767 goto done;
6768
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006769 default:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006770 BT_DBG("chan %p: bad mode 0x%2.2x", chan, chan->mode);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006771 break;
6772 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006773
6774drop:
6775 kfree_skb(skb);
6776
6777done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006778 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006779}
6780
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006781static void l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm,
6782 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006783{
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006784 struct hci_conn *hcon = conn->hcon;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006785 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006786
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006787 if (hcon->type != ACL_LINK)
Johan Hedberga24cce12014-08-07 22:56:42 +03006788 goto free_skb;
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006789
Johan Hedbergbf20fd42013-05-14 13:23:13 +03006790 chan = l2cap_global_chan_by_psm(0, psm, &hcon->src, &hcon->dst,
6791 ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006792 if (!chan)
Johan Hedberga24cce12014-08-07 22:56:42 +03006793 goto free_skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006794
Andrei Emeltchenko5b4ceda2012-02-24 16:35:32 +02006795 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006796
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03006797 if (chan->state != BT_BOUND && chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006798 goto drop;
6799
Vinicius Costa Gomese13e21d2011-06-17 22:46:27 -03006800 if (chan->imtu < skb->len)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006801 goto drop;
6802
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006803 /* Store remote BD_ADDR and PSM for msg_name */
Marcel Holtmann06ae3312013-10-18 03:43:00 -07006804 bacpy(&bt_cb(skb)->bdaddr, &hcon->dst);
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006805 bt_cb(skb)->psm = psm;
6806
Johan Hedberga24cce12014-08-07 22:56:42 +03006807 if (!chan->ops->recv(chan, skb)) {
6808 l2cap_chan_put(chan);
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006809 return;
Johan Hedberga24cce12014-08-07 22:56:42 +03006810 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006811
6812drop:
Johan Hedberga24cce12014-08-07 22:56:42 +03006813 l2cap_chan_put(chan);
6814free_skb:
Linus Torvalds1da177e2005-04-16 15:20:36 -07006815 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006816}
6817
6818static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb)
6819{
6820 struct l2cap_hdr *lh = (void *) skb->data;
Johan Hedberg61a939c2014-01-17 20:45:11 +02006821 struct hci_conn *hcon = conn->hcon;
Al Viro8e036fc2007-07-29 00:16:36 -07006822 u16 cid, len;
6823 __le16 psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006824
Johan Hedberg61a939c2014-01-17 20:45:11 +02006825 if (hcon->state != BT_CONNECTED) {
6826 BT_DBG("queueing pending rx skb");
6827 skb_queue_tail(&conn->pending_rx, skb);
6828 return;
6829 }
6830
Linus Torvalds1da177e2005-04-16 15:20:36 -07006831 skb_pull(skb, L2CAP_HDR_SIZE);
6832 cid = __le16_to_cpu(lh->cid);
6833 len = __le16_to_cpu(lh->len);
6834
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006835 if (len != skb->len) {
6836 kfree_skb(skb);
6837 return;
6838 }
6839
Johan Hedberg9e1d7e12014-07-06 11:03:36 +03006840 /* Since we can't actively block incoming LE connections we must
6841 * at least ensure that we ignore incoming data from them.
6842 */
6843 if (hcon->type == LE_LINK &&
Johan Hedbergdcc36c12014-07-09 12:59:13 +03006844 hci_bdaddr_list_lookup(&hcon->hdev->blacklist, &hcon->dst,
6845 bdaddr_type(hcon, hcon->dst_type))) {
Johan Hedberge4931502014-07-02 09:36:21 +03006846 kfree_skb(skb);
6847 return;
6848 }
6849
Linus Torvalds1da177e2005-04-16 15:20:36 -07006850 BT_DBG("len %d, cid 0x%4.4x", len, cid);
6851
6852 switch (cid) {
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006853 case L2CAP_CID_SIGNALING:
Linus Torvalds1da177e2005-04-16 15:20:36 -07006854 l2cap_sig_channel(conn, skb);
6855 break;
6856
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006857 case L2CAP_CID_CONN_LESS:
Andrei Emeltchenko097db762012-03-09 14:16:17 +02006858 psm = get_unaligned((__le16 *) skb->data);
Andrei Emeltchenko0181a702012-05-29 10:04:05 +03006859 skb_pull(skb, L2CAP_PSMLEN_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006860 l2cap_conless_channel(conn, psm, skb);
6861 break;
6862
Marcel Holtmanna2877622013-10-02 23:46:54 -07006863 case L2CAP_CID_LE_SIGNALING:
6864 l2cap_le_sig_channel(conn, skb);
6865 break;
6866
Linus Torvalds1da177e2005-04-16 15:20:36 -07006867 default:
6868 l2cap_data_channel(conn, cid, skb);
6869 break;
6870 }
6871}
6872
Johan Hedberg61a939c2014-01-17 20:45:11 +02006873static void process_pending_rx(struct work_struct *work)
6874{
6875 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
6876 pending_rx_work);
6877 struct sk_buff *skb;
6878
6879 BT_DBG("");
6880
6881 while ((skb = skb_dequeue(&conn->pending_rx)))
6882 l2cap_recv_frame(conn, skb);
6883}
6884
Johan Hedberg162b49e2014-01-17 20:45:10 +02006885static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon)
6886{
6887 struct l2cap_conn *conn = hcon->l2cap_data;
6888 struct hci_chan *hchan;
6889
6890 if (conn)
6891 return conn;
6892
6893 hchan = hci_chan_create(hcon);
6894 if (!hchan)
6895 return NULL;
6896
Johan Hedberg27f70f32014-07-21 10:50:06 +03006897 conn = kzalloc(sizeof(*conn), GFP_KERNEL);
Johan Hedberg162b49e2014-01-17 20:45:10 +02006898 if (!conn) {
6899 hci_chan_del(hchan);
6900 return NULL;
6901 }
6902
6903 kref_init(&conn->ref);
6904 hcon->l2cap_data = conn;
6905 conn->hcon = hcon;
6906 hci_conn_get(conn->hcon);
6907 conn->hchan = hchan;
6908
6909 BT_DBG("hcon %p conn %p hchan %p", hcon, conn, hchan);
6910
6911 switch (hcon->type) {
6912 case LE_LINK:
6913 if (hcon->hdev->le_mtu) {
6914 conn->mtu = hcon->hdev->le_mtu;
6915 break;
6916 }
6917 /* fall through */
6918 default:
6919 conn->mtu = hcon->hdev->acl_mtu;
6920 break;
6921 }
6922
6923 conn->feat_mask = 0;
6924
6925 if (hcon->type == ACL_LINK)
6926 conn->hs_enabled = test_bit(HCI_HS_ENABLED,
6927 &hcon->hdev->dev_flags);
6928
Marcel Holtmann5a54e7c2014-07-13 20:50:15 +02006929 mutex_init(&conn->ident_lock);
Johan Hedberg162b49e2014-01-17 20:45:10 +02006930 mutex_init(&conn->chan_lock);
6931
6932 INIT_LIST_HEAD(&conn->chan_l);
6933 INIT_LIST_HEAD(&conn->users);
6934
Johan Hedberg276d8072014-08-11 22:06:41 +03006935 INIT_DELAYED_WORK(&conn->info_timer, l2cap_info_timeout);
Johan Hedberg162b49e2014-01-17 20:45:10 +02006936
Johan Hedbergdec5b492014-08-11 22:06:37 +03006937 INIT_WORK(&conn->disconn_work, disconn_work);
6938
Johan Hedberg61a939c2014-01-17 20:45:11 +02006939 skb_queue_head_init(&conn->pending_rx);
6940 INIT_WORK(&conn->pending_rx_work, process_pending_rx);
6941
Johan Hedberg162b49e2014-01-17 20:45:10 +02006942 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
6943
6944 return conn;
6945}
6946
6947static bool is_valid_psm(u16 psm, u8 dst_type) {
6948 if (!psm)
6949 return false;
6950
6951 if (bdaddr_type_is_le(dst_type))
6952 return (psm <= 0x00ff);
6953
6954 /* PSM must be odd and lsb of upper byte must be 0 */
6955 return ((psm & 0x0101) == 0x0001);
6956}
6957
6958int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
6959 bdaddr_t *dst, u8 dst_type)
6960{
6961 struct l2cap_conn *conn;
6962 struct hci_conn *hcon;
6963 struct hci_dev *hdev;
Johan Hedberg162b49e2014-01-17 20:45:10 +02006964 int err;
6965
6966 BT_DBG("%pMR -> %pMR (type %u) psm 0x%2.2x", &chan->src, dst,
6967 dst_type, __le16_to_cpu(psm));
6968
6969 hdev = hci_get_route(dst, &chan->src);
6970 if (!hdev)
6971 return -EHOSTUNREACH;
6972
6973 hci_dev_lock(hdev);
6974
6975 l2cap_chan_lock(chan);
6976
6977 if (!is_valid_psm(__le16_to_cpu(psm), dst_type) && !cid &&
6978 chan->chan_type != L2CAP_CHAN_RAW) {
6979 err = -EINVAL;
6980 goto done;
6981 }
6982
Johan Hedberg21626e62014-01-24 10:35:41 +02006983 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED && !psm) {
6984 err = -EINVAL;
6985 goto done;
6986 }
6987
6988 if (chan->chan_type == L2CAP_CHAN_FIXED && !cid) {
Johan Hedberg162b49e2014-01-17 20:45:10 +02006989 err = -EINVAL;
6990 goto done;
6991 }
6992
6993 switch (chan->mode) {
6994 case L2CAP_MODE_BASIC:
6995 break;
6996 case L2CAP_MODE_LE_FLOWCTL:
6997 l2cap_le_flowctl_init(chan);
6998 break;
6999 case L2CAP_MODE_ERTM:
7000 case L2CAP_MODE_STREAMING:
7001 if (!disable_ertm)
7002 break;
7003 /* fall through */
7004 default:
Johan Hedbergbeb19e42014-07-18 11:15:26 +03007005 err = -EOPNOTSUPP;
Johan Hedberg162b49e2014-01-17 20:45:10 +02007006 goto done;
7007 }
7008
7009 switch (chan->state) {
7010 case BT_CONNECT:
7011 case BT_CONNECT2:
7012 case BT_CONFIG:
7013 /* Already connecting */
7014 err = 0;
7015 goto done;
7016
7017 case BT_CONNECTED:
7018 /* Already connected */
7019 err = -EISCONN;
7020 goto done;
7021
7022 case BT_OPEN:
7023 case BT_BOUND:
7024 /* Can connect */
7025 break;
7026
7027 default:
7028 err = -EBADFD;
7029 goto done;
7030 }
7031
7032 /* Set destination address and psm */
7033 bacpy(&chan->dst, dst);
7034 chan->dst_type = dst_type;
7035
7036 chan->psm = psm;
7037 chan->dcid = cid;
7038
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007039 if (bdaddr_type_is_le(dst_type)) {
Johan Hedberge804d252014-07-16 11:42:28 +03007040 u8 role;
Johan Hedbergcdd62752014-07-07 15:02:28 +03007041
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007042 /* Convert from L2CAP channel address type to HCI address type
7043 */
7044 if (dst_type == BDADDR_LE_PUBLIC)
7045 dst_type = ADDR_LE_DEV_PUBLIC;
7046 else
7047 dst_type = ADDR_LE_DEV_RANDOM;
7048
Johan Hedberge804d252014-07-16 11:42:28 +03007049 if (test_bit(HCI_ADVERTISING, &hdev->dev_flags))
7050 role = HCI_ROLE_SLAVE;
7051 else
7052 role = HCI_ROLE_MASTER;
Johan Hedbergcdd62752014-07-07 15:02:28 +03007053
Andre Guedes04a6c582014-02-26 20:21:44 -03007054 hcon = hci_connect_le(hdev, dst, dst_type, chan->sec_level,
Johan Hedberge804d252014-07-16 11:42:28 +03007055 HCI_LE_CONN_TIMEOUT, role);
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007056 } else {
Johan Hedbergd93375a2014-07-07 15:02:27 +03007057 u8 auth_type = l2cap_get_auth_type(chan);
Andre Guedes04a6c582014-02-26 20:21:44 -03007058 hcon = hci_connect_acl(hdev, dst, chan->sec_level, auth_type);
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007059 }
Johan Hedberg162b49e2014-01-17 20:45:10 +02007060
7061 if (IS_ERR(hcon)) {
7062 err = PTR_ERR(hcon);
7063 goto done;
7064 }
7065
7066 conn = l2cap_conn_add(hcon);
7067 if (!conn) {
7068 hci_conn_drop(hcon);
7069 err = -ENOMEM;
7070 goto done;
7071 }
7072
7073 if (cid && __l2cap_get_chan_by_dcid(conn, cid)) {
7074 hci_conn_drop(hcon);
7075 err = -EBUSY;
7076 goto done;
7077 }
7078
7079 /* Update source addr of the socket */
7080 bacpy(&chan->src, &hcon->src);
7081 chan->src_type = bdaddr_type(hcon, hcon->src_type);
7082
7083 l2cap_chan_unlock(chan);
7084 l2cap_chan_add(conn, chan);
7085 l2cap_chan_lock(chan);
7086
7087 /* l2cap_chan_add takes its own ref so we can drop this one */
7088 hci_conn_drop(hcon);
7089
7090 l2cap_state_change(chan, BT_CONNECT);
7091 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
7092
Johan Hedberg61202e42014-01-28 15:16:48 -08007093 /* Release chan->sport so that it can be reused by other
7094 * sockets (as it's only used for listening sockets).
7095 */
7096 write_lock(&chan_list_lock);
7097 chan->sport = 0;
7098 write_unlock(&chan_list_lock);
7099
Johan Hedberg162b49e2014-01-17 20:45:10 +02007100 if (hcon->state == BT_CONNECTED) {
7101 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
7102 __clear_chan_timer(chan);
Johan Hedberge7cafc42014-07-17 15:35:38 +03007103 if (l2cap_chan_check_security(chan, true))
Johan Hedberg162b49e2014-01-17 20:45:10 +02007104 l2cap_state_change(chan, BT_CONNECTED);
7105 } else
7106 l2cap_do_start(chan);
7107 }
7108
7109 err = 0;
7110
7111done:
7112 l2cap_chan_unlock(chan);
7113 hci_dev_unlock(hdev);
7114 hci_dev_put(hdev);
7115 return err;
7116}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +03007117EXPORT_SYMBOL_GPL(l2cap_chan_connect);
Johan Hedberg162b49e2014-01-17 20:45:10 +02007118
Linus Torvalds1da177e2005-04-16 15:20:36 -07007119/* ---- L2CAP interface with lower layer (HCI) ---- */
7120
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007121int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007122{
7123 int exact = 0, lm1 = 0, lm2 = 0;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007124 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007125
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03007126 BT_DBG("hdev %s, bdaddr %pMR", hdev->name, bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007127
7128 /* Find listening sockets and check their link_mode */
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007129 read_lock(&chan_list_lock);
7130 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007131 if (c->state != BT_LISTEN)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007132 continue;
7133
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007134 if (!bacmp(&c->src, &hdev->bdaddr)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007135 lm1 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03007136 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007137 lm1 |= HCI_LM_MASTER;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007138 exact++;
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007139 } else if (!bacmp(&c->src, BDADDR_ANY)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007140 lm2 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03007141 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007142 lm2 |= HCI_LM_MASTER;
7143 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007144 }
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007145 read_unlock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007146
7147 return exact ? lm1 : lm2;
7148}
7149
Johan Hedberge760ec12014-08-07 22:56:47 +03007150/* Find the next fixed channel in BT_LISTEN state, continue iteration
7151 * from an existing channel in the list or from the beginning of the
7152 * global list (by passing NULL as first parameter).
7153 */
7154static struct l2cap_chan *l2cap_global_fixed_chan(struct l2cap_chan *c,
Johan Hedberg54a1b622014-08-07 22:56:48 +03007155 bdaddr_t *src, u8 link_type)
Johan Hedberge760ec12014-08-07 22:56:47 +03007156{
7157 read_lock(&chan_list_lock);
7158
7159 if (c)
7160 c = list_next_entry(c, global_l);
7161 else
7162 c = list_entry(chan_list.next, typeof(*c), global_l);
7163
7164 list_for_each_entry_from(c, &chan_list, global_l) {
7165 if (c->chan_type != L2CAP_CHAN_FIXED)
7166 continue;
7167 if (c->state != BT_LISTEN)
7168 continue;
7169 if (bacmp(&c->src, src) && bacmp(&c->src, BDADDR_ANY))
7170 continue;
Johan Hedberg54a1b622014-08-07 22:56:48 +03007171 if (link_type == ACL_LINK && c->src_type != BDADDR_BREDR)
7172 continue;
7173 if (link_type == LE_LINK && c->src_type == BDADDR_BREDR)
7174 continue;
Johan Hedberge760ec12014-08-07 22:56:47 +03007175
7176 l2cap_chan_hold(c);
7177 read_unlock(&chan_list_lock);
7178 return c;
7179 }
7180
7181 read_unlock(&chan_list_lock);
7182
7183 return NULL;
7184}
7185
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03007186void l2cap_connect_cfm(struct hci_conn *hcon, u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007187{
Johan Hedberge760ec12014-08-07 22:56:47 +03007188 struct hci_dev *hdev = hcon->hdev;
Marcel Holtmann01394182006-07-03 10:02:46 +02007189 struct l2cap_conn *conn;
Johan Hedberge760ec12014-08-07 22:56:47 +03007190 struct l2cap_chan *pchan;
7191 u8 dst_type;
Marcel Holtmann01394182006-07-03 10:02:46 +02007192
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03007193 BT_DBG("hcon %p bdaddr %pMR status %d", hcon, &hcon->dst, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007194
Johan Hedbergdc0f5082014-08-07 22:56:46 +03007195 if (status) {
Joe Perchese1750722011-06-29 18:18:29 -07007196 l2cap_conn_del(hcon, bt_to_errno(status));
Johan Hedbergdc0f5082014-08-07 22:56:46 +03007197 return;
Andrei Emeltchenkoba6fc312012-10-31 15:46:26 +02007198 }
Johan Hedbergdc0f5082014-08-07 22:56:46 +03007199
7200 conn = l2cap_conn_add(hcon);
7201 if (!conn)
7202 return;
7203
Johan Hedberge760ec12014-08-07 22:56:47 +03007204 dst_type = bdaddr_type(hcon, hcon->dst_type);
7205
7206 /* If device is blocked, do not create channels for it */
7207 if (hci_bdaddr_list_lookup(&hdev->blacklist, &hcon->dst, dst_type))
7208 return;
7209
7210 /* Find fixed channels and notify them of the new connection. We
7211 * use multiple individual lookups, continuing each time where
7212 * we left off, because the list lock would prevent calling the
7213 * potentially sleeping l2cap_chan_lock() function.
7214 */
Johan Hedberg54a1b622014-08-07 22:56:48 +03007215 pchan = l2cap_global_fixed_chan(NULL, &hdev->bdaddr, hcon->type);
Johan Hedberge760ec12014-08-07 22:56:47 +03007216 while (pchan) {
7217 struct l2cap_chan *chan, *next;
7218
7219 /* Client fixed channels should override server ones */
7220 if (__l2cap_get_chan_by_dcid(conn, pchan->scid))
7221 goto next;
7222
7223 l2cap_chan_lock(pchan);
7224 chan = pchan->ops->new_connection(pchan);
7225 if (chan) {
7226 bacpy(&chan->src, &hcon->src);
7227 bacpy(&chan->dst, &hcon->dst);
7228 chan->src_type = bdaddr_type(hcon, hcon->src_type);
7229 chan->dst_type = dst_type;
7230
7231 __l2cap_chan_add(conn, chan);
7232 }
7233
7234 l2cap_chan_unlock(pchan);
7235next:
Johan Hedberg54a1b622014-08-07 22:56:48 +03007236 next = l2cap_global_fixed_chan(pchan, &hdev->bdaddr,
7237 hcon->type);
Johan Hedberge760ec12014-08-07 22:56:47 +03007238 l2cap_chan_put(pchan);
7239 pchan = next;
7240 }
7241
Johan Hedbergdc0f5082014-08-07 22:56:46 +03007242 l2cap_conn_ready(conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007243}
7244
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007245int l2cap_disconn_ind(struct hci_conn *hcon)
Marcel Holtmann2950f212009-02-12 14:02:50 +01007246{
7247 struct l2cap_conn *conn = hcon->l2cap_data;
7248
7249 BT_DBG("hcon %p", hcon);
7250
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007251 if (!conn)
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02007252 return HCI_ERROR_REMOTE_USER_TERM;
Marcel Holtmann2950f212009-02-12 14:02:50 +01007253 return conn->disc_reason;
7254}
7255
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03007256void l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007257{
7258 BT_DBG("hcon %p reason %d", hcon, reason);
7259
Joe Perchese1750722011-06-29 18:18:29 -07007260 l2cap_conn_del(hcon, bt_to_errno(reason));
Linus Torvalds1da177e2005-04-16 15:20:36 -07007261}
7262
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007263static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt)
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007264{
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03007265 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED)
Marcel Holtmann255c7602009-02-04 21:07:19 +01007266 return;
7267
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007268 if (encrypt == 0x00) {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007269 if (chan->sec_level == BT_SECURITY_MEDIUM) {
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007270 __set_chan_timer(chan, L2CAP_ENC_TIMEOUT);
Marcel Holtmann7d513e92014-01-15 22:37:40 -08007271 } else if (chan->sec_level == BT_SECURITY_HIGH ||
7272 chan->sec_level == BT_SECURITY_FIPS)
Gustavo F. Padovan0f852722011-05-04 19:42:50 -03007273 l2cap_chan_close(chan, ECONNREFUSED);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007274 } else {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007275 if (chan->sec_level == BT_SECURITY_MEDIUM)
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -03007276 __clear_chan_timer(chan);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007277 }
7278}
7279
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007280int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007281{
Marcel Holtmann40be4922008-07-14 20:13:50 +02007282 struct l2cap_conn *conn = hcon->l2cap_data;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03007283 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007284
Marcel Holtmann01394182006-07-03 10:02:46 +02007285 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007286 return 0;
Marcel Holtmann01394182006-07-03 10:02:46 +02007287
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03007288 BT_DBG("conn %p status 0x%2.2x encrypt %u", conn, status, encrypt);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007289
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007290 mutex_lock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007291
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007292 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007293 l2cap_chan_lock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007294
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03007295 BT_DBG("chan %p scid 0x%4.4x state %s", chan, chan->scid,
7296 state_to_string(chan->state));
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007297
Johan Hedberg2338a7e2014-01-24 10:35:40 +02007298 if (chan->scid == L2CAP_CID_A2MP) {
Andrei Emeltchenko78eb2f92012-07-19 17:03:47 +03007299 l2cap_chan_unlock(chan);
7300 continue;
7301 }
7302
Johan Hedberg191eb392014-08-07 22:56:45 +03007303 if (!status && encrypt)
7304 chan->sec_level = hcon->sec_level;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007305
Andrei Emeltchenko96eff462012-11-15 18:14:53 +02007306 if (!__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007307 l2cap_chan_unlock(chan);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01007308 continue;
7309 }
7310
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007311 if (!status && (chan->state == BT_CONNECTED ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01007312 chan->state == BT_CONFIG)) {
Marcel Holtmannd97c8992013-10-14 02:53:54 -07007313 chan->ops->resume(chan);
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007314 l2cap_check_encryption(chan, encrypt);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007315 l2cap_chan_unlock(chan);
Marcel Holtmann9719f8a2008-07-14 20:13:45 +02007316 continue;
7317 }
7318
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007319 if (chan->state == BT_CONNECT) {
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007320 if (!status)
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03007321 l2cap_start_connection(chan);
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007322 else
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007323 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007324 } else if (chan->state == BT_CONNECT2) {
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007325 struct l2cap_conn_rsp rsp;
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007326 __u16 res, stat;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007327
7328 if (!status) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07007329 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007330 res = L2CAP_CR_PEND;
7331 stat = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08007332 chan->ops->defer(chan);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007333 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007334 l2cap_state_change(chan, BT_CONFIG);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007335 res = L2CAP_CR_SUCCESS;
7336 stat = L2CAP_CS_NO_INFO;
7337 }
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007338 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007339 l2cap_state_change(chan, BT_DISCONN);
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007340 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007341 res = L2CAP_CR_SEC_BLOCK;
7342 stat = L2CAP_CS_NO_INFO;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007343 }
7344
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03007345 rsp.scid = cpu_to_le16(chan->dcid);
7346 rsp.dcid = cpu_to_le16(chan->scid);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007347 rsp.result = cpu_to_le16(res);
7348 rsp.status = cpu_to_le16(stat);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03007349 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01007350 sizeof(rsp), &rsp);
Mat Martineau2d369352012-05-23 14:59:30 -07007351
7352 if (!test_bit(CONF_REQ_SENT, &chan->conf_state) &&
7353 res == L2CAP_CR_SUCCESS) {
7354 char buf[128];
7355 set_bit(CONF_REQ_SENT, &chan->conf_state);
7356 l2cap_send_cmd(conn, l2cap_get_ident(conn),
7357 L2CAP_CONF_REQ,
7358 l2cap_build_conf_req(chan, buf),
7359 buf);
7360 chan->num_conf_req++;
7361 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007362 }
7363
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007364 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007365 }
7366
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007367 mutex_unlock(&conn->chan_lock);
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007368
Linus Torvalds1da177e2005-04-16 15:20:36 -07007369 return 0;
7370}
7371
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007372int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007373{
7374 struct l2cap_conn *conn = hcon->l2cap_data;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007375 struct l2cap_hdr *hdr;
7376 int len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007377
Andrei Emeltchenko1d13a252012-10-15 11:58:41 +03007378 /* For AMP controller do not create l2cap conn */
7379 if (!conn && hcon->hdev->dev_type != HCI_BREDR)
7380 goto drop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007381
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007382 if (!conn)
Claudio Takahasibaf43252013-04-11 13:55:50 -03007383 conn = l2cap_conn_add(hcon);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007384
7385 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007386 goto drop;
7387
7388 BT_DBG("conn %p len %d flags 0x%x", conn, skb->len, flags);
7389
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007390 switch (flags) {
7391 case ACL_START:
7392 case ACL_START_NO_FLUSH:
7393 case ACL_COMPLETE:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007394 if (conn->rx_len) {
7395 BT_ERR("Unexpected start frame (len %d)", skb->len);
7396 kfree_skb(conn->rx_skb);
7397 conn->rx_skb = NULL;
7398 conn->rx_len = 0;
7399 l2cap_conn_unreliable(conn, ECOMM);
7400 }
7401
Andrei Emeltchenkoaae7fe22010-09-15 14:28:43 +03007402 /* Start fragment always begin with Basic L2CAP header */
7403 if (skb->len < L2CAP_HDR_SIZE) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07007404 BT_ERR("Frame is too short (len %d)", skb->len);
7405 l2cap_conn_unreliable(conn, ECOMM);
7406 goto drop;
7407 }
7408
7409 hdr = (struct l2cap_hdr *) skb->data;
7410 len = __le16_to_cpu(hdr->len) + L2CAP_HDR_SIZE;
7411
7412 if (len == skb->len) {
7413 /* Complete frame received */
7414 l2cap_recv_frame(conn, skb);
7415 return 0;
7416 }
7417
7418 BT_DBG("Start: total len %d, frag len %d", len, skb->len);
7419
7420 if (skb->len > len) {
7421 BT_ERR("Frame is too long (len %d, expected len %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007422 skb->len, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007423 l2cap_conn_unreliable(conn, ECOMM);
7424 goto drop;
7425 }
7426
7427 /* Allocate skb for the complete frame (with header) */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03007428 conn->rx_skb = bt_skb_alloc(len, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03007429 if (!conn->rx_skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007430 goto drop;
7431
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007432 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007433 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007434 conn->rx_len = len - skb->len;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007435 break;
7436
7437 case ACL_CONT:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007438 BT_DBG("Cont: frag len %d (expecting %d)", skb->len, conn->rx_len);
7439
7440 if (!conn->rx_len) {
7441 BT_ERR("Unexpected continuation frame (len %d)", skb->len);
7442 l2cap_conn_unreliable(conn, ECOMM);
7443 goto drop;
7444 }
7445
7446 if (skb->len > conn->rx_len) {
7447 BT_ERR("Fragment is too long (len %d, expected %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007448 skb->len, conn->rx_len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007449 kfree_skb(conn->rx_skb);
7450 conn->rx_skb = NULL;
7451 conn->rx_len = 0;
7452 l2cap_conn_unreliable(conn, ECOMM);
7453 goto drop;
7454 }
7455
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007456 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007457 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007458 conn->rx_len -= skb->len;
7459
7460 if (!conn->rx_len) {
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007461 /* Complete frame received. l2cap_recv_frame
7462 * takes ownership of the skb so set the global
7463 * rx_skb pointer to NULL first.
7464 */
7465 struct sk_buff *rx_skb = conn->rx_skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007466 conn->rx_skb = NULL;
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007467 l2cap_recv_frame(conn, rx_skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007468 }
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007469 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007470 }
7471
7472drop:
7473 kfree_skb(skb);
7474 return 0;
7475}
7476
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007477static int l2cap_debugfs_show(struct seq_file *f, void *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007478{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007479 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007480
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007481 read_lock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007482
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007483 list_for_each_entry(c, &chan_list, global_l) {
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03007484 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 -07007485 &c->src, &c->dst,
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03007486 c->state, __le16_to_cpu(c->psm),
7487 c->scid, c->dcid, c->imtu, c->omtu,
7488 c->sec_level, c->mode);
Andrei Emeltchenko61e1b4b2012-01-19 11:19:50 +02007489 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007490
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007491 read_unlock(&chan_list_lock);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007492
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007493 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007494}
7495
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007496static int l2cap_debugfs_open(struct inode *inode, struct file *file)
7497{
7498 return single_open(file, l2cap_debugfs_show, inode->i_private);
7499}
7500
7501static const struct file_operations l2cap_debugfs_fops = {
7502 .open = l2cap_debugfs_open,
7503 .read = seq_read,
7504 .llseek = seq_lseek,
7505 .release = single_release,
7506};
7507
7508static struct dentry *l2cap_debugfs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007509
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007510int __init l2cap_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007511{
7512 int err;
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007513
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007514 err = l2cap_init_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007515 if (err < 0)
7516 return err;
7517
Marcel Holtmann1120e4b2013-10-17 17:24:16 -07007518 if (IS_ERR_OR_NULL(bt_debugfs))
7519 return 0;
7520
7521 l2cap_debugfs = debugfs_create_file("l2cap", 0444, bt_debugfs,
7522 NULL, &l2cap_debugfs_fops);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007523
Samuel Ortiz40b93972014-05-14 17:53:35 +02007524 debugfs_create_u16("l2cap_le_max_credits", 0644, bt_debugfs,
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02007525 &le_max_credits);
Samuel Ortiz40b93972014-05-14 17:53:35 +02007526 debugfs_create_u16("l2cap_le_default_mps", 0644, bt_debugfs,
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02007527 &le_default_mps);
7528
Linus Torvalds1da177e2005-04-16 15:20:36 -07007529 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007530}
7531
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007532void l2cap_exit(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007533{
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007534 debugfs_remove(l2cap_debugfs);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007535 l2cap_cleanup_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007536}
7537
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03007538module_param(disable_ertm, bool, 0644);
7539MODULE_PARM_DESC(disable_ertm, "Disable enhanced retransmission mode");