blob: 3dca28246cbee537e87f69335a9371b9a342c13d [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"
Jukka Rissanen18722c22013-12-11 17:05:37 +020043#include "6lowpan.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070044
Johan Hedberg0f1bfe42014-01-27 15:11:35 -080045#define LE_FLOWCTL_MAX_CREDITS 65535
46
Mat Martineaud1de6d42012-05-17 20:53:55 -070047bool disable_ertm;
Marcel Holtmannf0709e02007-10-20 13:38:51 +020048
Marcel Holtmann547d1032013-10-12 08:18:19 -070049static u32 l2cap_feat_mask = L2CAP_FEAT_FIXED_CHAN | L2CAP_FEAT_UCD;
Marcel Holtmannd40bffb2013-10-12 08:18:18 -070050static u8 l2cap_fixed_chan[8] = { L2CAP_FC_L2CAP | L2CAP_FC_CONNLESS, };
Linus Torvalds1da177e2005-04-16 15:20:36 -070051
Johannes Bergb5ad8b72011-06-01 08:54:45 +020052static LIST_HEAD(chan_list);
53static DEFINE_RWLOCK(chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -070054
Johan Hedbergf15b8ec2013-12-03 15:08:25 +020055static u16 le_max_credits = L2CAP_LE_MAX_CREDITS;
56static u16 le_default_mps = L2CAP_LE_DEFAULT_MPS;
57
Linus Torvalds1da177e2005-04-16 15:20:36 -070058static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +010059 u8 code, u8 ident, u16 dlen, void *data);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -030060static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len,
Gustavo Padovan2d792812012-10-06 10:07:01 +010061 void *data);
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -030062static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +020063static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err);
Linus Torvalds1da177e2005-04-16 15:20:36 -070064
Gustavo Padovand6603662012-05-21 13:58:22 -030065static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
Gustavo Padovan2d792812012-10-06 10:07:01 +010066 struct sk_buff_head *skbs, u8 event);
Mat Martineau608bcc62012-05-17 20:53:32 -070067
Marcel Holtmann4f1654e2013-10-13 08:50:41 -070068static inline __u8 bdaddr_type(struct hci_conn *hcon, __u8 type)
69{
70 if (hcon->type == LE_LINK) {
71 if (type == ADDR_LE_DEV_PUBLIC)
72 return BDADDR_LE_PUBLIC;
73 else
74 return BDADDR_LE_RANDOM;
75 }
76
77 return BDADDR_BREDR;
78}
79
Marcel Holtmann01394182006-07-03 10:02:46 +020080/* ---- L2CAP channels ---- */
Gustavo F. Padovan71ba0e52011-05-17 14:34:52 -030081
Gustavo Padovan2d792812012-10-06 10:07:01 +010082static struct l2cap_chan *__l2cap_get_chan_by_dcid(struct l2cap_conn *conn,
83 u16 cid)
Marcel Holtmann01394182006-07-03 10:02:46 +020084{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020085 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -030086
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020087 list_for_each_entry(c, &conn->chan_l, list) {
88 if (c->dcid == cid)
89 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +020090 }
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020091 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +020092}
93
Gustavo Padovan2d792812012-10-06 10:07:01 +010094static struct l2cap_chan *__l2cap_get_chan_by_scid(struct l2cap_conn *conn,
95 u16 cid)
Marcel Holtmann01394182006-07-03 10:02:46 +020096{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020097 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -030098
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020099 list_for_each_entry(c, &conn->chan_l, list) {
100 if (c->scid == cid)
101 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +0200102 }
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200103 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200104}
105
106/* Find channel with given SCID.
Mat Martineauef191ad2012-05-02 09:42:00 -0700107 * Returns locked channel. */
Gustavo Padovan2d792812012-10-06 10:07:01 +0100108static struct l2cap_chan *l2cap_get_chan_by_scid(struct l2cap_conn *conn,
109 u16 cid)
Marcel Holtmann01394182006-07-03 10:02:46 +0200110{
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300111 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300112
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200113 mutex_lock(&conn->chan_lock);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300114 c = __l2cap_get_chan_by_scid(conn, cid);
Mat Martineauef191ad2012-05-02 09:42:00 -0700115 if (c)
116 l2cap_chan_lock(c);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200117 mutex_unlock(&conn->chan_lock);
118
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300119 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +0200120}
121
Mat Martineaub1a130b2012-10-23 15:24:09 -0700122/* Find channel with given DCID.
123 * Returns locked channel.
124 */
125static struct l2cap_chan *l2cap_get_chan_by_dcid(struct l2cap_conn *conn,
126 u16 cid)
127{
128 struct l2cap_chan *c;
129
130 mutex_lock(&conn->chan_lock);
131 c = __l2cap_get_chan_by_dcid(conn, cid);
132 if (c)
133 l2cap_chan_lock(c);
134 mutex_unlock(&conn->chan_lock);
135
136 return c;
137}
138
Gustavo Padovan2d792812012-10-06 10:07:01 +0100139static struct l2cap_chan *__l2cap_get_chan_by_ident(struct l2cap_conn *conn,
140 u8 ident)
Marcel Holtmann01394182006-07-03 10:02:46 +0200141{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200142 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300143
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200144 list_for_each_entry(c, &conn->chan_l, list) {
145 if (c->ident == ident)
146 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +0200147 }
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200148 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200149}
150
Mat Martineau5b155ef2012-10-23 15:24:14 -0700151static struct l2cap_chan *l2cap_get_chan_by_ident(struct l2cap_conn *conn,
152 u8 ident)
153{
154 struct l2cap_chan *c;
155
156 mutex_lock(&conn->chan_lock);
157 c = __l2cap_get_chan_by_ident(conn, ident);
158 if (c)
159 l2cap_chan_lock(c);
160 mutex_unlock(&conn->chan_lock);
161
162 return c;
163}
164
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300165static struct l2cap_chan *__l2cap_global_chan_by_addr(__le16 psm, bdaddr_t *src)
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300166{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300167 struct l2cap_chan *c;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300168
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300169 list_for_each_entry(c, &chan_list, global_l) {
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700170 if (c->sport == psm && !bacmp(&c->src, src))
Szymon Janc250938c2011-11-16 09:32:22 +0100171 return c;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300172 }
Szymon Janc250938c2011-11-16 09:32:22 +0100173 return NULL;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300174}
175
176int l2cap_add_psm(struct l2cap_chan *chan, bdaddr_t *src, __le16 psm)
177{
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300178 int err;
179
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200180 write_lock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300181
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300182 if (psm && __l2cap_global_chan_by_addr(psm, src)) {
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300183 err = -EADDRINUSE;
184 goto done;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300185 }
186
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300187 if (psm) {
188 chan->psm = psm;
189 chan->sport = psm;
190 err = 0;
191 } else {
192 u16 p;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300193
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300194 err = -EINVAL;
195 for (p = 0x1001; p < 0x1100; p += 2)
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300196 if (!__l2cap_global_chan_by_addr(cpu_to_le16(p), src)) {
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300197 chan->psm = cpu_to_le16(p);
198 chan->sport = cpu_to_le16(p);
199 err = 0;
200 break;
201 }
202 }
203
204done:
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200205 write_unlock(&chan_list_lock);
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300206 return err;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300207}
208
209int l2cap_add_scid(struct l2cap_chan *chan, __u16 scid)
210{
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200211 write_lock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300212
213 chan->scid = scid;
214
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200215 write_unlock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300216
217 return 0;
218}
219
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300220static u16 l2cap_alloc_cid(struct l2cap_conn *conn)
Marcel Holtmann01394182006-07-03 10:02:46 +0200221{
Johan Hedberge77af752013-10-08 10:31:00 +0200222 u16 cid, dyn_end;
Marcel Holtmann01394182006-07-03 10:02:46 +0200223
Johan Hedberge77af752013-10-08 10:31:00 +0200224 if (conn->hcon->type == LE_LINK)
225 dyn_end = L2CAP_CID_LE_DYN_END;
226 else
227 dyn_end = L2CAP_CID_DYN_END;
228
229 for (cid = L2CAP_CID_DYN_START; cid < dyn_end; cid++) {
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300230 if (!__l2cap_get_chan_by_scid(conn, cid))
Marcel Holtmann01394182006-07-03 10:02:46 +0200231 return cid;
232 }
233
234 return 0;
235}
236
Gustavo Padovanf93fa272013-10-21 14:21:40 -0200237static void l2cap_state_change(struct l2cap_chan *chan, int state)
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300238{
Andrei Emeltchenko42d2d872012-02-17 11:40:57 +0200239 BT_DBG("chan %p %s -> %s", chan, state_to_string(chan->state),
Gustavo Padovan2d792812012-10-06 10:07:01 +0100240 state_to_string(state));
Gustavo F. Padovanbadaaa02011-11-23 20:11:46 -0200241
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300242 chan->state = state;
Gustavo Padovan53f52122013-10-15 19:24:45 -0300243 chan->ops->state_change(chan, state, 0);
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300244}
245
Gustavo Padovanf8e73012013-10-15 19:24:46 -0300246static inline void l2cap_state_change_and_error(struct l2cap_chan *chan,
247 int state, int err)
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +0200248{
Gustavo Padovanf8e73012013-10-15 19:24:46 -0300249 chan->state = state;
Gustavo Padovan53f52122013-10-15 19:24:45 -0300250 chan->ops->state_change(chan, chan->state, err);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +0200251}
252
253static inline void l2cap_chan_set_err(struct l2cap_chan *chan, int err)
254{
Gustavo Padovanf8e73012013-10-15 19:24:46 -0300255 chan->ops->state_change(chan, chan->state, err);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +0200256}
257
Mat Martineau4239d162012-05-17 20:53:49 -0700258static void __set_retrans_timer(struct l2cap_chan *chan)
259{
260 if (!delayed_work_pending(&chan->monitor_timer) &&
261 chan->retrans_timeout) {
262 l2cap_set_timer(chan, &chan->retrans_timer,
263 msecs_to_jiffies(chan->retrans_timeout));
264 }
265}
266
267static void __set_monitor_timer(struct l2cap_chan *chan)
268{
269 __clear_retrans_timer(chan);
270 if (chan->monitor_timeout) {
271 l2cap_set_timer(chan, &chan->monitor_timer,
272 msecs_to_jiffies(chan->monitor_timeout));
273 }
274}
275
Mat Martineau608bcc62012-05-17 20:53:32 -0700276static struct sk_buff *l2cap_ertm_seq_in_queue(struct sk_buff_head *head,
277 u16 seq)
278{
279 struct sk_buff *skb;
280
281 skb_queue_walk(head, skb) {
282 if (bt_cb(skb)->control.txseq == seq)
283 return skb;
284 }
285
286 return NULL;
287}
288
Mat Martineau3c588192012-04-11 10:48:42 -0700289/* ---- L2CAP sequence number lists ---- */
290
291/* For ERTM, ordered lists of sequence numbers must be tracked for
292 * SREJ requests that are received and for frames that are to be
293 * retransmitted. These seq_list functions implement a singly-linked
294 * list in an array, where membership in the list can also be checked
295 * in constant time. Items can also be added to the tail of the list
296 * and removed from the head in constant time, without further memory
297 * allocs or frees.
298 */
299
300static int l2cap_seq_list_init(struct l2cap_seq_list *seq_list, u16 size)
301{
302 size_t alloc_size, i;
303
304 /* Allocated size is a power of 2 to map sequence numbers
305 * (which may be up to 14 bits) in to a smaller array that is
306 * sized for the negotiated ERTM transmit windows.
307 */
308 alloc_size = roundup_pow_of_two(size);
309
310 seq_list->list = kmalloc(sizeof(u16) * alloc_size, GFP_KERNEL);
311 if (!seq_list->list)
312 return -ENOMEM;
313
314 seq_list->mask = alloc_size - 1;
315 seq_list->head = L2CAP_SEQ_LIST_CLEAR;
316 seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
317 for (i = 0; i < alloc_size; i++)
318 seq_list->list[i] = L2CAP_SEQ_LIST_CLEAR;
319
320 return 0;
321}
322
323static inline void l2cap_seq_list_free(struct l2cap_seq_list *seq_list)
324{
325 kfree(seq_list->list);
326}
327
328static inline bool l2cap_seq_list_contains(struct l2cap_seq_list *seq_list,
329 u16 seq)
330{
331 /* Constant-time check for list membership */
332 return seq_list->list[seq & seq_list->mask] != L2CAP_SEQ_LIST_CLEAR;
333}
334
Mat Martineau3c588192012-04-11 10:48:42 -0700335static inline u16 l2cap_seq_list_pop(struct l2cap_seq_list *seq_list)
336{
Johan Hedberg03a0c5d2014-01-18 21:32:59 +0200337 u16 seq = seq_list->head;
338 u16 mask = seq_list->mask;
339
340 seq_list->head = seq_list->list[seq & mask];
341 seq_list->list[seq & mask] = L2CAP_SEQ_LIST_CLEAR;
342
343 if (seq_list->head == L2CAP_SEQ_LIST_TAIL) {
344 seq_list->head = L2CAP_SEQ_LIST_CLEAR;
345 seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
346 }
347
348 return seq;
Mat Martineau3c588192012-04-11 10:48:42 -0700349}
350
351static void l2cap_seq_list_clear(struct l2cap_seq_list *seq_list)
352{
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300353 u16 i;
Mat Martineau3c588192012-04-11 10:48:42 -0700354
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300355 if (seq_list->head == L2CAP_SEQ_LIST_CLEAR)
356 return;
357
358 for (i = 0; i <= seq_list->mask; i++)
359 seq_list->list[i] = L2CAP_SEQ_LIST_CLEAR;
360
361 seq_list->head = L2CAP_SEQ_LIST_CLEAR;
362 seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
Mat Martineau3c588192012-04-11 10:48:42 -0700363}
364
365static void l2cap_seq_list_append(struct l2cap_seq_list *seq_list, u16 seq)
366{
367 u16 mask = seq_list->mask;
368
369 /* All appends happen in constant time */
370
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300371 if (seq_list->list[seq & mask] != L2CAP_SEQ_LIST_CLEAR)
372 return;
Mat Martineau3c588192012-04-11 10:48:42 -0700373
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300374 if (seq_list->tail == L2CAP_SEQ_LIST_CLEAR)
375 seq_list->head = seq;
376 else
377 seq_list->list[seq_list->tail & mask] = seq;
378
379 seq_list->tail = seq;
380 seq_list->list[seq & mask] = L2CAP_SEQ_LIST_TAIL;
Mat Martineau3c588192012-04-11 10:48:42 -0700381}
382
Gustavo F. Padovan721c4182011-06-23 19:29:58 -0300383static void l2cap_chan_timeout(struct work_struct *work)
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300384{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -0300385 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100386 chan_timer.work);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200387 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300388 int reason;
389
Andrei Emeltchenkoe05dcc32012-02-17 11:40:56 +0200390 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300391
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200392 mutex_lock(&conn->chan_lock);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200393 l2cap_chan_lock(chan);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300394
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300395 if (chan->state == BT_CONNECTED || chan->state == BT_CONFIG)
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300396 reason = ECONNREFUSED;
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300397 else if (chan->state == BT_CONNECT &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100398 chan->sec_level != BT_SECURITY_SDP)
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300399 reason = ECONNREFUSED;
400 else
401 reason = ETIMEDOUT;
402
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300403 l2cap_chan_close(chan, reason);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300404
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200405 l2cap_chan_unlock(chan);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300406
Gustavo Padovan80b98022012-05-27 22:27:51 -0300407 chan->ops->close(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200408 mutex_unlock(&conn->chan_lock);
409
Ulisses Furquim371fd832011-12-21 20:02:36 -0200410 l2cap_chan_put(chan);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300411}
412
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -0300413struct l2cap_chan *l2cap_chan_create(void)
Marcel Holtmann01394182006-07-03 10:02:46 +0200414{
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300415 struct l2cap_chan *chan;
Marcel Holtmann01394182006-07-03 10:02:46 +0200416
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300417 chan = kzalloc(sizeof(*chan), GFP_ATOMIC);
418 if (!chan)
419 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200420
Andrei Emeltchenkoc03b3552012-02-21 12:54:56 +0200421 mutex_init(&chan->lock);
422
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200423 write_lock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300424 list_add(&chan->global_l, &chan_list);
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200425 write_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300426
Gustavo F. Padovan721c4182011-06-23 19:29:58 -0300427 INIT_DELAYED_WORK(&chan->chan_timer, l2cap_chan_timeout);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300428
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300429 chan->state = BT_OPEN;
430
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530431 kref_init(&chan->kref);
Gustavo F. Padovan71ba0e52011-05-17 14:34:52 -0300432
Mat Martineau28270112012-05-17 21:14:09 -0700433 /* This flag is cleared in l2cap_chan_ready() */
434 set_bit(CONF_NOT_COMPLETE, &chan->conf_state);
435
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -0300436 BT_DBG("chan %p", chan);
Szymon Jancabc545b2011-11-03 16:05:44 +0100437
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300438 return chan;
Marcel Holtmann01394182006-07-03 10:02:46 +0200439}
440
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530441static void l2cap_chan_destroy(struct kref *kref)
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300442{
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530443 struct l2cap_chan *chan = container_of(kref, struct l2cap_chan, kref);
444
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +0530445 BT_DBG("chan %p", chan);
446
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200447 write_lock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300448 list_del(&chan->global_l);
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200449 write_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300450
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +0530451 kfree(chan);
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300452}
453
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530454void l2cap_chan_hold(struct l2cap_chan *c)
455{
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530456 BT_DBG("chan %p orig refcnt %d", c, atomic_read(&c->kref.refcount));
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530457
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530458 kref_get(&c->kref);
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530459}
460
461void l2cap_chan_put(struct l2cap_chan *c)
462{
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530463 BT_DBG("chan %p orig refcnt %d", c, atomic_read(&c->kref.refcount));
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530464
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530465 kref_put(&c->kref, l2cap_chan_destroy);
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530466}
467
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300468void l2cap_chan_set_defaults(struct l2cap_chan *chan)
469{
470 chan->fcs = L2CAP_FCS_CRC16;
471 chan->max_tx = L2CAP_DEFAULT_MAX_TX;
472 chan->tx_win = L2CAP_DEFAULT_TX_WINDOW;
473 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
Jukka Rissanen6a5e8162014-05-28 14:43:04 +0300474 chan->remote_max_tx = chan->max_tx;
475 chan->remote_tx_win = chan->tx_win;
Mat Martineauc20f8e32012-07-10 05:47:07 -0700476 chan->ack_win = L2CAP_DEFAULT_TX_WINDOW;
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300477 chan->sec_level = BT_SECURITY_LOW;
Jukka Rissanen6a5e8162014-05-28 14:43:04 +0300478 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
479 chan->retrans_timeout = L2CAP_DEFAULT_RETRANS_TO;
480 chan->monitor_timeout = L2CAP_DEFAULT_MONITOR_TO;
481 chan->conf_state = 0;
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300482
483 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
484}
485
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200486static void l2cap_le_flowctl_init(struct l2cap_chan *chan)
Johan Hedberg38319712013-05-17 12:49:23 +0300487{
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200488 chan->sdu = NULL;
489 chan->sdu_last_frag = NULL;
490 chan->sdu_len = 0;
Johan Hedberg0cd75f72013-05-17 13:09:05 +0300491 chan->tx_credits = 0;
Johan Hedbergf15b8ec2013-12-03 15:08:25 +0200492 chan->rx_credits = le_max_credits;
Johan Hedbergd1d79412014-01-27 15:11:33 -0800493 chan->mps = min_t(u16, chan->imtu, le_default_mps);
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200494
495 skb_queue_head_init(&chan->tx_q);
Johan Hedberg38319712013-05-17 12:49:23 +0300496}
497
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +0300498void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
Marcel Holtmann01394182006-07-03 10:02:46 +0200499{
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -0300500 BT_DBG("conn %p, psm 0x%2.2x, dcid 0x%4.4x", conn,
Andrei Emeltchenko097db762012-03-09 14:16:17 +0200501 __le16_to_cpu(chan->psm), chan->dcid);
Marcel Holtmann01394182006-07-03 10:02:46 +0200502
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +0200503 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
Marcel Holtmann2950f212009-02-12 14:02:50 +0100504
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300505 chan->conn = conn;
Marcel Holtmann01394182006-07-03 10:02:46 +0200506
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200507 switch (chan->chan_type) {
508 case L2CAP_CHAN_CONN_ORIENTED:
Johan Hedberg21626e62014-01-24 10:35:41 +0200509 /* Alloc CID for connection-oriented socket */
510 chan->scid = l2cap_alloc_cid(conn);
511 if (conn->hcon->type == ACL_LINK)
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300512 chan->omtu = L2CAP_DEFAULT_MTU;
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200513 break;
514
515 case L2CAP_CHAN_CONN_LESS:
Marcel Holtmann01394182006-07-03 10:02:46 +0200516 /* Connectionless socket */
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300517 chan->scid = L2CAP_CID_CONN_LESS;
518 chan->dcid = L2CAP_CID_CONN_LESS;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300519 chan->omtu = L2CAP_DEFAULT_MTU;
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200520 break;
521
Johan Hedberg2338a7e2014-01-24 10:35:40 +0200522 case L2CAP_CHAN_FIXED:
523 /* Caller will set CID and CID specific MTU values */
Andrei Emeltchenko416fa752012-05-29 13:59:16 +0300524 break;
525
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200526 default:
Marcel Holtmann01394182006-07-03 10:02:46 +0200527 /* Raw socket can send/recv signalling messages only */
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300528 chan->scid = L2CAP_CID_SIGNALING;
529 chan->dcid = L2CAP_CID_SIGNALING;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300530 chan->omtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann01394182006-07-03 10:02:46 +0200531 }
532
Andrei Emeltchenko8f7975b2011-10-13 16:18:54 +0300533 chan->local_id = L2CAP_BESTEFFORT_ID;
534 chan->local_stype = L2CAP_SERV_BESTEFFORT;
535 chan->local_msdu = L2CAP_DEFAULT_MAX_SDU_SIZE;
536 chan->local_sdu_itime = L2CAP_DEFAULT_SDU_ITIME;
537 chan->local_acc_lat = L2CAP_DEFAULT_ACC_LAT;
Andrei Emeltchenko8936fa62012-10-08 11:14:41 +0300538 chan->local_flush_to = L2CAP_EFS_DEFAULT_FLUSH_TO;
Andrei Emeltchenko8f7975b2011-10-13 16:18:54 +0300539
Ulisses Furquim371fd832011-12-21 20:02:36 -0200540 l2cap_chan_hold(chan);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300541
Johan Hedberg5ee98912013-04-29 19:35:43 +0300542 hci_conn_hold(conn->hcon);
543
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200544 list_add(&chan->list, &conn->chan_l);
Andrei Emeltchenko643162a2012-02-22 17:11:55 +0200545}
546
Andrei Emeltchenko466f8002012-05-29 13:59:01 +0300547void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
Andrei Emeltchenko643162a2012-02-22 17:11:55 +0200548{
549 mutex_lock(&conn->chan_lock);
550 __l2cap_chan_add(conn, chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200551 mutex_unlock(&conn->chan_lock);
Marcel Holtmann01394182006-07-03 10:02:46 +0200552}
553
Andrei Emeltchenko466f8002012-05-29 13:59:01 +0300554void l2cap_chan_del(struct l2cap_chan *chan, int err)
Marcel Holtmann01394182006-07-03 10:02:46 +0200555{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300556 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann01394182006-07-03 10:02:46 +0200557
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -0300558 __clear_chan_timer(chan);
Marcel Holtmann01394182006-07-03 10:02:46 +0200559
Gustavo F. Padovan49208c92011-04-04 15:59:54 -0300560 BT_DBG("chan %p, conn %p, err %d", chan, conn, err);
Marcel Holtmann01394182006-07-03 10:02:46 +0200561
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900562 if (conn) {
Andrei Emeltchenko56f60982012-10-15 11:58:44 +0300563 struct amp_mgr *mgr = conn->hcon->amp_mgr;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300564 /* Delete from channel list */
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200565 list_del(&chan->list);
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -0200566
Ulisses Furquim371fd832011-12-21 20:02:36 -0200567 l2cap_chan_put(chan);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300568
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300569 chan->conn = NULL;
Andrei Emeltchenko3cabbfd2012-05-31 11:01:37 +0300570
Johan Hedberg2338a7e2014-01-24 10:35:40 +0200571 if (chan->scid != L2CAP_CID_A2MP)
David Herrmann76a68ba2013-04-06 20:28:37 +0200572 hci_conn_drop(conn->hcon);
Andrei Emeltchenko56f60982012-10-15 11:58:44 +0300573
574 if (mgr && mgr->bredr_chan == chan)
575 mgr->bredr_chan = NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200576 }
577
Andrei Emeltchenko419e08c2012-10-31 15:46:34 +0200578 if (chan->hs_hchan) {
579 struct hci_chan *hs_hchan = chan->hs_hchan;
580
581 BT_DBG("chan %p disconnect hs_hchan %p", chan, hs_hchan);
582 amp_disconnect_logical_link(hs_hchan);
583 }
584
Gustavo Padovanb699ec02012-10-06 11:51:54 +0100585 chan->ops->teardown(chan, err);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200586
Mat Martineau28270112012-05-17 21:14:09 -0700587 if (test_bit(CONF_NOT_COMPLETE, &chan->conf_state))
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300588 return;
Gustavo F. Padovan2ead70b2011-04-01 15:13:36 -0300589
Gustavo Padovanee556f62012-05-18 20:22:38 -0300590 switch(chan->mode) {
591 case L2CAP_MODE_BASIC:
592 break;
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300593
Johan Hedberg38319712013-05-17 12:49:23 +0300594 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedberg177f8f22013-05-31 17:54:51 +0300595 skb_queue_purge(&chan->tx_q);
Johan Hedberg38319712013-05-17 12:49:23 +0300596 break;
597
Gustavo Padovanee556f62012-05-18 20:22:38 -0300598 case L2CAP_MODE_ERTM:
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -0300599 __clear_retrans_timer(chan);
600 __clear_monitor_timer(chan);
601 __clear_ack_timer(chan);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300602
Gustavo F. Padovanf1c67752011-03-25 20:36:10 -0300603 skb_queue_purge(&chan->srej_q);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300604
Mat Martineau3c588192012-04-11 10:48:42 -0700605 l2cap_seq_list_free(&chan->srej_list);
606 l2cap_seq_list_free(&chan->retrans_list);
Gustavo Padovanee556f62012-05-18 20:22:38 -0300607
608 /* fall through */
609
610 case L2CAP_MODE_STREAMING:
611 skb_queue_purge(&chan->tx_q);
612 break;
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300613 }
Gustavo Padovanee556f62012-05-18 20:22:38 -0300614
615 return;
Marcel Holtmann01394182006-07-03 10:02:46 +0200616}
617
Johan Hedberg387a33e2014-02-18 21:41:33 +0200618void l2cap_conn_update_id_addr(struct hci_conn *hcon)
619{
620 struct l2cap_conn *conn = hcon->l2cap_data;
621 struct l2cap_chan *chan;
622
623 mutex_lock(&conn->chan_lock);
624
625 list_for_each_entry(chan, &conn->chan_l, list) {
626 l2cap_chan_lock(chan);
627 bacpy(&chan->dst, &hcon->dst);
628 chan->dst_type = bdaddr_type(hcon, hcon->dst_type);
629 l2cap_chan_unlock(chan);
630 }
631
632 mutex_unlock(&conn->chan_lock);
633}
634
Johan Hedberg27e2d4c2013-05-14 13:27:21 +0300635static void l2cap_chan_le_connect_reject(struct l2cap_chan *chan)
636{
637 struct l2cap_conn *conn = chan->conn;
638 struct l2cap_le_conn_rsp rsp;
639 u16 result;
640
641 if (test_bit(FLAG_DEFER_SETUP, &chan->flags))
642 result = L2CAP_CR_AUTHORIZATION;
643 else
644 result = L2CAP_CR_BAD_PSM;
645
646 l2cap_state_change(chan, BT_DISCONN);
647
648 rsp.dcid = cpu_to_le16(chan->scid);
649 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +0200650 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +0300651 rsp.credits = cpu_to_le16(chan->rx_credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +0300652 rsp.result = cpu_to_le16(result);
653
654 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp),
655 &rsp);
656}
657
Johan Hedberg791d60f2013-05-14 22:24:44 +0300658static void l2cap_chan_connect_reject(struct l2cap_chan *chan)
659{
660 struct l2cap_conn *conn = chan->conn;
661 struct l2cap_conn_rsp rsp;
662 u16 result;
663
664 if (test_bit(FLAG_DEFER_SETUP, &chan->flags))
665 result = L2CAP_CR_SEC_BLOCK;
666 else
667 result = L2CAP_CR_BAD_PSM;
668
669 l2cap_state_change(chan, BT_DISCONN);
670
671 rsp.scid = cpu_to_le16(chan->dcid);
672 rsp.dcid = cpu_to_le16(chan->scid);
673 rsp.result = cpu_to_le16(result);
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700674 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Johan Hedberg791d60f2013-05-14 22:24:44 +0300675
676 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, sizeof(rsp), &rsp);
677}
678
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300679void l2cap_chan_close(struct l2cap_chan *chan, int reason)
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300680{
681 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300682
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700683 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300684
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300685 switch (chan->state) {
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300686 case BT_LISTEN:
Gustavo Padovanb699ec02012-10-06 11:51:54 +0100687 chan->ops->teardown(chan, 0);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300688 break;
689
690 case BT_CONNECTED:
691 case BT_CONFIG:
Johan Hedberg7b25c9b2014-01-28 15:28:04 -0800692 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED) {
Gustavo Padovan8d836d72013-10-15 19:24:47 -0300693 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +0200694 l2cap_send_disconn_req(chan, reason);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300695 } else
696 l2cap_chan_del(chan, reason);
697 break;
698
699 case BT_CONNECT2:
Johan Hedberg791d60f2013-05-14 22:24:44 +0300700 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED) {
701 if (conn->hcon->type == ACL_LINK)
702 l2cap_chan_connect_reject(chan);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +0300703 else if (conn->hcon->type == LE_LINK)
704 l2cap_chan_le_connect_reject(chan);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300705 }
706
707 l2cap_chan_del(chan, reason);
708 break;
709
710 case BT_CONNECT:
711 case BT_DISCONN:
712 l2cap_chan_del(chan, reason);
713 break;
714
715 default:
Gustavo Padovanb699ec02012-10-06 11:51:54 +0100716 chan->ops->teardown(chan, 0);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300717 break;
718 }
719}
720
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300721static inline u8 l2cap_get_auth_type(struct l2cap_chan *chan)
Johan Hedberg8556edd32011-01-19 12:06:50 +0530722{
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700723 switch (chan->chan_type) {
724 case L2CAP_CHAN_RAW:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300725 switch (chan->sec_level) {
Johan Hedberg8556edd32011-01-19 12:06:50 +0530726 case BT_SECURITY_HIGH:
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800727 case BT_SECURITY_FIPS:
Johan Hedberg8556edd32011-01-19 12:06:50 +0530728 return HCI_AT_DEDICATED_BONDING_MITM;
729 case BT_SECURITY_MEDIUM:
730 return HCI_AT_DEDICATED_BONDING;
731 default:
732 return HCI_AT_NO_BONDING;
733 }
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700734 break;
Marcel Holtmann3124b842013-10-12 07:19:32 -0700735 case L2CAP_CHAN_CONN_LESS:
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700736 if (chan->psm == cpu_to_le16(L2CAP_PSM_3DSP)) {
Marcel Holtmann3124b842013-10-12 07:19:32 -0700737 if (chan->sec_level == BT_SECURITY_LOW)
738 chan->sec_level = BT_SECURITY_SDP;
739 }
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800740 if (chan->sec_level == BT_SECURITY_HIGH ||
741 chan->sec_level == BT_SECURITY_FIPS)
Marcel Holtmann3124b842013-10-12 07:19:32 -0700742 return HCI_AT_NO_BONDING_MITM;
743 else
744 return HCI_AT_NO_BONDING;
745 break;
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700746 case L2CAP_CHAN_CONN_ORIENTED:
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700747 if (chan->psm == cpu_to_le16(L2CAP_PSM_SDP)) {
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700748 if (chan->sec_level == BT_SECURITY_LOW)
749 chan->sec_level = BT_SECURITY_SDP;
Johan Hedberg8556edd32011-01-19 12:06:50 +0530750
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800751 if (chan->sec_level == BT_SECURITY_HIGH ||
752 chan->sec_level == BT_SECURITY_FIPS)
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700753 return HCI_AT_NO_BONDING_MITM;
754 else
755 return HCI_AT_NO_BONDING;
756 }
757 /* fall through */
758 default:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300759 switch (chan->sec_level) {
Johan Hedberg8556edd32011-01-19 12:06:50 +0530760 case BT_SECURITY_HIGH:
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800761 case BT_SECURITY_FIPS:
Johan Hedberg8556edd32011-01-19 12:06:50 +0530762 return HCI_AT_GENERAL_BONDING_MITM;
763 case BT_SECURITY_MEDIUM:
764 return HCI_AT_GENERAL_BONDING;
765 default:
766 return HCI_AT_NO_BONDING;
767 }
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700768 break;
Johan Hedberg8556edd32011-01-19 12:06:50 +0530769 }
770}
771
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200772/* Service level security */
Gustavo F. Padovand45fc422011-11-05 19:54:24 -0200773int l2cap_chan_check_security(struct l2cap_chan *chan)
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200774{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300775 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100776 __u8 auth_type;
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200777
Johan Hedberga17de2f2013-05-14 13:25:37 +0300778 if (conn->hcon->type == LE_LINK)
779 return smp_conn_security(conn->hcon, chan->sec_level);
780
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300781 auth_type = l2cap_get_auth_type(chan);
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100782
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300783 return hci_conn_security(conn->hcon, chan->sec_level, auth_type);
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200784}
785
Johannes Bergb5ad8b72011-06-01 08:54:45 +0200786static u8 l2cap_get_ident(struct l2cap_conn *conn)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200787{
788 u8 id;
789
790 /* Get next available identificator.
791 * 1 - 128 are used by kernel.
792 * 129 - 199 are reserved.
793 * 200 - 254 are used by utilities like l2ping, etc.
794 */
795
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200796 spin_lock(&conn->lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200797
798 if (++conn->tx_ident > 128)
799 conn->tx_ident = 1;
800
801 id = conn->tx_ident;
802
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200803 spin_unlock(&conn->lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200804
805 return id;
806}
807
Gustavo Padovan2d792812012-10-06 10:07:01 +0100808static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len,
809 void *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200810{
811 struct sk_buff *skb = l2cap_build_cmd(conn, code, ident, len, data);
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +0200812 u8 flags;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200813
814 BT_DBG("code 0x%2.2x", code);
815
816 if (!skb)
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -0300817 return;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200818
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +0200819 if (lmp_no_flush_capable(conn->hcon->hdev))
820 flags = ACL_START_NO_FLUSH;
821 else
822 flags = ACL_START;
823
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700824 bt_cb(skb)->force_active = BT_POWER_FORCE_ACTIVE_ON;
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +0200825 skb->priority = HCI_PRIO_MAX;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700826
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200827 hci_send_acl(conn->hchan, skb, flags);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200828}
829
Mat Martineau02b0fbb2012-10-23 15:24:10 -0700830static bool __chan_is_moving(struct l2cap_chan *chan)
831{
832 return chan->move_state != L2CAP_MOVE_STABLE &&
833 chan->move_state != L2CAP_MOVE_WAIT_PREPARE;
834}
835
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200836static void l2cap_do_send(struct l2cap_chan *chan, struct sk_buff *skb)
837{
838 struct hci_conn *hcon = chan->conn->hcon;
839 u16 flags;
840
841 BT_DBG("chan %p, skb %p len %d priority %u", chan, skb, skb->len,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100842 skb->priority);
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200843
Mat Martineaud5f8a752012-10-23 15:24:18 -0700844 if (chan->hs_hcon && !__chan_is_moving(chan)) {
845 if (chan->hs_hchan)
846 hci_send_acl(chan->hs_hchan, skb, ACL_COMPLETE);
847 else
848 kfree_skb(skb);
849
850 return;
851 }
852
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200853 if (!test_bit(FLAG_FLUSHABLE, &chan->flags) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100854 lmp_no_flush_capable(hcon->hdev))
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200855 flags = ACL_START_NO_FLUSH;
856 else
857 flags = ACL_START;
858
859 bt_cb(skb)->force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
860 hci_send_acl(chan->conn->hchan, skb, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700861}
862
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700863static void __unpack_enhanced_control(u16 enh, struct l2cap_ctrl *control)
864{
865 control->reqseq = (enh & L2CAP_CTRL_REQSEQ) >> L2CAP_CTRL_REQSEQ_SHIFT;
866 control->final = (enh & L2CAP_CTRL_FINAL) >> L2CAP_CTRL_FINAL_SHIFT;
867
868 if (enh & L2CAP_CTRL_FRAME_TYPE) {
869 /* S-Frame */
870 control->sframe = 1;
871 control->poll = (enh & L2CAP_CTRL_POLL) >> L2CAP_CTRL_POLL_SHIFT;
872 control->super = (enh & L2CAP_CTRL_SUPERVISE) >> L2CAP_CTRL_SUPER_SHIFT;
873
874 control->sar = 0;
875 control->txseq = 0;
876 } else {
877 /* I-Frame */
878 control->sframe = 0;
879 control->sar = (enh & L2CAP_CTRL_SAR) >> L2CAP_CTRL_SAR_SHIFT;
880 control->txseq = (enh & L2CAP_CTRL_TXSEQ) >> L2CAP_CTRL_TXSEQ_SHIFT;
881
882 control->poll = 0;
883 control->super = 0;
884 }
885}
886
887static void __unpack_extended_control(u32 ext, struct l2cap_ctrl *control)
888{
889 control->reqseq = (ext & L2CAP_EXT_CTRL_REQSEQ) >> L2CAP_EXT_CTRL_REQSEQ_SHIFT;
890 control->final = (ext & L2CAP_EXT_CTRL_FINAL) >> L2CAP_EXT_CTRL_FINAL_SHIFT;
891
892 if (ext & L2CAP_EXT_CTRL_FRAME_TYPE) {
893 /* S-Frame */
894 control->sframe = 1;
895 control->poll = (ext & L2CAP_EXT_CTRL_POLL) >> L2CAP_EXT_CTRL_POLL_SHIFT;
896 control->super = (ext & L2CAP_EXT_CTRL_SUPERVISE) >> L2CAP_EXT_CTRL_SUPER_SHIFT;
897
898 control->sar = 0;
899 control->txseq = 0;
900 } else {
901 /* I-Frame */
902 control->sframe = 0;
903 control->sar = (ext & L2CAP_EXT_CTRL_SAR) >> L2CAP_EXT_CTRL_SAR_SHIFT;
904 control->txseq = (ext & L2CAP_EXT_CTRL_TXSEQ) >> L2CAP_EXT_CTRL_TXSEQ_SHIFT;
905
906 control->poll = 0;
907 control->super = 0;
908 }
909}
910
911static inline void __unpack_control(struct l2cap_chan *chan,
912 struct sk_buff *skb)
913{
914 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
915 __unpack_extended_control(get_unaligned_le32(skb->data),
916 &bt_cb(skb)->control);
Mat Martineaucec8ab6e2012-05-17 20:53:36 -0700917 skb_pull(skb, L2CAP_EXT_CTRL_SIZE);
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700918 } else {
919 __unpack_enhanced_control(get_unaligned_le16(skb->data),
920 &bt_cb(skb)->control);
Mat Martineaucec8ab6e2012-05-17 20:53:36 -0700921 skb_pull(skb, L2CAP_ENH_CTRL_SIZE);
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700922 }
923}
924
925static u32 __pack_extended_control(struct l2cap_ctrl *control)
926{
927 u32 packed;
928
929 packed = control->reqseq << L2CAP_EXT_CTRL_REQSEQ_SHIFT;
930 packed |= control->final << L2CAP_EXT_CTRL_FINAL_SHIFT;
931
932 if (control->sframe) {
933 packed |= control->poll << L2CAP_EXT_CTRL_POLL_SHIFT;
934 packed |= control->super << L2CAP_EXT_CTRL_SUPER_SHIFT;
935 packed |= L2CAP_EXT_CTRL_FRAME_TYPE;
936 } else {
937 packed |= control->sar << L2CAP_EXT_CTRL_SAR_SHIFT;
938 packed |= control->txseq << L2CAP_EXT_CTRL_TXSEQ_SHIFT;
939 }
940
941 return packed;
942}
943
944static u16 __pack_enhanced_control(struct l2cap_ctrl *control)
945{
946 u16 packed;
947
948 packed = control->reqseq << L2CAP_CTRL_REQSEQ_SHIFT;
949 packed |= control->final << L2CAP_CTRL_FINAL_SHIFT;
950
951 if (control->sframe) {
952 packed |= control->poll << L2CAP_CTRL_POLL_SHIFT;
953 packed |= control->super << L2CAP_CTRL_SUPER_SHIFT;
954 packed |= L2CAP_CTRL_FRAME_TYPE;
955 } else {
956 packed |= control->sar << L2CAP_CTRL_SAR_SHIFT;
957 packed |= control->txseq << L2CAP_CTRL_TXSEQ_SHIFT;
958 }
959
960 return packed;
961}
962
963static inline void __pack_control(struct l2cap_chan *chan,
964 struct l2cap_ctrl *control,
965 struct sk_buff *skb)
966{
967 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
968 put_unaligned_le32(__pack_extended_control(control),
969 skb->data + L2CAP_HDR_SIZE);
970 } else {
971 put_unaligned_le16(__pack_enhanced_control(control),
972 skb->data + L2CAP_HDR_SIZE);
973 }
974}
975
Gustavo Padovanba7aa642012-05-29 13:29:16 -0300976static inline unsigned int __ertm_hdr_size(struct l2cap_chan *chan)
977{
978 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
979 return L2CAP_EXT_HDR_SIZE;
980 else
981 return L2CAP_ENH_HDR_SIZE;
982}
983
Mat Martineaua67d7f62012-05-17 20:53:35 -0700984static struct sk_buff *l2cap_create_sframe_pdu(struct l2cap_chan *chan,
985 u32 control)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300986{
987 struct sk_buff *skb;
988 struct l2cap_hdr *lh;
Gustavo Padovanba7aa642012-05-29 13:29:16 -0300989 int hlen = __ertm_hdr_size(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300990
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300991 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +0300992 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300993
Mat Martineaua67d7f62012-05-17 20:53:35 -0700994 skb = bt_skb_alloc(hlen, GFP_KERNEL);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300995
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300996 if (!skb)
Mat Martineaua67d7f62012-05-17 20:53:35 -0700997 return ERR_PTR(-ENOMEM);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300998
999 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001000 lh->len = cpu_to_le16(hlen - L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001001 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03001002
Mat Martineaua67d7f62012-05-17 20:53:35 -07001003 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
1004 put_unaligned_le32(control, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
1005 else
1006 put_unaligned_le16(control, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001007
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001008 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineaua67d7f62012-05-17 20:53:35 -07001009 u16 fcs = crc16(0, (u8 *)skb->data, skb->len);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03001010 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001011 }
1012
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001013 skb->priority = HCI_PRIO_MAX;
Mat Martineaua67d7f62012-05-17 20:53:35 -07001014 return skb;
1015}
1016
1017static void l2cap_send_sframe(struct l2cap_chan *chan,
1018 struct l2cap_ctrl *control)
1019{
1020 struct sk_buff *skb;
1021 u32 control_field;
1022
1023 BT_DBG("chan %p, control %p", chan, control);
1024
1025 if (!control->sframe)
1026 return;
1027
Mat Martineaub99e13a2012-10-23 15:24:19 -07001028 if (__chan_is_moving(chan))
1029 return;
1030
Mat Martineaua67d7f62012-05-17 20:53:35 -07001031 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state) &&
1032 !control->poll)
1033 control->final = 1;
1034
1035 if (control->super == L2CAP_SUPER_RR)
1036 clear_bit(CONN_RNR_SENT, &chan->conn_state);
1037 else if (control->super == L2CAP_SUPER_RNR)
1038 set_bit(CONN_RNR_SENT, &chan->conn_state);
1039
1040 if (control->super != L2CAP_SUPER_SREJ) {
1041 chan->last_acked_seq = control->reqseq;
1042 __clear_ack_timer(chan);
1043 }
1044
1045 BT_DBG("reqseq %d, final %d, poll %d, super %d", control->reqseq,
1046 control->final, control->poll, control->super);
1047
1048 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
1049 control_field = __pack_extended_control(control);
1050 else
1051 control_field = __pack_enhanced_control(control);
1052
1053 skb = l2cap_create_sframe_pdu(chan, control_field);
1054 if (!IS_ERR(skb))
1055 l2cap_do_send(chan, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001056}
1057
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001058static void l2cap_send_rr_or_rnr(struct l2cap_chan *chan, bool poll)
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001059{
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001060 struct l2cap_ctrl control;
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001061
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001062 BT_DBG("chan %p, poll %d", chan, poll);
1063
1064 memset(&control, 0, sizeof(control));
1065 control.sframe = 1;
1066 control.poll = poll;
1067
1068 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
1069 control.super = L2CAP_SUPER_RNR;
1070 else
1071 control.super = L2CAP_SUPER_RR;
1072
1073 control.reqseq = chan->buffer_seq;
1074 l2cap_send_sframe(chan, &control);
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001075}
1076
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001077static inline int __l2cap_no_conn_pending(struct l2cap_chan *chan)
Andrei Emeltchenkoe501d052010-07-08 12:14:41 +03001078{
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001079 return !test_bit(CONF_CONNECT_PEND, &chan->conf_state);
Andrei Emeltchenkoe501d052010-07-08 12:14:41 +03001080}
1081
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001082static bool __amp_capable(struct l2cap_chan *chan)
1083{
1084 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann1df7b172013-10-05 11:47:49 -07001085 struct hci_dev *hdev;
1086 bool amp_available = false;
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001087
Marcel Holtmann1df7b172013-10-05 11:47:49 -07001088 if (!conn->hs_enabled)
1089 return false;
1090
1091 if (!(conn->fixed_chan_mask & L2CAP_FC_A2MP))
1092 return false;
1093
1094 read_lock(&hci_dev_list_lock);
1095 list_for_each_entry(hdev, &hci_dev_list, list) {
1096 if (hdev->amp_type != AMP_TYPE_BREDR &&
1097 test_bit(HCI_UP, &hdev->flags)) {
1098 amp_available = true;
1099 break;
1100 }
1101 }
1102 read_unlock(&hci_dev_list_lock);
1103
1104 if (chan->chan_policy == BT_CHANNEL_POLICY_AMP_PREFERRED)
1105 return amp_available;
Marcel Holtmann848566b2013-10-01 22:59:22 -07001106
1107 return false;
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001108}
1109
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02001110static bool l2cap_check_efs(struct l2cap_chan *chan)
1111{
1112 /* Check EFS parameters */
1113 return true;
1114}
1115
Andrei Emeltchenko2766be42012-09-27 17:26:21 +03001116void l2cap_send_conn_req(struct l2cap_chan *chan)
Andrei Emeltchenko9b27f352012-02-24 16:00:00 +02001117{
1118 struct l2cap_conn *conn = chan->conn;
1119 struct l2cap_conn_req req;
1120
1121 req.scid = cpu_to_le16(chan->scid);
1122 req.psm = chan->psm;
1123
1124 chan->ident = l2cap_get_ident(conn);
1125
1126 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
1127
1128 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_REQ, sizeof(req), &req);
1129}
1130
Mat Martineau8eb200b2012-10-23 15:24:17 -07001131static void l2cap_send_create_chan_req(struct l2cap_chan *chan, u8 amp_id)
1132{
1133 struct l2cap_create_chan_req req;
1134 req.scid = cpu_to_le16(chan->scid);
1135 req.psm = chan->psm;
1136 req.amp_id = amp_id;
1137
1138 chan->ident = l2cap_get_ident(chan->conn);
1139
1140 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_REQ,
1141 sizeof(req), &req);
1142}
1143
Mat Martineau02b0fbb2012-10-23 15:24:10 -07001144static void l2cap_move_setup(struct l2cap_chan *chan)
1145{
1146 struct sk_buff *skb;
1147
1148 BT_DBG("chan %p", chan);
1149
1150 if (chan->mode != L2CAP_MODE_ERTM)
1151 return;
1152
1153 __clear_retrans_timer(chan);
1154 __clear_monitor_timer(chan);
1155 __clear_ack_timer(chan);
1156
1157 chan->retry_count = 0;
1158 skb_queue_walk(&chan->tx_q, skb) {
1159 if (bt_cb(skb)->control.retries)
1160 bt_cb(skb)->control.retries = 1;
1161 else
1162 break;
1163 }
1164
1165 chan->expected_tx_seq = chan->buffer_seq;
1166
1167 clear_bit(CONN_REJ_ACT, &chan->conn_state);
1168 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
1169 l2cap_seq_list_clear(&chan->retrans_list);
1170 l2cap_seq_list_clear(&chan->srej_list);
1171 skb_queue_purge(&chan->srej_q);
1172
1173 chan->tx_state = L2CAP_TX_STATE_XMIT;
1174 chan->rx_state = L2CAP_RX_STATE_MOVE;
1175
1176 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
1177}
1178
Mat Martineau5f3847a2012-10-23 15:24:12 -07001179static void l2cap_move_done(struct l2cap_chan *chan)
1180{
1181 u8 move_role = chan->move_role;
1182 BT_DBG("chan %p", chan);
1183
1184 chan->move_state = L2CAP_MOVE_STABLE;
1185 chan->move_role = L2CAP_MOVE_ROLE_NONE;
1186
1187 if (chan->mode != L2CAP_MODE_ERTM)
1188 return;
1189
1190 switch (move_role) {
1191 case L2CAP_MOVE_ROLE_INITIATOR:
1192 l2cap_tx(chan, NULL, NULL, L2CAP_EV_EXPLICIT_POLL);
1193 chan->rx_state = L2CAP_RX_STATE_WAIT_F;
1194 break;
1195 case L2CAP_MOVE_ROLE_RESPONDER:
1196 chan->rx_state = L2CAP_RX_STATE_WAIT_P;
1197 break;
1198 }
1199}
1200
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001201static void l2cap_chan_ready(struct l2cap_chan *chan)
1202{
Mat Martineau28270112012-05-17 21:14:09 -07001203 /* This clears all conf flags, including CONF_NOT_COMPLETE */
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001204 chan->conf_state = 0;
1205 __clear_chan_timer(chan);
1206
Johan Hedberg0ce43ce2013-12-05 14:55:33 +02001207 if (chan->mode == L2CAP_MODE_LE_FLOWCTL && !chan->tx_credits)
1208 chan->ops->suspend(chan);
Johan Hedberg177f8f22013-05-31 17:54:51 +03001209
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001210 chan->state = BT_CONNECTED;
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001211
Andrei Emeltchenkofd83e2c2012-05-30 09:55:32 +03001212 chan->ops->ready(chan);
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001213}
1214
Johan Hedbergf1496de2013-05-13 14:15:56 +03001215static void l2cap_le_connect(struct l2cap_chan *chan)
1216{
1217 struct l2cap_conn *conn = chan->conn;
1218 struct l2cap_le_conn_req req;
1219
Johan Hedberg595177f2013-12-02 22:12:22 +02001220 if (test_and_set_bit(FLAG_LE_CONN_REQ_SENT, &chan->flags))
1221 return;
1222
Johan Hedbergf1496de2013-05-13 14:15:56 +03001223 req.psm = chan->psm;
1224 req.scid = cpu_to_le16(chan->scid);
1225 req.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02001226 req.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03001227 req.credits = cpu_to_le16(chan->rx_credits);
Johan Hedbergf1496de2013-05-13 14:15:56 +03001228
1229 chan->ident = l2cap_get_ident(conn);
1230
1231 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_REQ,
1232 sizeof(req), &req);
1233}
1234
1235static void l2cap_le_start(struct l2cap_chan *chan)
1236{
1237 struct l2cap_conn *conn = chan->conn;
1238
1239 if (!smp_conn_security(conn->hcon, chan->sec_level))
1240 return;
1241
1242 if (!chan->psm) {
1243 l2cap_chan_ready(chan);
1244 return;
1245 }
1246
1247 if (chan->state == BT_CONNECT)
1248 l2cap_le_connect(chan);
1249}
1250
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001251static void l2cap_start_connection(struct l2cap_chan *chan)
1252{
1253 if (__amp_capable(chan)) {
1254 BT_DBG("chan %p AMP capable: discover AMPs", chan);
1255 a2mp_discover_amp(chan);
Johan Hedbergf1496de2013-05-13 14:15:56 +03001256 } else if (chan->conn->hcon->type == LE_LINK) {
1257 l2cap_le_start(chan);
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001258 } else {
1259 l2cap_send_conn_req(chan);
1260 }
1261}
1262
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001263static void l2cap_do_start(struct l2cap_chan *chan)
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001264{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03001265 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001266
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001267 if (conn->hcon->type == LE_LINK) {
Johan Hedberg96ac34f2013-05-13 11:15:07 +03001268 l2cap_le_start(chan);
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001269 return;
1270 }
1271
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001272 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) {
Marcel Holtmann984947d2009-02-06 23:35:19 +01001273 if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE))
1274 return;
1275
Gustavo F. Padovand45fc422011-11-05 19:54:24 -02001276 if (l2cap_chan_check_security(chan) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01001277 __l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001278 l2cap_start_connection(chan);
1279 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001280 } else {
1281 struct l2cap_info_req req;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001282 req.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001283
1284 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
1285 conn->info_ident = l2cap_get_ident(conn);
1286
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08001287 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001288
Gustavo Padovan2d792812012-10-06 10:07:01 +01001289 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
1290 sizeof(req), &req);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001291 }
1292}
1293
Gustavo F. Padovancf6c2c02010-06-07 20:54:45 -03001294static inline int l2cap_mode_supported(__u8 mode, __u32 feat_mask)
1295{
1296 u32 local_feat_mask = l2cap_feat_mask;
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03001297 if (!disable_ertm)
Gustavo F. Padovancf6c2c02010-06-07 20:54:45 -03001298 local_feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING;
1299
1300 switch (mode) {
1301 case L2CAP_MODE_ERTM:
1302 return L2CAP_FEAT_ERTM & feat_mask & local_feat_mask;
1303 case L2CAP_MODE_STREAMING:
1304 return L2CAP_FEAT_STREAMING & feat_mask & local_feat_mask;
1305 default:
1306 return 0x00;
1307 }
1308}
1309
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001310static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err)
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001311{
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001312 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001313 struct l2cap_disconn_req req;
1314
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001315 if (!conn)
1316 return;
1317
Andrei Emeltchenkoaad3d0e2012-09-06 15:05:42 +03001318 if (chan->mode == L2CAP_MODE_ERTM && chan->state == BT_CONNECTED) {
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03001319 __clear_retrans_timer(chan);
1320 __clear_monitor_timer(chan);
1321 __clear_ack_timer(chan);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001322 }
1323
Johan Hedberg2338a7e2014-01-24 10:35:40 +02001324 if (chan->scid == L2CAP_CID_A2MP) {
Gustavo Padovand1177732012-10-06 11:47:38 +01001325 l2cap_state_change(chan, BT_DISCONN);
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001326 return;
1327 }
1328
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001329 req.dcid = cpu_to_le16(chan->dcid);
1330 req.scid = cpu_to_le16(chan->scid);
Gustavo Padovan2d792812012-10-06 10:07:01 +01001331 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_DISCONN_REQ,
1332 sizeof(req), &req);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001333
Gustavo Padovanf8e73012013-10-15 19:24:46 -03001334 l2cap_state_change_and_error(chan, BT_DISCONN, err);
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001335}
1336
Linus Torvalds1da177e2005-04-16 15:20:36 -07001337/* ---- L2CAP connections ---- */
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001338static void l2cap_conn_start(struct l2cap_conn *conn)
1339{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001340 struct l2cap_chan *chan, *tmp;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001341
1342 BT_DBG("conn %p", conn);
1343
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001344 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001345
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001346 list_for_each_entry_safe(chan, tmp, &conn->chan_l, list) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001347 l2cap_chan_lock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001348
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001349 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001350 l2cap_chan_unlock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001351 continue;
1352 }
1353
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001354 if (chan->state == BT_CONNECT) {
Gustavo F. Padovand45fc422011-11-05 19:54:24 -02001355 if (!l2cap_chan_check_security(chan) ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01001356 !__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001357 l2cap_chan_unlock(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001358 continue;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02001359 }
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001360
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001361 if (!l2cap_mode_supported(chan->mode, conn->feat_mask)
Gustavo Padovan2d792812012-10-06 10:07:01 +01001362 && test_bit(CONF_STATE2_DEVICE,
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001363 &chan->conf_state)) {
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001364 l2cap_chan_close(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001365 l2cap_chan_unlock(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001366 continue;
1367 }
1368
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001369 l2cap_start_connection(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001370
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001371 } else if (chan->state == BT_CONNECT2) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001372 struct l2cap_conn_rsp rsp;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001373 char buf[128];
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001374 rsp.scid = cpu_to_le16(chan->dcid);
1375 rsp.dcid = cpu_to_le16(chan->scid);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001376
Gustavo F. Padovand45fc422011-11-05 19:54:24 -02001377 if (l2cap_chan_check_security(chan)) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07001378 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001379 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
1380 rsp.status = cpu_to_le16(L2CAP_CS_AUTHOR_PEND);
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001381 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001382
1383 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001384 l2cap_state_change(chan, BT_CONFIG);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001385 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
1386 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001387 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001388 } else {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001389 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
1390 rsp.status = cpu_to_le16(L2CAP_CS_AUTHEN_PEND);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001391 }
1392
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001393 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001394 sizeof(rsp), &rsp);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001395
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001396 if (test_bit(CONF_REQ_SENT, &chan->conf_state) ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01001397 rsp.result != L2CAP_CR_SUCCESS) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001398 l2cap_chan_unlock(chan);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001399 continue;
1400 }
1401
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001402 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001403 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001404 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03001405 chan->num_conf_req++;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001406 }
1407
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001408 l2cap_chan_unlock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001409 }
1410
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001411 mutex_unlock(&conn->chan_lock);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001412}
1413
Ido Yarivc2287682012-04-20 15:46:07 -03001414/* Find socket with cid and source/destination bdaddr.
Ville Tervob62f3282011-02-10 22:38:50 -03001415 * Returns closest match, locked.
1416 */
Andrei Emeltchenkod9b88702012-03-12 12:13:08 +02001417static struct l2cap_chan *l2cap_global_chan_by_scid(int state, u16 cid,
Ido Yarivc2287682012-04-20 15:46:07 -03001418 bdaddr_t *src,
1419 bdaddr_t *dst)
Ville Tervob62f3282011-02-10 22:38:50 -03001420{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001421 struct l2cap_chan *c, *c1 = NULL;
Ville Tervob62f3282011-02-10 22:38:50 -03001422
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001423 read_lock(&chan_list_lock);
Ville Tervob62f3282011-02-10 22:38:50 -03001424
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001425 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001426 if (state && c->state != state)
Ville Tervob62f3282011-02-10 22:38:50 -03001427 continue;
1428
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001429 if (c->scid == cid) {
Ido Yarivc2287682012-04-20 15:46:07 -03001430 int src_match, dst_match;
1431 int src_any, dst_any;
1432
Ville Tervob62f3282011-02-10 22:38:50 -03001433 /* Exact match. */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001434 src_match = !bacmp(&c->src, src);
1435 dst_match = !bacmp(&c->dst, dst);
Ido Yarivc2287682012-04-20 15:46:07 -03001436 if (src_match && dst_match) {
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001437 read_unlock(&chan_list_lock);
1438 return c;
1439 }
Ville Tervob62f3282011-02-10 22:38:50 -03001440
1441 /* Closest match */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001442 src_any = !bacmp(&c->src, BDADDR_ANY);
1443 dst_any = !bacmp(&c->dst, BDADDR_ANY);
Ido Yarivc2287682012-04-20 15:46:07 -03001444 if ((src_match && dst_any) || (src_any && dst_match) ||
1445 (src_any && dst_any))
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001446 c1 = c;
Ville Tervob62f3282011-02-10 22:38:50 -03001447 }
1448 }
Gustavo F. Padovan280f2942011-04-13 19:01:22 -03001449
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001450 read_unlock(&chan_list_lock);
Ville Tervob62f3282011-02-10 22:38:50 -03001451
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001452 return c1;
Ville Tervob62f3282011-02-10 22:38:50 -03001453}
1454
1455static void l2cap_le_conn_ready(struct l2cap_conn *conn)
1456{
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001457 struct hci_conn *hcon = conn->hcon;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001458 struct l2cap_chan *chan, *pchan;
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001459 u8 dst_type;
Ville Tervob62f3282011-02-10 22:38:50 -03001460
1461 BT_DBG("");
1462
Jukka Rissanen18722c22013-12-11 17:05:37 +02001463 bt_6lowpan_add_conn(conn);
1464
Ville Tervob62f3282011-02-10 22:38:50 -03001465 /* Check if we have socket listening on cid */
Johan Hedberg073d1cf2013-04-29 19:35:35 +03001466 pchan = l2cap_global_chan_by_scid(BT_LISTEN, L2CAP_CID_ATT,
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001467 &hcon->src, &hcon->dst);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001468 if (!pchan)
Ville Tervob62f3282011-02-10 22:38:50 -03001469 return;
1470
Johan Hedberg44f3b0f2013-04-29 19:35:45 +03001471 /* Client ATT sockets should override the server one */
1472 if (__l2cap_get_chan_by_dcid(conn, L2CAP_CID_ATT))
1473 return;
1474
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001475 dst_type = bdaddr_type(hcon, hcon->dst_type);
1476
1477 /* If device is blocked, do not create a channel for it */
1478 if (hci_blacklist_lookup(hcon->hdev, &hcon->dst, dst_type))
1479 return;
1480
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001481 l2cap_chan_lock(pchan);
Gustavo F. Padovan62f3a2c2011-04-14 18:34:34 -03001482
Gustavo Padovan80b98022012-05-27 22:27:51 -03001483 chan = pchan->ops->new_connection(pchan);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001484 if (!chan)
Ville Tervob62f3282011-02-10 22:38:50 -03001485 goto clean;
1486
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001487 bacpy(&chan->src, &hcon->src);
1488 bacpy(&chan->dst, &hcon->dst);
1489 chan->src_type = bdaddr_type(hcon, hcon->src_type);
1490 chan->dst_type = dst_type;
Ville Tervob62f3282011-02-10 22:38:50 -03001491
Johan Hedberg44f3b0f2013-04-29 19:35:45 +03001492 __l2cap_chan_add(conn, chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001493
Ville Tervob62f3282011-02-10 22:38:50 -03001494clean:
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001495 l2cap_chan_unlock(pchan);
Ville Tervob62f3282011-02-10 22:38:50 -03001496}
1497
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001498static void l2cap_conn_ready(struct l2cap_conn *conn)
1499{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001500 struct l2cap_chan *chan;
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001501 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001502
1503 BT_DBG("conn %p", conn);
1504
Johan Hedbergd8729922013-04-29 19:35:39 +03001505 /* For outgoing pairing which doesn't necessarily have an
1506 * associated socket (e.g. mgmt_pair_device).
1507 */
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001508 if (hcon->out && hcon->type == LE_LINK)
1509 smp_conn_security(hcon, hcon->pending_sec_level);
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03001510
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001511 mutex_lock(&conn->chan_lock);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001512
Johan Hedberg44f3b0f2013-04-29 19:35:45 +03001513 if (hcon->type == LE_LINK)
1514 l2cap_le_conn_ready(conn);
1515
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001516 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03001517
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001518 l2cap_chan_lock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001519
Johan Hedberg2338a7e2014-01-24 10:35:40 +02001520 if (chan->scid == L2CAP_CID_A2MP) {
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001521 l2cap_chan_unlock(chan);
1522 continue;
1523 }
1524
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001525 if (hcon->type == LE_LINK) {
Johan Hedbergf1496de2013-05-13 14:15:56 +03001526 l2cap_le_start(chan);
Vinicius Costa Gomes63128452011-06-17 22:46:26 -03001527 } else if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Gustavo Padovan74e75742013-10-15 19:24:51 -03001528 l2cap_chan_ready(chan);
Anderson Brigliab501d6a2011-06-07 18:46:31 -03001529
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001530 } else if (chan->state == BT_CONNECT) {
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001531 l2cap_do_start(chan);
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001532 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001533
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001534 l2cap_chan_unlock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001535 }
1536
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001537 mutex_unlock(&conn->chan_lock);
Johan Hedberg61a939c2014-01-17 20:45:11 +02001538
1539 queue_work(hcon->hdev->workqueue, &conn->pending_rx_work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001540}
1541
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001542/* Notify sockets that we cannot guaranty reliability anymore */
1543static void l2cap_conn_unreliable(struct l2cap_conn *conn, int err)
1544{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001545 struct l2cap_chan *chan;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001546
1547 BT_DBG("conn %p", conn);
1548
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001549 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001550
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001551 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +03001552 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo Padovan1d8b1fd2012-10-06 11:34:52 +01001553 l2cap_chan_set_err(chan, err);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001554 }
1555
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001556 mutex_unlock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001557}
1558
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001559static void l2cap_info_timeout(struct work_struct *work)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001560{
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001561 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001562 info_timer.work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001563
Marcel Holtmann984947d2009-02-06 23:35:19 +01001564 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01001565 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01001566
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001567 l2cap_conn_start(conn);
1568}
1569
David Herrmann2c8e1412013-04-06 20:28:45 +02001570/*
1571 * l2cap_user
1572 * External modules can register l2cap_user objects on l2cap_conn. The ->probe
1573 * callback is called during registration. The ->remove callback is called
1574 * during unregistration.
1575 * An l2cap_user object can either be explicitly unregistered or when the
1576 * underlying l2cap_conn object is deleted. This guarantees that l2cap->hcon,
1577 * l2cap->hchan, .. are valid as long as the remove callback hasn't been called.
1578 * External modules must own a reference to the l2cap_conn object if they intend
1579 * to call l2cap_unregister_user(). The l2cap_conn object might get destroyed at
1580 * any time if they don't.
1581 */
1582
1583int l2cap_register_user(struct l2cap_conn *conn, struct l2cap_user *user)
1584{
1585 struct hci_dev *hdev = conn->hcon->hdev;
1586 int ret;
1587
1588 /* We need to check whether l2cap_conn is registered. If it is not, we
1589 * must not register the l2cap_user. l2cap_conn_del() is unregisters
1590 * l2cap_conn objects, but doesn't provide its own locking. Instead, it
1591 * relies on the parent hci_conn object to be locked. This itself relies
1592 * on the hci_dev object to be locked. So we must lock the hci device
1593 * here, too. */
1594
1595 hci_dev_lock(hdev);
1596
1597 if (user->list.next || user->list.prev) {
1598 ret = -EINVAL;
1599 goto out_unlock;
1600 }
1601
1602 /* conn->hchan is NULL after l2cap_conn_del() was called */
1603 if (!conn->hchan) {
1604 ret = -ENODEV;
1605 goto out_unlock;
1606 }
1607
1608 ret = user->probe(conn, user);
1609 if (ret)
1610 goto out_unlock;
1611
1612 list_add(&user->list, &conn->users);
1613 ret = 0;
1614
1615out_unlock:
1616 hci_dev_unlock(hdev);
1617 return ret;
1618}
1619EXPORT_SYMBOL(l2cap_register_user);
1620
1621void l2cap_unregister_user(struct l2cap_conn *conn, struct l2cap_user *user)
1622{
1623 struct hci_dev *hdev = conn->hcon->hdev;
1624
1625 hci_dev_lock(hdev);
1626
1627 if (!user->list.next || !user->list.prev)
1628 goto out_unlock;
1629
1630 list_del(&user->list);
1631 user->list.next = NULL;
1632 user->list.prev = NULL;
1633 user->remove(conn, user);
1634
1635out_unlock:
1636 hci_dev_unlock(hdev);
1637}
1638EXPORT_SYMBOL(l2cap_unregister_user);
1639
1640static void l2cap_unregister_all_users(struct l2cap_conn *conn)
1641{
1642 struct l2cap_user *user;
1643
1644 while (!list_empty(&conn->users)) {
1645 user = list_first_entry(&conn->users, struct l2cap_user, list);
1646 list_del(&user->list);
1647 user->list.next = NULL;
1648 user->list.prev = NULL;
1649 user->remove(conn, user);
1650 }
1651}
1652
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001653static void l2cap_conn_del(struct hci_conn *hcon, int err)
1654{
1655 struct l2cap_conn *conn = hcon->l2cap_data;
1656 struct l2cap_chan *chan, *l;
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001657
1658 if (!conn)
1659 return;
1660
1661 BT_DBG("hcon %p conn %p, err %d", hcon, conn, err);
1662
1663 kfree_skb(conn->rx_skb);
1664
Johan Hedberg61a939c2014-01-17 20:45:11 +02001665 skb_queue_purge(&conn->pending_rx);
Jukka Taimisto7ab56c32014-06-12 10:15:13 +00001666
1667 /* We can not call flush_work(&conn->pending_rx_work) here since we
1668 * might block if we are running on a worker from the same workqueue
1669 * pending_rx_work is waiting on.
1670 */
1671 if (work_pending(&conn->pending_rx_work))
1672 cancel_work_sync(&conn->pending_rx_work);
Johan Hedberg61a939c2014-01-17 20:45:11 +02001673
David Herrmann2c8e1412013-04-06 20:28:45 +02001674 l2cap_unregister_all_users(conn);
1675
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001676 mutex_lock(&conn->chan_lock);
1677
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001678 /* Kill channels */
1679 list_for_each_entry_safe(chan, l, &conn->chan_l, list) {
Mat Martineau61d6ef32012-04-27 16:50:50 -07001680 l2cap_chan_hold(chan);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001681 l2cap_chan_lock(chan);
1682
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001683 l2cap_chan_del(chan, err);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001684
1685 l2cap_chan_unlock(chan);
1686
Gustavo Padovan80b98022012-05-27 22:27:51 -03001687 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07001688 l2cap_chan_put(chan);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001689 }
1690
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001691 mutex_unlock(&conn->chan_lock);
1692
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001693 hci_chan_del(conn->hchan);
1694
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001695 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT)
Ulisses Furquim127074b2012-01-30 18:26:29 -02001696 cancel_delayed_work_sync(&conn->info_timer);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001697
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001698 if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags)) {
Ulisses Furquim127074b2012-01-30 18:26:29 -02001699 cancel_delayed_work_sync(&conn->security_timer);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001700 smp_chan_destroy(conn);
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001701 }
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001702
1703 hcon->l2cap_data = NULL;
David Herrmann9c903e32013-04-06 20:28:44 +02001704 conn->hchan = NULL;
1705 l2cap_conn_put(conn);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001706}
1707
Gustavo F. Padovan6c9d42a2011-12-20 10:57:27 -02001708static void security_timeout(struct work_struct *work)
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001709{
Gustavo F. Padovan6c9d42a2011-12-20 10:57:27 -02001710 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001711 security_timer.work);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001712
Johan Hedbergd06cc412012-06-06 18:44:11 +08001713 BT_DBG("conn %p", conn);
1714
1715 if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags)) {
1716 smp_chan_destroy(conn);
1717 l2cap_conn_del(conn->hcon, ETIMEDOUT);
1718 }
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001719}
1720
David Herrmann9c903e32013-04-06 20:28:44 +02001721static void l2cap_conn_free(struct kref *ref)
1722{
1723 struct l2cap_conn *conn = container_of(ref, struct l2cap_conn, ref);
1724
1725 hci_conn_put(conn->hcon);
1726 kfree(conn);
1727}
1728
1729void l2cap_conn_get(struct l2cap_conn *conn)
1730{
1731 kref_get(&conn->ref);
1732}
1733EXPORT_SYMBOL(l2cap_conn_get);
1734
1735void l2cap_conn_put(struct l2cap_conn *conn)
1736{
1737 kref_put(&conn->ref, l2cap_conn_free);
1738}
1739EXPORT_SYMBOL(l2cap_conn_put);
1740
Linus Torvalds1da177e2005-04-16 15:20:36 -07001741/* ---- Socket interface ---- */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001742
Ido Yarivc2287682012-04-20 15:46:07 -03001743/* Find socket with psm and source / destination bdaddr.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001744 * Returns closest match.
1745 */
Ido Yarivc2287682012-04-20 15:46:07 -03001746static struct l2cap_chan *l2cap_global_chan_by_psm(int state, __le16 psm,
1747 bdaddr_t *src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001748 bdaddr_t *dst,
1749 u8 link_type)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001750{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001751 struct l2cap_chan *c, *c1 = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001752
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001753 read_lock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001754
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001755 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001756 if (state && c->state != state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001757 continue;
1758
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001759 if (link_type == ACL_LINK && c->src_type != BDADDR_BREDR)
1760 continue;
1761
1762 if (link_type == LE_LINK && c->src_type == BDADDR_BREDR)
1763 continue;
1764
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001765 if (c->psm == psm) {
Ido Yarivc2287682012-04-20 15:46:07 -03001766 int src_match, dst_match;
1767 int src_any, dst_any;
1768
Linus Torvalds1da177e2005-04-16 15:20:36 -07001769 /* Exact match. */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001770 src_match = !bacmp(&c->src, src);
1771 dst_match = !bacmp(&c->dst, dst);
Ido Yarivc2287682012-04-20 15:46:07 -03001772 if (src_match && dst_match) {
Johannes Berga7567b22011-06-01 08:29:54 +02001773 read_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001774 return c;
1775 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001776
1777 /* Closest match */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001778 src_any = !bacmp(&c->src, BDADDR_ANY);
1779 dst_any = !bacmp(&c->dst, BDADDR_ANY);
Ido Yarivc2287682012-04-20 15:46:07 -03001780 if ((src_match && dst_any) || (src_any && dst_match) ||
1781 (src_any && dst_any))
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001782 c1 = c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001783 }
1784 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001785
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001786 read_unlock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001787
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001788 return c1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001789}
1790
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001791static void l2cap_monitor_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001792{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001793 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001794 monitor_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001795
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03001796 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001797
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001798 l2cap_chan_lock(chan);
1799
Mat Martineau80909e02012-05-17 20:53:50 -07001800 if (!chan->conn) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001801 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001802 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001803 return;
1804 }
1805
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001806 l2cap_tx(chan, NULL, NULL, L2CAP_EV_MONITOR_TO);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001807
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001808 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001809 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001810}
1811
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001812static void l2cap_retrans_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001813{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001814 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001815 retrans_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001816
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03001817 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001818
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001819 l2cap_chan_lock(chan);
1820
Mat Martineau80909e02012-05-17 20:53:50 -07001821 if (!chan->conn) {
1822 l2cap_chan_unlock(chan);
1823 l2cap_chan_put(chan);
1824 return;
1825 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001826
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001827 l2cap_tx(chan, NULL, NULL, L2CAP_EV_RETRANS_TO);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001828 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001829 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001830}
1831
Gustavo Padovand6603662012-05-21 13:58:22 -03001832static void l2cap_streaming_send(struct l2cap_chan *chan,
1833 struct sk_buff_head *skbs)
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001834{
Gustavo F. Padovanccbb84a2010-08-30 18:44:44 -03001835 struct sk_buff *skb;
Mat Martineau37339372012-05-17 20:53:33 -07001836 struct l2cap_ctrl *control;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001837
Mat Martineau37339372012-05-17 20:53:33 -07001838 BT_DBG("chan %p, skbs %p", chan, skbs);
1839
Mat Martineaub99e13a2012-10-23 15:24:19 -07001840 if (__chan_is_moving(chan))
1841 return;
1842
Mat Martineau37339372012-05-17 20:53:33 -07001843 skb_queue_splice_tail_init(skbs, &chan->tx_q);
1844
1845 while (!skb_queue_empty(&chan->tx_q)) {
1846
1847 skb = skb_dequeue(&chan->tx_q);
1848
1849 bt_cb(skb)->control.retries = 1;
1850 control = &bt_cb(skb)->control;
1851
1852 control->reqseq = 0;
1853 control->txseq = chan->next_tx_seq;
1854
1855 __pack_control(chan, control, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001856
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001857 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau37339372012-05-17 20:53:33 -07001858 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1859 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001860 }
1861
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001862 l2cap_do_send(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001863
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001864 BT_DBG("Sent txseq %u", control->txseq);
Mat Martineau37339372012-05-17 20:53:33 -07001865
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001866 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau37339372012-05-17 20:53:33 -07001867 chan->frames_sent++;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001868 }
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001869}
1870
Szymon Janc67c9e842011-07-28 16:24:33 +02001871static int l2cap_ertm_send(struct l2cap_chan *chan)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001872{
1873 struct sk_buff *skb, *tx_skb;
Mat Martineau18a48e72012-05-17 20:53:34 -07001874 struct l2cap_ctrl *control;
1875 int sent = 0;
1876
1877 BT_DBG("chan %p", chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001878
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001879 if (chan->state != BT_CONNECTED)
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001880 return -ENOTCONN;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001881
Mat Martineau94122bb2012-05-02 09:42:02 -07001882 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1883 return 0;
1884
Mat Martineaub99e13a2012-10-23 15:24:19 -07001885 if (__chan_is_moving(chan))
1886 return 0;
1887
Mat Martineau18a48e72012-05-17 20:53:34 -07001888 while (chan->tx_send_head &&
1889 chan->unacked_frames < chan->remote_tx_win &&
1890 chan->tx_state == L2CAP_TX_STATE_XMIT) {
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001891
Mat Martineau18a48e72012-05-17 20:53:34 -07001892 skb = chan->tx_send_head;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001893
Mat Martineau18a48e72012-05-17 20:53:34 -07001894 bt_cb(skb)->control.retries = 1;
1895 control = &bt_cb(skb)->control;
Gustavo F. Padovan95ffa972010-06-18 20:37:33 -03001896
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001897 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
Mat Martineau18a48e72012-05-17 20:53:34 -07001898 control->final = 1;
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001899
Mat Martineau18a48e72012-05-17 20:53:34 -07001900 control->reqseq = chan->buffer_seq;
1901 chan->last_acked_seq = chan->buffer_seq;
1902 control->txseq = chan->next_tx_seq;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001903
Mat Martineau18a48e72012-05-17 20:53:34 -07001904 __pack_control(chan, control, skb);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001905
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001906 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau18a48e72012-05-17 20:53:34 -07001907 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1908 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001909 }
1910
Mat Martineau18a48e72012-05-17 20:53:34 -07001911 /* Clone after data has been modified. Data is assumed to be
1912 read-only (for locking purposes) on cloned sk_buffs.
1913 */
1914 tx_skb = skb_clone(skb, GFP_KERNEL);
1915
1916 if (!tx_skb)
1917 break;
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -03001918
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03001919 __set_retrans_timer(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001920
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001921 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau18a48e72012-05-17 20:53:34 -07001922 chan->unacked_frames++;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03001923 chan->frames_sent++;
Mat Martineau18a48e72012-05-17 20:53:34 -07001924 sent++;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001925
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001926 if (skb_queue_is_last(&chan->tx_q, skb))
1927 chan->tx_send_head = NULL;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001928 else
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001929 chan->tx_send_head = skb_queue_next(&chan->tx_q, skb);
Mat Martineau18a48e72012-05-17 20:53:34 -07001930
1931 l2cap_do_send(chan, tx_skb);
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001932 BT_DBG("Sent txseq %u", control->txseq);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001933 }
1934
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001935 BT_DBG("Sent %d, %u unacked, %u in ERTM queue", sent,
1936 chan->unacked_frames, skb_queue_len(&chan->tx_q));
Mat Martineau18a48e72012-05-17 20:53:34 -07001937
1938 return sent;
Gustavo F. Padovan9e917af2010-05-01 16:15:37 -03001939}
1940
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001941static void l2cap_ertm_resend(struct l2cap_chan *chan)
1942{
1943 struct l2cap_ctrl control;
1944 struct sk_buff *skb;
1945 struct sk_buff *tx_skb;
1946 u16 seq;
1947
1948 BT_DBG("chan %p", chan);
1949
1950 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1951 return;
1952
Mat Martineaub99e13a2012-10-23 15:24:19 -07001953 if (__chan_is_moving(chan))
1954 return;
1955
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001956 while (chan->retrans_list.head != L2CAP_SEQ_LIST_CLEAR) {
1957 seq = l2cap_seq_list_pop(&chan->retrans_list);
1958
1959 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, seq);
1960 if (!skb) {
1961 BT_DBG("Error: Can't retransmit seq %d, frame missing",
Gustavo Padovan2d792812012-10-06 10:07:01 +01001962 seq);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001963 continue;
1964 }
1965
1966 bt_cb(skb)->control.retries++;
1967 control = bt_cb(skb)->control;
1968
1969 if (chan->max_tx != 0 &&
1970 bt_cb(skb)->control.retries > chan->max_tx) {
1971 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001972 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001973 l2cap_seq_list_clear(&chan->retrans_list);
1974 break;
1975 }
1976
1977 control.reqseq = chan->buffer_seq;
1978 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
1979 control.final = 1;
1980 else
1981 control.final = 0;
1982
1983 if (skb_cloned(skb)) {
1984 /* Cloned sk_buffs are read-only, so we need a
1985 * writeable copy
1986 */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03001987 tx_skb = skb_copy(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001988 } else {
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03001989 tx_skb = skb_clone(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001990 }
1991
1992 if (!tx_skb) {
1993 l2cap_seq_list_clear(&chan->retrans_list);
1994 break;
1995 }
1996
1997 /* Update skb contents */
1998 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
1999 put_unaligned_le32(__pack_extended_control(&control),
2000 tx_skb->data + L2CAP_HDR_SIZE);
2001 } else {
2002 put_unaligned_le16(__pack_enhanced_control(&control),
2003 tx_skb->data + L2CAP_HDR_SIZE);
2004 }
2005
2006 if (chan->fcs == L2CAP_FCS_CRC16) {
2007 u16 fcs = crc16(0, (u8 *) tx_skb->data, tx_skb->len);
2008 put_unaligned_le16(fcs, skb_put(tx_skb,
2009 L2CAP_FCS_SIZE));
2010 }
2011
2012 l2cap_do_send(chan, tx_skb);
2013
2014 BT_DBG("Resent txseq %d", control.txseq);
2015
2016 chan->last_acked_seq = chan->buffer_seq;
2017 }
2018}
2019
Mat Martineauf80842a2012-05-17 20:53:46 -07002020static void l2cap_retransmit(struct l2cap_chan *chan,
2021 struct l2cap_ctrl *control)
2022{
2023 BT_DBG("chan %p, control %p", chan, control);
2024
2025 l2cap_seq_list_append(&chan->retrans_list, control->reqseq);
2026 l2cap_ertm_resend(chan);
2027}
2028
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002029static void l2cap_retransmit_all(struct l2cap_chan *chan,
2030 struct l2cap_ctrl *control)
2031{
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002032 struct sk_buff *skb;
2033
2034 BT_DBG("chan %p, control %p", chan, control);
2035
2036 if (control->poll)
2037 set_bit(CONN_SEND_FBIT, &chan->conn_state);
2038
2039 l2cap_seq_list_clear(&chan->retrans_list);
2040
2041 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
2042 return;
2043
2044 if (chan->unacked_frames) {
2045 skb_queue_walk(&chan->tx_q, skb) {
2046 if (bt_cb(skb)->control.txseq == control->reqseq ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01002047 skb == chan->tx_send_head)
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002048 break;
2049 }
2050
2051 skb_queue_walk_from(&chan->tx_q, skb) {
2052 if (skb == chan->tx_send_head)
2053 break;
2054
2055 l2cap_seq_list_append(&chan->retrans_list,
2056 bt_cb(skb)->control.txseq);
2057 }
2058
2059 l2cap_ertm_resend(chan);
2060 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002061}
2062
Szymon Jancb17e73b2012-01-11 10:59:47 +01002063static void l2cap_send_ack(struct l2cap_chan *chan)
2064{
Mat Martineau0a0aba42012-05-17 20:53:39 -07002065 struct l2cap_ctrl control;
2066 u16 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
2067 chan->last_acked_seq);
2068 int threshold;
2069
2070 BT_DBG("chan %p last_acked_seq %d buffer_seq %d",
2071 chan, chan->last_acked_seq, chan->buffer_seq);
2072
2073 memset(&control, 0, sizeof(control));
2074 control.sframe = 1;
2075
2076 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
2077 chan->rx_state == L2CAP_RX_STATE_RECV) {
2078 __clear_ack_timer(chan);
2079 control.super = L2CAP_SUPER_RNR;
2080 control.reqseq = chan->buffer_seq;
2081 l2cap_send_sframe(chan, &control);
2082 } else {
2083 if (!test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) {
2084 l2cap_ertm_send(chan);
2085 /* If any i-frames were sent, they included an ack */
2086 if (chan->buffer_seq == chan->last_acked_seq)
2087 frames_to_ack = 0;
2088 }
2089
Mat Martineauc20f8e32012-07-10 05:47:07 -07002090 /* Ack now if the window is 3/4ths full.
Mat Martineau0a0aba42012-05-17 20:53:39 -07002091 * Calculate without mul or div
2092 */
Mat Martineauc20f8e32012-07-10 05:47:07 -07002093 threshold = chan->ack_win;
Mat Martineau0a0aba42012-05-17 20:53:39 -07002094 threshold += threshold << 1;
2095 threshold >>= 2;
2096
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002097 BT_DBG("frames_to_ack %u, threshold %d", frames_to_ack,
Mat Martineau0a0aba42012-05-17 20:53:39 -07002098 threshold);
2099
2100 if (frames_to_ack >= threshold) {
2101 __clear_ack_timer(chan);
2102 control.super = L2CAP_SUPER_RR;
2103 control.reqseq = chan->buffer_seq;
2104 l2cap_send_sframe(chan, &control);
2105 frames_to_ack = 0;
2106 }
2107
2108 if (frames_to_ack)
2109 __set_ack_timer(chan);
2110 }
Szymon Jancb17e73b2012-01-11 10:59:47 +01002111}
2112
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002113static inline int l2cap_skbuff_fromiovec(struct l2cap_chan *chan,
2114 struct msghdr *msg, int len,
2115 int count, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002116{
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002117 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002118 struct sk_buff **frag;
Gustavo Padovan90338942012-04-06 20:15:47 -03002119 int sent = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002120
Gustavo F. Padovan59203a22010-05-01 16:15:43 -03002121 if (memcpy_fromiovec(skb_put(skb, count), msg->msg_iov, count))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002122 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002123
2124 sent += count;
2125 len -= count;
2126
2127 /* Continuation fragments (no L2CAP header) */
2128 frag = &skb_shinfo(skb)->frag_list;
2129 while (len) {
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002130 struct sk_buff *tmp;
2131
Linus Torvalds1da177e2005-04-16 15:20:36 -07002132 count = min_t(unsigned int, conn->mtu, len);
2133
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002134 tmp = chan->ops->alloc_skb(chan, count,
2135 msg->msg_flags & MSG_DONTWAIT);
2136 if (IS_ERR(tmp))
2137 return PTR_ERR(tmp);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002138
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002139 *frag = tmp;
2140
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002141 if (memcpy_fromiovec(skb_put(*frag, count), msg->msg_iov, count))
2142 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002143
2144 sent += count;
2145 len -= count;
2146
Gustavo Padovan2d0ed3d2012-05-11 13:16:12 -03002147 skb->len += (*frag)->len;
2148 skb->data_len += (*frag)->len;
2149
Linus Torvalds1da177e2005-04-16 15:20:36 -07002150 frag = &(*frag)->next;
2151 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002152
2153 return sent;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002154}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002155
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002156static struct sk_buff *l2cap_create_connless_pdu(struct l2cap_chan *chan,
Marcel Holtmann8d463212014-06-05 15:22:51 +02002157 struct msghdr *msg, size_t len)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002158{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002159 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002160 struct sk_buff *skb;
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002161 int err, count, hlen = L2CAP_HDR_SIZE + L2CAP_PSMLEN_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002162 struct l2cap_hdr *lh;
2163
Marcel Holtmann8d463212014-06-05 15:22:51 +02002164 BT_DBG("chan %p psm 0x%2.2x len %zu", chan,
2165 __le16_to_cpu(chan->psm), len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002166
2167 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002168
2169 skb = chan->ops->alloc_skb(chan, count + hlen,
Gustavo Padovan90338942012-04-06 20:15:47 -03002170 msg->msg_flags & MSG_DONTWAIT);
2171 if (IS_ERR(skb))
2172 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002173
2174 /* Create L2CAP header */
2175 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002176 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenkodaf6a78c2012-05-03 10:55:52 +03002177 lh->len = cpu_to_le16(len + L2CAP_PSMLEN_SIZE);
Marcel Holtmann43b1b8d2013-10-12 06:01:26 -07002178 put_unaligned(chan->psm, (__le16 *) skb_put(skb, L2CAP_PSMLEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002179
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002180 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002181 if (unlikely(err < 0)) {
2182 kfree_skb(skb);
2183 return ERR_PTR(err);
2184 }
2185 return skb;
2186}
2187
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002188static struct sk_buff *l2cap_create_basic_pdu(struct l2cap_chan *chan,
Marcel Holtmann8d463212014-06-05 15:22:51 +02002189 struct msghdr *msg, size_t len)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002190{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002191 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002192 struct sk_buff *skb;
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002193 int err, count;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002194 struct l2cap_hdr *lh;
2195
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002196 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002197
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002198 count = min_t(unsigned int, (conn->mtu - L2CAP_HDR_SIZE), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002199
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002200 skb = chan->ops->alloc_skb(chan, count + L2CAP_HDR_SIZE,
Gustavo Padovan90338942012-04-06 20:15:47 -03002201 msg->msg_flags & MSG_DONTWAIT);
2202 if (IS_ERR(skb))
2203 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002204
2205 /* Create L2CAP header */
2206 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002207 lh->cid = cpu_to_le16(chan->dcid);
Gustavo Padovan6ff9b5e2012-05-02 11:56:17 -03002208 lh->len = cpu_to_le16(len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002209
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002210 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002211 if (unlikely(err < 0)) {
2212 kfree_skb(skb);
2213 return ERR_PTR(err);
2214 }
2215 return skb;
2216}
2217
Luiz Augusto von Dentzab0ff762011-09-12 20:00:50 +03002218static struct sk_buff *l2cap_create_iframe_pdu(struct l2cap_chan *chan,
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002219 struct msghdr *msg, size_t len,
2220 u16 sdulen)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002221{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002222 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002223 struct sk_buff *skb;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002224 int err, count, hlen;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002225 struct l2cap_hdr *lh;
2226
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002227 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002228
Gustavo F. Padovan0ee0d202010-05-01 16:15:41 -03002229 if (!conn)
2230 return ERR_PTR(-ENOTCONN);
2231
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002232 hlen = __ertm_hdr_size(chan);
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002233
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002234 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002235 hlen += L2CAP_SDULEN_SIZE;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002236
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03002237 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002238 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03002239
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002240 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002241
2242 skb = chan->ops->alloc_skb(chan, count + hlen,
Gustavo Padovan90338942012-04-06 20:15:47 -03002243 msg->msg_flags & MSG_DONTWAIT);
2244 if (IS_ERR(skb))
2245 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002246
2247 /* Create L2CAP header */
2248 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002249 lh->cid = cpu_to_le16(chan->dcid);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002250 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002251
Mat Martineau18a48e72012-05-17 20:53:34 -07002252 /* Control header is populated later */
2253 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
2254 put_unaligned_le32(0, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
2255 else
2256 put_unaligned_le16(0, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002257
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002258 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002259 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002260
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002261 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002262 if (unlikely(err < 0)) {
2263 kfree_skb(skb);
2264 return ERR_PTR(err);
2265 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03002266
Mat Martineau18a48e72012-05-17 20:53:34 -07002267 bt_cb(skb)->control.fcs = chan->fcs;
Mat Martineau3ce35142012-04-25 16:36:14 -07002268 bt_cb(skb)->control.retries = 0;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002269 return skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002270}
2271
Mat Martineau94122bb2012-05-02 09:42:02 -07002272static int l2cap_segment_sdu(struct l2cap_chan *chan,
2273 struct sk_buff_head *seg_queue,
2274 struct msghdr *msg, size_t len)
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002275{
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002276 struct sk_buff *skb;
Mat Martineau94122bb2012-05-02 09:42:02 -07002277 u16 sdu_len;
2278 size_t pdu_len;
Mat Martineau94122bb2012-05-02 09:42:02 -07002279 u8 sar;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002280
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002281 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002282
Mat Martineau94122bb2012-05-02 09:42:02 -07002283 /* It is critical that ERTM PDUs fit in a single HCI fragment,
2284 * so fragmented skbs are not used. The HCI layer's handling
2285 * of fragmented skbs is not compatible with ERTM's queueing.
2286 */
2287
2288 /* PDU size is derived from the HCI MTU */
2289 pdu_len = chan->conn->mtu;
2290
Mat Martineaua5495742012-10-23 15:24:21 -07002291 /* Constrain PDU size for BR/EDR connections */
2292 if (!chan->hs_hcon)
2293 pdu_len = min_t(size_t, pdu_len, L2CAP_BREDR_MAX_PAYLOAD);
Mat Martineau94122bb2012-05-02 09:42:02 -07002294
2295 /* Adjust for largest possible L2CAP overhead. */
Gustavo Padovan35d401d2012-05-25 18:57:05 -03002296 if (chan->fcs)
2297 pdu_len -= L2CAP_FCS_SIZE;
2298
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002299 pdu_len -= __ertm_hdr_size(chan);
Mat Martineau94122bb2012-05-02 09:42:02 -07002300
2301 /* Remote device may have requested smaller PDUs */
2302 pdu_len = min_t(size_t, pdu_len, chan->remote_mps);
2303
2304 if (len <= pdu_len) {
2305 sar = L2CAP_SAR_UNSEGMENTED;
2306 sdu_len = 0;
2307 pdu_len = len;
2308 } else {
2309 sar = L2CAP_SAR_START;
2310 sdu_len = len;
2311 pdu_len -= L2CAP_SDULEN_SIZE;
2312 }
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002313
2314 while (len > 0) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002315 skb = l2cap_create_iframe_pdu(chan, msg, pdu_len, sdu_len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002316
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002317 if (IS_ERR(skb)) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002318 __skb_queue_purge(seg_queue);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002319 return PTR_ERR(skb);
2320 }
2321
Mat Martineau94122bb2012-05-02 09:42:02 -07002322 bt_cb(skb)->control.sar = sar;
2323 __skb_queue_tail(seg_queue, skb);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002324
Mat Martineau94122bb2012-05-02 09:42:02 -07002325 len -= pdu_len;
2326 if (sdu_len) {
2327 sdu_len = 0;
2328 pdu_len += L2CAP_SDULEN_SIZE;
2329 }
2330
2331 if (len <= pdu_len) {
2332 sar = L2CAP_SAR_END;
2333 pdu_len = len;
2334 } else {
2335 sar = L2CAP_SAR_CONTINUE;
2336 }
2337 }
2338
Gustavo Padovanf0f62792012-05-29 13:29:17 -03002339 return 0;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002340}
2341
Johan Hedberg177f8f22013-05-31 17:54:51 +03002342static struct sk_buff *l2cap_create_le_flowctl_pdu(struct l2cap_chan *chan,
2343 struct msghdr *msg,
2344 size_t len, u16 sdulen)
2345{
2346 struct l2cap_conn *conn = chan->conn;
2347 struct sk_buff *skb;
2348 int err, count, hlen;
2349 struct l2cap_hdr *lh;
2350
2351 BT_DBG("chan %p len %zu", chan, len);
2352
2353 if (!conn)
2354 return ERR_PTR(-ENOTCONN);
2355
2356 hlen = L2CAP_HDR_SIZE;
2357
2358 if (sdulen)
2359 hlen += L2CAP_SDULEN_SIZE;
2360
2361 count = min_t(unsigned int, (conn->mtu - hlen), len);
2362
2363 skb = chan->ops->alloc_skb(chan, count + hlen,
2364 msg->msg_flags & MSG_DONTWAIT);
2365 if (IS_ERR(skb))
2366 return skb;
2367
2368 /* Create L2CAP header */
2369 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
2370 lh->cid = cpu_to_le16(chan->dcid);
2371 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
2372
2373 if (sdulen)
2374 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
2375
2376 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
2377 if (unlikely(err < 0)) {
2378 kfree_skb(skb);
2379 return ERR_PTR(err);
2380 }
2381
2382 return skb;
2383}
2384
2385static int l2cap_segment_le_sdu(struct l2cap_chan *chan,
2386 struct sk_buff_head *seg_queue,
2387 struct msghdr *msg, size_t len)
2388{
2389 struct sk_buff *skb;
2390 size_t pdu_len;
2391 u16 sdu_len;
2392
2393 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
2394
2395 pdu_len = chan->conn->mtu - L2CAP_HDR_SIZE;
2396
2397 pdu_len = min_t(size_t, pdu_len, chan->remote_mps);
2398
2399 sdu_len = len;
2400 pdu_len -= L2CAP_SDULEN_SIZE;
2401
2402 while (len > 0) {
2403 if (len <= pdu_len)
2404 pdu_len = len;
2405
2406 skb = l2cap_create_le_flowctl_pdu(chan, msg, pdu_len, sdu_len);
2407 if (IS_ERR(skb)) {
2408 __skb_queue_purge(seg_queue);
2409 return PTR_ERR(skb);
2410 }
2411
2412 __skb_queue_tail(seg_queue, skb);
2413
2414 len -= pdu_len;
2415
2416 if (sdu_len) {
2417 sdu_len = 0;
2418 pdu_len += L2CAP_SDULEN_SIZE;
2419 }
2420 }
2421
2422 return 0;
2423}
2424
Marcel Holtmann8d463212014-06-05 15:22:51 +02002425int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002426{
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002427 struct sk_buff *skb;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002428 int err;
Mat Martineau94122bb2012-05-02 09:42:02 -07002429 struct sk_buff_head seg_queue;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002430
Seung-Woo Kim31e8ce82013-11-05 18:46:33 +09002431 if (!chan->conn)
2432 return -ENOTCONN;
2433
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002434 /* Connectionless channel */
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002435 if (chan->chan_type == L2CAP_CHAN_CONN_LESS) {
Marcel Holtmann8d463212014-06-05 15:22:51 +02002436 skb = l2cap_create_connless_pdu(chan, msg, len);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002437 if (IS_ERR(skb))
2438 return PTR_ERR(skb);
2439
Andrzej Kaczmarekede81a22014-02-25 17:16:22 +01002440 /* Channel lock is released before requesting new skb and then
2441 * reacquired thus we need to recheck channel state.
2442 */
2443 if (chan->state != BT_CONNECTED) {
2444 kfree_skb(skb);
2445 return -ENOTCONN;
2446 }
2447
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002448 l2cap_do_send(chan, skb);
2449 return len;
2450 }
2451
2452 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03002453 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedberg177f8f22013-05-31 17:54:51 +03002454 /* Check outgoing MTU */
2455 if (len > chan->omtu)
2456 return -EMSGSIZE;
2457
Johan Hedbergfad5fc82013-12-05 09:45:01 +02002458 if (!chan->tx_credits)
2459 return -EAGAIN;
2460
Johan Hedberg177f8f22013-05-31 17:54:51 +03002461 __skb_queue_head_init(&seg_queue);
2462
2463 err = l2cap_segment_le_sdu(chan, &seg_queue, msg, len);
2464
2465 if (chan->state != BT_CONNECTED) {
2466 __skb_queue_purge(&seg_queue);
2467 err = -ENOTCONN;
2468 }
2469
2470 if (err)
2471 return err;
2472
2473 skb_queue_splice_tail_init(&seg_queue, &chan->tx_q);
2474
2475 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
2476 l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
2477 chan->tx_credits--;
2478 }
2479
2480 if (!chan->tx_credits)
2481 chan->ops->suspend(chan);
2482
2483 err = len;
2484
2485 break;
2486
Johan Hedbergfad5fc82013-12-05 09:45:01 +02002487 case L2CAP_MODE_BASIC:
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002488 /* Check outgoing MTU */
2489 if (len > chan->omtu)
2490 return -EMSGSIZE;
2491
2492 /* Create a basic PDU */
Marcel Holtmann8d463212014-06-05 15:22:51 +02002493 skb = l2cap_create_basic_pdu(chan, msg, len);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002494 if (IS_ERR(skb))
2495 return PTR_ERR(skb);
2496
Andrzej Kaczmarekede81a22014-02-25 17:16:22 +01002497 /* Channel lock is released before requesting new skb and then
2498 * reacquired thus we need to recheck channel state.
2499 */
2500 if (chan->state != BT_CONNECTED) {
2501 kfree_skb(skb);
2502 return -ENOTCONN;
2503 }
2504
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002505 l2cap_do_send(chan, skb);
2506 err = len;
2507 break;
2508
2509 case L2CAP_MODE_ERTM:
2510 case L2CAP_MODE_STREAMING:
Mat Martineau94122bb2012-05-02 09:42:02 -07002511 /* Check outgoing MTU */
2512 if (len > chan->omtu) {
2513 err = -EMSGSIZE;
2514 break;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002515 }
2516
Mat Martineau94122bb2012-05-02 09:42:02 -07002517 __skb_queue_head_init(&seg_queue);
2518
2519 /* Do segmentation before calling in to the state machine,
2520 * since it's possible to block while waiting for memory
2521 * allocation.
2522 */
2523 err = l2cap_segment_sdu(chan, &seg_queue, msg, len);
2524
2525 /* The channel could have been closed while segmenting,
2526 * check that it is still connected.
2527 */
2528 if (chan->state != BT_CONNECTED) {
2529 __skb_queue_purge(&seg_queue);
2530 err = -ENOTCONN;
2531 }
2532
2533 if (err)
2534 break;
2535
Mat Martineau37339372012-05-17 20:53:33 -07002536 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo Padovand6603662012-05-21 13:58:22 -03002537 l2cap_tx(chan, NULL, &seg_queue, L2CAP_EV_DATA_REQUEST);
Mat Martineau37339372012-05-17 20:53:33 -07002538 else
Gustavo Padovand6603662012-05-21 13:58:22 -03002539 l2cap_streaming_send(chan, &seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002540
Gustavo Padovand6603662012-05-21 13:58:22 -03002541 err = len;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002542
Mat Martineau94122bb2012-05-02 09:42:02 -07002543 /* If the skbs were not queued for sending, they'll still be in
2544 * seg_queue and need to be purged.
2545 */
2546 __skb_queue_purge(&seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002547 break;
2548
2549 default:
2550 BT_DBG("bad state %1.1x", chan->mode);
2551 err = -EBADFD;
2552 }
2553
2554 return err;
2555}
2556
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002557static void l2cap_send_srej(struct l2cap_chan *chan, u16 txseq)
2558{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002559 struct l2cap_ctrl control;
2560 u16 seq;
2561
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002562 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002563
2564 memset(&control, 0, sizeof(control));
2565 control.sframe = 1;
2566 control.super = L2CAP_SUPER_SREJ;
2567
2568 for (seq = chan->expected_tx_seq; seq != txseq;
2569 seq = __next_seq(chan, seq)) {
2570 if (!l2cap_ertm_seq_in_queue(&chan->srej_q, seq)) {
2571 control.reqseq = seq;
2572 l2cap_send_sframe(chan, &control);
2573 l2cap_seq_list_append(&chan->srej_list, seq);
2574 }
2575 }
2576
2577 chan->expected_tx_seq = __next_seq(chan, txseq);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002578}
2579
2580static void l2cap_send_srej_tail(struct l2cap_chan *chan)
2581{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002582 struct l2cap_ctrl control;
2583
2584 BT_DBG("chan %p", chan);
2585
2586 if (chan->srej_list.tail == L2CAP_SEQ_LIST_CLEAR)
2587 return;
2588
2589 memset(&control, 0, sizeof(control));
2590 control.sframe = 1;
2591 control.super = L2CAP_SUPER_SREJ;
2592 control.reqseq = chan->srej_list.tail;
2593 l2cap_send_sframe(chan, &control);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002594}
2595
2596static void l2cap_send_srej_list(struct l2cap_chan *chan, u16 txseq)
2597{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002598 struct l2cap_ctrl control;
2599 u16 initial_head;
2600 u16 seq;
2601
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002602 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002603
2604 memset(&control, 0, sizeof(control));
2605 control.sframe = 1;
2606 control.super = L2CAP_SUPER_SREJ;
2607
2608 /* Capture initial list head to allow only one pass through the list. */
2609 initial_head = chan->srej_list.head;
2610
2611 do {
2612 seq = l2cap_seq_list_pop(&chan->srej_list);
2613 if (seq == txseq || seq == L2CAP_SEQ_LIST_CLEAR)
2614 break;
2615
2616 control.reqseq = seq;
2617 l2cap_send_sframe(chan, &control);
2618 l2cap_seq_list_append(&chan->srej_list, seq);
2619 } while (chan->srej_list.head != initial_head);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002620}
2621
Mat Martineau608bcc62012-05-17 20:53:32 -07002622static void l2cap_process_reqseq(struct l2cap_chan *chan, u16 reqseq)
2623{
2624 struct sk_buff *acked_skb;
2625 u16 ackseq;
2626
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002627 BT_DBG("chan %p, reqseq %u", chan, reqseq);
Mat Martineau608bcc62012-05-17 20:53:32 -07002628
2629 if (chan->unacked_frames == 0 || reqseq == chan->expected_ack_seq)
2630 return;
2631
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002632 BT_DBG("expected_ack_seq %u, unacked_frames %u",
Mat Martineau608bcc62012-05-17 20:53:32 -07002633 chan->expected_ack_seq, chan->unacked_frames);
2634
2635 for (ackseq = chan->expected_ack_seq; ackseq != reqseq;
2636 ackseq = __next_seq(chan, ackseq)) {
2637
2638 acked_skb = l2cap_ertm_seq_in_queue(&chan->tx_q, ackseq);
2639 if (acked_skb) {
2640 skb_unlink(acked_skb, &chan->tx_q);
2641 kfree_skb(acked_skb);
2642 chan->unacked_frames--;
2643 }
2644 }
2645
2646 chan->expected_ack_seq = reqseq;
2647
2648 if (chan->unacked_frames == 0)
2649 __clear_retrans_timer(chan);
2650
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002651 BT_DBG("unacked_frames %u", chan->unacked_frames);
Mat Martineau608bcc62012-05-17 20:53:32 -07002652}
2653
2654static void l2cap_abort_rx_srej_sent(struct l2cap_chan *chan)
2655{
2656 BT_DBG("chan %p", chan);
2657
2658 chan->expected_tx_seq = chan->buffer_seq;
2659 l2cap_seq_list_clear(&chan->srej_list);
2660 skb_queue_purge(&chan->srej_q);
2661 chan->rx_state = L2CAP_RX_STATE_RECV;
2662}
2663
Gustavo Padovand6603662012-05-21 13:58:22 -03002664static void l2cap_tx_state_xmit(struct l2cap_chan *chan,
2665 struct l2cap_ctrl *control,
2666 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002667{
Mat Martineau608bcc62012-05-17 20:53:32 -07002668 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2669 event);
2670
2671 switch (event) {
2672 case L2CAP_EV_DATA_REQUEST:
2673 if (chan->tx_send_head == NULL)
2674 chan->tx_send_head = skb_peek(skbs);
2675
2676 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2677 l2cap_ertm_send(chan);
2678 break;
2679 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2680 BT_DBG("Enter LOCAL_BUSY");
2681 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2682
2683 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2684 /* The SREJ_SENT state must be aborted if we are to
2685 * enter the LOCAL_BUSY state.
2686 */
2687 l2cap_abort_rx_srej_sent(chan);
2688 }
2689
2690 l2cap_send_ack(chan);
2691
2692 break;
2693 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2694 BT_DBG("Exit LOCAL_BUSY");
2695 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2696
2697 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2698 struct l2cap_ctrl local_control;
2699
2700 memset(&local_control, 0, sizeof(local_control));
2701 local_control.sframe = 1;
2702 local_control.super = L2CAP_SUPER_RR;
2703 local_control.poll = 1;
2704 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002705 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002706
2707 chan->retry_count = 1;
2708 __set_monitor_timer(chan);
2709 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2710 }
2711 break;
2712 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2713 l2cap_process_reqseq(chan, control->reqseq);
2714 break;
2715 case L2CAP_EV_EXPLICIT_POLL:
2716 l2cap_send_rr_or_rnr(chan, 1);
2717 chan->retry_count = 1;
2718 __set_monitor_timer(chan);
2719 __clear_ack_timer(chan);
2720 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2721 break;
2722 case L2CAP_EV_RETRANS_TO:
2723 l2cap_send_rr_or_rnr(chan, 1);
2724 chan->retry_count = 1;
2725 __set_monitor_timer(chan);
2726 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2727 break;
2728 case L2CAP_EV_RECV_FBIT:
2729 /* Nothing to process */
2730 break;
2731 default:
2732 break;
2733 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002734}
2735
Gustavo Padovand6603662012-05-21 13:58:22 -03002736static void l2cap_tx_state_wait_f(struct l2cap_chan *chan,
2737 struct l2cap_ctrl *control,
2738 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002739{
Mat Martineau608bcc62012-05-17 20:53:32 -07002740 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2741 event);
2742
2743 switch (event) {
2744 case L2CAP_EV_DATA_REQUEST:
2745 if (chan->tx_send_head == NULL)
2746 chan->tx_send_head = skb_peek(skbs);
2747 /* Queue data, but don't send. */
2748 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2749 break;
2750 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2751 BT_DBG("Enter LOCAL_BUSY");
2752 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2753
2754 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2755 /* The SREJ_SENT state must be aborted if we are to
2756 * enter the LOCAL_BUSY state.
2757 */
2758 l2cap_abort_rx_srej_sent(chan);
2759 }
2760
2761 l2cap_send_ack(chan);
2762
2763 break;
2764 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2765 BT_DBG("Exit LOCAL_BUSY");
2766 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2767
2768 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2769 struct l2cap_ctrl local_control;
2770 memset(&local_control, 0, sizeof(local_control));
2771 local_control.sframe = 1;
2772 local_control.super = L2CAP_SUPER_RR;
2773 local_control.poll = 1;
2774 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002775 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002776
2777 chan->retry_count = 1;
2778 __set_monitor_timer(chan);
2779 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2780 }
2781 break;
2782 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2783 l2cap_process_reqseq(chan, control->reqseq);
2784
2785 /* Fall through */
2786
2787 case L2CAP_EV_RECV_FBIT:
2788 if (control && control->final) {
2789 __clear_monitor_timer(chan);
2790 if (chan->unacked_frames > 0)
2791 __set_retrans_timer(chan);
2792 chan->retry_count = 0;
2793 chan->tx_state = L2CAP_TX_STATE_XMIT;
2794 BT_DBG("recv fbit tx_state 0x2.2%x", chan->tx_state);
2795 }
2796 break;
2797 case L2CAP_EV_EXPLICIT_POLL:
2798 /* Ignore */
2799 break;
2800 case L2CAP_EV_MONITOR_TO:
2801 if (chan->max_tx == 0 || chan->retry_count < chan->max_tx) {
2802 l2cap_send_rr_or_rnr(chan, 1);
2803 __set_monitor_timer(chan);
2804 chan->retry_count++;
2805 } else {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02002806 l2cap_send_disconn_req(chan, ECONNABORTED);
Mat Martineau608bcc62012-05-17 20:53:32 -07002807 }
2808 break;
2809 default:
2810 break;
2811 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002812}
2813
Gustavo Padovand6603662012-05-21 13:58:22 -03002814static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
2815 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002816{
Mat Martineau608bcc62012-05-17 20:53:32 -07002817 BT_DBG("chan %p, control %p, skbs %p, event %d, state %d",
2818 chan, control, skbs, event, chan->tx_state);
2819
2820 switch (chan->tx_state) {
2821 case L2CAP_TX_STATE_XMIT:
Gustavo Padovand6603662012-05-21 13:58:22 -03002822 l2cap_tx_state_xmit(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002823 break;
2824 case L2CAP_TX_STATE_WAIT_F:
Gustavo Padovand6603662012-05-21 13:58:22 -03002825 l2cap_tx_state_wait_f(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002826 break;
2827 default:
2828 /* Ignore event */
2829 break;
2830 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002831}
2832
Mat Martineau4b51dae92012-05-17 20:53:37 -07002833static void l2cap_pass_to_tx(struct l2cap_chan *chan,
2834 struct l2cap_ctrl *control)
2835{
2836 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002837 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_REQSEQ_AND_FBIT);
Mat Martineau4b51dae92012-05-17 20:53:37 -07002838}
2839
Mat Martineauf80842a2012-05-17 20:53:46 -07002840static void l2cap_pass_to_tx_fbit(struct l2cap_chan *chan,
2841 struct l2cap_ctrl *control)
2842{
2843 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002844 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_FBIT);
Mat Martineauf80842a2012-05-17 20:53:46 -07002845}
2846
Linus Torvalds1da177e2005-04-16 15:20:36 -07002847/* Copy frame to all raw sockets on that connection */
2848static void l2cap_raw_recv(struct l2cap_conn *conn, struct sk_buff *skb)
2849{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002850 struct sk_buff *nskb;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03002851 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002852
2853 BT_DBG("conn %p", conn);
2854
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002855 mutex_lock(&conn->chan_lock);
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002856
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002857 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002858 if (chan->chan_type != L2CAP_CHAN_RAW)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002859 continue;
2860
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002861 /* Don't send frame to the channel it came from */
2862 if (bt_cb(skb)->chan == chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002863 continue;
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002864
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002865 nskb = skb_clone(skb, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03002866 if (!nskb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002867 continue;
Gustavo Padovan80b98022012-05-27 22:27:51 -03002868 if (chan->ops->recv(chan, nskb))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002869 kfree_skb(nskb);
2870 }
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002871
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002872 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002873}
2874
2875/* ---- L2CAP signalling commands ---- */
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002876static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn, u8 code,
2877 u8 ident, u16 dlen, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002878{
2879 struct sk_buff *skb, **frag;
2880 struct l2cap_cmd_hdr *cmd;
2881 struct l2cap_hdr *lh;
2882 int len, count;
2883
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002884 BT_DBG("conn %p, code 0x%2.2x, ident 0x%2.2x, len %u",
2885 conn, code, ident, dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002886
Anderson Lizardo300b9622013-06-02 16:30:40 -04002887 if (conn->mtu < L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE)
2888 return NULL;
2889
Linus Torvalds1da177e2005-04-16 15:20:36 -07002890 len = L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE + dlen;
2891 count = min_t(unsigned int, conn->mtu, len);
2892
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002893 skb = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002894 if (!skb)
2895 return NULL;
2896
2897 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002898 lh->len = cpu_to_le16(L2CAP_CMD_HDR_SIZE + dlen);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002899
2900 if (conn->hcon->type == LE_LINK)
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002901 lh->cid = cpu_to_le16(L2CAP_CID_LE_SIGNALING);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002902 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002903 lh->cid = cpu_to_le16(L2CAP_CID_SIGNALING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002904
2905 cmd = (struct l2cap_cmd_hdr *) skb_put(skb, L2CAP_CMD_HDR_SIZE);
2906 cmd->code = code;
2907 cmd->ident = ident;
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002908 cmd->len = cpu_to_le16(dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002909
2910 if (dlen) {
2911 count -= L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE;
2912 memcpy(skb_put(skb, count), data, count);
2913 data += count;
2914 }
2915
2916 len -= skb->len;
2917
2918 /* Continuation fragments (no L2CAP header) */
2919 frag = &skb_shinfo(skb)->frag_list;
2920 while (len) {
2921 count = min_t(unsigned int, conn->mtu, len);
2922
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002923 *frag = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002924 if (!*frag)
2925 goto fail;
2926
2927 memcpy(skb_put(*frag, count), data, count);
2928
2929 len -= count;
2930 data += count;
2931
2932 frag = &(*frag)->next;
2933 }
2934
2935 return skb;
2936
2937fail:
2938 kfree_skb(skb);
2939 return NULL;
2940}
2941
Gustavo Padovan2d792812012-10-06 10:07:01 +01002942static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen,
2943 unsigned long *val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002944{
2945 struct l2cap_conf_opt *opt = *ptr;
2946 int len;
2947
2948 len = L2CAP_CONF_OPT_SIZE + opt->len;
2949 *ptr += len;
2950
2951 *type = opt->type;
2952 *olen = opt->len;
2953
2954 switch (opt->len) {
2955 case 1:
2956 *val = *((u8 *) opt->val);
2957 break;
2958
2959 case 2:
steven miaobfaaeb32010-10-16 18:29:47 -04002960 *val = get_unaligned_le16(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002961 break;
2962
2963 case 4:
steven miaobfaaeb32010-10-16 18:29:47 -04002964 *val = get_unaligned_le32(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002965 break;
2966
2967 default:
2968 *val = (unsigned long) opt->val;
2969 break;
2970 }
2971
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002972 BT_DBG("type 0x%2.2x len %u val 0x%lx", *type, opt->len, *val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002973 return len;
2974}
2975
Linus Torvalds1da177e2005-04-16 15:20:36 -07002976static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val)
2977{
2978 struct l2cap_conf_opt *opt = *ptr;
2979
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002980 BT_DBG("type 0x%2.2x len %u val 0x%lx", type, len, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002981
2982 opt->type = type;
2983 opt->len = len;
2984
2985 switch (len) {
2986 case 1:
2987 *((u8 *) opt->val) = val;
2988 break;
2989
2990 case 2:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02002991 put_unaligned_le16(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002992 break;
2993
2994 case 4:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02002995 put_unaligned_le32(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002996 break;
2997
2998 default:
2999 memcpy(opt->val, (void *) val, len);
3000 break;
3001 }
3002
3003 *ptr += L2CAP_CONF_OPT_SIZE + len;
3004}
3005
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003006static void l2cap_add_opt_efs(void **ptr, struct l2cap_chan *chan)
3007{
3008 struct l2cap_conf_efs efs;
3009
Szymon Janc1ec918c2011-11-16 09:32:21 +01003010 switch (chan->mode) {
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003011 case L2CAP_MODE_ERTM:
3012 efs.id = chan->local_id;
3013 efs.stype = chan->local_stype;
3014 efs.msdu = cpu_to_le16(chan->local_msdu);
3015 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003016 efs.acc_lat = cpu_to_le32(L2CAP_DEFAULT_ACC_LAT);
3017 efs.flush_to = cpu_to_le32(L2CAP_EFS_DEFAULT_FLUSH_TO);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003018 break;
3019
3020 case L2CAP_MODE_STREAMING:
3021 efs.id = 1;
3022 efs.stype = L2CAP_SERV_BESTEFFORT;
3023 efs.msdu = cpu_to_le16(chan->local_msdu);
3024 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
3025 efs.acc_lat = 0;
3026 efs.flush_to = 0;
3027 break;
3028
3029 default:
3030 return;
3031 }
3032
3033 l2cap_add_conf_opt(ptr, L2CAP_CONF_EFS, sizeof(efs),
Andrei Emeltchenko8936fa62012-10-08 11:14:41 +03003034 (unsigned long) &efs);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003035}
3036
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003037static void l2cap_ack_timeout(struct work_struct *work)
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003038{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003039 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau03625202012-05-17 20:53:51 -07003040 ack_timer.work);
3041 u16 frames_to_ack;
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003042
Gustavo F. Padovan2fb9b3d2011-12-22 16:56:05 -02003043 BT_DBG("chan %p", chan);
3044
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003045 l2cap_chan_lock(chan);
3046
Mat Martineau03625202012-05-17 20:53:51 -07003047 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
3048 chan->last_acked_seq);
3049
3050 if (frames_to_ack)
3051 l2cap_send_rr_or_rnr(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003052
3053 l2cap_chan_unlock(chan);
Szymon Janc09bfb2e2012-01-11 10:59:49 +01003054 l2cap_chan_put(chan);
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003055}
3056
Andrei Emeltchenko466f8002012-05-29 13:59:01 +03003057int l2cap_ertm_init(struct l2cap_chan *chan)
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003058{
Mat Martineau3c588192012-04-11 10:48:42 -07003059 int err;
3060
Mat Martineau105bdf92012-04-27 16:50:48 -07003061 chan->next_tx_seq = 0;
3062 chan->expected_tx_seq = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003063 chan->expected_ack_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003064 chan->unacked_frames = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003065 chan->buffer_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003066 chan->frames_sent = 0;
Mat Martineau105bdf92012-04-27 16:50:48 -07003067 chan->last_acked_seq = 0;
3068 chan->sdu = NULL;
3069 chan->sdu_last_frag = NULL;
3070 chan->sdu_len = 0;
3071
Mat Martineaud34c34f2012-05-14 14:49:27 -07003072 skb_queue_head_init(&chan->tx_q);
3073
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003074 chan->local_amp_id = AMP_ID_BREDR;
3075 chan->move_id = AMP_ID_BREDR;
Mat Martineau08333282012-10-23 15:24:06 -07003076 chan->move_state = L2CAP_MOVE_STABLE;
3077 chan->move_role = L2CAP_MOVE_ROLE_NONE;
3078
Mat Martineau105bdf92012-04-27 16:50:48 -07003079 if (chan->mode != L2CAP_MODE_ERTM)
3080 return 0;
3081
3082 chan->rx_state = L2CAP_RX_STATE_RECV;
3083 chan->tx_state = L2CAP_TX_STATE_XMIT;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003084
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003085 INIT_DELAYED_WORK(&chan->retrans_timer, l2cap_retrans_timeout);
3086 INIT_DELAYED_WORK(&chan->monitor_timer, l2cap_monitor_timeout);
3087 INIT_DELAYED_WORK(&chan->ack_timer, l2cap_ack_timeout);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003088
Gustavo F. Padovanf1c67752011-03-25 20:36:10 -03003089 skb_queue_head_init(&chan->srej_q);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03003090
Mat Martineau3c588192012-04-11 10:48:42 -07003091 err = l2cap_seq_list_init(&chan->srej_list, chan->tx_win);
3092 if (err < 0)
3093 return err;
3094
Mat Martineau9dc9aff2012-05-17 16:20:14 -07003095 err = l2cap_seq_list_init(&chan->retrans_list, chan->remote_tx_win);
3096 if (err < 0)
3097 l2cap_seq_list_free(&chan->srej_list);
3098
3099 return err;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003100}
3101
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003102static inline __u8 l2cap_select_mode(__u8 mode, __u16 remote_feat_mask)
3103{
3104 switch (mode) {
3105 case L2CAP_MODE_STREAMING:
3106 case L2CAP_MODE_ERTM:
3107 if (l2cap_mode_supported(mode, remote_feat_mask))
3108 return mode;
3109 /* fall through */
3110 default:
3111 return L2CAP_MODE_BASIC;
3112 }
3113}
3114
Marcel Holtmann848566b2013-10-01 22:59:22 -07003115static inline bool __l2cap_ews_supported(struct l2cap_conn *conn)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003116{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003117 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003118}
3119
Marcel Holtmann848566b2013-10-01 22:59:22 -07003120static inline bool __l2cap_efs_supported(struct l2cap_conn *conn)
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003121{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003122 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_FLOW;
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003123}
3124
Mat Martineau36c86c82012-10-23 15:24:20 -07003125static void __l2cap_set_ertm_timeouts(struct l2cap_chan *chan,
3126 struct l2cap_conf_rfc *rfc)
3127{
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003128 if (chan->local_amp_id != AMP_ID_BREDR && chan->hs_hcon) {
Mat Martineau36c86c82012-10-23 15:24:20 -07003129 u64 ertm_to = chan->hs_hcon->hdev->amp_be_flush_to;
3130
3131 /* Class 1 devices have must have ERTM timeouts
3132 * exceeding the Link Supervision Timeout. The
3133 * default Link Supervision Timeout for AMP
3134 * controllers is 10 seconds.
3135 *
3136 * Class 1 devices use 0xffffffff for their
3137 * best-effort flush timeout, so the clamping logic
3138 * will result in a timeout that meets the above
3139 * requirement. ERTM timeouts are 16-bit values, so
3140 * the maximum timeout is 65.535 seconds.
3141 */
3142
3143 /* Convert timeout to milliseconds and round */
3144 ertm_to = DIV_ROUND_UP_ULL(ertm_to, 1000);
3145
3146 /* This is the recommended formula for class 2 devices
3147 * that start ERTM timers when packets are sent to the
3148 * controller.
3149 */
3150 ertm_to = 3 * ertm_to + 500;
3151
3152 if (ertm_to > 0xffff)
3153 ertm_to = 0xffff;
3154
3155 rfc->retrans_timeout = cpu_to_le16((u16) ertm_to);
3156 rfc->monitor_timeout = rfc->retrans_timeout;
3157 } else {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003158 rfc->retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO);
3159 rfc->monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO);
Mat Martineau36c86c82012-10-23 15:24:20 -07003160 }
3161}
3162
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003163static inline void l2cap_txwin_setup(struct l2cap_chan *chan)
3164{
3165 if (chan->tx_win > L2CAP_DEFAULT_TX_WINDOW &&
Marcel Holtmann848566b2013-10-01 22:59:22 -07003166 __l2cap_ews_supported(chan->conn)) {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003167 /* use extended control field */
3168 set_bit(FLAG_EXT_CTRL, &chan->flags);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003169 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
3170 } else {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003171 chan->tx_win = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003172 L2CAP_DEFAULT_TX_WINDOW);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003173 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
3174 }
Mat Martineauc20f8e32012-07-10 05:47:07 -07003175 chan->ack_win = chan->tx_win;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003176}
3177
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003178static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003179{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003180 struct l2cap_conf_req *req = data;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003181 struct l2cap_conf_rfc rfc = { .mode = chan->mode };
Linus Torvalds1da177e2005-04-16 15:20:36 -07003182 void *ptr = req->data;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003183 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003184
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03003185 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003186
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003187 if (chan->num_conf_req || chan->num_conf_rsp)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003188 goto done;
3189
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003190 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003191 case L2CAP_MODE_STREAMING:
3192 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003193 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state))
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003194 break;
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003195
Marcel Holtmann848566b2013-10-01 22:59:22 -07003196 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003197 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3198
Gustavo F. Padovan2ba13ed2010-06-09 16:39:05 -03003199 /* fall through */
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003200 default:
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003201 chan->mode = l2cap_select_mode(rfc.mode, chan->conn->feat_mask);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003202 break;
3203 }
3204
3205done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003206 if (chan->imtu != L2CAP_DEFAULT_MTU)
3207 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovan7990681c2011-01-24 16:01:43 -02003208
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003209 switch (chan->mode) {
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003210 case L2CAP_MODE_BASIC:
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003211 if (!(chan->conn->feat_mask & L2CAP_FEAT_ERTM) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003212 !(chan->conn->feat_mask & L2CAP_FEAT_STREAMING))
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003213 break;
3214
Gustavo F. Padovan62547752010-06-08 20:05:31 -03003215 rfc.mode = L2CAP_MODE_BASIC;
3216 rfc.txwin_size = 0;
3217 rfc.max_transmit = 0;
3218 rfc.retrans_timeout = 0;
3219 rfc.monitor_timeout = 0;
3220 rfc.max_pdu_size = 0;
3221
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003222 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003223 (unsigned long) &rfc);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003224 break;
3225
3226 case L2CAP_MODE_ERTM:
3227 rfc.mode = L2CAP_MODE_ERTM;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003228 rfc.max_transmit = chan->max_tx;
Mat Martineau36c86c82012-10-23 15:24:20 -07003229
3230 __l2cap_set_ertm_timeouts(chan, &rfc);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003231
3232 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003233 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3234 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003235 rfc.max_pdu_size = cpu_to_le16(size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003236
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003237 l2cap_txwin_setup(chan);
3238
3239 rfc.txwin_size = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003240 L2CAP_DEFAULT_TX_WINDOW);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003241
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 Emeltchenko6327eb92011-10-11 13:37:42 +03003248 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3249 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003250 chan->tx_win);
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003251
3252 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3253 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003254 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003255 chan->fcs = L2CAP_FCS_NONE;
3256 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3257 chan->fcs);
3258 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003259 break;
3260
3261 case L2CAP_MODE_STREAMING:
Mat Martineau273759e2012-05-17 20:53:53 -07003262 l2cap_txwin_setup(chan);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003263 rfc.mode = L2CAP_MODE_STREAMING;
3264 rfc.txwin_size = 0;
3265 rfc.max_transmit = 0;
3266 rfc.retrans_timeout = 0;
3267 rfc.monitor_timeout = 0;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003268
3269 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003270 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3271 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003272 rfc.max_pdu_size = cpu_to_le16(size);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003273
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003274 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003275 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003276
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003277 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3278 l2cap_add_opt_efs(&ptr, chan);
3279
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003280 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3281 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003282 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003283 chan->fcs = L2CAP_FCS_NONE;
3284 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3285 chan->fcs);
3286 }
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003287 break;
3288 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003289
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003290 req->dcid = cpu_to_le16(chan->dcid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003291 req->flags = cpu_to_le16(0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003292
3293 return ptr - data;
3294}
3295
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003296static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003297{
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003298 struct l2cap_conf_rsp *rsp = data;
3299 void *ptr = rsp->data;
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003300 void *req = chan->conf_req;
3301 int len = chan->conf_len;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003302 int type, hint, olen;
3303 unsigned long val;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003304 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003305 struct l2cap_conf_efs efs;
3306 u8 remote_efs = 0;
Marcel Holtmann861d6882007-10-20 13:37:06 +02003307 u16 mtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003308 u16 result = L2CAP_CONF_SUCCESS;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003309 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003310
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003311 BT_DBG("chan %p", chan);
Marcel Holtmann820ae1b2006-11-18 22:15:00 +01003312
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003313 while (len >= L2CAP_CONF_OPT_SIZE) {
3314 len -= l2cap_get_conf_opt(&req, &type, &olen, &val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003315
Gustavo F. Padovan589d2742009-04-20 01:31:07 -03003316 hint = type & L2CAP_CONF_HINT;
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07003317 type &= L2CAP_CONF_MASK;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003318
3319 switch (type) {
3320 case L2CAP_CONF_MTU:
Marcel Holtmann861d6882007-10-20 13:37:06 +02003321 mtu = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003322 break;
3323
3324 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003325 chan->flush_to = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003326 break;
3327
3328 case L2CAP_CONF_QOS:
3329 break;
3330
Marcel Holtmann6464f352007-10-20 13:39:51 +02003331 case L2CAP_CONF_RFC:
3332 if (olen == sizeof(rfc))
3333 memcpy(&rfc, (void *) val, olen);
3334 break;
3335
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003336 case L2CAP_CONF_FCS:
3337 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003338 set_bit(CONF_RECV_NO_FCS, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003339 break;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003340
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003341 case L2CAP_CONF_EFS:
3342 remote_efs = 1;
3343 if (olen == sizeof(efs))
3344 memcpy(&efs, (void *) val, olen);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003345 break;
3346
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003347 case L2CAP_CONF_EWS:
Marcel Holtmann848566b2013-10-01 22:59:22 -07003348 if (!chan->conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003349 return -ECONNREFUSED;
3350
3351 set_bit(FLAG_EXT_CTRL, &chan->flags);
3352 set_bit(CONF_EWS_RECV, &chan->conf_state);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003353 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003354 chan->remote_tx_win = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003355 break;
3356
3357 default:
3358 if (hint)
3359 break;
3360
3361 result = L2CAP_CONF_UNKNOWN;
3362 *((u8 *) ptr++) = type;
3363 break;
3364 }
3365 }
3366
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003367 if (chan->num_conf_rsp || chan->num_conf_req > 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003368 goto done;
3369
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003370 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003371 case L2CAP_MODE_STREAMING:
3372 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003373 if (!test_bit(CONF_STATE2_DEVICE, &chan->conf_state)) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003374 chan->mode = l2cap_select_mode(rfc.mode,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003375 chan->conn->feat_mask);
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003376 break;
3377 }
3378
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003379 if (remote_efs) {
Marcel Holtmann848566b2013-10-01 22:59:22 -07003380 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003381 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3382 else
3383 return -ECONNREFUSED;
3384 }
3385
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003386 if (chan->mode != rfc.mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003387 return -ECONNREFUSED;
Gustavo F. Padovan742e5192010-06-08 19:09:48 -03003388
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003389 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003390 }
3391
3392done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003393 if (chan->mode != rfc.mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003394 result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003395 rfc.mode = chan->mode;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003396
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003397 if (chan->num_conf_rsp == 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003398 return -ECONNREFUSED;
3399
Gustavo Padovan2d792812012-10-06 10:07:01 +01003400 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3401 (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003402 }
3403
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003404 if (result == L2CAP_CONF_SUCCESS) {
3405 /* Configure output options and let the other side know
3406 * which ones we don't like. */
3407
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003408 if (mtu < L2CAP_DEFAULT_MIN_MTU)
3409 result = L2CAP_CONF_UNACCEPT;
3410 else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003411 chan->omtu = mtu;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003412 set_bit(CONF_MTU_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003413 }
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003414 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->omtu);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003415
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003416 if (remote_efs) {
3417 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003418 efs.stype != L2CAP_SERV_NOTRAFIC &&
3419 efs.stype != chan->local_stype) {
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003420
3421 result = L2CAP_CONF_UNACCEPT;
3422
3423 if (chan->num_conf_req >= 1)
3424 return -ECONNREFUSED;
3425
3426 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003427 sizeof(efs),
3428 (unsigned long) &efs);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003429 } else {
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003430 /* Send PENDING Conf Rsp */
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003431 result = L2CAP_CONF_PENDING;
3432 set_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003433 }
3434 }
3435
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003436 switch (rfc.mode) {
3437 case L2CAP_MODE_BASIC:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003438 chan->fcs = L2CAP_FCS_NONE;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003439 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003440 break;
3441
3442 case L2CAP_MODE_ERTM:
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003443 if (!test_bit(CONF_EWS_RECV, &chan->conf_state))
3444 chan->remote_tx_win = rfc.txwin_size;
3445 else
3446 rfc.txwin_size = L2CAP_DEFAULT_TX_WINDOW;
3447
Gustavo F. Padovan2c03a7a2011-03-25 20:15:28 -03003448 chan->remote_max_tx = rfc.max_transmit;
Mat Martineau86b1b262010-08-05 15:54:22 -07003449
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003450 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003451 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3452 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003453 rfc.max_pdu_size = cpu_to_le16(size);
3454 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003455
Mat Martineau36c86c82012-10-23 15:24:20 -07003456 __l2cap_set_ertm_timeouts(chan, &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003457
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003458 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003459
3460 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003461 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003462
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003463 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3464 chan->remote_id = efs.id;
3465 chan->remote_stype = efs.stype;
3466 chan->remote_msdu = le16_to_cpu(efs.msdu);
3467 chan->remote_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003468 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003469 chan->remote_acc_lat =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003470 le32_to_cpu(efs.acc_lat);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003471 chan->remote_sdu_itime =
3472 le32_to_cpu(efs.sdu_itime);
3473 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003474 sizeof(efs),
3475 (unsigned long) &efs);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003476 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003477 break;
3478
3479 case L2CAP_MODE_STREAMING:
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003480 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003481 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3482 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003483 rfc.max_pdu_size = cpu_to_le16(size);
3484 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003485
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003486 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003487
Gustavo Padovan2d792812012-10-06 10:07:01 +01003488 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3489 (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003490
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003491 break;
3492
3493 default:
Marcel Holtmann6464f352007-10-20 13:39:51 +02003494 result = L2CAP_CONF_UNACCEPT;
3495
3496 memset(&rfc, 0, sizeof(rfc));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003497 rfc.mode = chan->mode;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003498 }
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003499
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003500 if (result == L2CAP_CONF_SUCCESS)
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003501 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003502 }
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003503 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003504 rsp->result = cpu_to_le16(result);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003505 rsp->flags = cpu_to_le16(0);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003506
3507 return ptr - data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003508}
3509
Gustavo Padovan2d792812012-10-06 10:07:01 +01003510static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len,
3511 void *data, u16 *result)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003512{
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003513 struct l2cap_conf_req *req = data;
3514 void *ptr = req->data;
3515 int type, olen;
3516 unsigned long val;
Mat Martineau36e999a2011-12-08 17:23:21 -08003517 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003518 struct l2cap_conf_efs efs;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003519
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003520 BT_DBG("chan %p, rsp %p, len %d, req %p", chan, rsp, len, data);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003521
3522 while (len >= L2CAP_CONF_OPT_SIZE) {
3523 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3524
3525 switch (type) {
3526 case L2CAP_CONF_MTU:
3527 if (val < L2CAP_DEFAULT_MIN_MTU) {
3528 *result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003529 chan->imtu = L2CAP_DEFAULT_MIN_MTU;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003530 } else
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003531 chan->imtu = val;
3532 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003533 break;
3534
3535 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003536 chan->flush_to = val;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003537 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003538 2, chan->flush_to);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003539 break;
3540
3541 case L2CAP_CONF_RFC:
3542 if (olen == sizeof(rfc))
3543 memcpy(&rfc, (void *)val, olen);
3544
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003545 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003546 rfc.mode != chan->mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003547 return -ECONNREFUSED;
3548
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003549 chan->fcs = 0;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003550
3551 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003552 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003553 break;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003554
3555 case L2CAP_CONF_EWS:
Mat Martineauc20f8e32012-07-10 05:47:07 -07003556 chan->ack_win = min_t(u16, val, chan->ack_win);
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003557 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Mat Martineauc20f8e32012-07-10 05:47:07 -07003558 chan->tx_win);
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003559 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003560
3561 case L2CAP_CONF_EFS:
3562 if (olen == sizeof(efs))
3563 memcpy(&efs, (void *)val, olen);
3564
3565 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003566 efs.stype != L2CAP_SERV_NOTRAFIC &&
3567 efs.stype != chan->local_stype)
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003568 return -ECONNREFUSED;
3569
Gustavo Padovan2d792812012-10-06 10:07:01 +01003570 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS, sizeof(efs),
3571 (unsigned long) &efs);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003572 break;
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003573
3574 case L2CAP_CONF_FCS:
3575 if (*result == L2CAP_CONF_PENDING)
3576 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003577 set_bit(CONF_RECV_NO_FCS,
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003578 &chan->conf_state);
3579 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003580 }
3581 }
3582
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003583 if (chan->mode == L2CAP_MODE_BASIC && chan->mode != rfc.mode)
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003584 return -ECONNREFUSED;
3585
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003586 chan->mode = rfc.mode;
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003587
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003588 if (*result == L2CAP_CONF_SUCCESS || *result == L2CAP_CONF_PENDING) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003589 switch (rfc.mode) {
3590 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003591 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3592 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
3593 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003594 if (!test_bit(FLAG_EXT_CTRL, &chan->flags))
3595 chan->ack_win = min_t(u16, chan->ack_win,
3596 rfc.txwin_size);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003597
3598 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3599 chan->local_msdu = le16_to_cpu(efs.msdu);
3600 chan->local_sdu_itime =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003601 le32_to_cpu(efs.sdu_itime);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003602 chan->local_acc_lat = le32_to_cpu(efs.acc_lat);
3603 chan->local_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003604 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003605 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003606 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003607
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003608 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003609 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003610 }
3611 }
3612
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003613 req->dcid = cpu_to_le16(chan->dcid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003614 req->flags = cpu_to_le16(0);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003615
3616 return ptr - data;
3617}
3618
Gustavo Padovan2d792812012-10-06 10:07:01 +01003619static int l2cap_build_conf_rsp(struct l2cap_chan *chan, void *data,
3620 u16 result, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003621{
3622 struct l2cap_conf_rsp *rsp = data;
3623 void *ptr = rsp->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003624
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003625 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003626
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003627 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003628 rsp->result = cpu_to_le16(result);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003629 rsp->flags = cpu_to_le16(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003630
3631 return ptr - data;
3632}
3633
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003634void __l2cap_le_connect_rsp_defer(struct l2cap_chan *chan)
3635{
3636 struct l2cap_le_conn_rsp rsp;
3637 struct l2cap_conn *conn = chan->conn;
3638
3639 BT_DBG("chan %p", chan);
3640
3641 rsp.dcid = cpu_to_le16(chan->scid);
3642 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02003643 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03003644 rsp.credits = cpu_to_le16(chan->rx_credits);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003645 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003646
3647 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp),
3648 &rsp);
3649}
3650
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003651void __l2cap_connect_rsp_defer(struct l2cap_chan *chan)
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003652{
3653 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003654 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003655 u8 buf[128];
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003656 u8 rsp_code;
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003657
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003658 rsp.scid = cpu_to_le16(chan->dcid);
3659 rsp.dcid = cpu_to_le16(chan->scid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003660 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
3661 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003662
3663 if (chan->hs_hcon)
3664 rsp_code = L2CAP_CREATE_CHAN_RSP;
3665 else
3666 rsp_code = L2CAP_CONN_RSP;
3667
3668 BT_DBG("chan %p rsp_code %u", chan, rsp_code);
3669
3670 l2cap_send_cmd(conn, chan->ident, rsp_code, sizeof(rsp), &rsp);
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003671
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003672 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003673 return;
3674
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003675 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003676 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003677 chan->num_conf_req++;
3678}
3679
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003680static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len)
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003681{
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003682 int type, olen;
3683 unsigned long val;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003684 /* Use sane default values in case a misbehaving remote device
3685 * did not send an RFC or extended window size option.
3686 */
3687 u16 txwin_ext = chan->ack_win;
3688 struct l2cap_conf_rfc rfc = {
3689 .mode = chan->mode,
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003690 .retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO),
3691 .monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO),
Mat Martineauc20f8e32012-07-10 05:47:07 -07003692 .max_pdu_size = cpu_to_le16(chan->imtu),
3693 .txwin_size = min_t(u16, chan->ack_win, L2CAP_DEFAULT_TX_WINDOW),
3694 };
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003695
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003696 BT_DBG("chan %p, rsp %p, len %d", chan, rsp, len);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003697
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003698 if ((chan->mode != L2CAP_MODE_ERTM) && (chan->mode != L2CAP_MODE_STREAMING))
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003699 return;
3700
3701 while (len >= L2CAP_CONF_OPT_SIZE) {
3702 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3703
Mat Martineauc20f8e32012-07-10 05:47:07 -07003704 switch (type) {
3705 case L2CAP_CONF_RFC:
3706 if (olen == sizeof(rfc))
3707 memcpy(&rfc, (void *)val, olen);
Szymon Janc8f321f82012-06-08 11:33:33 +02003708 break;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003709 case L2CAP_CONF_EWS:
3710 txwin_ext = val;
3711 break;
3712 }
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003713 }
3714
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003715 switch (rfc.mode) {
3716 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003717 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3718 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003719 chan->mps = le16_to_cpu(rfc.max_pdu_size);
3720 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3721 chan->ack_win = min_t(u16, chan->ack_win, txwin_ext);
3722 else
3723 chan->ack_win = min_t(u16, chan->ack_win,
3724 rfc.txwin_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003725 break;
3726 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003727 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003728 }
3729}
3730
Gustavo Padovan2d792812012-10-06 10:07:01 +01003731static inline int l2cap_command_rej(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003732 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3733 u8 *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003734{
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003735 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003736
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003737 if (cmd_len < sizeof(*rej))
3738 return -EPROTO;
3739
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003740 if (rej->reason != L2CAP_REJ_NOT_UNDERSTOOD)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003741 return 0;
3742
3743 if ((conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003744 cmd->ident == conn->info_ident) {
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02003745 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann984947d2009-02-06 23:35:19 +01003746
3747 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01003748 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01003749
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003750 l2cap_conn_start(conn);
3751 }
3752
3753 return 0;
3754}
3755
Mat Martineau17009152012-10-23 15:24:07 -07003756static struct l2cap_chan *l2cap_connect(struct l2cap_conn *conn,
3757 struct l2cap_cmd_hdr *cmd,
3758 u8 *data, u8 rsp_code, u8 amp_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003759{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003760 struct l2cap_conn_req *req = (struct l2cap_conn_req *) data;
3761 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003762 struct l2cap_chan *chan = NULL, *pchan;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003763 int result, status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003764
3765 u16 dcid = 0, scid = __le16_to_cpu(req->scid);
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003766 __le16 psm = req->psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003767
Andrei Emeltchenko097db762012-03-09 14:16:17 +02003768 BT_DBG("psm 0x%2.2x scid 0x%4.4x", __le16_to_cpu(psm), scid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003769
3770 /* Check if we have socket listening on psm */
Marcel Holtmann6f59b902013-10-13 05:24:01 -07003771 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03003772 &conn->hcon->dst, ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003773 if (!pchan) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003774 result = L2CAP_CR_BAD_PSM;
3775 goto sendresp;
3776 }
3777
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003778 mutex_lock(&conn->chan_lock);
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003779 l2cap_chan_lock(pchan);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00003780
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003781 /* Check if the ACL is secure enough (if not SDP) */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003782 if (psm != cpu_to_le16(L2CAP_PSM_SDP) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003783 !hci_conn_check_link_mode(conn->hcon)) {
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02003784 conn->disc_reason = HCI_ERROR_AUTH_FAILURE;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003785 result = L2CAP_CR_SEC_BLOCK;
3786 goto response;
3787 }
3788
Linus Torvalds1da177e2005-04-16 15:20:36 -07003789 result = L2CAP_CR_NO_MEM;
3790
Gustavo Padovan2dfa1002012-05-27 22:27:58 -03003791 /* Check if we already have channel with that dcid */
3792 if (__l2cap_get_chan_by_dcid(conn, scid))
3793 goto response;
3794
Gustavo Padovan80b98022012-05-27 22:27:51 -03003795 chan = pchan->ops->new_connection(pchan);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03003796 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003797 goto response;
3798
Syam Sidhardhan330b6c12013-08-06 01:59:12 +09003799 /* For certain devices (ex: HID mouse), support for authentication,
3800 * pairing and bonding is optional. For such devices, inorder to avoid
3801 * the ACL alive for too long after L2CAP disconnection, reset the ACL
3802 * disc_timeout back to HCI_DISCONN_TIMEOUT during L2CAP connect.
3803 */
3804 conn->hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
3805
Marcel Holtmann7eafc592013-10-13 08:12:47 -07003806 bacpy(&chan->src, &conn->hcon->src);
3807 bacpy(&chan->dst, &conn->hcon->dst);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -07003808 chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type);
3809 chan->dst_type = bdaddr_type(conn->hcon, conn->hcon->dst_type);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003810 chan->psm = psm;
3811 chan->dcid = scid;
Mat Martineau17009152012-10-23 15:24:07 -07003812 chan->local_amp_id = amp_id;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003813
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003814 __l2cap_chan_add(conn, chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003815
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003816 dcid = chan->scid;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003817
Gustavo Padovan8d836d72013-10-15 19:24:47 -03003818 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003819
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003820 chan->ident = cmd->ident;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003821
Marcel Holtmann984947d2009-02-06 23:35:19 +01003822 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) {
Gustavo F. Padovand45fc422011-11-05 19:54:24 -02003823 if (l2cap_chan_check_security(chan)) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07003824 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003825 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003826 result = L2CAP_CR_PEND;
3827 status = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08003828 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003829 } else {
Mat Martineau17009152012-10-23 15:24:07 -07003830 /* Force pending result for AMP controllers.
3831 * The connection will succeed after the
3832 * physical link is up.
3833 */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003834 if (amp_id == AMP_ID_BREDR) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003835 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau17009152012-10-23 15:24:07 -07003836 result = L2CAP_CR_SUCCESS;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003837 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003838 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003839 result = L2CAP_CR_PEND;
Mat Martineau17009152012-10-23 15:24:07 -07003840 }
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003841 status = L2CAP_CS_NO_INFO;
3842 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003843 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003844 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003845 result = L2CAP_CR_PEND;
3846 status = L2CAP_CS_AUTHEN_PEND;
3847 }
3848 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003849 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003850 result = L2CAP_CR_PEND;
3851 status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003852 }
3853
Linus Torvalds1da177e2005-04-16 15:20:36 -07003854response:
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003855 l2cap_chan_unlock(pchan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003856 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003857
3858sendresp:
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003859 rsp.scid = cpu_to_le16(scid);
3860 rsp.dcid = cpu_to_le16(dcid);
3861 rsp.result = cpu_to_le16(result);
3862 rsp.status = cpu_to_le16(status);
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003863 l2cap_send_cmd(conn, cmd->ident, rsp_code, sizeof(rsp), &rsp);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003864
3865 if (result == L2CAP_CR_PEND && status == L2CAP_CS_NO_INFO) {
3866 struct l2cap_info_req info;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003867 info.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003868
3869 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
3870 conn->info_ident = l2cap_get_ident(conn);
3871
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08003872 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003873
Gustavo Padovan2d792812012-10-06 10:07:01 +01003874 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
3875 sizeof(info), &info);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003876 }
3877
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003878 if (chan && !test_bit(CONF_REQ_SENT, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003879 result == L2CAP_CR_SUCCESS) {
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003880 u8 buf[128];
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003881 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003882 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003883 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003884 chan->num_conf_req++;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003885 }
Mat Martineau17009152012-10-23 15:24:07 -07003886
3887 return chan;
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003888}
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003889
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003890static int l2cap_connect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003891 struct l2cap_cmd_hdr *cmd, u16 cmd_len, u8 *data)
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003892{
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303893 struct hci_dev *hdev = conn->hcon->hdev;
3894 struct hci_conn *hcon = conn->hcon;
3895
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003896 if (cmd_len < sizeof(struct l2cap_conn_req))
3897 return -EPROTO;
3898
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303899 hci_dev_lock(hdev);
3900 if (test_bit(HCI_MGMT, &hdev->dev_flags) &&
3901 !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &hcon->flags))
3902 mgmt_device_connected(hdev, &hcon->dst, hcon->type,
3903 hcon->dst_type, 0, NULL, 0,
3904 hcon->dev_class);
3905 hci_dev_unlock(hdev);
3906
Gustavo Padovan300229f2012-10-12 19:40:40 +08003907 l2cap_connect(conn, cmd, data, L2CAP_CONN_RSP, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003908 return 0;
3909}
3910
Mat Martineau5909cf32012-10-23 15:24:08 -07003911static int l2cap_connect_create_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003912 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3913 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003914{
3915 struct l2cap_conn_rsp *rsp = (struct l2cap_conn_rsp *) data;
3916 u16 scid, dcid, result, status;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003917 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003918 u8 req[128];
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003919 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003920
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003921 if (cmd_len < sizeof(*rsp))
3922 return -EPROTO;
3923
Linus Torvalds1da177e2005-04-16 15:20:36 -07003924 scid = __le16_to_cpu(rsp->scid);
3925 dcid = __le16_to_cpu(rsp->dcid);
3926 result = __le16_to_cpu(rsp->result);
3927 status = __le16_to_cpu(rsp->status);
3928
Andrei Emeltchenko1b009c92012-02-21 12:54:54 +02003929 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 +01003930 dcid, scid, result, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003931
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003932 mutex_lock(&conn->chan_lock);
3933
Linus Torvalds1da177e2005-04-16 15:20:36 -07003934 if (scid) {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003935 chan = __l2cap_get_chan_by_scid(conn, scid);
3936 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003937 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003938 goto unlock;
3939 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003940 } else {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003941 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
3942 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003943 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003944 goto unlock;
3945 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003946 }
3947
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003948 err = 0;
3949
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003950 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003951
Linus Torvalds1da177e2005-04-16 15:20:36 -07003952 switch (result) {
3953 case L2CAP_CR_SUCCESS:
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03003954 l2cap_state_change(chan, BT_CONFIG);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003955 chan->ident = 0;
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003956 chan->dcid = dcid;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003957 clear_bit(CONF_CONNECT_PEND, &chan->conf_state);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01003958
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003959 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003960 break;
3961
Linus Torvalds1da177e2005-04-16 15:20:36 -07003962 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003963 l2cap_build_conf_req(chan, req), req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003964 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003965 break;
3966
3967 case L2CAP_CR_PEND:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003968 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003969 break;
3970
3971 default:
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003972 l2cap_chan_del(chan, ECONNREFUSED);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003973 break;
3974 }
3975
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003976 l2cap_chan_unlock(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003977
3978unlock:
3979 mutex_unlock(&conn->chan_lock);
3980
3981 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003982}
3983
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003984static inline void set_default_fcs(struct l2cap_chan *chan)
Mat Martineau8c462b62010-08-24 15:35:42 -07003985{
3986 /* FCS is enabled only in ERTM or streaming mode, if one or both
3987 * sides request it.
3988 */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003989 if (chan->mode != L2CAP_MODE_ERTM && chan->mode != L2CAP_MODE_STREAMING)
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003990 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003991 else if (!test_bit(CONF_RECV_NO_FCS, &chan->conf_state))
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003992 chan->fcs = L2CAP_FCS_CRC16;
Mat Martineau8c462b62010-08-24 15:35:42 -07003993}
3994
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03003995static void l2cap_send_efs_conf_rsp(struct l2cap_chan *chan, void *data,
3996 u8 ident, u16 flags)
3997{
3998 struct l2cap_conn *conn = chan->conn;
3999
4000 BT_DBG("conn %p chan %p ident %d flags 0x%4.4x", conn, chan, ident,
4001 flags);
4002
4003 clear_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
4004 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
4005
4006 l2cap_send_cmd(conn, ident, L2CAP_CONF_RSP,
4007 l2cap_build_conf_rsp(chan, data,
4008 L2CAP_CONF_SUCCESS, flags), data);
4009}
4010
Johan Hedberg662d6522013-10-16 11:20:47 +03004011static void cmd_reject_invalid_cid(struct l2cap_conn *conn, u8 ident,
4012 u16 scid, u16 dcid)
4013{
4014 struct l2cap_cmd_rej_cid rej;
4015
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004016 rej.reason = cpu_to_le16(L2CAP_REJ_INVALID_CID);
Johan Hedberg662d6522013-10-16 11:20:47 +03004017 rej.scid = __cpu_to_le16(scid);
4018 rej.dcid = __cpu_to_le16(dcid);
4019
4020 l2cap_send_cmd(conn, ident, L2CAP_COMMAND_REJ, sizeof(rej), &rej);
4021}
4022
Gustavo Padovan2d792812012-10-06 10:07:01 +01004023static inline int l2cap_config_req(struct l2cap_conn *conn,
4024 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4025 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004026{
4027 struct l2cap_conf_req *req = (struct l2cap_conf_req *) data;
4028 u16 dcid, flags;
4029 u8 rsp[64];
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004030 struct l2cap_chan *chan;
Mat Martineau3c588192012-04-11 10:48:42 -07004031 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004032
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004033 if (cmd_len < sizeof(*req))
4034 return -EPROTO;
4035
Linus Torvalds1da177e2005-04-16 15:20:36 -07004036 dcid = __le16_to_cpu(req->dcid);
4037 flags = __le16_to_cpu(req->flags);
4038
4039 BT_DBG("dcid 0x%4.4x flags 0x%2.2x", dcid, flags);
4040
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004041 chan = l2cap_get_chan_by_scid(conn, dcid);
Johan Hedberg662d6522013-10-16 11:20:47 +03004042 if (!chan) {
4043 cmd_reject_invalid_cid(conn, cmd->ident, dcid, 0);
4044 return 0;
4045 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004046
David S. Miller033b1142011-07-21 13:38:42 -07004047 if (chan->state != BT_CONFIG && chan->state != BT_CONNECT2) {
Johan Hedberg662d6522013-10-16 11:20:47 +03004048 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4049 chan->dcid);
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004050 goto unlock;
Gustavo F. Padovandf6bd742010-06-14 02:26:15 -03004051 }
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004052
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004053 /* Reject if config buffer is too small. */
Al Viro88219a02007-07-29 00:17:25 -07004054 len = cmd_len - sizeof(*req);
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004055 if (chan->conf_len + len > sizeof(chan->conf_req)) {
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004056 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004057 l2cap_build_conf_rsp(chan, rsp,
4058 L2CAP_CONF_REJECT, flags), rsp);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004059 goto unlock;
4060 }
4061
4062 /* Store config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004063 memcpy(chan->conf_req + chan->conf_len, req->data, len);
4064 chan->conf_len += len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004065
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004066 if (flags & L2CAP_CONF_FLAG_CONTINUATION) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004067 /* Incomplete config. Send empty response. */
4068 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004069 l2cap_build_conf_rsp(chan, rsp,
4070 L2CAP_CONF_SUCCESS, flags), rsp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004071 goto unlock;
4072 }
4073
4074 /* Complete config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004075 len = l2cap_parse_conf_req(chan, rsp);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004076 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004077 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004078 goto unlock;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004079 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004080
Mat Martineau1500109b2012-10-23 15:24:15 -07004081 chan->ident = cmd->ident;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004082 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004083 chan->num_conf_rsp++;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004084
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004085 /* Reset config buffer. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004086 chan->conf_len = 0;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004087
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004088 if (!test_bit(CONF_OUTPUT_DONE, &chan->conf_state))
Marcel Holtmann876d9482007-10-20 13:35:42 +02004089 goto unlock;
4090
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004091 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004092 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004093
Mat Martineau105bdf92012-04-27 16:50:48 -07004094 if (chan->mode == L2CAP_MODE_ERTM ||
4095 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004096 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004097
Mat Martineau3c588192012-04-11 10:48:42 -07004098 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004099 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004100 else
4101 l2cap_chan_ready(chan);
4102
Marcel Holtmann876d9482007-10-20 13:35:42 +02004103 goto unlock;
4104 }
4105
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004106 if (!test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02004107 u8 buf[64];
Linus Torvalds1da177e2005-04-16 15:20:36 -07004108 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004109 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004110 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004111 }
4112
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004113 /* Got Conf Rsp PENDING from remote side and asume we sent
4114 Conf Rsp PENDING in the code above */
4115 if (test_bit(CONF_REM_CONF_PEND, &chan->conf_state) &&
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03004116 test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004117
4118 /* check compatibility */
4119
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004120 /* Send rsp for BR/EDR channel */
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004121 if (!chan->hs_hcon)
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004122 l2cap_send_efs_conf_rsp(chan, rsp, cmd->ident, flags);
4123 else
4124 chan->ident = cmd->ident;
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004125 }
4126
Linus Torvalds1da177e2005-04-16 15:20:36 -07004127unlock:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004128 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004129 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004130}
4131
Gustavo Padovan2d792812012-10-06 10:07:01 +01004132static inline int l2cap_config_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004133 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4134 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004135{
4136 struct l2cap_conf_rsp *rsp = (struct l2cap_conf_rsp *)data;
4137 u16 scid, flags, result;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004138 struct l2cap_chan *chan;
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004139 int len = cmd_len - sizeof(*rsp);
Mat Martineau3c588192012-04-11 10:48:42 -07004140 int err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004141
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004142 if (cmd_len < sizeof(*rsp))
4143 return -EPROTO;
4144
Linus Torvalds1da177e2005-04-16 15:20:36 -07004145 scid = __le16_to_cpu(rsp->scid);
4146 flags = __le16_to_cpu(rsp->flags);
4147 result = __le16_to_cpu(rsp->result);
4148
Andrei Emeltchenko61386cb2012-03-12 12:13:07 +02004149 BT_DBG("scid 0x%4.4x flags 0x%2.2x result 0x%2.2x len %d", scid, flags,
4150 result, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004151
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004152 chan = l2cap_get_chan_by_scid(conn, scid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004153 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004154 return 0;
4155
4156 switch (result) {
4157 case L2CAP_CONF_SUCCESS:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004158 l2cap_conf_rfc_get(chan, rsp->data, len);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004159 clear_bit(CONF_REM_CONF_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004160 break;
4161
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004162 case L2CAP_CONF_PENDING:
4163 set_bit(CONF_REM_CONF_PEND, &chan->conf_state);
4164
4165 if (test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
4166 char buf[64];
4167
4168 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004169 buf, &result);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004170 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004171 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004172 goto done;
4173 }
4174
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004175 if (!chan->hs_hcon) {
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004176 l2cap_send_efs_conf_rsp(chan, buf, cmd->ident,
4177 0);
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02004178 } else {
4179 if (l2cap_check_efs(chan)) {
4180 amp_create_logical_link(chan);
4181 chan->ident = cmd->ident;
4182 }
4183 }
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004184 }
4185 goto done;
4186
Linus Torvalds1da177e2005-04-16 15:20:36 -07004187 case L2CAP_CONF_UNACCEPT:
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004188 if (chan->num_conf_rsp <= L2CAP_CONF_MAX_CONF_RSP) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004189 char req[64];
4190
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004191 if (len > sizeof(req) - sizeof(struct l2cap_conf_req)) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004192 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004193 goto done;
4194 }
4195
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004196 /* throw out any old stored conf requests */
4197 result = L2CAP_CONF_SUCCESS;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03004198 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004199 req, &result);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004200 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004201 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004202 goto done;
4203 }
4204
4205 l2cap_send_cmd(conn, l2cap_get_ident(conn),
Gustavo Padovan2d792812012-10-06 10:07:01 +01004206 L2CAP_CONF_REQ, len, req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004207 chan->num_conf_req++;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004208 if (result != L2CAP_CONF_SUCCESS)
4209 goto done;
4210 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004211 }
4212
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09004213 default:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004214 l2cap_chan_set_err(chan, ECONNRESET);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +02004215
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08004216 __set_chan_timer(chan, L2CAP_DISC_REJ_TIMEOUT);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004217 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004218 goto done;
4219 }
4220
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004221 if (flags & L2CAP_CONF_FLAG_CONTINUATION)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004222 goto done;
4223
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004224 set_bit(CONF_INPUT_DONE, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004225
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004226 if (test_bit(CONF_OUTPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004227 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004228
Mat Martineau105bdf92012-04-27 16:50:48 -07004229 if (chan->mode == L2CAP_MODE_ERTM ||
4230 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004231 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004232
Mat Martineau3c588192012-04-11 10:48:42 -07004233 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004234 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004235 else
4236 l2cap_chan_ready(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004237 }
4238
4239done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004240 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004241 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004242}
4243
Gustavo Padovan2d792812012-10-06 10:07:01 +01004244static inline int l2cap_disconnect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004245 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4246 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004247{
4248 struct l2cap_disconn_req *req = (struct l2cap_disconn_req *) data;
4249 struct l2cap_disconn_rsp rsp;
4250 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004251 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004252
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004253 if (cmd_len != sizeof(*req))
4254 return -EPROTO;
4255
Linus Torvalds1da177e2005-04-16 15:20:36 -07004256 scid = __le16_to_cpu(req->scid);
4257 dcid = __le16_to_cpu(req->dcid);
4258
4259 BT_DBG("scid 0x%4.4x dcid 0x%4.4x", scid, dcid);
4260
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004261 mutex_lock(&conn->chan_lock);
4262
4263 chan = __l2cap_get_chan_by_scid(conn, dcid);
4264 if (!chan) {
4265 mutex_unlock(&conn->chan_lock);
Johan Hedberg662d6522013-10-16 11:20:47 +03004266 cmd_reject_invalid_cid(conn, cmd->ident, dcid, scid);
4267 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004268 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004269
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004270 l2cap_chan_lock(chan);
4271
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03004272 rsp.dcid = cpu_to_le16(chan->scid);
4273 rsp.scid = cpu_to_le16(chan->dcid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004274 l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp);
4275
Gustavo Padovan5ec1bbe2013-10-15 19:24:48 -03004276 chan->ops->set_shutdown(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004277
Mat Martineau61d6ef32012-04-27 16:50:50 -07004278 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004279 l2cap_chan_del(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004280
4281 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004282
Gustavo Padovan80b98022012-05-27 22:27:51 -03004283 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004284 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004285
4286 mutex_unlock(&conn->chan_lock);
4287
Linus Torvalds1da177e2005-04-16 15:20:36 -07004288 return 0;
4289}
4290
Gustavo Padovan2d792812012-10-06 10:07:01 +01004291static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004292 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4293 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004294{
4295 struct l2cap_disconn_rsp *rsp = (struct l2cap_disconn_rsp *) data;
4296 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004297 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004298
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004299 if (cmd_len != sizeof(*rsp))
4300 return -EPROTO;
4301
Linus Torvalds1da177e2005-04-16 15:20:36 -07004302 scid = __le16_to_cpu(rsp->scid);
4303 dcid = __le16_to_cpu(rsp->dcid);
4304
4305 BT_DBG("dcid 0x%4.4x scid 0x%4.4x", dcid, scid);
4306
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004307 mutex_lock(&conn->chan_lock);
4308
4309 chan = __l2cap_get_chan_by_scid(conn, scid);
4310 if (!chan) {
4311 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004312 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004313 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004314
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004315 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004316
Mat Martineau61d6ef32012-04-27 16:50:50 -07004317 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004318 l2cap_chan_del(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004319
4320 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004321
Gustavo Padovan80b98022012-05-27 22:27:51 -03004322 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004323 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004324
4325 mutex_unlock(&conn->chan_lock);
4326
Linus Torvalds1da177e2005-04-16 15:20:36 -07004327 return 0;
4328}
4329
Gustavo Padovan2d792812012-10-06 10:07:01 +01004330static inline int l2cap_information_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004331 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4332 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004333{
4334 struct l2cap_info_req *req = (struct l2cap_info_req *) data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004335 u16 type;
4336
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004337 if (cmd_len != sizeof(*req))
4338 return -EPROTO;
4339
Linus Torvalds1da177e2005-04-16 15:20:36 -07004340 type = __le16_to_cpu(req->type);
4341
4342 BT_DBG("type 0x%4.4x", type);
4343
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004344 if (type == L2CAP_IT_FEAT_MASK) {
4345 u8 buf[8];
Marcel Holtmann44dd46d2009-05-02 19:09:01 -07004346 u32 feat_mask = l2cap_feat_mask;
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004347 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004348 rsp->type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
4349 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03004350 if (!disable_ertm)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004351 feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING
Gustavo Padovan2d792812012-10-06 10:07:01 +01004352 | L2CAP_FEAT_FCS;
Marcel Holtmann848566b2013-10-01 22:59:22 -07004353 if (conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03004354 feat_mask |= L2CAP_FEAT_EXT_FLOW
Gustavo Padovan2d792812012-10-06 10:07:01 +01004355 | L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenkoa5fd6f32011-09-16 16:26:32 +03004356
Gustavo F. Padovan1b7bf4e2009-08-24 00:45:20 -03004357 put_unaligned_le32(feat_mask, rsp->data);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004358 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4359 buf);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004360 } else if (type == L2CAP_IT_FIXED_CHAN) {
4361 u8 buf[12];
4362 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Mat Martineau50a147c2011-11-02 16:18:34 -07004363
Marcel Holtmann848566b2013-10-01 22:59:22 -07004364 if (conn->hs_enabled)
Mat Martineau50a147c2011-11-02 16:18:34 -07004365 l2cap_fixed_chan[0] |= L2CAP_FC_A2MP;
4366 else
4367 l2cap_fixed_chan[0] &= ~L2CAP_FC_A2MP;
4368
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004369 rsp->type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
4370 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Andrei Emeltchenkoc6337ea2011-10-20 17:02:44 +03004371 memcpy(rsp->data, l2cap_fixed_chan, sizeof(l2cap_fixed_chan));
Gustavo Padovan2d792812012-10-06 10:07:01 +01004372 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4373 buf);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004374 } else {
4375 struct l2cap_info_rsp rsp;
4376 rsp.type = cpu_to_le16(type);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004377 rsp.result = cpu_to_le16(L2CAP_IR_NOTSUPP);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004378 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(rsp),
4379 &rsp);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004380 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004381
4382 return 0;
4383}
4384
Gustavo Padovan2d792812012-10-06 10:07:01 +01004385static inline int l2cap_information_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004386 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4387 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004388{
4389 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) data;
4390 u16 type, result;
4391
Jaganath Kanakkassery3f6fa3d2013-06-21 19:55:11 +05304392 if (cmd_len < sizeof(*rsp))
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004393 return -EPROTO;
4394
Linus Torvalds1da177e2005-04-16 15:20:36 -07004395 type = __le16_to_cpu(rsp->type);
4396 result = __le16_to_cpu(rsp->result);
4397
4398 BT_DBG("type 0x%4.4x result 0x%2.2x", type, result);
4399
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004400 /* L2CAP Info req/rsp are unbound to channels, add extra checks */
4401 if (cmd->ident != conn->info_ident ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01004402 conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004403 return 0;
4404
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02004405 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004406
Ville Tervoadb08ed2010-08-04 09:43:33 +03004407 if (result != L2CAP_IR_SUCCESS) {
4408 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4409 conn->info_ident = 0;
4410
4411 l2cap_conn_start(conn);
4412
4413 return 0;
4414 }
4415
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004416 switch (type) {
4417 case L2CAP_IT_FEAT_MASK:
Harvey Harrison83985312008-05-02 16:25:46 -07004418 conn->feat_mask = get_unaligned_le32(rsp->data);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004419
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07004420 if (conn->feat_mask & L2CAP_FEAT_FIXED_CHAN) {
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004421 struct l2cap_info_req req;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004422 req.type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004423
4424 conn->info_ident = l2cap_get_ident(conn);
4425
4426 l2cap_send_cmd(conn, conn->info_ident,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004427 L2CAP_INFO_REQ, sizeof(req), &req);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004428 } else {
4429 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4430 conn->info_ident = 0;
4431
4432 l2cap_conn_start(conn);
4433 }
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004434 break;
4435
4436 case L2CAP_IT_FIXED_CHAN:
4437 conn->fixed_chan_mask = rsp->data[0];
Marcel Holtmann984947d2009-02-06 23:35:19 +01004438 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004439 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004440
4441 l2cap_conn_start(conn);
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004442 break;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004443 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004444
Linus Torvalds1da177e2005-04-16 15:20:36 -07004445 return 0;
4446}
4447
Mat Martineau17009152012-10-23 15:24:07 -07004448static int l2cap_create_channel_req(struct l2cap_conn *conn,
4449 struct l2cap_cmd_hdr *cmd,
4450 u16 cmd_len, void *data)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004451{
4452 struct l2cap_create_chan_req *req = data;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004453 struct l2cap_create_chan_rsp rsp;
Mat Martineau17009152012-10-23 15:24:07 -07004454 struct l2cap_chan *chan;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004455 struct hci_dev *hdev;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004456 u16 psm, scid;
4457
4458 if (cmd_len != sizeof(*req))
4459 return -EPROTO;
4460
Marcel Holtmann848566b2013-10-01 22:59:22 -07004461 if (!conn->hs_enabled)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004462 return -EINVAL;
4463
4464 psm = le16_to_cpu(req->psm);
4465 scid = le16_to_cpu(req->scid);
4466
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004467 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 -07004468
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004469 /* For controller id 0 make BR/EDR connection */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004470 if (req->amp_id == AMP_ID_BREDR) {
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004471 l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4472 req->amp_id);
4473 return 0;
4474 }
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004475
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004476 /* Validate AMP controller id */
4477 hdev = hci_dev_get(req->amp_id);
4478 if (!hdev)
4479 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004480
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004481 if (hdev->dev_type != HCI_AMP || !test_bit(HCI_UP, &hdev->flags)) {
Mat Martineau17009152012-10-23 15:24:07 -07004482 hci_dev_put(hdev);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004483 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004484 }
4485
4486 chan = l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4487 req->amp_id);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004488 if (chan) {
4489 struct amp_mgr *mgr = conn->hcon->amp_mgr;
4490 struct hci_conn *hs_hcon;
4491
Marcel Holtmann98e0f7e2013-10-13 02:23:40 -07004492 hs_hcon = hci_conn_hash_lookup_ba(hdev, AMP_LINK,
4493 &conn->hcon->dst);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004494 if (!hs_hcon) {
4495 hci_dev_put(hdev);
Johan Hedberg662d6522013-10-16 11:20:47 +03004496 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4497 chan->dcid);
4498 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004499 }
4500
4501 BT_DBG("mgr %p bredr_chan %p hs_hcon %p", mgr, chan, hs_hcon);
4502
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004503 mgr->bredr_chan = chan;
4504 chan->hs_hcon = hs_hcon;
Andrei Emeltchenkofd45bf42012-11-20 17:16:22 +02004505 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004506 conn->mtu = hdev->block_mtu;
4507 }
4508
4509 hci_dev_put(hdev);
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004510
4511 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004512
4513error:
4514 rsp.dcid = 0;
4515 rsp.scid = cpu_to_le16(scid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004516 rsp.result = cpu_to_le16(L2CAP_CR_BAD_AMP);
4517 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004518
4519 l2cap_send_cmd(conn, cmd->ident, L2CAP_CREATE_CHAN_RSP,
4520 sizeof(rsp), &rsp);
4521
Johan Hedbergdc280802013-09-16 13:05:13 +03004522 return 0;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004523}
4524
Mat Martineau8eb200b2012-10-23 15:24:17 -07004525static void l2cap_send_move_chan_req(struct l2cap_chan *chan, u8 dest_amp_id)
4526{
4527 struct l2cap_move_chan_req req;
4528 u8 ident;
4529
4530 BT_DBG("chan %p, dest_amp_id %d", chan, dest_amp_id);
4531
4532 ident = l2cap_get_ident(chan->conn);
4533 chan->ident = ident;
4534
4535 req.icid = cpu_to_le16(chan->scid);
4536 req.dest_amp_id = dest_amp_id;
4537
4538 l2cap_send_cmd(chan->conn, ident, L2CAP_MOVE_CHAN_REQ, sizeof(req),
4539 &req);
4540
4541 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4542}
4543
Mat Martineau1500109b2012-10-23 15:24:15 -07004544static void l2cap_send_move_chan_rsp(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004545{
4546 struct l2cap_move_chan_rsp rsp;
4547
Mat Martineau1500109b2012-10-23 15:24:15 -07004548 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004549
Mat Martineau1500109b2012-10-23 15:24:15 -07004550 rsp.icid = cpu_to_le16(chan->dcid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004551 rsp.result = cpu_to_le16(result);
4552
Mat Martineau1500109b2012-10-23 15:24:15 -07004553 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_RSP,
4554 sizeof(rsp), &rsp);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004555}
4556
Mat Martineau5b155ef2012-10-23 15:24:14 -07004557static void l2cap_send_move_chan_cfm(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004558{
4559 struct l2cap_move_chan_cfm cfm;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004560
Mat Martineau5b155ef2012-10-23 15:24:14 -07004561 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004562
Mat Martineau5b155ef2012-10-23 15:24:14 -07004563 chan->ident = l2cap_get_ident(chan->conn);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004564
Mat Martineau5b155ef2012-10-23 15:24:14 -07004565 cfm.icid = cpu_to_le16(chan->scid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004566 cfm.result = cpu_to_le16(result);
4567
Mat Martineau5b155ef2012-10-23 15:24:14 -07004568 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_CFM,
4569 sizeof(cfm), &cfm);
4570
4571 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4572}
4573
4574static void l2cap_send_move_chan_cfm_icid(struct l2cap_conn *conn, u16 icid)
4575{
4576 struct l2cap_move_chan_cfm cfm;
4577
4578 BT_DBG("conn %p, icid 0x%4.4x", conn, icid);
4579
4580 cfm.icid = cpu_to_le16(icid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004581 cfm.result = cpu_to_le16(L2CAP_MC_UNCONFIRMED);
Mat Martineau5b155ef2012-10-23 15:24:14 -07004582
4583 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_MOVE_CHAN_CFM,
4584 sizeof(cfm), &cfm);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004585}
4586
4587static void l2cap_send_move_chan_cfm_rsp(struct l2cap_conn *conn, u8 ident,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004588 u16 icid)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004589{
4590 struct l2cap_move_chan_cfm_rsp rsp;
4591
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004592 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004593
4594 rsp.icid = cpu_to_le16(icid);
4595 l2cap_send_cmd(conn, ident, L2CAP_MOVE_CHAN_CFM_RSP, sizeof(rsp), &rsp);
4596}
4597
Mat Martineau5f3847a2012-10-23 15:24:12 -07004598static void __release_logical_link(struct l2cap_chan *chan)
4599{
4600 chan->hs_hchan = NULL;
4601 chan->hs_hcon = NULL;
4602
4603 /* Placeholder - release the logical link */
4604}
4605
Mat Martineau1500109b2012-10-23 15:24:15 -07004606static void l2cap_logical_fail(struct l2cap_chan *chan)
4607{
4608 /* Logical link setup failed */
4609 if (chan->state != BT_CONNECTED) {
4610 /* Create channel failure, disconnect */
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004611 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineau1500109b2012-10-23 15:24:15 -07004612 return;
4613 }
4614
4615 switch (chan->move_role) {
4616 case L2CAP_MOVE_ROLE_RESPONDER:
4617 l2cap_move_done(chan);
4618 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_SUPP);
4619 break;
4620 case L2CAP_MOVE_ROLE_INITIATOR:
4621 if (chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_COMP ||
4622 chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_CFM) {
4623 /* Remote has only sent pending or
4624 * success responses, clean up
4625 */
4626 l2cap_move_done(chan);
4627 }
4628
4629 /* Other amp move states imply that the move
4630 * has already aborted
4631 */
4632 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
4633 break;
4634 }
4635}
4636
4637static void l2cap_logical_finish_create(struct l2cap_chan *chan,
4638 struct hci_chan *hchan)
4639{
4640 struct l2cap_conf_rsp rsp;
Mat Martineau1500109b2012-10-23 15:24:15 -07004641
Andrei Emeltchenko336178a2012-10-31 15:46:27 +02004642 chan->hs_hchan = hchan;
Mat Martineau1500109b2012-10-23 15:24:15 -07004643 chan->hs_hcon->l2cap_data = chan->conn;
4644
Andrei Emeltchenko35ba9562012-10-25 15:20:43 +03004645 l2cap_send_efs_conf_rsp(chan, &rsp, chan->ident, 0);
Mat Martineau1500109b2012-10-23 15:24:15 -07004646
4647 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Andrei Emeltchenkofe79c6f2012-10-25 15:20:42 +03004648 int err;
Mat Martineau1500109b2012-10-23 15:24:15 -07004649
4650 set_default_fcs(chan);
4651
4652 err = l2cap_ertm_init(chan);
4653 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004654 l2cap_send_disconn_req(chan, -err);
Mat Martineau1500109b2012-10-23 15:24:15 -07004655 else
4656 l2cap_chan_ready(chan);
4657 }
4658}
4659
4660static void l2cap_logical_finish_move(struct l2cap_chan *chan,
4661 struct hci_chan *hchan)
4662{
4663 chan->hs_hcon = hchan->conn;
4664 chan->hs_hcon->l2cap_data = chan->conn;
4665
4666 BT_DBG("move_state %d", chan->move_state);
4667
4668 switch (chan->move_state) {
4669 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
4670 /* Move confirm will be sent after a success
4671 * response is received
4672 */
4673 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4674 break;
4675 case L2CAP_MOVE_WAIT_LOGICAL_CFM:
4676 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4677 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4678 } else if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
4679 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
4680 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
4681 } else if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4682 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4683 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4684 }
4685 break;
4686 default:
4687 /* Move was not in expected state, free the channel */
4688 __release_logical_link(chan);
4689
4690 chan->move_state = L2CAP_MOVE_STABLE;
4691 }
4692}
4693
4694/* Call with chan locked */
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004695void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan,
4696 u8 status)
Mat Martineau5b155ef2012-10-23 15:24:14 -07004697{
Mat Martineau1500109b2012-10-23 15:24:15 -07004698 BT_DBG("chan %p, hchan %p, status %d", chan, hchan, status);
4699
4700 if (status) {
4701 l2cap_logical_fail(chan);
4702 __release_logical_link(chan);
4703 return;
4704 }
4705
4706 if (chan->state != BT_CONNECTED) {
4707 /* Ignore logical link if channel is on BR/EDR */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004708 if (chan->local_amp_id != AMP_ID_BREDR)
Mat Martineau1500109b2012-10-23 15:24:15 -07004709 l2cap_logical_finish_create(chan, hchan);
4710 } else {
4711 l2cap_logical_finish_move(chan, hchan);
4712 }
Mat Martineau5b155ef2012-10-23 15:24:14 -07004713}
4714
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004715void l2cap_move_start(struct l2cap_chan *chan)
4716{
4717 BT_DBG("chan %p", chan);
4718
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004719 if (chan->local_amp_id == AMP_ID_BREDR) {
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004720 if (chan->chan_policy != BT_CHANNEL_POLICY_AMP_PREFERRED)
4721 return;
4722 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4723 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4724 /* Placeholder - start physical link setup */
4725 } else {
4726 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4727 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4728 chan->move_id = 0;
4729 l2cap_move_setup(chan);
4730 l2cap_send_move_chan_req(chan, 0);
4731 }
4732}
4733
Mat Martineau8eb200b2012-10-23 15:24:17 -07004734static void l2cap_do_create(struct l2cap_chan *chan, int result,
4735 u8 local_amp_id, u8 remote_amp_id)
4736{
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004737 BT_DBG("chan %p state %s %u -> %u", chan, state_to_string(chan->state),
4738 local_amp_id, remote_amp_id);
4739
Andrei Emeltchenko12d6cc62012-11-14 17:39:31 +02004740 chan->fcs = L2CAP_FCS_NONE;
4741
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004742 /* Outgoing channel on AMP */
4743 if (chan->state == BT_CONNECT) {
4744 if (result == L2CAP_CR_SUCCESS) {
4745 chan->local_amp_id = local_amp_id;
4746 l2cap_send_create_chan_req(chan, remote_amp_id);
4747 } else {
4748 /* Revert to BR/EDR connect */
4749 l2cap_send_conn_req(chan);
4750 }
4751
4752 return;
4753 }
4754
4755 /* Incoming channel on AMP */
4756 if (__l2cap_no_conn_pending(chan)) {
Mat Martineau8eb200b2012-10-23 15:24:17 -07004757 struct l2cap_conn_rsp rsp;
4758 char buf[128];
4759 rsp.scid = cpu_to_le16(chan->dcid);
4760 rsp.dcid = cpu_to_le16(chan->scid);
4761
Mat Martineau8eb200b2012-10-23 15:24:17 -07004762 if (result == L2CAP_CR_SUCCESS) {
4763 /* Send successful response */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004764 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
4765 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004766 } else {
4767 /* Send negative response */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004768 rsp.result = cpu_to_le16(L2CAP_CR_NO_MEM);
4769 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004770 }
4771
4772 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_RSP,
4773 sizeof(rsp), &rsp);
4774
4775 if (result == L2CAP_CR_SUCCESS) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02004776 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004777 set_bit(CONF_REQ_SENT, &chan->conf_state);
4778 l2cap_send_cmd(chan->conn, l2cap_get_ident(chan->conn),
4779 L2CAP_CONF_REQ,
4780 l2cap_build_conf_req(chan, buf), buf);
4781 chan->num_conf_req++;
4782 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004783 }
4784}
4785
4786static void l2cap_do_move_initiate(struct l2cap_chan *chan, u8 local_amp_id,
4787 u8 remote_amp_id)
4788{
4789 l2cap_move_setup(chan);
4790 chan->move_id = local_amp_id;
4791 chan->move_state = L2CAP_MOVE_WAIT_RSP;
4792
4793 l2cap_send_move_chan_req(chan, remote_amp_id);
4794}
4795
4796static void l2cap_do_move_respond(struct l2cap_chan *chan, int result)
4797{
4798 struct hci_chan *hchan = NULL;
4799
4800 /* Placeholder - get hci_chan for logical link */
4801
4802 if (hchan) {
4803 if (hchan->state == BT_CONNECTED) {
4804 /* Logical link is ready to go */
4805 chan->hs_hcon = hchan->conn;
4806 chan->hs_hcon->l2cap_data = chan->conn;
4807 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4808 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4809
4810 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
4811 } else {
4812 /* Wait for logical link to be ready */
4813 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4814 }
4815 } else {
4816 /* Logical link not available */
4817 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_ALLOWED);
4818 }
4819}
4820
4821static void l2cap_do_move_cancel(struct l2cap_chan *chan, int result)
4822{
4823 if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4824 u8 rsp_result;
4825 if (result == -EINVAL)
4826 rsp_result = L2CAP_MR_BAD_ID;
4827 else
4828 rsp_result = L2CAP_MR_NOT_ALLOWED;
4829
4830 l2cap_send_move_chan_rsp(chan, rsp_result);
4831 }
4832
4833 chan->move_role = L2CAP_MOVE_ROLE_NONE;
4834 chan->move_state = L2CAP_MOVE_STABLE;
4835
4836 /* Restart data transmission */
4837 l2cap_ertm_send(chan);
4838}
4839
Andrei Emeltchenkoa514b172012-11-14 17:39:30 +02004840/* Invoke with locked chan */
4841void __l2cap_physical_cfm(struct l2cap_chan *chan, int result)
Mat Martineau8eb200b2012-10-23 15:24:17 -07004842{
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004843 u8 local_amp_id = chan->local_amp_id;
Andrei Emeltchenkofffadc02012-11-01 15:37:03 +02004844 u8 remote_amp_id = chan->remote_amp_id;
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004845
Mat Martineau8eb200b2012-10-23 15:24:17 -07004846 BT_DBG("chan %p, result %d, local_amp_id %d, remote_amp_id %d",
4847 chan, result, local_amp_id, remote_amp_id);
4848
Mat Martineau8eb200b2012-10-23 15:24:17 -07004849 if (chan->state == BT_DISCONN || chan->state == BT_CLOSED) {
4850 l2cap_chan_unlock(chan);
4851 return;
4852 }
4853
4854 if (chan->state != BT_CONNECTED) {
4855 l2cap_do_create(chan, result, local_amp_id, remote_amp_id);
4856 } else if (result != L2CAP_MR_SUCCESS) {
4857 l2cap_do_move_cancel(chan, result);
4858 } else {
4859 switch (chan->move_role) {
4860 case L2CAP_MOVE_ROLE_INITIATOR:
4861 l2cap_do_move_initiate(chan, local_amp_id,
4862 remote_amp_id);
4863 break;
4864 case L2CAP_MOVE_ROLE_RESPONDER:
4865 l2cap_do_move_respond(chan, result);
4866 break;
4867 default:
4868 l2cap_do_move_cancel(chan, result);
4869 break;
4870 }
4871 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004872}
4873
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004874static inline int l2cap_move_channel_req(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004875 struct l2cap_cmd_hdr *cmd,
4876 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004877{
4878 struct l2cap_move_chan_req *req = data;
Mat Martineau1500109b2012-10-23 15:24:15 -07004879 struct l2cap_move_chan_rsp rsp;
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004880 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004881 u16 icid = 0;
4882 u16 result = L2CAP_MR_NOT_ALLOWED;
4883
4884 if (cmd_len != sizeof(*req))
4885 return -EPROTO;
4886
4887 icid = le16_to_cpu(req->icid);
4888
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004889 BT_DBG("icid 0x%4.4x, dest_amp_id %d", icid, req->dest_amp_id);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004890
Marcel Holtmann848566b2013-10-01 22:59:22 -07004891 if (!conn->hs_enabled)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004892 return -EINVAL;
4893
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004894 chan = l2cap_get_chan_by_dcid(conn, icid);
4895 if (!chan) {
Mat Martineau1500109b2012-10-23 15:24:15 -07004896 rsp.icid = cpu_to_le16(icid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004897 rsp.result = cpu_to_le16(L2CAP_MR_NOT_ALLOWED);
Mat Martineau1500109b2012-10-23 15:24:15 -07004898 l2cap_send_cmd(conn, cmd->ident, L2CAP_MOVE_CHAN_RSP,
4899 sizeof(rsp), &rsp);
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004900 return 0;
4901 }
4902
Mat Martineau1500109b2012-10-23 15:24:15 -07004903 chan->ident = cmd->ident;
4904
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004905 if (chan->scid < L2CAP_CID_DYN_START ||
4906 chan->chan_policy == BT_CHANNEL_POLICY_BREDR_ONLY ||
4907 (chan->mode != L2CAP_MODE_ERTM &&
4908 chan->mode != L2CAP_MODE_STREAMING)) {
4909 result = L2CAP_MR_NOT_ALLOWED;
4910 goto send_move_response;
4911 }
4912
4913 if (chan->local_amp_id == req->dest_amp_id) {
4914 result = L2CAP_MR_SAME_ID;
4915 goto send_move_response;
4916 }
4917
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004918 if (req->dest_amp_id != AMP_ID_BREDR) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004919 struct hci_dev *hdev;
4920 hdev = hci_dev_get(req->dest_amp_id);
4921 if (!hdev || hdev->dev_type != HCI_AMP ||
4922 !test_bit(HCI_UP, &hdev->flags)) {
4923 if (hdev)
4924 hci_dev_put(hdev);
4925
4926 result = L2CAP_MR_BAD_ID;
4927 goto send_move_response;
4928 }
4929 hci_dev_put(hdev);
4930 }
4931
4932 /* Detect a move collision. Only send a collision response
4933 * if this side has "lost", otherwise proceed with the move.
4934 * The winner has the larger bd_addr.
4935 */
4936 if ((__chan_is_moving(chan) ||
4937 chan->move_role != L2CAP_MOVE_ROLE_NONE) &&
Marcel Holtmann6f59b902013-10-13 05:24:01 -07004938 bacmp(&conn->hcon->src, &conn->hcon->dst) > 0) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004939 result = L2CAP_MR_COLLISION;
4940 goto send_move_response;
4941 }
4942
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004943 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
4944 l2cap_move_setup(chan);
4945 chan->move_id = req->dest_amp_id;
4946 icid = chan->dcid;
4947
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004948 if (req->dest_amp_id == AMP_ID_BREDR) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004949 /* Moving to BR/EDR */
4950 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4951 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4952 result = L2CAP_MR_PEND;
4953 } else {
4954 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4955 result = L2CAP_MR_SUCCESS;
4956 }
4957 } else {
4958 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4959 /* Placeholder - uncomment when amp functions are available */
4960 /*amp_accept_physical(chan, req->dest_amp_id);*/
4961 result = L2CAP_MR_PEND;
4962 }
4963
4964send_move_response:
Mat Martineau1500109b2012-10-23 15:24:15 -07004965 l2cap_send_move_chan_rsp(chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004966
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004967 l2cap_chan_unlock(chan);
4968
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004969 return 0;
4970}
4971
Mat Martineau5b155ef2012-10-23 15:24:14 -07004972static void l2cap_move_continue(struct l2cap_conn *conn, u16 icid, u16 result)
4973{
4974 struct l2cap_chan *chan;
4975 struct hci_chan *hchan = NULL;
4976
4977 chan = l2cap_get_chan_by_scid(conn, icid);
4978 if (!chan) {
4979 l2cap_send_move_chan_cfm_icid(conn, icid);
4980 return;
4981 }
4982
4983 __clear_chan_timer(chan);
4984 if (result == L2CAP_MR_PEND)
4985 __set_chan_timer(chan, L2CAP_MOVE_ERTX_TIMEOUT);
4986
4987 switch (chan->move_state) {
4988 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
4989 /* Move confirm will be sent when logical link
4990 * is complete.
4991 */
4992 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4993 break;
4994 case L2CAP_MOVE_WAIT_RSP_SUCCESS:
4995 if (result == L2CAP_MR_PEND) {
4996 break;
4997 } else if (test_bit(CONN_LOCAL_BUSY,
4998 &chan->conn_state)) {
4999 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
5000 } else {
5001 /* Logical link is up or moving to BR/EDR,
5002 * proceed with move
5003 */
5004 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
5005 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
5006 }
5007 break;
5008 case L2CAP_MOVE_WAIT_RSP:
5009 /* Moving to AMP */
5010 if (result == L2CAP_MR_SUCCESS) {
5011 /* Remote is ready, send confirm immediately
5012 * after logical link is ready
5013 */
5014 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
5015 } else {
5016 /* Both logical link and move success
5017 * are required to confirm
5018 */
5019 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_COMP;
5020 }
5021
5022 /* Placeholder - get hci_chan for logical link */
5023 if (!hchan) {
5024 /* Logical link not available */
5025 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5026 break;
5027 }
5028
5029 /* If the logical link is not yet connected, do not
5030 * send confirmation.
5031 */
5032 if (hchan->state != BT_CONNECTED)
5033 break;
5034
5035 /* Logical link is already ready to go */
5036
5037 chan->hs_hcon = hchan->conn;
5038 chan->hs_hcon->l2cap_data = chan->conn;
5039
5040 if (result == L2CAP_MR_SUCCESS) {
5041 /* Can confirm now */
5042 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
5043 } else {
5044 /* Now only need move success
5045 * to confirm
5046 */
5047 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
5048 }
5049
5050 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
5051 break;
5052 default:
5053 /* Any other amp move state means the move failed. */
5054 chan->move_id = chan->local_amp_id;
5055 l2cap_move_done(chan);
5056 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5057 }
5058
5059 l2cap_chan_unlock(chan);
5060}
5061
5062static void l2cap_move_fail(struct l2cap_conn *conn, u8 ident, u16 icid,
5063 u16 result)
5064{
5065 struct l2cap_chan *chan;
5066
5067 chan = l2cap_get_chan_by_ident(conn, ident);
5068 if (!chan) {
5069 /* Could not locate channel, icid is best guess */
5070 l2cap_send_move_chan_cfm_icid(conn, icid);
5071 return;
5072 }
5073
5074 __clear_chan_timer(chan);
5075
5076 if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
5077 if (result == L2CAP_MR_COLLISION) {
5078 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
5079 } else {
5080 /* Cleanup - cancel move */
5081 chan->move_id = chan->local_amp_id;
5082 l2cap_move_done(chan);
5083 }
5084 }
5085
5086 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5087
5088 l2cap_chan_unlock(chan);
5089}
5090
5091static int l2cap_move_channel_rsp(struct l2cap_conn *conn,
5092 struct l2cap_cmd_hdr *cmd,
5093 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005094{
5095 struct l2cap_move_chan_rsp *rsp = data;
5096 u16 icid, result;
5097
5098 if (cmd_len != sizeof(*rsp))
5099 return -EPROTO;
5100
5101 icid = le16_to_cpu(rsp->icid);
5102 result = le16_to_cpu(rsp->result);
5103
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005104 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005105
Mat Martineau5b155ef2012-10-23 15:24:14 -07005106 if (result == L2CAP_MR_SUCCESS || result == L2CAP_MR_PEND)
5107 l2cap_move_continue(conn, icid, result);
5108 else
5109 l2cap_move_fail(conn, cmd->ident, icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005110
5111 return 0;
5112}
5113
Mat Martineau5f3847a2012-10-23 15:24:12 -07005114static int l2cap_move_channel_confirm(struct l2cap_conn *conn,
5115 struct l2cap_cmd_hdr *cmd,
5116 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005117{
5118 struct l2cap_move_chan_cfm *cfm = data;
Mat Martineau5f3847a2012-10-23 15:24:12 -07005119 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005120 u16 icid, result;
5121
5122 if (cmd_len != sizeof(*cfm))
5123 return -EPROTO;
5124
5125 icid = le16_to_cpu(cfm->icid);
5126 result = le16_to_cpu(cfm->result);
5127
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005128 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005129
Mat Martineau5f3847a2012-10-23 15:24:12 -07005130 chan = l2cap_get_chan_by_dcid(conn, icid);
5131 if (!chan) {
5132 /* Spec requires a response even if the icid was not found */
5133 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5134 return 0;
5135 }
5136
5137 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM) {
5138 if (result == L2CAP_MC_CONFIRMED) {
5139 chan->local_amp_id = chan->move_id;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005140 if (chan->local_amp_id == AMP_ID_BREDR)
Mat Martineau5f3847a2012-10-23 15:24:12 -07005141 __release_logical_link(chan);
5142 } else {
5143 chan->move_id = chan->local_amp_id;
5144 }
5145
5146 l2cap_move_done(chan);
5147 }
5148
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005149 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5150
Mat Martineau5f3847a2012-10-23 15:24:12 -07005151 l2cap_chan_unlock(chan);
5152
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005153 return 0;
5154}
5155
5156static inline int l2cap_move_channel_confirm_rsp(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005157 struct l2cap_cmd_hdr *cmd,
5158 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005159{
5160 struct l2cap_move_chan_cfm_rsp *rsp = data;
Mat Martineau3fd71a02012-10-23 15:24:16 -07005161 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005162 u16 icid;
5163
5164 if (cmd_len != sizeof(*rsp))
5165 return -EPROTO;
5166
5167 icid = le16_to_cpu(rsp->icid);
5168
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005169 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005170
Mat Martineau3fd71a02012-10-23 15:24:16 -07005171 chan = l2cap_get_chan_by_scid(conn, icid);
5172 if (!chan)
5173 return 0;
5174
5175 __clear_chan_timer(chan);
5176
5177 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM_RSP) {
5178 chan->local_amp_id = chan->move_id;
5179
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005180 if (chan->local_amp_id == AMP_ID_BREDR && chan->hs_hchan)
Mat Martineau3fd71a02012-10-23 15:24:16 -07005181 __release_logical_link(chan);
5182
5183 l2cap_move_done(chan);
5184 }
5185
5186 l2cap_chan_unlock(chan);
5187
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005188 return 0;
5189}
5190
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03005191static inline int l2cap_check_conn_param(u16 min, u16 max, u16 latency,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005192 u16 to_multiplier)
Claudio Takahaside731152011-02-11 19:28:55 -02005193{
5194 u16 max_latency;
5195
5196 if (min > max || min < 6 || max > 3200)
5197 return -EINVAL;
5198
5199 if (to_multiplier < 10 || to_multiplier > 3200)
5200 return -EINVAL;
5201
5202 if (max >= to_multiplier * 8)
5203 return -EINVAL;
5204
5205 max_latency = (to_multiplier * 8 / max) - 1;
5206 if (latency > 499 || latency > max_latency)
5207 return -EINVAL;
5208
5209 return 0;
5210}
5211
5212static inline int l2cap_conn_param_update_req(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005213 struct l2cap_cmd_hdr *cmd,
Johan Hedberg203e6392013-05-15 10:07:15 +03005214 u16 cmd_len, u8 *data)
Claudio Takahaside731152011-02-11 19:28:55 -02005215{
5216 struct hci_conn *hcon = conn->hcon;
5217 struct l2cap_conn_param_update_req *req;
5218 struct l2cap_conn_param_update_rsp rsp;
Johan Hedberg203e6392013-05-15 10:07:15 +03005219 u16 min, max, latency, to_multiplier;
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005220 int err;
Claudio Takahaside731152011-02-11 19:28:55 -02005221
5222 if (!(hcon->link_mode & HCI_LM_MASTER))
5223 return -EINVAL;
5224
Claudio Takahaside731152011-02-11 19:28:55 -02005225 if (cmd_len != sizeof(struct l2cap_conn_param_update_req))
5226 return -EPROTO;
5227
5228 req = (struct l2cap_conn_param_update_req *) data;
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03005229 min = __le16_to_cpu(req->min);
5230 max = __le16_to_cpu(req->max);
Claudio Takahaside731152011-02-11 19:28:55 -02005231 latency = __le16_to_cpu(req->latency);
5232 to_multiplier = __le16_to_cpu(req->to_multiplier);
5233
5234 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 +01005235 min, max, latency, to_multiplier);
Claudio Takahaside731152011-02-11 19:28:55 -02005236
5237 memset(&rsp, 0, sizeof(rsp));
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005238
5239 err = l2cap_check_conn_param(min, max, latency, to_multiplier);
5240 if (err)
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005241 rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_REJECTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005242 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005243 rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_ACCEPTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005244
5245 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONN_PARAM_UPDATE_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005246 sizeof(rsp), &rsp);
Claudio Takahaside731152011-02-11 19:28:55 -02005247
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005248 if (!err)
5249 hci_le_conn_update(hcon, min, max, latency, to_multiplier);
5250
Claudio Takahaside731152011-02-11 19:28:55 -02005251 return 0;
5252}
5253
Johan Hedbergf1496de2013-05-13 14:15:56 +03005254static int l2cap_le_connect_rsp(struct l2cap_conn *conn,
5255 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5256 u8 *data)
5257{
5258 struct l2cap_le_conn_rsp *rsp = (struct l2cap_le_conn_rsp *) data;
5259 u16 dcid, mtu, mps, credits, result;
5260 struct l2cap_chan *chan;
5261 int err;
5262
5263 if (cmd_len < sizeof(*rsp))
5264 return -EPROTO;
5265
5266 dcid = __le16_to_cpu(rsp->dcid);
5267 mtu = __le16_to_cpu(rsp->mtu);
5268 mps = __le16_to_cpu(rsp->mps);
5269 credits = __le16_to_cpu(rsp->credits);
5270 result = __le16_to_cpu(rsp->result);
5271
5272 if (result == L2CAP_CR_SUCCESS && (mtu < 23 || mps < 23))
5273 return -EPROTO;
5274
5275 BT_DBG("dcid 0x%4.4x mtu %u mps %u credits %u result 0x%2.2x",
5276 dcid, mtu, mps, credits, result);
5277
5278 mutex_lock(&conn->chan_lock);
5279
5280 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5281 if (!chan) {
5282 err = -EBADSLT;
5283 goto unlock;
5284 }
5285
5286 err = 0;
5287
5288 l2cap_chan_lock(chan);
5289
5290 switch (result) {
5291 case L2CAP_CR_SUCCESS:
5292 chan->ident = 0;
5293 chan->dcid = dcid;
5294 chan->omtu = mtu;
5295 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005296 chan->tx_credits = credits;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005297 l2cap_chan_ready(chan);
5298 break;
5299
5300 default:
5301 l2cap_chan_del(chan, ECONNREFUSED);
5302 break;
5303 }
5304
5305 l2cap_chan_unlock(chan);
5306
5307unlock:
5308 mutex_unlock(&conn->chan_lock);
5309
5310 return err;
5311}
5312
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005313static inline int l2cap_bredr_sig_cmd(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005314 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5315 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005316{
5317 int err = 0;
5318
5319 switch (cmd->code) {
5320 case L2CAP_COMMAND_REJ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005321 l2cap_command_rej(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005322 break;
5323
5324 case L2CAP_CONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005325 err = l2cap_connect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005326 break;
5327
5328 case L2CAP_CONN_RSP:
Mat Martineauf5a25982012-10-11 17:48:21 +03005329 case L2CAP_CREATE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005330 l2cap_connect_create_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005331 break;
5332
5333 case L2CAP_CONF_REQ:
5334 err = l2cap_config_req(conn, cmd, cmd_len, data);
5335 break;
5336
5337 case L2CAP_CONF_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005338 l2cap_config_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005339 break;
5340
5341 case L2CAP_DISCONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005342 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005343 break;
5344
5345 case L2CAP_DISCONN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005346 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005347 break;
5348
5349 case L2CAP_ECHO_REQ:
5350 l2cap_send_cmd(conn, cmd->ident, L2CAP_ECHO_RSP, cmd_len, data);
5351 break;
5352
5353 case L2CAP_ECHO_RSP:
5354 break;
5355
5356 case L2CAP_INFO_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005357 err = l2cap_information_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005358 break;
5359
5360 case L2CAP_INFO_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005361 l2cap_information_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005362 break;
5363
Mat Martineauf94ff6f2011-11-02 16:18:32 -07005364 case L2CAP_CREATE_CHAN_REQ:
5365 err = l2cap_create_channel_req(conn, cmd, cmd_len, data);
5366 break;
5367
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005368 case L2CAP_MOVE_CHAN_REQ:
5369 err = l2cap_move_channel_req(conn, cmd, cmd_len, data);
5370 break;
5371
5372 case L2CAP_MOVE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005373 l2cap_move_channel_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005374 break;
5375
5376 case L2CAP_MOVE_CHAN_CFM:
5377 err = l2cap_move_channel_confirm(conn, cmd, cmd_len, data);
5378 break;
5379
5380 case L2CAP_MOVE_CHAN_CFM_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005381 l2cap_move_channel_confirm_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005382 break;
5383
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005384 default:
5385 BT_ERR("Unknown BR/EDR signaling command 0x%2.2x", cmd->code);
5386 err = -EINVAL;
5387 break;
5388 }
5389
5390 return err;
5391}
5392
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005393static int l2cap_le_connect_req(struct l2cap_conn *conn,
5394 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5395 u8 *data)
5396{
5397 struct l2cap_le_conn_req *req = (struct l2cap_le_conn_req *) data;
5398 struct l2cap_le_conn_rsp rsp;
5399 struct l2cap_chan *chan, *pchan;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005400 u16 dcid, scid, credits, mtu, mps;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005401 __le16 psm;
5402 u8 result;
5403
5404 if (cmd_len != sizeof(*req))
5405 return -EPROTO;
5406
5407 scid = __le16_to_cpu(req->scid);
5408 mtu = __le16_to_cpu(req->mtu);
5409 mps = __le16_to_cpu(req->mps);
5410 psm = req->psm;
5411 dcid = 0;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005412 credits = 0;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005413
5414 if (mtu < 23 || mps < 23)
5415 return -EPROTO;
5416
5417 BT_DBG("psm 0x%2.2x scid 0x%4.4x mtu %u mps %u", __le16_to_cpu(psm),
5418 scid, mtu, mps);
5419
5420 /* Check if we have socket listening on psm */
5421 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
5422 &conn->hcon->dst, LE_LINK);
5423 if (!pchan) {
5424 result = L2CAP_CR_BAD_PSM;
5425 chan = NULL;
5426 goto response;
5427 }
5428
5429 mutex_lock(&conn->chan_lock);
5430 l2cap_chan_lock(pchan);
5431
5432 if (!smp_sufficient_security(conn->hcon, pchan->sec_level)) {
5433 result = L2CAP_CR_AUTHENTICATION;
5434 chan = NULL;
5435 goto response_unlock;
5436 }
5437
5438 /* Check if we already have channel with that dcid */
5439 if (__l2cap_get_chan_by_dcid(conn, scid)) {
5440 result = L2CAP_CR_NO_MEM;
5441 chan = NULL;
5442 goto response_unlock;
5443 }
5444
5445 chan = pchan->ops->new_connection(pchan);
5446 if (!chan) {
5447 result = L2CAP_CR_NO_MEM;
5448 goto response_unlock;
5449 }
5450
Johan Hedberg0ce43ce2013-12-05 14:55:33 +02005451 l2cap_le_flowctl_init(chan);
5452
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005453 bacpy(&chan->src, &conn->hcon->src);
5454 bacpy(&chan->dst, &conn->hcon->dst);
5455 chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type);
5456 chan->dst_type = bdaddr_type(conn->hcon, conn->hcon->dst_type);
5457 chan->psm = psm;
5458 chan->dcid = scid;
5459 chan->omtu = mtu;
5460 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005461 chan->tx_credits = __le16_to_cpu(req->credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005462
5463 __l2cap_chan_add(conn, chan);
5464 dcid = chan->scid;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005465 credits = chan->rx_credits;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005466
5467 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
5468
5469 chan->ident = cmd->ident;
5470
5471 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
5472 l2cap_state_change(chan, BT_CONNECT2);
5473 result = L2CAP_CR_PEND;
5474 chan->ops->defer(chan);
5475 } else {
5476 l2cap_chan_ready(chan);
5477 result = L2CAP_CR_SUCCESS;
5478 }
5479
5480response_unlock:
5481 l2cap_chan_unlock(pchan);
5482 mutex_unlock(&conn->chan_lock);
5483
5484 if (result == L2CAP_CR_PEND)
5485 return 0;
5486
5487response:
5488 if (chan) {
5489 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02005490 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005491 } else {
5492 rsp.mtu = 0;
5493 rsp.mps = 0;
5494 }
5495
5496 rsp.dcid = cpu_to_le16(dcid);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005497 rsp.credits = cpu_to_le16(credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005498 rsp.result = cpu_to_le16(result);
5499
5500 l2cap_send_cmd(conn, cmd->ident, L2CAP_LE_CONN_RSP, sizeof(rsp), &rsp);
5501
5502 return 0;
5503}
5504
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005505static inline int l2cap_le_credits(struct l2cap_conn *conn,
5506 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5507 u8 *data)
5508{
5509 struct l2cap_le_credits *pkt;
5510 struct l2cap_chan *chan;
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005511 u16 cid, credits, max_credits;
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005512
5513 if (cmd_len != sizeof(*pkt))
5514 return -EPROTO;
5515
5516 pkt = (struct l2cap_le_credits *) data;
5517 cid = __le16_to_cpu(pkt->cid);
5518 credits = __le16_to_cpu(pkt->credits);
5519
5520 BT_DBG("cid 0x%4.4x credits 0x%4.4x", cid, credits);
5521
5522 chan = l2cap_get_chan_by_dcid(conn, cid);
5523 if (!chan)
5524 return -EBADSLT;
5525
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005526 max_credits = LE_FLOWCTL_MAX_CREDITS - chan->tx_credits;
5527 if (credits > max_credits) {
5528 BT_ERR("LE credits overflow");
5529 l2cap_send_disconn_req(chan, ECONNRESET);
5530
5531 /* Return 0 so that we don't trigger an unnecessary
5532 * command reject packet.
5533 */
5534 return 0;
5535 }
5536
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005537 chan->tx_credits += credits;
5538
5539 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
5540 l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
5541 chan->tx_credits--;
5542 }
5543
5544 if (chan->tx_credits)
5545 chan->ops->resume(chan);
5546
5547 l2cap_chan_unlock(chan);
5548
5549 return 0;
5550}
5551
Johan Hedberg71fb4192013-12-10 10:52:48 +02005552static inline int l2cap_le_command_rej(struct l2cap_conn *conn,
5553 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5554 u8 *data)
5555{
5556 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
5557 struct l2cap_chan *chan;
5558
5559 if (cmd_len < sizeof(*rej))
5560 return -EPROTO;
5561
5562 mutex_lock(&conn->chan_lock);
5563
5564 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5565 if (!chan)
5566 goto done;
5567
5568 l2cap_chan_lock(chan);
5569 l2cap_chan_del(chan, ECONNREFUSED);
5570 l2cap_chan_unlock(chan);
5571
5572done:
5573 mutex_unlock(&conn->chan_lock);
5574 return 0;
5575}
5576
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005577static inline int l2cap_le_sig_cmd(struct l2cap_conn *conn,
Johan Hedberg203e6392013-05-15 10:07:15 +03005578 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5579 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005580{
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005581 int err = 0;
5582
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005583 switch (cmd->code) {
5584 case L2CAP_COMMAND_REJ:
Johan Hedberg71fb4192013-12-10 10:52:48 +02005585 l2cap_le_command_rej(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005586 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005587
5588 case L2CAP_CONN_PARAM_UPDATE_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005589 err = l2cap_conn_param_update_req(conn, cmd, cmd_len, data);
5590 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005591
5592 case L2CAP_CONN_PARAM_UPDATE_RSP:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005593 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005594
Johan Hedbergf1496de2013-05-13 14:15:56 +03005595 case L2CAP_LE_CONN_RSP:
5596 l2cap_le_connect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005597 break;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005598
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005599 case L2CAP_LE_CONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005600 err = l2cap_le_connect_req(conn, cmd, cmd_len, data);
5601 break;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005602
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005603 case L2CAP_LE_CREDITS:
5604 err = l2cap_le_credits(conn, cmd, cmd_len, data);
5605 break;
5606
Johan Hedberg3defe012013-05-15 10:16:06 +03005607 case L2CAP_DISCONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005608 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
5609 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005610
5611 case L2CAP_DISCONN_RSP:
5612 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005613 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005614
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005615 default:
5616 BT_ERR("Unknown LE signaling command 0x%2.2x", cmd->code);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005617 err = -EINVAL;
5618 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005619 }
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005620
5621 return err;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005622}
5623
Johan Hedbergc5623552013-04-29 19:35:33 +03005624static inline void l2cap_le_sig_channel(struct l2cap_conn *conn,
5625 struct sk_buff *skb)
5626{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005627 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005628 struct l2cap_cmd_hdr *cmd;
5629 u16 len;
Johan Hedbergc5623552013-04-29 19:35:33 +03005630 int err;
5631
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005632 if (hcon->type != LE_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005633 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005634
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005635 if (skb->len < L2CAP_CMD_HDR_SIZE)
5636 goto drop;
Johan Hedbergc5623552013-04-29 19:35:33 +03005637
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005638 cmd = (void *) skb->data;
5639 skb_pull(skb, L2CAP_CMD_HDR_SIZE);
Johan Hedbergc5623552013-04-29 19:35:33 +03005640
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005641 len = le16_to_cpu(cmd->len);
Johan Hedbergc5623552013-04-29 19:35:33 +03005642
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005643 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd->code, len, cmd->ident);
Johan Hedbergc5623552013-04-29 19:35:33 +03005644
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005645 if (len != skb->len || !cmd->ident) {
5646 BT_DBG("corrupted command");
5647 goto drop;
5648 }
Johan Hedbergc5623552013-04-29 19:35:33 +03005649
Johan Hedberg203e6392013-05-15 10:07:15 +03005650 err = l2cap_le_sig_cmd(conn, cmd, len, skb->data);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005651 if (err) {
5652 struct l2cap_cmd_rej_unk rej;
Johan Hedbergc5623552013-04-29 19:35:33 +03005653
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005654 BT_ERR("Wrong link type (%d)", err);
Johan Hedbergc5623552013-04-29 19:35:33 +03005655
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005656 rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005657 l2cap_send_cmd(conn, cmd->ident, L2CAP_COMMAND_REJ,
5658 sizeof(rej), &rej);
Johan Hedbergc5623552013-04-29 19:35:33 +03005659 }
5660
Marcel Holtmann3b166292013-10-02 08:28:21 -07005661drop:
Johan Hedbergc5623552013-04-29 19:35:33 +03005662 kfree_skb(skb);
5663}
5664
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005665static inline void l2cap_sig_channel(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005666 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005667{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005668 struct hci_conn *hcon = conn->hcon;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005669 u8 *data = skb->data;
5670 int len = skb->len;
5671 struct l2cap_cmd_hdr cmd;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005672 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005673
5674 l2cap_raw_recv(conn, skb);
5675
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005676 if (hcon->type != ACL_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005677 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005678
Linus Torvalds1da177e2005-04-16 15:20:36 -07005679 while (len >= L2CAP_CMD_HDR_SIZE) {
Al Viro88219a02007-07-29 00:17:25 -07005680 u16 cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005681 memcpy(&cmd, data, L2CAP_CMD_HDR_SIZE);
5682 data += L2CAP_CMD_HDR_SIZE;
5683 len -= L2CAP_CMD_HDR_SIZE;
5684
Al Viro88219a02007-07-29 00:17:25 -07005685 cmd_len = le16_to_cpu(cmd.len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005686
Gustavo Padovan2d792812012-10-06 10:07:01 +01005687 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd.code, cmd_len,
5688 cmd.ident);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005689
Al Viro88219a02007-07-29 00:17:25 -07005690 if (cmd_len > len || !cmd.ident) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005691 BT_DBG("corrupted command");
5692 break;
5693 }
5694
Johan Hedbergc5623552013-04-29 19:35:33 +03005695 err = l2cap_bredr_sig_cmd(conn, &cmd, cmd_len, data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005696 if (err) {
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03005697 struct l2cap_cmd_rej_unk rej;
Gustavo F. Padovan2c6d1a22011-03-23 14:38:32 -03005698
5699 BT_ERR("Wrong link type (%d)", err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005700
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005701 rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Gustavo Padovan2d792812012-10-06 10:07:01 +01005702 l2cap_send_cmd(conn, cmd.ident, L2CAP_COMMAND_REJ,
5703 sizeof(rej), &rej);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005704 }
5705
Al Viro88219a02007-07-29 00:17:25 -07005706 data += cmd_len;
5707 len -= cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005708 }
5709
Marcel Holtmann3b166292013-10-02 08:28:21 -07005710drop:
Linus Torvalds1da177e2005-04-16 15:20:36 -07005711 kfree_skb(skb);
5712}
5713
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005714static int l2cap_check_fcs(struct l2cap_chan *chan, struct sk_buff *skb)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005715{
5716 u16 our_fcs, rcv_fcs;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03005717 int hdr_size;
5718
5719 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
5720 hdr_size = L2CAP_EXT_HDR_SIZE;
5721 else
5722 hdr_size = L2CAP_ENH_HDR_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005723
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005724 if (chan->fcs == L2CAP_FCS_CRC16) {
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005725 skb_trim(skb, skb->len - L2CAP_FCS_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005726 rcv_fcs = get_unaligned_le16(skb->data + skb->len);
5727 our_fcs = crc16(0, skb->data - hdr_size, skb->len + hdr_size);
5728
5729 if (our_fcs != rcv_fcs)
João Paulo Rechi Vita7a560e52010-06-22 13:56:27 -03005730 return -EBADMSG;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005731 }
5732 return 0;
5733}
5734
Mat Martineau6ea00482012-05-17 20:53:52 -07005735static void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan)
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005736{
Mat Martineaue31f7632012-05-17 20:53:41 -07005737 struct l2cap_ctrl control;
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005738
Mat Martineaue31f7632012-05-17 20:53:41 -07005739 BT_DBG("chan %p", chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005740
Mat Martineaue31f7632012-05-17 20:53:41 -07005741 memset(&control, 0, sizeof(control));
5742 control.sframe = 1;
5743 control.final = 1;
5744 control.reqseq = chan->buffer_seq;
5745 set_bit(CONN_SEND_FBIT, &chan->conn_state);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005746
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005747 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
Mat Martineaue31f7632012-05-17 20:53:41 -07005748 control.super = L2CAP_SUPER_RNR;
5749 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005750 }
5751
Mat Martineaue31f7632012-05-17 20:53:41 -07005752 if (test_and_clear_bit(CONN_REMOTE_BUSY, &chan->conn_state) &&
5753 chan->unacked_frames > 0)
5754 __set_retrans_timer(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005755
Mat Martineaue31f7632012-05-17 20:53:41 -07005756 /* Send pending iframes */
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03005757 l2cap_ertm_send(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005758
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005759 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
Mat Martineaue31f7632012-05-17 20:53:41 -07005760 test_bit(CONN_SEND_FBIT, &chan->conn_state)) {
5761 /* F-bit wasn't sent in an s-frame or i-frame yet, so
5762 * send it now.
5763 */
5764 control.super = L2CAP_SUPER_RR;
5765 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005766 }
5767}
5768
Gustavo Padovan2d792812012-10-06 10:07:01 +01005769static void append_skb_frag(struct sk_buff *skb, struct sk_buff *new_frag,
5770 struct sk_buff **last_frag)
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005771{
Mat Martineau84084a32011-07-22 14:54:00 -07005772 /* skb->len reflects data in skb as well as all fragments
5773 * skb->data_len reflects only data in fragments
5774 */
5775 if (!skb_has_frag_list(skb))
5776 skb_shinfo(skb)->frag_list = new_frag;
5777
5778 new_frag->next = NULL;
5779
5780 (*last_frag)->next = new_frag;
5781 *last_frag = new_frag;
5782
5783 skb->len += new_frag->len;
5784 skb->data_len += new_frag->len;
5785 skb->truesize += new_frag->truesize;
5786}
5787
Mat Martineau4b51dae92012-05-17 20:53:37 -07005788static int l2cap_reassemble_sdu(struct l2cap_chan *chan, struct sk_buff *skb,
5789 struct l2cap_ctrl *control)
Mat Martineau84084a32011-07-22 14:54:00 -07005790{
5791 int err = -EINVAL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005792
Mat Martineau4b51dae92012-05-17 20:53:37 -07005793 switch (control->sar) {
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005794 case L2CAP_SAR_UNSEGMENTED:
Mat Martineau84084a32011-07-22 14:54:00 -07005795 if (chan->sdu)
5796 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005797
Gustavo Padovan80b98022012-05-27 22:27:51 -03005798 err = chan->ops->recv(chan, skb);
Mat Martineau84084a32011-07-22 14:54:00 -07005799 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005800
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005801 case L2CAP_SAR_START:
Mat Martineau84084a32011-07-22 14:54:00 -07005802 if (chan->sdu)
5803 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005804
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005805 chan->sdu_len = get_unaligned_le16(skb->data);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005806 skb_pull(skb, L2CAP_SDULEN_SIZE);
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005807
Mat Martineau84084a32011-07-22 14:54:00 -07005808 if (chan->sdu_len > chan->imtu) {
5809 err = -EMSGSIZE;
5810 break;
5811 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005812
Mat Martineau84084a32011-07-22 14:54:00 -07005813 if (skb->len >= chan->sdu_len)
5814 break;
5815
5816 chan->sdu = skb;
5817 chan->sdu_last_frag = skb;
5818
5819 skb = NULL;
5820 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005821 break;
5822
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005823 case L2CAP_SAR_CONTINUE:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005824 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005825 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005826
Mat Martineau84084a32011-07-22 14:54:00 -07005827 append_skb_frag(chan->sdu, skb,
5828 &chan->sdu_last_frag);
5829 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005830
Mat Martineau84084a32011-07-22 14:54:00 -07005831 if (chan->sdu->len >= chan->sdu_len)
5832 break;
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005833
Mat Martineau84084a32011-07-22 14:54:00 -07005834 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005835 break;
5836
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005837 case L2CAP_SAR_END:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005838 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005839 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005840
Mat Martineau84084a32011-07-22 14:54:00 -07005841 append_skb_frag(chan->sdu, skb,
5842 &chan->sdu_last_frag);
5843 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005844
Mat Martineau84084a32011-07-22 14:54:00 -07005845 if (chan->sdu->len != chan->sdu_len)
5846 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005847
Gustavo Padovan80b98022012-05-27 22:27:51 -03005848 err = chan->ops->recv(chan, chan->sdu);
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005849
Mat Martineau84084a32011-07-22 14:54:00 -07005850 if (!err) {
5851 /* Reassembly complete */
5852 chan->sdu = NULL;
5853 chan->sdu_last_frag = NULL;
5854 chan->sdu_len = 0;
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005855 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005856 break;
5857 }
5858
Mat Martineau84084a32011-07-22 14:54:00 -07005859 if (err) {
5860 kfree_skb(skb);
5861 kfree_skb(chan->sdu);
5862 chan->sdu = NULL;
5863 chan->sdu_last_frag = NULL;
5864 chan->sdu_len = 0;
5865 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005866
Mat Martineau84084a32011-07-22 14:54:00 -07005867 return err;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005868}
5869
Mat Martineau32b32732012-10-23 15:24:11 -07005870static int l2cap_resegment(struct l2cap_chan *chan)
5871{
5872 /* Placeholder */
5873 return 0;
5874}
5875
Mat Martineaue3281402011-07-07 09:39:02 -07005876void l2cap_chan_busy(struct l2cap_chan *chan, int busy)
Gustavo F. Padovan712132eb2010-06-21 19:39:50 -03005877{
Mat Martineau61aa4f52012-05-17 20:53:40 -07005878 u8 event;
5879
5880 if (chan->mode != L2CAP_MODE_ERTM)
5881 return;
5882
5883 event = busy ? L2CAP_EV_LOCAL_BUSY_DETECTED : L2CAP_EV_LOCAL_BUSY_CLEAR;
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03005884 l2cap_tx(chan, NULL, NULL, event);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005885}
5886
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005887static int l2cap_rx_queued_iframes(struct l2cap_chan *chan)
5888{
Mat Martineau63838722012-05-17 20:53:45 -07005889 int err = 0;
5890 /* Pass sequential frames to l2cap_reassemble_sdu()
5891 * until a gap is encountered.
5892 */
5893
5894 BT_DBG("chan %p", chan);
5895
5896 while (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
5897 struct sk_buff *skb;
5898 BT_DBG("Searching for skb with txseq %d (queue len %d)",
5899 chan->buffer_seq, skb_queue_len(&chan->srej_q));
5900
5901 skb = l2cap_ertm_seq_in_queue(&chan->srej_q, chan->buffer_seq);
5902
5903 if (!skb)
5904 break;
5905
5906 skb_unlink(skb, &chan->srej_q);
5907 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
5908 err = l2cap_reassemble_sdu(chan, skb, &bt_cb(skb)->control);
5909 if (err)
5910 break;
5911 }
5912
5913 if (skb_queue_empty(&chan->srej_q)) {
5914 chan->rx_state = L2CAP_RX_STATE_RECV;
5915 l2cap_send_ack(chan);
5916 }
5917
5918 return err;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005919}
5920
5921static void l2cap_handle_srej(struct l2cap_chan *chan,
5922 struct l2cap_ctrl *control)
5923{
Mat Martineauf80842a2012-05-17 20:53:46 -07005924 struct sk_buff *skb;
5925
5926 BT_DBG("chan %p, control %p", chan, control);
5927
5928 if (control->reqseq == chan->next_tx_seq) {
5929 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005930 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005931 return;
5932 }
5933
5934 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
5935
5936 if (skb == NULL) {
5937 BT_DBG("Seq %d not available for retransmission",
5938 control->reqseq);
5939 return;
5940 }
5941
5942 if (chan->max_tx != 0 && bt_cb(skb)->control.retries >= chan->max_tx) {
5943 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005944 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005945 return;
5946 }
5947
5948 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
5949
5950 if (control->poll) {
5951 l2cap_pass_to_tx(chan, control);
5952
5953 set_bit(CONN_SEND_FBIT, &chan->conn_state);
5954 l2cap_retransmit(chan, control);
5955 l2cap_ertm_send(chan);
5956
5957 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5958 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5959 chan->srej_save_reqseq = control->reqseq;
5960 }
5961 } else {
5962 l2cap_pass_to_tx_fbit(chan, control);
5963
5964 if (control->final) {
5965 if (chan->srej_save_reqseq != control->reqseq ||
5966 !test_and_clear_bit(CONN_SREJ_ACT,
5967 &chan->conn_state))
5968 l2cap_retransmit(chan, control);
5969 } else {
5970 l2cap_retransmit(chan, control);
5971 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5972 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5973 chan->srej_save_reqseq = control->reqseq;
5974 }
5975 }
5976 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005977}
5978
5979static void l2cap_handle_rej(struct l2cap_chan *chan,
5980 struct l2cap_ctrl *control)
5981{
Mat Martineaufcd289d2012-05-17 20:53:47 -07005982 struct sk_buff *skb;
5983
5984 BT_DBG("chan %p, control %p", chan, control);
5985
5986 if (control->reqseq == chan->next_tx_seq) {
5987 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005988 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07005989 return;
5990 }
5991
5992 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
5993
5994 if (chan->max_tx && skb &&
5995 bt_cb(skb)->control.retries >= chan->max_tx) {
5996 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005997 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07005998 return;
5999 }
6000
6001 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6002
6003 l2cap_pass_to_tx(chan, control);
6004
6005 if (control->final) {
6006 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state))
6007 l2cap_retransmit_all(chan, control);
6008 } else {
6009 l2cap_retransmit_all(chan, control);
6010 l2cap_ertm_send(chan);
6011 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F)
6012 set_bit(CONN_REJ_ACT, &chan->conn_state);
6013 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006014}
6015
Mat Martineau4b51dae92012-05-17 20:53:37 -07006016static u8 l2cap_classify_txseq(struct l2cap_chan *chan, u16 txseq)
6017{
6018 BT_DBG("chan %p, txseq %d", chan, txseq);
6019
6020 BT_DBG("last_acked_seq %d, expected_tx_seq %d", chan->last_acked_seq,
6021 chan->expected_tx_seq);
6022
6023 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
6024 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
Gustavo Padovan2d792812012-10-06 10:07:01 +01006025 chan->tx_win) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07006026 /* See notes below regarding "double poll" and
6027 * invalid packets.
6028 */
6029 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
6030 BT_DBG("Invalid/Ignore - after SREJ");
6031 return L2CAP_TXSEQ_INVALID_IGNORE;
6032 } else {
6033 BT_DBG("Invalid - in window after SREJ sent");
6034 return L2CAP_TXSEQ_INVALID;
6035 }
6036 }
6037
6038 if (chan->srej_list.head == txseq) {
6039 BT_DBG("Expected SREJ");
6040 return L2CAP_TXSEQ_EXPECTED_SREJ;
6041 }
6042
6043 if (l2cap_ertm_seq_in_queue(&chan->srej_q, txseq)) {
6044 BT_DBG("Duplicate SREJ - txseq already stored");
6045 return L2CAP_TXSEQ_DUPLICATE_SREJ;
6046 }
6047
6048 if (l2cap_seq_list_contains(&chan->srej_list, txseq)) {
6049 BT_DBG("Unexpected SREJ - not requested");
6050 return L2CAP_TXSEQ_UNEXPECTED_SREJ;
6051 }
6052 }
6053
6054 if (chan->expected_tx_seq == txseq) {
6055 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
6056 chan->tx_win) {
6057 BT_DBG("Invalid - txseq outside tx window");
6058 return L2CAP_TXSEQ_INVALID;
6059 } else {
6060 BT_DBG("Expected");
6061 return L2CAP_TXSEQ_EXPECTED;
6062 }
6063 }
6064
6065 if (__seq_offset(chan, txseq, chan->last_acked_seq) <
Gustavo Padovan2d792812012-10-06 10:07:01 +01006066 __seq_offset(chan, chan->expected_tx_seq, chan->last_acked_seq)) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07006067 BT_DBG("Duplicate - expected_tx_seq later than txseq");
6068 return L2CAP_TXSEQ_DUPLICATE;
6069 }
6070
6071 if (__seq_offset(chan, txseq, chan->last_acked_seq) >= chan->tx_win) {
6072 /* A source of invalid packets is a "double poll" condition,
6073 * where delays cause us to send multiple poll packets. If
6074 * the remote stack receives and processes both polls,
6075 * sequence numbers can wrap around in such a way that a
6076 * resent frame has a sequence number that looks like new data
6077 * with a sequence gap. This would trigger an erroneous SREJ
6078 * request.
6079 *
6080 * Fortunately, this is impossible with a tx window that's
6081 * less than half of the maximum sequence number, which allows
6082 * invalid frames to be safely ignored.
6083 *
6084 * With tx window sizes greater than half of the tx window
6085 * maximum, the frame is invalid and cannot be ignored. This
6086 * causes a disconnect.
6087 */
6088
6089 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
6090 BT_DBG("Invalid/Ignore - txseq outside tx window");
6091 return L2CAP_TXSEQ_INVALID_IGNORE;
6092 } else {
6093 BT_DBG("Invalid - txseq outside tx window");
6094 return L2CAP_TXSEQ_INVALID;
6095 }
6096 } else {
6097 BT_DBG("Unexpected - txseq indicates missing frames");
6098 return L2CAP_TXSEQ_UNEXPECTED;
6099 }
6100}
6101
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006102static int l2cap_rx_state_recv(struct l2cap_chan *chan,
6103 struct l2cap_ctrl *control,
6104 struct sk_buff *skb, u8 event)
6105{
6106 int err = 0;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006107 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006108
6109 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6110 event);
6111
6112 switch (event) {
6113 case L2CAP_EV_RECV_IFRAME:
6114 switch (l2cap_classify_txseq(chan, control->txseq)) {
6115 case L2CAP_TXSEQ_EXPECTED:
6116 l2cap_pass_to_tx(chan, control);
6117
6118 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6119 BT_DBG("Busy, discarding expected seq %d",
6120 control->txseq);
6121 break;
6122 }
6123
6124 chan->expected_tx_seq = __next_seq(chan,
6125 control->txseq);
6126
6127 chan->buffer_seq = chan->expected_tx_seq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006128 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006129
6130 err = l2cap_reassemble_sdu(chan, skb, control);
6131 if (err)
6132 break;
6133
6134 if (control->final) {
6135 if (!test_and_clear_bit(CONN_REJ_ACT,
6136 &chan->conn_state)) {
6137 control->final = 0;
6138 l2cap_retransmit_all(chan, control);
6139 l2cap_ertm_send(chan);
6140 }
6141 }
6142
6143 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
6144 l2cap_send_ack(chan);
6145 break;
6146 case L2CAP_TXSEQ_UNEXPECTED:
6147 l2cap_pass_to_tx(chan, control);
6148
6149 /* Can't issue SREJ frames in the local busy state.
6150 * Drop this frame, it will be seen as missing
6151 * when local busy is exited.
6152 */
6153 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6154 BT_DBG("Busy, discarding unexpected seq %d",
6155 control->txseq);
6156 break;
6157 }
6158
6159 /* There was a gap in the sequence, so an SREJ
6160 * must be sent for each missing frame. The
6161 * current frame is stored for later use.
6162 */
6163 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006164 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006165 BT_DBG("Queued %p (queue len %d)", skb,
6166 skb_queue_len(&chan->srej_q));
6167
6168 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
6169 l2cap_seq_list_clear(&chan->srej_list);
6170 l2cap_send_srej(chan, control->txseq);
6171
6172 chan->rx_state = L2CAP_RX_STATE_SREJ_SENT;
6173 break;
6174 case L2CAP_TXSEQ_DUPLICATE:
6175 l2cap_pass_to_tx(chan, control);
6176 break;
6177 case L2CAP_TXSEQ_INVALID_IGNORE:
6178 break;
6179 case L2CAP_TXSEQ_INVALID:
6180 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006181 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006182 break;
6183 }
6184 break;
6185 case L2CAP_EV_RECV_RR:
6186 l2cap_pass_to_tx(chan, control);
6187 if (control->final) {
6188 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6189
Mat Martineaue6a3ee62012-10-23 15:24:22 -07006190 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state) &&
6191 !__chan_is_moving(chan)) {
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006192 control->final = 0;
6193 l2cap_retransmit_all(chan, control);
6194 }
6195
6196 l2cap_ertm_send(chan);
6197 } else if (control->poll) {
6198 l2cap_send_i_or_rr_or_rnr(chan);
6199 } else {
6200 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6201 &chan->conn_state) &&
6202 chan->unacked_frames)
6203 __set_retrans_timer(chan);
6204
6205 l2cap_ertm_send(chan);
6206 }
6207 break;
6208 case L2CAP_EV_RECV_RNR:
6209 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6210 l2cap_pass_to_tx(chan, control);
6211 if (control && control->poll) {
6212 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6213 l2cap_send_rr_or_rnr(chan, 0);
6214 }
6215 __clear_retrans_timer(chan);
6216 l2cap_seq_list_clear(&chan->retrans_list);
6217 break;
6218 case L2CAP_EV_RECV_REJ:
6219 l2cap_handle_rej(chan, control);
6220 break;
6221 case L2CAP_EV_RECV_SREJ:
6222 l2cap_handle_srej(chan, control);
6223 break;
6224 default:
6225 break;
6226 }
6227
6228 if (skb && !skb_in_use) {
6229 BT_DBG("Freeing %p", skb);
6230 kfree_skb(skb);
6231 }
6232
6233 return err;
6234}
6235
6236static int l2cap_rx_state_srej_sent(struct l2cap_chan *chan,
6237 struct l2cap_ctrl *control,
6238 struct sk_buff *skb, u8 event)
6239{
6240 int err = 0;
6241 u16 txseq = control->txseq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006242 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006243
6244 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6245 event);
6246
6247 switch (event) {
6248 case L2CAP_EV_RECV_IFRAME:
6249 switch (l2cap_classify_txseq(chan, txseq)) {
6250 case L2CAP_TXSEQ_EXPECTED:
6251 /* Keep frame for reassembly later */
6252 l2cap_pass_to_tx(chan, control);
6253 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006254 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006255 BT_DBG("Queued %p (queue len %d)", skb,
6256 skb_queue_len(&chan->srej_q));
6257
6258 chan->expected_tx_seq = __next_seq(chan, txseq);
6259 break;
6260 case L2CAP_TXSEQ_EXPECTED_SREJ:
6261 l2cap_seq_list_pop(&chan->srej_list);
6262
6263 l2cap_pass_to_tx(chan, control);
6264 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006265 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006266 BT_DBG("Queued %p (queue len %d)", skb,
6267 skb_queue_len(&chan->srej_q));
6268
6269 err = l2cap_rx_queued_iframes(chan);
6270 if (err)
6271 break;
6272
6273 break;
6274 case L2CAP_TXSEQ_UNEXPECTED:
6275 /* Got a frame that can't be reassembled yet.
6276 * Save it for later, and send SREJs to cover
6277 * the missing frames.
6278 */
6279 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006280 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006281 BT_DBG("Queued %p (queue len %d)", skb,
6282 skb_queue_len(&chan->srej_q));
6283
6284 l2cap_pass_to_tx(chan, control);
6285 l2cap_send_srej(chan, control->txseq);
6286 break;
6287 case L2CAP_TXSEQ_UNEXPECTED_SREJ:
6288 /* This frame was requested with an SREJ, but
6289 * some expected retransmitted frames are
6290 * missing. Request retransmission of missing
6291 * SREJ'd frames.
6292 */
6293 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006294 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006295 BT_DBG("Queued %p (queue len %d)", skb,
6296 skb_queue_len(&chan->srej_q));
6297
6298 l2cap_pass_to_tx(chan, control);
6299 l2cap_send_srej_list(chan, control->txseq);
6300 break;
6301 case L2CAP_TXSEQ_DUPLICATE_SREJ:
6302 /* We've already queued this frame. Drop this copy. */
6303 l2cap_pass_to_tx(chan, control);
6304 break;
6305 case L2CAP_TXSEQ_DUPLICATE:
6306 /* Expecting a later sequence number, so this frame
6307 * was already received. Ignore it completely.
6308 */
6309 break;
6310 case L2CAP_TXSEQ_INVALID_IGNORE:
6311 break;
6312 case L2CAP_TXSEQ_INVALID:
6313 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006314 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006315 break;
6316 }
6317 break;
6318 case L2CAP_EV_RECV_RR:
6319 l2cap_pass_to_tx(chan, control);
6320 if (control->final) {
6321 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6322
6323 if (!test_and_clear_bit(CONN_REJ_ACT,
6324 &chan->conn_state)) {
6325 control->final = 0;
6326 l2cap_retransmit_all(chan, control);
6327 }
6328
6329 l2cap_ertm_send(chan);
6330 } else if (control->poll) {
6331 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6332 &chan->conn_state) &&
6333 chan->unacked_frames) {
6334 __set_retrans_timer(chan);
6335 }
6336
6337 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6338 l2cap_send_srej_tail(chan);
6339 } else {
6340 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6341 &chan->conn_state) &&
6342 chan->unacked_frames)
6343 __set_retrans_timer(chan);
6344
6345 l2cap_send_ack(chan);
6346 }
6347 break;
6348 case L2CAP_EV_RECV_RNR:
6349 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6350 l2cap_pass_to_tx(chan, control);
6351 if (control->poll) {
6352 l2cap_send_srej_tail(chan);
6353 } else {
6354 struct l2cap_ctrl rr_control;
6355 memset(&rr_control, 0, sizeof(rr_control));
6356 rr_control.sframe = 1;
6357 rr_control.super = L2CAP_SUPER_RR;
6358 rr_control.reqseq = chan->buffer_seq;
6359 l2cap_send_sframe(chan, &rr_control);
6360 }
6361
6362 break;
6363 case L2CAP_EV_RECV_REJ:
6364 l2cap_handle_rej(chan, control);
6365 break;
6366 case L2CAP_EV_RECV_SREJ:
6367 l2cap_handle_srej(chan, control);
6368 break;
6369 }
6370
6371 if (skb && !skb_in_use) {
6372 BT_DBG("Freeing %p", skb);
6373 kfree_skb(skb);
6374 }
6375
6376 return err;
6377}
6378
Mat Martineau32b32732012-10-23 15:24:11 -07006379static int l2cap_finish_move(struct l2cap_chan *chan)
6380{
6381 BT_DBG("chan %p", chan);
6382
6383 chan->rx_state = L2CAP_RX_STATE_RECV;
6384
6385 if (chan->hs_hcon)
6386 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6387 else
6388 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6389
6390 return l2cap_resegment(chan);
6391}
6392
6393static int l2cap_rx_state_wait_p(struct l2cap_chan *chan,
6394 struct l2cap_ctrl *control,
6395 struct sk_buff *skb, u8 event)
6396{
6397 int err;
6398
6399 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6400 event);
6401
6402 if (!control->poll)
6403 return -EPROTO;
6404
6405 l2cap_process_reqseq(chan, control->reqseq);
6406
6407 if (!skb_queue_empty(&chan->tx_q))
6408 chan->tx_send_head = skb_peek(&chan->tx_q);
6409 else
6410 chan->tx_send_head = NULL;
6411
6412 /* Rewind next_tx_seq to the point expected
6413 * by the receiver.
6414 */
6415 chan->next_tx_seq = control->reqseq;
6416 chan->unacked_frames = 0;
6417
6418 err = l2cap_finish_move(chan);
6419 if (err)
6420 return err;
6421
6422 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6423 l2cap_send_i_or_rr_or_rnr(chan);
6424
6425 if (event == L2CAP_EV_RECV_IFRAME)
6426 return -EPROTO;
6427
6428 return l2cap_rx_state_recv(chan, control, NULL, event);
6429}
6430
6431static int l2cap_rx_state_wait_f(struct l2cap_chan *chan,
6432 struct l2cap_ctrl *control,
6433 struct sk_buff *skb, u8 event)
6434{
6435 int err;
6436
6437 if (!control->final)
6438 return -EPROTO;
6439
6440 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6441
6442 chan->rx_state = L2CAP_RX_STATE_RECV;
6443 l2cap_process_reqseq(chan, control->reqseq);
6444
6445 if (!skb_queue_empty(&chan->tx_q))
6446 chan->tx_send_head = skb_peek(&chan->tx_q);
6447 else
6448 chan->tx_send_head = NULL;
6449
6450 /* Rewind next_tx_seq to the point expected
6451 * by the receiver.
6452 */
6453 chan->next_tx_seq = control->reqseq;
6454 chan->unacked_frames = 0;
6455
6456 if (chan->hs_hcon)
6457 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6458 else
6459 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6460
6461 err = l2cap_resegment(chan);
6462
6463 if (!err)
6464 err = l2cap_rx_state_recv(chan, control, skb, event);
6465
6466 return err;
6467}
6468
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006469static bool __valid_reqseq(struct l2cap_chan *chan, u16 reqseq)
6470{
6471 /* Make sure reqseq is for a packet that has been sent but not acked */
6472 u16 unacked;
6473
6474 unacked = __seq_offset(chan, chan->next_tx_seq, chan->expected_ack_seq);
6475 return __seq_offset(chan, chan->next_tx_seq, reqseq) <= unacked;
6476}
6477
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006478static int l2cap_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6479 struct sk_buff *skb, u8 event)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006480{
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006481 int err = 0;
6482
6483 BT_DBG("chan %p, control %p, skb %p, event %d, state %d", chan,
6484 control, skb, event, chan->rx_state);
6485
6486 if (__valid_reqseq(chan, control->reqseq)) {
6487 switch (chan->rx_state) {
6488 case L2CAP_RX_STATE_RECV:
6489 err = l2cap_rx_state_recv(chan, control, skb, event);
6490 break;
6491 case L2CAP_RX_STATE_SREJ_SENT:
6492 err = l2cap_rx_state_srej_sent(chan, control, skb,
6493 event);
6494 break;
Mat Martineau32b32732012-10-23 15:24:11 -07006495 case L2CAP_RX_STATE_WAIT_P:
6496 err = l2cap_rx_state_wait_p(chan, control, skb, event);
6497 break;
6498 case L2CAP_RX_STATE_WAIT_F:
6499 err = l2cap_rx_state_wait_f(chan, control, skb, event);
6500 break;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006501 default:
6502 /* shut it down */
6503 break;
6504 }
6505 } else {
6506 BT_DBG("Invalid reqseq %d (next_tx_seq %d, expected_ack_seq %d",
6507 control->reqseq, chan->next_tx_seq,
6508 chan->expected_ack_seq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006509 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006510 }
6511
6512 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006513}
6514
6515static int l2cap_stream_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6516 struct sk_buff *skb)
6517{
Mat Martineau4b51dae92012-05-17 20:53:37 -07006518 int err = 0;
6519
6520 BT_DBG("chan %p, control %p, skb %p, state %d", chan, control, skb,
6521 chan->rx_state);
6522
6523 if (l2cap_classify_txseq(chan, control->txseq) ==
6524 L2CAP_TXSEQ_EXPECTED) {
6525 l2cap_pass_to_tx(chan, control);
6526
6527 BT_DBG("buffer_seq %d->%d", chan->buffer_seq,
6528 __next_seq(chan, chan->buffer_seq));
6529
6530 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
6531
6532 l2cap_reassemble_sdu(chan, skb, control);
6533 } else {
6534 if (chan->sdu) {
6535 kfree_skb(chan->sdu);
6536 chan->sdu = NULL;
6537 }
6538 chan->sdu_last_frag = NULL;
6539 chan->sdu_len = 0;
6540
6541 if (skb) {
6542 BT_DBG("Freeing %p", skb);
6543 kfree_skb(skb);
6544 }
6545 }
6546
6547 chan->last_acked_seq = control->txseq;
6548 chan->expected_tx_seq = __next_seq(chan, control->txseq);
6549
6550 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006551}
6552
6553static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6554{
6555 struct l2cap_ctrl *control = &bt_cb(skb)->control;
6556 u16 len;
6557 u8 event;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006558
Mat Martineaub76bbd62012-04-11 10:48:43 -07006559 __unpack_control(chan, skb);
6560
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006561 len = skb->len;
6562
6563 /*
6564 * We can just drop the corrupted I-frame here.
6565 * Receiver will miss it and start proper recovery
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006566 * procedures and ask for retransmission.
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006567 */
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006568 if (l2cap_check_fcs(chan, skb))
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006569 goto drop;
6570
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006571 if (!control->sframe && control->sar == L2CAP_SAR_START)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006572 len -= L2CAP_SDULEN_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006573
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006574 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006575 len -= L2CAP_FCS_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006576
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006577 if (len > chan->mps) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006578 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006579 goto drop;
6580 }
6581
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006582 if (!control->sframe) {
6583 int err;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006584
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006585 BT_DBG("iframe sar %d, reqseq %d, final %d, txseq %d",
6586 control->sar, control->reqseq, control->final,
6587 control->txseq);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03006588
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006589 /* Validate F-bit - F=0 always valid, F=1 only
6590 * valid in TX WAIT_F
6591 */
6592 if (control->final && chan->tx_state != L2CAP_TX_STATE_WAIT_F)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006593 goto drop;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006594
6595 if (chan->mode != L2CAP_MODE_STREAMING) {
6596 event = L2CAP_EV_RECV_IFRAME;
6597 err = l2cap_rx(chan, control, skb, event);
6598 } else {
6599 err = l2cap_stream_rx(chan, control, skb);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006600 }
6601
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006602 if (err)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006603 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006604 } else {
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006605 const u8 rx_func_to_event[4] = {
6606 L2CAP_EV_RECV_RR, L2CAP_EV_RECV_REJ,
6607 L2CAP_EV_RECV_RNR, L2CAP_EV_RECV_SREJ
6608 };
6609
6610 /* Only I-frames are expected in streaming mode */
6611 if (chan->mode == L2CAP_MODE_STREAMING)
6612 goto drop;
6613
6614 BT_DBG("sframe reqseq %d, final %d, poll %d, super %d",
6615 control->reqseq, control->final, control->poll,
6616 control->super);
6617
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006618 if (len != 0) {
Andrei Emeltchenko1bb166e2012-11-20 17:16:21 +02006619 BT_ERR("Trailing bytes: %d in sframe", len);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006620 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006621 goto drop;
6622 }
6623
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006624 /* Validate F and P bits */
6625 if (control->final && (control->poll ||
6626 chan->tx_state != L2CAP_TX_STATE_WAIT_F))
6627 goto drop;
6628
6629 event = rx_func_to_event[control->super];
6630 if (l2cap_rx(chan, control, skb, event))
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006631 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006632 }
6633
6634 return 0;
6635
6636drop:
6637 kfree_skb(skb);
6638 return 0;
6639}
6640
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006641static void l2cap_chan_le_send_credits(struct l2cap_chan *chan)
6642{
6643 struct l2cap_conn *conn = chan->conn;
6644 struct l2cap_le_credits pkt;
6645 u16 return_credits;
6646
6647 /* We return more credits to the sender only after the amount of
6648 * credits falls below half of the initial amount.
6649 */
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02006650 if (chan->rx_credits >= (le_max_credits + 1) / 2)
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006651 return;
6652
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02006653 return_credits = le_max_credits - chan->rx_credits;
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006654
6655 BT_DBG("chan %p returning %u credits to sender", chan, return_credits);
6656
6657 chan->rx_credits += return_credits;
6658
6659 pkt.cid = cpu_to_le16(chan->scid);
6660 pkt.credits = cpu_to_le16(return_credits);
6661
6662 chan->ident = l2cap_get_ident(conn);
6663
6664 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CREDITS, sizeof(pkt), &pkt);
6665}
6666
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006667static int l2cap_le_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6668{
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006669 int err;
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006670
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006671 if (!chan->rx_credits) {
6672 BT_ERR("No credits to receive LE L2CAP data");
Johan Hedbergdfd97742014-01-27 15:11:34 -08006673 l2cap_send_disconn_req(chan, ECONNRESET);
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006674 return -ENOBUFS;
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006675 }
6676
6677 if (chan->imtu < skb->len) {
6678 BT_ERR("Too big LE L2CAP PDU");
6679 return -ENOBUFS;
6680 }
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006681
6682 chan->rx_credits--;
6683 BT_DBG("rx_credits %u -> %u", chan->rx_credits + 1, chan->rx_credits);
6684
6685 l2cap_chan_le_send_credits(chan);
6686
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006687 err = 0;
6688
6689 if (!chan->sdu) {
6690 u16 sdu_len;
6691
6692 sdu_len = get_unaligned_le16(skb->data);
6693 skb_pull(skb, L2CAP_SDULEN_SIZE);
6694
6695 BT_DBG("Start of new SDU. sdu_len %u skb->len %u imtu %u",
6696 sdu_len, skb->len, chan->imtu);
6697
6698 if (sdu_len > chan->imtu) {
6699 BT_ERR("Too big LE L2CAP SDU length received");
6700 err = -EMSGSIZE;
6701 goto failed;
6702 }
6703
6704 if (skb->len > sdu_len) {
6705 BT_ERR("Too much LE L2CAP data received");
6706 err = -EINVAL;
6707 goto failed;
6708 }
6709
6710 if (skb->len == sdu_len)
6711 return chan->ops->recv(chan, skb);
6712
6713 chan->sdu = skb;
6714 chan->sdu_len = sdu_len;
6715 chan->sdu_last_frag = skb;
6716
6717 return 0;
6718 }
6719
6720 BT_DBG("SDU fragment. chan->sdu->len %u skb->len %u chan->sdu_len %u",
6721 chan->sdu->len, skb->len, chan->sdu_len);
6722
6723 if (chan->sdu->len + skb->len > chan->sdu_len) {
6724 BT_ERR("Too much LE L2CAP data received");
6725 err = -EINVAL;
6726 goto failed;
6727 }
6728
6729 append_skb_frag(chan->sdu, skb, &chan->sdu_last_frag);
6730 skb = NULL;
6731
6732 if (chan->sdu->len == chan->sdu_len) {
6733 err = chan->ops->recv(chan, chan->sdu);
6734 if (!err) {
6735 chan->sdu = NULL;
6736 chan->sdu_last_frag = NULL;
6737 chan->sdu_len = 0;
6738 }
6739 }
6740
6741failed:
6742 if (err) {
6743 kfree_skb(skb);
6744 kfree_skb(chan->sdu);
6745 chan->sdu = NULL;
6746 chan->sdu_last_frag = NULL;
6747 chan->sdu_len = 0;
6748 }
6749
6750 /* We can't return an error here since we took care of the skb
6751 * freeing internally. An error return would cause the caller to
6752 * do a double-free of the skb.
6753 */
6754 return 0;
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006755}
6756
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006757static void l2cap_data_channel(struct l2cap_conn *conn, u16 cid,
6758 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006759{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006760 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006761
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03006762 chan = l2cap_get_chan_by_scid(conn, cid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006763 if (!chan) {
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006764 if (cid == L2CAP_CID_A2MP) {
6765 chan = a2mp_channel_create(conn, skb);
6766 if (!chan) {
6767 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006768 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006769 }
6770
6771 l2cap_chan_lock(chan);
6772 } else {
6773 BT_DBG("unknown cid 0x%4.4x", cid);
6774 /* Drop packet and return */
6775 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006776 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006777 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006778 }
6779
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03006780 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006781
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03006782 if (chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006783 goto drop;
6784
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006785 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03006786 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006787 if (l2cap_le_data_rcv(chan, skb) < 0)
6788 goto drop;
6789
6790 goto done;
6791
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006792 case L2CAP_MODE_BASIC:
6793 /* If socket recv buffers overflows we drop data here
6794 * which is *bad* because L2CAP has to be reliable.
6795 * But we don't have any other choice. L2CAP doesn't
6796 * provide flow control mechanism. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07006797
Szymon Janc2c96e032014-02-18 20:48:34 +01006798 if (chan->imtu < skb->len) {
6799 BT_ERR("Dropping L2CAP data: receive buffer overflow");
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006800 goto drop;
Szymon Janc2c96e032014-02-18 20:48:34 +01006801 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006802
Gustavo Padovan80b98022012-05-27 22:27:51 -03006803 if (!chan->ops->recv(chan, skb))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006804 goto done;
6805 break;
6806
6807 case L2CAP_MODE_ERTM:
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006808 case L2CAP_MODE_STREAMING:
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006809 l2cap_data_rcv(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006810 goto done;
6811
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006812 default:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006813 BT_DBG("chan %p: bad mode 0x%2.2x", chan, chan->mode);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006814 break;
6815 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006816
6817drop:
6818 kfree_skb(skb);
6819
6820done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006821 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006822}
6823
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006824static void l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm,
6825 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006826{
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006827 struct hci_conn *hcon = conn->hcon;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006828 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006829
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006830 if (hcon->type != ACL_LINK)
6831 goto drop;
6832
Johan Hedbergbf20fd42013-05-14 13:23:13 +03006833 chan = l2cap_global_chan_by_psm(0, psm, &hcon->src, &hcon->dst,
6834 ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006835 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006836 goto drop;
6837
Andrei Emeltchenko5b4ceda2012-02-24 16:35:32 +02006838 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006839
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03006840 if (chan->state != BT_BOUND && chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006841 goto drop;
6842
Vinicius Costa Gomese13e21d2011-06-17 22:46:27 -03006843 if (chan->imtu < skb->len)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006844 goto drop;
6845
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006846 /* Store remote BD_ADDR and PSM for msg_name */
Marcel Holtmann06ae3312013-10-18 03:43:00 -07006847 bacpy(&bt_cb(skb)->bdaddr, &hcon->dst);
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006848 bt_cb(skb)->psm = psm;
6849
Gustavo Padovan80b98022012-05-27 22:27:51 -03006850 if (!chan->ops->recv(chan, skb))
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006851 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006852
6853drop:
6854 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006855}
6856
Marcel Holtmann72f78352013-04-23 00:59:00 -07006857static void l2cap_att_channel(struct l2cap_conn *conn,
Andrei Emeltchenko6810fca2012-05-31 11:18:57 +03006858 struct sk_buff *skb)
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006859{
Marcel Holtmannb99707d2013-10-03 02:54:11 -07006860 struct hci_conn *hcon = conn->hcon;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006861 struct l2cap_chan *chan;
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006862
Marcel Holtmannb99707d2013-10-03 02:54:11 -07006863 if (hcon->type != LE_LINK)
6864 goto drop;
6865
Johan Hedbergaf1c0132013-04-29 19:35:42 +03006866 chan = l2cap_global_chan_by_scid(BT_CONNECTED, L2CAP_CID_ATT,
Marcel Holtmann06ae3312013-10-18 03:43:00 -07006867 &hcon->src, &hcon->dst);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006868 if (!chan)
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006869 goto drop;
6870
Andrei Emeltchenko5b4ceda2012-02-24 16:35:32 +02006871 BT_DBG("chan %p, len %d", chan, skb->len);
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006872
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07006873 if (hci_blacklist_lookup(hcon->hdev, &hcon->dst, hcon->dst_type))
6874 goto drop;
6875
Vinicius Costa Gomese13e21d2011-06-17 22:46:27 -03006876 if (chan->imtu < skb->len)
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006877 goto drop;
6878
Gustavo Padovan80b98022012-05-27 22:27:51 -03006879 if (!chan->ops->recv(chan, skb))
Andrei Emeltchenko6810fca2012-05-31 11:18:57 +03006880 return;
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006881
6882drop:
6883 kfree_skb(skb);
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006884}
6885
Linus Torvalds1da177e2005-04-16 15:20:36 -07006886static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb)
6887{
6888 struct l2cap_hdr *lh = (void *) skb->data;
Johan Hedberg61a939c2014-01-17 20:45:11 +02006889 struct hci_conn *hcon = conn->hcon;
Al Viro8e036fc2007-07-29 00:16:36 -07006890 u16 cid, len;
6891 __le16 psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006892
Johan Hedberg61a939c2014-01-17 20:45:11 +02006893 if (hcon->state != BT_CONNECTED) {
6894 BT_DBG("queueing pending rx skb");
6895 skb_queue_tail(&conn->pending_rx, skb);
6896 return;
6897 }
6898
Linus Torvalds1da177e2005-04-16 15:20:36 -07006899 skb_pull(skb, L2CAP_HDR_SIZE);
6900 cid = __le16_to_cpu(lh->cid);
6901 len = __le16_to_cpu(lh->len);
6902
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006903 if (len != skb->len) {
6904 kfree_skb(skb);
6905 return;
6906 }
6907
Linus Torvalds1da177e2005-04-16 15:20:36 -07006908 BT_DBG("len %d, cid 0x%4.4x", len, cid);
6909
6910 switch (cid) {
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006911 case L2CAP_CID_SIGNALING:
Linus Torvalds1da177e2005-04-16 15:20:36 -07006912 l2cap_sig_channel(conn, skb);
6913 break;
6914
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006915 case L2CAP_CID_CONN_LESS:
Andrei Emeltchenko097db762012-03-09 14:16:17 +02006916 psm = get_unaligned((__le16 *) skb->data);
Andrei Emeltchenko0181a702012-05-29 10:04:05 +03006917 skb_pull(skb, L2CAP_PSMLEN_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006918 l2cap_conless_channel(conn, psm, skb);
6919 break;
6920
Johan Hedberg073d1cf2013-04-29 19:35:35 +03006921 case L2CAP_CID_ATT:
Marcel Holtmann72f78352013-04-23 00:59:00 -07006922 l2cap_att_channel(conn, skb);
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006923 break;
6924
Marcel Holtmanna2877622013-10-02 23:46:54 -07006925 case L2CAP_CID_LE_SIGNALING:
6926 l2cap_le_sig_channel(conn, skb);
6927 break;
6928
Anderson Brigliab501d6a2011-06-07 18:46:31 -03006929 case L2CAP_CID_SMP:
6930 if (smp_sig_channel(conn, skb))
6931 l2cap_conn_del(conn->hcon, EACCES);
6932 break;
6933
Jukka Rissanen18722c22013-12-11 17:05:37 +02006934 case L2CAP_FC_6LOWPAN:
6935 bt_6lowpan_recv(conn, skb);
6936 break;
6937
Linus Torvalds1da177e2005-04-16 15:20:36 -07006938 default:
6939 l2cap_data_channel(conn, cid, skb);
6940 break;
6941 }
6942}
6943
Johan Hedberg61a939c2014-01-17 20:45:11 +02006944static void process_pending_rx(struct work_struct *work)
6945{
6946 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
6947 pending_rx_work);
6948 struct sk_buff *skb;
6949
6950 BT_DBG("");
6951
6952 while ((skb = skb_dequeue(&conn->pending_rx)))
6953 l2cap_recv_frame(conn, skb);
6954}
6955
Johan Hedberg162b49e2014-01-17 20:45:10 +02006956static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon)
6957{
6958 struct l2cap_conn *conn = hcon->l2cap_data;
6959 struct hci_chan *hchan;
6960
6961 if (conn)
6962 return conn;
6963
6964 hchan = hci_chan_create(hcon);
6965 if (!hchan)
6966 return NULL;
6967
6968 conn = kzalloc(sizeof(struct l2cap_conn), GFP_KERNEL);
6969 if (!conn) {
6970 hci_chan_del(hchan);
6971 return NULL;
6972 }
6973
6974 kref_init(&conn->ref);
6975 hcon->l2cap_data = conn;
6976 conn->hcon = hcon;
6977 hci_conn_get(conn->hcon);
6978 conn->hchan = hchan;
6979
6980 BT_DBG("hcon %p conn %p hchan %p", hcon, conn, hchan);
6981
6982 switch (hcon->type) {
6983 case LE_LINK:
6984 if (hcon->hdev->le_mtu) {
6985 conn->mtu = hcon->hdev->le_mtu;
6986 break;
6987 }
6988 /* fall through */
6989 default:
6990 conn->mtu = hcon->hdev->acl_mtu;
6991 break;
6992 }
6993
6994 conn->feat_mask = 0;
6995
6996 if (hcon->type == ACL_LINK)
6997 conn->hs_enabled = test_bit(HCI_HS_ENABLED,
6998 &hcon->hdev->dev_flags);
6999
7000 spin_lock_init(&conn->lock);
7001 mutex_init(&conn->chan_lock);
7002
7003 INIT_LIST_HEAD(&conn->chan_l);
7004 INIT_LIST_HEAD(&conn->users);
7005
7006 if (hcon->type == LE_LINK)
7007 INIT_DELAYED_WORK(&conn->security_timer, security_timeout);
7008 else
7009 INIT_DELAYED_WORK(&conn->info_timer, l2cap_info_timeout);
7010
Johan Hedberg61a939c2014-01-17 20:45:11 +02007011 skb_queue_head_init(&conn->pending_rx);
7012 INIT_WORK(&conn->pending_rx_work, process_pending_rx);
7013
Johan Hedberg162b49e2014-01-17 20:45:10 +02007014 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
7015
7016 return conn;
7017}
7018
7019static bool is_valid_psm(u16 psm, u8 dst_type) {
7020 if (!psm)
7021 return false;
7022
7023 if (bdaddr_type_is_le(dst_type))
7024 return (psm <= 0x00ff);
7025
7026 /* PSM must be odd and lsb of upper byte must be 0 */
7027 return ((psm & 0x0101) == 0x0001);
7028}
7029
7030int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
7031 bdaddr_t *dst, u8 dst_type)
7032{
7033 struct l2cap_conn *conn;
7034 struct hci_conn *hcon;
7035 struct hci_dev *hdev;
7036 __u8 auth_type;
7037 int err;
7038
7039 BT_DBG("%pMR -> %pMR (type %u) psm 0x%2.2x", &chan->src, dst,
7040 dst_type, __le16_to_cpu(psm));
7041
7042 hdev = hci_get_route(dst, &chan->src);
7043 if (!hdev)
7044 return -EHOSTUNREACH;
7045
7046 hci_dev_lock(hdev);
7047
7048 l2cap_chan_lock(chan);
7049
7050 if (!is_valid_psm(__le16_to_cpu(psm), dst_type) && !cid &&
7051 chan->chan_type != L2CAP_CHAN_RAW) {
7052 err = -EINVAL;
7053 goto done;
7054 }
7055
Johan Hedberg21626e62014-01-24 10:35:41 +02007056 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED && !psm) {
7057 err = -EINVAL;
7058 goto done;
7059 }
7060
7061 if (chan->chan_type == L2CAP_CHAN_FIXED && !cid) {
Johan Hedberg162b49e2014-01-17 20:45:10 +02007062 err = -EINVAL;
7063 goto done;
7064 }
7065
7066 switch (chan->mode) {
7067 case L2CAP_MODE_BASIC:
7068 break;
7069 case L2CAP_MODE_LE_FLOWCTL:
7070 l2cap_le_flowctl_init(chan);
7071 break;
7072 case L2CAP_MODE_ERTM:
7073 case L2CAP_MODE_STREAMING:
7074 if (!disable_ertm)
7075 break;
7076 /* fall through */
7077 default:
7078 err = -ENOTSUPP;
7079 goto done;
7080 }
7081
7082 switch (chan->state) {
7083 case BT_CONNECT:
7084 case BT_CONNECT2:
7085 case BT_CONFIG:
7086 /* Already connecting */
7087 err = 0;
7088 goto done;
7089
7090 case BT_CONNECTED:
7091 /* Already connected */
7092 err = -EISCONN;
7093 goto done;
7094
7095 case BT_OPEN:
7096 case BT_BOUND:
7097 /* Can connect */
7098 break;
7099
7100 default:
7101 err = -EBADFD;
7102 goto done;
7103 }
7104
7105 /* Set destination address and psm */
7106 bacpy(&chan->dst, dst);
7107 chan->dst_type = dst_type;
7108
7109 chan->psm = psm;
7110 chan->dcid = cid;
7111
7112 auth_type = l2cap_get_auth_type(chan);
7113
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007114 if (bdaddr_type_is_le(dst_type)) {
7115 /* Convert from L2CAP channel address type to HCI address type
7116 */
7117 if (dst_type == BDADDR_LE_PUBLIC)
7118 dst_type = ADDR_LE_DEV_PUBLIC;
7119 else
7120 dst_type = ADDR_LE_DEV_RANDOM;
7121
Andre Guedes04a6c582014-02-26 20:21:44 -03007122 hcon = hci_connect_le(hdev, dst, dst_type, chan->sec_level,
7123 auth_type);
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007124 } else {
Andre Guedes04a6c582014-02-26 20:21:44 -03007125 hcon = hci_connect_acl(hdev, dst, chan->sec_level, auth_type);
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007126 }
Johan Hedberg162b49e2014-01-17 20:45:10 +02007127
7128 if (IS_ERR(hcon)) {
7129 err = PTR_ERR(hcon);
7130 goto done;
7131 }
7132
7133 conn = l2cap_conn_add(hcon);
7134 if (!conn) {
7135 hci_conn_drop(hcon);
7136 err = -ENOMEM;
7137 goto done;
7138 }
7139
7140 if (cid && __l2cap_get_chan_by_dcid(conn, cid)) {
7141 hci_conn_drop(hcon);
7142 err = -EBUSY;
7143 goto done;
7144 }
7145
7146 /* Update source addr of the socket */
7147 bacpy(&chan->src, &hcon->src);
7148 chan->src_type = bdaddr_type(hcon, hcon->src_type);
7149
7150 l2cap_chan_unlock(chan);
7151 l2cap_chan_add(conn, chan);
7152 l2cap_chan_lock(chan);
7153
7154 /* l2cap_chan_add takes its own ref so we can drop this one */
7155 hci_conn_drop(hcon);
7156
7157 l2cap_state_change(chan, BT_CONNECT);
7158 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
7159
Johan Hedberg61202e42014-01-28 15:16:48 -08007160 /* Release chan->sport so that it can be reused by other
7161 * sockets (as it's only used for listening sockets).
7162 */
7163 write_lock(&chan_list_lock);
7164 chan->sport = 0;
7165 write_unlock(&chan_list_lock);
7166
Johan Hedberg162b49e2014-01-17 20:45:10 +02007167 if (hcon->state == BT_CONNECTED) {
7168 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
7169 __clear_chan_timer(chan);
7170 if (l2cap_chan_check_security(chan))
7171 l2cap_state_change(chan, BT_CONNECTED);
7172 } else
7173 l2cap_do_start(chan);
7174 }
7175
7176 err = 0;
7177
7178done:
7179 l2cap_chan_unlock(chan);
7180 hci_dev_unlock(hdev);
7181 hci_dev_put(hdev);
7182 return err;
7183}
7184
Linus Torvalds1da177e2005-04-16 15:20:36 -07007185/* ---- L2CAP interface with lower layer (HCI) ---- */
7186
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007187int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007188{
7189 int exact = 0, lm1 = 0, lm2 = 0;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007190 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007191
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03007192 BT_DBG("hdev %s, bdaddr %pMR", hdev->name, bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007193
7194 /* Find listening sockets and check their link_mode */
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007195 read_lock(&chan_list_lock);
7196 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007197 if (c->state != BT_LISTEN)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007198 continue;
7199
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007200 if (!bacmp(&c->src, &hdev->bdaddr)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007201 lm1 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03007202 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007203 lm1 |= HCI_LM_MASTER;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007204 exact++;
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007205 } else if (!bacmp(&c->src, BDADDR_ANY)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007206 lm2 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03007207 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007208 lm2 |= HCI_LM_MASTER;
7209 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007210 }
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007211 read_unlock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007212
7213 return exact ? lm1 : lm2;
7214}
7215
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03007216void l2cap_connect_cfm(struct hci_conn *hcon, u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007217{
Marcel Holtmann01394182006-07-03 10:02:46 +02007218 struct l2cap_conn *conn;
7219
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03007220 BT_DBG("hcon %p bdaddr %pMR status %d", hcon, &hcon->dst, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007221
Linus Torvalds1da177e2005-04-16 15:20:36 -07007222 if (!status) {
Claudio Takahasibaf43252013-04-11 13:55:50 -03007223 conn = l2cap_conn_add(hcon);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007224 if (conn)
7225 l2cap_conn_ready(conn);
Andrei Emeltchenkoba6fc312012-10-31 15:46:26 +02007226 } else {
Joe Perchese1750722011-06-29 18:18:29 -07007227 l2cap_conn_del(hcon, bt_to_errno(status));
Andrei Emeltchenkoba6fc312012-10-31 15:46:26 +02007228 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007229}
7230
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007231int l2cap_disconn_ind(struct hci_conn *hcon)
Marcel Holtmann2950f212009-02-12 14:02:50 +01007232{
7233 struct l2cap_conn *conn = hcon->l2cap_data;
7234
7235 BT_DBG("hcon %p", hcon);
7236
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007237 if (!conn)
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02007238 return HCI_ERROR_REMOTE_USER_TERM;
Marcel Holtmann2950f212009-02-12 14:02:50 +01007239 return conn->disc_reason;
7240}
7241
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03007242void l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007243{
7244 BT_DBG("hcon %p reason %d", hcon, reason);
7245
Jukka Rissanen18722c22013-12-11 17:05:37 +02007246 bt_6lowpan_del_conn(hcon->l2cap_data);
7247
Joe Perchese1750722011-06-29 18:18:29 -07007248 l2cap_conn_del(hcon, bt_to_errno(reason));
Linus Torvalds1da177e2005-04-16 15:20:36 -07007249}
7250
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007251static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt)
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007252{
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03007253 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED)
Marcel Holtmann255c7602009-02-04 21:07:19 +01007254 return;
7255
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007256 if (encrypt == 0x00) {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007257 if (chan->sec_level == BT_SECURITY_MEDIUM) {
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007258 __set_chan_timer(chan, L2CAP_ENC_TIMEOUT);
Marcel Holtmann7d513e92014-01-15 22:37:40 -08007259 } else if (chan->sec_level == BT_SECURITY_HIGH ||
7260 chan->sec_level == BT_SECURITY_FIPS)
Gustavo F. Padovan0f852722011-05-04 19:42:50 -03007261 l2cap_chan_close(chan, ECONNREFUSED);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007262 } else {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007263 if (chan->sec_level == BT_SECURITY_MEDIUM)
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -03007264 __clear_chan_timer(chan);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007265 }
7266}
7267
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007268int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007269{
Marcel Holtmann40be4922008-07-14 20:13:50 +02007270 struct l2cap_conn *conn = hcon->l2cap_data;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03007271 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007272
Marcel Holtmann01394182006-07-03 10:02:46 +02007273 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007274 return 0;
Marcel Holtmann01394182006-07-03 10:02:46 +02007275
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03007276 BT_DBG("conn %p status 0x%2.2x encrypt %u", conn, status, encrypt);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007277
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03007278 if (hcon->type == LE_LINK) {
Hemant Gupta35d4adcc2012-04-18 14:46:26 +05307279 if (!status && encrypt)
Johan Hedberg4bd6d382014-02-26 23:33:45 +02007280 smp_distribute_keys(conn);
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02007281 cancel_delayed_work(&conn->security_timer);
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03007282 }
7283
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007284 mutex_lock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007285
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007286 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007287 l2cap_chan_lock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007288
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03007289 BT_DBG("chan %p scid 0x%4.4x state %s", chan, chan->scid,
7290 state_to_string(chan->state));
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007291
Johan Hedberg2338a7e2014-01-24 10:35:40 +02007292 if (chan->scid == L2CAP_CID_A2MP) {
Andrei Emeltchenko78eb2f92012-07-19 17:03:47 +03007293 l2cap_chan_unlock(chan);
7294 continue;
7295 }
7296
Johan Hedberg073d1cf2013-04-29 19:35:35 +03007297 if (chan->scid == L2CAP_CID_ATT) {
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007298 if (!status && encrypt) {
7299 chan->sec_level = hcon->sec_level;
Andrei Emeltchenkocf4cd002012-02-06 15:03:59 +02007300 l2cap_chan_ready(chan);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007301 }
7302
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007303 l2cap_chan_unlock(chan);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007304 continue;
7305 }
7306
Andrei Emeltchenko96eff462012-11-15 18:14:53 +02007307 if (!__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007308 l2cap_chan_unlock(chan);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01007309 continue;
7310 }
7311
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007312 if (!status && (chan->state == BT_CONNECTED ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01007313 chan->state == BT_CONFIG)) {
Marcel Holtmannd97c8992013-10-14 02:53:54 -07007314 chan->ops->resume(chan);
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007315 l2cap_check_encryption(chan, encrypt);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007316 l2cap_chan_unlock(chan);
Marcel Holtmann9719f8a2008-07-14 20:13:45 +02007317 continue;
7318 }
7319
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007320 if (chan->state == BT_CONNECT) {
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007321 if (!status)
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03007322 l2cap_start_connection(chan);
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007323 else
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007324 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007325 } else if (chan->state == BT_CONNECT2) {
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007326 struct l2cap_conn_rsp rsp;
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007327 __u16 res, stat;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007328
7329 if (!status) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07007330 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007331 res = L2CAP_CR_PEND;
7332 stat = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08007333 chan->ops->defer(chan);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007334 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007335 l2cap_state_change(chan, BT_CONFIG);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007336 res = L2CAP_CR_SUCCESS;
7337 stat = L2CAP_CS_NO_INFO;
7338 }
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007339 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007340 l2cap_state_change(chan, BT_DISCONN);
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007341 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007342 res = L2CAP_CR_SEC_BLOCK;
7343 stat = L2CAP_CS_NO_INFO;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007344 }
7345
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03007346 rsp.scid = cpu_to_le16(chan->dcid);
7347 rsp.dcid = cpu_to_le16(chan->scid);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007348 rsp.result = cpu_to_le16(res);
7349 rsp.status = cpu_to_le16(stat);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03007350 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01007351 sizeof(rsp), &rsp);
Mat Martineau2d369352012-05-23 14:59:30 -07007352
7353 if (!test_bit(CONF_REQ_SENT, &chan->conf_state) &&
7354 res == L2CAP_CR_SUCCESS) {
7355 char buf[128];
7356 set_bit(CONF_REQ_SENT, &chan->conf_state);
7357 l2cap_send_cmd(conn, l2cap_get_ident(conn),
7358 L2CAP_CONF_REQ,
7359 l2cap_build_conf_req(chan, buf),
7360 buf);
7361 chan->num_conf_req++;
7362 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007363 }
7364
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007365 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007366 }
7367
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007368 mutex_unlock(&conn->chan_lock);
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007369
Linus Torvalds1da177e2005-04-16 15:20:36 -07007370 return 0;
7371}
7372
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007373int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007374{
7375 struct l2cap_conn *conn = hcon->l2cap_data;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007376 struct l2cap_hdr *hdr;
7377 int len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007378
Andrei Emeltchenko1d13a252012-10-15 11:58:41 +03007379 /* For AMP controller do not create l2cap conn */
7380 if (!conn && hcon->hdev->dev_type != HCI_BREDR)
7381 goto drop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007382
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007383 if (!conn)
Claudio Takahasibaf43252013-04-11 13:55:50 -03007384 conn = l2cap_conn_add(hcon);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007385
7386 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007387 goto drop;
7388
7389 BT_DBG("conn %p len %d flags 0x%x", conn, skb->len, flags);
7390
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007391 switch (flags) {
7392 case ACL_START:
7393 case ACL_START_NO_FLUSH:
7394 case ACL_COMPLETE:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007395 if (conn->rx_len) {
7396 BT_ERR("Unexpected start frame (len %d)", skb->len);
7397 kfree_skb(conn->rx_skb);
7398 conn->rx_skb = NULL;
7399 conn->rx_len = 0;
7400 l2cap_conn_unreliable(conn, ECOMM);
7401 }
7402
Andrei Emeltchenkoaae7fe22010-09-15 14:28:43 +03007403 /* Start fragment always begin with Basic L2CAP header */
7404 if (skb->len < L2CAP_HDR_SIZE) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07007405 BT_ERR("Frame is too short (len %d)", skb->len);
7406 l2cap_conn_unreliable(conn, ECOMM);
7407 goto drop;
7408 }
7409
7410 hdr = (struct l2cap_hdr *) skb->data;
7411 len = __le16_to_cpu(hdr->len) + L2CAP_HDR_SIZE;
7412
7413 if (len == skb->len) {
7414 /* Complete frame received */
7415 l2cap_recv_frame(conn, skb);
7416 return 0;
7417 }
7418
7419 BT_DBG("Start: total len %d, frag len %d", len, skb->len);
7420
7421 if (skb->len > len) {
7422 BT_ERR("Frame is too long (len %d, expected len %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007423 skb->len, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007424 l2cap_conn_unreliable(conn, ECOMM);
7425 goto drop;
7426 }
7427
7428 /* Allocate skb for the complete frame (with header) */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03007429 conn->rx_skb = bt_skb_alloc(len, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03007430 if (!conn->rx_skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007431 goto drop;
7432
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007433 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007434 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007435 conn->rx_len = len - skb->len;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007436 break;
7437
7438 case ACL_CONT:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007439 BT_DBG("Cont: frag len %d (expecting %d)", skb->len, conn->rx_len);
7440
7441 if (!conn->rx_len) {
7442 BT_ERR("Unexpected continuation frame (len %d)", skb->len);
7443 l2cap_conn_unreliable(conn, ECOMM);
7444 goto drop;
7445 }
7446
7447 if (skb->len > conn->rx_len) {
7448 BT_ERR("Fragment is too long (len %d, expected %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007449 skb->len, conn->rx_len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007450 kfree_skb(conn->rx_skb);
7451 conn->rx_skb = NULL;
7452 conn->rx_len = 0;
7453 l2cap_conn_unreliable(conn, ECOMM);
7454 goto drop;
7455 }
7456
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007457 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007458 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007459 conn->rx_len -= skb->len;
7460
7461 if (!conn->rx_len) {
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007462 /* Complete frame received. l2cap_recv_frame
7463 * takes ownership of the skb so set the global
7464 * rx_skb pointer to NULL first.
7465 */
7466 struct sk_buff *rx_skb = conn->rx_skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007467 conn->rx_skb = NULL;
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007468 l2cap_recv_frame(conn, rx_skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007469 }
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007470 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007471 }
7472
7473drop:
7474 kfree_skb(skb);
7475 return 0;
7476}
7477
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007478static int l2cap_debugfs_show(struct seq_file *f, void *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007479{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007480 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007481
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007482 read_lock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007483
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007484 list_for_each_entry(c, &chan_list, global_l) {
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03007485 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 -07007486 &c->src, &c->dst,
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03007487 c->state, __le16_to_cpu(c->psm),
7488 c->scid, c->dcid, c->imtu, c->omtu,
7489 c->sec_level, c->mode);
Andrei Emeltchenko61e1b4b2012-01-19 11:19:50 +02007490 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007491
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007492 read_unlock(&chan_list_lock);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007493
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007494 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007495}
7496
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007497static int l2cap_debugfs_open(struct inode *inode, struct file *file)
7498{
7499 return single_open(file, l2cap_debugfs_show, inode->i_private);
7500}
7501
7502static const struct file_operations l2cap_debugfs_fops = {
7503 .open = l2cap_debugfs_open,
7504 .read = seq_read,
7505 .llseek = seq_lseek,
7506 .release = single_release,
7507};
7508
7509static struct dentry *l2cap_debugfs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007510
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007511int __init l2cap_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007512{
7513 int err;
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007514
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007515 err = l2cap_init_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007516 if (err < 0)
7517 return err;
7518
Marcel Holtmann1120e4b2013-10-17 17:24:16 -07007519 if (IS_ERR_OR_NULL(bt_debugfs))
7520 return 0;
7521
7522 l2cap_debugfs = debugfs_create_file("l2cap", 0444, bt_debugfs,
7523 NULL, &l2cap_debugfs_fops);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007524
Samuel Ortiz40b93972014-05-14 17:53:35 +02007525 debugfs_create_u16("l2cap_le_max_credits", 0644, bt_debugfs,
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02007526 &le_max_credits);
Samuel Ortiz40b93972014-05-14 17:53:35 +02007527 debugfs_create_u16("l2cap_le_default_mps", 0644, bt_debugfs,
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02007528 &le_default_mps);
7529
Jukka Rissanen18722c22013-12-11 17:05:37 +02007530 bt_6lowpan_init();
7531
Linus Torvalds1da177e2005-04-16 15:20:36 -07007532 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007533}
7534
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007535void l2cap_exit(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007536{
Jukka Rissanen18722c22013-12-11 17:05:37 +02007537 bt_6lowpan_cleanup();
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007538 debugfs_remove(l2cap_debugfs);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007539 l2cap_cleanup_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007540}
7541
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03007542module_param(disable_ertm, bool, 0644);
7543MODULE_PARM_DESC(disable_ertm, "Disable enhanced retransmission mode");