blob: 746848229c8537d02137b112e514d0eaad6e30e2 [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);
1666 flush_work(&conn->pending_rx_work);
1667
David Herrmann2c8e1412013-04-06 20:28:45 +02001668 l2cap_unregister_all_users(conn);
1669
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001670 mutex_lock(&conn->chan_lock);
1671
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001672 /* Kill channels */
1673 list_for_each_entry_safe(chan, l, &conn->chan_l, list) {
Mat Martineau61d6ef32012-04-27 16:50:50 -07001674 l2cap_chan_hold(chan);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001675 l2cap_chan_lock(chan);
1676
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001677 l2cap_chan_del(chan, err);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001678
1679 l2cap_chan_unlock(chan);
1680
Gustavo Padovan80b98022012-05-27 22:27:51 -03001681 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07001682 l2cap_chan_put(chan);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001683 }
1684
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001685 mutex_unlock(&conn->chan_lock);
1686
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001687 hci_chan_del(conn->hchan);
1688
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001689 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT)
Ulisses Furquim127074b2012-01-30 18:26:29 -02001690 cancel_delayed_work_sync(&conn->info_timer);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001691
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001692 if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags)) {
Ulisses Furquim127074b2012-01-30 18:26:29 -02001693 cancel_delayed_work_sync(&conn->security_timer);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001694 smp_chan_destroy(conn);
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001695 }
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001696
1697 hcon->l2cap_data = NULL;
David Herrmann9c903e32013-04-06 20:28:44 +02001698 conn->hchan = NULL;
1699 l2cap_conn_put(conn);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001700}
1701
Gustavo F. Padovan6c9d42a2011-12-20 10:57:27 -02001702static void security_timeout(struct work_struct *work)
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001703{
Gustavo F. Padovan6c9d42a2011-12-20 10:57:27 -02001704 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001705 security_timer.work);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001706
Johan Hedbergd06cc412012-06-06 18:44:11 +08001707 BT_DBG("conn %p", conn);
1708
1709 if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags)) {
1710 smp_chan_destroy(conn);
1711 l2cap_conn_del(conn->hcon, ETIMEDOUT);
1712 }
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001713}
1714
David Herrmann9c903e32013-04-06 20:28:44 +02001715static void l2cap_conn_free(struct kref *ref)
1716{
1717 struct l2cap_conn *conn = container_of(ref, struct l2cap_conn, ref);
1718
1719 hci_conn_put(conn->hcon);
1720 kfree(conn);
1721}
1722
1723void l2cap_conn_get(struct l2cap_conn *conn)
1724{
1725 kref_get(&conn->ref);
1726}
1727EXPORT_SYMBOL(l2cap_conn_get);
1728
1729void l2cap_conn_put(struct l2cap_conn *conn)
1730{
1731 kref_put(&conn->ref, l2cap_conn_free);
1732}
1733EXPORT_SYMBOL(l2cap_conn_put);
1734
Linus Torvalds1da177e2005-04-16 15:20:36 -07001735/* ---- Socket interface ---- */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001736
Ido Yarivc2287682012-04-20 15:46:07 -03001737/* Find socket with psm and source / destination bdaddr.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001738 * Returns closest match.
1739 */
Ido Yarivc2287682012-04-20 15:46:07 -03001740static struct l2cap_chan *l2cap_global_chan_by_psm(int state, __le16 psm,
1741 bdaddr_t *src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001742 bdaddr_t *dst,
1743 u8 link_type)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001744{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001745 struct l2cap_chan *c, *c1 = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001746
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001747 read_lock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001748
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001749 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001750 if (state && c->state != state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001751 continue;
1752
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001753 if (link_type == ACL_LINK && c->src_type != BDADDR_BREDR)
1754 continue;
1755
1756 if (link_type == LE_LINK && c->src_type == BDADDR_BREDR)
1757 continue;
1758
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001759 if (c->psm == psm) {
Ido Yarivc2287682012-04-20 15:46:07 -03001760 int src_match, dst_match;
1761 int src_any, dst_any;
1762
Linus Torvalds1da177e2005-04-16 15:20:36 -07001763 /* Exact match. */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001764 src_match = !bacmp(&c->src, src);
1765 dst_match = !bacmp(&c->dst, dst);
Ido Yarivc2287682012-04-20 15:46:07 -03001766 if (src_match && dst_match) {
Johannes Berga7567b22011-06-01 08:29:54 +02001767 read_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001768 return c;
1769 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001770
1771 /* Closest match */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001772 src_any = !bacmp(&c->src, BDADDR_ANY);
1773 dst_any = !bacmp(&c->dst, BDADDR_ANY);
Ido Yarivc2287682012-04-20 15:46:07 -03001774 if ((src_match && dst_any) || (src_any && dst_match) ||
1775 (src_any && dst_any))
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001776 c1 = c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001777 }
1778 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001779
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001780 read_unlock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001781
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001782 return c1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001783}
1784
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001785static void l2cap_monitor_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001786{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001787 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001788 monitor_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001789
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03001790 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001791
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001792 l2cap_chan_lock(chan);
1793
Mat Martineau80909e02012-05-17 20:53:50 -07001794 if (!chan->conn) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001795 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001796 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001797 return;
1798 }
1799
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001800 l2cap_tx(chan, NULL, NULL, L2CAP_EV_MONITOR_TO);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001801
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001802 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001803 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001804}
1805
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001806static void l2cap_retrans_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001807{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001808 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001809 retrans_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001810
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03001811 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001812
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001813 l2cap_chan_lock(chan);
1814
Mat Martineau80909e02012-05-17 20:53:50 -07001815 if (!chan->conn) {
1816 l2cap_chan_unlock(chan);
1817 l2cap_chan_put(chan);
1818 return;
1819 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001820
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001821 l2cap_tx(chan, NULL, NULL, L2CAP_EV_RETRANS_TO);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001822 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001823 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001824}
1825
Gustavo Padovand6603662012-05-21 13:58:22 -03001826static void l2cap_streaming_send(struct l2cap_chan *chan,
1827 struct sk_buff_head *skbs)
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001828{
Gustavo F. Padovanccbb84a2010-08-30 18:44:44 -03001829 struct sk_buff *skb;
Mat Martineau37339372012-05-17 20:53:33 -07001830 struct l2cap_ctrl *control;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001831
Mat Martineau37339372012-05-17 20:53:33 -07001832 BT_DBG("chan %p, skbs %p", chan, skbs);
1833
Mat Martineaub99e13a2012-10-23 15:24:19 -07001834 if (__chan_is_moving(chan))
1835 return;
1836
Mat Martineau37339372012-05-17 20:53:33 -07001837 skb_queue_splice_tail_init(skbs, &chan->tx_q);
1838
1839 while (!skb_queue_empty(&chan->tx_q)) {
1840
1841 skb = skb_dequeue(&chan->tx_q);
1842
1843 bt_cb(skb)->control.retries = 1;
1844 control = &bt_cb(skb)->control;
1845
1846 control->reqseq = 0;
1847 control->txseq = chan->next_tx_seq;
1848
1849 __pack_control(chan, control, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001850
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001851 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau37339372012-05-17 20:53:33 -07001852 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1853 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001854 }
1855
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001856 l2cap_do_send(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001857
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001858 BT_DBG("Sent txseq %u", control->txseq);
Mat Martineau37339372012-05-17 20:53:33 -07001859
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001860 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau37339372012-05-17 20:53:33 -07001861 chan->frames_sent++;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001862 }
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001863}
1864
Szymon Janc67c9e842011-07-28 16:24:33 +02001865static int l2cap_ertm_send(struct l2cap_chan *chan)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001866{
1867 struct sk_buff *skb, *tx_skb;
Mat Martineau18a48e72012-05-17 20:53:34 -07001868 struct l2cap_ctrl *control;
1869 int sent = 0;
1870
1871 BT_DBG("chan %p", chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001872
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001873 if (chan->state != BT_CONNECTED)
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001874 return -ENOTCONN;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001875
Mat Martineau94122bb2012-05-02 09:42:02 -07001876 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1877 return 0;
1878
Mat Martineaub99e13a2012-10-23 15:24:19 -07001879 if (__chan_is_moving(chan))
1880 return 0;
1881
Mat Martineau18a48e72012-05-17 20:53:34 -07001882 while (chan->tx_send_head &&
1883 chan->unacked_frames < chan->remote_tx_win &&
1884 chan->tx_state == L2CAP_TX_STATE_XMIT) {
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001885
Mat Martineau18a48e72012-05-17 20:53:34 -07001886 skb = chan->tx_send_head;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001887
Mat Martineau18a48e72012-05-17 20:53:34 -07001888 bt_cb(skb)->control.retries = 1;
1889 control = &bt_cb(skb)->control;
Gustavo F. Padovan95ffa972010-06-18 20:37:33 -03001890
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001891 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
Mat Martineau18a48e72012-05-17 20:53:34 -07001892 control->final = 1;
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001893
Mat Martineau18a48e72012-05-17 20:53:34 -07001894 control->reqseq = chan->buffer_seq;
1895 chan->last_acked_seq = chan->buffer_seq;
1896 control->txseq = chan->next_tx_seq;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001897
Mat Martineau18a48e72012-05-17 20:53:34 -07001898 __pack_control(chan, control, skb);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001899
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001900 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau18a48e72012-05-17 20:53:34 -07001901 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1902 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001903 }
1904
Mat Martineau18a48e72012-05-17 20:53:34 -07001905 /* Clone after data has been modified. Data is assumed to be
1906 read-only (for locking purposes) on cloned sk_buffs.
1907 */
1908 tx_skb = skb_clone(skb, GFP_KERNEL);
1909
1910 if (!tx_skb)
1911 break;
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -03001912
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03001913 __set_retrans_timer(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001914
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001915 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau18a48e72012-05-17 20:53:34 -07001916 chan->unacked_frames++;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03001917 chan->frames_sent++;
Mat Martineau18a48e72012-05-17 20:53:34 -07001918 sent++;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001919
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001920 if (skb_queue_is_last(&chan->tx_q, skb))
1921 chan->tx_send_head = NULL;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001922 else
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001923 chan->tx_send_head = skb_queue_next(&chan->tx_q, skb);
Mat Martineau18a48e72012-05-17 20:53:34 -07001924
1925 l2cap_do_send(chan, tx_skb);
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001926 BT_DBG("Sent txseq %u", control->txseq);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001927 }
1928
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001929 BT_DBG("Sent %d, %u unacked, %u in ERTM queue", sent,
1930 chan->unacked_frames, skb_queue_len(&chan->tx_q));
Mat Martineau18a48e72012-05-17 20:53:34 -07001931
1932 return sent;
Gustavo F. Padovan9e917af2010-05-01 16:15:37 -03001933}
1934
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001935static void l2cap_ertm_resend(struct l2cap_chan *chan)
1936{
1937 struct l2cap_ctrl control;
1938 struct sk_buff *skb;
1939 struct sk_buff *tx_skb;
1940 u16 seq;
1941
1942 BT_DBG("chan %p", chan);
1943
1944 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1945 return;
1946
Mat Martineaub99e13a2012-10-23 15:24:19 -07001947 if (__chan_is_moving(chan))
1948 return;
1949
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001950 while (chan->retrans_list.head != L2CAP_SEQ_LIST_CLEAR) {
1951 seq = l2cap_seq_list_pop(&chan->retrans_list);
1952
1953 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, seq);
1954 if (!skb) {
1955 BT_DBG("Error: Can't retransmit seq %d, frame missing",
Gustavo Padovan2d792812012-10-06 10:07:01 +01001956 seq);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001957 continue;
1958 }
1959
1960 bt_cb(skb)->control.retries++;
1961 control = bt_cb(skb)->control;
1962
1963 if (chan->max_tx != 0 &&
1964 bt_cb(skb)->control.retries > chan->max_tx) {
1965 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001966 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001967 l2cap_seq_list_clear(&chan->retrans_list);
1968 break;
1969 }
1970
1971 control.reqseq = chan->buffer_seq;
1972 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
1973 control.final = 1;
1974 else
1975 control.final = 0;
1976
1977 if (skb_cloned(skb)) {
1978 /* Cloned sk_buffs are read-only, so we need a
1979 * writeable copy
1980 */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03001981 tx_skb = skb_copy(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001982 } else {
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03001983 tx_skb = skb_clone(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001984 }
1985
1986 if (!tx_skb) {
1987 l2cap_seq_list_clear(&chan->retrans_list);
1988 break;
1989 }
1990
1991 /* Update skb contents */
1992 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
1993 put_unaligned_le32(__pack_extended_control(&control),
1994 tx_skb->data + L2CAP_HDR_SIZE);
1995 } else {
1996 put_unaligned_le16(__pack_enhanced_control(&control),
1997 tx_skb->data + L2CAP_HDR_SIZE);
1998 }
1999
2000 if (chan->fcs == L2CAP_FCS_CRC16) {
2001 u16 fcs = crc16(0, (u8 *) tx_skb->data, tx_skb->len);
2002 put_unaligned_le16(fcs, skb_put(tx_skb,
2003 L2CAP_FCS_SIZE));
2004 }
2005
2006 l2cap_do_send(chan, tx_skb);
2007
2008 BT_DBG("Resent txseq %d", control.txseq);
2009
2010 chan->last_acked_seq = chan->buffer_seq;
2011 }
2012}
2013
Mat Martineauf80842a2012-05-17 20:53:46 -07002014static void l2cap_retransmit(struct l2cap_chan *chan,
2015 struct l2cap_ctrl *control)
2016{
2017 BT_DBG("chan %p, control %p", chan, control);
2018
2019 l2cap_seq_list_append(&chan->retrans_list, control->reqseq);
2020 l2cap_ertm_resend(chan);
2021}
2022
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002023static void l2cap_retransmit_all(struct l2cap_chan *chan,
2024 struct l2cap_ctrl *control)
2025{
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002026 struct sk_buff *skb;
2027
2028 BT_DBG("chan %p, control %p", chan, control);
2029
2030 if (control->poll)
2031 set_bit(CONN_SEND_FBIT, &chan->conn_state);
2032
2033 l2cap_seq_list_clear(&chan->retrans_list);
2034
2035 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
2036 return;
2037
2038 if (chan->unacked_frames) {
2039 skb_queue_walk(&chan->tx_q, skb) {
2040 if (bt_cb(skb)->control.txseq == control->reqseq ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01002041 skb == chan->tx_send_head)
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002042 break;
2043 }
2044
2045 skb_queue_walk_from(&chan->tx_q, skb) {
2046 if (skb == chan->tx_send_head)
2047 break;
2048
2049 l2cap_seq_list_append(&chan->retrans_list,
2050 bt_cb(skb)->control.txseq);
2051 }
2052
2053 l2cap_ertm_resend(chan);
2054 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002055}
2056
Szymon Jancb17e73b2012-01-11 10:59:47 +01002057static void l2cap_send_ack(struct l2cap_chan *chan)
2058{
Mat Martineau0a0aba42012-05-17 20:53:39 -07002059 struct l2cap_ctrl control;
2060 u16 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
2061 chan->last_acked_seq);
2062 int threshold;
2063
2064 BT_DBG("chan %p last_acked_seq %d buffer_seq %d",
2065 chan, chan->last_acked_seq, chan->buffer_seq);
2066
2067 memset(&control, 0, sizeof(control));
2068 control.sframe = 1;
2069
2070 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
2071 chan->rx_state == L2CAP_RX_STATE_RECV) {
2072 __clear_ack_timer(chan);
2073 control.super = L2CAP_SUPER_RNR;
2074 control.reqseq = chan->buffer_seq;
2075 l2cap_send_sframe(chan, &control);
2076 } else {
2077 if (!test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) {
2078 l2cap_ertm_send(chan);
2079 /* If any i-frames were sent, they included an ack */
2080 if (chan->buffer_seq == chan->last_acked_seq)
2081 frames_to_ack = 0;
2082 }
2083
Mat Martineauc20f8e32012-07-10 05:47:07 -07002084 /* Ack now if the window is 3/4ths full.
Mat Martineau0a0aba42012-05-17 20:53:39 -07002085 * Calculate without mul or div
2086 */
Mat Martineauc20f8e32012-07-10 05:47:07 -07002087 threshold = chan->ack_win;
Mat Martineau0a0aba42012-05-17 20:53:39 -07002088 threshold += threshold << 1;
2089 threshold >>= 2;
2090
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002091 BT_DBG("frames_to_ack %u, threshold %d", frames_to_ack,
Mat Martineau0a0aba42012-05-17 20:53:39 -07002092 threshold);
2093
2094 if (frames_to_ack >= threshold) {
2095 __clear_ack_timer(chan);
2096 control.super = L2CAP_SUPER_RR;
2097 control.reqseq = chan->buffer_seq;
2098 l2cap_send_sframe(chan, &control);
2099 frames_to_ack = 0;
2100 }
2101
2102 if (frames_to_ack)
2103 __set_ack_timer(chan);
2104 }
Szymon Jancb17e73b2012-01-11 10:59:47 +01002105}
2106
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002107static inline int l2cap_skbuff_fromiovec(struct l2cap_chan *chan,
2108 struct msghdr *msg, int len,
2109 int count, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002110{
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002111 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002112 struct sk_buff **frag;
Gustavo Padovan90338942012-04-06 20:15:47 -03002113 int sent = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002114
Gustavo F. Padovan59203a22010-05-01 16:15:43 -03002115 if (memcpy_fromiovec(skb_put(skb, count), msg->msg_iov, count))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002116 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002117
2118 sent += count;
2119 len -= count;
2120
2121 /* Continuation fragments (no L2CAP header) */
2122 frag = &skb_shinfo(skb)->frag_list;
2123 while (len) {
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002124 struct sk_buff *tmp;
2125
Linus Torvalds1da177e2005-04-16 15:20:36 -07002126 count = min_t(unsigned int, conn->mtu, len);
2127
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002128 tmp = chan->ops->alloc_skb(chan, count,
2129 msg->msg_flags & MSG_DONTWAIT);
2130 if (IS_ERR(tmp))
2131 return PTR_ERR(tmp);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002132
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002133 *frag = tmp;
2134
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002135 if (memcpy_fromiovec(skb_put(*frag, count), msg->msg_iov, count))
2136 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002137
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002138 (*frag)->priority = skb->priority;
2139
Linus Torvalds1da177e2005-04-16 15:20:36 -07002140 sent += count;
2141 len -= count;
2142
Gustavo Padovan2d0ed3d2012-05-11 13:16:12 -03002143 skb->len += (*frag)->len;
2144 skb->data_len += (*frag)->len;
2145
Linus Torvalds1da177e2005-04-16 15:20:36 -07002146 frag = &(*frag)->next;
2147 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002148
2149 return sent;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002150}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002151
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002152static struct sk_buff *l2cap_create_connless_pdu(struct l2cap_chan *chan,
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002153 struct msghdr *msg, size_t len,
2154 u32 priority)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002155{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002156 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002157 struct sk_buff *skb;
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002158 int err, count, hlen = L2CAP_HDR_SIZE + L2CAP_PSMLEN_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002159 struct l2cap_hdr *lh;
2160
Marcel Holtmann43b1b8d2013-10-12 06:01:26 -07002161 BT_DBG("chan %p psm 0x%2.2x len %zu priority %u", chan,
2162 __le16_to_cpu(chan->psm), len, priority);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002163
2164 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002165
2166 skb = chan->ops->alloc_skb(chan, count + hlen,
Gustavo Padovan90338942012-04-06 20:15:47 -03002167 msg->msg_flags & MSG_DONTWAIT);
2168 if (IS_ERR(skb))
2169 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002170
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002171 skb->priority = priority;
2172
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002173 /* Create L2CAP header */
2174 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002175 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenkodaf6a78c2012-05-03 10:55:52 +03002176 lh->len = cpu_to_le16(len + L2CAP_PSMLEN_SIZE);
Marcel Holtmann43b1b8d2013-10-12 06:01:26 -07002177 put_unaligned(chan->psm, (__le16 *) skb_put(skb, L2CAP_PSMLEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002178
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002179 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002180 if (unlikely(err < 0)) {
2181 kfree_skb(skb);
2182 return ERR_PTR(err);
2183 }
2184 return skb;
2185}
2186
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002187static struct sk_buff *l2cap_create_basic_pdu(struct l2cap_chan *chan,
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002188 struct msghdr *msg, size_t len,
2189 u32 priority)
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
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002205 skb->priority = priority;
2206
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002207 /* Create L2CAP header */
2208 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002209 lh->cid = cpu_to_le16(chan->dcid);
Gustavo Padovan6ff9b5e2012-05-02 11:56:17 -03002210 lh->len = cpu_to_le16(len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002211
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002212 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002213 if (unlikely(err < 0)) {
2214 kfree_skb(skb);
2215 return ERR_PTR(err);
2216 }
2217 return skb;
2218}
2219
Luiz Augusto von Dentzab0ff762011-09-12 20:00:50 +03002220static struct sk_buff *l2cap_create_iframe_pdu(struct l2cap_chan *chan,
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002221 struct msghdr *msg, size_t len,
2222 u16 sdulen)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002223{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002224 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002225 struct sk_buff *skb;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002226 int err, count, hlen;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002227 struct l2cap_hdr *lh;
2228
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002229 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002230
Gustavo F. Padovan0ee0d202010-05-01 16:15:41 -03002231 if (!conn)
2232 return ERR_PTR(-ENOTCONN);
2233
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002234 hlen = __ertm_hdr_size(chan);
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002235
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002236 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002237 hlen += L2CAP_SDULEN_SIZE;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002238
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03002239 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002240 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03002241
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002242 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002243
2244 skb = chan->ops->alloc_skb(chan, count + hlen,
Gustavo Padovan90338942012-04-06 20:15:47 -03002245 msg->msg_flags & MSG_DONTWAIT);
2246 if (IS_ERR(skb))
2247 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002248
2249 /* Create L2CAP header */
2250 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002251 lh->cid = cpu_to_le16(chan->dcid);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002252 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002253
Mat Martineau18a48e72012-05-17 20:53:34 -07002254 /* Control header is populated later */
2255 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
2256 put_unaligned_le32(0, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
2257 else
2258 put_unaligned_le16(0, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002259
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002260 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002261 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002262
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002263 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002264 if (unlikely(err < 0)) {
2265 kfree_skb(skb);
2266 return ERR_PTR(err);
2267 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03002268
Mat Martineau18a48e72012-05-17 20:53:34 -07002269 bt_cb(skb)->control.fcs = chan->fcs;
Mat Martineau3ce35142012-04-25 16:36:14 -07002270 bt_cb(skb)->control.retries = 0;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002271 return skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002272}
2273
Mat Martineau94122bb2012-05-02 09:42:02 -07002274static int l2cap_segment_sdu(struct l2cap_chan *chan,
2275 struct sk_buff_head *seg_queue,
2276 struct msghdr *msg, size_t len)
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002277{
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002278 struct sk_buff *skb;
Mat Martineau94122bb2012-05-02 09:42:02 -07002279 u16 sdu_len;
2280 size_t pdu_len;
Mat Martineau94122bb2012-05-02 09:42:02 -07002281 u8 sar;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002282
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002283 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002284
Mat Martineau94122bb2012-05-02 09:42:02 -07002285 /* It is critical that ERTM PDUs fit in a single HCI fragment,
2286 * so fragmented skbs are not used. The HCI layer's handling
2287 * of fragmented skbs is not compatible with ERTM's queueing.
2288 */
2289
2290 /* PDU size is derived from the HCI MTU */
2291 pdu_len = chan->conn->mtu;
2292
Mat Martineaua5495742012-10-23 15:24:21 -07002293 /* Constrain PDU size for BR/EDR connections */
2294 if (!chan->hs_hcon)
2295 pdu_len = min_t(size_t, pdu_len, L2CAP_BREDR_MAX_PAYLOAD);
Mat Martineau94122bb2012-05-02 09:42:02 -07002296
2297 /* Adjust for largest possible L2CAP overhead. */
Gustavo Padovan35d401d2012-05-25 18:57:05 -03002298 if (chan->fcs)
2299 pdu_len -= L2CAP_FCS_SIZE;
2300
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002301 pdu_len -= __ertm_hdr_size(chan);
Mat Martineau94122bb2012-05-02 09:42:02 -07002302
2303 /* Remote device may have requested smaller PDUs */
2304 pdu_len = min_t(size_t, pdu_len, chan->remote_mps);
2305
2306 if (len <= pdu_len) {
2307 sar = L2CAP_SAR_UNSEGMENTED;
2308 sdu_len = 0;
2309 pdu_len = len;
2310 } else {
2311 sar = L2CAP_SAR_START;
2312 sdu_len = len;
2313 pdu_len -= L2CAP_SDULEN_SIZE;
2314 }
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002315
2316 while (len > 0) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002317 skb = l2cap_create_iframe_pdu(chan, msg, pdu_len, sdu_len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002318
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002319 if (IS_ERR(skb)) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002320 __skb_queue_purge(seg_queue);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002321 return PTR_ERR(skb);
2322 }
2323
Mat Martineau94122bb2012-05-02 09:42:02 -07002324 bt_cb(skb)->control.sar = sar;
2325 __skb_queue_tail(seg_queue, skb);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002326
Mat Martineau94122bb2012-05-02 09:42:02 -07002327 len -= pdu_len;
2328 if (sdu_len) {
2329 sdu_len = 0;
2330 pdu_len += L2CAP_SDULEN_SIZE;
2331 }
2332
2333 if (len <= pdu_len) {
2334 sar = L2CAP_SAR_END;
2335 pdu_len = len;
2336 } else {
2337 sar = L2CAP_SAR_CONTINUE;
2338 }
2339 }
2340
Gustavo Padovanf0f62792012-05-29 13:29:17 -03002341 return 0;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002342}
2343
Johan Hedberg177f8f22013-05-31 17:54:51 +03002344static struct sk_buff *l2cap_create_le_flowctl_pdu(struct l2cap_chan *chan,
2345 struct msghdr *msg,
2346 size_t len, u16 sdulen)
2347{
2348 struct l2cap_conn *conn = chan->conn;
2349 struct sk_buff *skb;
2350 int err, count, hlen;
2351 struct l2cap_hdr *lh;
2352
2353 BT_DBG("chan %p len %zu", chan, len);
2354
2355 if (!conn)
2356 return ERR_PTR(-ENOTCONN);
2357
2358 hlen = L2CAP_HDR_SIZE;
2359
2360 if (sdulen)
2361 hlen += L2CAP_SDULEN_SIZE;
2362
2363 count = min_t(unsigned int, (conn->mtu - hlen), len);
2364
2365 skb = chan->ops->alloc_skb(chan, count + hlen,
2366 msg->msg_flags & MSG_DONTWAIT);
2367 if (IS_ERR(skb))
2368 return skb;
2369
2370 /* Create L2CAP header */
2371 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
2372 lh->cid = cpu_to_le16(chan->dcid);
2373 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
2374
2375 if (sdulen)
2376 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
2377
2378 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
2379 if (unlikely(err < 0)) {
2380 kfree_skb(skb);
2381 return ERR_PTR(err);
2382 }
2383
2384 return skb;
2385}
2386
2387static int l2cap_segment_le_sdu(struct l2cap_chan *chan,
2388 struct sk_buff_head *seg_queue,
2389 struct msghdr *msg, size_t len)
2390{
2391 struct sk_buff *skb;
2392 size_t pdu_len;
2393 u16 sdu_len;
2394
2395 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
2396
2397 pdu_len = chan->conn->mtu - L2CAP_HDR_SIZE;
2398
2399 pdu_len = min_t(size_t, pdu_len, chan->remote_mps);
2400
2401 sdu_len = len;
2402 pdu_len -= L2CAP_SDULEN_SIZE;
2403
2404 while (len > 0) {
2405 if (len <= pdu_len)
2406 pdu_len = len;
2407
2408 skb = l2cap_create_le_flowctl_pdu(chan, msg, pdu_len, sdu_len);
2409 if (IS_ERR(skb)) {
2410 __skb_queue_purge(seg_queue);
2411 return PTR_ERR(skb);
2412 }
2413
2414 __skb_queue_tail(seg_queue, skb);
2415
2416 len -= pdu_len;
2417
2418 if (sdu_len) {
2419 sdu_len = 0;
2420 pdu_len += L2CAP_SDULEN_SIZE;
2421 }
2422 }
2423
2424 return 0;
2425}
2426
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002427int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01002428 u32 priority)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002429{
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002430 struct sk_buff *skb;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002431 int err;
Mat Martineau94122bb2012-05-02 09:42:02 -07002432 struct sk_buff_head seg_queue;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002433
Seung-Woo Kim31e8ce82013-11-05 18:46:33 +09002434 if (!chan->conn)
2435 return -ENOTCONN;
2436
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002437 /* Connectionless channel */
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002438 if (chan->chan_type == L2CAP_CHAN_CONN_LESS) {
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002439 skb = l2cap_create_connless_pdu(chan, msg, len, priority);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002440 if (IS_ERR(skb))
2441 return PTR_ERR(skb);
2442
Andrzej Kaczmarekede81a22014-02-25 17:16:22 +01002443 /* Channel lock is released before requesting new skb and then
2444 * reacquired thus we need to recheck channel state.
2445 */
2446 if (chan->state != BT_CONNECTED) {
2447 kfree_skb(skb);
2448 return -ENOTCONN;
2449 }
2450
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002451 l2cap_do_send(chan, skb);
2452 return len;
2453 }
2454
2455 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03002456 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedberg177f8f22013-05-31 17:54:51 +03002457 /* Check outgoing MTU */
2458 if (len > chan->omtu)
2459 return -EMSGSIZE;
2460
Johan Hedbergfad5fc82013-12-05 09:45:01 +02002461 if (!chan->tx_credits)
2462 return -EAGAIN;
2463
Johan Hedberg177f8f22013-05-31 17:54:51 +03002464 __skb_queue_head_init(&seg_queue);
2465
2466 err = l2cap_segment_le_sdu(chan, &seg_queue, msg, len);
2467
2468 if (chan->state != BT_CONNECTED) {
2469 __skb_queue_purge(&seg_queue);
2470 err = -ENOTCONN;
2471 }
2472
2473 if (err)
2474 return err;
2475
2476 skb_queue_splice_tail_init(&seg_queue, &chan->tx_q);
2477
2478 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
2479 l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
2480 chan->tx_credits--;
2481 }
2482
2483 if (!chan->tx_credits)
2484 chan->ops->suspend(chan);
2485
2486 err = len;
2487
2488 break;
2489
Johan Hedbergfad5fc82013-12-05 09:45:01 +02002490 case L2CAP_MODE_BASIC:
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002491 /* Check outgoing MTU */
2492 if (len > chan->omtu)
2493 return -EMSGSIZE;
2494
2495 /* Create a basic PDU */
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002496 skb = l2cap_create_basic_pdu(chan, msg, len, priority);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002497 if (IS_ERR(skb))
2498 return PTR_ERR(skb);
2499
Andrzej Kaczmarekede81a22014-02-25 17:16:22 +01002500 /* Channel lock is released before requesting new skb and then
2501 * reacquired thus we need to recheck channel state.
2502 */
2503 if (chan->state != BT_CONNECTED) {
2504 kfree_skb(skb);
2505 return -ENOTCONN;
2506 }
2507
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002508 l2cap_do_send(chan, skb);
2509 err = len;
2510 break;
2511
2512 case L2CAP_MODE_ERTM:
2513 case L2CAP_MODE_STREAMING:
Mat Martineau94122bb2012-05-02 09:42:02 -07002514 /* Check outgoing MTU */
2515 if (len > chan->omtu) {
2516 err = -EMSGSIZE;
2517 break;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002518 }
2519
Mat Martineau94122bb2012-05-02 09:42:02 -07002520 __skb_queue_head_init(&seg_queue);
2521
2522 /* Do segmentation before calling in to the state machine,
2523 * since it's possible to block while waiting for memory
2524 * allocation.
2525 */
2526 err = l2cap_segment_sdu(chan, &seg_queue, msg, len);
2527
2528 /* The channel could have been closed while segmenting,
2529 * check that it is still connected.
2530 */
2531 if (chan->state != BT_CONNECTED) {
2532 __skb_queue_purge(&seg_queue);
2533 err = -ENOTCONN;
2534 }
2535
2536 if (err)
2537 break;
2538
Mat Martineau37339372012-05-17 20:53:33 -07002539 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo Padovand6603662012-05-21 13:58:22 -03002540 l2cap_tx(chan, NULL, &seg_queue, L2CAP_EV_DATA_REQUEST);
Mat Martineau37339372012-05-17 20:53:33 -07002541 else
Gustavo Padovand6603662012-05-21 13:58:22 -03002542 l2cap_streaming_send(chan, &seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002543
Gustavo Padovand6603662012-05-21 13:58:22 -03002544 err = len;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002545
Mat Martineau94122bb2012-05-02 09:42:02 -07002546 /* If the skbs were not queued for sending, they'll still be in
2547 * seg_queue and need to be purged.
2548 */
2549 __skb_queue_purge(&seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002550 break;
2551
2552 default:
2553 BT_DBG("bad state %1.1x", chan->mode);
2554 err = -EBADFD;
2555 }
2556
2557 return err;
2558}
2559
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002560static void l2cap_send_srej(struct l2cap_chan *chan, u16 txseq)
2561{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002562 struct l2cap_ctrl control;
2563 u16 seq;
2564
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002565 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002566
2567 memset(&control, 0, sizeof(control));
2568 control.sframe = 1;
2569 control.super = L2CAP_SUPER_SREJ;
2570
2571 for (seq = chan->expected_tx_seq; seq != txseq;
2572 seq = __next_seq(chan, seq)) {
2573 if (!l2cap_ertm_seq_in_queue(&chan->srej_q, seq)) {
2574 control.reqseq = seq;
2575 l2cap_send_sframe(chan, &control);
2576 l2cap_seq_list_append(&chan->srej_list, seq);
2577 }
2578 }
2579
2580 chan->expected_tx_seq = __next_seq(chan, txseq);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002581}
2582
2583static void l2cap_send_srej_tail(struct l2cap_chan *chan)
2584{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002585 struct l2cap_ctrl control;
2586
2587 BT_DBG("chan %p", chan);
2588
2589 if (chan->srej_list.tail == L2CAP_SEQ_LIST_CLEAR)
2590 return;
2591
2592 memset(&control, 0, sizeof(control));
2593 control.sframe = 1;
2594 control.super = L2CAP_SUPER_SREJ;
2595 control.reqseq = chan->srej_list.tail;
2596 l2cap_send_sframe(chan, &control);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002597}
2598
2599static void l2cap_send_srej_list(struct l2cap_chan *chan, u16 txseq)
2600{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002601 struct l2cap_ctrl control;
2602 u16 initial_head;
2603 u16 seq;
2604
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002605 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002606
2607 memset(&control, 0, sizeof(control));
2608 control.sframe = 1;
2609 control.super = L2CAP_SUPER_SREJ;
2610
2611 /* Capture initial list head to allow only one pass through the list. */
2612 initial_head = chan->srej_list.head;
2613
2614 do {
2615 seq = l2cap_seq_list_pop(&chan->srej_list);
2616 if (seq == txseq || seq == L2CAP_SEQ_LIST_CLEAR)
2617 break;
2618
2619 control.reqseq = seq;
2620 l2cap_send_sframe(chan, &control);
2621 l2cap_seq_list_append(&chan->srej_list, seq);
2622 } while (chan->srej_list.head != initial_head);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002623}
2624
Mat Martineau608bcc62012-05-17 20:53:32 -07002625static void l2cap_process_reqseq(struct l2cap_chan *chan, u16 reqseq)
2626{
2627 struct sk_buff *acked_skb;
2628 u16 ackseq;
2629
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002630 BT_DBG("chan %p, reqseq %u", chan, reqseq);
Mat Martineau608bcc62012-05-17 20:53:32 -07002631
2632 if (chan->unacked_frames == 0 || reqseq == chan->expected_ack_seq)
2633 return;
2634
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002635 BT_DBG("expected_ack_seq %u, unacked_frames %u",
Mat Martineau608bcc62012-05-17 20:53:32 -07002636 chan->expected_ack_seq, chan->unacked_frames);
2637
2638 for (ackseq = chan->expected_ack_seq; ackseq != reqseq;
2639 ackseq = __next_seq(chan, ackseq)) {
2640
2641 acked_skb = l2cap_ertm_seq_in_queue(&chan->tx_q, ackseq);
2642 if (acked_skb) {
2643 skb_unlink(acked_skb, &chan->tx_q);
2644 kfree_skb(acked_skb);
2645 chan->unacked_frames--;
2646 }
2647 }
2648
2649 chan->expected_ack_seq = reqseq;
2650
2651 if (chan->unacked_frames == 0)
2652 __clear_retrans_timer(chan);
2653
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002654 BT_DBG("unacked_frames %u", chan->unacked_frames);
Mat Martineau608bcc62012-05-17 20:53:32 -07002655}
2656
2657static void l2cap_abort_rx_srej_sent(struct l2cap_chan *chan)
2658{
2659 BT_DBG("chan %p", chan);
2660
2661 chan->expected_tx_seq = chan->buffer_seq;
2662 l2cap_seq_list_clear(&chan->srej_list);
2663 skb_queue_purge(&chan->srej_q);
2664 chan->rx_state = L2CAP_RX_STATE_RECV;
2665}
2666
Gustavo Padovand6603662012-05-21 13:58:22 -03002667static void l2cap_tx_state_xmit(struct l2cap_chan *chan,
2668 struct l2cap_ctrl *control,
2669 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002670{
Mat Martineau608bcc62012-05-17 20:53:32 -07002671 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2672 event);
2673
2674 switch (event) {
2675 case L2CAP_EV_DATA_REQUEST:
2676 if (chan->tx_send_head == NULL)
2677 chan->tx_send_head = skb_peek(skbs);
2678
2679 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2680 l2cap_ertm_send(chan);
2681 break;
2682 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2683 BT_DBG("Enter LOCAL_BUSY");
2684 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2685
2686 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2687 /* The SREJ_SENT state must be aborted if we are to
2688 * enter the LOCAL_BUSY state.
2689 */
2690 l2cap_abort_rx_srej_sent(chan);
2691 }
2692
2693 l2cap_send_ack(chan);
2694
2695 break;
2696 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2697 BT_DBG("Exit LOCAL_BUSY");
2698 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2699
2700 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2701 struct l2cap_ctrl local_control;
2702
2703 memset(&local_control, 0, sizeof(local_control));
2704 local_control.sframe = 1;
2705 local_control.super = L2CAP_SUPER_RR;
2706 local_control.poll = 1;
2707 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002708 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002709
2710 chan->retry_count = 1;
2711 __set_monitor_timer(chan);
2712 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2713 }
2714 break;
2715 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2716 l2cap_process_reqseq(chan, control->reqseq);
2717 break;
2718 case L2CAP_EV_EXPLICIT_POLL:
2719 l2cap_send_rr_or_rnr(chan, 1);
2720 chan->retry_count = 1;
2721 __set_monitor_timer(chan);
2722 __clear_ack_timer(chan);
2723 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2724 break;
2725 case L2CAP_EV_RETRANS_TO:
2726 l2cap_send_rr_or_rnr(chan, 1);
2727 chan->retry_count = 1;
2728 __set_monitor_timer(chan);
2729 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2730 break;
2731 case L2CAP_EV_RECV_FBIT:
2732 /* Nothing to process */
2733 break;
2734 default:
2735 break;
2736 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002737}
2738
Gustavo Padovand6603662012-05-21 13:58:22 -03002739static void l2cap_tx_state_wait_f(struct l2cap_chan *chan,
2740 struct l2cap_ctrl *control,
2741 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002742{
Mat Martineau608bcc62012-05-17 20:53:32 -07002743 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2744 event);
2745
2746 switch (event) {
2747 case L2CAP_EV_DATA_REQUEST:
2748 if (chan->tx_send_head == NULL)
2749 chan->tx_send_head = skb_peek(skbs);
2750 /* Queue data, but don't send. */
2751 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2752 break;
2753 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2754 BT_DBG("Enter LOCAL_BUSY");
2755 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2756
2757 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2758 /* The SREJ_SENT state must be aborted if we are to
2759 * enter the LOCAL_BUSY state.
2760 */
2761 l2cap_abort_rx_srej_sent(chan);
2762 }
2763
2764 l2cap_send_ack(chan);
2765
2766 break;
2767 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2768 BT_DBG("Exit LOCAL_BUSY");
2769 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2770
2771 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2772 struct l2cap_ctrl local_control;
2773 memset(&local_control, 0, sizeof(local_control));
2774 local_control.sframe = 1;
2775 local_control.super = L2CAP_SUPER_RR;
2776 local_control.poll = 1;
2777 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002778 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002779
2780 chan->retry_count = 1;
2781 __set_monitor_timer(chan);
2782 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2783 }
2784 break;
2785 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2786 l2cap_process_reqseq(chan, control->reqseq);
2787
2788 /* Fall through */
2789
2790 case L2CAP_EV_RECV_FBIT:
2791 if (control && control->final) {
2792 __clear_monitor_timer(chan);
2793 if (chan->unacked_frames > 0)
2794 __set_retrans_timer(chan);
2795 chan->retry_count = 0;
2796 chan->tx_state = L2CAP_TX_STATE_XMIT;
2797 BT_DBG("recv fbit tx_state 0x2.2%x", chan->tx_state);
2798 }
2799 break;
2800 case L2CAP_EV_EXPLICIT_POLL:
2801 /* Ignore */
2802 break;
2803 case L2CAP_EV_MONITOR_TO:
2804 if (chan->max_tx == 0 || chan->retry_count < chan->max_tx) {
2805 l2cap_send_rr_or_rnr(chan, 1);
2806 __set_monitor_timer(chan);
2807 chan->retry_count++;
2808 } else {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02002809 l2cap_send_disconn_req(chan, ECONNABORTED);
Mat Martineau608bcc62012-05-17 20:53:32 -07002810 }
2811 break;
2812 default:
2813 break;
2814 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002815}
2816
Gustavo Padovand6603662012-05-21 13:58:22 -03002817static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
2818 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002819{
Mat Martineau608bcc62012-05-17 20:53:32 -07002820 BT_DBG("chan %p, control %p, skbs %p, event %d, state %d",
2821 chan, control, skbs, event, chan->tx_state);
2822
2823 switch (chan->tx_state) {
2824 case L2CAP_TX_STATE_XMIT:
Gustavo Padovand6603662012-05-21 13:58:22 -03002825 l2cap_tx_state_xmit(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002826 break;
2827 case L2CAP_TX_STATE_WAIT_F:
Gustavo Padovand6603662012-05-21 13:58:22 -03002828 l2cap_tx_state_wait_f(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002829 break;
2830 default:
2831 /* Ignore event */
2832 break;
2833 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002834}
2835
Mat Martineau4b51dae92012-05-17 20:53:37 -07002836static void l2cap_pass_to_tx(struct l2cap_chan *chan,
2837 struct l2cap_ctrl *control)
2838{
2839 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002840 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_REQSEQ_AND_FBIT);
Mat Martineau4b51dae92012-05-17 20:53:37 -07002841}
2842
Mat Martineauf80842a2012-05-17 20:53:46 -07002843static void l2cap_pass_to_tx_fbit(struct l2cap_chan *chan,
2844 struct l2cap_ctrl *control)
2845{
2846 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002847 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_FBIT);
Mat Martineauf80842a2012-05-17 20:53:46 -07002848}
2849
Linus Torvalds1da177e2005-04-16 15:20:36 -07002850/* Copy frame to all raw sockets on that connection */
2851static void l2cap_raw_recv(struct l2cap_conn *conn, struct sk_buff *skb)
2852{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002853 struct sk_buff *nskb;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03002854 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002855
2856 BT_DBG("conn %p", conn);
2857
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002858 mutex_lock(&conn->chan_lock);
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002859
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002860 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002861 if (chan->chan_type != L2CAP_CHAN_RAW)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002862 continue;
2863
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002864 /* Don't send frame to the channel it came from */
2865 if (bt_cb(skb)->chan == chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002866 continue;
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002867
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002868 nskb = skb_clone(skb, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03002869 if (!nskb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002870 continue;
Gustavo Padovan80b98022012-05-27 22:27:51 -03002871 if (chan->ops->recv(chan, nskb))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002872 kfree_skb(nskb);
2873 }
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002874
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002875 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002876}
2877
2878/* ---- L2CAP signalling commands ---- */
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002879static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn, u8 code,
2880 u8 ident, u16 dlen, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002881{
2882 struct sk_buff *skb, **frag;
2883 struct l2cap_cmd_hdr *cmd;
2884 struct l2cap_hdr *lh;
2885 int len, count;
2886
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002887 BT_DBG("conn %p, code 0x%2.2x, ident 0x%2.2x, len %u",
2888 conn, code, ident, dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002889
Anderson Lizardo300b9622013-06-02 16:30:40 -04002890 if (conn->mtu < L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE)
2891 return NULL;
2892
Linus Torvalds1da177e2005-04-16 15:20:36 -07002893 len = L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE + dlen;
2894 count = min_t(unsigned int, conn->mtu, len);
2895
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002896 skb = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002897 if (!skb)
2898 return NULL;
2899
2900 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002901 lh->len = cpu_to_le16(L2CAP_CMD_HDR_SIZE + dlen);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002902
2903 if (conn->hcon->type == LE_LINK)
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002904 lh->cid = cpu_to_le16(L2CAP_CID_LE_SIGNALING);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002905 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002906 lh->cid = cpu_to_le16(L2CAP_CID_SIGNALING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002907
2908 cmd = (struct l2cap_cmd_hdr *) skb_put(skb, L2CAP_CMD_HDR_SIZE);
2909 cmd->code = code;
2910 cmd->ident = ident;
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002911 cmd->len = cpu_to_le16(dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002912
2913 if (dlen) {
2914 count -= L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE;
2915 memcpy(skb_put(skb, count), data, count);
2916 data += count;
2917 }
2918
2919 len -= skb->len;
2920
2921 /* Continuation fragments (no L2CAP header) */
2922 frag = &skb_shinfo(skb)->frag_list;
2923 while (len) {
2924 count = min_t(unsigned int, conn->mtu, len);
2925
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002926 *frag = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002927 if (!*frag)
2928 goto fail;
2929
2930 memcpy(skb_put(*frag, count), data, count);
2931
2932 len -= count;
2933 data += count;
2934
2935 frag = &(*frag)->next;
2936 }
2937
2938 return skb;
2939
2940fail:
2941 kfree_skb(skb);
2942 return NULL;
2943}
2944
Gustavo Padovan2d792812012-10-06 10:07:01 +01002945static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen,
2946 unsigned long *val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002947{
2948 struct l2cap_conf_opt *opt = *ptr;
2949 int len;
2950
2951 len = L2CAP_CONF_OPT_SIZE + opt->len;
2952 *ptr += len;
2953
2954 *type = opt->type;
2955 *olen = opt->len;
2956
2957 switch (opt->len) {
2958 case 1:
2959 *val = *((u8 *) opt->val);
2960 break;
2961
2962 case 2:
steven miaobfaaeb32010-10-16 18:29:47 -04002963 *val = get_unaligned_le16(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002964 break;
2965
2966 case 4:
steven miaobfaaeb32010-10-16 18:29:47 -04002967 *val = get_unaligned_le32(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002968 break;
2969
2970 default:
2971 *val = (unsigned long) opt->val;
2972 break;
2973 }
2974
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002975 BT_DBG("type 0x%2.2x len %u val 0x%lx", *type, opt->len, *val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002976 return len;
2977}
2978
Linus Torvalds1da177e2005-04-16 15:20:36 -07002979static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val)
2980{
2981 struct l2cap_conf_opt *opt = *ptr;
2982
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002983 BT_DBG("type 0x%2.2x len %u val 0x%lx", type, len, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002984
2985 opt->type = type;
2986 opt->len = len;
2987
2988 switch (len) {
2989 case 1:
2990 *((u8 *) opt->val) = val;
2991 break;
2992
2993 case 2:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02002994 put_unaligned_le16(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002995 break;
2996
2997 case 4:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02002998 put_unaligned_le32(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002999 break;
3000
3001 default:
3002 memcpy(opt->val, (void *) val, len);
3003 break;
3004 }
3005
3006 *ptr += L2CAP_CONF_OPT_SIZE + len;
3007}
3008
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003009static void l2cap_add_opt_efs(void **ptr, struct l2cap_chan *chan)
3010{
3011 struct l2cap_conf_efs efs;
3012
Szymon Janc1ec918c2011-11-16 09:32:21 +01003013 switch (chan->mode) {
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003014 case L2CAP_MODE_ERTM:
3015 efs.id = chan->local_id;
3016 efs.stype = chan->local_stype;
3017 efs.msdu = cpu_to_le16(chan->local_msdu);
3018 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003019 efs.acc_lat = cpu_to_le32(L2CAP_DEFAULT_ACC_LAT);
3020 efs.flush_to = cpu_to_le32(L2CAP_EFS_DEFAULT_FLUSH_TO);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003021 break;
3022
3023 case L2CAP_MODE_STREAMING:
3024 efs.id = 1;
3025 efs.stype = L2CAP_SERV_BESTEFFORT;
3026 efs.msdu = cpu_to_le16(chan->local_msdu);
3027 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
3028 efs.acc_lat = 0;
3029 efs.flush_to = 0;
3030 break;
3031
3032 default:
3033 return;
3034 }
3035
3036 l2cap_add_conf_opt(ptr, L2CAP_CONF_EFS, sizeof(efs),
Andrei Emeltchenko8936fa62012-10-08 11:14:41 +03003037 (unsigned long) &efs);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003038}
3039
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003040static void l2cap_ack_timeout(struct work_struct *work)
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003041{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003042 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau03625202012-05-17 20:53:51 -07003043 ack_timer.work);
3044 u16 frames_to_ack;
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003045
Gustavo F. Padovan2fb9b3d2011-12-22 16:56:05 -02003046 BT_DBG("chan %p", chan);
3047
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003048 l2cap_chan_lock(chan);
3049
Mat Martineau03625202012-05-17 20:53:51 -07003050 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
3051 chan->last_acked_seq);
3052
3053 if (frames_to_ack)
3054 l2cap_send_rr_or_rnr(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003055
3056 l2cap_chan_unlock(chan);
Szymon Janc09bfb2e2012-01-11 10:59:49 +01003057 l2cap_chan_put(chan);
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003058}
3059
Andrei Emeltchenko466f8002012-05-29 13:59:01 +03003060int l2cap_ertm_init(struct l2cap_chan *chan)
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003061{
Mat Martineau3c588192012-04-11 10:48:42 -07003062 int err;
3063
Mat Martineau105bdf92012-04-27 16:50:48 -07003064 chan->next_tx_seq = 0;
3065 chan->expected_tx_seq = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003066 chan->expected_ack_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003067 chan->unacked_frames = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003068 chan->buffer_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003069 chan->frames_sent = 0;
Mat Martineau105bdf92012-04-27 16:50:48 -07003070 chan->last_acked_seq = 0;
3071 chan->sdu = NULL;
3072 chan->sdu_last_frag = NULL;
3073 chan->sdu_len = 0;
3074
Mat Martineaud34c34f2012-05-14 14:49:27 -07003075 skb_queue_head_init(&chan->tx_q);
3076
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003077 chan->local_amp_id = AMP_ID_BREDR;
3078 chan->move_id = AMP_ID_BREDR;
Mat Martineau08333282012-10-23 15:24:06 -07003079 chan->move_state = L2CAP_MOVE_STABLE;
3080 chan->move_role = L2CAP_MOVE_ROLE_NONE;
3081
Mat Martineau105bdf92012-04-27 16:50:48 -07003082 if (chan->mode != L2CAP_MODE_ERTM)
3083 return 0;
3084
3085 chan->rx_state = L2CAP_RX_STATE_RECV;
3086 chan->tx_state = L2CAP_TX_STATE_XMIT;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003087
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003088 INIT_DELAYED_WORK(&chan->retrans_timer, l2cap_retrans_timeout);
3089 INIT_DELAYED_WORK(&chan->monitor_timer, l2cap_monitor_timeout);
3090 INIT_DELAYED_WORK(&chan->ack_timer, l2cap_ack_timeout);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003091
Gustavo F. Padovanf1c67752011-03-25 20:36:10 -03003092 skb_queue_head_init(&chan->srej_q);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03003093
Mat Martineau3c588192012-04-11 10:48:42 -07003094 err = l2cap_seq_list_init(&chan->srej_list, chan->tx_win);
3095 if (err < 0)
3096 return err;
3097
Mat Martineau9dc9aff2012-05-17 16:20:14 -07003098 err = l2cap_seq_list_init(&chan->retrans_list, chan->remote_tx_win);
3099 if (err < 0)
3100 l2cap_seq_list_free(&chan->srej_list);
3101
3102 return err;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003103}
3104
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003105static inline __u8 l2cap_select_mode(__u8 mode, __u16 remote_feat_mask)
3106{
3107 switch (mode) {
3108 case L2CAP_MODE_STREAMING:
3109 case L2CAP_MODE_ERTM:
3110 if (l2cap_mode_supported(mode, remote_feat_mask))
3111 return mode;
3112 /* fall through */
3113 default:
3114 return L2CAP_MODE_BASIC;
3115 }
3116}
3117
Marcel Holtmann848566b2013-10-01 22:59:22 -07003118static inline bool __l2cap_ews_supported(struct l2cap_conn *conn)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003119{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003120 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003121}
3122
Marcel Holtmann848566b2013-10-01 22:59:22 -07003123static inline bool __l2cap_efs_supported(struct l2cap_conn *conn)
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003124{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003125 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_FLOW;
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003126}
3127
Mat Martineau36c86c82012-10-23 15:24:20 -07003128static void __l2cap_set_ertm_timeouts(struct l2cap_chan *chan,
3129 struct l2cap_conf_rfc *rfc)
3130{
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003131 if (chan->local_amp_id != AMP_ID_BREDR && chan->hs_hcon) {
Mat Martineau36c86c82012-10-23 15:24:20 -07003132 u64 ertm_to = chan->hs_hcon->hdev->amp_be_flush_to;
3133
3134 /* Class 1 devices have must have ERTM timeouts
3135 * exceeding the Link Supervision Timeout. The
3136 * default Link Supervision Timeout for AMP
3137 * controllers is 10 seconds.
3138 *
3139 * Class 1 devices use 0xffffffff for their
3140 * best-effort flush timeout, so the clamping logic
3141 * will result in a timeout that meets the above
3142 * requirement. ERTM timeouts are 16-bit values, so
3143 * the maximum timeout is 65.535 seconds.
3144 */
3145
3146 /* Convert timeout to milliseconds and round */
3147 ertm_to = DIV_ROUND_UP_ULL(ertm_to, 1000);
3148
3149 /* This is the recommended formula for class 2 devices
3150 * that start ERTM timers when packets are sent to the
3151 * controller.
3152 */
3153 ertm_to = 3 * ertm_to + 500;
3154
3155 if (ertm_to > 0xffff)
3156 ertm_to = 0xffff;
3157
3158 rfc->retrans_timeout = cpu_to_le16((u16) ertm_to);
3159 rfc->monitor_timeout = rfc->retrans_timeout;
3160 } else {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003161 rfc->retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO);
3162 rfc->monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO);
Mat Martineau36c86c82012-10-23 15:24:20 -07003163 }
3164}
3165
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003166static inline void l2cap_txwin_setup(struct l2cap_chan *chan)
3167{
3168 if (chan->tx_win > L2CAP_DEFAULT_TX_WINDOW &&
Marcel Holtmann848566b2013-10-01 22:59:22 -07003169 __l2cap_ews_supported(chan->conn)) {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003170 /* use extended control field */
3171 set_bit(FLAG_EXT_CTRL, &chan->flags);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003172 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
3173 } else {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003174 chan->tx_win = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003175 L2CAP_DEFAULT_TX_WINDOW);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003176 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
3177 }
Mat Martineauc20f8e32012-07-10 05:47:07 -07003178 chan->ack_win = chan->tx_win;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003179}
3180
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003181static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003182{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003183 struct l2cap_conf_req *req = data;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003184 struct l2cap_conf_rfc rfc = { .mode = chan->mode };
Linus Torvalds1da177e2005-04-16 15:20:36 -07003185 void *ptr = req->data;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003186 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003187
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03003188 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003189
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003190 if (chan->num_conf_req || chan->num_conf_rsp)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003191 goto done;
3192
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003193 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003194 case L2CAP_MODE_STREAMING:
3195 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003196 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state))
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003197 break;
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003198
Marcel Holtmann848566b2013-10-01 22:59:22 -07003199 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003200 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3201
Gustavo F. Padovan2ba13ed2010-06-09 16:39:05 -03003202 /* fall through */
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003203 default:
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003204 chan->mode = l2cap_select_mode(rfc.mode, chan->conn->feat_mask);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003205 break;
3206 }
3207
3208done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003209 if (chan->imtu != L2CAP_DEFAULT_MTU)
3210 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovan7990681c2011-01-24 16:01:43 -02003211
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003212 switch (chan->mode) {
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003213 case L2CAP_MODE_BASIC:
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003214 if (!(chan->conn->feat_mask & L2CAP_FEAT_ERTM) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003215 !(chan->conn->feat_mask & L2CAP_FEAT_STREAMING))
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003216 break;
3217
Gustavo F. Padovan62547752010-06-08 20:05:31 -03003218 rfc.mode = L2CAP_MODE_BASIC;
3219 rfc.txwin_size = 0;
3220 rfc.max_transmit = 0;
3221 rfc.retrans_timeout = 0;
3222 rfc.monitor_timeout = 0;
3223 rfc.max_pdu_size = 0;
3224
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003225 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003226 (unsigned long) &rfc);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003227 break;
3228
3229 case L2CAP_MODE_ERTM:
3230 rfc.mode = L2CAP_MODE_ERTM;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003231 rfc.max_transmit = chan->max_tx;
Mat Martineau36c86c82012-10-23 15:24:20 -07003232
3233 __l2cap_set_ertm_timeouts(chan, &rfc);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003234
3235 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003236 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3237 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003238 rfc.max_pdu_size = cpu_to_le16(size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003239
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003240 l2cap_txwin_setup(chan);
3241
3242 rfc.txwin_size = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003243 L2CAP_DEFAULT_TX_WINDOW);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003244
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003245 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003246 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003247
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003248 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3249 l2cap_add_opt_efs(&ptr, chan);
3250
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003251 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3252 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003253 chan->tx_win);
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003254
3255 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3256 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003257 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003258 chan->fcs = L2CAP_FCS_NONE;
3259 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3260 chan->fcs);
3261 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003262 break;
3263
3264 case L2CAP_MODE_STREAMING:
Mat Martineau273759e2012-05-17 20:53:53 -07003265 l2cap_txwin_setup(chan);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003266 rfc.mode = L2CAP_MODE_STREAMING;
3267 rfc.txwin_size = 0;
3268 rfc.max_transmit = 0;
3269 rfc.retrans_timeout = 0;
3270 rfc.monitor_timeout = 0;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003271
3272 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003273 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3274 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003275 rfc.max_pdu_size = cpu_to_le16(size);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003276
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003277 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003278 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003279
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003280 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3281 l2cap_add_opt_efs(&ptr, chan);
3282
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003283 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3284 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003285 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003286 chan->fcs = L2CAP_FCS_NONE;
3287 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3288 chan->fcs);
3289 }
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003290 break;
3291 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003292
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003293 req->dcid = cpu_to_le16(chan->dcid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003294 req->flags = cpu_to_le16(0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003295
3296 return ptr - data;
3297}
3298
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003299static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003300{
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003301 struct l2cap_conf_rsp *rsp = data;
3302 void *ptr = rsp->data;
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003303 void *req = chan->conf_req;
3304 int len = chan->conf_len;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003305 int type, hint, olen;
3306 unsigned long val;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003307 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003308 struct l2cap_conf_efs efs;
3309 u8 remote_efs = 0;
Marcel Holtmann861d6882007-10-20 13:37:06 +02003310 u16 mtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003311 u16 result = L2CAP_CONF_SUCCESS;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003312 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003313
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003314 BT_DBG("chan %p", chan);
Marcel Holtmann820ae1b2006-11-18 22:15:00 +01003315
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003316 while (len >= L2CAP_CONF_OPT_SIZE) {
3317 len -= l2cap_get_conf_opt(&req, &type, &olen, &val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003318
Gustavo F. Padovan589d2742009-04-20 01:31:07 -03003319 hint = type & L2CAP_CONF_HINT;
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07003320 type &= L2CAP_CONF_MASK;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003321
3322 switch (type) {
3323 case L2CAP_CONF_MTU:
Marcel Holtmann861d6882007-10-20 13:37:06 +02003324 mtu = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003325 break;
3326
3327 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003328 chan->flush_to = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003329 break;
3330
3331 case L2CAP_CONF_QOS:
3332 break;
3333
Marcel Holtmann6464f352007-10-20 13:39:51 +02003334 case L2CAP_CONF_RFC:
3335 if (olen == sizeof(rfc))
3336 memcpy(&rfc, (void *) val, olen);
3337 break;
3338
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003339 case L2CAP_CONF_FCS:
3340 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003341 set_bit(CONF_RECV_NO_FCS, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003342 break;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003343
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003344 case L2CAP_CONF_EFS:
3345 remote_efs = 1;
3346 if (olen == sizeof(efs))
3347 memcpy(&efs, (void *) val, olen);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003348 break;
3349
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003350 case L2CAP_CONF_EWS:
Marcel Holtmann848566b2013-10-01 22:59:22 -07003351 if (!chan->conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003352 return -ECONNREFUSED;
3353
3354 set_bit(FLAG_EXT_CTRL, &chan->flags);
3355 set_bit(CONF_EWS_RECV, &chan->conf_state);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003356 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003357 chan->remote_tx_win = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003358 break;
3359
3360 default:
3361 if (hint)
3362 break;
3363
3364 result = L2CAP_CONF_UNKNOWN;
3365 *((u8 *) ptr++) = type;
3366 break;
3367 }
3368 }
3369
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003370 if (chan->num_conf_rsp || chan->num_conf_req > 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003371 goto done;
3372
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003373 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003374 case L2CAP_MODE_STREAMING:
3375 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003376 if (!test_bit(CONF_STATE2_DEVICE, &chan->conf_state)) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003377 chan->mode = l2cap_select_mode(rfc.mode,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003378 chan->conn->feat_mask);
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003379 break;
3380 }
3381
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003382 if (remote_efs) {
Marcel Holtmann848566b2013-10-01 22:59:22 -07003383 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003384 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3385 else
3386 return -ECONNREFUSED;
3387 }
3388
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003389 if (chan->mode != rfc.mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003390 return -ECONNREFUSED;
Gustavo F. Padovan742e5192010-06-08 19:09:48 -03003391
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003392 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003393 }
3394
3395done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003396 if (chan->mode != rfc.mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003397 result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003398 rfc.mode = chan->mode;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003399
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003400 if (chan->num_conf_rsp == 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003401 return -ECONNREFUSED;
3402
Gustavo Padovan2d792812012-10-06 10:07:01 +01003403 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3404 (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003405 }
3406
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003407 if (result == L2CAP_CONF_SUCCESS) {
3408 /* Configure output options and let the other side know
3409 * which ones we don't like. */
3410
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003411 if (mtu < L2CAP_DEFAULT_MIN_MTU)
3412 result = L2CAP_CONF_UNACCEPT;
3413 else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003414 chan->omtu = mtu;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003415 set_bit(CONF_MTU_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003416 }
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003417 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->omtu);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003418
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003419 if (remote_efs) {
3420 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003421 efs.stype != L2CAP_SERV_NOTRAFIC &&
3422 efs.stype != chan->local_stype) {
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003423
3424 result = L2CAP_CONF_UNACCEPT;
3425
3426 if (chan->num_conf_req >= 1)
3427 return -ECONNREFUSED;
3428
3429 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003430 sizeof(efs),
3431 (unsigned long) &efs);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003432 } else {
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003433 /* Send PENDING Conf Rsp */
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003434 result = L2CAP_CONF_PENDING;
3435 set_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003436 }
3437 }
3438
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003439 switch (rfc.mode) {
3440 case L2CAP_MODE_BASIC:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003441 chan->fcs = L2CAP_FCS_NONE;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003442 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003443 break;
3444
3445 case L2CAP_MODE_ERTM:
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003446 if (!test_bit(CONF_EWS_RECV, &chan->conf_state))
3447 chan->remote_tx_win = rfc.txwin_size;
3448 else
3449 rfc.txwin_size = L2CAP_DEFAULT_TX_WINDOW;
3450
Gustavo F. Padovan2c03a7a2011-03-25 20:15:28 -03003451 chan->remote_max_tx = rfc.max_transmit;
Mat Martineau86b1b262010-08-05 15:54:22 -07003452
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003453 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003454 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3455 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003456 rfc.max_pdu_size = cpu_to_le16(size);
3457 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003458
Mat Martineau36c86c82012-10-23 15:24:20 -07003459 __l2cap_set_ertm_timeouts(chan, &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003460
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003461 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003462
3463 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003464 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003465
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003466 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3467 chan->remote_id = efs.id;
3468 chan->remote_stype = efs.stype;
3469 chan->remote_msdu = le16_to_cpu(efs.msdu);
3470 chan->remote_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003471 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003472 chan->remote_acc_lat =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003473 le32_to_cpu(efs.acc_lat);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003474 chan->remote_sdu_itime =
3475 le32_to_cpu(efs.sdu_itime);
3476 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003477 sizeof(efs),
3478 (unsigned long) &efs);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003479 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003480 break;
3481
3482 case L2CAP_MODE_STREAMING:
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003483 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003484 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3485 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003486 rfc.max_pdu_size = cpu_to_le16(size);
3487 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003488
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003489 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003490
Gustavo Padovan2d792812012-10-06 10:07:01 +01003491 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3492 (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003493
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003494 break;
3495
3496 default:
Marcel Holtmann6464f352007-10-20 13:39:51 +02003497 result = L2CAP_CONF_UNACCEPT;
3498
3499 memset(&rfc, 0, sizeof(rfc));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003500 rfc.mode = chan->mode;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003501 }
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003502
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003503 if (result == L2CAP_CONF_SUCCESS)
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003504 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003505 }
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003506 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003507 rsp->result = cpu_to_le16(result);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003508 rsp->flags = cpu_to_le16(0);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003509
3510 return ptr - data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003511}
3512
Gustavo Padovan2d792812012-10-06 10:07:01 +01003513static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len,
3514 void *data, u16 *result)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003515{
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003516 struct l2cap_conf_req *req = data;
3517 void *ptr = req->data;
3518 int type, olen;
3519 unsigned long val;
Mat Martineau36e999a2011-12-08 17:23:21 -08003520 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003521 struct l2cap_conf_efs efs;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003522
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003523 BT_DBG("chan %p, rsp %p, len %d, req %p", chan, rsp, len, data);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003524
3525 while (len >= L2CAP_CONF_OPT_SIZE) {
3526 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3527
3528 switch (type) {
3529 case L2CAP_CONF_MTU:
3530 if (val < L2CAP_DEFAULT_MIN_MTU) {
3531 *result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003532 chan->imtu = L2CAP_DEFAULT_MIN_MTU;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003533 } else
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003534 chan->imtu = val;
3535 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003536 break;
3537
3538 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003539 chan->flush_to = val;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003540 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003541 2, chan->flush_to);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003542 break;
3543
3544 case L2CAP_CONF_RFC:
3545 if (olen == sizeof(rfc))
3546 memcpy(&rfc, (void *)val, olen);
3547
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003548 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003549 rfc.mode != chan->mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003550 return -ECONNREFUSED;
3551
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003552 chan->fcs = 0;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003553
3554 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003555 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003556 break;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003557
3558 case L2CAP_CONF_EWS:
Mat Martineauc20f8e32012-07-10 05:47:07 -07003559 chan->ack_win = min_t(u16, val, chan->ack_win);
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003560 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Mat Martineauc20f8e32012-07-10 05:47:07 -07003561 chan->tx_win);
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003562 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003563
3564 case L2CAP_CONF_EFS:
3565 if (olen == sizeof(efs))
3566 memcpy(&efs, (void *)val, olen);
3567
3568 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003569 efs.stype != L2CAP_SERV_NOTRAFIC &&
3570 efs.stype != chan->local_stype)
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003571 return -ECONNREFUSED;
3572
Gustavo Padovan2d792812012-10-06 10:07:01 +01003573 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS, sizeof(efs),
3574 (unsigned long) &efs);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003575 break;
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003576
3577 case L2CAP_CONF_FCS:
3578 if (*result == L2CAP_CONF_PENDING)
3579 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003580 set_bit(CONF_RECV_NO_FCS,
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003581 &chan->conf_state);
3582 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003583 }
3584 }
3585
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003586 if (chan->mode == L2CAP_MODE_BASIC && chan->mode != rfc.mode)
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003587 return -ECONNREFUSED;
3588
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003589 chan->mode = rfc.mode;
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003590
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003591 if (*result == L2CAP_CONF_SUCCESS || *result == L2CAP_CONF_PENDING) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003592 switch (rfc.mode) {
3593 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003594 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3595 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
3596 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003597 if (!test_bit(FLAG_EXT_CTRL, &chan->flags))
3598 chan->ack_win = min_t(u16, chan->ack_win,
3599 rfc.txwin_size);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003600
3601 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3602 chan->local_msdu = le16_to_cpu(efs.msdu);
3603 chan->local_sdu_itime =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003604 le32_to_cpu(efs.sdu_itime);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003605 chan->local_acc_lat = le32_to_cpu(efs.acc_lat);
3606 chan->local_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003607 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003608 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003609 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003610
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003611 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003612 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003613 }
3614 }
3615
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003616 req->dcid = cpu_to_le16(chan->dcid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003617 req->flags = cpu_to_le16(0);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003618
3619 return ptr - data;
3620}
3621
Gustavo Padovan2d792812012-10-06 10:07:01 +01003622static int l2cap_build_conf_rsp(struct l2cap_chan *chan, void *data,
3623 u16 result, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003624{
3625 struct l2cap_conf_rsp *rsp = data;
3626 void *ptr = rsp->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003627
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003628 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003629
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003630 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003631 rsp->result = cpu_to_le16(result);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003632 rsp->flags = cpu_to_le16(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003633
3634 return ptr - data;
3635}
3636
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003637void __l2cap_le_connect_rsp_defer(struct l2cap_chan *chan)
3638{
3639 struct l2cap_le_conn_rsp rsp;
3640 struct l2cap_conn *conn = chan->conn;
3641
3642 BT_DBG("chan %p", chan);
3643
3644 rsp.dcid = cpu_to_le16(chan->scid);
3645 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02003646 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03003647 rsp.credits = cpu_to_le16(chan->rx_credits);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003648 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003649
3650 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp),
3651 &rsp);
3652}
3653
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003654void __l2cap_connect_rsp_defer(struct l2cap_chan *chan)
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003655{
3656 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003657 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003658 u8 buf[128];
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003659 u8 rsp_code;
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003660
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003661 rsp.scid = cpu_to_le16(chan->dcid);
3662 rsp.dcid = cpu_to_le16(chan->scid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003663 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
3664 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003665
3666 if (chan->hs_hcon)
3667 rsp_code = L2CAP_CREATE_CHAN_RSP;
3668 else
3669 rsp_code = L2CAP_CONN_RSP;
3670
3671 BT_DBG("chan %p rsp_code %u", chan, rsp_code);
3672
3673 l2cap_send_cmd(conn, chan->ident, rsp_code, sizeof(rsp), &rsp);
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003674
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003675 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003676 return;
3677
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003678 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003679 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003680 chan->num_conf_req++;
3681}
3682
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003683static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len)
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003684{
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003685 int type, olen;
3686 unsigned long val;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003687 /* Use sane default values in case a misbehaving remote device
3688 * did not send an RFC or extended window size option.
3689 */
3690 u16 txwin_ext = chan->ack_win;
3691 struct l2cap_conf_rfc rfc = {
3692 .mode = chan->mode,
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003693 .retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO),
3694 .monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO),
Mat Martineauc20f8e32012-07-10 05:47:07 -07003695 .max_pdu_size = cpu_to_le16(chan->imtu),
3696 .txwin_size = min_t(u16, chan->ack_win, L2CAP_DEFAULT_TX_WINDOW),
3697 };
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003698
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003699 BT_DBG("chan %p, rsp %p, len %d", chan, rsp, len);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003700
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003701 if ((chan->mode != L2CAP_MODE_ERTM) && (chan->mode != L2CAP_MODE_STREAMING))
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003702 return;
3703
3704 while (len >= L2CAP_CONF_OPT_SIZE) {
3705 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3706
Mat Martineauc20f8e32012-07-10 05:47:07 -07003707 switch (type) {
3708 case L2CAP_CONF_RFC:
3709 if (olen == sizeof(rfc))
3710 memcpy(&rfc, (void *)val, olen);
Szymon Janc8f321f82012-06-08 11:33:33 +02003711 break;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003712 case L2CAP_CONF_EWS:
3713 txwin_ext = val;
3714 break;
3715 }
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003716 }
3717
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003718 switch (rfc.mode) {
3719 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003720 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3721 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003722 chan->mps = le16_to_cpu(rfc.max_pdu_size);
3723 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3724 chan->ack_win = min_t(u16, chan->ack_win, txwin_ext);
3725 else
3726 chan->ack_win = min_t(u16, chan->ack_win,
3727 rfc.txwin_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003728 break;
3729 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003730 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003731 }
3732}
3733
Gustavo Padovan2d792812012-10-06 10:07:01 +01003734static inline int l2cap_command_rej(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003735 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3736 u8 *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003737{
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003738 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003739
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003740 if (cmd_len < sizeof(*rej))
3741 return -EPROTO;
3742
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003743 if (rej->reason != L2CAP_REJ_NOT_UNDERSTOOD)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003744 return 0;
3745
3746 if ((conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003747 cmd->ident == conn->info_ident) {
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02003748 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann984947d2009-02-06 23:35:19 +01003749
3750 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01003751 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01003752
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003753 l2cap_conn_start(conn);
3754 }
3755
3756 return 0;
3757}
3758
Mat Martineau17009152012-10-23 15:24:07 -07003759static struct l2cap_chan *l2cap_connect(struct l2cap_conn *conn,
3760 struct l2cap_cmd_hdr *cmd,
3761 u8 *data, u8 rsp_code, u8 amp_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003762{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003763 struct l2cap_conn_req *req = (struct l2cap_conn_req *) data;
3764 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003765 struct l2cap_chan *chan = NULL, *pchan;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003766 int result, status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003767
3768 u16 dcid = 0, scid = __le16_to_cpu(req->scid);
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003769 __le16 psm = req->psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003770
Andrei Emeltchenko097db762012-03-09 14:16:17 +02003771 BT_DBG("psm 0x%2.2x scid 0x%4.4x", __le16_to_cpu(psm), scid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003772
3773 /* Check if we have socket listening on psm */
Marcel Holtmann6f59b902013-10-13 05:24:01 -07003774 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03003775 &conn->hcon->dst, ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003776 if (!pchan) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003777 result = L2CAP_CR_BAD_PSM;
3778 goto sendresp;
3779 }
3780
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003781 mutex_lock(&conn->chan_lock);
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003782 l2cap_chan_lock(pchan);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00003783
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003784 /* Check if the ACL is secure enough (if not SDP) */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003785 if (psm != cpu_to_le16(L2CAP_PSM_SDP) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003786 !hci_conn_check_link_mode(conn->hcon)) {
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02003787 conn->disc_reason = HCI_ERROR_AUTH_FAILURE;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003788 result = L2CAP_CR_SEC_BLOCK;
3789 goto response;
3790 }
3791
Linus Torvalds1da177e2005-04-16 15:20:36 -07003792 result = L2CAP_CR_NO_MEM;
3793
Gustavo Padovan2dfa1002012-05-27 22:27:58 -03003794 /* Check if we already have channel with that dcid */
3795 if (__l2cap_get_chan_by_dcid(conn, scid))
3796 goto response;
3797
Gustavo Padovan80b98022012-05-27 22:27:51 -03003798 chan = pchan->ops->new_connection(pchan);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03003799 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003800 goto response;
3801
Syam Sidhardhan330b6c12013-08-06 01:59:12 +09003802 /* For certain devices (ex: HID mouse), support for authentication,
3803 * pairing and bonding is optional. For such devices, inorder to avoid
3804 * the ACL alive for too long after L2CAP disconnection, reset the ACL
3805 * disc_timeout back to HCI_DISCONN_TIMEOUT during L2CAP connect.
3806 */
3807 conn->hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
3808
Marcel Holtmann7eafc592013-10-13 08:12:47 -07003809 bacpy(&chan->src, &conn->hcon->src);
3810 bacpy(&chan->dst, &conn->hcon->dst);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -07003811 chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type);
3812 chan->dst_type = bdaddr_type(conn->hcon, conn->hcon->dst_type);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003813 chan->psm = psm;
3814 chan->dcid = scid;
Mat Martineau17009152012-10-23 15:24:07 -07003815 chan->local_amp_id = amp_id;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003816
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003817 __l2cap_chan_add(conn, chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003818
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003819 dcid = chan->scid;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003820
Gustavo Padovan8d836d72013-10-15 19:24:47 -03003821 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003822
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003823 chan->ident = cmd->ident;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003824
Marcel Holtmann984947d2009-02-06 23:35:19 +01003825 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) {
Gustavo F. Padovand45fc422011-11-05 19:54:24 -02003826 if (l2cap_chan_check_security(chan)) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07003827 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003828 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003829 result = L2CAP_CR_PEND;
3830 status = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08003831 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003832 } else {
Mat Martineau17009152012-10-23 15:24:07 -07003833 /* Force pending result for AMP controllers.
3834 * The connection will succeed after the
3835 * physical link is up.
3836 */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003837 if (amp_id == AMP_ID_BREDR) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003838 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau17009152012-10-23 15:24:07 -07003839 result = L2CAP_CR_SUCCESS;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003840 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003841 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003842 result = L2CAP_CR_PEND;
Mat Martineau17009152012-10-23 15:24:07 -07003843 }
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003844 status = L2CAP_CS_NO_INFO;
3845 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003846 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003847 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003848 result = L2CAP_CR_PEND;
3849 status = L2CAP_CS_AUTHEN_PEND;
3850 }
3851 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003852 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003853 result = L2CAP_CR_PEND;
3854 status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003855 }
3856
Linus Torvalds1da177e2005-04-16 15:20:36 -07003857response:
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003858 l2cap_chan_unlock(pchan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003859 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003860
3861sendresp:
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003862 rsp.scid = cpu_to_le16(scid);
3863 rsp.dcid = cpu_to_le16(dcid);
3864 rsp.result = cpu_to_le16(result);
3865 rsp.status = cpu_to_le16(status);
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003866 l2cap_send_cmd(conn, cmd->ident, rsp_code, sizeof(rsp), &rsp);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003867
3868 if (result == L2CAP_CR_PEND && status == L2CAP_CS_NO_INFO) {
3869 struct l2cap_info_req info;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003870 info.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003871
3872 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
3873 conn->info_ident = l2cap_get_ident(conn);
3874
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08003875 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003876
Gustavo Padovan2d792812012-10-06 10:07:01 +01003877 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
3878 sizeof(info), &info);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003879 }
3880
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003881 if (chan && !test_bit(CONF_REQ_SENT, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003882 result == L2CAP_CR_SUCCESS) {
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003883 u8 buf[128];
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003884 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003885 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003886 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003887 chan->num_conf_req++;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003888 }
Mat Martineau17009152012-10-23 15:24:07 -07003889
3890 return chan;
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003891}
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003892
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003893static int l2cap_connect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003894 struct l2cap_cmd_hdr *cmd, u16 cmd_len, u8 *data)
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003895{
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303896 struct hci_dev *hdev = conn->hcon->hdev;
3897 struct hci_conn *hcon = conn->hcon;
3898
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003899 if (cmd_len < sizeof(struct l2cap_conn_req))
3900 return -EPROTO;
3901
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303902 hci_dev_lock(hdev);
3903 if (test_bit(HCI_MGMT, &hdev->dev_flags) &&
3904 !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &hcon->flags))
3905 mgmt_device_connected(hdev, &hcon->dst, hcon->type,
3906 hcon->dst_type, 0, NULL, 0,
3907 hcon->dev_class);
3908 hci_dev_unlock(hdev);
3909
Gustavo Padovan300229f2012-10-12 19:40:40 +08003910 l2cap_connect(conn, cmd, data, L2CAP_CONN_RSP, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003911 return 0;
3912}
3913
Mat Martineau5909cf32012-10-23 15:24:08 -07003914static int l2cap_connect_create_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003915 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3916 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003917{
3918 struct l2cap_conn_rsp *rsp = (struct l2cap_conn_rsp *) data;
3919 u16 scid, dcid, result, status;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003920 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003921 u8 req[128];
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003922 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003923
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003924 if (cmd_len < sizeof(*rsp))
3925 return -EPROTO;
3926
Linus Torvalds1da177e2005-04-16 15:20:36 -07003927 scid = __le16_to_cpu(rsp->scid);
3928 dcid = __le16_to_cpu(rsp->dcid);
3929 result = __le16_to_cpu(rsp->result);
3930 status = __le16_to_cpu(rsp->status);
3931
Andrei Emeltchenko1b009c92012-02-21 12:54:54 +02003932 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 +01003933 dcid, scid, result, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003934
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003935 mutex_lock(&conn->chan_lock);
3936
Linus Torvalds1da177e2005-04-16 15:20:36 -07003937 if (scid) {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003938 chan = __l2cap_get_chan_by_scid(conn, scid);
3939 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003940 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003941 goto unlock;
3942 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003943 } else {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003944 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
3945 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003946 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003947 goto unlock;
3948 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003949 }
3950
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003951 err = 0;
3952
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003953 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003954
Linus Torvalds1da177e2005-04-16 15:20:36 -07003955 switch (result) {
3956 case L2CAP_CR_SUCCESS:
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03003957 l2cap_state_change(chan, BT_CONFIG);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003958 chan->ident = 0;
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003959 chan->dcid = dcid;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003960 clear_bit(CONF_CONNECT_PEND, &chan->conf_state);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01003961
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003962 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003963 break;
3964
Linus Torvalds1da177e2005-04-16 15:20:36 -07003965 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003966 l2cap_build_conf_req(chan, req), req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003967 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003968 break;
3969
3970 case L2CAP_CR_PEND:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003971 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003972 break;
3973
3974 default:
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003975 l2cap_chan_del(chan, ECONNREFUSED);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003976 break;
3977 }
3978
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003979 l2cap_chan_unlock(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003980
3981unlock:
3982 mutex_unlock(&conn->chan_lock);
3983
3984 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003985}
3986
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003987static inline void set_default_fcs(struct l2cap_chan *chan)
Mat Martineau8c462b62010-08-24 15:35:42 -07003988{
3989 /* FCS is enabled only in ERTM or streaming mode, if one or both
3990 * sides request it.
3991 */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003992 if (chan->mode != L2CAP_MODE_ERTM && chan->mode != L2CAP_MODE_STREAMING)
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003993 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003994 else if (!test_bit(CONF_RECV_NO_FCS, &chan->conf_state))
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003995 chan->fcs = L2CAP_FCS_CRC16;
Mat Martineau8c462b62010-08-24 15:35:42 -07003996}
3997
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03003998static void l2cap_send_efs_conf_rsp(struct l2cap_chan *chan, void *data,
3999 u8 ident, u16 flags)
4000{
4001 struct l2cap_conn *conn = chan->conn;
4002
4003 BT_DBG("conn %p chan %p ident %d flags 0x%4.4x", conn, chan, ident,
4004 flags);
4005
4006 clear_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
4007 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
4008
4009 l2cap_send_cmd(conn, ident, L2CAP_CONF_RSP,
4010 l2cap_build_conf_rsp(chan, data,
4011 L2CAP_CONF_SUCCESS, flags), data);
4012}
4013
Johan Hedberg662d6522013-10-16 11:20:47 +03004014static void cmd_reject_invalid_cid(struct l2cap_conn *conn, u8 ident,
4015 u16 scid, u16 dcid)
4016{
4017 struct l2cap_cmd_rej_cid rej;
4018
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004019 rej.reason = cpu_to_le16(L2CAP_REJ_INVALID_CID);
Johan Hedberg662d6522013-10-16 11:20:47 +03004020 rej.scid = __cpu_to_le16(scid);
4021 rej.dcid = __cpu_to_le16(dcid);
4022
4023 l2cap_send_cmd(conn, ident, L2CAP_COMMAND_REJ, sizeof(rej), &rej);
4024}
4025
Gustavo Padovan2d792812012-10-06 10:07:01 +01004026static inline int l2cap_config_req(struct l2cap_conn *conn,
4027 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4028 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004029{
4030 struct l2cap_conf_req *req = (struct l2cap_conf_req *) data;
4031 u16 dcid, flags;
4032 u8 rsp[64];
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004033 struct l2cap_chan *chan;
Mat Martineau3c588192012-04-11 10:48:42 -07004034 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004035
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004036 if (cmd_len < sizeof(*req))
4037 return -EPROTO;
4038
Linus Torvalds1da177e2005-04-16 15:20:36 -07004039 dcid = __le16_to_cpu(req->dcid);
4040 flags = __le16_to_cpu(req->flags);
4041
4042 BT_DBG("dcid 0x%4.4x flags 0x%2.2x", dcid, flags);
4043
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004044 chan = l2cap_get_chan_by_scid(conn, dcid);
Johan Hedberg662d6522013-10-16 11:20:47 +03004045 if (!chan) {
4046 cmd_reject_invalid_cid(conn, cmd->ident, dcid, 0);
4047 return 0;
4048 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004049
David S. Miller033b1142011-07-21 13:38:42 -07004050 if (chan->state != BT_CONFIG && chan->state != BT_CONNECT2) {
Johan Hedberg662d6522013-10-16 11:20:47 +03004051 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4052 chan->dcid);
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004053 goto unlock;
Gustavo F. Padovandf6bd742010-06-14 02:26:15 -03004054 }
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004055
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004056 /* Reject if config buffer is too small. */
Al Viro88219a02007-07-29 00:17:25 -07004057 len = cmd_len - sizeof(*req);
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004058 if (chan->conf_len + len > sizeof(chan->conf_req)) {
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004059 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004060 l2cap_build_conf_rsp(chan, rsp,
4061 L2CAP_CONF_REJECT, flags), rsp);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004062 goto unlock;
4063 }
4064
4065 /* Store config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004066 memcpy(chan->conf_req + chan->conf_len, req->data, len);
4067 chan->conf_len += len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004068
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004069 if (flags & L2CAP_CONF_FLAG_CONTINUATION) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004070 /* Incomplete config. Send empty response. */
4071 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004072 l2cap_build_conf_rsp(chan, rsp,
4073 L2CAP_CONF_SUCCESS, flags), rsp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004074 goto unlock;
4075 }
4076
4077 /* Complete config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004078 len = l2cap_parse_conf_req(chan, rsp);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004079 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004080 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004081 goto unlock;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004082 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004083
Mat Martineau1500109b2012-10-23 15:24:15 -07004084 chan->ident = cmd->ident;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004085 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004086 chan->num_conf_rsp++;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004087
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004088 /* Reset config buffer. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004089 chan->conf_len = 0;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004090
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004091 if (!test_bit(CONF_OUTPUT_DONE, &chan->conf_state))
Marcel Holtmann876d9482007-10-20 13:35:42 +02004092 goto unlock;
4093
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004094 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004095 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004096
Mat Martineau105bdf92012-04-27 16:50:48 -07004097 if (chan->mode == L2CAP_MODE_ERTM ||
4098 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004099 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004100
Mat Martineau3c588192012-04-11 10:48:42 -07004101 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004102 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004103 else
4104 l2cap_chan_ready(chan);
4105
Marcel Holtmann876d9482007-10-20 13:35:42 +02004106 goto unlock;
4107 }
4108
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004109 if (!test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02004110 u8 buf[64];
Linus Torvalds1da177e2005-04-16 15:20:36 -07004111 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004112 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004113 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004114 }
4115
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004116 /* Got Conf Rsp PENDING from remote side and asume we sent
4117 Conf Rsp PENDING in the code above */
4118 if (test_bit(CONF_REM_CONF_PEND, &chan->conf_state) &&
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03004119 test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004120
4121 /* check compatibility */
4122
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004123 /* Send rsp for BR/EDR channel */
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004124 if (!chan->hs_hcon)
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004125 l2cap_send_efs_conf_rsp(chan, rsp, cmd->ident, flags);
4126 else
4127 chan->ident = cmd->ident;
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004128 }
4129
Linus Torvalds1da177e2005-04-16 15:20:36 -07004130unlock:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004131 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004132 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004133}
4134
Gustavo Padovan2d792812012-10-06 10:07:01 +01004135static inline int l2cap_config_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004136 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4137 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004138{
4139 struct l2cap_conf_rsp *rsp = (struct l2cap_conf_rsp *)data;
4140 u16 scid, flags, result;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004141 struct l2cap_chan *chan;
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004142 int len = cmd_len - sizeof(*rsp);
Mat Martineau3c588192012-04-11 10:48:42 -07004143 int err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004144
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004145 if (cmd_len < sizeof(*rsp))
4146 return -EPROTO;
4147
Linus Torvalds1da177e2005-04-16 15:20:36 -07004148 scid = __le16_to_cpu(rsp->scid);
4149 flags = __le16_to_cpu(rsp->flags);
4150 result = __le16_to_cpu(rsp->result);
4151
Andrei Emeltchenko61386cb2012-03-12 12:13:07 +02004152 BT_DBG("scid 0x%4.4x flags 0x%2.2x result 0x%2.2x len %d", scid, flags,
4153 result, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004154
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004155 chan = l2cap_get_chan_by_scid(conn, scid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004156 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004157 return 0;
4158
4159 switch (result) {
4160 case L2CAP_CONF_SUCCESS:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004161 l2cap_conf_rfc_get(chan, rsp->data, len);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004162 clear_bit(CONF_REM_CONF_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004163 break;
4164
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004165 case L2CAP_CONF_PENDING:
4166 set_bit(CONF_REM_CONF_PEND, &chan->conf_state);
4167
4168 if (test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
4169 char buf[64];
4170
4171 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004172 buf, &result);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004173 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004174 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004175 goto done;
4176 }
4177
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004178 if (!chan->hs_hcon) {
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004179 l2cap_send_efs_conf_rsp(chan, buf, cmd->ident,
4180 0);
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02004181 } else {
4182 if (l2cap_check_efs(chan)) {
4183 amp_create_logical_link(chan);
4184 chan->ident = cmd->ident;
4185 }
4186 }
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004187 }
4188 goto done;
4189
Linus Torvalds1da177e2005-04-16 15:20:36 -07004190 case L2CAP_CONF_UNACCEPT:
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004191 if (chan->num_conf_rsp <= L2CAP_CONF_MAX_CONF_RSP) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004192 char req[64];
4193
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004194 if (len > sizeof(req) - sizeof(struct l2cap_conf_req)) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004195 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004196 goto done;
4197 }
4198
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004199 /* throw out any old stored conf requests */
4200 result = L2CAP_CONF_SUCCESS;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03004201 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004202 req, &result);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004203 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004204 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004205 goto done;
4206 }
4207
4208 l2cap_send_cmd(conn, l2cap_get_ident(conn),
Gustavo Padovan2d792812012-10-06 10:07:01 +01004209 L2CAP_CONF_REQ, len, req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004210 chan->num_conf_req++;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004211 if (result != L2CAP_CONF_SUCCESS)
4212 goto done;
4213 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004214 }
4215
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09004216 default:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004217 l2cap_chan_set_err(chan, ECONNRESET);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +02004218
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08004219 __set_chan_timer(chan, L2CAP_DISC_REJ_TIMEOUT);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004220 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004221 goto done;
4222 }
4223
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004224 if (flags & L2CAP_CONF_FLAG_CONTINUATION)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004225 goto done;
4226
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004227 set_bit(CONF_INPUT_DONE, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004228
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004229 if (test_bit(CONF_OUTPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004230 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004231
Mat Martineau105bdf92012-04-27 16:50:48 -07004232 if (chan->mode == L2CAP_MODE_ERTM ||
4233 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004234 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004235
Mat Martineau3c588192012-04-11 10:48:42 -07004236 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004237 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004238 else
4239 l2cap_chan_ready(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004240 }
4241
4242done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004243 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004244 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004245}
4246
Gustavo Padovan2d792812012-10-06 10:07:01 +01004247static inline int l2cap_disconnect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004248 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4249 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004250{
4251 struct l2cap_disconn_req *req = (struct l2cap_disconn_req *) data;
4252 struct l2cap_disconn_rsp rsp;
4253 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004254 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004255
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004256 if (cmd_len != sizeof(*req))
4257 return -EPROTO;
4258
Linus Torvalds1da177e2005-04-16 15:20:36 -07004259 scid = __le16_to_cpu(req->scid);
4260 dcid = __le16_to_cpu(req->dcid);
4261
4262 BT_DBG("scid 0x%4.4x dcid 0x%4.4x", scid, dcid);
4263
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004264 mutex_lock(&conn->chan_lock);
4265
4266 chan = __l2cap_get_chan_by_scid(conn, dcid);
4267 if (!chan) {
4268 mutex_unlock(&conn->chan_lock);
Johan Hedberg662d6522013-10-16 11:20:47 +03004269 cmd_reject_invalid_cid(conn, cmd->ident, dcid, scid);
4270 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004271 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004272
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004273 l2cap_chan_lock(chan);
4274
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03004275 rsp.dcid = cpu_to_le16(chan->scid);
4276 rsp.scid = cpu_to_le16(chan->dcid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004277 l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp);
4278
Gustavo Padovan5ec1bbe2013-10-15 19:24:48 -03004279 chan->ops->set_shutdown(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004280
Mat Martineau61d6ef32012-04-27 16:50:50 -07004281 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004282 l2cap_chan_del(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004283
4284 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004285
Gustavo Padovan80b98022012-05-27 22:27:51 -03004286 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004287 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004288
4289 mutex_unlock(&conn->chan_lock);
4290
Linus Torvalds1da177e2005-04-16 15:20:36 -07004291 return 0;
4292}
4293
Gustavo Padovan2d792812012-10-06 10:07:01 +01004294static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004295 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4296 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004297{
4298 struct l2cap_disconn_rsp *rsp = (struct l2cap_disconn_rsp *) data;
4299 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004300 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004301
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004302 if (cmd_len != sizeof(*rsp))
4303 return -EPROTO;
4304
Linus Torvalds1da177e2005-04-16 15:20:36 -07004305 scid = __le16_to_cpu(rsp->scid);
4306 dcid = __le16_to_cpu(rsp->dcid);
4307
4308 BT_DBG("dcid 0x%4.4x scid 0x%4.4x", dcid, scid);
4309
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004310 mutex_lock(&conn->chan_lock);
4311
4312 chan = __l2cap_get_chan_by_scid(conn, scid);
4313 if (!chan) {
4314 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004315 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004316 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004317
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004318 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004319
Mat Martineau61d6ef32012-04-27 16:50:50 -07004320 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004321 l2cap_chan_del(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004322
4323 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004324
Gustavo Padovan80b98022012-05-27 22:27:51 -03004325 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004326 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004327
4328 mutex_unlock(&conn->chan_lock);
4329
Linus Torvalds1da177e2005-04-16 15:20:36 -07004330 return 0;
4331}
4332
Gustavo Padovan2d792812012-10-06 10:07:01 +01004333static inline int l2cap_information_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004334 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4335 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004336{
4337 struct l2cap_info_req *req = (struct l2cap_info_req *) data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004338 u16 type;
4339
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004340 if (cmd_len != sizeof(*req))
4341 return -EPROTO;
4342
Linus Torvalds1da177e2005-04-16 15:20:36 -07004343 type = __le16_to_cpu(req->type);
4344
4345 BT_DBG("type 0x%4.4x", type);
4346
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004347 if (type == L2CAP_IT_FEAT_MASK) {
4348 u8 buf[8];
Marcel Holtmann44dd46d2009-05-02 19:09:01 -07004349 u32 feat_mask = l2cap_feat_mask;
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004350 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004351 rsp->type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
4352 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03004353 if (!disable_ertm)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004354 feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING
Gustavo Padovan2d792812012-10-06 10:07:01 +01004355 | L2CAP_FEAT_FCS;
Marcel Holtmann848566b2013-10-01 22:59:22 -07004356 if (conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03004357 feat_mask |= L2CAP_FEAT_EXT_FLOW
Gustavo Padovan2d792812012-10-06 10:07:01 +01004358 | L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenkoa5fd6f32011-09-16 16:26:32 +03004359
Gustavo F. Padovan1b7bf4e2009-08-24 00:45:20 -03004360 put_unaligned_le32(feat_mask, rsp->data);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004361 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4362 buf);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004363 } else if (type == L2CAP_IT_FIXED_CHAN) {
4364 u8 buf[12];
4365 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Mat Martineau50a147c2011-11-02 16:18:34 -07004366
Marcel Holtmann848566b2013-10-01 22:59:22 -07004367 if (conn->hs_enabled)
Mat Martineau50a147c2011-11-02 16:18:34 -07004368 l2cap_fixed_chan[0] |= L2CAP_FC_A2MP;
4369 else
4370 l2cap_fixed_chan[0] &= ~L2CAP_FC_A2MP;
4371
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004372 rsp->type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
4373 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Andrei Emeltchenkoc6337ea2011-10-20 17:02:44 +03004374 memcpy(rsp->data, l2cap_fixed_chan, sizeof(l2cap_fixed_chan));
Gustavo Padovan2d792812012-10-06 10:07:01 +01004375 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4376 buf);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004377 } else {
4378 struct l2cap_info_rsp rsp;
4379 rsp.type = cpu_to_le16(type);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004380 rsp.result = cpu_to_le16(L2CAP_IR_NOTSUPP);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004381 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(rsp),
4382 &rsp);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004383 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004384
4385 return 0;
4386}
4387
Gustavo Padovan2d792812012-10-06 10:07:01 +01004388static inline int l2cap_information_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004389 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4390 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004391{
4392 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) data;
4393 u16 type, result;
4394
Jaganath Kanakkassery3f6fa3d2013-06-21 19:55:11 +05304395 if (cmd_len < sizeof(*rsp))
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004396 return -EPROTO;
4397
Linus Torvalds1da177e2005-04-16 15:20:36 -07004398 type = __le16_to_cpu(rsp->type);
4399 result = __le16_to_cpu(rsp->result);
4400
4401 BT_DBG("type 0x%4.4x result 0x%2.2x", type, result);
4402
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004403 /* L2CAP Info req/rsp are unbound to channels, add extra checks */
4404 if (cmd->ident != conn->info_ident ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01004405 conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004406 return 0;
4407
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02004408 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004409
Ville Tervoadb08ed2010-08-04 09:43:33 +03004410 if (result != L2CAP_IR_SUCCESS) {
4411 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4412 conn->info_ident = 0;
4413
4414 l2cap_conn_start(conn);
4415
4416 return 0;
4417 }
4418
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004419 switch (type) {
4420 case L2CAP_IT_FEAT_MASK:
Harvey Harrison83985312008-05-02 16:25:46 -07004421 conn->feat_mask = get_unaligned_le32(rsp->data);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004422
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07004423 if (conn->feat_mask & L2CAP_FEAT_FIXED_CHAN) {
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004424 struct l2cap_info_req req;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004425 req.type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004426
4427 conn->info_ident = l2cap_get_ident(conn);
4428
4429 l2cap_send_cmd(conn, conn->info_ident,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004430 L2CAP_INFO_REQ, sizeof(req), &req);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004431 } else {
4432 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4433 conn->info_ident = 0;
4434
4435 l2cap_conn_start(conn);
4436 }
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004437 break;
4438
4439 case L2CAP_IT_FIXED_CHAN:
4440 conn->fixed_chan_mask = rsp->data[0];
Marcel Holtmann984947d2009-02-06 23:35:19 +01004441 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004442 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004443
4444 l2cap_conn_start(conn);
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004445 break;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004446 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004447
Linus Torvalds1da177e2005-04-16 15:20:36 -07004448 return 0;
4449}
4450
Mat Martineau17009152012-10-23 15:24:07 -07004451static int l2cap_create_channel_req(struct l2cap_conn *conn,
4452 struct l2cap_cmd_hdr *cmd,
4453 u16 cmd_len, void *data)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004454{
4455 struct l2cap_create_chan_req *req = data;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004456 struct l2cap_create_chan_rsp rsp;
Mat Martineau17009152012-10-23 15:24:07 -07004457 struct l2cap_chan *chan;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004458 struct hci_dev *hdev;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004459 u16 psm, scid;
4460
4461 if (cmd_len != sizeof(*req))
4462 return -EPROTO;
4463
Marcel Holtmann848566b2013-10-01 22:59:22 -07004464 if (!conn->hs_enabled)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004465 return -EINVAL;
4466
4467 psm = le16_to_cpu(req->psm);
4468 scid = le16_to_cpu(req->scid);
4469
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004470 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 -07004471
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004472 /* For controller id 0 make BR/EDR connection */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004473 if (req->amp_id == AMP_ID_BREDR) {
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004474 l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4475 req->amp_id);
4476 return 0;
4477 }
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004478
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004479 /* Validate AMP controller id */
4480 hdev = hci_dev_get(req->amp_id);
4481 if (!hdev)
4482 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004483
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004484 if (hdev->dev_type != HCI_AMP || !test_bit(HCI_UP, &hdev->flags)) {
Mat Martineau17009152012-10-23 15:24:07 -07004485 hci_dev_put(hdev);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004486 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004487 }
4488
4489 chan = l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4490 req->amp_id);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004491 if (chan) {
4492 struct amp_mgr *mgr = conn->hcon->amp_mgr;
4493 struct hci_conn *hs_hcon;
4494
Marcel Holtmann98e0f7e2013-10-13 02:23:40 -07004495 hs_hcon = hci_conn_hash_lookup_ba(hdev, AMP_LINK,
4496 &conn->hcon->dst);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004497 if (!hs_hcon) {
4498 hci_dev_put(hdev);
Johan Hedberg662d6522013-10-16 11:20:47 +03004499 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4500 chan->dcid);
4501 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004502 }
4503
4504 BT_DBG("mgr %p bredr_chan %p hs_hcon %p", mgr, chan, hs_hcon);
4505
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004506 mgr->bredr_chan = chan;
4507 chan->hs_hcon = hs_hcon;
Andrei Emeltchenkofd45bf42012-11-20 17:16:22 +02004508 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004509 conn->mtu = hdev->block_mtu;
4510 }
4511
4512 hci_dev_put(hdev);
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004513
4514 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004515
4516error:
4517 rsp.dcid = 0;
4518 rsp.scid = cpu_to_le16(scid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004519 rsp.result = cpu_to_le16(L2CAP_CR_BAD_AMP);
4520 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004521
4522 l2cap_send_cmd(conn, cmd->ident, L2CAP_CREATE_CHAN_RSP,
4523 sizeof(rsp), &rsp);
4524
Johan Hedbergdc280802013-09-16 13:05:13 +03004525 return 0;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004526}
4527
Mat Martineau8eb200b2012-10-23 15:24:17 -07004528static void l2cap_send_move_chan_req(struct l2cap_chan *chan, u8 dest_amp_id)
4529{
4530 struct l2cap_move_chan_req req;
4531 u8 ident;
4532
4533 BT_DBG("chan %p, dest_amp_id %d", chan, dest_amp_id);
4534
4535 ident = l2cap_get_ident(chan->conn);
4536 chan->ident = ident;
4537
4538 req.icid = cpu_to_le16(chan->scid);
4539 req.dest_amp_id = dest_amp_id;
4540
4541 l2cap_send_cmd(chan->conn, ident, L2CAP_MOVE_CHAN_REQ, sizeof(req),
4542 &req);
4543
4544 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4545}
4546
Mat Martineau1500109b2012-10-23 15:24:15 -07004547static void l2cap_send_move_chan_rsp(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004548{
4549 struct l2cap_move_chan_rsp rsp;
4550
Mat Martineau1500109b2012-10-23 15:24:15 -07004551 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004552
Mat Martineau1500109b2012-10-23 15:24:15 -07004553 rsp.icid = cpu_to_le16(chan->dcid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004554 rsp.result = cpu_to_le16(result);
4555
Mat Martineau1500109b2012-10-23 15:24:15 -07004556 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_RSP,
4557 sizeof(rsp), &rsp);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004558}
4559
Mat Martineau5b155ef2012-10-23 15:24:14 -07004560static void l2cap_send_move_chan_cfm(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004561{
4562 struct l2cap_move_chan_cfm cfm;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004563
Mat Martineau5b155ef2012-10-23 15:24:14 -07004564 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004565
Mat Martineau5b155ef2012-10-23 15:24:14 -07004566 chan->ident = l2cap_get_ident(chan->conn);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004567
Mat Martineau5b155ef2012-10-23 15:24:14 -07004568 cfm.icid = cpu_to_le16(chan->scid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004569 cfm.result = cpu_to_le16(result);
4570
Mat Martineau5b155ef2012-10-23 15:24:14 -07004571 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_CFM,
4572 sizeof(cfm), &cfm);
4573
4574 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4575}
4576
4577static void l2cap_send_move_chan_cfm_icid(struct l2cap_conn *conn, u16 icid)
4578{
4579 struct l2cap_move_chan_cfm cfm;
4580
4581 BT_DBG("conn %p, icid 0x%4.4x", conn, icid);
4582
4583 cfm.icid = cpu_to_le16(icid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004584 cfm.result = cpu_to_le16(L2CAP_MC_UNCONFIRMED);
Mat Martineau5b155ef2012-10-23 15:24:14 -07004585
4586 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_MOVE_CHAN_CFM,
4587 sizeof(cfm), &cfm);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004588}
4589
4590static void l2cap_send_move_chan_cfm_rsp(struct l2cap_conn *conn, u8 ident,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004591 u16 icid)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004592{
4593 struct l2cap_move_chan_cfm_rsp rsp;
4594
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004595 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004596
4597 rsp.icid = cpu_to_le16(icid);
4598 l2cap_send_cmd(conn, ident, L2CAP_MOVE_CHAN_CFM_RSP, sizeof(rsp), &rsp);
4599}
4600
Mat Martineau5f3847a2012-10-23 15:24:12 -07004601static void __release_logical_link(struct l2cap_chan *chan)
4602{
4603 chan->hs_hchan = NULL;
4604 chan->hs_hcon = NULL;
4605
4606 /* Placeholder - release the logical link */
4607}
4608
Mat Martineau1500109b2012-10-23 15:24:15 -07004609static void l2cap_logical_fail(struct l2cap_chan *chan)
4610{
4611 /* Logical link setup failed */
4612 if (chan->state != BT_CONNECTED) {
4613 /* Create channel failure, disconnect */
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004614 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineau1500109b2012-10-23 15:24:15 -07004615 return;
4616 }
4617
4618 switch (chan->move_role) {
4619 case L2CAP_MOVE_ROLE_RESPONDER:
4620 l2cap_move_done(chan);
4621 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_SUPP);
4622 break;
4623 case L2CAP_MOVE_ROLE_INITIATOR:
4624 if (chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_COMP ||
4625 chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_CFM) {
4626 /* Remote has only sent pending or
4627 * success responses, clean up
4628 */
4629 l2cap_move_done(chan);
4630 }
4631
4632 /* Other amp move states imply that the move
4633 * has already aborted
4634 */
4635 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
4636 break;
4637 }
4638}
4639
4640static void l2cap_logical_finish_create(struct l2cap_chan *chan,
4641 struct hci_chan *hchan)
4642{
4643 struct l2cap_conf_rsp rsp;
Mat Martineau1500109b2012-10-23 15:24:15 -07004644
Andrei Emeltchenko336178a2012-10-31 15:46:27 +02004645 chan->hs_hchan = hchan;
Mat Martineau1500109b2012-10-23 15:24:15 -07004646 chan->hs_hcon->l2cap_data = chan->conn;
4647
Andrei Emeltchenko35ba9562012-10-25 15:20:43 +03004648 l2cap_send_efs_conf_rsp(chan, &rsp, chan->ident, 0);
Mat Martineau1500109b2012-10-23 15:24:15 -07004649
4650 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Andrei Emeltchenkofe79c6f2012-10-25 15:20:42 +03004651 int err;
Mat Martineau1500109b2012-10-23 15:24:15 -07004652
4653 set_default_fcs(chan);
4654
4655 err = l2cap_ertm_init(chan);
4656 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004657 l2cap_send_disconn_req(chan, -err);
Mat Martineau1500109b2012-10-23 15:24:15 -07004658 else
4659 l2cap_chan_ready(chan);
4660 }
4661}
4662
4663static void l2cap_logical_finish_move(struct l2cap_chan *chan,
4664 struct hci_chan *hchan)
4665{
4666 chan->hs_hcon = hchan->conn;
4667 chan->hs_hcon->l2cap_data = chan->conn;
4668
4669 BT_DBG("move_state %d", chan->move_state);
4670
4671 switch (chan->move_state) {
4672 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
4673 /* Move confirm will be sent after a success
4674 * response is received
4675 */
4676 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4677 break;
4678 case L2CAP_MOVE_WAIT_LOGICAL_CFM:
4679 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4680 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4681 } else if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
4682 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
4683 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
4684 } else if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4685 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4686 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4687 }
4688 break;
4689 default:
4690 /* Move was not in expected state, free the channel */
4691 __release_logical_link(chan);
4692
4693 chan->move_state = L2CAP_MOVE_STABLE;
4694 }
4695}
4696
4697/* Call with chan locked */
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004698void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan,
4699 u8 status)
Mat Martineau5b155ef2012-10-23 15:24:14 -07004700{
Mat Martineau1500109b2012-10-23 15:24:15 -07004701 BT_DBG("chan %p, hchan %p, status %d", chan, hchan, status);
4702
4703 if (status) {
4704 l2cap_logical_fail(chan);
4705 __release_logical_link(chan);
4706 return;
4707 }
4708
4709 if (chan->state != BT_CONNECTED) {
4710 /* Ignore logical link if channel is on BR/EDR */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004711 if (chan->local_amp_id != AMP_ID_BREDR)
Mat Martineau1500109b2012-10-23 15:24:15 -07004712 l2cap_logical_finish_create(chan, hchan);
4713 } else {
4714 l2cap_logical_finish_move(chan, hchan);
4715 }
Mat Martineau5b155ef2012-10-23 15:24:14 -07004716}
4717
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004718void l2cap_move_start(struct l2cap_chan *chan)
4719{
4720 BT_DBG("chan %p", chan);
4721
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004722 if (chan->local_amp_id == AMP_ID_BREDR) {
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004723 if (chan->chan_policy != BT_CHANNEL_POLICY_AMP_PREFERRED)
4724 return;
4725 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4726 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4727 /* Placeholder - start physical link setup */
4728 } else {
4729 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4730 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4731 chan->move_id = 0;
4732 l2cap_move_setup(chan);
4733 l2cap_send_move_chan_req(chan, 0);
4734 }
4735}
4736
Mat Martineau8eb200b2012-10-23 15:24:17 -07004737static void l2cap_do_create(struct l2cap_chan *chan, int result,
4738 u8 local_amp_id, u8 remote_amp_id)
4739{
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004740 BT_DBG("chan %p state %s %u -> %u", chan, state_to_string(chan->state),
4741 local_amp_id, remote_amp_id);
4742
Andrei Emeltchenko12d6cc62012-11-14 17:39:31 +02004743 chan->fcs = L2CAP_FCS_NONE;
4744
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004745 /* Outgoing channel on AMP */
4746 if (chan->state == BT_CONNECT) {
4747 if (result == L2CAP_CR_SUCCESS) {
4748 chan->local_amp_id = local_amp_id;
4749 l2cap_send_create_chan_req(chan, remote_amp_id);
4750 } else {
4751 /* Revert to BR/EDR connect */
4752 l2cap_send_conn_req(chan);
4753 }
4754
4755 return;
4756 }
4757
4758 /* Incoming channel on AMP */
4759 if (__l2cap_no_conn_pending(chan)) {
Mat Martineau8eb200b2012-10-23 15:24:17 -07004760 struct l2cap_conn_rsp rsp;
4761 char buf[128];
4762 rsp.scid = cpu_to_le16(chan->dcid);
4763 rsp.dcid = cpu_to_le16(chan->scid);
4764
Mat Martineau8eb200b2012-10-23 15:24:17 -07004765 if (result == L2CAP_CR_SUCCESS) {
4766 /* Send successful response */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004767 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
4768 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004769 } else {
4770 /* Send negative response */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004771 rsp.result = cpu_to_le16(L2CAP_CR_NO_MEM);
4772 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004773 }
4774
4775 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_RSP,
4776 sizeof(rsp), &rsp);
4777
4778 if (result == L2CAP_CR_SUCCESS) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02004779 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004780 set_bit(CONF_REQ_SENT, &chan->conf_state);
4781 l2cap_send_cmd(chan->conn, l2cap_get_ident(chan->conn),
4782 L2CAP_CONF_REQ,
4783 l2cap_build_conf_req(chan, buf), buf);
4784 chan->num_conf_req++;
4785 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004786 }
4787}
4788
4789static void l2cap_do_move_initiate(struct l2cap_chan *chan, u8 local_amp_id,
4790 u8 remote_amp_id)
4791{
4792 l2cap_move_setup(chan);
4793 chan->move_id = local_amp_id;
4794 chan->move_state = L2CAP_MOVE_WAIT_RSP;
4795
4796 l2cap_send_move_chan_req(chan, remote_amp_id);
4797}
4798
4799static void l2cap_do_move_respond(struct l2cap_chan *chan, int result)
4800{
4801 struct hci_chan *hchan = NULL;
4802
4803 /* Placeholder - get hci_chan for logical link */
4804
4805 if (hchan) {
4806 if (hchan->state == BT_CONNECTED) {
4807 /* Logical link is ready to go */
4808 chan->hs_hcon = hchan->conn;
4809 chan->hs_hcon->l2cap_data = chan->conn;
4810 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4811 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4812
4813 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
4814 } else {
4815 /* Wait for logical link to be ready */
4816 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4817 }
4818 } else {
4819 /* Logical link not available */
4820 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_ALLOWED);
4821 }
4822}
4823
4824static void l2cap_do_move_cancel(struct l2cap_chan *chan, int result)
4825{
4826 if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4827 u8 rsp_result;
4828 if (result == -EINVAL)
4829 rsp_result = L2CAP_MR_BAD_ID;
4830 else
4831 rsp_result = L2CAP_MR_NOT_ALLOWED;
4832
4833 l2cap_send_move_chan_rsp(chan, rsp_result);
4834 }
4835
4836 chan->move_role = L2CAP_MOVE_ROLE_NONE;
4837 chan->move_state = L2CAP_MOVE_STABLE;
4838
4839 /* Restart data transmission */
4840 l2cap_ertm_send(chan);
4841}
4842
Andrei Emeltchenkoa514b172012-11-14 17:39:30 +02004843/* Invoke with locked chan */
4844void __l2cap_physical_cfm(struct l2cap_chan *chan, int result)
Mat Martineau8eb200b2012-10-23 15:24:17 -07004845{
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004846 u8 local_amp_id = chan->local_amp_id;
Andrei Emeltchenkofffadc02012-11-01 15:37:03 +02004847 u8 remote_amp_id = chan->remote_amp_id;
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004848
Mat Martineau8eb200b2012-10-23 15:24:17 -07004849 BT_DBG("chan %p, result %d, local_amp_id %d, remote_amp_id %d",
4850 chan, result, local_amp_id, remote_amp_id);
4851
Mat Martineau8eb200b2012-10-23 15:24:17 -07004852 if (chan->state == BT_DISCONN || chan->state == BT_CLOSED) {
4853 l2cap_chan_unlock(chan);
4854 return;
4855 }
4856
4857 if (chan->state != BT_CONNECTED) {
4858 l2cap_do_create(chan, result, local_amp_id, remote_amp_id);
4859 } else if (result != L2CAP_MR_SUCCESS) {
4860 l2cap_do_move_cancel(chan, result);
4861 } else {
4862 switch (chan->move_role) {
4863 case L2CAP_MOVE_ROLE_INITIATOR:
4864 l2cap_do_move_initiate(chan, local_amp_id,
4865 remote_amp_id);
4866 break;
4867 case L2CAP_MOVE_ROLE_RESPONDER:
4868 l2cap_do_move_respond(chan, result);
4869 break;
4870 default:
4871 l2cap_do_move_cancel(chan, result);
4872 break;
4873 }
4874 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004875}
4876
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004877static inline int l2cap_move_channel_req(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004878 struct l2cap_cmd_hdr *cmd,
4879 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004880{
4881 struct l2cap_move_chan_req *req = data;
Mat Martineau1500109b2012-10-23 15:24:15 -07004882 struct l2cap_move_chan_rsp rsp;
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004883 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004884 u16 icid = 0;
4885 u16 result = L2CAP_MR_NOT_ALLOWED;
4886
4887 if (cmd_len != sizeof(*req))
4888 return -EPROTO;
4889
4890 icid = le16_to_cpu(req->icid);
4891
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004892 BT_DBG("icid 0x%4.4x, dest_amp_id %d", icid, req->dest_amp_id);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004893
Marcel Holtmann848566b2013-10-01 22:59:22 -07004894 if (!conn->hs_enabled)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004895 return -EINVAL;
4896
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004897 chan = l2cap_get_chan_by_dcid(conn, icid);
4898 if (!chan) {
Mat Martineau1500109b2012-10-23 15:24:15 -07004899 rsp.icid = cpu_to_le16(icid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004900 rsp.result = cpu_to_le16(L2CAP_MR_NOT_ALLOWED);
Mat Martineau1500109b2012-10-23 15:24:15 -07004901 l2cap_send_cmd(conn, cmd->ident, L2CAP_MOVE_CHAN_RSP,
4902 sizeof(rsp), &rsp);
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004903 return 0;
4904 }
4905
Mat Martineau1500109b2012-10-23 15:24:15 -07004906 chan->ident = cmd->ident;
4907
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004908 if (chan->scid < L2CAP_CID_DYN_START ||
4909 chan->chan_policy == BT_CHANNEL_POLICY_BREDR_ONLY ||
4910 (chan->mode != L2CAP_MODE_ERTM &&
4911 chan->mode != L2CAP_MODE_STREAMING)) {
4912 result = L2CAP_MR_NOT_ALLOWED;
4913 goto send_move_response;
4914 }
4915
4916 if (chan->local_amp_id == req->dest_amp_id) {
4917 result = L2CAP_MR_SAME_ID;
4918 goto send_move_response;
4919 }
4920
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004921 if (req->dest_amp_id != AMP_ID_BREDR) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004922 struct hci_dev *hdev;
4923 hdev = hci_dev_get(req->dest_amp_id);
4924 if (!hdev || hdev->dev_type != HCI_AMP ||
4925 !test_bit(HCI_UP, &hdev->flags)) {
4926 if (hdev)
4927 hci_dev_put(hdev);
4928
4929 result = L2CAP_MR_BAD_ID;
4930 goto send_move_response;
4931 }
4932 hci_dev_put(hdev);
4933 }
4934
4935 /* Detect a move collision. Only send a collision response
4936 * if this side has "lost", otherwise proceed with the move.
4937 * The winner has the larger bd_addr.
4938 */
4939 if ((__chan_is_moving(chan) ||
4940 chan->move_role != L2CAP_MOVE_ROLE_NONE) &&
Marcel Holtmann6f59b902013-10-13 05:24:01 -07004941 bacmp(&conn->hcon->src, &conn->hcon->dst) > 0) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004942 result = L2CAP_MR_COLLISION;
4943 goto send_move_response;
4944 }
4945
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004946 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
4947 l2cap_move_setup(chan);
4948 chan->move_id = req->dest_amp_id;
4949 icid = chan->dcid;
4950
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004951 if (req->dest_amp_id == AMP_ID_BREDR) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004952 /* Moving to BR/EDR */
4953 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4954 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4955 result = L2CAP_MR_PEND;
4956 } else {
4957 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4958 result = L2CAP_MR_SUCCESS;
4959 }
4960 } else {
4961 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4962 /* Placeholder - uncomment when amp functions are available */
4963 /*amp_accept_physical(chan, req->dest_amp_id);*/
4964 result = L2CAP_MR_PEND;
4965 }
4966
4967send_move_response:
Mat Martineau1500109b2012-10-23 15:24:15 -07004968 l2cap_send_move_chan_rsp(chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004969
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004970 l2cap_chan_unlock(chan);
4971
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004972 return 0;
4973}
4974
Mat Martineau5b155ef2012-10-23 15:24:14 -07004975static void l2cap_move_continue(struct l2cap_conn *conn, u16 icid, u16 result)
4976{
4977 struct l2cap_chan *chan;
4978 struct hci_chan *hchan = NULL;
4979
4980 chan = l2cap_get_chan_by_scid(conn, icid);
4981 if (!chan) {
4982 l2cap_send_move_chan_cfm_icid(conn, icid);
4983 return;
4984 }
4985
4986 __clear_chan_timer(chan);
4987 if (result == L2CAP_MR_PEND)
4988 __set_chan_timer(chan, L2CAP_MOVE_ERTX_TIMEOUT);
4989
4990 switch (chan->move_state) {
4991 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
4992 /* Move confirm will be sent when logical link
4993 * is complete.
4994 */
4995 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4996 break;
4997 case L2CAP_MOVE_WAIT_RSP_SUCCESS:
4998 if (result == L2CAP_MR_PEND) {
4999 break;
5000 } else if (test_bit(CONN_LOCAL_BUSY,
5001 &chan->conn_state)) {
5002 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
5003 } else {
5004 /* Logical link is up or moving to BR/EDR,
5005 * proceed with move
5006 */
5007 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
5008 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
5009 }
5010 break;
5011 case L2CAP_MOVE_WAIT_RSP:
5012 /* Moving to AMP */
5013 if (result == L2CAP_MR_SUCCESS) {
5014 /* Remote is ready, send confirm immediately
5015 * after logical link is ready
5016 */
5017 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
5018 } else {
5019 /* Both logical link and move success
5020 * are required to confirm
5021 */
5022 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_COMP;
5023 }
5024
5025 /* Placeholder - get hci_chan for logical link */
5026 if (!hchan) {
5027 /* Logical link not available */
5028 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5029 break;
5030 }
5031
5032 /* If the logical link is not yet connected, do not
5033 * send confirmation.
5034 */
5035 if (hchan->state != BT_CONNECTED)
5036 break;
5037
5038 /* Logical link is already ready to go */
5039
5040 chan->hs_hcon = hchan->conn;
5041 chan->hs_hcon->l2cap_data = chan->conn;
5042
5043 if (result == L2CAP_MR_SUCCESS) {
5044 /* Can confirm now */
5045 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
5046 } else {
5047 /* Now only need move success
5048 * to confirm
5049 */
5050 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
5051 }
5052
5053 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
5054 break;
5055 default:
5056 /* Any other amp move state means the move failed. */
5057 chan->move_id = chan->local_amp_id;
5058 l2cap_move_done(chan);
5059 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5060 }
5061
5062 l2cap_chan_unlock(chan);
5063}
5064
5065static void l2cap_move_fail(struct l2cap_conn *conn, u8 ident, u16 icid,
5066 u16 result)
5067{
5068 struct l2cap_chan *chan;
5069
5070 chan = l2cap_get_chan_by_ident(conn, ident);
5071 if (!chan) {
5072 /* Could not locate channel, icid is best guess */
5073 l2cap_send_move_chan_cfm_icid(conn, icid);
5074 return;
5075 }
5076
5077 __clear_chan_timer(chan);
5078
5079 if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
5080 if (result == L2CAP_MR_COLLISION) {
5081 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
5082 } else {
5083 /* Cleanup - cancel move */
5084 chan->move_id = chan->local_amp_id;
5085 l2cap_move_done(chan);
5086 }
5087 }
5088
5089 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5090
5091 l2cap_chan_unlock(chan);
5092}
5093
5094static int l2cap_move_channel_rsp(struct l2cap_conn *conn,
5095 struct l2cap_cmd_hdr *cmd,
5096 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005097{
5098 struct l2cap_move_chan_rsp *rsp = data;
5099 u16 icid, result;
5100
5101 if (cmd_len != sizeof(*rsp))
5102 return -EPROTO;
5103
5104 icid = le16_to_cpu(rsp->icid);
5105 result = le16_to_cpu(rsp->result);
5106
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005107 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005108
Mat Martineau5b155ef2012-10-23 15:24:14 -07005109 if (result == L2CAP_MR_SUCCESS || result == L2CAP_MR_PEND)
5110 l2cap_move_continue(conn, icid, result);
5111 else
5112 l2cap_move_fail(conn, cmd->ident, icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005113
5114 return 0;
5115}
5116
Mat Martineau5f3847a2012-10-23 15:24:12 -07005117static int l2cap_move_channel_confirm(struct l2cap_conn *conn,
5118 struct l2cap_cmd_hdr *cmd,
5119 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005120{
5121 struct l2cap_move_chan_cfm *cfm = data;
Mat Martineau5f3847a2012-10-23 15:24:12 -07005122 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005123 u16 icid, result;
5124
5125 if (cmd_len != sizeof(*cfm))
5126 return -EPROTO;
5127
5128 icid = le16_to_cpu(cfm->icid);
5129 result = le16_to_cpu(cfm->result);
5130
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005131 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005132
Mat Martineau5f3847a2012-10-23 15:24:12 -07005133 chan = l2cap_get_chan_by_dcid(conn, icid);
5134 if (!chan) {
5135 /* Spec requires a response even if the icid was not found */
5136 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5137 return 0;
5138 }
5139
5140 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM) {
5141 if (result == L2CAP_MC_CONFIRMED) {
5142 chan->local_amp_id = chan->move_id;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005143 if (chan->local_amp_id == AMP_ID_BREDR)
Mat Martineau5f3847a2012-10-23 15:24:12 -07005144 __release_logical_link(chan);
5145 } else {
5146 chan->move_id = chan->local_amp_id;
5147 }
5148
5149 l2cap_move_done(chan);
5150 }
5151
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005152 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5153
Mat Martineau5f3847a2012-10-23 15:24:12 -07005154 l2cap_chan_unlock(chan);
5155
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005156 return 0;
5157}
5158
5159static inline int l2cap_move_channel_confirm_rsp(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005160 struct l2cap_cmd_hdr *cmd,
5161 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005162{
5163 struct l2cap_move_chan_cfm_rsp *rsp = data;
Mat Martineau3fd71a02012-10-23 15:24:16 -07005164 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005165 u16 icid;
5166
5167 if (cmd_len != sizeof(*rsp))
5168 return -EPROTO;
5169
5170 icid = le16_to_cpu(rsp->icid);
5171
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005172 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005173
Mat Martineau3fd71a02012-10-23 15:24:16 -07005174 chan = l2cap_get_chan_by_scid(conn, icid);
5175 if (!chan)
5176 return 0;
5177
5178 __clear_chan_timer(chan);
5179
5180 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM_RSP) {
5181 chan->local_amp_id = chan->move_id;
5182
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005183 if (chan->local_amp_id == AMP_ID_BREDR && chan->hs_hchan)
Mat Martineau3fd71a02012-10-23 15:24:16 -07005184 __release_logical_link(chan);
5185
5186 l2cap_move_done(chan);
5187 }
5188
5189 l2cap_chan_unlock(chan);
5190
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005191 return 0;
5192}
5193
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03005194static inline int l2cap_check_conn_param(u16 min, u16 max, u16 latency,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005195 u16 to_multiplier)
Claudio Takahaside731152011-02-11 19:28:55 -02005196{
5197 u16 max_latency;
5198
5199 if (min > max || min < 6 || max > 3200)
5200 return -EINVAL;
5201
5202 if (to_multiplier < 10 || to_multiplier > 3200)
5203 return -EINVAL;
5204
5205 if (max >= to_multiplier * 8)
5206 return -EINVAL;
5207
5208 max_latency = (to_multiplier * 8 / max) - 1;
5209 if (latency > 499 || latency > max_latency)
5210 return -EINVAL;
5211
5212 return 0;
5213}
5214
5215static inline int l2cap_conn_param_update_req(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005216 struct l2cap_cmd_hdr *cmd,
Johan Hedberg203e6392013-05-15 10:07:15 +03005217 u16 cmd_len, u8 *data)
Claudio Takahaside731152011-02-11 19:28:55 -02005218{
5219 struct hci_conn *hcon = conn->hcon;
5220 struct l2cap_conn_param_update_req *req;
5221 struct l2cap_conn_param_update_rsp rsp;
Johan Hedberg203e6392013-05-15 10:07:15 +03005222 u16 min, max, latency, to_multiplier;
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005223 int err;
Claudio Takahaside731152011-02-11 19:28:55 -02005224
5225 if (!(hcon->link_mode & HCI_LM_MASTER))
5226 return -EINVAL;
5227
Claudio Takahaside731152011-02-11 19:28:55 -02005228 if (cmd_len != sizeof(struct l2cap_conn_param_update_req))
5229 return -EPROTO;
5230
5231 req = (struct l2cap_conn_param_update_req *) data;
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03005232 min = __le16_to_cpu(req->min);
5233 max = __le16_to_cpu(req->max);
Claudio Takahaside731152011-02-11 19:28:55 -02005234 latency = __le16_to_cpu(req->latency);
5235 to_multiplier = __le16_to_cpu(req->to_multiplier);
5236
5237 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 +01005238 min, max, latency, to_multiplier);
Claudio Takahaside731152011-02-11 19:28:55 -02005239
5240 memset(&rsp, 0, sizeof(rsp));
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005241
5242 err = l2cap_check_conn_param(min, max, latency, to_multiplier);
5243 if (err)
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005244 rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_REJECTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005245 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005246 rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_ACCEPTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005247
5248 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONN_PARAM_UPDATE_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005249 sizeof(rsp), &rsp);
Claudio Takahaside731152011-02-11 19:28:55 -02005250
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005251 if (!err)
5252 hci_le_conn_update(hcon, min, max, latency, to_multiplier);
5253
Claudio Takahaside731152011-02-11 19:28:55 -02005254 return 0;
5255}
5256
Johan Hedbergf1496de2013-05-13 14:15:56 +03005257static int l2cap_le_connect_rsp(struct l2cap_conn *conn,
5258 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5259 u8 *data)
5260{
5261 struct l2cap_le_conn_rsp *rsp = (struct l2cap_le_conn_rsp *) data;
5262 u16 dcid, mtu, mps, credits, result;
5263 struct l2cap_chan *chan;
5264 int err;
5265
5266 if (cmd_len < sizeof(*rsp))
5267 return -EPROTO;
5268
5269 dcid = __le16_to_cpu(rsp->dcid);
5270 mtu = __le16_to_cpu(rsp->mtu);
5271 mps = __le16_to_cpu(rsp->mps);
5272 credits = __le16_to_cpu(rsp->credits);
5273 result = __le16_to_cpu(rsp->result);
5274
5275 if (result == L2CAP_CR_SUCCESS && (mtu < 23 || mps < 23))
5276 return -EPROTO;
5277
5278 BT_DBG("dcid 0x%4.4x mtu %u mps %u credits %u result 0x%2.2x",
5279 dcid, mtu, mps, credits, result);
5280
5281 mutex_lock(&conn->chan_lock);
5282
5283 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5284 if (!chan) {
5285 err = -EBADSLT;
5286 goto unlock;
5287 }
5288
5289 err = 0;
5290
5291 l2cap_chan_lock(chan);
5292
5293 switch (result) {
5294 case L2CAP_CR_SUCCESS:
5295 chan->ident = 0;
5296 chan->dcid = dcid;
5297 chan->omtu = mtu;
5298 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005299 chan->tx_credits = credits;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005300 l2cap_chan_ready(chan);
5301 break;
5302
5303 default:
5304 l2cap_chan_del(chan, ECONNREFUSED);
5305 break;
5306 }
5307
5308 l2cap_chan_unlock(chan);
5309
5310unlock:
5311 mutex_unlock(&conn->chan_lock);
5312
5313 return err;
5314}
5315
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005316static inline int l2cap_bredr_sig_cmd(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005317 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5318 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005319{
5320 int err = 0;
5321
5322 switch (cmd->code) {
5323 case L2CAP_COMMAND_REJ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005324 l2cap_command_rej(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005325 break;
5326
5327 case L2CAP_CONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005328 err = l2cap_connect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005329 break;
5330
5331 case L2CAP_CONN_RSP:
Mat Martineauf5a25982012-10-11 17:48:21 +03005332 case L2CAP_CREATE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005333 l2cap_connect_create_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005334 break;
5335
5336 case L2CAP_CONF_REQ:
5337 err = l2cap_config_req(conn, cmd, cmd_len, data);
5338 break;
5339
5340 case L2CAP_CONF_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005341 l2cap_config_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005342 break;
5343
5344 case L2CAP_DISCONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005345 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005346 break;
5347
5348 case L2CAP_DISCONN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005349 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005350 break;
5351
5352 case L2CAP_ECHO_REQ:
5353 l2cap_send_cmd(conn, cmd->ident, L2CAP_ECHO_RSP, cmd_len, data);
5354 break;
5355
5356 case L2CAP_ECHO_RSP:
5357 break;
5358
5359 case L2CAP_INFO_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005360 err = l2cap_information_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005361 break;
5362
5363 case L2CAP_INFO_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005364 l2cap_information_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005365 break;
5366
Mat Martineauf94ff6f2011-11-02 16:18:32 -07005367 case L2CAP_CREATE_CHAN_REQ:
5368 err = l2cap_create_channel_req(conn, cmd, cmd_len, data);
5369 break;
5370
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005371 case L2CAP_MOVE_CHAN_REQ:
5372 err = l2cap_move_channel_req(conn, cmd, cmd_len, data);
5373 break;
5374
5375 case L2CAP_MOVE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005376 l2cap_move_channel_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005377 break;
5378
5379 case L2CAP_MOVE_CHAN_CFM:
5380 err = l2cap_move_channel_confirm(conn, cmd, cmd_len, data);
5381 break;
5382
5383 case L2CAP_MOVE_CHAN_CFM_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005384 l2cap_move_channel_confirm_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005385 break;
5386
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005387 default:
5388 BT_ERR("Unknown BR/EDR signaling command 0x%2.2x", cmd->code);
5389 err = -EINVAL;
5390 break;
5391 }
5392
5393 return err;
5394}
5395
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005396static int l2cap_le_connect_req(struct l2cap_conn *conn,
5397 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5398 u8 *data)
5399{
5400 struct l2cap_le_conn_req *req = (struct l2cap_le_conn_req *) data;
5401 struct l2cap_le_conn_rsp rsp;
5402 struct l2cap_chan *chan, *pchan;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005403 u16 dcid, scid, credits, mtu, mps;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005404 __le16 psm;
5405 u8 result;
5406
5407 if (cmd_len != sizeof(*req))
5408 return -EPROTO;
5409
5410 scid = __le16_to_cpu(req->scid);
5411 mtu = __le16_to_cpu(req->mtu);
5412 mps = __le16_to_cpu(req->mps);
5413 psm = req->psm;
5414 dcid = 0;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005415 credits = 0;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005416
5417 if (mtu < 23 || mps < 23)
5418 return -EPROTO;
5419
5420 BT_DBG("psm 0x%2.2x scid 0x%4.4x mtu %u mps %u", __le16_to_cpu(psm),
5421 scid, mtu, mps);
5422
5423 /* Check if we have socket listening on psm */
5424 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
5425 &conn->hcon->dst, LE_LINK);
5426 if (!pchan) {
5427 result = L2CAP_CR_BAD_PSM;
5428 chan = NULL;
5429 goto response;
5430 }
5431
5432 mutex_lock(&conn->chan_lock);
5433 l2cap_chan_lock(pchan);
5434
5435 if (!smp_sufficient_security(conn->hcon, pchan->sec_level)) {
5436 result = L2CAP_CR_AUTHENTICATION;
5437 chan = NULL;
5438 goto response_unlock;
5439 }
5440
5441 /* Check if we already have channel with that dcid */
5442 if (__l2cap_get_chan_by_dcid(conn, scid)) {
5443 result = L2CAP_CR_NO_MEM;
5444 chan = NULL;
5445 goto response_unlock;
5446 }
5447
5448 chan = pchan->ops->new_connection(pchan);
5449 if (!chan) {
5450 result = L2CAP_CR_NO_MEM;
5451 goto response_unlock;
5452 }
5453
Johan Hedberg0ce43ce2013-12-05 14:55:33 +02005454 l2cap_le_flowctl_init(chan);
5455
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005456 bacpy(&chan->src, &conn->hcon->src);
5457 bacpy(&chan->dst, &conn->hcon->dst);
5458 chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type);
5459 chan->dst_type = bdaddr_type(conn->hcon, conn->hcon->dst_type);
5460 chan->psm = psm;
5461 chan->dcid = scid;
5462 chan->omtu = mtu;
5463 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005464 chan->tx_credits = __le16_to_cpu(req->credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005465
5466 __l2cap_chan_add(conn, chan);
5467 dcid = chan->scid;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005468 credits = chan->rx_credits;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005469
5470 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
5471
5472 chan->ident = cmd->ident;
5473
5474 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
5475 l2cap_state_change(chan, BT_CONNECT2);
5476 result = L2CAP_CR_PEND;
5477 chan->ops->defer(chan);
5478 } else {
5479 l2cap_chan_ready(chan);
5480 result = L2CAP_CR_SUCCESS;
5481 }
5482
5483response_unlock:
5484 l2cap_chan_unlock(pchan);
5485 mutex_unlock(&conn->chan_lock);
5486
5487 if (result == L2CAP_CR_PEND)
5488 return 0;
5489
5490response:
5491 if (chan) {
5492 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02005493 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005494 } else {
5495 rsp.mtu = 0;
5496 rsp.mps = 0;
5497 }
5498
5499 rsp.dcid = cpu_to_le16(dcid);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005500 rsp.credits = cpu_to_le16(credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005501 rsp.result = cpu_to_le16(result);
5502
5503 l2cap_send_cmd(conn, cmd->ident, L2CAP_LE_CONN_RSP, sizeof(rsp), &rsp);
5504
5505 return 0;
5506}
5507
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005508static inline int l2cap_le_credits(struct l2cap_conn *conn,
5509 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5510 u8 *data)
5511{
5512 struct l2cap_le_credits *pkt;
5513 struct l2cap_chan *chan;
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005514 u16 cid, credits, max_credits;
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005515
5516 if (cmd_len != sizeof(*pkt))
5517 return -EPROTO;
5518
5519 pkt = (struct l2cap_le_credits *) data;
5520 cid = __le16_to_cpu(pkt->cid);
5521 credits = __le16_to_cpu(pkt->credits);
5522
5523 BT_DBG("cid 0x%4.4x credits 0x%4.4x", cid, credits);
5524
5525 chan = l2cap_get_chan_by_dcid(conn, cid);
5526 if (!chan)
5527 return -EBADSLT;
5528
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005529 max_credits = LE_FLOWCTL_MAX_CREDITS - chan->tx_credits;
5530 if (credits > max_credits) {
5531 BT_ERR("LE credits overflow");
5532 l2cap_send_disconn_req(chan, ECONNRESET);
5533
5534 /* Return 0 so that we don't trigger an unnecessary
5535 * command reject packet.
5536 */
5537 return 0;
5538 }
5539
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005540 chan->tx_credits += credits;
5541
5542 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
5543 l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
5544 chan->tx_credits--;
5545 }
5546
5547 if (chan->tx_credits)
5548 chan->ops->resume(chan);
5549
5550 l2cap_chan_unlock(chan);
5551
5552 return 0;
5553}
5554
Johan Hedberg71fb4192013-12-10 10:52:48 +02005555static inline int l2cap_le_command_rej(struct l2cap_conn *conn,
5556 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5557 u8 *data)
5558{
5559 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
5560 struct l2cap_chan *chan;
5561
5562 if (cmd_len < sizeof(*rej))
5563 return -EPROTO;
5564
5565 mutex_lock(&conn->chan_lock);
5566
5567 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5568 if (!chan)
5569 goto done;
5570
5571 l2cap_chan_lock(chan);
5572 l2cap_chan_del(chan, ECONNREFUSED);
5573 l2cap_chan_unlock(chan);
5574
5575done:
5576 mutex_unlock(&conn->chan_lock);
5577 return 0;
5578}
5579
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005580static inline int l2cap_le_sig_cmd(struct l2cap_conn *conn,
Johan Hedberg203e6392013-05-15 10:07:15 +03005581 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5582 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005583{
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005584 int err = 0;
5585
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005586 switch (cmd->code) {
5587 case L2CAP_COMMAND_REJ:
Johan Hedberg71fb4192013-12-10 10:52:48 +02005588 l2cap_le_command_rej(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005589 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005590
5591 case L2CAP_CONN_PARAM_UPDATE_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005592 err = l2cap_conn_param_update_req(conn, cmd, cmd_len, data);
5593 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005594
5595 case L2CAP_CONN_PARAM_UPDATE_RSP:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005596 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005597
Johan Hedbergf1496de2013-05-13 14:15:56 +03005598 case L2CAP_LE_CONN_RSP:
5599 l2cap_le_connect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005600 break;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005601
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005602 case L2CAP_LE_CONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005603 err = l2cap_le_connect_req(conn, cmd, cmd_len, data);
5604 break;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005605
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005606 case L2CAP_LE_CREDITS:
5607 err = l2cap_le_credits(conn, cmd, cmd_len, data);
5608 break;
5609
Johan Hedberg3defe012013-05-15 10:16:06 +03005610 case L2CAP_DISCONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005611 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
5612 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005613
5614 case L2CAP_DISCONN_RSP:
5615 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005616 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005617
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005618 default:
5619 BT_ERR("Unknown LE signaling command 0x%2.2x", cmd->code);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005620 err = -EINVAL;
5621 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005622 }
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005623
5624 return err;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005625}
5626
Johan Hedbergc5623552013-04-29 19:35:33 +03005627static inline void l2cap_le_sig_channel(struct l2cap_conn *conn,
5628 struct sk_buff *skb)
5629{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005630 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005631 struct l2cap_cmd_hdr *cmd;
5632 u16 len;
Johan Hedbergc5623552013-04-29 19:35:33 +03005633 int err;
5634
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005635 if (hcon->type != LE_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005636 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005637
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005638 if (skb->len < L2CAP_CMD_HDR_SIZE)
5639 goto drop;
Johan Hedbergc5623552013-04-29 19:35:33 +03005640
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005641 cmd = (void *) skb->data;
5642 skb_pull(skb, L2CAP_CMD_HDR_SIZE);
Johan Hedbergc5623552013-04-29 19:35:33 +03005643
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005644 len = le16_to_cpu(cmd->len);
Johan Hedbergc5623552013-04-29 19:35:33 +03005645
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005646 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd->code, len, cmd->ident);
Johan Hedbergc5623552013-04-29 19:35:33 +03005647
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005648 if (len != skb->len || !cmd->ident) {
5649 BT_DBG("corrupted command");
5650 goto drop;
5651 }
Johan Hedbergc5623552013-04-29 19:35:33 +03005652
Johan Hedberg203e6392013-05-15 10:07:15 +03005653 err = l2cap_le_sig_cmd(conn, cmd, len, skb->data);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005654 if (err) {
5655 struct l2cap_cmd_rej_unk rej;
Johan Hedbergc5623552013-04-29 19:35:33 +03005656
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005657 BT_ERR("Wrong link type (%d)", err);
Johan Hedbergc5623552013-04-29 19:35:33 +03005658
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005659 rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005660 l2cap_send_cmd(conn, cmd->ident, L2CAP_COMMAND_REJ,
5661 sizeof(rej), &rej);
Johan Hedbergc5623552013-04-29 19:35:33 +03005662 }
5663
Marcel Holtmann3b166292013-10-02 08:28:21 -07005664drop:
Johan Hedbergc5623552013-04-29 19:35:33 +03005665 kfree_skb(skb);
5666}
5667
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005668static inline void l2cap_sig_channel(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005669 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005670{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005671 struct hci_conn *hcon = conn->hcon;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005672 u8 *data = skb->data;
5673 int len = skb->len;
5674 struct l2cap_cmd_hdr cmd;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005675 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005676
5677 l2cap_raw_recv(conn, skb);
5678
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005679 if (hcon->type != ACL_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005680 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005681
Linus Torvalds1da177e2005-04-16 15:20:36 -07005682 while (len >= L2CAP_CMD_HDR_SIZE) {
Al Viro88219a02007-07-29 00:17:25 -07005683 u16 cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005684 memcpy(&cmd, data, L2CAP_CMD_HDR_SIZE);
5685 data += L2CAP_CMD_HDR_SIZE;
5686 len -= L2CAP_CMD_HDR_SIZE;
5687
Al Viro88219a02007-07-29 00:17:25 -07005688 cmd_len = le16_to_cpu(cmd.len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005689
Gustavo Padovan2d792812012-10-06 10:07:01 +01005690 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd.code, cmd_len,
5691 cmd.ident);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005692
Al Viro88219a02007-07-29 00:17:25 -07005693 if (cmd_len > len || !cmd.ident) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005694 BT_DBG("corrupted command");
5695 break;
5696 }
5697
Johan Hedbergc5623552013-04-29 19:35:33 +03005698 err = l2cap_bredr_sig_cmd(conn, &cmd, cmd_len, data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005699 if (err) {
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03005700 struct l2cap_cmd_rej_unk rej;
Gustavo F. Padovan2c6d1a22011-03-23 14:38:32 -03005701
5702 BT_ERR("Wrong link type (%d)", err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005703
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005704 rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Gustavo Padovan2d792812012-10-06 10:07:01 +01005705 l2cap_send_cmd(conn, cmd.ident, L2CAP_COMMAND_REJ,
5706 sizeof(rej), &rej);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005707 }
5708
Al Viro88219a02007-07-29 00:17:25 -07005709 data += cmd_len;
5710 len -= cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005711 }
5712
Marcel Holtmann3b166292013-10-02 08:28:21 -07005713drop:
Linus Torvalds1da177e2005-04-16 15:20:36 -07005714 kfree_skb(skb);
5715}
5716
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005717static int l2cap_check_fcs(struct l2cap_chan *chan, struct sk_buff *skb)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005718{
5719 u16 our_fcs, rcv_fcs;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03005720 int hdr_size;
5721
5722 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
5723 hdr_size = L2CAP_EXT_HDR_SIZE;
5724 else
5725 hdr_size = L2CAP_ENH_HDR_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005726
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005727 if (chan->fcs == L2CAP_FCS_CRC16) {
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005728 skb_trim(skb, skb->len - L2CAP_FCS_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005729 rcv_fcs = get_unaligned_le16(skb->data + skb->len);
5730 our_fcs = crc16(0, skb->data - hdr_size, skb->len + hdr_size);
5731
5732 if (our_fcs != rcv_fcs)
João Paulo Rechi Vita7a560e52010-06-22 13:56:27 -03005733 return -EBADMSG;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005734 }
5735 return 0;
5736}
5737
Mat Martineau6ea00482012-05-17 20:53:52 -07005738static void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan)
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005739{
Mat Martineaue31f7632012-05-17 20:53:41 -07005740 struct l2cap_ctrl control;
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005741
Mat Martineaue31f7632012-05-17 20:53:41 -07005742 BT_DBG("chan %p", chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005743
Mat Martineaue31f7632012-05-17 20:53:41 -07005744 memset(&control, 0, sizeof(control));
5745 control.sframe = 1;
5746 control.final = 1;
5747 control.reqseq = chan->buffer_seq;
5748 set_bit(CONN_SEND_FBIT, &chan->conn_state);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005749
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005750 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
Mat Martineaue31f7632012-05-17 20:53:41 -07005751 control.super = L2CAP_SUPER_RNR;
5752 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005753 }
5754
Mat Martineaue31f7632012-05-17 20:53:41 -07005755 if (test_and_clear_bit(CONN_REMOTE_BUSY, &chan->conn_state) &&
5756 chan->unacked_frames > 0)
5757 __set_retrans_timer(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005758
Mat Martineaue31f7632012-05-17 20:53:41 -07005759 /* Send pending iframes */
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03005760 l2cap_ertm_send(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005761
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005762 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
Mat Martineaue31f7632012-05-17 20:53:41 -07005763 test_bit(CONN_SEND_FBIT, &chan->conn_state)) {
5764 /* F-bit wasn't sent in an s-frame or i-frame yet, so
5765 * send it now.
5766 */
5767 control.super = L2CAP_SUPER_RR;
5768 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005769 }
5770}
5771
Gustavo Padovan2d792812012-10-06 10:07:01 +01005772static void append_skb_frag(struct sk_buff *skb, struct sk_buff *new_frag,
5773 struct sk_buff **last_frag)
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005774{
Mat Martineau84084a32011-07-22 14:54:00 -07005775 /* skb->len reflects data in skb as well as all fragments
5776 * skb->data_len reflects only data in fragments
5777 */
5778 if (!skb_has_frag_list(skb))
5779 skb_shinfo(skb)->frag_list = new_frag;
5780
5781 new_frag->next = NULL;
5782
5783 (*last_frag)->next = new_frag;
5784 *last_frag = new_frag;
5785
5786 skb->len += new_frag->len;
5787 skb->data_len += new_frag->len;
5788 skb->truesize += new_frag->truesize;
5789}
5790
Mat Martineau4b51dae92012-05-17 20:53:37 -07005791static int l2cap_reassemble_sdu(struct l2cap_chan *chan, struct sk_buff *skb,
5792 struct l2cap_ctrl *control)
Mat Martineau84084a32011-07-22 14:54:00 -07005793{
5794 int err = -EINVAL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005795
Mat Martineau4b51dae92012-05-17 20:53:37 -07005796 switch (control->sar) {
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005797 case L2CAP_SAR_UNSEGMENTED:
Mat Martineau84084a32011-07-22 14:54:00 -07005798 if (chan->sdu)
5799 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005800
Gustavo Padovan80b98022012-05-27 22:27:51 -03005801 err = chan->ops->recv(chan, skb);
Mat Martineau84084a32011-07-22 14:54:00 -07005802 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005803
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005804 case L2CAP_SAR_START:
Mat Martineau84084a32011-07-22 14:54:00 -07005805 if (chan->sdu)
5806 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005807
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005808 chan->sdu_len = get_unaligned_le16(skb->data);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005809 skb_pull(skb, L2CAP_SDULEN_SIZE);
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005810
Mat Martineau84084a32011-07-22 14:54:00 -07005811 if (chan->sdu_len > chan->imtu) {
5812 err = -EMSGSIZE;
5813 break;
5814 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005815
Mat Martineau84084a32011-07-22 14:54:00 -07005816 if (skb->len >= chan->sdu_len)
5817 break;
5818
5819 chan->sdu = skb;
5820 chan->sdu_last_frag = skb;
5821
5822 skb = NULL;
5823 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005824 break;
5825
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005826 case L2CAP_SAR_CONTINUE:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005827 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005828 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005829
Mat Martineau84084a32011-07-22 14:54:00 -07005830 append_skb_frag(chan->sdu, skb,
5831 &chan->sdu_last_frag);
5832 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005833
Mat Martineau84084a32011-07-22 14:54:00 -07005834 if (chan->sdu->len >= chan->sdu_len)
5835 break;
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005836
Mat Martineau84084a32011-07-22 14:54:00 -07005837 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005838 break;
5839
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005840 case L2CAP_SAR_END:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005841 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005842 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005843
Mat Martineau84084a32011-07-22 14:54:00 -07005844 append_skb_frag(chan->sdu, skb,
5845 &chan->sdu_last_frag);
5846 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005847
Mat Martineau84084a32011-07-22 14:54:00 -07005848 if (chan->sdu->len != chan->sdu_len)
5849 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005850
Gustavo Padovan80b98022012-05-27 22:27:51 -03005851 err = chan->ops->recv(chan, chan->sdu);
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005852
Mat Martineau84084a32011-07-22 14:54:00 -07005853 if (!err) {
5854 /* Reassembly complete */
5855 chan->sdu = NULL;
5856 chan->sdu_last_frag = NULL;
5857 chan->sdu_len = 0;
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005858 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005859 break;
5860 }
5861
Mat Martineau84084a32011-07-22 14:54:00 -07005862 if (err) {
5863 kfree_skb(skb);
5864 kfree_skb(chan->sdu);
5865 chan->sdu = NULL;
5866 chan->sdu_last_frag = NULL;
5867 chan->sdu_len = 0;
5868 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005869
Mat Martineau84084a32011-07-22 14:54:00 -07005870 return err;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005871}
5872
Mat Martineau32b32732012-10-23 15:24:11 -07005873static int l2cap_resegment(struct l2cap_chan *chan)
5874{
5875 /* Placeholder */
5876 return 0;
5877}
5878
Mat Martineaue3281402011-07-07 09:39:02 -07005879void l2cap_chan_busy(struct l2cap_chan *chan, int busy)
Gustavo F. Padovan712132eb2010-06-21 19:39:50 -03005880{
Mat Martineau61aa4f52012-05-17 20:53:40 -07005881 u8 event;
5882
5883 if (chan->mode != L2CAP_MODE_ERTM)
5884 return;
5885
5886 event = busy ? L2CAP_EV_LOCAL_BUSY_DETECTED : L2CAP_EV_LOCAL_BUSY_CLEAR;
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03005887 l2cap_tx(chan, NULL, NULL, event);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005888}
5889
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005890static int l2cap_rx_queued_iframes(struct l2cap_chan *chan)
5891{
Mat Martineau63838722012-05-17 20:53:45 -07005892 int err = 0;
5893 /* Pass sequential frames to l2cap_reassemble_sdu()
5894 * until a gap is encountered.
5895 */
5896
5897 BT_DBG("chan %p", chan);
5898
5899 while (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
5900 struct sk_buff *skb;
5901 BT_DBG("Searching for skb with txseq %d (queue len %d)",
5902 chan->buffer_seq, skb_queue_len(&chan->srej_q));
5903
5904 skb = l2cap_ertm_seq_in_queue(&chan->srej_q, chan->buffer_seq);
5905
5906 if (!skb)
5907 break;
5908
5909 skb_unlink(skb, &chan->srej_q);
5910 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
5911 err = l2cap_reassemble_sdu(chan, skb, &bt_cb(skb)->control);
5912 if (err)
5913 break;
5914 }
5915
5916 if (skb_queue_empty(&chan->srej_q)) {
5917 chan->rx_state = L2CAP_RX_STATE_RECV;
5918 l2cap_send_ack(chan);
5919 }
5920
5921 return err;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005922}
5923
5924static void l2cap_handle_srej(struct l2cap_chan *chan,
5925 struct l2cap_ctrl *control)
5926{
Mat Martineauf80842a2012-05-17 20:53:46 -07005927 struct sk_buff *skb;
5928
5929 BT_DBG("chan %p, control %p", chan, control);
5930
5931 if (control->reqseq == chan->next_tx_seq) {
5932 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005933 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005934 return;
5935 }
5936
5937 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
5938
5939 if (skb == NULL) {
5940 BT_DBG("Seq %d not available for retransmission",
5941 control->reqseq);
5942 return;
5943 }
5944
5945 if (chan->max_tx != 0 && bt_cb(skb)->control.retries >= chan->max_tx) {
5946 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005947 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005948 return;
5949 }
5950
5951 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
5952
5953 if (control->poll) {
5954 l2cap_pass_to_tx(chan, control);
5955
5956 set_bit(CONN_SEND_FBIT, &chan->conn_state);
5957 l2cap_retransmit(chan, control);
5958 l2cap_ertm_send(chan);
5959
5960 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5961 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5962 chan->srej_save_reqseq = control->reqseq;
5963 }
5964 } else {
5965 l2cap_pass_to_tx_fbit(chan, control);
5966
5967 if (control->final) {
5968 if (chan->srej_save_reqseq != control->reqseq ||
5969 !test_and_clear_bit(CONN_SREJ_ACT,
5970 &chan->conn_state))
5971 l2cap_retransmit(chan, control);
5972 } else {
5973 l2cap_retransmit(chan, control);
5974 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5975 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5976 chan->srej_save_reqseq = control->reqseq;
5977 }
5978 }
5979 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005980}
5981
5982static void l2cap_handle_rej(struct l2cap_chan *chan,
5983 struct l2cap_ctrl *control)
5984{
Mat Martineaufcd289d2012-05-17 20:53:47 -07005985 struct sk_buff *skb;
5986
5987 BT_DBG("chan %p, control %p", chan, control);
5988
5989 if (control->reqseq == chan->next_tx_seq) {
5990 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005991 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07005992 return;
5993 }
5994
5995 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
5996
5997 if (chan->max_tx && skb &&
5998 bt_cb(skb)->control.retries >= chan->max_tx) {
5999 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006000 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07006001 return;
6002 }
6003
6004 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6005
6006 l2cap_pass_to_tx(chan, control);
6007
6008 if (control->final) {
6009 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state))
6010 l2cap_retransmit_all(chan, control);
6011 } else {
6012 l2cap_retransmit_all(chan, control);
6013 l2cap_ertm_send(chan);
6014 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F)
6015 set_bit(CONN_REJ_ACT, &chan->conn_state);
6016 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006017}
6018
Mat Martineau4b51dae92012-05-17 20:53:37 -07006019static u8 l2cap_classify_txseq(struct l2cap_chan *chan, u16 txseq)
6020{
6021 BT_DBG("chan %p, txseq %d", chan, txseq);
6022
6023 BT_DBG("last_acked_seq %d, expected_tx_seq %d", chan->last_acked_seq,
6024 chan->expected_tx_seq);
6025
6026 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
6027 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
Gustavo Padovan2d792812012-10-06 10:07:01 +01006028 chan->tx_win) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07006029 /* See notes below regarding "double poll" and
6030 * invalid packets.
6031 */
6032 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
6033 BT_DBG("Invalid/Ignore - after SREJ");
6034 return L2CAP_TXSEQ_INVALID_IGNORE;
6035 } else {
6036 BT_DBG("Invalid - in window after SREJ sent");
6037 return L2CAP_TXSEQ_INVALID;
6038 }
6039 }
6040
6041 if (chan->srej_list.head == txseq) {
6042 BT_DBG("Expected SREJ");
6043 return L2CAP_TXSEQ_EXPECTED_SREJ;
6044 }
6045
6046 if (l2cap_ertm_seq_in_queue(&chan->srej_q, txseq)) {
6047 BT_DBG("Duplicate SREJ - txseq already stored");
6048 return L2CAP_TXSEQ_DUPLICATE_SREJ;
6049 }
6050
6051 if (l2cap_seq_list_contains(&chan->srej_list, txseq)) {
6052 BT_DBG("Unexpected SREJ - not requested");
6053 return L2CAP_TXSEQ_UNEXPECTED_SREJ;
6054 }
6055 }
6056
6057 if (chan->expected_tx_seq == txseq) {
6058 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
6059 chan->tx_win) {
6060 BT_DBG("Invalid - txseq outside tx window");
6061 return L2CAP_TXSEQ_INVALID;
6062 } else {
6063 BT_DBG("Expected");
6064 return L2CAP_TXSEQ_EXPECTED;
6065 }
6066 }
6067
6068 if (__seq_offset(chan, txseq, chan->last_acked_seq) <
Gustavo Padovan2d792812012-10-06 10:07:01 +01006069 __seq_offset(chan, chan->expected_tx_seq, chan->last_acked_seq)) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07006070 BT_DBG("Duplicate - expected_tx_seq later than txseq");
6071 return L2CAP_TXSEQ_DUPLICATE;
6072 }
6073
6074 if (__seq_offset(chan, txseq, chan->last_acked_seq) >= chan->tx_win) {
6075 /* A source of invalid packets is a "double poll" condition,
6076 * where delays cause us to send multiple poll packets. If
6077 * the remote stack receives and processes both polls,
6078 * sequence numbers can wrap around in such a way that a
6079 * resent frame has a sequence number that looks like new data
6080 * with a sequence gap. This would trigger an erroneous SREJ
6081 * request.
6082 *
6083 * Fortunately, this is impossible with a tx window that's
6084 * less than half of the maximum sequence number, which allows
6085 * invalid frames to be safely ignored.
6086 *
6087 * With tx window sizes greater than half of the tx window
6088 * maximum, the frame is invalid and cannot be ignored. This
6089 * causes a disconnect.
6090 */
6091
6092 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
6093 BT_DBG("Invalid/Ignore - txseq outside tx window");
6094 return L2CAP_TXSEQ_INVALID_IGNORE;
6095 } else {
6096 BT_DBG("Invalid - txseq outside tx window");
6097 return L2CAP_TXSEQ_INVALID;
6098 }
6099 } else {
6100 BT_DBG("Unexpected - txseq indicates missing frames");
6101 return L2CAP_TXSEQ_UNEXPECTED;
6102 }
6103}
6104
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006105static int l2cap_rx_state_recv(struct l2cap_chan *chan,
6106 struct l2cap_ctrl *control,
6107 struct sk_buff *skb, u8 event)
6108{
6109 int err = 0;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006110 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006111
6112 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6113 event);
6114
6115 switch (event) {
6116 case L2CAP_EV_RECV_IFRAME:
6117 switch (l2cap_classify_txseq(chan, control->txseq)) {
6118 case L2CAP_TXSEQ_EXPECTED:
6119 l2cap_pass_to_tx(chan, control);
6120
6121 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6122 BT_DBG("Busy, discarding expected seq %d",
6123 control->txseq);
6124 break;
6125 }
6126
6127 chan->expected_tx_seq = __next_seq(chan,
6128 control->txseq);
6129
6130 chan->buffer_seq = chan->expected_tx_seq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006131 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006132
6133 err = l2cap_reassemble_sdu(chan, skb, control);
6134 if (err)
6135 break;
6136
6137 if (control->final) {
6138 if (!test_and_clear_bit(CONN_REJ_ACT,
6139 &chan->conn_state)) {
6140 control->final = 0;
6141 l2cap_retransmit_all(chan, control);
6142 l2cap_ertm_send(chan);
6143 }
6144 }
6145
6146 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
6147 l2cap_send_ack(chan);
6148 break;
6149 case L2CAP_TXSEQ_UNEXPECTED:
6150 l2cap_pass_to_tx(chan, control);
6151
6152 /* Can't issue SREJ frames in the local busy state.
6153 * Drop this frame, it will be seen as missing
6154 * when local busy is exited.
6155 */
6156 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6157 BT_DBG("Busy, discarding unexpected seq %d",
6158 control->txseq);
6159 break;
6160 }
6161
6162 /* There was a gap in the sequence, so an SREJ
6163 * must be sent for each missing frame. The
6164 * current frame is stored for later use.
6165 */
6166 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006167 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006168 BT_DBG("Queued %p (queue len %d)", skb,
6169 skb_queue_len(&chan->srej_q));
6170
6171 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
6172 l2cap_seq_list_clear(&chan->srej_list);
6173 l2cap_send_srej(chan, control->txseq);
6174
6175 chan->rx_state = L2CAP_RX_STATE_SREJ_SENT;
6176 break;
6177 case L2CAP_TXSEQ_DUPLICATE:
6178 l2cap_pass_to_tx(chan, control);
6179 break;
6180 case L2CAP_TXSEQ_INVALID_IGNORE:
6181 break;
6182 case L2CAP_TXSEQ_INVALID:
6183 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006184 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006185 break;
6186 }
6187 break;
6188 case L2CAP_EV_RECV_RR:
6189 l2cap_pass_to_tx(chan, control);
6190 if (control->final) {
6191 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6192
Mat Martineaue6a3ee62012-10-23 15:24:22 -07006193 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state) &&
6194 !__chan_is_moving(chan)) {
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006195 control->final = 0;
6196 l2cap_retransmit_all(chan, control);
6197 }
6198
6199 l2cap_ertm_send(chan);
6200 } else if (control->poll) {
6201 l2cap_send_i_or_rr_or_rnr(chan);
6202 } else {
6203 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6204 &chan->conn_state) &&
6205 chan->unacked_frames)
6206 __set_retrans_timer(chan);
6207
6208 l2cap_ertm_send(chan);
6209 }
6210 break;
6211 case L2CAP_EV_RECV_RNR:
6212 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6213 l2cap_pass_to_tx(chan, control);
6214 if (control && control->poll) {
6215 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6216 l2cap_send_rr_or_rnr(chan, 0);
6217 }
6218 __clear_retrans_timer(chan);
6219 l2cap_seq_list_clear(&chan->retrans_list);
6220 break;
6221 case L2CAP_EV_RECV_REJ:
6222 l2cap_handle_rej(chan, control);
6223 break;
6224 case L2CAP_EV_RECV_SREJ:
6225 l2cap_handle_srej(chan, control);
6226 break;
6227 default:
6228 break;
6229 }
6230
6231 if (skb && !skb_in_use) {
6232 BT_DBG("Freeing %p", skb);
6233 kfree_skb(skb);
6234 }
6235
6236 return err;
6237}
6238
6239static int l2cap_rx_state_srej_sent(struct l2cap_chan *chan,
6240 struct l2cap_ctrl *control,
6241 struct sk_buff *skb, u8 event)
6242{
6243 int err = 0;
6244 u16 txseq = control->txseq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006245 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006246
6247 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6248 event);
6249
6250 switch (event) {
6251 case L2CAP_EV_RECV_IFRAME:
6252 switch (l2cap_classify_txseq(chan, txseq)) {
6253 case L2CAP_TXSEQ_EXPECTED:
6254 /* Keep frame for reassembly later */
6255 l2cap_pass_to_tx(chan, control);
6256 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006257 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006258 BT_DBG("Queued %p (queue len %d)", skb,
6259 skb_queue_len(&chan->srej_q));
6260
6261 chan->expected_tx_seq = __next_seq(chan, txseq);
6262 break;
6263 case L2CAP_TXSEQ_EXPECTED_SREJ:
6264 l2cap_seq_list_pop(&chan->srej_list);
6265
6266 l2cap_pass_to_tx(chan, control);
6267 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006268 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006269 BT_DBG("Queued %p (queue len %d)", skb,
6270 skb_queue_len(&chan->srej_q));
6271
6272 err = l2cap_rx_queued_iframes(chan);
6273 if (err)
6274 break;
6275
6276 break;
6277 case L2CAP_TXSEQ_UNEXPECTED:
6278 /* Got a frame that can't be reassembled yet.
6279 * Save it for later, and send SREJs to cover
6280 * the missing frames.
6281 */
6282 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006283 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006284 BT_DBG("Queued %p (queue len %d)", skb,
6285 skb_queue_len(&chan->srej_q));
6286
6287 l2cap_pass_to_tx(chan, control);
6288 l2cap_send_srej(chan, control->txseq);
6289 break;
6290 case L2CAP_TXSEQ_UNEXPECTED_SREJ:
6291 /* This frame was requested with an SREJ, but
6292 * some expected retransmitted frames are
6293 * missing. Request retransmission of missing
6294 * SREJ'd frames.
6295 */
6296 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006297 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006298 BT_DBG("Queued %p (queue len %d)", skb,
6299 skb_queue_len(&chan->srej_q));
6300
6301 l2cap_pass_to_tx(chan, control);
6302 l2cap_send_srej_list(chan, control->txseq);
6303 break;
6304 case L2CAP_TXSEQ_DUPLICATE_SREJ:
6305 /* We've already queued this frame. Drop this copy. */
6306 l2cap_pass_to_tx(chan, control);
6307 break;
6308 case L2CAP_TXSEQ_DUPLICATE:
6309 /* Expecting a later sequence number, so this frame
6310 * was already received. Ignore it completely.
6311 */
6312 break;
6313 case L2CAP_TXSEQ_INVALID_IGNORE:
6314 break;
6315 case L2CAP_TXSEQ_INVALID:
6316 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006317 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006318 break;
6319 }
6320 break;
6321 case L2CAP_EV_RECV_RR:
6322 l2cap_pass_to_tx(chan, control);
6323 if (control->final) {
6324 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6325
6326 if (!test_and_clear_bit(CONN_REJ_ACT,
6327 &chan->conn_state)) {
6328 control->final = 0;
6329 l2cap_retransmit_all(chan, control);
6330 }
6331
6332 l2cap_ertm_send(chan);
6333 } else if (control->poll) {
6334 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6335 &chan->conn_state) &&
6336 chan->unacked_frames) {
6337 __set_retrans_timer(chan);
6338 }
6339
6340 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6341 l2cap_send_srej_tail(chan);
6342 } else {
6343 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6344 &chan->conn_state) &&
6345 chan->unacked_frames)
6346 __set_retrans_timer(chan);
6347
6348 l2cap_send_ack(chan);
6349 }
6350 break;
6351 case L2CAP_EV_RECV_RNR:
6352 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6353 l2cap_pass_to_tx(chan, control);
6354 if (control->poll) {
6355 l2cap_send_srej_tail(chan);
6356 } else {
6357 struct l2cap_ctrl rr_control;
6358 memset(&rr_control, 0, sizeof(rr_control));
6359 rr_control.sframe = 1;
6360 rr_control.super = L2CAP_SUPER_RR;
6361 rr_control.reqseq = chan->buffer_seq;
6362 l2cap_send_sframe(chan, &rr_control);
6363 }
6364
6365 break;
6366 case L2CAP_EV_RECV_REJ:
6367 l2cap_handle_rej(chan, control);
6368 break;
6369 case L2CAP_EV_RECV_SREJ:
6370 l2cap_handle_srej(chan, control);
6371 break;
6372 }
6373
6374 if (skb && !skb_in_use) {
6375 BT_DBG("Freeing %p", skb);
6376 kfree_skb(skb);
6377 }
6378
6379 return err;
6380}
6381
Mat Martineau32b32732012-10-23 15:24:11 -07006382static int l2cap_finish_move(struct l2cap_chan *chan)
6383{
6384 BT_DBG("chan %p", chan);
6385
6386 chan->rx_state = L2CAP_RX_STATE_RECV;
6387
6388 if (chan->hs_hcon)
6389 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6390 else
6391 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6392
6393 return l2cap_resegment(chan);
6394}
6395
6396static int l2cap_rx_state_wait_p(struct l2cap_chan *chan,
6397 struct l2cap_ctrl *control,
6398 struct sk_buff *skb, u8 event)
6399{
6400 int err;
6401
6402 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6403 event);
6404
6405 if (!control->poll)
6406 return -EPROTO;
6407
6408 l2cap_process_reqseq(chan, control->reqseq);
6409
6410 if (!skb_queue_empty(&chan->tx_q))
6411 chan->tx_send_head = skb_peek(&chan->tx_q);
6412 else
6413 chan->tx_send_head = NULL;
6414
6415 /* Rewind next_tx_seq to the point expected
6416 * by the receiver.
6417 */
6418 chan->next_tx_seq = control->reqseq;
6419 chan->unacked_frames = 0;
6420
6421 err = l2cap_finish_move(chan);
6422 if (err)
6423 return err;
6424
6425 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6426 l2cap_send_i_or_rr_or_rnr(chan);
6427
6428 if (event == L2CAP_EV_RECV_IFRAME)
6429 return -EPROTO;
6430
6431 return l2cap_rx_state_recv(chan, control, NULL, event);
6432}
6433
6434static int l2cap_rx_state_wait_f(struct l2cap_chan *chan,
6435 struct l2cap_ctrl *control,
6436 struct sk_buff *skb, u8 event)
6437{
6438 int err;
6439
6440 if (!control->final)
6441 return -EPROTO;
6442
6443 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6444
6445 chan->rx_state = L2CAP_RX_STATE_RECV;
6446 l2cap_process_reqseq(chan, control->reqseq);
6447
6448 if (!skb_queue_empty(&chan->tx_q))
6449 chan->tx_send_head = skb_peek(&chan->tx_q);
6450 else
6451 chan->tx_send_head = NULL;
6452
6453 /* Rewind next_tx_seq to the point expected
6454 * by the receiver.
6455 */
6456 chan->next_tx_seq = control->reqseq;
6457 chan->unacked_frames = 0;
6458
6459 if (chan->hs_hcon)
6460 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6461 else
6462 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6463
6464 err = l2cap_resegment(chan);
6465
6466 if (!err)
6467 err = l2cap_rx_state_recv(chan, control, skb, event);
6468
6469 return err;
6470}
6471
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006472static bool __valid_reqseq(struct l2cap_chan *chan, u16 reqseq)
6473{
6474 /* Make sure reqseq is for a packet that has been sent but not acked */
6475 u16 unacked;
6476
6477 unacked = __seq_offset(chan, chan->next_tx_seq, chan->expected_ack_seq);
6478 return __seq_offset(chan, chan->next_tx_seq, reqseq) <= unacked;
6479}
6480
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006481static int l2cap_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6482 struct sk_buff *skb, u8 event)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006483{
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006484 int err = 0;
6485
6486 BT_DBG("chan %p, control %p, skb %p, event %d, state %d", chan,
6487 control, skb, event, chan->rx_state);
6488
6489 if (__valid_reqseq(chan, control->reqseq)) {
6490 switch (chan->rx_state) {
6491 case L2CAP_RX_STATE_RECV:
6492 err = l2cap_rx_state_recv(chan, control, skb, event);
6493 break;
6494 case L2CAP_RX_STATE_SREJ_SENT:
6495 err = l2cap_rx_state_srej_sent(chan, control, skb,
6496 event);
6497 break;
Mat Martineau32b32732012-10-23 15:24:11 -07006498 case L2CAP_RX_STATE_WAIT_P:
6499 err = l2cap_rx_state_wait_p(chan, control, skb, event);
6500 break;
6501 case L2CAP_RX_STATE_WAIT_F:
6502 err = l2cap_rx_state_wait_f(chan, control, skb, event);
6503 break;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006504 default:
6505 /* shut it down */
6506 break;
6507 }
6508 } else {
6509 BT_DBG("Invalid reqseq %d (next_tx_seq %d, expected_ack_seq %d",
6510 control->reqseq, chan->next_tx_seq,
6511 chan->expected_ack_seq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006512 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006513 }
6514
6515 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006516}
6517
6518static int l2cap_stream_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6519 struct sk_buff *skb)
6520{
Mat Martineau4b51dae92012-05-17 20:53:37 -07006521 int err = 0;
6522
6523 BT_DBG("chan %p, control %p, skb %p, state %d", chan, control, skb,
6524 chan->rx_state);
6525
6526 if (l2cap_classify_txseq(chan, control->txseq) ==
6527 L2CAP_TXSEQ_EXPECTED) {
6528 l2cap_pass_to_tx(chan, control);
6529
6530 BT_DBG("buffer_seq %d->%d", chan->buffer_seq,
6531 __next_seq(chan, chan->buffer_seq));
6532
6533 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
6534
6535 l2cap_reassemble_sdu(chan, skb, control);
6536 } else {
6537 if (chan->sdu) {
6538 kfree_skb(chan->sdu);
6539 chan->sdu = NULL;
6540 }
6541 chan->sdu_last_frag = NULL;
6542 chan->sdu_len = 0;
6543
6544 if (skb) {
6545 BT_DBG("Freeing %p", skb);
6546 kfree_skb(skb);
6547 }
6548 }
6549
6550 chan->last_acked_seq = control->txseq;
6551 chan->expected_tx_seq = __next_seq(chan, control->txseq);
6552
6553 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006554}
6555
6556static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6557{
6558 struct l2cap_ctrl *control = &bt_cb(skb)->control;
6559 u16 len;
6560 u8 event;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006561
Mat Martineaub76bbd62012-04-11 10:48:43 -07006562 __unpack_control(chan, skb);
6563
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006564 len = skb->len;
6565
6566 /*
6567 * We can just drop the corrupted I-frame here.
6568 * Receiver will miss it and start proper recovery
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006569 * procedures and ask for retransmission.
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006570 */
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006571 if (l2cap_check_fcs(chan, skb))
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006572 goto drop;
6573
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006574 if (!control->sframe && control->sar == L2CAP_SAR_START)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006575 len -= L2CAP_SDULEN_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006576
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006577 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006578 len -= L2CAP_FCS_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006579
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006580 if (len > chan->mps) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006581 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006582 goto drop;
6583 }
6584
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006585 if (!control->sframe) {
6586 int err;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006587
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006588 BT_DBG("iframe sar %d, reqseq %d, final %d, txseq %d",
6589 control->sar, control->reqseq, control->final,
6590 control->txseq);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03006591
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006592 /* Validate F-bit - F=0 always valid, F=1 only
6593 * valid in TX WAIT_F
6594 */
6595 if (control->final && chan->tx_state != L2CAP_TX_STATE_WAIT_F)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006596 goto drop;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006597
6598 if (chan->mode != L2CAP_MODE_STREAMING) {
6599 event = L2CAP_EV_RECV_IFRAME;
6600 err = l2cap_rx(chan, control, skb, event);
6601 } else {
6602 err = l2cap_stream_rx(chan, control, skb);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006603 }
6604
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006605 if (err)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006606 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006607 } else {
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006608 const u8 rx_func_to_event[4] = {
6609 L2CAP_EV_RECV_RR, L2CAP_EV_RECV_REJ,
6610 L2CAP_EV_RECV_RNR, L2CAP_EV_RECV_SREJ
6611 };
6612
6613 /* Only I-frames are expected in streaming mode */
6614 if (chan->mode == L2CAP_MODE_STREAMING)
6615 goto drop;
6616
6617 BT_DBG("sframe reqseq %d, final %d, poll %d, super %d",
6618 control->reqseq, control->final, control->poll,
6619 control->super);
6620
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006621 if (len != 0) {
Andrei Emeltchenko1bb166e2012-11-20 17:16:21 +02006622 BT_ERR("Trailing bytes: %d in sframe", len);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006623 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006624 goto drop;
6625 }
6626
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006627 /* Validate F and P bits */
6628 if (control->final && (control->poll ||
6629 chan->tx_state != L2CAP_TX_STATE_WAIT_F))
6630 goto drop;
6631
6632 event = rx_func_to_event[control->super];
6633 if (l2cap_rx(chan, control, skb, event))
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006634 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006635 }
6636
6637 return 0;
6638
6639drop:
6640 kfree_skb(skb);
6641 return 0;
6642}
6643
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006644static void l2cap_chan_le_send_credits(struct l2cap_chan *chan)
6645{
6646 struct l2cap_conn *conn = chan->conn;
6647 struct l2cap_le_credits pkt;
6648 u16 return_credits;
6649
6650 /* We return more credits to the sender only after the amount of
6651 * credits falls below half of the initial amount.
6652 */
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02006653 if (chan->rx_credits >= (le_max_credits + 1) / 2)
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006654 return;
6655
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02006656 return_credits = le_max_credits - chan->rx_credits;
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006657
6658 BT_DBG("chan %p returning %u credits to sender", chan, return_credits);
6659
6660 chan->rx_credits += return_credits;
6661
6662 pkt.cid = cpu_to_le16(chan->scid);
6663 pkt.credits = cpu_to_le16(return_credits);
6664
6665 chan->ident = l2cap_get_ident(conn);
6666
6667 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CREDITS, sizeof(pkt), &pkt);
6668}
6669
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006670static int l2cap_le_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6671{
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006672 int err;
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006673
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006674 if (!chan->rx_credits) {
6675 BT_ERR("No credits to receive LE L2CAP data");
Johan Hedbergdfd97742014-01-27 15:11:34 -08006676 l2cap_send_disconn_req(chan, ECONNRESET);
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006677 return -ENOBUFS;
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006678 }
6679
6680 if (chan->imtu < skb->len) {
6681 BT_ERR("Too big LE L2CAP PDU");
6682 return -ENOBUFS;
6683 }
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006684
6685 chan->rx_credits--;
6686 BT_DBG("rx_credits %u -> %u", chan->rx_credits + 1, chan->rx_credits);
6687
6688 l2cap_chan_le_send_credits(chan);
6689
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006690 err = 0;
6691
6692 if (!chan->sdu) {
6693 u16 sdu_len;
6694
6695 sdu_len = get_unaligned_le16(skb->data);
6696 skb_pull(skb, L2CAP_SDULEN_SIZE);
6697
6698 BT_DBG("Start of new SDU. sdu_len %u skb->len %u imtu %u",
6699 sdu_len, skb->len, chan->imtu);
6700
6701 if (sdu_len > chan->imtu) {
6702 BT_ERR("Too big LE L2CAP SDU length received");
6703 err = -EMSGSIZE;
6704 goto failed;
6705 }
6706
6707 if (skb->len > sdu_len) {
6708 BT_ERR("Too much LE L2CAP data received");
6709 err = -EINVAL;
6710 goto failed;
6711 }
6712
6713 if (skb->len == sdu_len)
6714 return chan->ops->recv(chan, skb);
6715
6716 chan->sdu = skb;
6717 chan->sdu_len = sdu_len;
6718 chan->sdu_last_frag = skb;
6719
6720 return 0;
6721 }
6722
6723 BT_DBG("SDU fragment. chan->sdu->len %u skb->len %u chan->sdu_len %u",
6724 chan->sdu->len, skb->len, chan->sdu_len);
6725
6726 if (chan->sdu->len + skb->len > chan->sdu_len) {
6727 BT_ERR("Too much LE L2CAP data received");
6728 err = -EINVAL;
6729 goto failed;
6730 }
6731
6732 append_skb_frag(chan->sdu, skb, &chan->sdu_last_frag);
6733 skb = NULL;
6734
6735 if (chan->sdu->len == chan->sdu_len) {
6736 err = chan->ops->recv(chan, chan->sdu);
6737 if (!err) {
6738 chan->sdu = NULL;
6739 chan->sdu_last_frag = NULL;
6740 chan->sdu_len = 0;
6741 }
6742 }
6743
6744failed:
6745 if (err) {
6746 kfree_skb(skb);
6747 kfree_skb(chan->sdu);
6748 chan->sdu = NULL;
6749 chan->sdu_last_frag = NULL;
6750 chan->sdu_len = 0;
6751 }
6752
6753 /* We can't return an error here since we took care of the skb
6754 * freeing internally. An error return would cause the caller to
6755 * do a double-free of the skb.
6756 */
6757 return 0;
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006758}
6759
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006760static void l2cap_data_channel(struct l2cap_conn *conn, u16 cid,
6761 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006762{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006763 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006764
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03006765 chan = l2cap_get_chan_by_scid(conn, cid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006766 if (!chan) {
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006767 if (cid == L2CAP_CID_A2MP) {
6768 chan = a2mp_channel_create(conn, skb);
6769 if (!chan) {
6770 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006771 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006772 }
6773
6774 l2cap_chan_lock(chan);
6775 } else {
6776 BT_DBG("unknown cid 0x%4.4x", cid);
6777 /* Drop packet and return */
6778 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006779 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006780 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006781 }
6782
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03006783 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006784
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03006785 if (chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006786 goto drop;
6787
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006788 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03006789 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006790 if (l2cap_le_data_rcv(chan, skb) < 0)
6791 goto drop;
6792
6793 goto done;
6794
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006795 case L2CAP_MODE_BASIC:
6796 /* If socket recv buffers overflows we drop data here
6797 * which is *bad* because L2CAP has to be reliable.
6798 * But we don't have any other choice. L2CAP doesn't
6799 * provide flow control mechanism. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07006800
Szymon Janc2c96e032014-02-18 20:48:34 +01006801 if (chan->imtu < skb->len) {
6802 BT_ERR("Dropping L2CAP data: receive buffer overflow");
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006803 goto drop;
Szymon Janc2c96e032014-02-18 20:48:34 +01006804 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006805
Gustavo Padovan80b98022012-05-27 22:27:51 -03006806 if (!chan->ops->recv(chan, skb))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006807 goto done;
6808 break;
6809
6810 case L2CAP_MODE_ERTM:
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006811 case L2CAP_MODE_STREAMING:
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006812 l2cap_data_rcv(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006813 goto done;
6814
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006815 default:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006816 BT_DBG("chan %p: bad mode 0x%2.2x", chan, chan->mode);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006817 break;
6818 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006819
6820drop:
6821 kfree_skb(skb);
6822
6823done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006824 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006825}
6826
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006827static void l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm,
6828 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006829{
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006830 struct hci_conn *hcon = conn->hcon;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006831 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006832
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006833 if (hcon->type != ACL_LINK)
6834 goto drop;
6835
Johan Hedbergbf20fd42013-05-14 13:23:13 +03006836 chan = l2cap_global_chan_by_psm(0, psm, &hcon->src, &hcon->dst,
6837 ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006838 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006839 goto drop;
6840
Andrei Emeltchenko5b4ceda2012-02-24 16:35:32 +02006841 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006842
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03006843 if (chan->state != BT_BOUND && chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006844 goto drop;
6845
Vinicius Costa Gomese13e21d2011-06-17 22:46:27 -03006846 if (chan->imtu < skb->len)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006847 goto drop;
6848
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006849 /* Store remote BD_ADDR and PSM for msg_name */
Marcel Holtmann06ae3312013-10-18 03:43:00 -07006850 bacpy(&bt_cb(skb)->bdaddr, &hcon->dst);
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006851 bt_cb(skb)->psm = psm;
6852
Gustavo Padovan80b98022012-05-27 22:27:51 -03006853 if (!chan->ops->recv(chan, skb))
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006854 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006855
6856drop:
6857 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006858}
6859
Marcel Holtmann72f78352013-04-23 00:59:00 -07006860static void l2cap_att_channel(struct l2cap_conn *conn,
Andrei Emeltchenko6810fca2012-05-31 11:18:57 +03006861 struct sk_buff *skb)
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006862{
Marcel Holtmannb99707d2013-10-03 02:54:11 -07006863 struct hci_conn *hcon = conn->hcon;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006864 struct l2cap_chan *chan;
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006865
Marcel Holtmannb99707d2013-10-03 02:54:11 -07006866 if (hcon->type != LE_LINK)
6867 goto drop;
6868
Johan Hedbergaf1c0132013-04-29 19:35:42 +03006869 chan = l2cap_global_chan_by_scid(BT_CONNECTED, L2CAP_CID_ATT,
Marcel Holtmann06ae3312013-10-18 03:43:00 -07006870 &hcon->src, &hcon->dst);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006871 if (!chan)
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006872 goto drop;
6873
Andrei Emeltchenko5b4ceda2012-02-24 16:35:32 +02006874 BT_DBG("chan %p, len %d", chan, skb->len);
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006875
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07006876 if (hci_blacklist_lookup(hcon->hdev, &hcon->dst, hcon->dst_type))
6877 goto drop;
6878
Vinicius Costa Gomese13e21d2011-06-17 22:46:27 -03006879 if (chan->imtu < skb->len)
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006880 goto drop;
6881
Gustavo Padovan80b98022012-05-27 22:27:51 -03006882 if (!chan->ops->recv(chan, skb))
Andrei Emeltchenko6810fca2012-05-31 11:18:57 +03006883 return;
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006884
6885drop:
6886 kfree_skb(skb);
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006887}
6888
Linus Torvalds1da177e2005-04-16 15:20:36 -07006889static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb)
6890{
6891 struct l2cap_hdr *lh = (void *) skb->data;
Johan Hedberg61a939c2014-01-17 20:45:11 +02006892 struct hci_conn *hcon = conn->hcon;
Al Viro8e036fc2007-07-29 00:16:36 -07006893 u16 cid, len;
6894 __le16 psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006895
Johan Hedberg61a939c2014-01-17 20:45:11 +02006896 if (hcon->state != BT_CONNECTED) {
6897 BT_DBG("queueing pending rx skb");
6898 skb_queue_tail(&conn->pending_rx, skb);
6899 return;
6900 }
6901
Linus Torvalds1da177e2005-04-16 15:20:36 -07006902 skb_pull(skb, L2CAP_HDR_SIZE);
6903 cid = __le16_to_cpu(lh->cid);
6904 len = __le16_to_cpu(lh->len);
6905
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006906 if (len != skb->len) {
6907 kfree_skb(skb);
6908 return;
6909 }
6910
Linus Torvalds1da177e2005-04-16 15:20:36 -07006911 BT_DBG("len %d, cid 0x%4.4x", len, cid);
6912
6913 switch (cid) {
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006914 case L2CAP_CID_SIGNALING:
Linus Torvalds1da177e2005-04-16 15:20:36 -07006915 l2cap_sig_channel(conn, skb);
6916 break;
6917
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006918 case L2CAP_CID_CONN_LESS:
Andrei Emeltchenko097db762012-03-09 14:16:17 +02006919 psm = get_unaligned((__le16 *) skb->data);
Andrei Emeltchenko0181a702012-05-29 10:04:05 +03006920 skb_pull(skb, L2CAP_PSMLEN_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006921 l2cap_conless_channel(conn, psm, skb);
6922 break;
6923
Johan Hedberg073d1cf2013-04-29 19:35:35 +03006924 case L2CAP_CID_ATT:
Marcel Holtmann72f78352013-04-23 00:59:00 -07006925 l2cap_att_channel(conn, skb);
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006926 break;
6927
Marcel Holtmanna2877622013-10-02 23:46:54 -07006928 case L2CAP_CID_LE_SIGNALING:
6929 l2cap_le_sig_channel(conn, skb);
6930 break;
6931
Anderson Brigliab501d6a2011-06-07 18:46:31 -03006932 case L2CAP_CID_SMP:
6933 if (smp_sig_channel(conn, skb))
6934 l2cap_conn_del(conn->hcon, EACCES);
6935 break;
6936
Jukka Rissanen18722c22013-12-11 17:05:37 +02006937 case L2CAP_FC_6LOWPAN:
6938 bt_6lowpan_recv(conn, skb);
6939 break;
6940
Linus Torvalds1da177e2005-04-16 15:20:36 -07006941 default:
6942 l2cap_data_channel(conn, cid, skb);
6943 break;
6944 }
6945}
6946
Johan Hedberg61a939c2014-01-17 20:45:11 +02006947static void process_pending_rx(struct work_struct *work)
6948{
6949 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
6950 pending_rx_work);
6951 struct sk_buff *skb;
6952
6953 BT_DBG("");
6954
6955 while ((skb = skb_dequeue(&conn->pending_rx)))
6956 l2cap_recv_frame(conn, skb);
6957}
6958
Johan Hedberg162b49e2014-01-17 20:45:10 +02006959static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon)
6960{
6961 struct l2cap_conn *conn = hcon->l2cap_data;
6962 struct hci_chan *hchan;
6963
6964 if (conn)
6965 return conn;
6966
6967 hchan = hci_chan_create(hcon);
6968 if (!hchan)
6969 return NULL;
6970
6971 conn = kzalloc(sizeof(struct l2cap_conn), GFP_KERNEL);
6972 if (!conn) {
6973 hci_chan_del(hchan);
6974 return NULL;
6975 }
6976
6977 kref_init(&conn->ref);
6978 hcon->l2cap_data = conn;
6979 conn->hcon = hcon;
6980 hci_conn_get(conn->hcon);
6981 conn->hchan = hchan;
6982
6983 BT_DBG("hcon %p conn %p hchan %p", hcon, conn, hchan);
6984
6985 switch (hcon->type) {
6986 case LE_LINK:
6987 if (hcon->hdev->le_mtu) {
6988 conn->mtu = hcon->hdev->le_mtu;
6989 break;
6990 }
6991 /* fall through */
6992 default:
6993 conn->mtu = hcon->hdev->acl_mtu;
6994 break;
6995 }
6996
6997 conn->feat_mask = 0;
6998
6999 if (hcon->type == ACL_LINK)
7000 conn->hs_enabled = test_bit(HCI_HS_ENABLED,
7001 &hcon->hdev->dev_flags);
7002
7003 spin_lock_init(&conn->lock);
7004 mutex_init(&conn->chan_lock);
7005
7006 INIT_LIST_HEAD(&conn->chan_l);
7007 INIT_LIST_HEAD(&conn->users);
7008
7009 if (hcon->type == LE_LINK)
7010 INIT_DELAYED_WORK(&conn->security_timer, security_timeout);
7011 else
7012 INIT_DELAYED_WORK(&conn->info_timer, l2cap_info_timeout);
7013
Johan Hedberg61a939c2014-01-17 20:45:11 +02007014 skb_queue_head_init(&conn->pending_rx);
7015 INIT_WORK(&conn->pending_rx_work, process_pending_rx);
7016
Johan Hedberg162b49e2014-01-17 20:45:10 +02007017 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
7018
7019 return conn;
7020}
7021
7022static bool is_valid_psm(u16 psm, u8 dst_type) {
7023 if (!psm)
7024 return false;
7025
7026 if (bdaddr_type_is_le(dst_type))
7027 return (psm <= 0x00ff);
7028
7029 /* PSM must be odd and lsb of upper byte must be 0 */
7030 return ((psm & 0x0101) == 0x0001);
7031}
7032
7033int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
7034 bdaddr_t *dst, u8 dst_type)
7035{
7036 struct l2cap_conn *conn;
7037 struct hci_conn *hcon;
7038 struct hci_dev *hdev;
7039 __u8 auth_type;
7040 int err;
7041
7042 BT_DBG("%pMR -> %pMR (type %u) psm 0x%2.2x", &chan->src, dst,
7043 dst_type, __le16_to_cpu(psm));
7044
7045 hdev = hci_get_route(dst, &chan->src);
7046 if (!hdev)
7047 return -EHOSTUNREACH;
7048
7049 hci_dev_lock(hdev);
7050
7051 l2cap_chan_lock(chan);
7052
7053 if (!is_valid_psm(__le16_to_cpu(psm), dst_type) && !cid &&
7054 chan->chan_type != L2CAP_CHAN_RAW) {
7055 err = -EINVAL;
7056 goto done;
7057 }
7058
Johan Hedberg21626e62014-01-24 10:35:41 +02007059 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED && !psm) {
7060 err = -EINVAL;
7061 goto done;
7062 }
7063
7064 if (chan->chan_type == L2CAP_CHAN_FIXED && !cid) {
Johan Hedberg162b49e2014-01-17 20:45:10 +02007065 err = -EINVAL;
7066 goto done;
7067 }
7068
7069 switch (chan->mode) {
7070 case L2CAP_MODE_BASIC:
7071 break;
7072 case L2CAP_MODE_LE_FLOWCTL:
7073 l2cap_le_flowctl_init(chan);
7074 break;
7075 case L2CAP_MODE_ERTM:
7076 case L2CAP_MODE_STREAMING:
7077 if (!disable_ertm)
7078 break;
7079 /* fall through */
7080 default:
7081 err = -ENOTSUPP;
7082 goto done;
7083 }
7084
7085 switch (chan->state) {
7086 case BT_CONNECT:
7087 case BT_CONNECT2:
7088 case BT_CONFIG:
7089 /* Already connecting */
7090 err = 0;
7091 goto done;
7092
7093 case BT_CONNECTED:
7094 /* Already connected */
7095 err = -EISCONN;
7096 goto done;
7097
7098 case BT_OPEN:
7099 case BT_BOUND:
7100 /* Can connect */
7101 break;
7102
7103 default:
7104 err = -EBADFD;
7105 goto done;
7106 }
7107
7108 /* Set destination address and psm */
7109 bacpy(&chan->dst, dst);
7110 chan->dst_type = dst_type;
7111
7112 chan->psm = psm;
7113 chan->dcid = cid;
7114
7115 auth_type = l2cap_get_auth_type(chan);
7116
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007117 if (bdaddr_type_is_le(dst_type)) {
7118 /* Convert from L2CAP channel address type to HCI address type
7119 */
7120 if (dst_type == BDADDR_LE_PUBLIC)
7121 dst_type = ADDR_LE_DEV_PUBLIC;
7122 else
7123 dst_type = ADDR_LE_DEV_RANDOM;
7124
Andre Guedes04a6c582014-02-26 20:21:44 -03007125 hcon = hci_connect_le(hdev, dst, dst_type, chan->sec_level,
7126 auth_type);
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007127 } else {
Andre Guedes04a6c582014-02-26 20:21:44 -03007128 hcon = hci_connect_acl(hdev, dst, chan->sec_level, auth_type);
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007129 }
Johan Hedberg162b49e2014-01-17 20:45:10 +02007130
7131 if (IS_ERR(hcon)) {
7132 err = PTR_ERR(hcon);
7133 goto done;
7134 }
7135
7136 conn = l2cap_conn_add(hcon);
7137 if (!conn) {
7138 hci_conn_drop(hcon);
7139 err = -ENOMEM;
7140 goto done;
7141 }
7142
7143 if (cid && __l2cap_get_chan_by_dcid(conn, cid)) {
7144 hci_conn_drop(hcon);
7145 err = -EBUSY;
7146 goto done;
7147 }
7148
7149 /* Update source addr of the socket */
7150 bacpy(&chan->src, &hcon->src);
7151 chan->src_type = bdaddr_type(hcon, hcon->src_type);
7152
7153 l2cap_chan_unlock(chan);
7154 l2cap_chan_add(conn, chan);
7155 l2cap_chan_lock(chan);
7156
7157 /* l2cap_chan_add takes its own ref so we can drop this one */
7158 hci_conn_drop(hcon);
7159
7160 l2cap_state_change(chan, BT_CONNECT);
7161 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
7162
Johan Hedberg61202e42014-01-28 15:16:48 -08007163 /* Release chan->sport so that it can be reused by other
7164 * sockets (as it's only used for listening sockets).
7165 */
7166 write_lock(&chan_list_lock);
7167 chan->sport = 0;
7168 write_unlock(&chan_list_lock);
7169
Johan Hedberg162b49e2014-01-17 20:45:10 +02007170 if (hcon->state == BT_CONNECTED) {
7171 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
7172 __clear_chan_timer(chan);
7173 if (l2cap_chan_check_security(chan))
7174 l2cap_state_change(chan, BT_CONNECTED);
7175 } else
7176 l2cap_do_start(chan);
7177 }
7178
7179 err = 0;
7180
7181done:
7182 l2cap_chan_unlock(chan);
7183 hci_dev_unlock(hdev);
7184 hci_dev_put(hdev);
7185 return err;
7186}
7187
Linus Torvalds1da177e2005-04-16 15:20:36 -07007188/* ---- L2CAP interface with lower layer (HCI) ---- */
7189
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007190int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007191{
7192 int exact = 0, lm1 = 0, lm2 = 0;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007193 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007194
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03007195 BT_DBG("hdev %s, bdaddr %pMR", hdev->name, bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007196
7197 /* Find listening sockets and check their link_mode */
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007198 read_lock(&chan_list_lock);
7199 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007200 if (c->state != BT_LISTEN)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007201 continue;
7202
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007203 if (!bacmp(&c->src, &hdev->bdaddr)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007204 lm1 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03007205 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007206 lm1 |= HCI_LM_MASTER;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007207 exact++;
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007208 } else if (!bacmp(&c->src, BDADDR_ANY)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007209 lm2 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03007210 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007211 lm2 |= HCI_LM_MASTER;
7212 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007213 }
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007214 read_unlock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007215
7216 return exact ? lm1 : lm2;
7217}
7218
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03007219void l2cap_connect_cfm(struct hci_conn *hcon, u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007220{
Marcel Holtmann01394182006-07-03 10:02:46 +02007221 struct l2cap_conn *conn;
7222
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03007223 BT_DBG("hcon %p bdaddr %pMR status %d", hcon, &hcon->dst, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007224
Linus Torvalds1da177e2005-04-16 15:20:36 -07007225 if (!status) {
Claudio Takahasibaf43252013-04-11 13:55:50 -03007226 conn = l2cap_conn_add(hcon);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007227 if (conn)
7228 l2cap_conn_ready(conn);
Andrei Emeltchenkoba6fc312012-10-31 15:46:26 +02007229 } else {
Joe Perchese1750722011-06-29 18:18:29 -07007230 l2cap_conn_del(hcon, bt_to_errno(status));
Andrei Emeltchenkoba6fc312012-10-31 15:46:26 +02007231 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007232}
7233
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007234int l2cap_disconn_ind(struct hci_conn *hcon)
Marcel Holtmann2950f212009-02-12 14:02:50 +01007235{
7236 struct l2cap_conn *conn = hcon->l2cap_data;
7237
7238 BT_DBG("hcon %p", hcon);
7239
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007240 if (!conn)
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02007241 return HCI_ERROR_REMOTE_USER_TERM;
Marcel Holtmann2950f212009-02-12 14:02:50 +01007242 return conn->disc_reason;
7243}
7244
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03007245void l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007246{
7247 BT_DBG("hcon %p reason %d", hcon, reason);
7248
Jukka Rissanen18722c22013-12-11 17:05:37 +02007249 bt_6lowpan_del_conn(hcon->l2cap_data);
7250
Joe Perchese1750722011-06-29 18:18:29 -07007251 l2cap_conn_del(hcon, bt_to_errno(reason));
Linus Torvalds1da177e2005-04-16 15:20:36 -07007252}
7253
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007254static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt)
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007255{
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03007256 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED)
Marcel Holtmann255c7602009-02-04 21:07:19 +01007257 return;
7258
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007259 if (encrypt == 0x00) {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007260 if (chan->sec_level == BT_SECURITY_MEDIUM) {
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007261 __set_chan_timer(chan, L2CAP_ENC_TIMEOUT);
Marcel Holtmann7d513e92014-01-15 22:37:40 -08007262 } else if (chan->sec_level == BT_SECURITY_HIGH ||
7263 chan->sec_level == BT_SECURITY_FIPS)
Gustavo F. Padovan0f852722011-05-04 19:42:50 -03007264 l2cap_chan_close(chan, ECONNREFUSED);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007265 } else {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007266 if (chan->sec_level == BT_SECURITY_MEDIUM)
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -03007267 __clear_chan_timer(chan);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007268 }
7269}
7270
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007271int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007272{
Marcel Holtmann40be4922008-07-14 20:13:50 +02007273 struct l2cap_conn *conn = hcon->l2cap_data;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03007274 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007275
Marcel Holtmann01394182006-07-03 10:02:46 +02007276 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007277 return 0;
Marcel Holtmann01394182006-07-03 10:02:46 +02007278
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03007279 BT_DBG("conn %p status 0x%2.2x encrypt %u", conn, status, encrypt);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007280
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03007281 if (hcon->type == LE_LINK) {
Hemant Gupta35d4adcc2012-04-18 14:46:26 +05307282 if (!status && encrypt)
Johan Hedberg4bd6d382014-02-26 23:33:45 +02007283 smp_distribute_keys(conn);
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02007284 cancel_delayed_work(&conn->security_timer);
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03007285 }
7286
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007287 mutex_lock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007288
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007289 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007290 l2cap_chan_lock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007291
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03007292 BT_DBG("chan %p scid 0x%4.4x state %s", chan, chan->scid,
7293 state_to_string(chan->state));
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007294
Johan Hedberg2338a7e2014-01-24 10:35:40 +02007295 if (chan->scid == L2CAP_CID_A2MP) {
Andrei Emeltchenko78eb2f92012-07-19 17:03:47 +03007296 l2cap_chan_unlock(chan);
7297 continue;
7298 }
7299
Johan Hedberg073d1cf2013-04-29 19:35:35 +03007300 if (chan->scid == L2CAP_CID_ATT) {
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007301 if (!status && encrypt) {
7302 chan->sec_level = hcon->sec_level;
Andrei Emeltchenkocf4cd002012-02-06 15:03:59 +02007303 l2cap_chan_ready(chan);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007304 }
7305
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007306 l2cap_chan_unlock(chan);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007307 continue;
7308 }
7309
Andrei Emeltchenko96eff462012-11-15 18:14:53 +02007310 if (!__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007311 l2cap_chan_unlock(chan);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01007312 continue;
7313 }
7314
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007315 if (!status && (chan->state == BT_CONNECTED ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01007316 chan->state == BT_CONFIG)) {
Marcel Holtmannd97c8992013-10-14 02:53:54 -07007317 chan->ops->resume(chan);
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007318 l2cap_check_encryption(chan, encrypt);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007319 l2cap_chan_unlock(chan);
Marcel Holtmann9719f8a2008-07-14 20:13:45 +02007320 continue;
7321 }
7322
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007323 if (chan->state == BT_CONNECT) {
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007324 if (!status)
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03007325 l2cap_start_connection(chan);
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007326 else
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007327 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007328 } else if (chan->state == BT_CONNECT2) {
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007329 struct l2cap_conn_rsp rsp;
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007330 __u16 res, stat;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007331
7332 if (!status) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07007333 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007334 res = L2CAP_CR_PEND;
7335 stat = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08007336 chan->ops->defer(chan);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007337 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007338 l2cap_state_change(chan, BT_CONFIG);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007339 res = L2CAP_CR_SUCCESS;
7340 stat = L2CAP_CS_NO_INFO;
7341 }
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007342 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007343 l2cap_state_change(chan, BT_DISCONN);
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007344 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007345 res = L2CAP_CR_SEC_BLOCK;
7346 stat = L2CAP_CS_NO_INFO;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007347 }
7348
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03007349 rsp.scid = cpu_to_le16(chan->dcid);
7350 rsp.dcid = cpu_to_le16(chan->scid);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007351 rsp.result = cpu_to_le16(res);
7352 rsp.status = cpu_to_le16(stat);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03007353 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01007354 sizeof(rsp), &rsp);
Mat Martineau2d369352012-05-23 14:59:30 -07007355
7356 if (!test_bit(CONF_REQ_SENT, &chan->conf_state) &&
7357 res == L2CAP_CR_SUCCESS) {
7358 char buf[128];
7359 set_bit(CONF_REQ_SENT, &chan->conf_state);
7360 l2cap_send_cmd(conn, l2cap_get_ident(conn),
7361 L2CAP_CONF_REQ,
7362 l2cap_build_conf_req(chan, buf),
7363 buf);
7364 chan->num_conf_req++;
7365 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007366 }
7367
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007368 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007369 }
7370
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007371 mutex_unlock(&conn->chan_lock);
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007372
Linus Torvalds1da177e2005-04-16 15:20:36 -07007373 return 0;
7374}
7375
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007376int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007377{
7378 struct l2cap_conn *conn = hcon->l2cap_data;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007379 struct l2cap_hdr *hdr;
7380 int len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007381
Andrei Emeltchenko1d13a252012-10-15 11:58:41 +03007382 /* For AMP controller do not create l2cap conn */
7383 if (!conn && hcon->hdev->dev_type != HCI_BREDR)
7384 goto drop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007385
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007386 if (!conn)
Claudio Takahasibaf43252013-04-11 13:55:50 -03007387 conn = l2cap_conn_add(hcon);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007388
7389 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007390 goto drop;
7391
7392 BT_DBG("conn %p len %d flags 0x%x", conn, skb->len, flags);
7393
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007394 switch (flags) {
7395 case ACL_START:
7396 case ACL_START_NO_FLUSH:
7397 case ACL_COMPLETE:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007398 if (conn->rx_len) {
7399 BT_ERR("Unexpected start frame (len %d)", skb->len);
7400 kfree_skb(conn->rx_skb);
7401 conn->rx_skb = NULL;
7402 conn->rx_len = 0;
7403 l2cap_conn_unreliable(conn, ECOMM);
7404 }
7405
Andrei Emeltchenkoaae7fe22010-09-15 14:28:43 +03007406 /* Start fragment always begin with Basic L2CAP header */
7407 if (skb->len < L2CAP_HDR_SIZE) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07007408 BT_ERR("Frame is too short (len %d)", skb->len);
7409 l2cap_conn_unreliable(conn, ECOMM);
7410 goto drop;
7411 }
7412
7413 hdr = (struct l2cap_hdr *) skb->data;
7414 len = __le16_to_cpu(hdr->len) + L2CAP_HDR_SIZE;
7415
7416 if (len == skb->len) {
7417 /* Complete frame received */
7418 l2cap_recv_frame(conn, skb);
7419 return 0;
7420 }
7421
7422 BT_DBG("Start: total len %d, frag len %d", len, skb->len);
7423
7424 if (skb->len > len) {
7425 BT_ERR("Frame is too long (len %d, expected len %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007426 skb->len, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007427 l2cap_conn_unreliable(conn, ECOMM);
7428 goto drop;
7429 }
7430
7431 /* Allocate skb for the complete frame (with header) */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03007432 conn->rx_skb = bt_skb_alloc(len, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03007433 if (!conn->rx_skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007434 goto drop;
7435
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007436 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007437 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007438 conn->rx_len = len - skb->len;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007439 break;
7440
7441 case ACL_CONT:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007442 BT_DBG("Cont: frag len %d (expecting %d)", skb->len, conn->rx_len);
7443
7444 if (!conn->rx_len) {
7445 BT_ERR("Unexpected continuation frame (len %d)", skb->len);
7446 l2cap_conn_unreliable(conn, ECOMM);
7447 goto drop;
7448 }
7449
7450 if (skb->len > conn->rx_len) {
7451 BT_ERR("Fragment is too long (len %d, expected %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007452 skb->len, conn->rx_len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007453 kfree_skb(conn->rx_skb);
7454 conn->rx_skb = NULL;
7455 conn->rx_len = 0;
7456 l2cap_conn_unreliable(conn, ECOMM);
7457 goto drop;
7458 }
7459
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007460 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007461 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007462 conn->rx_len -= skb->len;
7463
7464 if (!conn->rx_len) {
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007465 /* Complete frame received. l2cap_recv_frame
7466 * takes ownership of the skb so set the global
7467 * rx_skb pointer to NULL first.
7468 */
7469 struct sk_buff *rx_skb = conn->rx_skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007470 conn->rx_skb = NULL;
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007471 l2cap_recv_frame(conn, rx_skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007472 }
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007473 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007474 }
7475
7476drop:
7477 kfree_skb(skb);
7478 return 0;
7479}
7480
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007481static int l2cap_debugfs_show(struct seq_file *f, void *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007482{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007483 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007484
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007485 read_lock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007486
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007487 list_for_each_entry(c, &chan_list, global_l) {
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03007488 seq_printf(f, "%pMR %pMR %d %d 0x%4.4x 0x%4.4x %d %d %d %d\n",
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007489 &c->src, &c->dst,
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03007490 c->state, __le16_to_cpu(c->psm),
7491 c->scid, c->dcid, c->imtu, c->omtu,
7492 c->sec_level, c->mode);
Andrei Emeltchenko61e1b4b2012-01-19 11:19:50 +02007493 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007494
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007495 read_unlock(&chan_list_lock);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007496
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007497 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007498}
7499
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007500static int l2cap_debugfs_open(struct inode *inode, struct file *file)
7501{
7502 return single_open(file, l2cap_debugfs_show, inode->i_private);
7503}
7504
7505static const struct file_operations l2cap_debugfs_fops = {
7506 .open = l2cap_debugfs_open,
7507 .read = seq_read,
7508 .llseek = seq_lseek,
7509 .release = single_release,
7510};
7511
7512static struct dentry *l2cap_debugfs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007513
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007514int __init l2cap_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007515{
7516 int err;
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007517
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007518 err = l2cap_init_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007519 if (err < 0)
7520 return err;
7521
Marcel Holtmann1120e4b2013-10-17 17:24:16 -07007522 if (IS_ERR_OR_NULL(bt_debugfs))
7523 return 0;
7524
7525 l2cap_debugfs = debugfs_create_file("l2cap", 0444, bt_debugfs,
7526 NULL, &l2cap_debugfs_fops);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007527
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02007528 debugfs_create_u16("l2cap_le_max_credits", 0466, bt_debugfs,
7529 &le_max_credits);
7530 debugfs_create_u16("l2cap_le_default_mps", 0466, bt_debugfs,
7531 &le_default_mps);
7532
Jukka Rissanen18722c22013-12-11 17:05:37 +02007533 bt_6lowpan_init();
7534
Linus Torvalds1da177e2005-04-16 15:20:36 -07007535 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007536}
7537
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007538void l2cap_exit(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007539{
Jukka Rissanen18722c22013-12-11 17:05:37 +02007540 bt_6lowpan_cleanup();
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007541 debugfs_remove(l2cap_debugfs);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007542 l2cap_cleanup_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007543}
7544
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03007545module_param(disable_ertm, bool, 0644);
7546MODULE_PARM_DESC(disable_ertm, "Disable enhanced retransmission mode");