blob: 6ace116f3b394ec8b83e5751694318f736254da1 [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;
Mat Martineauc20f8e32012-07-10 05:47:07 -0700474 chan->ack_win = L2CAP_DEFAULT_TX_WINDOW;
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300475 chan->sec_level = BT_SECURITY_LOW;
476
477 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
478}
479
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200480static void l2cap_le_flowctl_init(struct l2cap_chan *chan)
Johan Hedberg38319712013-05-17 12:49:23 +0300481{
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200482 chan->sdu = NULL;
483 chan->sdu_last_frag = NULL;
484 chan->sdu_len = 0;
Johan Hedberg0cd75f72013-05-17 13:09:05 +0300485 chan->tx_credits = 0;
Johan Hedbergf15b8ec2013-12-03 15:08:25 +0200486 chan->rx_credits = le_max_credits;
Johan Hedbergd1d79412014-01-27 15:11:33 -0800487 chan->mps = min_t(u16, chan->imtu, le_default_mps);
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200488
489 skb_queue_head_init(&chan->tx_q);
Johan Hedberg38319712013-05-17 12:49:23 +0300490}
491
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +0300492void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
Marcel Holtmann01394182006-07-03 10:02:46 +0200493{
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -0300494 BT_DBG("conn %p, psm 0x%2.2x, dcid 0x%4.4x", conn,
Andrei Emeltchenko097db762012-03-09 14:16:17 +0200495 __le16_to_cpu(chan->psm), chan->dcid);
Marcel Holtmann01394182006-07-03 10:02:46 +0200496
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +0200497 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
Marcel Holtmann2950f212009-02-12 14:02:50 +0100498
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300499 chan->conn = conn;
Marcel Holtmann01394182006-07-03 10:02:46 +0200500
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200501 switch (chan->chan_type) {
502 case L2CAP_CHAN_CONN_ORIENTED:
Johan Hedberg21626e62014-01-24 10:35:41 +0200503 /* Alloc CID for connection-oriented socket */
504 chan->scid = l2cap_alloc_cid(conn);
505 if (conn->hcon->type == ACL_LINK)
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300506 chan->omtu = L2CAP_DEFAULT_MTU;
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200507 break;
508
509 case L2CAP_CHAN_CONN_LESS:
Marcel Holtmann01394182006-07-03 10:02:46 +0200510 /* Connectionless socket */
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300511 chan->scid = L2CAP_CID_CONN_LESS;
512 chan->dcid = L2CAP_CID_CONN_LESS;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300513 chan->omtu = L2CAP_DEFAULT_MTU;
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200514 break;
515
Johan Hedberg2338a7e2014-01-24 10:35:40 +0200516 case L2CAP_CHAN_FIXED:
517 /* Caller will set CID and CID specific MTU values */
Andrei Emeltchenko416fa752012-05-29 13:59:16 +0300518 break;
519
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200520 default:
Marcel Holtmann01394182006-07-03 10:02:46 +0200521 /* Raw socket can send/recv signalling messages only */
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300522 chan->scid = L2CAP_CID_SIGNALING;
523 chan->dcid = L2CAP_CID_SIGNALING;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300524 chan->omtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann01394182006-07-03 10:02:46 +0200525 }
526
Andrei Emeltchenko8f7975b2011-10-13 16:18:54 +0300527 chan->local_id = L2CAP_BESTEFFORT_ID;
528 chan->local_stype = L2CAP_SERV_BESTEFFORT;
529 chan->local_msdu = L2CAP_DEFAULT_MAX_SDU_SIZE;
530 chan->local_sdu_itime = L2CAP_DEFAULT_SDU_ITIME;
531 chan->local_acc_lat = L2CAP_DEFAULT_ACC_LAT;
Andrei Emeltchenko8936fa62012-10-08 11:14:41 +0300532 chan->local_flush_to = L2CAP_EFS_DEFAULT_FLUSH_TO;
Andrei Emeltchenko8f7975b2011-10-13 16:18:54 +0300533
Ulisses Furquim371fd832011-12-21 20:02:36 -0200534 l2cap_chan_hold(chan);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300535
Johan Hedberg5ee98912013-04-29 19:35:43 +0300536 hci_conn_hold(conn->hcon);
537
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200538 list_add(&chan->list, &conn->chan_l);
Andrei Emeltchenko643162a2012-02-22 17:11:55 +0200539}
540
Andrei Emeltchenko466f8002012-05-29 13:59:01 +0300541void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
Andrei Emeltchenko643162a2012-02-22 17:11:55 +0200542{
543 mutex_lock(&conn->chan_lock);
544 __l2cap_chan_add(conn, chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200545 mutex_unlock(&conn->chan_lock);
Marcel Holtmann01394182006-07-03 10:02:46 +0200546}
547
Andrei Emeltchenko466f8002012-05-29 13:59:01 +0300548void l2cap_chan_del(struct l2cap_chan *chan, int err)
Marcel Holtmann01394182006-07-03 10:02:46 +0200549{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300550 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann01394182006-07-03 10:02:46 +0200551
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -0300552 __clear_chan_timer(chan);
Marcel Holtmann01394182006-07-03 10:02:46 +0200553
Gustavo F. Padovan49208c92011-04-04 15:59:54 -0300554 BT_DBG("chan %p, conn %p, err %d", chan, conn, err);
Marcel Holtmann01394182006-07-03 10:02:46 +0200555
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900556 if (conn) {
Andrei Emeltchenko56f60982012-10-15 11:58:44 +0300557 struct amp_mgr *mgr = conn->hcon->amp_mgr;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300558 /* Delete from channel list */
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200559 list_del(&chan->list);
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -0200560
Ulisses Furquim371fd832011-12-21 20:02:36 -0200561 l2cap_chan_put(chan);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300562
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300563 chan->conn = NULL;
Andrei Emeltchenko3cabbfd2012-05-31 11:01:37 +0300564
Johan Hedberg2338a7e2014-01-24 10:35:40 +0200565 if (chan->scid != L2CAP_CID_A2MP)
David Herrmann76a68ba2013-04-06 20:28:37 +0200566 hci_conn_drop(conn->hcon);
Andrei Emeltchenko56f60982012-10-15 11:58:44 +0300567
568 if (mgr && mgr->bredr_chan == chan)
569 mgr->bredr_chan = NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200570 }
571
Andrei Emeltchenko419e08c2012-10-31 15:46:34 +0200572 if (chan->hs_hchan) {
573 struct hci_chan *hs_hchan = chan->hs_hchan;
574
575 BT_DBG("chan %p disconnect hs_hchan %p", chan, hs_hchan);
576 amp_disconnect_logical_link(hs_hchan);
577 }
578
Gustavo Padovanb699ec02012-10-06 11:51:54 +0100579 chan->ops->teardown(chan, err);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200580
Mat Martineau28270112012-05-17 21:14:09 -0700581 if (test_bit(CONF_NOT_COMPLETE, &chan->conf_state))
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300582 return;
Gustavo F. Padovan2ead70b2011-04-01 15:13:36 -0300583
Gustavo Padovanee556f62012-05-18 20:22:38 -0300584 switch(chan->mode) {
585 case L2CAP_MODE_BASIC:
586 break;
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300587
Johan Hedberg38319712013-05-17 12:49:23 +0300588 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedberg177f8f22013-05-31 17:54:51 +0300589 skb_queue_purge(&chan->tx_q);
Johan Hedberg38319712013-05-17 12:49:23 +0300590 break;
591
Gustavo Padovanee556f62012-05-18 20:22:38 -0300592 case L2CAP_MODE_ERTM:
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -0300593 __clear_retrans_timer(chan);
594 __clear_monitor_timer(chan);
595 __clear_ack_timer(chan);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300596
Gustavo F. Padovanf1c67752011-03-25 20:36:10 -0300597 skb_queue_purge(&chan->srej_q);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300598
Mat Martineau3c588192012-04-11 10:48:42 -0700599 l2cap_seq_list_free(&chan->srej_list);
600 l2cap_seq_list_free(&chan->retrans_list);
Gustavo Padovanee556f62012-05-18 20:22:38 -0300601
602 /* fall through */
603
604 case L2CAP_MODE_STREAMING:
605 skb_queue_purge(&chan->tx_q);
606 break;
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300607 }
Gustavo Padovanee556f62012-05-18 20:22:38 -0300608
609 return;
Marcel Holtmann01394182006-07-03 10:02:46 +0200610}
611
Johan Hedberg387a33e2014-02-18 21:41:33 +0200612void l2cap_conn_update_id_addr(struct hci_conn *hcon)
613{
614 struct l2cap_conn *conn = hcon->l2cap_data;
615 struct l2cap_chan *chan;
616
617 mutex_lock(&conn->chan_lock);
618
619 list_for_each_entry(chan, &conn->chan_l, list) {
620 l2cap_chan_lock(chan);
621 bacpy(&chan->dst, &hcon->dst);
622 chan->dst_type = bdaddr_type(hcon, hcon->dst_type);
623 l2cap_chan_unlock(chan);
624 }
625
626 mutex_unlock(&conn->chan_lock);
627}
628
Johan Hedberg27e2d4c2013-05-14 13:27:21 +0300629static void l2cap_chan_le_connect_reject(struct l2cap_chan *chan)
630{
631 struct l2cap_conn *conn = chan->conn;
632 struct l2cap_le_conn_rsp rsp;
633 u16 result;
634
635 if (test_bit(FLAG_DEFER_SETUP, &chan->flags))
636 result = L2CAP_CR_AUTHORIZATION;
637 else
638 result = L2CAP_CR_BAD_PSM;
639
640 l2cap_state_change(chan, BT_DISCONN);
641
642 rsp.dcid = cpu_to_le16(chan->scid);
643 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +0200644 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +0300645 rsp.credits = cpu_to_le16(chan->rx_credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +0300646 rsp.result = cpu_to_le16(result);
647
648 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp),
649 &rsp);
650}
651
Johan Hedberg791d60f2013-05-14 22:24:44 +0300652static void l2cap_chan_connect_reject(struct l2cap_chan *chan)
653{
654 struct l2cap_conn *conn = chan->conn;
655 struct l2cap_conn_rsp rsp;
656 u16 result;
657
658 if (test_bit(FLAG_DEFER_SETUP, &chan->flags))
659 result = L2CAP_CR_SEC_BLOCK;
660 else
661 result = L2CAP_CR_BAD_PSM;
662
663 l2cap_state_change(chan, BT_DISCONN);
664
665 rsp.scid = cpu_to_le16(chan->dcid);
666 rsp.dcid = cpu_to_le16(chan->scid);
667 rsp.result = cpu_to_le16(result);
668 rsp.status = __constant_cpu_to_le16(L2CAP_CS_NO_INFO);
669
670 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, sizeof(rsp), &rsp);
671}
672
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300673void l2cap_chan_close(struct l2cap_chan *chan, int reason)
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300674{
675 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300676
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700677 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300678
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300679 switch (chan->state) {
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300680 case BT_LISTEN:
Gustavo Padovanb699ec02012-10-06 11:51:54 +0100681 chan->ops->teardown(chan, 0);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300682 break;
683
684 case BT_CONNECTED:
685 case BT_CONFIG:
Johan Hedberg7b25c9b2014-01-28 15:28:04 -0800686 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED) {
Gustavo Padovan8d836d72013-10-15 19:24:47 -0300687 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +0200688 l2cap_send_disconn_req(chan, reason);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300689 } else
690 l2cap_chan_del(chan, reason);
691 break;
692
693 case BT_CONNECT2:
Johan Hedberg791d60f2013-05-14 22:24:44 +0300694 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED) {
695 if (conn->hcon->type == ACL_LINK)
696 l2cap_chan_connect_reject(chan);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +0300697 else if (conn->hcon->type == LE_LINK)
698 l2cap_chan_le_connect_reject(chan);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300699 }
700
701 l2cap_chan_del(chan, reason);
702 break;
703
704 case BT_CONNECT:
705 case BT_DISCONN:
706 l2cap_chan_del(chan, reason);
707 break;
708
709 default:
Gustavo Padovanb699ec02012-10-06 11:51:54 +0100710 chan->ops->teardown(chan, 0);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300711 break;
712 }
713}
714
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300715static inline u8 l2cap_get_auth_type(struct l2cap_chan *chan)
Johan Hedberg8556edd32011-01-19 12:06:50 +0530716{
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700717 switch (chan->chan_type) {
718 case L2CAP_CHAN_RAW:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300719 switch (chan->sec_level) {
Johan Hedberg8556edd32011-01-19 12:06:50 +0530720 case BT_SECURITY_HIGH:
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800721 case BT_SECURITY_FIPS:
Johan Hedberg8556edd32011-01-19 12:06:50 +0530722 return HCI_AT_DEDICATED_BONDING_MITM;
723 case BT_SECURITY_MEDIUM:
724 return HCI_AT_DEDICATED_BONDING;
725 default:
726 return HCI_AT_NO_BONDING;
727 }
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700728 break;
Marcel Holtmann3124b842013-10-12 07:19:32 -0700729 case L2CAP_CHAN_CONN_LESS:
730 if (chan->psm == __constant_cpu_to_le16(L2CAP_PSM_3DSP)) {
731 if (chan->sec_level == BT_SECURITY_LOW)
732 chan->sec_level = BT_SECURITY_SDP;
733 }
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800734 if (chan->sec_level == BT_SECURITY_HIGH ||
735 chan->sec_level == BT_SECURITY_FIPS)
Marcel Holtmann3124b842013-10-12 07:19:32 -0700736 return HCI_AT_NO_BONDING_MITM;
737 else
738 return HCI_AT_NO_BONDING;
739 break;
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700740 case L2CAP_CHAN_CONN_ORIENTED:
741 if (chan->psm == __constant_cpu_to_le16(L2CAP_PSM_SDP)) {
742 if (chan->sec_level == BT_SECURITY_LOW)
743 chan->sec_level = BT_SECURITY_SDP;
Johan Hedberg8556edd32011-01-19 12:06:50 +0530744
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800745 if (chan->sec_level == BT_SECURITY_HIGH ||
746 chan->sec_level == BT_SECURITY_FIPS)
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700747 return HCI_AT_NO_BONDING_MITM;
748 else
749 return HCI_AT_NO_BONDING;
750 }
751 /* fall through */
752 default:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300753 switch (chan->sec_level) {
Johan Hedberg8556edd32011-01-19 12:06:50 +0530754 case BT_SECURITY_HIGH:
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800755 case BT_SECURITY_FIPS:
Johan Hedberg8556edd32011-01-19 12:06:50 +0530756 return HCI_AT_GENERAL_BONDING_MITM;
757 case BT_SECURITY_MEDIUM:
758 return HCI_AT_GENERAL_BONDING;
759 default:
760 return HCI_AT_NO_BONDING;
761 }
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700762 break;
Johan Hedberg8556edd32011-01-19 12:06:50 +0530763 }
764}
765
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200766/* Service level security */
Gustavo F. Padovand45fc422011-11-05 19:54:24 -0200767int l2cap_chan_check_security(struct l2cap_chan *chan)
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200768{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300769 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100770 __u8 auth_type;
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200771
Johan Hedberga17de2f2013-05-14 13:25:37 +0300772 if (conn->hcon->type == LE_LINK)
773 return smp_conn_security(conn->hcon, chan->sec_level);
774
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300775 auth_type = l2cap_get_auth_type(chan);
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100776
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300777 return hci_conn_security(conn->hcon, chan->sec_level, auth_type);
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200778}
779
Johannes Bergb5ad8b72011-06-01 08:54:45 +0200780static u8 l2cap_get_ident(struct l2cap_conn *conn)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200781{
782 u8 id;
783
784 /* Get next available identificator.
785 * 1 - 128 are used by kernel.
786 * 129 - 199 are reserved.
787 * 200 - 254 are used by utilities like l2ping, etc.
788 */
789
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200790 spin_lock(&conn->lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200791
792 if (++conn->tx_ident > 128)
793 conn->tx_ident = 1;
794
795 id = conn->tx_ident;
796
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200797 spin_unlock(&conn->lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200798
799 return id;
800}
801
Gustavo Padovan2d792812012-10-06 10:07:01 +0100802static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len,
803 void *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200804{
805 struct sk_buff *skb = l2cap_build_cmd(conn, code, ident, len, data);
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +0200806 u8 flags;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200807
808 BT_DBG("code 0x%2.2x", code);
809
810 if (!skb)
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -0300811 return;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200812
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +0200813 if (lmp_no_flush_capable(conn->hcon->hdev))
814 flags = ACL_START_NO_FLUSH;
815 else
816 flags = ACL_START;
817
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700818 bt_cb(skb)->force_active = BT_POWER_FORCE_ACTIVE_ON;
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +0200819 skb->priority = HCI_PRIO_MAX;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700820
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200821 hci_send_acl(conn->hchan, skb, flags);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200822}
823
Mat Martineau02b0fbb2012-10-23 15:24:10 -0700824static bool __chan_is_moving(struct l2cap_chan *chan)
825{
826 return chan->move_state != L2CAP_MOVE_STABLE &&
827 chan->move_state != L2CAP_MOVE_WAIT_PREPARE;
828}
829
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200830static void l2cap_do_send(struct l2cap_chan *chan, struct sk_buff *skb)
831{
832 struct hci_conn *hcon = chan->conn->hcon;
833 u16 flags;
834
835 BT_DBG("chan %p, skb %p len %d priority %u", chan, skb, skb->len,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100836 skb->priority);
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200837
Mat Martineaud5f8a752012-10-23 15:24:18 -0700838 if (chan->hs_hcon && !__chan_is_moving(chan)) {
839 if (chan->hs_hchan)
840 hci_send_acl(chan->hs_hchan, skb, ACL_COMPLETE);
841 else
842 kfree_skb(skb);
843
844 return;
845 }
846
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200847 if (!test_bit(FLAG_FLUSHABLE, &chan->flags) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100848 lmp_no_flush_capable(hcon->hdev))
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200849 flags = ACL_START_NO_FLUSH;
850 else
851 flags = ACL_START;
852
853 bt_cb(skb)->force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
854 hci_send_acl(chan->conn->hchan, skb, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700855}
856
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700857static void __unpack_enhanced_control(u16 enh, struct l2cap_ctrl *control)
858{
859 control->reqseq = (enh & L2CAP_CTRL_REQSEQ) >> L2CAP_CTRL_REQSEQ_SHIFT;
860 control->final = (enh & L2CAP_CTRL_FINAL) >> L2CAP_CTRL_FINAL_SHIFT;
861
862 if (enh & L2CAP_CTRL_FRAME_TYPE) {
863 /* S-Frame */
864 control->sframe = 1;
865 control->poll = (enh & L2CAP_CTRL_POLL) >> L2CAP_CTRL_POLL_SHIFT;
866 control->super = (enh & L2CAP_CTRL_SUPERVISE) >> L2CAP_CTRL_SUPER_SHIFT;
867
868 control->sar = 0;
869 control->txseq = 0;
870 } else {
871 /* I-Frame */
872 control->sframe = 0;
873 control->sar = (enh & L2CAP_CTRL_SAR) >> L2CAP_CTRL_SAR_SHIFT;
874 control->txseq = (enh & L2CAP_CTRL_TXSEQ) >> L2CAP_CTRL_TXSEQ_SHIFT;
875
876 control->poll = 0;
877 control->super = 0;
878 }
879}
880
881static void __unpack_extended_control(u32 ext, struct l2cap_ctrl *control)
882{
883 control->reqseq = (ext & L2CAP_EXT_CTRL_REQSEQ) >> L2CAP_EXT_CTRL_REQSEQ_SHIFT;
884 control->final = (ext & L2CAP_EXT_CTRL_FINAL) >> L2CAP_EXT_CTRL_FINAL_SHIFT;
885
886 if (ext & L2CAP_EXT_CTRL_FRAME_TYPE) {
887 /* S-Frame */
888 control->sframe = 1;
889 control->poll = (ext & L2CAP_EXT_CTRL_POLL) >> L2CAP_EXT_CTRL_POLL_SHIFT;
890 control->super = (ext & L2CAP_EXT_CTRL_SUPERVISE) >> L2CAP_EXT_CTRL_SUPER_SHIFT;
891
892 control->sar = 0;
893 control->txseq = 0;
894 } else {
895 /* I-Frame */
896 control->sframe = 0;
897 control->sar = (ext & L2CAP_EXT_CTRL_SAR) >> L2CAP_EXT_CTRL_SAR_SHIFT;
898 control->txseq = (ext & L2CAP_EXT_CTRL_TXSEQ) >> L2CAP_EXT_CTRL_TXSEQ_SHIFT;
899
900 control->poll = 0;
901 control->super = 0;
902 }
903}
904
905static inline void __unpack_control(struct l2cap_chan *chan,
906 struct sk_buff *skb)
907{
908 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
909 __unpack_extended_control(get_unaligned_le32(skb->data),
910 &bt_cb(skb)->control);
Mat Martineaucec8ab6e2012-05-17 20:53:36 -0700911 skb_pull(skb, L2CAP_EXT_CTRL_SIZE);
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700912 } else {
913 __unpack_enhanced_control(get_unaligned_le16(skb->data),
914 &bt_cb(skb)->control);
Mat Martineaucec8ab6e2012-05-17 20:53:36 -0700915 skb_pull(skb, L2CAP_ENH_CTRL_SIZE);
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700916 }
917}
918
919static u32 __pack_extended_control(struct l2cap_ctrl *control)
920{
921 u32 packed;
922
923 packed = control->reqseq << L2CAP_EXT_CTRL_REQSEQ_SHIFT;
924 packed |= control->final << L2CAP_EXT_CTRL_FINAL_SHIFT;
925
926 if (control->sframe) {
927 packed |= control->poll << L2CAP_EXT_CTRL_POLL_SHIFT;
928 packed |= control->super << L2CAP_EXT_CTRL_SUPER_SHIFT;
929 packed |= L2CAP_EXT_CTRL_FRAME_TYPE;
930 } else {
931 packed |= control->sar << L2CAP_EXT_CTRL_SAR_SHIFT;
932 packed |= control->txseq << L2CAP_EXT_CTRL_TXSEQ_SHIFT;
933 }
934
935 return packed;
936}
937
938static u16 __pack_enhanced_control(struct l2cap_ctrl *control)
939{
940 u16 packed;
941
942 packed = control->reqseq << L2CAP_CTRL_REQSEQ_SHIFT;
943 packed |= control->final << L2CAP_CTRL_FINAL_SHIFT;
944
945 if (control->sframe) {
946 packed |= control->poll << L2CAP_CTRL_POLL_SHIFT;
947 packed |= control->super << L2CAP_CTRL_SUPER_SHIFT;
948 packed |= L2CAP_CTRL_FRAME_TYPE;
949 } else {
950 packed |= control->sar << L2CAP_CTRL_SAR_SHIFT;
951 packed |= control->txseq << L2CAP_CTRL_TXSEQ_SHIFT;
952 }
953
954 return packed;
955}
956
957static inline void __pack_control(struct l2cap_chan *chan,
958 struct l2cap_ctrl *control,
959 struct sk_buff *skb)
960{
961 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
962 put_unaligned_le32(__pack_extended_control(control),
963 skb->data + L2CAP_HDR_SIZE);
964 } else {
965 put_unaligned_le16(__pack_enhanced_control(control),
966 skb->data + L2CAP_HDR_SIZE);
967 }
968}
969
Gustavo Padovanba7aa642012-05-29 13:29:16 -0300970static inline unsigned int __ertm_hdr_size(struct l2cap_chan *chan)
971{
972 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
973 return L2CAP_EXT_HDR_SIZE;
974 else
975 return L2CAP_ENH_HDR_SIZE;
976}
977
Mat Martineaua67d7f62012-05-17 20:53:35 -0700978static struct sk_buff *l2cap_create_sframe_pdu(struct l2cap_chan *chan,
979 u32 control)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300980{
981 struct sk_buff *skb;
982 struct l2cap_hdr *lh;
Gustavo Padovanba7aa642012-05-29 13:29:16 -0300983 int hlen = __ertm_hdr_size(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300984
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300985 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +0300986 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300987
Mat Martineaua67d7f62012-05-17 20:53:35 -0700988 skb = bt_skb_alloc(hlen, GFP_KERNEL);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300989
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300990 if (!skb)
Mat Martineaua67d7f62012-05-17 20:53:35 -0700991 return ERR_PTR(-ENOMEM);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300992
993 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -0300994 lh->len = cpu_to_le16(hlen - L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300995 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +0300996
Mat Martineaua67d7f62012-05-17 20:53:35 -0700997 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
998 put_unaligned_le32(control, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
999 else
1000 put_unaligned_le16(control, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001001
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001002 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineaua67d7f62012-05-17 20:53:35 -07001003 u16 fcs = crc16(0, (u8 *)skb->data, skb->len);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03001004 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001005 }
1006
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001007 skb->priority = HCI_PRIO_MAX;
Mat Martineaua67d7f62012-05-17 20:53:35 -07001008 return skb;
1009}
1010
1011static void l2cap_send_sframe(struct l2cap_chan *chan,
1012 struct l2cap_ctrl *control)
1013{
1014 struct sk_buff *skb;
1015 u32 control_field;
1016
1017 BT_DBG("chan %p, control %p", chan, control);
1018
1019 if (!control->sframe)
1020 return;
1021
Mat Martineaub99e13a2012-10-23 15:24:19 -07001022 if (__chan_is_moving(chan))
1023 return;
1024
Mat Martineaua67d7f62012-05-17 20:53:35 -07001025 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state) &&
1026 !control->poll)
1027 control->final = 1;
1028
1029 if (control->super == L2CAP_SUPER_RR)
1030 clear_bit(CONN_RNR_SENT, &chan->conn_state);
1031 else if (control->super == L2CAP_SUPER_RNR)
1032 set_bit(CONN_RNR_SENT, &chan->conn_state);
1033
1034 if (control->super != L2CAP_SUPER_SREJ) {
1035 chan->last_acked_seq = control->reqseq;
1036 __clear_ack_timer(chan);
1037 }
1038
1039 BT_DBG("reqseq %d, final %d, poll %d, super %d", control->reqseq,
1040 control->final, control->poll, control->super);
1041
1042 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
1043 control_field = __pack_extended_control(control);
1044 else
1045 control_field = __pack_enhanced_control(control);
1046
1047 skb = l2cap_create_sframe_pdu(chan, control_field);
1048 if (!IS_ERR(skb))
1049 l2cap_do_send(chan, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001050}
1051
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001052static void l2cap_send_rr_or_rnr(struct l2cap_chan *chan, bool poll)
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001053{
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001054 struct l2cap_ctrl control;
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001055
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001056 BT_DBG("chan %p, poll %d", chan, poll);
1057
1058 memset(&control, 0, sizeof(control));
1059 control.sframe = 1;
1060 control.poll = poll;
1061
1062 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
1063 control.super = L2CAP_SUPER_RNR;
1064 else
1065 control.super = L2CAP_SUPER_RR;
1066
1067 control.reqseq = chan->buffer_seq;
1068 l2cap_send_sframe(chan, &control);
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001069}
1070
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001071static inline int __l2cap_no_conn_pending(struct l2cap_chan *chan)
Andrei Emeltchenkoe501d052010-07-08 12:14:41 +03001072{
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001073 return !test_bit(CONF_CONNECT_PEND, &chan->conf_state);
Andrei Emeltchenkoe501d052010-07-08 12:14:41 +03001074}
1075
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001076static bool __amp_capable(struct l2cap_chan *chan)
1077{
1078 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann1df7b172013-10-05 11:47:49 -07001079 struct hci_dev *hdev;
1080 bool amp_available = false;
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001081
Marcel Holtmann1df7b172013-10-05 11:47:49 -07001082 if (!conn->hs_enabled)
1083 return false;
1084
1085 if (!(conn->fixed_chan_mask & L2CAP_FC_A2MP))
1086 return false;
1087
1088 read_lock(&hci_dev_list_lock);
1089 list_for_each_entry(hdev, &hci_dev_list, list) {
1090 if (hdev->amp_type != AMP_TYPE_BREDR &&
1091 test_bit(HCI_UP, &hdev->flags)) {
1092 amp_available = true;
1093 break;
1094 }
1095 }
1096 read_unlock(&hci_dev_list_lock);
1097
1098 if (chan->chan_policy == BT_CHANNEL_POLICY_AMP_PREFERRED)
1099 return amp_available;
Marcel Holtmann848566b2013-10-01 22:59:22 -07001100
1101 return false;
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001102}
1103
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02001104static bool l2cap_check_efs(struct l2cap_chan *chan)
1105{
1106 /* Check EFS parameters */
1107 return true;
1108}
1109
Andrei Emeltchenko2766be42012-09-27 17:26:21 +03001110void l2cap_send_conn_req(struct l2cap_chan *chan)
Andrei Emeltchenko9b27f352012-02-24 16:00:00 +02001111{
1112 struct l2cap_conn *conn = chan->conn;
1113 struct l2cap_conn_req req;
1114
1115 req.scid = cpu_to_le16(chan->scid);
1116 req.psm = chan->psm;
1117
1118 chan->ident = l2cap_get_ident(conn);
1119
1120 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
1121
1122 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_REQ, sizeof(req), &req);
1123}
1124
Mat Martineau8eb200b2012-10-23 15:24:17 -07001125static void l2cap_send_create_chan_req(struct l2cap_chan *chan, u8 amp_id)
1126{
1127 struct l2cap_create_chan_req req;
1128 req.scid = cpu_to_le16(chan->scid);
1129 req.psm = chan->psm;
1130 req.amp_id = amp_id;
1131
1132 chan->ident = l2cap_get_ident(chan->conn);
1133
1134 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_REQ,
1135 sizeof(req), &req);
1136}
1137
Mat Martineau02b0fbb2012-10-23 15:24:10 -07001138static void l2cap_move_setup(struct l2cap_chan *chan)
1139{
1140 struct sk_buff *skb;
1141
1142 BT_DBG("chan %p", chan);
1143
1144 if (chan->mode != L2CAP_MODE_ERTM)
1145 return;
1146
1147 __clear_retrans_timer(chan);
1148 __clear_monitor_timer(chan);
1149 __clear_ack_timer(chan);
1150
1151 chan->retry_count = 0;
1152 skb_queue_walk(&chan->tx_q, skb) {
1153 if (bt_cb(skb)->control.retries)
1154 bt_cb(skb)->control.retries = 1;
1155 else
1156 break;
1157 }
1158
1159 chan->expected_tx_seq = chan->buffer_seq;
1160
1161 clear_bit(CONN_REJ_ACT, &chan->conn_state);
1162 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
1163 l2cap_seq_list_clear(&chan->retrans_list);
1164 l2cap_seq_list_clear(&chan->srej_list);
1165 skb_queue_purge(&chan->srej_q);
1166
1167 chan->tx_state = L2CAP_TX_STATE_XMIT;
1168 chan->rx_state = L2CAP_RX_STATE_MOVE;
1169
1170 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
1171}
1172
Mat Martineau5f3847a2012-10-23 15:24:12 -07001173static void l2cap_move_done(struct l2cap_chan *chan)
1174{
1175 u8 move_role = chan->move_role;
1176 BT_DBG("chan %p", chan);
1177
1178 chan->move_state = L2CAP_MOVE_STABLE;
1179 chan->move_role = L2CAP_MOVE_ROLE_NONE;
1180
1181 if (chan->mode != L2CAP_MODE_ERTM)
1182 return;
1183
1184 switch (move_role) {
1185 case L2CAP_MOVE_ROLE_INITIATOR:
1186 l2cap_tx(chan, NULL, NULL, L2CAP_EV_EXPLICIT_POLL);
1187 chan->rx_state = L2CAP_RX_STATE_WAIT_F;
1188 break;
1189 case L2CAP_MOVE_ROLE_RESPONDER:
1190 chan->rx_state = L2CAP_RX_STATE_WAIT_P;
1191 break;
1192 }
1193}
1194
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001195static void l2cap_chan_ready(struct l2cap_chan *chan)
1196{
Mat Martineau28270112012-05-17 21:14:09 -07001197 /* This clears all conf flags, including CONF_NOT_COMPLETE */
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001198 chan->conf_state = 0;
1199 __clear_chan_timer(chan);
1200
Johan Hedberg0ce43ce2013-12-05 14:55:33 +02001201 if (chan->mode == L2CAP_MODE_LE_FLOWCTL && !chan->tx_credits)
1202 chan->ops->suspend(chan);
Johan Hedberg177f8f22013-05-31 17:54:51 +03001203
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001204 chan->state = BT_CONNECTED;
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001205
Andrei Emeltchenkofd83e2c2012-05-30 09:55:32 +03001206 chan->ops->ready(chan);
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001207}
1208
Johan Hedbergf1496de2013-05-13 14:15:56 +03001209static void l2cap_le_connect(struct l2cap_chan *chan)
1210{
1211 struct l2cap_conn *conn = chan->conn;
1212 struct l2cap_le_conn_req req;
1213
Johan Hedberg595177f2013-12-02 22:12:22 +02001214 if (test_and_set_bit(FLAG_LE_CONN_REQ_SENT, &chan->flags))
1215 return;
1216
Johan Hedbergf1496de2013-05-13 14:15:56 +03001217 req.psm = chan->psm;
1218 req.scid = cpu_to_le16(chan->scid);
1219 req.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02001220 req.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03001221 req.credits = cpu_to_le16(chan->rx_credits);
Johan Hedbergf1496de2013-05-13 14:15:56 +03001222
1223 chan->ident = l2cap_get_ident(conn);
1224
1225 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_REQ,
1226 sizeof(req), &req);
1227}
1228
1229static void l2cap_le_start(struct l2cap_chan *chan)
1230{
1231 struct l2cap_conn *conn = chan->conn;
1232
1233 if (!smp_conn_security(conn->hcon, chan->sec_level))
1234 return;
1235
1236 if (!chan->psm) {
1237 l2cap_chan_ready(chan);
1238 return;
1239 }
1240
1241 if (chan->state == BT_CONNECT)
1242 l2cap_le_connect(chan);
1243}
1244
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001245static void l2cap_start_connection(struct l2cap_chan *chan)
1246{
1247 if (__amp_capable(chan)) {
1248 BT_DBG("chan %p AMP capable: discover AMPs", chan);
1249 a2mp_discover_amp(chan);
Johan Hedbergf1496de2013-05-13 14:15:56 +03001250 } else if (chan->conn->hcon->type == LE_LINK) {
1251 l2cap_le_start(chan);
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001252 } else {
1253 l2cap_send_conn_req(chan);
1254 }
1255}
1256
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001257static void l2cap_do_start(struct l2cap_chan *chan)
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001258{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03001259 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001260
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001261 if (conn->hcon->type == LE_LINK) {
Johan Hedberg96ac34f2013-05-13 11:15:07 +03001262 l2cap_le_start(chan);
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001263 return;
1264 }
1265
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001266 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) {
Marcel Holtmann984947d2009-02-06 23:35:19 +01001267 if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE))
1268 return;
1269
Gustavo F. Padovand45fc422011-11-05 19:54:24 -02001270 if (l2cap_chan_check_security(chan) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01001271 __l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001272 l2cap_start_connection(chan);
1273 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001274 } else {
1275 struct l2cap_info_req req;
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03001276 req.type = __constant_cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001277
1278 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
1279 conn->info_ident = l2cap_get_ident(conn);
1280
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08001281 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001282
Gustavo Padovan2d792812012-10-06 10:07:01 +01001283 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
1284 sizeof(req), &req);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001285 }
1286}
1287
Gustavo F. Padovancf6c2c02010-06-07 20:54:45 -03001288static inline int l2cap_mode_supported(__u8 mode, __u32 feat_mask)
1289{
1290 u32 local_feat_mask = l2cap_feat_mask;
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03001291 if (!disable_ertm)
Gustavo F. Padovancf6c2c02010-06-07 20:54:45 -03001292 local_feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING;
1293
1294 switch (mode) {
1295 case L2CAP_MODE_ERTM:
1296 return L2CAP_FEAT_ERTM & feat_mask & local_feat_mask;
1297 case L2CAP_MODE_STREAMING:
1298 return L2CAP_FEAT_STREAMING & feat_mask & local_feat_mask;
1299 default:
1300 return 0x00;
1301 }
1302}
1303
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001304static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err)
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001305{
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001306 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001307 struct l2cap_disconn_req req;
1308
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001309 if (!conn)
1310 return;
1311
Andrei Emeltchenkoaad3d0e2012-09-06 15:05:42 +03001312 if (chan->mode == L2CAP_MODE_ERTM && chan->state == BT_CONNECTED) {
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03001313 __clear_retrans_timer(chan);
1314 __clear_monitor_timer(chan);
1315 __clear_ack_timer(chan);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001316 }
1317
Johan Hedberg2338a7e2014-01-24 10:35:40 +02001318 if (chan->scid == L2CAP_CID_A2MP) {
Gustavo Padovand1177732012-10-06 11:47:38 +01001319 l2cap_state_change(chan, BT_DISCONN);
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001320 return;
1321 }
1322
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001323 req.dcid = cpu_to_le16(chan->dcid);
1324 req.scid = cpu_to_le16(chan->scid);
Gustavo Padovan2d792812012-10-06 10:07:01 +01001325 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_DISCONN_REQ,
1326 sizeof(req), &req);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001327
Gustavo Padovanf8e73012013-10-15 19:24:46 -03001328 l2cap_state_change_and_error(chan, BT_DISCONN, err);
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001329}
1330
Linus Torvalds1da177e2005-04-16 15:20:36 -07001331/* ---- L2CAP connections ---- */
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001332static void l2cap_conn_start(struct l2cap_conn *conn)
1333{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001334 struct l2cap_chan *chan, *tmp;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001335
1336 BT_DBG("conn %p", conn);
1337
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001338 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001339
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001340 list_for_each_entry_safe(chan, tmp, &conn->chan_l, list) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001341 l2cap_chan_lock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001342
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001343 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001344 l2cap_chan_unlock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001345 continue;
1346 }
1347
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001348 if (chan->state == BT_CONNECT) {
Gustavo F. Padovand45fc422011-11-05 19:54:24 -02001349 if (!l2cap_chan_check_security(chan) ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01001350 !__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001351 l2cap_chan_unlock(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001352 continue;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02001353 }
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001354
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001355 if (!l2cap_mode_supported(chan->mode, conn->feat_mask)
Gustavo Padovan2d792812012-10-06 10:07:01 +01001356 && test_bit(CONF_STATE2_DEVICE,
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001357 &chan->conf_state)) {
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001358 l2cap_chan_close(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001359 l2cap_chan_unlock(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001360 continue;
1361 }
1362
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001363 l2cap_start_connection(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001364
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001365 } else if (chan->state == BT_CONNECT2) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001366 struct l2cap_conn_rsp rsp;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001367 char buf[128];
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001368 rsp.scid = cpu_to_le16(chan->dcid);
1369 rsp.dcid = cpu_to_le16(chan->scid);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001370
Gustavo F. Padovand45fc422011-11-05 19:54:24 -02001371 if (l2cap_chan_check_security(chan)) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07001372 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03001373 rsp.result = __constant_cpu_to_le16(L2CAP_CR_PEND);
1374 rsp.status = __constant_cpu_to_le16(L2CAP_CS_AUTHOR_PEND);
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001375 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001376
1377 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001378 l2cap_state_change(chan, BT_CONFIG);
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03001379 rsp.result = __constant_cpu_to_le16(L2CAP_CR_SUCCESS);
1380 rsp.status = __constant_cpu_to_le16(L2CAP_CS_NO_INFO);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001381 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001382 } else {
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03001383 rsp.result = __constant_cpu_to_le16(L2CAP_CR_PEND);
1384 rsp.status = __constant_cpu_to_le16(L2CAP_CS_AUTHEN_PEND);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001385 }
1386
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001387 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001388 sizeof(rsp), &rsp);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001389
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001390 if (test_bit(CONF_REQ_SENT, &chan->conf_state) ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01001391 rsp.result != L2CAP_CR_SUCCESS) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001392 l2cap_chan_unlock(chan);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001393 continue;
1394 }
1395
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001396 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001397 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001398 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03001399 chan->num_conf_req++;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001400 }
1401
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001402 l2cap_chan_unlock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001403 }
1404
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001405 mutex_unlock(&conn->chan_lock);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001406}
1407
Ido Yarivc2287682012-04-20 15:46:07 -03001408/* Find socket with cid and source/destination bdaddr.
Ville Tervob62f3282011-02-10 22:38:50 -03001409 * Returns closest match, locked.
1410 */
Andrei Emeltchenkod9b88702012-03-12 12:13:08 +02001411static struct l2cap_chan *l2cap_global_chan_by_scid(int state, u16 cid,
Ido Yarivc2287682012-04-20 15:46:07 -03001412 bdaddr_t *src,
1413 bdaddr_t *dst)
Ville Tervob62f3282011-02-10 22:38:50 -03001414{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001415 struct l2cap_chan *c, *c1 = NULL;
Ville Tervob62f3282011-02-10 22:38:50 -03001416
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001417 read_lock(&chan_list_lock);
Ville Tervob62f3282011-02-10 22:38:50 -03001418
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001419 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001420 if (state && c->state != state)
Ville Tervob62f3282011-02-10 22:38:50 -03001421 continue;
1422
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001423 if (c->scid == cid) {
Ido Yarivc2287682012-04-20 15:46:07 -03001424 int src_match, dst_match;
1425 int src_any, dst_any;
1426
Ville Tervob62f3282011-02-10 22:38:50 -03001427 /* Exact match. */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001428 src_match = !bacmp(&c->src, src);
1429 dst_match = !bacmp(&c->dst, dst);
Ido Yarivc2287682012-04-20 15:46:07 -03001430 if (src_match && dst_match) {
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001431 read_unlock(&chan_list_lock);
1432 return c;
1433 }
Ville Tervob62f3282011-02-10 22:38:50 -03001434
1435 /* Closest match */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001436 src_any = !bacmp(&c->src, BDADDR_ANY);
1437 dst_any = !bacmp(&c->dst, BDADDR_ANY);
Ido Yarivc2287682012-04-20 15:46:07 -03001438 if ((src_match && dst_any) || (src_any && dst_match) ||
1439 (src_any && dst_any))
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001440 c1 = c;
Ville Tervob62f3282011-02-10 22:38:50 -03001441 }
1442 }
Gustavo F. Padovan280f2942011-04-13 19:01:22 -03001443
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001444 read_unlock(&chan_list_lock);
Ville Tervob62f3282011-02-10 22:38:50 -03001445
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001446 return c1;
Ville Tervob62f3282011-02-10 22:38:50 -03001447}
1448
1449static void l2cap_le_conn_ready(struct l2cap_conn *conn)
1450{
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001451 struct hci_conn *hcon = conn->hcon;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001452 struct l2cap_chan *chan, *pchan;
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001453 u8 dst_type;
Ville Tervob62f3282011-02-10 22:38:50 -03001454
1455 BT_DBG("");
1456
Jukka Rissanen18722c22013-12-11 17:05:37 +02001457 bt_6lowpan_add_conn(conn);
1458
Ville Tervob62f3282011-02-10 22:38:50 -03001459 /* Check if we have socket listening on cid */
Johan Hedberg073d1cf2013-04-29 19:35:35 +03001460 pchan = l2cap_global_chan_by_scid(BT_LISTEN, L2CAP_CID_ATT,
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001461 &hcon->src, &hcon->dst);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001462 if (!pchan)
Ville Tervob62f3282011-02-10 22:38:50 -03001463 return;
1464
Johan Hedberg44f3b0f2013-04-29 19:35:45 +03001465 /* Client ATT sockets should override the server one */
1466 if (__l2cap_get_chan_by_dcid(conn, L2CAP_CID_ATT))
1467 return;
1468
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001469 dst_type = bdaddr_type(hcon, hcon->dst_type);
1470
1471 /* If device is blocked, do not create a channel for it */
1472 if (hci_blacklist_lookup(hcon->hdev, &hcon->dst, dst_type))
1473 return;
1474
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001475 l2cap_chan_lock(pchan);
Gustavo F. Padovan62f3a2c2011-04-14 18:34:34 -03001476
Gustavo Padovan80b98022012-05-27 22:27:51 -03001477 chan = pchan->ops->new_connection(pchan);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001478 if (!chan)
Ville Tervob62f3282011-02-10 22:38:50 -03001479 goto clean;
1480
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001481 bacpy(&chan->src, &hcon->src);
1482 bacpy(&chan->dst, &hcon->dst);
1483 chan->src_type = bdaddr_type(hcon, hcon->src_type);
1484 chan->dst_type = dst_type;
Ville Tervob62f3282011-02-10 22:38:50 -03001485
Johan Hedberg44f3b0f2013-04-29 19:35:45 +03001486 __l2cap_chan_add(conn, chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001487
Ville Tervob62f3282011-02-10 22:38:50 -03001488clean:
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001489 l2cap_chan_unlock(pchan);
Ville Tervob62f3282011-02-10 22:38:50 -03001490}
1491
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001492static void l2cap_conn_ready(struct l2cap_conn *conn)
1493{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001494 struct l2cap_chan *chan;
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001495 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001496
1497 BT_DBG("conn %p", conn);
1498
Johan Hedbergd8729922013-04-29 19:35:39 +03001499 /* For outgoing pairing which doesn't necessarily have an
1500 * associated socket (e.g. mgmt_pair_device).
1501 */
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001502 if (hcon->out && hcon->type == LE_LINK)
1503 smp_conn_security(hcon, hcon->pending_sec_level);
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03001504
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001505 mutex_lock(&conn->chan_lock);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001506
Johan Hedberg44f3b0f2013-04-29 19:35:45 +03001507 if (hcon->type == LE_LINK)
1508 l2cap_le_conn_ready(conn);
1509
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001510 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03001511
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001512 l2cap_chan_lock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001513
Johan Hedberg2338a7e2014-01-24 10:35:40 +02001514 if (chan->scid == L2CAP_CID_A2MP) {
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001515 l2cap_chan_unlock(chan);
1516 continue;
1517 }
1518
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001519 if (hcon->type == LE_LINK) {
Johan Hedbergf1496de2013-05-13 14:15:56 +03001520 l2cap_le_start(chan);
Vinicius Costa Gomes63128452011-06-17 22:46:26 -03001521 } else if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Gustavo Padovan74e75742013-10-15 19:24:51 -03001522 l2cap_chan_ready(chan);
Anderson Brigliab501d6a2011-06-07 18:46:31 -03001523
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001524 } else if (chan->state == BT_CONNECT) {
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001525 l2cap_do_start(chan);
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001526 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001527
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001528 l2cap_chan_unlock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001529 }
1530
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001531 mutex_unlock(&conn->chan_lock);
Johan Hedberg61a939c2014-01-17 20:45:11 +02001532
1533 queue_work(hcon->hdev->workqueue, &conn->pending_rx_work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001534}
1535
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001536/* Notify sockets that we cannot guaranty reliability anymore */
1537static void l2cap_conn_unreliable(struct l2cap_conn *conn, int err)
1538{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001539 struct l2cap_chan *chan;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001540
1541 BT_DBG("conn %p", conn);
1542
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001543 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001544
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001545 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +03001546 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo Padovan1d8b1fd2012-10-06 11:34:52 +01001547 l2cap_chan_set_err(chan, err);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001548 }
1549
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001550 mutex_unlock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001551}
1552
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001553static void l2cap_info_timeout(struct work_struct *work)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001554{
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001555 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001556 info_timer.work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001557
Marcel Holtmann984947d2009-02-06 23:35:19 +01001558 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01001559 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01001560
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001561 l2cap_conn_start(conn);
1562}
1563
David Herrmann2c8e1412013-04-06 20:28:45 +02001564/*
1565 * l2cap_user
1566 * External modules can register l2cap_user objects on l2cap_conn. The ->probe
1567 * callback is called during registration. The ->remove callback is called
1568 * during unregistration.
1569 * An l2cap_user object can either be explicitly unregistered or when the
1570 * underlying l2cap_conn object is deleted. This guarantees that l2cap->hcon,
1571 * l2cap->hchan, .. are valid as long as the remove callback hasn't been called.
1572 * External modules must own a reference to the l2cap_conn object if they intend
1573 * to call l2cap_unregister_user(). The l2cap_conn object might get destroyed at
1574 * any time if they don't.
1575 */
1576
1577int l2cap_register_user(struct l2cap_conn *conn, struct l2cap_user *user)
1578{
1579 struct hci_dev *hdev = conn->hcon->hdev;
1580 int ret;
1581
1582 /* We need to check whether l2cap_conn is registered. If it is not, we
1583 * must not register the l2cap_user. l2cap_conn_del() is unregisters
1584 * l2cap_conn objects, but doesn't provide its own locking. Instead, it
1585 * relies on the parent hci_conn object to be locked. This itself relies
1586 * on the hci_dev object to be locked. So we must lock the hci device
1587 * here, too. */
1588
1589 hci_dev_lock(hdev);
1590
1591 if (user->list.next || user->list.prev) {
1592 ret = -EINVAL;
1593 goto out_unlock;
1594 }
1595
1596 /* conn->hchan is NULL after l2cap_conn_del() was called */
1597 if (!conn->hchan) {
1598 ret = -ENODEV;
1599 goto out_unlock;
1600 }
1601
1602 ret = user->probe(conn, user);
1603 if (ret)
1604 goto out_unlock;
1605
1606 list_add(&user->list, &conn->users);
1607 ret = 0;
1608
1609out_unlock:
1610 hci_dev_unlock(hdev);
1611 return ret;
1612}
1613EXPORT_SYMBOL(l2cap_register_user);
1614
1615void l2cap_unregister_user(struct l2cap_conn *conn, struct l2cap_user *user)
1616{
1617 struct hci_dev *hdev = conn->hcon->hdev;
1618
1619 hci_dev_lock(hdev);
1620
1621 if (!user->list.next || !user->list.prev)
1622 goto out_unlock;
1623
1624 list_del(&user->list);
1625 user->list.next = NULL;
1626 user->list.prev = NULL;
1627 user->remove(conn, user);
1628
1629out_unlock:
1630 hci_dev_unlock(hdev);
1631}
1632EXPORT_SYMBOL(l2cap_unregister_user);
1633
1634static void l2cap_unregister_all_users(struct l2cap_conn *conn)
1635{
1636 struct l2cap_user *user;
1637
1638 while (!list_empty(&conn->users)) {
1639 user = list_first_entry(&conn->users, struct l2cap_user, list);
1640 list_del(&user->list);
1641 user->list.next = NULL;
1642 user->list.prev = NULL;
1643 user->remove(conn, user);
1644 }
1645}
1646
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001647static void l2cap_conn_del(struct hci_conn *hcon, int err)
1648{
1649 struct l2cap_conn *conn = hcon->l2cap_data;
1650 struct l2cap_chan *chan, *l;
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001651
1652 if (!conn)
1653 return;
1654
1655 BT_DBG("hcon %p conn %p, err %d", hcon, conn, err);
1656
1657 kfree_skb(conn->rx_skb);
1658
Johan Hedberg61a939c2014-01-17 20:45:11 +02001659 skb_queue_purge(&conn->pending_rx);
1660 flush_work(&conn->pending_rx_work);
1661
David Herrmann2c8e1412013-04-06 20:28:45 +02001662 l2cap_unregister_all_users(conn);
1663
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001664 mutex_lock(&conn->chan_lock);
1665
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001666 /* Kill channels */
1667 list_for_each_entry_safe(chan, l, &conn->chan_l, list) {
Mat Martineau61d6ef32012-04-27 16:50:50 -07001668 l2cap_chan_hold(chan);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001669 l2cap_chan_lock(chan);
1670
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001671 l2cap_chan_del(chan, err);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001672
1673 l2cap_chan_unlock(chan);
1674
Gustavo Padovan80b98022012-05-27 22:27:51 -03001675 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07001676 l2cap_chan_put(chan);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001677 }
1678
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001679 mutex_unlock(&conn->chan_lock);
1680
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001681 hci_chan_del(conn->hchan);
1682
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001683 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT)
Ulisses Furquim127074b2012-01-30 18:26:29 -02001684 cancel_delayed_work_sync(&conn->info_timer);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001685
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001686 if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags)) {
Ulisses Furquim127074b2012-01-30 18:26:29 -02001687 cancel_delayed_work_sync(&conn->security_timer);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001688 smp_chan_destroy(conn);
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001689 }
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001690
1691 hcon->l2cap_data = NULL;
David Herrmann9c903e32013-04-06 20:28:44 +02001692 conn->hchan = NULL;
1693 l2cap_conn_put(conn);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001694}
1695
Gustavo F. Padovan6c9d42a2011-12-20 10:57:27 -02001696static void security_timeout(struct work_struct *work)
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001697{
Gustavo F. Padovan6c9d42a2011-12-20 10:57:27 -02001698 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001699 security_timer.work);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001700
Johan Hedbergd06cc412012-06-06 18:44:11 +08001701 BT_DBG("conn %p", conn);
1702
1703 if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags)) {
1704 smp_chan_destroy(conn);
1705 l2cap_conn_del(conn->hcon, ETIMEDOUT);
1706 }
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001707}
1708
David Herrmann9c903e32013-04-06 20:28:44 +02001709static void l2cap_conn_free(struct kref *ref)
1710{
1711 struct l2cap_conn *conn = container_of(ref, struct l2cap_conn, ref);
1712
1713 hci_conn_put(conn->hcon);
1714 kfree(conn);
1715}
1716
1717void l2cap_conn_get(struct l2cap_conn *conn)
1718{
1719 kref_get(&conn->ref);
1720}
1721EXPORT_SYMBOL(l2cap_conn_get);
1722
1723void l2cap_conn_put(struct l2cap_conn *conn)
1724{
1725 kref_put(&conn->ref, l2cap_conn_free);
1726}
1727EXPORT_SYMBOL(l2cap_conn_put);
1728
Linus Torvalds1da177e2005-04-16 15:20:36 -07001729/* ---- Socket interface ---- */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001730
Ido Yarivc2287682012-04-20 15:46:07 -03001731/* Find socket with psm and source / destination bdaddr.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001732 * Returns closest match.
1733 */
Ido Yarivc2287682012-04-20 15:46:07 -03001734static struct l2cap_chan *l2cap_global_chan_by_psm(int state, __le16 psm,
1735 bdaddr_t *src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001736 bdaddr_t *dst,
1737 u8 link_type)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001738{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001739 struct l2cap_chan *c, *c1 = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001740
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001741 read_lock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001742
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001743 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001744 if (state && c->state != state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001745 continue;
1746
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001747 if (link_type == ACL_LINK && c->src_type != BDADDR_BREDR)
1748 continue;
1749
1750 if (link_type == LE_LINK && c->src_type == BDADDR_BREDR)
1751 continue;
1752
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001753 if (c->psm == psm) {
Ido Yarivc2287682012-04-20 15:46:07 -03001754 int src_match, dst_match;
1755 int src_any, dst_any;
1756
Linus Torvalds1da177e2005-04-16 15:20:36 -07001757 /* Exact match. */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001758 src_match = !bacmp(&c->src, src);
1759 dst_match = !bacmp(&c->dst, dst);
Ido Yarivc2287682012-04-20 15:46:07 -03001760 if (src_match && dst_match) {
Johannes Berga7567b22011-06-01 08:29:54 +02001761 read_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001762 return c;
1763 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001764
1765 /* Closest match */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001766 src_any = !bacmp(&c->src, BDADDR_ANY);
1767 dst_any = !bacmp(&c->dst, BDADDR_ANY);
Ido Yarivc2287682012-04-20 15:46:07 -03001768 if ((src_match && dst_any) || (src_any && dst_match) ||
1769 (src_any && dst_any))
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001770 c1 = c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001771 }
1772 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001773
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001774 read_unlock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001775
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001776 return c1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001777}
1778
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001779static void l2cap_monitor_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001780{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001781 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001782 monitor_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001783
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03001784 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001785
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001786 l2cap_chan_lock(chan);
1787
Mat Martineau80909e02012-05-17 20:53:50 -07001788 if (!chan->conn) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001789 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001790 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001791 return;
1792 }
1793
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001794 l2cap_tx(chan, NULL, NULL, L2CAP_EV_MONITOR_TO);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001795
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001796 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001797 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001798}
1799
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001800static void l2cap_retrans_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001801{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001802 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001803 retrans_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001804
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03001805 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001806
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001807 l2cap_chan_lock(chan);
1808
Mat Martineau80909e02012-05-17 20:53:50 -07001809 if (!chan->conn) {
1810 l2cap_chan_unlock(chan);
1811 l2cap_chan_put(chan);
1812 return;
1813 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001814
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001815 l2cap_tx(chan, NULL, NULL, L2CAP_EV_RETRANS_TO);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001816 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001817 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001818}
1819
Gustavo Padovand6603662012-05-21 13:58:22 -03001820static void l2cap_streaming_send(struct l2cap_chan *chan,
1821 struct sk_buff_head *skbs)
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001822{
Gustavo F. Padovanccbb84a2010-08-30 18:44:44 -03001823 struct sk_buff *skb;
Mat Martineau37339372012-05-17 20:53:33 -07001824 struct l2cap_ctrl *control;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001825
Mat Martineau37339372012-05-17 20:53:33 -07001826 BT_DBG("chan %p, skbs %p", chan, skbs);
1827
Mat Martineaub99e13a2012-10-23 15:24:19 -07001828 if (__chan_is_moving(chan))
1829 return;
1830
Mat Martineau37339372012-05-17 20:53:33 -07001831 skb_queue_splice_tail_init(skbs, &chan->tx_q);
1832
1833 while (!skb_queue_empty(&chan->tx_q)) {
1834
1835 skb = skb_dequeue(&chan->tx_q);
1836
1837 bt_cb(skb)->control.retries = 1;
1838 control = &bt_cb(skb)->control;
1839
1840 control->reqseq = 0;
1841 control->txseq = chan->next_tx_seq;
1842
1843 __pack_control(chan, control, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001844
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001845 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau37339372012-05-17 20:53:33 -07001846 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1847 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001848 }
1849
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001850 l2cap_do_send(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001851
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001852 BT_DBG("Sent txseq %u", control->txseq);
Mat Martineau37339372012-05-17 20:53:33 -07001853
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001854 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau37339372012-05-17 20:53:33 -07001855 chan->frames_sent++;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001856 }
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001857}
1858
Szymon Janc67c9e842011-07-28 16:24:33 +02001859static int l2cap_ertm_send(struct l2cap_chan *chan)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001860{
1861 struct sk_buff *skb, *tx_skb;
Mat Martineau18a48e72012-05-17 20:53:34 -07001862 struct l2cap_ctrl *control;
1863 int sent = 0;
1864
1865 BT_DBG("chan %p", chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001866
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001867 if (chan->state != BT_CONNECTED)
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001868 return -ENOTCONN;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001869
Mat Martineau94122bb2012-05-02 09:42:02 -07001870 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1871 return 0;
1872
Mat Martineaub99e13a2012-10-23 15:24:19 -07001873 if (__chan_is_moving(chan))
1874 return 0;
1875
Mat Martineau18a48e72012-05-17 20:53:34 -07001876 while (chan->tx_send_head &&
1877 chan->unacked_frames < chan->remote_tx_win &&
1878 chan->tx_state == L2CAP_TX_STATE_XMIT) {
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001879
Mat Martineau18a48e72012-05-17 20:53:34 -07001880 skb = chan->tx_send_head;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001881
Mat Martineau18a48e72012-05-17 20:53:34 -07001882 bt_cb(skb)->control.retries = 1;
1883 control = &bt_cb(skb)->control;
Gustavo F. Padovan95ffa972010-06-18 20:37:33 -03001884
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001885 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
Mat Martineau18a48e72012-05-17 20:53:34 -07001886 control->final = 1;
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001887
Mat Martineau18a48e72012-05-17 20:53:34 -07001888 control->reqseq = chan->buffer_seq;
1889 chan->last_acked_seq = chan->buffer_seq;
1890 control->txseq = chan->next_tx_seq;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001891
Mat Martineau18a48e72012-05-17 20:53:34 -07001892 __pack_control(chan, control, skb);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001893
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001894 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau18a48e72012-05-17 20:53:34 -07001895 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1896 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001897 }
1898
Mat Martineau18a48e72012-05-17 20:53:34 -07001899 /* Clone after data has been modified. Data is assumed to be
1900 read-only (for locking purposes) on cloned sk_buffs.
1901 */
1902 tx_skb = skb_clone(skb, GFP_KERNEL);
1903
1904 if (!tx_skb)
1905 break;
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -03001906
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03001907 __set_retrans_timer(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001908
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001909 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau18a48e72012-05-17 20:53:34 -07001910 chan->unacked_frames++;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03001911 chan->frames_sent++;
Mat Martineau18a48e72012-05-17 20:53:34 -07001912 sent++;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001913
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001914 if (skb_queue_is_last(&chan->tx_q, skb))
1915 chan->tx_send_head = NULL;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001916 else
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001917 chan->tx_send_head = skb_queue_next(&chan->tx_q, skb);
Mat Martineau18a48e72012-05-17 20:53:34 -07001918
1919 l2cap_do_send(chan, tx_skb);
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001920 BT_DBG("Sent txseq %u", control->txseq);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001921 }
1922
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001923 BT_DBG("Sent %d, %u unacked, %u in ERTM queue", sent,
1924 chan->unacked_frames, skb_queue_len(&chan->tx_q));
Mat Martineau18a48e72012-05-17 20:53:34 -07001925
1926 return sent;
Gustavo F. Padovan9e917af2010-05-01 16:15:37 -03001927}
1928
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001929static void l2cap_ertm_resend(struct l2cap_chan *chan)
1930{
1931 struct l2cap_ctrl control;
1932 struct sk_buff *skb;
1933 struct sk_buff *tx_skb;
1934 u16 seq;
1935
1936 BT_DBG("chan %p", chan);
1937
1938 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1939 return;
1940
Mat Martineaub99e13a2012-10-23 15:24:19 -07001941 if (__chan_is_moving(chan))
1942 return;
1943
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001944 while (chan->retrans_list.head != L2CAP_SEQ_LIST_CLEAR) {
1945 seq = l2cap_seq_list_pop(&chan->retrans_list);
1946
1947 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, seq);
1948 if (!skb) {
1949 BT_DBG("Error: Can't retransmit seq %d, frame missing",
Gustavo Padovan2d792812012-10-06 10:07:01 +01001950 seq);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001951 continue;
1952 }
1953
1954 bt_cb(skb)->control.retries++;
1955 control = bt_cb(skb)->control;
1956
1957 if (chan->max_tx != 0 &&
1958 bt_cb(skb)->control.retries > chan->max_tx) {
1959 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001960 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001961 l2cap_seq_list_clear(&chan->retrans_list);
1962 break;
1963 }
1964
1965 control.reqseq = chan->buffer_seq;
1966 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
1967 control.final = 1;
1968 else
1969 control.final = 0;
1970
1971 if (skb_cloned(skb)) {
1972 /* Cloned sk_buffs are read-only, so we need a
1973 * writeable copy
1974 */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03001975 tx_skb = skb_copy(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001976 } else {
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03001977 tx_skb = skb_clone(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001978 }
1979
1980 if (!tx_skb) {
1981 l2cap_seq_list_clear(&chan->retrans_list);
1982 break;
1983 }
1984
1985 /* Update skb contents */
1986 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
1987 put_unaligned_le32(__pack_extended_control(&control),
1988 tx_skb->data + L2CAP_HDR_SIZE);
1989 } else {
1990 put_unaligned_le16(__pack_enhanced_control(&control),
1991 tx_skb->data + L2CAP_HDR_SIZE);
1992 }
1993
1994 if (chan->fcs == L2CAP_FCS_CRC16) {
1995 u16 fcs = crc16(0, (u8 *) tx_skb->data, tx_skb->len);
1996 put_unaligned_le16(fcs, skb_put(tx_skb,
1997 L2CAP_FCS_SIZE));
1998 }
1999
2000 l2cap_do_send(chan, tx_skb);
2001
2002 BT_DBG("Resent txseq %d", control.txseq);
2003
2004 chan->last_acked_seq = chan->buffer_seq;
2005 }
2006}
2007
Mat Martineauf80842a2012-05-17 20:53:46 -07002008static void l2cap_retransmit(struct l2cap_chan *chan,
2009 struct l2cap_ctrl *control)
2010{
2011 BT_DBG("chan %p, control %p", chan, control);
2012
2013 l2cap_seq_list_append(&chan->retrans_list, control->reqseq);
2014 l2cap_ertm_resend(chan);
2015}
2016
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002017static void l2cap_retransmit_all(struct l2cap_chan *chan,
2018 struct l2cap_ctrl *control)
2019{
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002020 struct sk_buff *skb;
2021
2022 BT_DBG("chan %p, control %p", chan, control);
2023
2024 if (control->poll)
2025 set_bit(CONN_SEND_FBIT, &chan->conn_state);
2026
2027 l2cap_seq_list_clear(&chan->retrans_list);
2028
2029 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
2030 return;
2031
2032 if (chan->unacked_frames) {
2033 skb_queue_walk(&chan->tx_q, skb) {
2034 if (bt_cb(skb)->control.txseq == control->reqseq ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01002035 skb == chan->tx_send_head)
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002036 break;
2037 }
2038
2039 skb_queue_walk_from(&chan->tx_q, skb) {
2040 if (skb == chan->tx_send_head)
2041 break;
2042
2043 l2cap_seq_list_append(&chan->retrans_list,
2044 bt_cb(skb)->control.txseq);
2045 }
2046
2047 l2cap_ertm_resend(chan);
2048 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002049}
2050
Szymon Jancb17e73b2012-01-11 10:59:47 +01002051static void l2cap_send_ack(struct l2cap_chan *chan)
2052{
Mat Martineau0a0aba42012-05-17 20:53:39 -07002053 struct l2cap_ctrl control;
2054 u16 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
2055 chan->last_acked_seq);
2056 int threshold;
2057
2058 BT_DBG("chan %p last_acked_seq %d buffer_seq %d",
2059 chan, chan->last_acked_seq, chan->buffer_seq);
2060
2061 memset(&control, 0, sizeof(control));
2062 control.sframe = 1;
2063
2064 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
2065 chan->rx_state == L2CAP_RX_STATE_RECV) {
2066 __clear_ack_timer(chan);
2067 control.super = L2CAP_SUPER_RNR;
2068 control.reqseq = chan->buffer_seq;
2069 l2cap_send_sframe(chan, &control);
2070 } else {
2071 if (!test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) {
2072 l2cap_ertm_send(chan);
2073 /* If any i-frames were sent, they included an ack */
2074 if (chan->buffer_seq == chan->last_acked_seq)
2075 frames_to_ack = 0;
2076 }
2077
Mat Martineauc20f8e32012-07-10 05:47:07 -07002078 /* Ack now if the window is 3/4ths full.
Mat Martineau0a0aba42012-05-17 20:53:39 -07002079 * Calculate without mul or div
2080 */
Mat Martineauc20f8e32012-07-10 05:47:07 -07002081 threshold = chan->ack_win;
Mat Martineau0a0aba42012-05-17 20:53:39 -07002082 threshold += threshold << 1;
2083 threshold >>= 2;
2084
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002085 BT_DBG("frames_to_ack %u, threshold %d", frames_to_ack,
Mat Martineau0a0aba42012-05-17 20:53:39 -07002086 threshold);
2087
2088 if (frames_to_ack >= threshold) {
2089 __clear_ack_timer(chan);
2090 control.super = L2CAP_SUPER_RR;
2091 control.reqseq = chan->buffer_seq;
2092 l2cap_send_sframe(chan, &control);
2093 frames_to_ack = 0;
2094 }
2095
2096 if (frames_to_ack)
2097 __set_ack_timer(chan);
2098 }
Szymon Jancb17e73b2012-01-11 10:59:47 +01002099}
2100
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002101static inline int l2cap_skbuff_fromiovec(struct l2cap_chan *chan,
2102 struct msghdr *msg, int len,
2103 int count, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002104{
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002105 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002106 struct sk_buff **frag;
Gustavo Padovan90338942012-04-06 20:15:47 -03002107 int sent = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002108
Gustavo F. Padovan59203a22010-05-01 16:15:43 -03002109 if (memcpy_fromiovec(skb_put(skb, count), msg->msg_iov, count))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002110 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002111
2112 sent += count;
2113 len -= count;
2114
2115 /* Continuation fragments (no L2CAP header) */
2116 frag = &skb_shinfo(skb)->frag_list;
2117 while (len) {
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002118 struct sk_buff *tmp;
2119
Linus Torvalds1da177e2005-04-16 15:20:36 -07002120 count = min_t(unsigned int, conn->mtu, len);
2121
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002122 tmp = chan->ops->alloc_skb(chan, count,
2123 msg->msg_flags & MSG_DONTWAIT);
2124 if (IS_ERR(tmp))
2125 return PTR_ERR(tmp);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002126
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002127 *frag = tmp;
2128
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002129 if (memcpy_fromiovec(skb_put(*frag, count), msg->msg_iov, count))
2130 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002131
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002132 (*frag)->priority = skb->priority;
2133
Linus Torvalds1da177e2005-04-16 15:20:36 -07002134 sent += count;
2135 len -= count;
2136
Gustavo Padovan2d0ed3d2012-05-11 13:16:12 -03002137 skb->len += (*frag)->len;
2138 skb->data_len += (*frag)->len;
2139
Linus Torvalds1da177e2005-04-16 15:20:36 -07002140 frag = &(*frag)->next;
2141 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002142
2143 return sent;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002144}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002145
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002146static struct sk_buff *l2cap_create_connless_pdu(struct l2cap_chan *chan,
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002147 struct msghdr *msg, size_t len,
2148 u32 priority)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002149{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002150 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002151 struct sk_buff *skb;
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002152 int err, count, hlen = L2CAP_HDR_SIZE + L2CAP_PSMLEN_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002153 struct l2cap_hdr *lh;
2154
Marcel Holtmann43b1b8d2013-10-12 06:01:26 -07002155 BT_DBG("chan %p psm 0x%2.2x len %zu priority %u", chan,
2156 __le16_to_cpu(chan->psm), len, priority);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002157
2158 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002159
2160 skb = chan->ops->alloc_skb(chan, count + hlen,
Gustavo Padovan90338942012-04-06 20:15:47 -03002161 msg->msg_flags & MSG_DONTWAIT);
2162 if (IS_ERR(skb))
2163 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002164
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002165 skb->priority = priority;
2166
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002167 /* Create L2CAP header */
2168 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002169 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenkodaf6a78c2012-05-03 10:55:52 +03002170 lh->len = cpu_to_le16(len + L2CAP_PSMLEN_SIZE);
Marcel Holtmann43b1b8d2013-10-12 06:01:26 -07002171 put_unaligned(chan->psm, (__le16 *) skb_put(skb, L2CAP_PSMLEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002172
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002173 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002174 if (unlikely(err < 0)) {
2175 kfree_skb(skb);
2176 return ERR_PTR(err);
2177 }
2178 return skb;
2179}
2180
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002181static struct sk_buff *l2cap_create_basic_pdu(struct l2cap_chan *chan,
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002182 struct msghdr *msg, size_t len,
2183 u32 priority)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002184{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002185 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002186 struct sk_buff *skb;
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002187 int err, count;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002188 struct l2cap_hdr *lh;
2189
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002190 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002191
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002192 count = min_t(unsigned int, (conn->mtu - L2CAP_HDR_SIZE), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002193
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002194 skb = chan->ops->alloc_skb(chan, count + L2CAP_HDR_SIZE,
Gustavo Padovan90338942012-04-06 20:15:47 -03002195 msg->msg_flags & MSG_DONTWAIT);
2196 if (IS_ERR(skb))
2197 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002198
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002199 skb->priority = priority;
2200
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002201 /* Create L2CAP header */
2202 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002203 lh->cid = cpu_to_le16(chan->dcid);
Gustavo Padovan6ff9b5e2012-05-02 11:56:17 -03002204 lh->len = cpu_to_le16(len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002205
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002206 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002207 if (unlikely(err < 0)) {
2208 kfree_skb(skb);
2209 return ERR_PTR(err);
2210 }
2211 return skb;
2212}
2213
Luiz Augusto von Dentzab0ff762011-09-12 20:00:50 +03002214static struct sk_buff *l2cap_create_iframe_pdu(struct l2cap_chan *chan,
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002215 struct msghdr *msg, size_t len,
2216 u16 sdulen)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002217{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002218 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002219 struct sk_buff *skb;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002220 int err, count, hlen;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002221 struct l2cap_hdr *lh;
2222
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002223 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002224
Gustavo F. Padovan0ee0d202010-05-01 16:15:41 -03002225 if (!conn)
2226 return ERR_PTR(-ENOTCONN);
2227
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002228 hlen = __ertm_hdr_size(chan);
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002229
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002230 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002231 hlen += L2CAP_SDULEN_SIZE;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002232
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03002233 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002234 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03002235
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002236 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002237
2238 skb = chan->ops->alloc_skb(chan, count + hlen,
Gustavo Padovan90338942012-04-06 20:15:47 -03002239 msg->msg_flags & MSG_DONTWAIT);
2240 if (IS_ERR(skb))
2241 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002242
2243 /* Create L2CAP header */
2244 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002245 lh->cid = cpu_to_le16(chan->dcid);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002246 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002247
Mat Martineau18a48e72012-05-17 20:53:34 -07002248 /* Control header is populated later */
2249 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
2250 put_unaligned_le32(0, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
2251 else
2252 put_unaligned_le16(0, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002253
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002254 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002255 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002256
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002257 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002258 if (unlikely(err < 0)) {
2259 kfree_skb(skb);
2260 return ERR_PTR(err);
2261 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03002262
Mat Martineau18a48e72012-05-17 20:53:34 -07002263 bt_cb(skb)->control.fcs = chan->fcs;
Mat Martineau3ce35142012-04-25 16:36:14 -07002264 bt_cb(skb)->control.retries = 0;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002265 return skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002266}
2267
Mat Martineau94122bb2012-05-02 09:42:02 -07002268static int l2cap_segment_sdu(struct l2cap_chan *chan,
2269 struct sk_buff_head *seg_queue,
2270 struct msghdr *msg, size_t len)
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002271{
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002272 struct sk_buff *skb;
Mat Martineau94122bb2012-05-02 09:42:02 -07002273 u16 sdu_len;
2274 size_t pdu_len;
Mat Martineau94122bb2012-05-02 09:42:02 -07002275 u8 sar;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002276
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002277 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002278
Mat Martineau94122bb2012-05-02 09:42:02 -07002279 /* It is critical that ERTM PDUs fit in a single HCI fragment,
2280 * so fragmented skbs are not used. The HCI layer's handling
2281 * of fragmented skbs is not compatible with ERTM's queueing.
2282 */
2283
2284 /* PDU size is derived from the HCI MTU */
2285 pdu_len = chan->conn->mtu;
2286
Mat Martineaua5495742012-10-23 15:24:21 -07002287 /* Constrain PDU size for BR/EDR connections */
2288 if (!chan->hs_hcon)
2289 pdu_len = min_t(size_t, pdu_len, L2CAP_BREDR_MAX_PAYLOAD);
Mat Martineau94122bb2012-05-02 09:42:02 -07002290
2291 /* Adjust for largest possible L2CAP overhead. */
Gustavo Padovan35d401d2012-05-25 18:57:05 -03002292 if (chan->fcs)
2293 pdu_len -= L2CAP_FCS_SIZE;
2294
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002295 pdu_len -= __ertm_hdr_size(chan);
Mat Martineau94122bb2012-05-02 09:42:02 -07002296
2297 /* Remote device may have requested smaller PDUs */
2298 pdu_len = min_t(size_t, pdu_len, chan->remote_mps);
2299
2300 if (len <= pdu_len) {
2301 sar = L2CAP_SAR_UNSEGMENTED;
2302 sdu_len = 0;
2303 pdu_len = len;
2304 } else {
2305 sar = L2CAP_SAR_START;
2306 sdu_len = len;
2307 pdu_len -= L2CAP_SDULEN_SIZE;
2308 }
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002309
2310 while (len > 0) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002311 skb = l2cap_create_iframe_pdu(chan, msg, pdu_len, sdu_len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002312
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002313 if (IS_ERR(skb)) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002314 __skb_queue_purge(seg_queue);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002315 return PTR_ERR(skb);
2316 }
2317
Mat Martineau94122bb2012-05-02 09:42:02 -07002318 bt_cb(skb)->control.sar = sar;
2319 __skb_queue_tail(seg_queue, skb);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002320
Mat Martineau94122bb2012-05-02 09:42:02 -07002321 len -= pdu_len;
2322 if (sdu_len) {
2323 sdu_len = 0;
2324 pdu_len += L2CAP_SDULEN_SIZE;
2325 }
2326
2327 if (len <= pdu_len) {
2328 sar = L2CAP_SAR_END;
2329 pdu_len = len;
2330 } else {
2331 sar = L2CAP_SAR_CONTINUE;
2332 }
2333 }
2334
Gustavo Padovanf0f62792012-05-29 13:29:17 -03002335 return 0;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002336}
2337
Johan Hedberg177f8f22013-05-31 17:54:51 +03002338static struct sk_buff *l2cap_create_le_flowctl_pdu(struct l2cap_chan *chan,
2339 struct msghdr *msg,
2340 size_t len, u16 sdulen)
2341{
2342 struct l2cap_conn *conn = chan->conn;
2343 struct sk_buff *skb;
2344 int err, count, hlen;
2345 struct l2cap_hdr *lh;
2346
2347 BT_DBG("chan %p len %zu", chan, len);
2348
2349 if (!conn)
2350 return ERR_PTR(-ENOTCONN);
2351
2352 hlen = L2CAP_HDR_SIZE;
2353
2354 if (sdulen)
2355 hlen += L2CAP_SDULEN_SIZE;
2356
2357 count = min_t(unsigned int, (conn->mtu - hlen), len);
2358
2359 skb = chan->ops->alloc_skb(chan, count + hlen,
2360 msg->msg_flags & MSG_DONTWAIT);
2361 if (IS_ERR(skb))
2362 return skb;
2363
2364 /* Create L2CAP header */
2365 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
2366 lh->cid = cpu_to_le16(chan->dcid);
2367 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
2368
2369 if (sdulen)
2370 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
2371
2372 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
2373 if (unlikely(err < 0)) {
2374 kfree_skb(skb);
2375 return ERR_PTR(err);
2376 }
2377
2378 return skb;
2379}
2380
2381static int l2cap_segment_le_sdu(struct l2cap_chan *chan,
2382 struct sk_buff_head *seg_queue,
2383 struct msghdr *msg, size_t len)
2384{
2385 struct sk_buff *skb;
2386 size_t pdu_len;
2387 u16 sdu_len;
2388
2389 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
2390
2391 pdu_len = chan->conn->mtu - L2CAP_HDR_SIZE;
2392
2393 pdu_len = min_t(size_t, pdu_len, chan->remote_mps);
2394
2395 sdu_len = len;
2396 pdu_len -= L2CAP_SDULEN_SIZE;
2397
2398 while (len > 0) {
2399 if (len <= pdu_len)
2400 pdu_len = len;
2401
2402 skb = l2cap_create_le_flowctl_pdu(chan, msg, pdu_len, sdu_len);
2403 if (IS_ERR(skb)) {
2404 __skb_queue_purge(seg_queue);
2405 return PTR_ERR(skb);
2406 }
2407
2408 __skb_queue_tail(seg_queue, skb);
2409
2410 len -= pdu_len;
2411
2412 if (sdu_len) {
2413 sdu_len = 0;
2414 pdu_len += L2CAP_SDULEN_SIZE;
2415 }
2416 }
2417
2418 return 0;
2419}
2420
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002421int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01002422 u32 priority)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002423{
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002424 struct sk_buff *skb;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002425 int err;
Mat Martineau94122bb2012-05-02 09:42:02 -07002426 struct sk_buff_head seg_queue;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002427
Seung-Woo Kim31e8ce82013-11-05 18:46:33 +09002428 if (!chan->conn)
2429 return -ENOTCONN;
2430
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002431 /* Connectionless channel */
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002432 if (chan->chan_type == L2CAP_CHAN_CONN_LESS) {
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002433 skb = l2cap_create_connless_pdu(chan, msg, len, priority);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002434 if (IS_ERR(skb))
2435 return PTR_ERR(skb);
2436
2437 l2cap_do_send(chan, skb);
2438 return len;
2439 }
2440
2441 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03002442 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedberg177f8f22013-05-31 17:54:51 +03002443 /* Check outgoing MTU */
2444 if (len > chan->omtu)
2445 return -EMSGSIZE;
2446
Johan Hedbergfad5fc82013-12-05 09:45:01 +02002447 if (!chan->tx_credits)
2448 return -EAGAIN;
2449
Johan Hedberg177f8f22013-05-31 17:54:51 +03002450 __skb_queue_head_init(&seg_queue);
2451
2452 err = l2cap_segment_le_sdu(chan, &seg_queue, msg, len);
2453
2454 if (chan->state != BT_CONNECTED) {
2455 __skb_queue_purge(&seg_queue);
2456 err = -ENOTCONN;
2457 }
2458
2459 if (err)
2460 return err;
2461
2462 skb_queue_splice_tail_init(&seg_queue, &chan->tx_q);
2463
2464 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
2465 l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
2466 chan->tx_credits--;
2467 }
2468
2469 if (!chan->tx_credits)
2470 chan->ops->suspend(chan);
2471
2472 err = len;
2473
2474 break;
2475
Johan Hedbergfad5fc82013-12-05 09:45:01 +02002476 case L2CAP_MODE_BASIC:
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002477 /* Check outgoing MTU */
2478 if (len > chan->omtu)
2479 return -EMSGSIZE;
2480
2481 /* Create a basic PDU */
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002482 skb = l2cap_create_basic_pdu(chan, msg, len, priority);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002483 if (IS_ERR(skb))
2484 return PTR_ERR(skb);
2485
2486 l2cap_do_send(chan, skb);
2487 err = len;
2488 break;
2489
2490 case L2CAP_MODE_ERTM:
2491 case L2CAP_MODE_STREAMING:
Mat Martineau94122bb2012-05-02 09:42:02 -07002492 /* Check outgoing MTU */
2493 if (len > chan->omtu) {
2494 err = -EMSGSIZE;
2495 break;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002496 }
2497
Mat Martineau94122bb2012-05-02 09:42:02 -07002498 __skb_queue_head_init(&seg_queue);
2499
2500 /* Do segmentation before calling in to the state machine,
2501 * since it's possible to block while waiting for memory
2502 * allocation.
2503 */
2504 err = l2cap_segment_sdu(chan, &seg_queue, msg, len);
2505
2506 /* The channel could have been closed while segmenting,
2507 * check that it is still connected.
2508 */
2509 if (chan->state != BT_CONNECTED) {
2510 __skb_queue_purge(&seg_queue);
2511 err = -ENOTCONN;
2512 }
2513
2514 if (err)
2515 break;
2516
Mat Martineau37339372012-05-17 20:53:33 -07002517 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo Padovand6603662012-05-21 13:58:22 -03002518 l2cap_tx(chan, NULL, &seg_queue, L2CAP_EV_DATA_REQUEST);
Mat Martineau37339372012-05-17 20:53:33 -07002519 else
Gustavo Padovand6603662012-05-21 13:58:22 -03002520 l2cap_streaming_send(chan, &seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002521
Gustavo Padovand6603662012-05-21 13:58:22 -03002522 err = len;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002523
Mat Martineau94122bb2012-05-02 09:42:02 -07002524 /* If the skbs were not queued for sending, they'll still be in
2525 * seg_queue and need to be purged.
2526 */
2527 __skb_queue_purge(&seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002528 break;
2529
2530 default:
2531 BT_DBG("bad state %1.1x", chan->mode);
2532 err = -EBADFD;
2533 }
2534
2535 return err;
2536}
2537
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002538static void l2cap_send_srej(struct l2cap_chan *chan, u16 txseq)
2539{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002540 struct l2cap_ctrl control;
2541 u16 seq;
2542
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002543 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002544
2545 memset(&control, 0, sizeof(control));
2546 control.sframe = 1;
2547 control.super = L2CAP_SUPER_SREJ;
2548
2549 for (seq = chan->expected_tx_seq; seq != txseq;
2550 seq = __next_seq(chan, seq)) {
2551 if (!l2cap_ertm_seq_in_queue(&chan->srej_q, seq)) {
2552 control.reqseq = seq;
2553 l2cap_send_sframe(chan, &control);
2554 l2cap_seq_list_append(&chan->srej_list, seq);
2555 }
2556 }
2557
2558 chan->expected_tx_seq = __next_seq(chan, txseq);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002559}
2560
2561static void l2cap_send_srej_tail(struct l2cap_chan *chan)
2562{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002563 struct l2cap_ctrl control;
2564
2565 BT_DBG("chan %p", chan);
2566
2567 if (chan->srej_list.tail == L2CAP_SEQ_LIST_CLEAR)
2568 return;
2569
2570 memset(&control, 0, sizeof(control));
2571 control.sframe = 1;
2572 control.super = L2CAP_SUPER_SREJ;
2573 control.reqseq = chan->srej_list.tail;
2574 l2cap_send_sframe(chan, &control);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002575}
2576
2577static void l2cap_send_srej_list(struct l2cap_chan *chan, u16 txseq)
2578{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002579 struct l2cap_ctrl control;
2580 u16 initial_head;
2581 u16 seq;
2582
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002583 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002584
2585 memset(&control, 0, sizeof(control));
2586 control.sframe = 1;
2587 control.super = L2CAP_SUPER_SREJ;
2588
2589 /* Capture initial list head to allow only one pass through the list. */
2590 initial_head = chan->srej_list.head;
2591
2592 do {
2593 seq = l2cap_seq_list_pop(&chan->srej_list);
2594 if (seq == txseq || seq == L2CAP_SEQ_LIST_CLEAR)
2595 break;
2596
2597 control.reqseq = seq;
2598 l2cap_send_sframe(chan, &control);
2599 l2cap_seq_list_append(&chan->srej_list, seq);
2600 } while (chan->srej_list.head != initial_head);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002601}
2602
Mat Martineau608bcc62012-05-17 20:53:32 -07002603static void l2cap_process_reqseq(struct l2cap_chan *chan, u16 reqseq)
2604{
2605 struct sk_buff *acked_skb;
2606 u16 ackseq;
2607
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002608 BT_DBG("chan %p, reqseq %u", chan, reqseq);
Mat Martineau608bcc62012-05-17 20:53:32 -07002609
2610 if (chan->unacked_frames == 0 || reqseq == chan->expected_ack_seq)
2611 return;
2612
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002613 BT_DBG("expected_ack_seq %u, unacked_frames %u",
Mat Martineau608bcc62012-05-17 20:53:32 -07002614 chan->expected_ack_seq, chan->unacked_frames);
2615
2616 for (ackseq = chan->expected_ack_seq; ackseq != reqseq;
2617 ackseq = __next_seq(chan, ackseq)) {
2618
2619 acked_skb = l2cap_ertm_seq_in_queue(&chan->tx_q, ackseq);
2620 if (acked_skb) {
2621 skb_unlink(acked_skb, &chan->tx_q);
2622 kfree_skb(acked_skb);
2623 chan->unacked_frames--;
2624 }
2625 }
2626
2627 chan->expected_ack_seq = reqseq;
2628
2629 if (chan->unacked_frames == 0)
2630 __clear_retrans_timer(chan);
2631
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002632 BT_DBG("unacked_frames %u", chan->unacked_frames);
Mat Martineau608bcc62012-05-17 20:53:32 -07002633}
2634
2635static void l2cap_abort_rx_srej_sent(struct l2cap_chan *chan)
2636{
2637 BT_DBG("chan %p", chan);
2638
2639 chan->expected_tx_seq = chan->buffer_seq;
2640 l2cap_seq_list_clear(&chan->srej_list);
2641 skb_queue_purge(&chan->srej_q);
2642 chan->rx_state = L2CAP_RX_STATE_RECV;
2643}
2644
Gustavo Padovand6603662012-05-21 13:58:22 -03002645static void l2cap_tx_state_xmit(struct l2cap_chan *chan,
2646 struct l2cap_ctrl *control,
2647 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002648{
Mat Martineau608bcc62012-05-17 20:53:32 -07002649 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2650 event);
2651
2652 switch (event) {
2653 case L2CAP_EV_DATA_REQUEST:
2654 if (chan->tx_send_head == NULL)
2655 chan->tx_send_head = skb_peek(skbs);
2656
2657 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2658 l2cap_ertm_send(chan);
2659 break;
2660 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2661 BT_DBG("Enter LOCAL_BUSY");
2662 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2663
2664 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2665 /* The SREJ_SENT state must be aborted if we are to
2666 * enter the LOCAL_BUSY state.
2667 */
2668 l2cap_abort_rx_srej_sent(chan);
2669 }
2670
2671 l2cap_send_ack(chan);
2672
2673 break;
2674 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2675 BT_DBG("Exit LOCAL_BUSY");
2676 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2677
2678 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2679 struct l2cap_ctrl local_control;
2680
2681 memset(&local_control, 0, sizeof(local_control));
2682 local_control.sframe = 1;
2683 local_control.super = L2CAP_SUPER_RR;
2684 local_control.poll = 1;
2685 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002686 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002687
2688 chan->retry_count = 1;
2689 __set_monitor_timer(chan);
2690 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2691 }
2692 break;
2693 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2694 l2cap_process_reqseq(chan, control->reqseq);
2695 break;
2696 case L2CAP_EV_EXPLICIT_POLL:
2697 l2cap_send_rr_or_rnr(chan, 1);
2698 chan->retry_count = 1;
2699 __set_monitor_timer(chan);
2700 __clear_ack_timer(chan);
2701 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2702 break;
2703 case L2CAP_EV_RETRANS_TO:
2704 l2cap_send_rr_or_rnr(chan, 1);
2705 chan->retry_count = 1;
2706 __set_monitor_timer(chan);
2707 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2708 break;
2709 case L2CAP_EV_RECV_FBIT:
2710 /* Nothing to process */
2711 break;
2712 default:
2713 break;
2714 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002715}
2716
Gustavo Padovand6603662012-05-21 13:58:22 -03002717static void l2cap_tx_state_wait_f(struct l2cap_chan *chan,
2718 struct l2cap_ctrl *control,
2719 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002720{
Mat Martineau608bcc62012-05-17 20:53:32 -07002721 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2722 event);
2723
2724 switch (event) {
2725 case L2CAP_EV_DATA_REQUEST:
2726 if (chan->tx_send_head == NULL)
2727 chan->tx_send_head = skb_peek(skbs);
2728 /* Queue data, but don't send. */
2729 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2730 break;
2731 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2732 BT_DBG("Enter LOCAL_BUSY");
2733 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2734
2735 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2736 /* The SREJ_SENT state must be aborted if we are to
2737 * enter the LOCAL_BUSY state.
2738 */
2739 l2cap_abort_rx_srej_sent(chan);
2740 }
2741
2742 l2cap_send_ack(chan);
2743
2744 break;
2745 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2746 BT_DBG("Exit LOCAL_BUSY");
2747 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2748
2749 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2750 struct l2cap_ctrl local_control;
2751 memset(&local_control, 0, sizeof(local_control));
2752 local_control.sframe = 1;
2753 local_control.super = L2CAP_SUPER_RR;
2754 local_control.poll = 1;
2755 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002756 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002757
2758 chan->retry_count = 1;
2759 __set_monitor_timer(chan);
2760 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2761 }
2762 break;
2763 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2764 l2cap_process_reqseq(chan, control->reqseq);
2765
2766 /* Fall through */
2767
2768 case L2CAP_EV_RECV_FBIT:
2769 if (control && control->final) {
2770 __clear_monitor_timer(chan);
2771 if (chan->unacked_frames > 0)
2772 __set_retrans_timer(chan);
2773 chan->retry_count = 0;
2774 chan->tx_state = L2CAP_TX_STATE_XMIT;
2775 BT_DBG("recv fbit tx_state 0x2.2%x", chan->tx_state);
2776 }
2777 break;
2778 case L2CAP_EV_EXPLICIT_POLL:
2779 /* Ignore */
2780 break;
2781 case L2CAP_EV_MONITOR_TO:
2782 if (chan->max_tx == 0 || chan->retry_count < chan->max_tx) {
2783 l2cap_send_rr_or_rnr(chan, 1);
2784 __set_monitor_timer(chan);
2785 chan->retry_count++;
2786 } else {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02002787 l2cap_send_disconn_req(chan, ECONNABORTED);
Mat Martineau608bcc62012-05-17 20:53:32 -07002788 }
2789 break;
2790 default:
2791 break;
2792 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002793}
2794
Gustavo Padovand6603662012-05-21 13:58:22 -03002795static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
2796 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002797{
Mat Martineau608bcc62012-05-17 20:53:32 -07002798 BT_DBG("chan %p, control %p, skbs %p, event %d, state %d",
2799 chan, control, skbs, event, chan->tx_state);
2800
2801 switch (chan->tx_state) {
2802 case L2CAP_TX_STATE_XMIT:
Gustavo Padovand6603662012-05-21 13:58:22 -03002803 l2cap_tx_state_xmit(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002804 break;
2805 case L2CAP_TX_STATE_WAIT_F:
Gustavo Padovand6603662012-05-21 13:58:22 -03002806 l2cap_tx_state_wait_f(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002807 break;
2808 default:
2809 /* Ignore event */
2810 break;
2811 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002812}
2813
Mat Martineau4b51dae92012-05-17 20:53:37 -07002814static void l2cap_pass_to_tx(struct l2cap_chan *chan,
2815 struct l2cap_ctrl *control)
2816{
2817 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002818 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_REQSEQ_AND_FBIT);
Mat Martineau4b51dae92012-05-17 20:53:37 -07002819}
2820
Mat Martineauf80842a2012-05-17 20:53:46 -07002821static void l2cap_pass_to_tx_fbit(struct l2cap_chan *chan,
2822 struct l2cap_ctrl *control)
2823{
2824 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002825 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_FBIT);
Mat Martineauf80842a2012-05-17 20:53:46 -07002826}
2827
Linus Torvalds1da177e2005-04-16 15:20:36 -07002828/* Copy frame to all raw sockets on that connection */
2829static void l2cap_raw_recv(struct l2cap_conn *conn, struct sk_buff *skb)
2830{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002831 struct sk_buff *nskb;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03002832 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002833
2834 BT_DBG("conn %p", conn);
2835
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002836 mutex_lock(&conn->chan_lock);
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002837
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002838 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002839 if (chan->chan_type != L2CAP_CHAN_RAW)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002840 continue;
2841
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002842 /* Don't send frame to the channel it came from */
2843 if (bt_cb(skb)->chan == chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002844 continue;
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002845
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002846 nskb = skb_clone(skb, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03002847 if (!nskb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002848 continue;
Gustavo Padovan80b98022012-05-27 22:27:51 -03002849 if (chan->ops->recv(chan, nskb))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002850 kfree_skb(nskb);
2851 }
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002852
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002853 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002854}
2855
2856/* ---- L2CAP signalling commands ---- */
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002857static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn, u8 code,
2858 u8 ident, u16 dlen, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002859{
2860 struct sk_buff *skb, **frag;
2861 struct l2cap_cmd_hdr *cmd;
2862 struct l2cap_hdr *lh;
2863 int len, count;
2864
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002865 BT_DBG("conn %p, code 0x%2.2x, ident 0x%2.2x, len %u",
2866 conn, code, ident, dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002867
Anderson Lizardo300b9622013-06-02 16:30:40 -04002868 if (conn->mtu < L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE)
2869 return NULL;
2870
Linus Torvalds1da177e2005-04-16 15:20:36 -07002871 len = L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE + dlen;
2872 count = min_t(unsigned int, conn->mtu, len);
2873
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002874 skb = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002875 if (!skb)
2876 return NULL;
2877
2878 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002879 lh->len = cpu_to_le16(L2CAP_CMD_HDR_SIZE + dlen);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002880
2881 if (conn->hcon->type == LE_LINK)
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03002882 lh->cid = __constant_cpu_to_le16(L2CAP_CID_LE_SIGNALING);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002883 else
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03002884 lh->cid = __constant_cpu_to_le16(L2CAP_CID_SIGNALING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002885
2886 cmd = (struct l2cap_cmd_hdr *) skb_put(skb, L2CAP_CMD_HDR_SIZE);
2887 cmd->code = code;
2888 cmd->ident = ident;
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002889 cmd->len = cpu_to_le16(dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002890
2891 if (dlen) {
2892 count -= L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE;
2893 memcpy(skb_put(skb, count), data, count);
2894 data += count;
2895 }
2896
2897 len -= skb->len;
2898
2899 /* Continuation fragments (no L2CAP header) */
2900 frag = &skb_shinfo(skb)->frag_list;
2901 while (len) {
2902 count = min_t(unsigned int, conn->mtu, len);
2903
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002904 *frag = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002905 if (!*frag)
2906 goto fail;
2907
2908 memcpy(skb_put(*frag, count), data, count);
2909
2910 len -= count;
2911 data += count;
2912
2913 frag = &(*frag)->next;
2914 }
2915
2916 return skb;
2917
2918fail:
2919 kfree_skb(skb);
2920 return NULL;
2921}
2922
Gustavo Padovan2d792812012-10-06 10:07:01 +01002923static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen,
2924 unsigned long *val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002925{
2926 struct l2cap_conf_opt *opt = *ptr;
2927 int len;
2928
2929 len = L2CAP_CONF_OPT_SIZE + opt->len;
2930 *ptr += len;
2931
2932 *type = opt->type;
2933 *olen = opt->len;
2934
2935 switch (opt->len) {
2936 case 1:
2937 *val = *((u8 *) opt->val);
2938 break;
2939
2940 case 2:
steven miaobfaaeb32010-10-16 18:29:47 -04002941 *val = get_unaligned_le16(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002942 break;
2943
2944 case 4:
steven miaobfaaeb32010-10-16 18:29:47 -04002945 *val = get_unaligned_le32(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002946 break;
2947
2948 default:
2949 *val = (unsigned long) opt->val;
2950 break;
2951 }
2952
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002953 BT_DBG("type 0x%2.2x len %u val 0x%lx", *type, opt->len, *val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002954 return len;
2955}
2956
Linus Torvalds1da177e2005-04-16 15:20:36 -07002957static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val)
2958{
2959 struct l2cap_conf_opt *opt = *ptr;
2960
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002961 BT_DBG("type 0x%2.2x len %u val 0x%lx", type, len, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002962
2963 opt->type = type;
2964 opt->len = len;
2965
2966 switch (len) {
2967 case 1:
2968 *((u8 *) opt->val) = val;
2969 break;
2970
2971 case 2:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02002972 put_unaligned_le16(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002973 break;
2974
2975 case 4:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02002976 put_unaligned_le32(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002977 break;
2978
2979 default:
2980 memcpy(opt->val, (void *) val, len);
2981 break;
2982 }
2983
2984 *ptr += L2CAP_CONF_OPT_SIZE + len;
2985}
2986
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03002987static void l2cap_add_opt_efs(void **ptr, struct l2cap_chan *chan)
2988{
2989 struct l2cap_conf_efs efs;
2990
Szymon Janc1ec918c2011-11-16 09:32:21 +01002991 switch (chan->mode) {
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03002992 case L2CAP_MODE_ERTM:
2993 efs.id = chan->local_id;
2994 efs.stype = chan->local_stype;
2995 efs.msdu = cpu_to_le16(chan->local_msdu);
2996 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03002997 efs.acc_lat = __constant_cpu_to_le32(L2CAP_DEFAULT_ACC_LAT);
Andrei Emeltchenko8936fa62012-10-08 11:14:41 +03002998 efs.flush_to = __constant_cpu_to_le32(L2CAP_EFS_DEFAULT_FLUSH_TO);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03002999 break;
3000
3001 case L2CAP_MODE_STREAMING:
3002 efs.id = 1;
3003 efs.stype = L2CAP_SERV_BESTEFFORT;
3004 efs.msdu = cpu_to_le16(chan->local_msdu);
3005 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
3006 efs.acc_lat = 0;
3007 efs.flush_to = 0;
3008 break;
3009
3010 default:
3011 return;
3012 }
3013
3014 l2cap_add_conf_opt(ptr, L2CAP_CONF_EFS, sizeof(efs),
Andrei Emeltchenko8936fa62012-10-08 11:14:41 +03003015 (unsigned long) &efs);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003016}
3017
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003018static void l2cap_ack_timeout(struct work_struct *work)
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003019{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003020 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau03625202012-05-17 20:53:51 -07003021 ack_timer.work);
3022 u16 frames_to_ack;
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003023
Gustavo F. Padovan2fb9b3d2011-12-22 16:56:05 -02003024 BT_DBG("chan %p", chan);
3025
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003026 l2cap_chan_lock(chan);
3027
Mat Martineau03625202012-05-17 20:53:51 -07003028 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
3029 chan->last_acked_seq);
3030
3031 if (frames_to_ack)
3032 l2cap_send_rr_or_rnr(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003033
3034 l2cap_chan_unlock(chan);
Szymon Janc09bfb2e2012-01-11 10:59:49 +01003035 l2cap_chan_put(chan);
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003036}
3037
Andrei Emeltchenko466f8002012-05-29 13:59:01 +03003038int l2cap_ertm_init(struct l2cap_chan *chan)
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003039{
Mat Martineau3c588192012-04-11 10:48:42 -07003040 int err;
3041
Mat Martineau105bdf92012-04-27 16:50:48 -07003042 chan->next_tx_seq = 0;
3043 chan->expected_tx_seq = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003044 chan->expected_ack_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003045 chan->unacked_frames = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003046 chan->buffer_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003047 chan->frames_sent = 0;
Mat Martineau105bdf92012-04-27 16:50:48 -07003048 chan->last_acked_seq = 0;
3049 chan->sdu = NULL;
3050 chan->sdu_last_frag = NULL;
3051 chan->sdu_len = 0;
3052
Mat Martineaud34c34f2012-05-14 14:49:27 -07003053 skb_queue_head_init(&chan->tx_q);
3054
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003055 chan->local_amp_id = AMP_ID_BREDR;
3056 chan->move_id = AMP_ID_BREDR;
Mat Martineau08333282012-10-23 15:24:06 -07003057 chan->move_state = L2CAP_MOVE_STABLE;
3058 chan->move_role = L2CAP_MOVE_ROLE_NONE;
3059
Mat Martineau105bdf92012-04-27 16:50:48 -07003060 if (chan->mode != L2CAP_MODE_ERTM)
3061 return 0;
3062
3063 chan->rx_state = L2CAP_RX_STATE_RECV;
3064 chan->tx_state = L2CAP_TX_STATE_XMIT;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003065
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003066 INIT_DELAYED_WORK(&chan->retrans_timer, l2cap_retrans_timeout);
3067 INIT_DELAYED_WORK(&chan->monitor_timer, l2cap_monitor_timeout);
3068 INIT_DELAYED_WORK(&chan->ack_timer, l2cap_ack_timeout);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003069
Gustavo F. Padovanf1c67752011-03-25 20:36:10 -03003070 skb_queue_head_init(&chan->srej_q);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03003071
Mat Martineau3c588192012-04-11 10:48:42 -07003072 err = l2cap_seq_list_init(&chan->srej_list, chan->tx_win);
3073 if (err < 0)
3074 return err;
3075
Mat Martineau9dc9aff2012-05-17 16:20:14 -07003076 err = l2cap_seq_list_init(&chan->retrans_list, chan->remote_tx_win);
3077 if (err < 0)
3078 l2cap_seq_list_free(&chan->srej_list);
3079
3080 return err;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003081}
3082
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003083static inline __u8 l2cap_select_mode(__u8 mode, __u16 remote_feat_mask)
3084{
3085 switch (mode) {
3086 case L2CAP_MODE_STREAMING:
3087 case L2CAP_MODE_ERTM:
3088 if (l2cap_mode_supported(mode, remote_feat_mask))
3089 return mode;
3090 /* fall through */
3091 default:
3092 return L2CAP_MODE_BASIC;
3093 }
3094}
3095
Marcel Holtmann848566b2013-10-01 22:59:22 -07003096static inline bool __l2cap_ews_supported(struct l2cap_conn *conn)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003097{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003098 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003099}
3100
Marcel Holtmann848566b2013-10-01 22:59:22 -07003101static inline bool __l2cap_efs_supported(struct l2cap_conn *conn)
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003102{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003103 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_FLOW;
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003104}
3105
Mat Martineau36c86c82012-10-23 15:24:20 -07003106static void __l2cap_set_ertm_timeouts(struct l2cap_chan *chan,
3107 struct l2cap_conf_rfc *rfc)
3108{
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003109 if (chan->local_amp_id != AMP_ID_BREDR && chan->hs_hcon) {
Mat Martineau36c86c82012-10-23 15:24:20 -07003110 u64 ertm_to = chan->hs_hcon->hdev->amp_be_flush_to;
3111
3112 /* Class 1 devices have must have ERTM timeouts
3113 * exceeding the Link Supervision Timeout. The
3114 * default Link Supervision Timeout for AMP
3115 * controllers is 10 seconds.
3116 *
3117 * Class 1 devices use 0xffffffff for their
3118 * best-effort flush timeout, so the clamping logic
3119 * will result in a timeout that meets the above
3120 * requirement. ERTM timeouts are 16-bit values, so
3121 * the maximum timeout is 65.535 seconds.
3122 */
3123
3124 /* Convert timeout to milliseconds and round */
3125 ertm_to = DIV_ROUND_UP_ULL(ertm_to, 1000);
3126
3127 /* This is the recommended formula for class 2 devices
3128 * that start ERTM timers when packets are sent to the
3129 * controller.
3130 */
3131 ertm_to = 3 * ertm_to + 500;
3132
3133 if (ertm_to > 0xffff)
3134 ertm_to = 0xffff;
3135
3136 rfc->retrans_timeout = cpu_to_le16((u16) ertm_to);
3137 rfc->monitor_timeout = rfc->retrans_timeout;
3138 } else {
3139 rfc->retrans_timeout = __constant_cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO);
3140 rfc->monitor_timeout = __constant_cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO);
3141 }
3142}
3143
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003144static inline void l2cap_txwin_setup(struct l2cap_chan *chan)
3145{
3146 if (chan->tx_win > L2CAP_DEFAULT_TX_WINDOW &&
Marcel Holtmann848566b2013-10-01 22:59:22 -07003147 __l2cap_ews_supported(chan->conn)) {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003148 /* use extended control field */
3149 set_bit(FLAG_EXT_CTRL, &chan->flags);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003150 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
3151 } else {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003152 chan->tx_win = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003153 L2CAP_DEFAULT_TX_WINDOW);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003154 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
3155 }
Mat Martineauc20f8e32012-07-10 05:47:07 -07003156 chan->ack_win = chan->tx_win;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003157}
3158
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003159static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003160{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003161 struct l2cap_conf_req *req = data;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003162 struct l2cap_conf_rfc rfc = { .mode = chan->mode };
Linus Torvalds1da177e2005-04-16 15:20:36 -07003163 void *ptr = req->data;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003164 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003165
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03003166 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003167
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003168 if (chan->num_conf_req || chan->num_conf_rsp)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003169 goto done;
3170
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003171 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003172 case L2CAP_MODE_STREAMING:
3173 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003174 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state))
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003175 break;
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003176
Marcel Holtmann848566b2013-10-01 22:59:22 -07003177 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003178 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3179
Gustavo F. Padovan2ba13ed2010-06-09 16:39:05 -03003180 /* fall through */
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003181 default:
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003182 chan->mode = l2cap_select_mode(rfc.mode, chan->conn->feat_mask);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003183 break;
3184 }
3185
3186done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003187 if (chan->imtu != L2CAP_DEFAULT_MTU)
3188 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovan7990681c2011-01-24 16:01:43 -02003189
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003190 switch (chan->mode) {
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003191 case L2CAP_MODE_BASIC:
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003192 if (!(chan->conn->feat_mask & L2CAP_FEAT_ERTM) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003193 !(chan->conn->feat_mask & L2CAP_FEAT_STREAMING))
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003194 break;
3195
Gustavo F. Padovan62547752010-06-08 20:05:31 -03003196 rfc.mode = L2CAP_MODE_BASIC;
3197 rfc.txwin_size = 0;
3198 rfc.max_transmit = 0;
3199 rfc.retrans_timeout = 0;
3200 rfc.monitor_timeout = 0;
3201 rfc.max_pdu_size = 0;
3202
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003203 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003204 (unsigned long) &rfc);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003205 break;
3206
3207 case L2CAP_MODE_ERTM:
3208 rfc.mode = L2CAP_MODE_ERTM;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003209 rfc.max_transmit = chan->max_tx;
Mat Martineau36c86c82012-10-23 15:24:20 -07003210
3211 __l2cap_set_ertm_timeouts(chan, &rfc);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003212
3213 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003214 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3215 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003216 rfc.max_pdu_size = cpu_to_le16(size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003217
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003218 l2cap_txwin_setup(chan);
3219
3220 rfc.txwin_size = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003221 L2CAP_DEFAULT_TX_WINDOW);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003222
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003223 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003224 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003225
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003226 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3227 l2cap_add_opt_efs(&ptr, chan);
3228
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003229 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3230 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003231 chan->tx_win);
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003232
3233 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3234 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003235 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003236 chan->fcs = L2CAP_FCS_NONE;
3237 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3238 chan->fcs);
3239 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003240 break;
3241
3242 case L2CAP_MODE_STREAMING:
Mat Martineau273759e2012-05-17 20:53:53 -07003243 l2cap_txwin_setup(chan);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003244 rfc.mode = L2CAP_MODE_STREAMING;
3245 rfc.txwin_size = 0;
3246 rfc.max_transmit = 0;
3247 rfc.retrans_timeout = 0;
3248 rfc.monitor_timeout = 0;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003249
3250 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003251 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3252 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003253 rfc.max_pdu_size = cpu_to_le16(size);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003254
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003255 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003256 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003257
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003258 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3259 l2cap_add_opt_efs(&ptr, chan);
3260
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003261 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3262 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003263 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003264 chan->fcs = L2CAP_FCS_NONE;
3265 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3266 chan->fcs);
3267 }
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003268 break;
3269 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003270
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003271 req->dcid = cpu_to_le16(chan->dcid);
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03003272 req->flags = __constant_cpu_to_le16(0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003273
3274 return ptr - data;
3275}
3276
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003277static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003278{
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003279 struct l2cap_conf_rsp *rsp = data;
3280 void *ptr = rsp->data;
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003281 void *req = chan->conf_req;
3282 int len = chan->conf_len;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003283 int type, hint, olen;
3284 unsigned long val;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003285 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003286 struct l2cap_conf_efs efs;
3287 u8 remote_efs = 0;
Marcel Holtmann861d6882007-10-20 13:37:06 +02003288 u16 mtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003289 u16 result = L2CAP_CONF_SUCCESS;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003290 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003291
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003292 BT_DBG("chan %p", chan);
Marcel Holtmann820ae1b2006-11-18 22:15:00 +01003293
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003294 while (len >= L2CAP_CONF_OPT_SIZE) {
3295 len -= l2cap_get_conf_opt(&req, &type, &olen, &val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003296
Gustavo F. Padovan589d2742009-04-20 01:31:07 -03003297 hint = type & L2CAP_CONF_HINT;
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07003298 type &= L2CAP_CONF_MASK;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003299
3300 switch (type) {
3301 case L2CAP_CONF_MTU:
Marcel Holtmann861d6882007-10-20 13:37:06 +02003302 mtu = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003303 break;
3304
3305 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003306 chan->flush_to = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003307 break;
3308
3309 case L2CAP_CONF_QOS:
3310 break;
3311
Marcel Holtmann6464f352007-10-20 13:39:51 +02003312 case L2CAP_CONF_RFC:
3313 if (olen == sizeof(rfc))
3314 memcpy(&rfc, (void *) val, olen);
3315 break;
3316
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003317 case L2CAP_CONF_FCS:
3318 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003319 set_bit(CONF_RECV_NO_FCS, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003320 break;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003321
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003322 case L2CAP_CONF_EFS:
3323 remote_efs = 1;
3324 if (olen == sizeof(efs))
3325 memcpy(&efs, (void *) val, olen);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003326 break;
3327
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003328 case L2CAP_CONF_EWS:
Marcel Holtmann848566b2013-10-01 22:59:22 -07003329 if (!chan->conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003330 return -ECONNREFUSED;
3331
3332 set_bit(FLAG_EXT_CTRL, &chan->flags);
3333 set_bit(CONF_EWS_RECV, &chan->conf_state);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003334 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003335 chan->remote_tx_win = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003336 break;
3337
3338 default:
3339 if (hint)
3340 break;
3341
3342 result = L2CAP_CONF_UNKNOWN;
3343 *((u8 *) ptr++) = type;
3344 break;
3345 }
3346 }
3347
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003348 if (chan->num_conf_rsp || chan->num_conf_req > 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003349 goto done;
3350
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003351 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003352 case L2CAP_MODE_STREAMING:
3353 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003354 if (!test_bit(CONF_STATE2_DEVICE, &chan->conf_state)) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003355 chan->mode = l2cap_select_mode(rfc.mode,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003356 chan->conn->feat_mask);
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003357 break;
3358 }
3359
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003360 if (remote_efs) {
Marcel Holtmann848566b2013-10-01 22:59:22 -07003361 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003362 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3363 else
3364 return -ECONNREFUSED;
3365 }
3366
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003367 if (chan->mode != rfc.mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003368 return -ECONNREFUSED;
Gustavo F. Padovan742e5192010-06-08 19:09:48 -03003369
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003370 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003371 }
3372
3373done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003374 if (chan->mode != rfc.mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003375 result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003376 rfc.mode = chan->mode;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003377
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003378 if (chan->num_conf_rsp == 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003379 return -ECONNREFUSED;
3380
Gustavo Padovan2d792812012-10-06 10:07:01 +01003381 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3382 (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003383 }
3384
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003385 if (result == L2CAP_CONF_SUCCESS) {
3386 /* Configure output options and let the other side know
3387 * which ones we don't like. */
3388
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003389 if (mtu < L2CAP_DEFAULT_MIN_MTU)
3390 result = L2CAP_CONF_UNACCEPT;
3391 else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003392 chan->omtu = mtu;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003393 set_bit(CONF_MTU_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003394 }
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003395 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->omtu);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003396
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003397 if (remote_efs) {
3398 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003399 efs.stype != L2CAP_SERV_NOTRAFIC &&
3400 efs.stype != chan->local_stype) {
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003401
3402 result = L2CAP_CONF_UNACCEPT;
3403
3404 if (chan->num_conf_req >= 1)
3405 return -ECONNREFUSED;
3406
3407 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003408 sizeof(efs),
3409 (unsigned long) &efs);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003410 } else {
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003411 /* Send PENDING Conf Rsp */
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003412 result = L2CAP_CONF_PENDING;
3413 set_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003414 }
3415 }
3416
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003417 switch (rfc.mode) {
3418 case L2CAP_MODE_BASIC:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003419 chan->fcs = L2CAP_FCS_NONE;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003420 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003421 break;
3422
3423 case L2CAP_MODE_ERTM:
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003424 if (!test_bit(CONF_EWS_RECV, &chan->conf_state))
3425 chan->remote_tx_win = rfc.txwin_size;
3426 else
3427 rfc.txwin_size = L2CAP_DEFAULT_TX_WINDOW;
3428
Gustavo F. Padovan2c03a7a2011-03-25 20:15:28 -03003429 chan->remote_max_tx = rfc.max_transmit;
Mat Martineau86b1b262010-08-05 15:54:22 -07003430
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003431 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003432 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3433 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003434 rfc.max_pdu_size = cpu_to_le16(size);
3435 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003436
Mat Martineau36c86c82012-10-23 15:24:20 -07003437 __l2cap_set_ertm_timeouts(chan, &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003438
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003439 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003440
3441 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003442 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003443
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003444 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3445 chan->remote_id = efs.id;
3446 chan->remote_stype = efs.stype;
3447 chan->remote_msdu = le16_to_cpu(efs.msdu);
3448 chan->remote_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003449 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003450 chan->remote_acc_lat =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003451 le32_to_cpu(efs.acc_lat);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003452 chan->remote_sdu_itime =
3453 le32_to_cpu(efs.sdu_itime);
3454 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003455 sizeof(efs),
3456 (unsigned long) &efs);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003457 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003458 break;
3459
3460 case L2CAP_MODE_STREAMING:
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003461 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003462 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3463 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003464 rfc.max_pdu_size = cpu_to_le16(size);
3465 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003466
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003467 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003468
Gustavo Padovan2d792812012-10-06 10:07:01 +01003469 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3470 (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003471
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003472 break;
3473
3474 default:
Marcel Holtmann6464f352007-10-20 13:39:51 +02003475 result = L2CAP_CONF_UNACCEPT;
3476
3477 memset(&rfc, 0, sizeof(rfc));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003478 rfc.mode = chan->mode;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003479 }
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003480
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003481 if (result == L2CAP_CONF_SUCCESS)
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003482 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003483 }
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003484 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003485 rsp->result = cpu_to_le16(result);
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03003486 rsp->flags = __constant_cpu_to_le16(0);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003487
3488 return ptr - data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003489}
3490
Gustavo Padovan2d792812012-10-06 10:07:01 +01003491static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len,
3492 void *data, u16 *result)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003493{
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003494 struct l2cap_conf_req *req = data;
3495 void *ptr = req->data;
3496 int type, olen;
3497 unsigned long val;
Mat Martineau36e999a2011-12-08 17:23:21 -08003498 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003499 struct l2cap_conf_efs efs;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003500
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003501 BT_DBG("chan %p, rsp %p, len %d, req %p", chan, rsp, len, data);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003502
3503 while (len >= L2CAP_CONF_OPT_SIZE) {
3504 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3505
3506 switch (type) {
3507 case L2CAP_CONF_MTU:
3508 if (val < L2CAP_DEFAULT_MIN_MTU) {
3509 *result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003510 chan->imtu = L2CAP_DEFAULT_MIN_MTU;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003511 } else
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003512 chan->imtu = val;
3513 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003514 break;
3515
3516 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003517 chan->flush_to = val;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003518 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003519 2, chan->flush_to);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003520 break;
3521
3522 case L2CAP_CONF_RFC:
3523 if (olen == sizeof(rfc))
3524 memcpy(&rfc, (void *)val, olen);
3525
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003526 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003527 rfc.mode != chan->mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003528 return -ECONNREFUSED;
3529
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003530 chan->fcs = 0;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003531
3532 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003533 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003534 break;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003535
3536 case L2CAP_CONF_EWS:
Mat Martineauc20f8e32012-07-10 05:47:07 -07003537 chan->ack_win = min_t(u16, val, chan->ack_win);
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003538 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Mat Martineauc20f8e32012-07-10 05:47:07 -07003539 chan->tx_win);
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003540 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003541
3542 case L2CAP_CONF_EFS:
3543 if (olen == sizeof(efs))
3544 memcpy(&efs, (void *)val, olen);
3545
3546 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003547 efs.stype != L2CAP_SERV_NOTRAFIC &&
3548 efs.stype != chan->local_stype)
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003549 return -ECONNREFUSED;
3550
Gustavo Padovan2d792812012-10-06 10:07:01 +01003551 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS, sizeof(efs),
3552 (unsigned long) &efs);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003553 break;
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003554
3555 case L2CAP_CONF_FCS:
3556 if (*result == L2CAP_CONF_PENDING)
3557 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003558 set_bit(CONF_RECV_NO_FCS,
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003559 &chan->conf_state);
3560 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003561 }
3562 }
3563
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003564 if (chan->mode == L2CAP_MODE_BASIC && chan->mode != rfc.mode)
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003565 return -ECONNREFUSED;
3566
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003567 chan->mode = rfc.mode;
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003568
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003569 if (*result == L2CAP_CONF_SUCCESS || *result == L2CAP_CONF_PENDING) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003570 switch (rfc.mode) {
3571 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003572 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3573 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
3574 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003575 if (!test_bit(FLAG_EXT_CTRL, &chan->flags))
3576 chan->ack_win = min_t(u16, chan->ack_win,
3577 rfc.txwin_size);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003578
3579 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3580 chan->local_msdu = le16_to_cpu(efs.msdu);
3581 chan->local_sdu_itime =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003582 le32_to_cpu(efs.sdu_itime);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003583 chan->local_acc_lat = le32_to_cpu(efs.acc_lat);
3584 chan->local_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003585 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003586 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003587 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003588
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003589 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003590 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003591 }
3592 }
3593
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003594 req->dcid = cpu_to_le16(chan->dcid);
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03003595 req->flags = __constant_cpu_to_le16(0);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003596
3597 return ptr - data;
3598}
3599
Gustavo Padovan2d792812012-10-06 10:07:01 +01003600static int l2cap_build_conf_rsp(struct l2cap_chan *chan, void *data,
3601 u16 result, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003602{
3603 struct l2cap_conf_rsp *rsp = data;
3604 void *ptr = rsp->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003605
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003606 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003607
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003608 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003609 rsp->result = cpu_to_le16(result);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003610 rsp->flags = cpu_to_le16(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003611
3612 return ptr - data;
3613}
3614
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003615void __l2cap_le_connect_rsp_defer(struct l2cap_chan *chan)
3616{
3617 struct l2cap_le_conn_rsp rsp;
3618 struct l2cap_conn *conn = chan->conn;
3619
3620 BT_DBG("chan %p", chan);
3621
3622 rsp.dcid = cpu_to_le16(chan->scid);
3623 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02003624 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03003625 rsp.credits = cpu_to_le16(chan->rx_credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003626 rsp.result = __constant_cpu_to_le16(L2CAP_CR_SUCCESS);
3627
3628 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp),
3629 &rsp);
3630}
3631
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003632void __l2cap_connect_rsp_defer(struct l2cap_chan *chan)
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003633{
3634 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003635 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003636 u8 buf[128];
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003637 u8 rsp_code;
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003638
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003639 rsp.scid = cpu_to_le16(chan->dcid);
3640 rsp.dcid = cpu_to_le16(chan->scid);
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03003641 rsp.result = __constant_cpu_to_le16(L2CAP_CR_SUCCESS);
3642 rsp.status = __constant_cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003643
3644 if (chan->hs_hcon)
3645 rsp_code = L2CAP_CREATE_CHAN_RSP;
3646 else
3647 rsp_code = L2CAP_CONN_RSP;
3648
3649 BT_DBG("chan %p rsp_code %u", chan, rsp_code);
3650
3651 l2cap_send_cmd(conn, chan->ident, rsp_code, sizeof(rsp), &rsp);
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003652
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003653 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003654 return;
3655
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003656 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003657 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003658 chan->num_conf_req++;
3659}
3660
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003661static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len)
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003662{
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003663 int type, olen;
3664 unsigned long val;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003665 /* Use sane default values in case a misbehaving remote device
3666 * did not send an RFC or extended window size option.
3667 */
3668 u16 txwin_ext = chan->ack_win;
3669 struct l2cap_conf_rfc rfc = {
3670 .mode = chan->mode,
3671 .retrans_timeout = __constant_cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO),
3672 .monitor_timeout = __constant_cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO),
3673 .max_pdu_size = cpu_to_le16(chan->imtu),
3674 .txwin_size = min_t(u16, chan->ack_win, L2CAP_DEFAULT_TX_WINDOW),
3675 };
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003676
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003677 BT_DBG("chan %p, rsp %p, len %d", chan, rsp, len);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003678
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003679 if ((chan->mode != L2CAP_MODE_ERTM) && (chan->mode != L2CAP_MODE_STREAMING))
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003680 return;
3681
3682 while (len >= L2CAP_CONF_OPT_SIZE) {
3683 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3684
Mat Martineauc20f8e32012-07-10 05:47:07 -07003685 switch (type) {
3686 case L2CAP_CONF_RFC:
3687 if (olen == sizeof(rfc))
3688 memcpy(&rfc, (void *)val, olen);
Szymon Janc8f321f82012-06-08 11:33:33 +02003689 break;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003690 case L2CAP_CONF_EWS:
3691 txwin_ext = val;
3692 break;
3693 }
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003694 }
3695
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003696 switch (rfc.mode) {
3697 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003698 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3699 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003700 chan->mps = le16_to_cpu(rfc.max_pdu_size);
3701 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3702 chan->ack_win = min_t(u16, chan->ack_win, txwin_ext);
3703 else
3704 chan->ack_win = min_t(u16, chan->ack_win,
3705 rfc.txwin_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003706 break;
3707 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003708 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003709 }
3710}
3711
Gustavo Padovan2d792812012-10-06 10:07:01 +01003712static inline int l2cap_command_rej(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003713 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3714 u8 *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003715{
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003716 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003717
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003718 if (cmd_len < sizeof(*rej))
3719 return -EPROTO;
3720
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003721 if (rej->reason != L2CAP_REJ_NOT_UNDERSTOOD)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003722 return 0;
3723
3724 if ((conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003725 cmd->ident == conn->info_ident) {
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02003726 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann984947d2009-02-06 23:35:19 +01003727
3728 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01003729 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01003730
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003731 l2cap_conn_start(conn);
3732 }
3733
3734 return 0;
3735}
3736
Mat Martineau17009152012-10-23 15:24:07 -07003737static struct l2cap_chan *l2cap_connect(struct l2cap_conn *conn,
3738 struct l2cap_cmd_hdr *cmd,
3739 u8 *data, u8 rsp_code, u8 amp_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003740{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003741 struct l2cap_conn_req *req = (struct l2cap_conn_req *) data;
3742 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003743 struct l2cap_chan *chan = NULL, *pchan;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003744 int result, status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003745
3746 u16 dcid = 0, scid = __le16_to_cpu(req->scid);
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003747 __le16 psm = req->psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003748
Andrei Emeltchenko097db762012-03-09 14:16:17 +02003749 BT_DBG("psm 0x%2.2x scid 0x%4.4x", __le16_to_cpu(psm), scid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003750
3751 /* Check if we have socket listening on psm */
Marcel Holtmann6f59b902013-10-13 05:24:01 -07003752 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03003753 &conn->hcon->dst, ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003754 if (!pchan) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003755 result = L2CAP_CR_BAD_PSM;
3756 goto sendresp;
3757 }
3758
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003759 mutex_lock(&conn->chan_lock);
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003760 l2cap_chan_lock(pchan);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00003761
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003762 /* Check if the ACL is secure enough (if not SDP) */
Andrei Emeltchenko2983fd62012-05-24 15:42:50 +03003763 if (psm != __constant_cpu_to_le16(L2CAP_PSM_SDP) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003764 !hci_conn_check_link_mode(conn->hcon)) {
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02003765 conn->disc_reason = HCI_ERROR_AUTH_FAILURE;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003766 result = L2CAP_CR_SEC_BLOCK;
3767 goto response;
3768 }
3769
Linus Torvalds1da177e2005-04-16 15:20:36 -07003770 result = L2CAP_CR_NO_MEM;
3771
Gustavo Padovan2dfa1002012-05-27 22:27:58 -03003772 /* Check if we already have channel with that dcid */
3773 if (__l2cap_get_chan_by_dcid(conn, scid))
3774 goto response;
3775
Gustavo Padovan80b98022012-05-27 22:27:51 -03003776 chan = pchan->ops->new_connection(pchan);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03003777 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003778 goto response;
3779
Syam Sidhardhan330b6c12013-08-06 01:59:12 +09003780 /* For certain devices (ex: HID mouse), support for authentication,
3781 * pairing and bonding is optional. For such devices, inorder to avoid
3782 * the ACL alive for too long after L2CAP disconnection, reset the ACL
3783 * disc_timeout back to HCI_DISCONN_TIMEOUT during L2CAP connect.
3784 */
3785 conn->hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
3786
Marcel Holtmann7eafc592013-10-13 08:12:47 -07003787 bacpy(&chan->src, &conn->hcon->src);
3788 bacpy(&chan->dst, &conn->hcon->dst);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -07003789 chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type);
3790 chan->dst_type = bdaddr_type(conn->hcon, conn->hcon->dst_type);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003791 chan->psm = psm;
3792 chan->dcid = scid;
Mat Martineau17009152012-10-23 15:24:07 -07003793 chan->local_amp_id = amp_id;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003794
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003795 __l2cap_chan_add(conn, chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003796
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003797 dcid = chan->scid;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003798
Gustavo Padovan8d836d72013-10-15 19:24:47 -03003799 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003800
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003801 chan->ident = cmd->ident;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003802
Marcel Holtmann984947d2009-02-06 23:35:19 +01003803 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) {
Gustavo F. Padovand45fc422011-11-05 19:54:24 -02003804 if (l2cap_chan_check_security(chan)) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07003805 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003806 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003807 result = L2CAP_CR_PEND;
3808 status = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08003809 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003810 } else {
Mat Martineau17009152012-10-23 15:24:07 -07003811 /* Force pending result for AMP controllers.
3812 * The connection will succeed after the
3813 * physical link is up.
3814 */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003815 if (amp_id == AMP_ID_BREDR) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003816 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau17009152012-10-23 15:24:07 -07003817 result = L2CAP_CR_SUCCESS;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003818 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003819 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003820 result = L2CAP_CR_PEND;
Mat Martineau17009152012-10-23 15:24:07 -07003821 }
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003822 status = L2CAP_CS_NO_INFO;
3823 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003824 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003825 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003826 result = L2CAP_CR_PEND;
3827 status = L2CAP_CS_AUTHEN_PEND;
3828 }
3829 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003830 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003831 result = L2CAP_CR_PEND;
3832 status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003833 }
3834
Linus Torvalds1da177e2005-04-16 15:20:36 -07003835response:
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003836 l2cap_chan_unlock(pchan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003837 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003838
3839sendresp:
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003840 rsp.scid = cpu_to_le16(scid);
3841 rsp.dcid = cpu_to_le16(dcid);
3842 rsp.result = cpu_to_le16(result);
3843 rsp.status = cpu_to_le16(status);
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003844 l2cap_send_cmd(conn, cmd->ident, rsp_code, sizeof(rsp), &rsp);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003845
3846 if (result == L2CAP_CR_PEND && status == L2CAP_CS_NO_INFO) {
3847 struct l2cap_info_req info;
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03003848 info.type = __constant_cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003849
3850 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
3851 conn->info_ident = l2cap_get_ident(conn);
3852
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08003853 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003854
Gustavo Padovan2d792812012-10-06 10:07:01 +01003855 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
3856 sizeof(info), &info);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003857 }
3858
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003859 if (chan && !test_bit(CONF_REQ_SENT, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003860 result == L2CAP_CR_SUCCESS) {
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003861 u8 buf[128];
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003862 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003863 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003864 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003865 chan->num_conf_req++;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003866 }
Mat Martineau17009152012-10-23 15:24:07 -07003867
3868 return chan;
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003869}
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003870
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003871static int l2cap_connect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003872 struct l2cap_cmd_hdr *cmd, u16 cmd_len, u8 *data)
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003873{
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303874 struct hci_dev *hdev = conn->hcon->hdev;
3875 struct hci_conn *hcon = conn->hcon;
3876
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003877 if (cmd_len < sizeof(struct l2cap_conn_req))
3878 return -EPROTO;
3879
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303880 hci_dev_lock(hdev);
3881 if (test_bit(HCI_MGMT, &hdev->dev_flags) &&
3882 !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &hcon->flags))
3883 mgmt_device_connected(hdev, &hcon->dst, hcon->type,
3884 hcon->dst_type, 0, NULL, 0,
3885 hcon->dev_class);
3886 hci_dev_unlock(hdev);
3887
Gustavo Padovan300229f2012-10-12 19:40:40 +08003888 l2cap_connect(conn, cmd, data, L2CAP_CONN_RSP, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003889 return 0;
3890}
3891
Mat Martineau5909cf32012-10-23 15:24:08 -07003892static int l2cap_connect_create_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003893 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3894 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003895{
3896 struct l2cap_conn_rsp *rsp = (struct l2cap_conn_rsp *) data;
3897 u16 scid, dcid, result, status;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003898 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003899 u8 req[128];
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003900 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003901
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003902 if (cmd_len < sizeof(*rsp))
3903 return -EPROTO;
3904
Linus Torvalds1da177e2005-04-16 15:20:36 -07003905 scid = __le16_to_cpu(rsp->scid);
3906 dcid = __le16_to_cpu(rsp->dcid);
3907 result = __le16_to_cpu(rsp->result);
3908 status = __le16_to_cpu(rsp->status);
3909
Andrei Emeltchenko1b009c92012-02-21 12:54:54 +02003910 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 +01003911 dcid, scid, result, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003912
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003913 mutex_lock(&conn->chan_lock);
3914
Linus Torvalds1da177e2005-04-16 15:20:36 -07003915 if (scid) {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003916 chan = __l2cap_get_chan_by_scid(conn, scid);
3917 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003918 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003919 goto unlock;
3920 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003921 } else {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003922 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
3923 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003924 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003925 goto unlock;
3926 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003927 }
3928
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003929 err = 0;
3930
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003931 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003932
Linus Torvalds1da177e2005-04-16 15:20:36 -07003933 switch (result) {
3934 case L2CAP_CR_SUCCESS:
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03003935 l2cap_state_change(chan, BT_CONFIG);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003936 chan->ident = 0;
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003937 chan->dcid = dcid;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003938 clear_bit(CONF_CONNECT_PEND, &chan->conf_state);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01003939
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003940 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003941 break;
3942
Linus Torvalds1da177e2005-04-16 15:20:36 -07003943 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003944 l2cap_build_conf_req(chan, req), req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003945 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003946 break;
3947
3948 case L2CAP_CR_PEND:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003949 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003950 break;
3951
3952 default:
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003953 l2cap_chan_del(chan, ECONNREFUSED);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003954 break;
3955 }
3956
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003957 l2cap_chan_unlock(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003958
3959unlock:
3960 mutex_unlock(&conn->chan_lock);
3961
3962 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003963}
3964
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003965static inline void set_default_fcs(struct l2cap_chan *chan)
Mat Martineau8c462b62010-08-24 15:35:42 -07003966{
3967 /* FCS is enabled only in ERTM or streaming mode, if one or both
3968 * sides request it.
3969 */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003970 if (chan->mode != L2CAP_MODE_ERTM && chan->mode != L2CAP_MODE_STREAMING)
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003971 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003972 else if (!test_bit(CONF_RECV_NO_FCS, &chan->conf_state))
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003973 chan->fcs = L2CAP_FCS_CRC16;
Mat Martineau8c462b62010-08-24 15:35:42 -07003974}
3975
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03003976static void l2cap_send_efs_conf_rsp(struct l2cap_chan *chan, void *data,
3977 u8 ident, u16 flags)
3978{
3979 struct l2cap_conn *conn = chan->conn;
3980
3981 BT_DBG("conn %p chan %p ident %d flags 0x%4.4x", conn, chan, ident,
3982 flags);
3983
3984 clear_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
3985 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
3986
3987 l2cap_send_cmd(conn, ident, L2CAP_CONF_RSP,
3988 l2cap_build_conf_rsp(chan, data,
3989 L2CAP_CONF_SUCCESS, flags), data);
3990}
3991
Johan Hedberg662d6522013-10-16 11:20:47 +03003992static void cmd_reject_invalid_cid(struct l2cap_conn *conn, u8 ident,
3993 u16 scid, u16 dcid)
3994{
3995 struct l2cap_cmd_rej_cid rej;
3996
3997 rej.reason = __constant_cpu_to_le16(L2CAP_REJ_INVALID_CID);
3998 rej.scid = __cpu_to_le16(scid);
3999 rej.dcid = __cpu_to_le16(dcid);
4000
4001 l2cap_send_cmd(conn, ident, L2CAP_COMMAND_REJ, sizeof(rej), &rej);
4002}
4003
Gustavo Padovan2d792812012-10-06 10:07:01 +01004004static inline int l2cap_config_req(struct l2cap_conn *conn,
4005 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4006 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004007{
4008 struct l2cap_conf_req *req = (struct l2cap_conf_req *) data;
4009 u16 dcid, flags;
4010 u8 rsp[64];
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004011 struct l2cap_chan *chan;
Mat Martineau3c588192012-04-11 10:48:42 -07004012 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004013
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004014 if (cmd_len < sizeof(*req))
4015 return -EPROTO;
4016
Linus Torvalds1da177e2005-04-16 15:20:36 -07004017 dcid = __le16_to_cpu(req->dcid);
4018 flags = __le16_to_cpu(req->flags);
4019
4020 BT_DBG("dcid 0x%4.4x flags 0x%2.2x", dcid, flags);
4021
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004022 chan = l2cap_get_chan_by_scid(conn, dcid);
Johan Hedberg662d6522013-10-16 11:20:47 +03004023 if (!chan) {
4024 cmd_reject_invalid_cid(conn, cmd->ident, dcid, 0);
4025 return 0;
4026 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004027
David S. Miller033b1142011-07-21 13:38:42 -07004028 if (chan->state != BT_CONFIG && chan->state != BT_CONNECT2) {
Johan Hedberg662d6522013-10-16 11:20:47 +03004029 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4030 chan->dcid);
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004031 goto unlock;
Gustavo F. Padovandf6bd742010-06-14 02:26:15 -03004032 }
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004033
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004034 /* Reject if config buffer is too small. */
Al Viro88219a02007-07-29 00:17:25 -07004035 len = cmd_len - sizeof(*req);
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004036 if (chan->conf_len + len > sizeof(chan->conf_req)) {
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004037 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004038 l2cap_build_conf_rsp(chan, rsp,
4039 L2CAP_CONF_REJECT, flags), rsp);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004040 goto unlock;
4041 }
4042
4043 /* Store config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004044 memcpy(chan->conf_req + chan->conf_len, req->data, len);
4045 chan->conf_len += len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004046
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004047 if (flags & L2CAP_CONF_FLAG_CONTINUATION) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004048 /* Incomplete config. Send empty response. */
4049 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004050 l2cap_build_conf_rsp(chan, rsp,
4051 L2CAP_CONF_SUCCESS, flags), rsp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004052 goto unlock;
4053 }
4054
4055 /* Complete config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004056 len = l2cap_parse_conf_req(chan, rsp);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004057 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004058 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004059 goto unlock;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004060 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004061
Mat Martineau1500109b2012-10-23 15:24:15 -07004062 chan->ident = cmd->ident;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004063 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004064 chan->num_conf_rsp++;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004065
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004066 /* Reset config buffer. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004067 chan->conf_len = 0;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004068
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004069 if (!test_bit(CONF_OUTPUT_DONE, &chan->conf_state))
Marcel Holtmann876d9482007-10-20 13:35:42 +02004070 goto unlock;
4071
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004072 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004073 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004074
Mat Martineau105bdf92012-04-27 16:50:48 -07004075 if (chan->mode == L2CAP_MODE_ERTM ||
4076 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004077 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004078
Mat Martineau3c588192012-04-11 10:48:42 -07004079 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004080 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004081 else
4082 l2cap_chan_ready(chan);
4083
Marcel Holtmann876d9482007-10-20 13:35:42 +02004084 goto unlock;
4085 }
4086
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004087 if (!test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02004088 u8 buf[64];
Linus Torvalds1da177e2005-04-16 15:20:36 -07004089 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004090 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004091 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004092 }
4093
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004094 /* Got Conf Rsp PENDING from remote side and asume we sent
4095 Conf Rsp PENDING in the code above */
4096 if (test_bit(CONF_REM_CONF_PEND, &chan->conf_state) &&
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03004097 test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004098
4099 /* check compatibility */
4100
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004101 /* Send rsp for BR/EDR channel */
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004102 if (!chan->hs_hcon)
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004103 l2cap_send_efs_conf_rsp(chan, rsp, cmd->ident, flags);
4104 else
4105 chan->ident = cmd->ident;
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004106 }
4107
Linus Torvalds1da177e2005-04-16 15:20:36 -07004108unlock:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004109 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004110 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004111}
4112
Gustavo Padovan2d792812012-10-06 10:07:01 +01004113static inline int l2cap_config_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004114 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4115 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004116{
4117 struct l2cap_conf_rsp *rsp = (struct l2cap_conf_rsp *)data;
4118 u16 scid, flags, result;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004119 struct l2cap_chan *chan;
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004120 int len = cmd_len - sizeof(*rsp);
Mat Martineau3c588192012-04-11 10:48:42 -07004121 int err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004122
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004123 if (cmd_len < sizeof(*rsp))
4124 return -EPROTO;
4125
Linus Torvalds1da177e2005-04-16 15:20:36 -07004126 scid = __le16_to_cpu(rsp->scid);
4127 flags = __le16_to_cpu(rsp->flags);
4128 result = __le16_to_cpu(rsp->result);
4129
Andrei Emeltchenko61386cb2012-03-12 12:13:07 +02004130 BT_DBG("scid 0x%4.4x flags 0x%2.2x result 0x%2.2x len %d", scid, flags,
4131 result, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004132
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004133 chan = l2cap_get_chan_by_scid(conn, scid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004134 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004135 return 0;
4136
4137 switch (result) {
4138 case L2CAP_CONF_SUCCESS:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004139 l2cap_conf_rfc_get(chan, rsp->data, len);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004140 clear_bit(CONF_REM_CONF_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004141 break;
4142
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004143 case L2CAP_CONF_PENDING:
4144 set_bit(CONF_REM_CONF_PEND, &chan->conf_state);
4145
4146 if (test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
4147 char buf[64];
4148
4149 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004150 buf, &result);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004151 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004152 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004153 goto done;
4154 }
4155
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004156 if (!chan->hs_hcon) {
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004157 l2cap_send_efs_conf_rsp(chan, buf, cmd->ident,
4158 0);
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02004159 } else {
4160 if (l2cap_check_efs(chan)) {
4161 amp_create_logical_link(chan);
4162 chan->ident = cmd->ident;
4163 }
4164 }
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004165 }
4166 goto done;
4167
Linus Torvalds1da177e2005-04-16 15:20:36 -07004168 case L2CAP_CONF_UNACCEPT:
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004169 if (chan->num_conf_rsp <= L2CAP_CONF_MAX_CONF_RSP) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004170 char req[64];
4171
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004172 if (len > sizeof(req) - sizeof(struct l2cap_conf_req)) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004173 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004174 goto done;
4175 }
4176
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004177 /* throw out any old stored conf requests */
4178 result = L2CAP_CONF_SUCCESS;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03004179 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004180 req, &result);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004181 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004182 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004183 goto done;
4184 }
4185
4186 l2cap_send_cmd(conn, l2cap_get_ident(conn),
Gustavo Padovan2d792812012-10-06 10:07:01 +01004187 L2CAP_CONF_REQ, len, req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004188 chan->num_conf_req++;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004189 if (result != L2CAP_CONF_SUCCESS)
4190 goto done;
4191 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004192 }
4193
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09004194 default:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004195 l2cap_chan_set_err(chan, ECONNRESET);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +02004196
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08004197 __set_chan_timer(chan, L2CAP_DISC_REJ_TIMEOUT);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004198 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004199 goto done;
4200 }
4201
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004202 if (flags & L2CAP_CONF_FLAG_CONTINUATION)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004203 goto done;
4204
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004205 set_bit(CONF_INPUT_DONE, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004206
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004207 if (test_bit(CONF_OUTPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004208 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004209
Mat Martineau105bdf92012-04-27 16:50:48 -07004210 if (chan->mode == L2CAP_MODE_ERTM ||
4211 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004212 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004213
Mat Martineau3c588192012-04-11 10:48:42 -07004214 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004215 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004216 else
4217 l2cap_chan_ready(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004218 }
4219
4220done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004221 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004222 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004223}
4224
Gustavo Padovan2d792812012-10-06 10:07:01 +01004225static inline int l2cap_disconnect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004226 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4227 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004228{
4229 struct l2cap_disconn_req *req = (struct l2cap_disconn_req *) data;
4230 struct l2cap_disconn_rsp rsp;
4231 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004232 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004233
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004234 if (cmd_len != sizeof(*req))
4235 return -EPROTO;
4236
Linus Torvalds1da177e2005-04-16 15:20:36 -07004237 scid = __le16_to_cpu(req->scid);
4238 dcid = __le16_to_cpu(req->dcid);
4239
4240 BT_DBG("scid 0x%4.4x dcid 0x%4.4x", scid, dcid);
4241
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004242 mutex_lock(&conn->chan_lock);
4243
4244 chan = __l2cap_get_chan_by_scid(conn, dcid);
4245 if (!chan) {
4246 mutex_unlock(&conn->chan_lock);
Johan Hedberg662d6522013-10-16 11:20:47 +03004247 cmd_reject_invalid_cid(conn, cmd->ident, dcid, scid);
4248 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004249 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004250
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004251 l2cap_chan_lock(chan);
4252
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03004253 rsp.dcid = cpu_to_le16(chan->scid);
4254 rsp.scid = cpu_to_le16(chan->dcid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004255 l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp);
4256
Gustavo Padovan5ec1bbe2013-10-15 19:24:48 -03004257 chan->ops->set_shutdown(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004258
Mat Martineau61d6ef32012-04-27 16:50:50 -07004259 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004260 l2cap_chan_del(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004261
4262 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004263
Gustavo Padovan80b98022012-05-27 22:27:51 -03004264 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004265 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004266
4267 mutex_unlock(&conn->chan_lock);
4268
Linus Torvalds1da177e2005-04-16 15:20:36 -07004269 return 0;
4270}
4271
Gustavo Padovan2d792812012-10-06 10:07:01 +01004272static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004273 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4274 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004275{
4276 struct l2cap_disconn_rsp *rsp = (struct l2cap_disconn_rsp *) data;
4277 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004278 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004279
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004280 if (cmd_len != sizeof(*rsp))
4281 return -EPROTO;
4282
Linus Torvalds1da177e2005-04-16 15:20:36 -07004283 scid = __le16_to_cpu(rsp->scid);
4284 dcid = __le16_to_cpu(rsp->dcid);
4285
4286 BT_DBG("dcid 0x%4.4x scid 0x%4.4x", dcid, scid);
4287
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004288 mutex_lock(&conn->chan_lock);
4289
4290 chan = __l2cap_get_chan_by_scid(conn, scid);
4291 if (!chan) {
4292 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004293 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004294 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004295
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004296 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004297
Mat Martineau61d6ef32012-04-27 16:50:50 -07004298 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004299 l2cap_chan_del(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004300
4301 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004302
Gustavo Padovan80b98022012-05-27 22:27:51 -03004303 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004304 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004305
4306 mutex_unlock(&conn->chan_lock);
4307
Linus Torvalds1da177e2005-04-16 15:20:36 -07004308 return 0;
4309}
4310
Gustavo Padovan2d792812012-10-06 10:07:01 +01004311static inline int l2cap_information_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004312 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4313 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004314{
4315 struct l2cap_info_req *req = (struct l2cap_info_req *) data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004316 u16 type;
4317
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004318 if (cmd_len != sizeof(*req))
4319 return -EPROTO;
4320
Linus Torvalds1da177e2005-04-16 15:20:36 -07004321 type = __le16_to_cpu(req->type);
4322
4323 BT_DBG("type 0x%4.4x", type);
4324
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004325 if (type == L2CAP_IT_FEAT_MASK) {
4326 u8 buf[8];
Marcel Holtmann44dd46d2009-05-02 19:09:01 -07004327 u32 feat_mask = l2cap_feat_mask;
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004328 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03004329 rsp->type = __constant_cpu_to_le16(L2CAP_IT_FEAT_MASK);
4330 rsp->result = __constant_cpu_to_le16(L2CAP_IR_SUCCESS);
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03004331 if (!disable_ertm)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004332 feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING
Gustavo Padovan2d792812012-10-06 10:07:01 +01004333 | L2CAP_FEAT_FCS;
Marcel Holtmann848566b2013-10-01 22:59:22 -07004334 if (conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03004335 feat_mask |= L2CAP_FEAT_EXT_FLOW
Gustavo Padovan2d792812012-10-06 10:07:01 +01004336 | L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenkoa5fd6f32011-09-16 16:26:32 +03004337
Gustavo F. Padovan1b7bf4e2009-08-24 00:45:20 -03004338 put_unaligned_le32(feat_mask, rsp->data);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004339 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4340 buf);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004341 } else if (type == L2CAP_IT_FIXED_CHAN) {
4342 u8 buf[12];
4343 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Mat Martineau50a147c2011-11-02 16:18:34 -07004344
Marcel Holtmann848566b2013-10-01 22:59:22 -07004345 if (conn->hs_enabled)
Mat Martineau50a147c2011-11-02 16:18:34 -07004346 l2cap_fixed_chan[0] |= L2CAP_FC_A2MP;
4347 else
4348 l2cap_fixed_chan[0] &= ~L2CAP_FC_A2MP;
4349
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03004350 rsp->type = __constant_cpu_to_le16(L2CAP_IT_FIXED_CHAN);
4351 rsp->result = __constant_cpu_to_le16(L2CAP_IR_SUCCESS);
Andrei Emeltchenkoc6337ea2011-10-20 17:02:44 +03004352 memcpy(rsp->data, l2cap_fixed_chan, sizeof(l2cap_fixed_chan));
Gustavo Padovan2d792812012-10-06 10:07:01 +01004353 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4354 buf);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004355 } else {
4356 struct l2cap_info_rsp rsp;
4357 rsp.type = cpu_to_le16(type);
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03004358 rsp.result = __constant_cpu_to_le16(L2CAP_IR_NOTSUPP);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004359 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(rsp),
4360 &rsp);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004361 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004362
4363 return 0;
4364}
4365
Gustavo Padovan2d792812012-10-06 10:07:01 +01004366static inline int l2cap_information_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004367 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4368 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004369{
4370 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) data;
4371 u16 type, result;
4372
Jaganath Kanakkassery3f6fa3d2013-06-21 19:55:11 +05304373 if (cmd_len < sizeof(*rsp))
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004374 return -EPROTO;
4375
Linus Torvalds1da177e2005-04-16 15:20:36 -07004376 type = __le16_to_cpu(rsp->type);
4377 result = __le16_to_cpu(rsp->result);
4378
4379 BT_DBG("type 0x%4.4x result 0x%2.2x", type, result);
4380
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004381 /* L2CAP Info req/rsp are unbound to channels, add extra checks */
4382 if (cmd->ident != conn->info_ident ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01004383 conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004384 return 0;
4385
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02004386 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004387
Ville Tervoadb08ed2010-08-04 09:43:33 +03004388 if (result != L2CAP_IR_SUCCESS) {
4389 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4390 conn->info_ident = 0;
4391
4392 l2cap_conn_start(conn);
4393
4394 return 0;
4395 }
4396
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004397 switch (type) {
4398 case L2CAP_IT_FEAT_MASK:
Harvey Harrison83985312008-05-02 16:25:46 -07004399 conn->feat_mask = get_unaligned_le32(rsp->data);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004400
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07004401 if (conn->feat_mask & L2CAP_FEAT_FIXED_CHAN) {
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004402 struct l2cap_info_req req;
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03004403 req.type = __constant_cpu_to_le16(L2CAP_IT_FIXED_CHAN);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004404
4405 conn->info_ident = l2cap_get_ident(conn);
4406
4407 l2cap_send_cmd(conn, conn->info_ident,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004408 L2CAP_INFO_REQ, sizeof(req), &req);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004409 } else {
4410 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4411 conn->info_ident = 0;
4412
4413 l2cap_conn_start(conn);
4414 }
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004415 break;
4416
4417 case L2CAP_IT_FIXED_CHAN:
4418 conn->fixed_chan_mask = rsp->data[0];
Marcel Holtmann984947d2009-02-06 23:35:19 +01004419 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004420 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004421
4422 l2cap_conn_start(conn);
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004423 break;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004424 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004425
Linus Torvalds1da177e2005-04-16 15:20:36 -07004426 return 0;
4427}
4428
Mat Martineau17009152012-10-23 15:24:07 -07004429static int l2cap_create_channel_req(struct l2cap_conn *conn,
4430 struct l2cap_cmd_hdr *cmd,
4431 u16 cmd_len, void *data)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004432{
4433 struct l2cap_create_chan_req *req = data;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004434 struct l2cap_create_chan_rsp rsp;
Mat Martineau17009152012-10-23 15:24:07 -07004435 struct l2cap_chan *chan;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004436 struct hci_dev *hdev;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004437 u16 psm, scid;
4438
4439 if (cmd_len != sizeof(*req))
4440 return -EPROTO;
4441
Marcel Holtmann848566b2013-10-01 22:59:22 -07004442 if (!conn->hs_enabled)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004443 return -EINVAL;
4444
4445 psm = le16_to_cpu(req->psm);
4446 scid = le16_to_cpu(req->scid);
4447
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004448 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 -07004449
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004450 /* For controller id 0 make BR/EDR connection */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004451 if (req->amp_id == AMP_ID_BREDR) {
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004452 l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4453 req->amp_id);
4454 return 0;
4455 }
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004456
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004457 /* Validate AMP controller id */
4458 hdev = hci_dev_get(req->amp_id);
4459 if (!hdev)
4460 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004461
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004462 if (hdev->dev_type != HCI_AMP || !test_bit(HCI_UP, &hdev->flags)) {
Mat Martineau17009152012-10-23 15:24:07 -07004463 hci_dev_put(hdev);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004464 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004465 }
4466
4467 chan = l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4468 req->amp_id);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004469 if (chan) {
4470 struct amp_mgr *mgr = conn->hcon->amp_mgr;
4471 struct hci_conn *hs_hcon;
4472
Marcel Holtmann98e0f7e2013-10-13 02:23:40 -07004473 hs_hcon = hci_conn_hash_lookup_ba(hdev, AMP_LINK,
4474 &conn->hcon->dst);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004475 if (!hs_hcon) {
4476 hci_dev_put(hdev);
Johan Hedberg662d6522013-10-16 11:20:47 +03004477 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4478 chan->dcid);
4479 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004480 }
4481
4482 BT_DBG("mgr %p bredr_chan %p hs_hcon %p", mgr, chan, hs_hcon);
4483
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004484 mgr->bredr_chan = chan;
4485 chan->hs_hcon = hs_hcon;
Andrei Emeltchenkofd45bf42012-11-20 17:16:22 +02004486 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004487 conn->mtu = hdev->block_mtu;
4488 }
4489
4490 hci_dev_put(hdev);
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004491
4492 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004493
4494error:
4495 rsp.dcid = 0;
4496 rsp.scid = cpu_to_le16(scid);
4497 rsp.result = __constant_cpu_to_le16(L2CAP_CR_BAD_AMP);
4498 rsp.status = __constant_cpu_to_le16(L2CAP_CS_NO_INFO);
4499
4500 l2cap_send_cmd(conn, cmd->ident, L2CAP_CREATE_CHAN_RSP,
4501 sizeof(rsp), &rsp);
4502
Johan Hedbergdc280802013-09-16 13:05:13 +03004503 return 0;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004504}
4505
Mat Martineau8eb200b2012-10-23 15:24:17 -07004506static void l2cap_send_move_chan_req(struct l2cap_chan *chan, u8 dest_amp_id)
4507{
4508 struct l2cap_move_chan_req req;
4509 u8 ident;
4510
4511 BT_DBG("chan %p, dest_amp_id %d", chan, dest_amp_id);
4512
4513 ident = l2cap_get_ident(chan->conn);
4514 chan->ident = ident;
4515
4516 req.icid = cpu_to_le16(chan->scid);
4517 req.dest_amp_id = dest_amp_id;
4518
4519 l2cap_send_cmd(chan->conn, ident, L2CAP_MOVE_CHAN_REQ, sizeof(req),
4520 &req);
4521
4522 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4523}
4524
Mat Martineau1500109b2012-10-23 15:24:15 -07004525static void l2cap_send_move_chan_rsp(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004526{
4527 struct l2cap_move_chan_rsp rsp;
4528
Mat Martineau1500109b2012-10-23 15:24:15 -07004529 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004530
Mat Martineau1500109b2012-10-23 15:24:15 -07004531 rsp.icid = cpu_to_le16(chan->dcid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004532 rsp.result = cpu_to_le16(result);
4533
Mat Martineau1500109b2012-10-23 15:24:15 -07004534 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_RSP,
4535 sizeof(rsp), &rsp);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004536}
4537
Mat Martineau5b155ef2012-10-23 15:24:14 -07004538static void l2cap_send_move_chan_cfm(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004539{
4540 struct l2cap_move_chan_cfm cfm;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004541
Mat Martineau5b155ef2012-10-23 15:24:14 -07004542 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004543
Mat Martineau5b155ef2012-10-23 15:24:14 -07004544 chan->ident = l2cap_get_ident(chan->conn);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004545
Mat Martineau5b155ef2012-10-23 15:24:14 -07004546 cfm.icid = cpu_to_le16(chan->scid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004547 cfm.result = cpu_to_le16(result);
4548
Mat Martineau5b155ef2012-10-23 15:24:14 -07004549 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_CFM,
4550 sizeof(cfm), &cfm);
4551
4552 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4553}
4554
4555static void l2cap_send_move_chan_cfm_icid(struct l2cap_conn *conn, u16 icid)
4556{
4557 struct l2cap_move_chan_cfm cfm;
4558
4559 BT_DBG("conn %p, icid 0x%4.4x", conn, icid);
4560
4561 cfm.icid = cpu_to_le16(icid);
4562 cfm.result = __constant_cpu_to_le16(L2CAP_MC_UNCONFIRMED);
4563
4564 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_MOVE_CHAN_CFM,
4565 sizeof(cfm), &cfm);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004566}
4567
4568static void l2cap_send_move_chan_cfm_rsp(struct l2cap_conn *conn, u8 ident,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004569 u16 icid)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004570{
4571 struct l2cap_move_chan_cfm_rsp rsp;
4572
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004573 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004574
4575 rsp.icid = cpu_to_le16(icid);
4576 l2cap_send_cmd(conn, ident, L2CAP_MOVE_CHAN_CFM_RSP, sizeof(rsp), &rsp);
4577}
4578
Mat Martineau5f3847a2012-10-23 15:24:12 -07004579static void __release_logical_link(struct l2cap_chan *chan)
4580{
4581 chan->hs_hchan = NULL;
4582 chan->hs_hcon = NULL;
4583
4584 /* Placeholder - release the logical link */
4585}
4586
Mat Martineau1500109b2012-10-23 15:24:15 -07004587static void l2cap_logical_fail(struct l2cap_chan *chan)
4588{
4589 /* Logical link setup failed */
4590 if (chan->state != BT_CONNECTED) {
4591 /* Create channel failure, disconnect */
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004592 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineau1500109b2012-10-23 15:24:15 -07004593 return;
4594 }
4595
4596 switch (chan->move_role) {
4597 case L2CAP_MOVE_ROLE_RESPONDER:
4598 l2cap_move_done(chan);
4599 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_SUPP);
4600 break;
4601 case L2CAP_MOVE_ROLE_INITIATOR:
4602 if (chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_COMP ||
4603 chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_CFM) {
4604 /* Remote has only sent pending or
4605 * success responses, clean up
4606 */
4607 l2cap_move_done(chan);
4608 }
4609
4610 /* Other amp move states imply that the move
4611 * has already aborted
4612 */
4613 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
4614 break;
4615 }
4616}
4617
4618static void l2cap_logical_finish_create(struct l2cap_chan *chan,
4619 struct hci_chan *hchan)
4620{
4621 struct l2cap_conf_rsp rsp;
Mat Martineau1500109b2012-10-23 15:24:15 -07004622
Andrei Emeltchenko336178a2012-10-31 15:46:27 +02004623 chan->hs_hchan = hchan;
Mat Martineau1500109b2012-10-23 15:24:15 -07004624 chan->hs_hcon->l2cap_data = chan->conn;
4625
Andrei Emeltchenko35ba9562012-10-25 15:20:43 +03004626 l2cap_send_efs_conf_rsp(chan, &rsp, chan->ident, 0);
Mat Martineau1500109b2012-10-23 15:24:15 -07004627
4628 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Andrei Emeltchenkofe79c6f2012-10-25 15:20:42 +03004629 int err;
Mat Martineau1500109b2012-10-23 15:24:15 -07004630
4631 set_default_fcs(chan);
4632
4633 err = l2cap_ertm_init(chan);
4634 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004635 l2cap_send_disconn_req(chan, -err);
Mat Martineau1500109b2012-10-23 15:24:15 -07004636 else
4637 l2cap_chan_ready(chan);
4638 }
4639}
4640
4641static void l2cap_logical_finish_move(struct l2cap_chan *chan,
4642 struct hci_chan *hchan)
4643{
4644 chan->hs_hcon = hchan->conn;
4645 chan->hs_hcon->l2cap_data = chan->conn;
4646
4647 BT_DBG("move_state %d", chan->move_state);
4648
4649 switch (chan->move_state) {
4650 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
4651 /* Move confirm will be sent after a success
4652 * response is received
4653 */
4654 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4655 break;
4656 case L2CAP_MOVE_WAIT_LOGICAL_CFM:
4657 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4658 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4659 } else if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
4660 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
4661 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
4662 } else if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4663 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4664 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4665 }
4666 break;
4667 default:
4668 /* Move was not in expected state, free the channel */
4669 __release_logical_link(chan);
4670
4671 chan->move_state = L2CAP_MOVE_STABLE;
4672 }
4673}
4674
4675/* Call with chan locked */
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004676void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan,
4677 u8 status)
Mat Martineau5b155ef2012-10-23 15:24:14 -07004678{
Mat Martineau1500109b2012-10-23 15:24:15 -07004679 BT_DBG("chan %p, hchan %p, status %d", chan, hchan, status);
4680
4681 if (status) {
4682 l2cap_logical_fail(chan);
4683 __release_logical_link(chan);
4684 return;
4685 }
4686
4687 if (chan->state != BT_CONNECTED) {
4688 /* Ignore logical link if channel is on BR/EDR */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004689 if (chan->local_amp_id != AMP_ID_BREDR)
Mat Martineau1500109b2012-10-23 15:24:15 -07004690 l2cap_logical_finish_create(chan, hchan);
4691 } else {
4692 l2cap_logical_finish_move(chan, hchan);
4693 }
Mat Martineau5b155ef2012-10-23 15:24:14 -07004694}
4695
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004696void l2cap_move_start(struct l2cap_chan *chan)
4697{
4698 BT_DBG("chan %p", chan);
4699
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004700 if (chan->local_amp_id == AMP_ID_BREDR) {
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004701 if (chan->chan_policy != BT_CHANNEL_POLICY_AMP_PREFERRED)
4702 return;
4703 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4704 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4705 /* Placeholder - start physical link setup */
4706 } else {
4707 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4708 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4709 chan->move_id = 0;
4710 l2cap_move_setup(chan);
4711 l2cap_send_move_chan_req(chan, 0);
4712 }
4713}
4714
Mat Martineau8eb200b2012-10-23 15:24:17 -07004715static void l2cap_do_create(struct l2cap_chan *chan, int result,
4716 u8 local_amp_id, u8 remote_amp_id)
4717{
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004718 BT_DBG("chan %p state %s %u -> %u", chan, state_to_string(chan->state),
4719 local_amp_id, remote_amp_id);
4720
Andrei Emeltchenko12d6cc62012-11-14 17:39:31 +02004721 chan->fcs = L2CAP_FCS_NONE;
4722
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004723 /* Outgoing channel on AMP */
4724 if (chan->state == BT_CONNECT) {
4725 if (result == L2CAP_CR_SUCCESS) {
4726 chan->local_amp_id = local_amp_id;
4727 l2cap_send_create_chan_req(chan, remote_amp_id);
4728 } else {
4729 /* Revert to BR/EDR connect */
4730 l2cap_send_conn_req(chan);
4731 }
4732
4733 return;
4734 }
4735
4736 /* Incoming channel on AMP */
4737 if (__l2cap_no_conn_pending(chan)) {
Mat Martineau8eb200b2012-10-23 15:24:17 -07004738 struct l2cap_conn_rsp rsp;
4739 char buf[128];
4740 rsp.scid = cpu_to_le16(chan->dcid);
4741 rsp.dcid = cpu_to_le16(chan->scid);
4742
Mat Martineau8eb200b2012-10-23 15:24:17 -07004743 if (result == L2CAP_CR_SUCCESS) {
4744 /* Send successful response */
Andrei Emeltchenko62cd50e2012-11-14 17:39:32 +02004745 rsp.result = __constant_cpu_to_le16(L2CAP_CR_SUCCESS);
4746 rsp.status = __constant_cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004747 } else {
4748 /* Send negative response */
Andrei Emeltchenko62cd50e2012-11-14 17:39:32 +02004749 rsp.result = __constant_cpu_to_le16(L2CAP_CR_NO_MEM);
4750 rsp.status = __constant_cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004751 }
4752
4753 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_RSP,
4754 sizeof(rsp), &rsp);
4755
4756 if (result == L2CAP_CR_SUCCESS) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02004757 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004758 set_bit(CONF_REQ_SENT, &chan->conf_state);
4759 l2cap_send_cmd(chan->conn, l2cap_get_ident(chan->conn),
4760 L2CAP_CONF_REQ,
4761 l2cap_build_conf_req(chan, buf), buf);
4762 chan->num_conf_req++;
4763 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004764 }
4765}
4766
4767static void l2cap_do_move_initiate(struct l2cap_chan *chan, u8 local_amp_id,
4768 u8 remote_amp_id)
4769{
4770 l2cap_move_setup(chan);
4771 chan->move_id = local_amp_id;
4772 chan->move_state = L2CAP_MOVE_WAIT_RSP;
4773
4774 l2cap_send_move_chan_req(chan, remote_amp_id);
4775}
4776
4777static void l2cap_do_move_respond(struct l2cap_chan *chan, int result)
4778{
4779 struct hci_chan *hchan = NULL;
4780
4781 /* Placeholder - get hci_chan for logical link */
4782
4783 if (hchan) {
4784 if (hchan->state == BT_CONNECTED) {
4785 /* Logical link is ready to go */
4786 chan->hs_hcon = hchan->conn;
4787 chan->hs_hcon->l2cap_data = chan->conn;
4788 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4789 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4790
4791 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
4792 } else {
4793 /* Wait for logical link to be ready */
4794 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4795 }
4796 } else {
4797 /* Logical link not available */
4798 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_ALLOWED);
4799 }
4800}
4801
4802static void l2cap_do_move_cancel(struct l2cap_chan *chan, int result)
4803{
4804 if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4805 u8 rsp_result;
4806 if (result == -EINVAL)
4807 rsp_result = L2CAP_MR_BAD_ID;
4808 else
4809 rsp_result = L2CAP_MR_NOT_ALLOWED;
4810
4811 l2cap_send_move_chan_rsp(chan, rsp_result);
4812 }
4813
4814 chan->move_role = L2CAP_MOVE_ROLE_NONE;
4815 chan->move_state = L2CAP_MOVE_STABLE;
4816
4817 /* Restart data transmission */
4818 l2cap_ertm_send(chan);
4819}
4820
Andrei Emeltchenkoa514b172012-11-14 17:39:30 +02004821/* Invoke with locked chan */
4822void __l2cap_physical_cfm(struct l2cap_chan *chan, int result)
Mat Martineau8eb200b2012-10-23 15:24:17 -07004823{
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004824 u8 local_amp_id = chan->local_amp_id;
Andrei Emeltchenkofffadc02012-11-01 15:37:03 +02004825 u8 remote_amp_id = chan->remote_amp_id;
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004826
Mat Martineau8eb200b2012-10-23 15:24:17 -07004827 BT_DBG("chan %p, result %d, local_amp_id %d, remote_amp_id %d",
4828 chan, result, local_amp_id, remote_amp_id);
4829
Mat Martineau8eb200b2012-10-23 15:24:17 -07004830 if (chan->state == BT_DISCONN || chan->state == BT_CLOSED) {
4831 l2cap_chan_unlock(chan);
4832 return;
4833 }
4834
4835 if (chan->state != BT_CONNECTED) {
4836 l2cap_do_create(chan, result, local_amp_id, remote_amp_id);
4837 } else if (result != L2CAP_MR_SUCCESS) {
4838 l2cap_do_move_cancel(chan, result);
4839 } else {
4840 switch (chan->move_role) {
4841 case L2CAP_MOVE_ROLE_INITIATOR:
4842 l2cap_do_move_initiate(chan, local_amp_id,
4843 remote_amp_id);
4844 break;
4845 case L2CAP_MOVE_ROLE_RESPONDER:
4846 l2cap_do_move_respond(chan, result);
4847 break;
4848 default:
4849 l2cap_do_move_cancel(chan, result);
4850 break;
4851 }
4852 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004853}
4854
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004855static inline int l2cap_move_channel_req(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004856 struct l2cap_cmd_hdr *cmd,
4857 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004858{
4859 struct l2cap_move_chan_req *req = data;
Mat Martineau1500109b2012-10-23 15:24:15 -07004860 struct l2cap_move_chan_rsp rsp;
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004861 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004862 u16 icid = 0;
4863 u16 result = L2CAP_MR_NOT_ALLOWED;
4864
4865 if (cmd_len != sizeof(*req))
4866 return -EPROTO;
4867
4868 icid = le16_to_cpu(req->icid);
4869
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004870 BT_DBG("icid 0x%4.4x, dest_amp_id %d", icid, req->dest_amp_id);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004871
Marcel Holtmann848566b2013-10-01 22:59:22 -07004872 if (!conn->hs_enabled)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004873 return -EINVAL;
4874
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004875 chan = l2cap_get_chan_by_dcid(conn, icid);
4876 if (!chan) {
Mat Martineau1500109b2012-10-23 15:24:15 -07004877 rsp.icid = cpu_to_le16(icid);
4878 rsp.result = __constant_cpu_to_le16(L2CAP_MR_NOT_ALLOWED);
4879 l2cap_send_cmd(conn, cmd->ident, L2CAP_MOVE_CHAN_RSP,
4880 sizeof(rsp), &rsp);
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004881 return 0;
4882 }
4883
Mat Martineau1500109b2012-10-23 15:24:15 -07004884 chan->ident = cmd->ident;
4885
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004886 if (chan->scid < L2CAP_CID_DYN_START ||
4887 chan->chan_policy == BT_CHANNEL_POLICY_BREDR_ONLY ||
4888 (chan->mode != L2CAP_MODE_ERTM &&
4889 chan->mode != L2CAP_MODE_STREAMING)) {
4890 result = L2CAP_MR_NOT_ALLOWED;
4891 goto send_move_response;
4892 }
4893
4894 if (chan->local_amp_id == req->dest_amp_id) {
4895 result = L2CAP_MR_SAME_ID;
4896 goto send_move_response;
4897 }
4898
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004899 if (req->dest_amp_id != AMP_ID_BREDR) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004900 struct hci_dev *hdev;
4901 hdev = hci_dev_get(req->dest_amp_id);
4902 if (!hdev || hdev->dev_type != HCI_AMP ||
4903 !test_bit(HCI_UP, &hdev->flags)) {
4904 if (hdev)
4905 hci_dev_put(hdev);
4906
4907 result = L2CAP_MR_BAD_ID;
4908 goto send_move_response;
4909 }
4910 hci_dev_put(hdev);
4911 }
4912
4913 /* Detect a move collision. Only send a collision response
4914 * if this side has "lost", otherwise proceed with the move.
4915 * The winner has the larger bd_addr.
4916 */
4917 if ((__chan_is_moving(chan) ||
4918 chan->move_role != L2CAP_MOVE_ROLE_NONE) &&
Marcel Holtmann6f59b902013-10-13 05:24:01 -07004919 bacmp(&conn->hcon->src, &conn->hcon->dst) > 0) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004920 result = L2CAP_MR_COLLISION;
4921 goto send_move_response;
4922 }
4923
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004924 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
4925 l2cap_move_setup(chan);
4926 chan->move_id = req->dest_amp_id;
4927 icid = chan->dcid;
4928
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004929 if (req->dest_amp_id == AMP_ID_BREDR) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004930 /* Moving to BR/EDR */
4931 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4932 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4933 result = L2CAP_MR_PEND;
4934 } else {
4935 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4936 result = L2CAP_MR_SUCCESS;
4937 }
4938 } else {
4939 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4940 /* Placeholder - uncomment when amp functions are available */
4941 /*amp_accept_physical(chan, req->dest_amp_id);*/
4942 result = L2CAP_MR_PEND;
4943 }
4944
4945send_move_response:
Mat Martineau1500109b2012-10-23 15:24:15 -07004946 l2cap_send_move_chan_rsp(chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004947
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004948 l2cap_chan_unlock(chan);
4949
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004950 return 0;
4951}
4952
Mat Martineau5b155ef2012-10-23 15:24:14 -07004953static void l2cap_move_continue(struct l2cap_conn *conn, u16 icid, u16 result)
4954{
4955 struct l2cap_chan *chan;
4956 struct hci_chan *hchan = NULL;
4957
4958 chan = l2cap_get_chan_by_scid(conn, icid);
4959 if (!chan) {
4960 l2cap_send_move_chan_cfm_icid(conn, icid);
4961 return;
4962 }
4963
4964 __clear_chan_timer(chan);
4965 if (result == L2CAP_MR_PEND)
4966 __set_chan_timer(chan, L2CAP_MOVE_ERTX_TIMEOUT);
4967
4968 switch (chan->move_state) {
4969 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
4970 /* Move confirm will be sent when logical link
4971 * is complete.
4972 */
4973 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4974 break;
4975 case L2CAP_MOVE_WAIT_RSP_SUCCESS:
4976 if (result == L2CAP_MR_PEND) {
4977 break;
4978 } else if (test_bit(CONN_LOCAL_BUSY,
4979 &chan->conn_state)) {
4980 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4981 } else {
4982 /* Logical link is up or moving to BR/EDR,
4983 * proceed with move
4984 */
4985 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
4986 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
4987 }
4988 break;
4989 case L2CAP_MOVE_WAIT_RSP:
4990 /* Moving to AMP */
4991 if (result == L2CAP_MR_SUCCESS) {
4992 /* Remote is ready, send confirm immediately
4993 * after logical link is ready
4994 */
4995 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4996 } else {
4997 /* Both logical link and move success
4998 * are required to confirm
4999 */
5000 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_COMP;
5001 }
5002
5003 /* Placeholder - get hci_chan for logical link */
5004 if (!hchan) {
5005 /* Logical link not available */
5006 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5007 break;
5008 }
5009
5010 /* If the logical link is not yet connected, do not
5011 * send confirmation.
5012 */
5013 if (hchan->state != BT_CONNECTED)
5014 break;
5015
5016 /* Logical link is already ready to go */
5017
5018 chan->hs_hcon = hchan->conn;
5019 chan->hs_hcon->l2cap_data = chan->conn;
5020
5021 if (result == L2CAP_MR_SUCCESS) {
5022 /* Can confirm now */
5023 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
5024 } else {
5025 /* Now only need move success
5026 * to confirm
5027 */
5028 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
5029 }
5030
5031 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
5032 break;
5033 default:
5034 /* Any other amp move state means the move failed. */
5035 chan->move_id = chan->local_amp_id;
5036 l2cap_move_done(chan);
5037 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5038 }
5039
5040 l2cap_chan_unlock(chan);
5041}
5042
5043static void l2cap_move_fail(struct l2cap_conn *conn, u8 ident, u16 icid,
5044 u16 result)
5045{
5046 struct l2cap_chan *chan;
5047
5048 chan = l2cap_get_chan_by_ident(conn, ident);
5049 if (!chan) {
5050 /* Could not locate channel, icid is best guess */
5051 l2cap_send_move_chan_cfm_icid(conn, icid);
5052 return;
5053 }
5054
5055 __clear_chan_timer(chan);
5056
5057 if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
5058 if (result == L2CAP_MR_COLLISION) {
5059 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
5060 } else {
5061 /* Cleanup - cancel move */
5062 chan->move_id = chan->local_amp_id;
5063 l2cap_move_done(chan);
5064 }
5065 }
5066
5067 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5068
5069 l2cap_chan_unlock(chan);
5070}
5071
5072static int l2cap_move_channel_rsp(struct l2cap_conn *conn,
5073 struct l2cap_cmd_hdr *cmd,
5074 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005075{
5076 struct l2cap_move_chan_rsp *rsp = data;
5077 u16 icid, result;
5078
5079 if (cmd_len != sizeof(*rsp))
5080 return -EPROTO;
5081
5082 icid = le16_to_cpu(rsp->icid);
5083 result = le16_to_cpu(rsp->result);
5084
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005085 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005086
Mat Martineau5b155ef2012-10-23 15:24:14 -07005087 if (result == L2CAP_MR_SUCCESS || result == L2CAP_MR_PEND)
5088 l2cap_move_continue(conn, icid, result);
5089 else
5090 l2cap_move_fail(conn, cmd->ident, icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005091
5092 return 0;
5093}
5094
Mat Martineau5f3847a2012-10-23 15:24:12 -07005095static int l2cap_move_channel_confirm(struct l2cap_conn *conn,
5096 struct l2cap_cmd_hdr *cmd,
5097 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005098{
5099 struct l2cap_move_chan_cfm *cfm = data;
Mat Martineau5f3847a2012-10-23 15:24:12 -07005100 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005101 u16 icid, result;
5102
5103 if (cmd_len != sizeof(*cfm))
5104 return -EPROTO;
5105
5106 icid = le16_to_cpu(cfm->icid);
5107 result = le16_to_cpu(cfm->result);
5108
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005109 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005110
Mat Martineau5f3847a2012-10-23 15:24:12 -07005111 chan = l2cap_get_chan_by_dcid(conn, icid);
5112 if (!chan) {
5113 /* Spec requires a response even if the icid was not found */
5114 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5115 return 0;
5116 }
5117
5118 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM) {
5119 if (result == L2CAP_MC_CONFIRMED) {
5120 chan->local_amp_id = chan->move_id;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005121 if (chan->local_amp_id == AMP_ID_BREDR)
Mat Martineau5f3847a2012-10-23 15:24:12 -07005122 __release_logical_link(chan);
5123 } else {
5124 chan->move_id = chan->local_amp_id;
5125 }
5126
5127 l2cap_move_done(chan);
5128 }
5129
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005130 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5131
Mat Martineau5f3847a2012-10-23 15:24:12 -07005132 l2cap_chan_unlock(chan);
5133
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005134 return 0;
5135}
5136
5137static inline int l2cap_move_channel_confirm_rsp(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005138 struct l2cap_cmd_hdr *cmd,
5139 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005140{
5141 struct l2cap_move_chan_cfm_rsp *rsp = data;
Mat Martineau3fd71a02012-10-23 15:24:16 -07005142 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005143 u16 icid;
5144
5145 if (cmd_len != sizeof(*rsp))
5146 return -EPROTO;
5147
5148 icid = le16_to_cpu(rsp->icid);
5149
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005150 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005151
Mat Martineau3fd71a02012-10-23 15:24:16 -07005152 chan = l2cap_get_chan_by_scid(conn, icid);
5153 if (!chan)
5154 return 0;
5155
5156 __clear_chan_timer(chan);
5157
5158 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM_RSP) {
5159 chan->local_amp_id = chan->move_id;
5160
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005161 if (chan->local_amp_id == AMP_ID_BREDR && chan->hs_hchan)
Mat Martineau3fd71a02012-10-23 15:24:16 -07005162 __release_logical_link(chan);
5163
5164 l2cap_move_done(chan);
5165 }
5166
5167 l2cap_chan_unlock(chan);
5168
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005169 return 0;
5170}
5171
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03005172static inline int l2cap_check_conn_param(u16 min, u16 max, u16 latency,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005173 u16 to_multiplier)
Claudio Takahaside731152011-02-11 19:28:55 -02005174{
5175 u16 max_latency;
5176
5177 if (min > max || min < 6 || max > 3200)
5178 return -EINVAL;
5179
5180 if (to_multiplier < 10 || to_multiplier > 3200)
5181 return -EINVAL;
5182
5183 if (max >= to_multiplier * 8)
5184 return -EINVAL;
5185
5186 max_latency = (to_multiplier * 8 / max) - 1;
5187 if (latency > 499 || latency > max_latency)
5188 return -EINVAL;
5189
5190 return 0;
5191}
5192
5193static inline int l2cap_conn_param_update_req(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005194 struct l2cap_cmd_hdr *cmd,
Johan Hedberg203e6392013-05-15 10:07:15 +03005195 u16 cmd_len, u8 *data)
Claudio Takahaside731152011-02-11 19:28:55 -02005196{
5197 struct hci_conn *hcon = conn->hcon;
5198 struct l2cap_conn_param_update_req *req;
5199 struct l2cap_conn_param_update_rsp rsp;
Johan Hedberg203e6392013-05-15 10:07:15 +03005200 u16 min, max, latency, to_multiplier;
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005201 int err;
Claudio Takahaside731152011-02-11 19:28:55 -02005202
5203 if (!(hcon->link_mode & HCI_LM_MASTER))
5204 return -EINVAL;
5205
Claudio Takahaside731152011-02-11 19:28:55 -02005206 if (cmd_len != sizeof(struct l2cap_conn_param_update_req))
5207 return -EPROTO;
5208
5209 req = (struct l2cap_conn_param_update_req *) data;
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03005210 min = __le16_to_cpu(req->min);
5211 max = __le16_to_cpu(req->max);
Claudio Takahaside731152011-02-11 19:28:55 -02005212 latency = __le16_to_cpu(req->latency);
5213 to_multiplier = __le16_to_cpu(req->to_multiplier);
5214
5215 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 +01005216 min, max, latency, to_multiplier);
Claudio Takahaside731152011-02-11 19:28:55 -02005217
5218 memset(&rsp, 0, sizeof(rsp));
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005219
5220 err = l2cap_check_conn_param(min, max, latency, to_multiplier);
5221 if (err)
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03005222 rsp.result = __constant_cpu_to_le16(L2CAP_CONN_PARAM_REJECTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005223 else
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03005224 rsp.result = __constant_cpu_to_le16(L2CAP_CONN_PARAM_ACCEPTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005225
5226 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONN_PARAM_UPDATE_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005227 sizeof(rsp), &rsp);
Claudio Takahaside731152011-02-11 19:28:55 -02005228
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005229 if (!err)
5230 hci_le_conn_update(hcon, min, max, latency, to_multiplier);
5231
Claudio Takahaside731152011-02-11 19:28:55 -02005232 return 0;
5233}
5234
Johan Hedbergf1496de2013-05-13 14:15:56 +03005235static int l2cap_le_connect_rsp(struct l2cap_conn *conn,
5236 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5237 u8 *data)
5238{
5239 struct l2cap_le_conn_rsp *rsp = (struct l2cap_le_conn_rsp *) data;
5240 u16 dcid, mtu, mps, credits, result;
5241 struct l2cap_chan *chan;
5242 int err;
5243
5244 if (cmd_len < sizeof(*rsp))
5245 return -EPROTO;
5246
5247 dcid = __le16_to_cpu(rsp->dcid);
5248 mtu = __le16_to_cpu(rsp->mtu);
5249 mps = __le16_to_cpu(rsp->mps);
5250 credits = __le16_to_cpu(rsp->credits);
5251 result = __le16_to_cpu(rsp->result);
5252
5253 if (result == L2CAP_CR_SUCCESS && (mtu < 23 || mps < 23))
5254 return -EPROTO;
5255
5256 BT_DBG("dcid 0x%4.4x mtu %u mps %u credits %u result 0x%2.2x",
5257 dcid, mtu, mps, credits, result);
5258
5259 mutex_lock(&conn->chan_lock);
5260
5261 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5262 if (!chan) {
5263 err = -EBADSLT;
5264 goto unlock;
5265 }
5266
5267 err = 0;
5268
5269 l2cap_chan_lock(chan);
5270
5271 switch (result) {
5272 case L2CAP_CR_SUCCESS:
5273 chan->ident = 0;
5274 chan->dcid = dcid;
5275 chan->omtu = mtu;
5276 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005277 chan->tx_credits = credits;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005278 l2cap_chan_ready(chan);
5279 break;
5280
5281 default:
5282 l2cap_chan_del(chan, ECONNREFUSED);
5283 break;
5284 }
5285
5286 l2cap_chan_unlock(chan);
5287
5288unlock:
5289 mutex_unlock(&conn->chan_lock);
5290
5291 return err;
5292}
5293
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005294static inline int l2cap_bredr_sig_cmd(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005295 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5296 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005297{
5298 int err = 0;
5299
5300 switch (cmd->code) {
5301 case L2CAP_COMMAND_REJ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005302 l2cap_command_rej(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005303 break;
5304
5305 case L2CAP_CONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005306 err = l2cap_connect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005307 break;
5308
5309 case L2CAP_CONN_RSP:
Mat Martineauf5a25982012-10-11 17:48:21 +03005310 case L2CAP_CREATE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005311 l2cap_connect_create_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005312 break;
5313
5314 case L2CAP_CONF_REQ:
5315 err = l2cap_config_req(conn, cmd, cmd_len, data);
5316 break;
5317
5318 case L2CAP_CONF_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005319 l2cap_config_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005320 break;
5321
5322 case L2CAP_DISCONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005323 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005324 break;
5325
5326 case L2CAP_DISCONN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005327 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005328 break;
5329
5330 case L2CAP_ECHO_REQ:
5331 l2cap_send_cmd(conn, cmd->ident, L2CAP_ECHO_RSP, cmd_len, data);
5332 break;
5333
5334 case L2CAP_ECHO_RSP:
5335 break;
5336
5337 case L2CAP_INFO_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005338 err = l2cap_information_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005339 break;
5340
5341 case L2CAP_INFO_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005342 l2cap_information_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005343 break;
5344
Mat Martineauf94ff6f2011-11-02 16:18:32 -07005345 case L2CAP_CREATE_CHAN_REQ:
5346 err = l2cap_create_channel_req(conn, cmd, cmd_len, data);
5347 break;
5348
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005349 case L2CAP_MOVE_CHAN_REQ:
5350 err = l2cap_move_channel_req(conn, cmd, cmd_len, data);
5351 break;
5352
5353 case L2CAP_MOVE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005354 l2cap_move_channel_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005355 break;
5356
5357 case L2CAP_MOVE_CHAN_CFM:
5358 err = l2cap_move_channel_confirm(conn, cmd, cmd_len, data);
5359 break;
5360
5361 case L2CAP_MOVE_CHAN_CFM_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005362 l2cap_move_channel_confirm_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005363 break;
5364
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005365 default:
5366 BT_ERR("Unknown BR/EDR signaling command 0x%2.2x", cmd->code);
5367 err = -EINVAL;
5368 break;
5369 }
5370
5371 return err;
5372}
5373
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005374static int l2cap_le_connect_req(struct l2cap_conn *conn,
5375 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5376 u8 *data)
5377{
5378 struct l2cap_le_conn_req *req = (struct l2cap_le_conn_req *) data;
5379 struct l2cap_le_conn_rsp rsp;
5380 struct l2cap_chan *chan, *pchan;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005381 u16 dcid, scid, credits, mtu, mps;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005382 __le16 psm;
5383 u8 result;
5384
5385 if (cmd_len != sizeof(*req))
5386 return -EPROTO;
5387
5388 scid = __le16_to_cpu(req->scid);
5389 mtu = __le16_to_cpu(req->mtu);
5390 mps = __le16_to_cpu(req->mps);
5391 psm = req->psm;
5392 dcid = 0;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005393 credits = 0;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005394
5395 if (mtu < 23 || mps < 23)
5396 return -EPROTO;
5397
5398 BT_DBG("psm 0x%2.2x scid 0x%4.4x mtu %u mps %u", __le16_to_cpu(psm),
5399 scid, mtu, mps);
5400
5401 /* Check if we have socket listening on psm */
5402 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
5403 &conn->hcon->dst, LE_LINK);
5404 if (!pchan) {
5405 result = L2CAP_CR_BAD_PSM;
5406 chan = NULL;
5407 goto response;
5408 }
5409
5410 mutex_lock(&conn->chan_lock);
5411 l2cap_chan_lock(pchan);
5412
5413 if (!smp_sufficient_security(conn->hcon, pchan->sec_level)) {
5414 result = L2CAP_CR_AUTHENTICATION;
5415 chan = NULL;
5416 goto response_unlock;
5417 }
5418
5419 /* Check if we already have channel with that dcid */
5420 if (__l2cap_get_chan_by_dcid(conn, scid)) {
5421 result = L2CAP_CR_NO_MEM;
5422 chan = NULL;
5423 goto response_unlock;
5424 }
5425
5426 chan = pchan->ops->new_connection(pchan);
5427 if (!chan) {
5428 result = L2CAP_CR_NO_MEM;
5429 goto response_unlock;
5430 }
5431
Johan Hedberg0ce43ce2013-12-05 14:55:33 +02005432 l2cap_le_flowctl_init(chan);
5433
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005434 bacpy(&chan->src, &conn->hcon->src);
5435 bacpy(&chan->dst, &conn->hcon->dst);
5436 chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type);
5437 chan->dst_type = bdaddr_type(conn->hcon, conn->hcon->dst_type);
5438 chan->psm = psm;
5439 chan->dcid = scid;
5440 chan->omtu = mtu;
5441 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005442 chan->tx_credits = __le16_to_cpu(req->credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005443
5444 __l2cap_chan_add(conn, chan);
5445 dcid = chan->scid;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005446 credits = chan->rx_credits;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005447
5448 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
5449
5450 chan->ident = cmd->ident;
5451
5452 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
5453 l2cap_state_change(chan, BT_CONNECT2);
5454 result = L2CAP_CR_PEND;
5455 chan->ops->defer(chan);
5456 } else {
5457 l2cap_chan_ready(chan);
5458 result = L2CAP_CR_SUCCESS;
5459 }
5460
5461response_unlock:
5462 l2cap_chan_unlock(pchan);
5463 mutex_unlock(&conn->chan_lock);
5464
5465 if (result == L2CAP_CR_PEND)
5466 return 0;
5467
5468response:
5469 if (chan) {
5470 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02005471 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005472 } else {
5473 rsp.mtu = 0;
5474 rsp.mps = 0;
5475 }
5476
5477 rsp.dcid = cpu_to_le16(dcid);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005478 rsp.credits = cpu_to_le16(credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005479 rsp.result = cpu_to_le16(result);
5480
5481 l2cap_send_cmd(conn, cmd->ident, L2CAP_LE_CONN_RSP, sizeof(rsp), &rsp);
5482
5483 return 0;
5484}
5485
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005486static inline int l2cap_le_credits(struct l2cap_conn *conn,
5487 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5488 u8 *data)
5489{
5490 struct l2cap_le_credits *pkt;
5491 struct l2cap_chan *chan;
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005492 u16 cid, credits, max_credits;
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005493
5494 if (cmd_len != sizeof(*pkt))
5495 return -EPROTO;
5496
5497 pkt = (struct l2cap_le_credits *) data;
5498 cid = __le16_to_cpu(pkt->cid);
5499 credits = __le16_to_cpu(pkt->credits);
5500
5501 BT_DBG("cid 0x%4.4x credits 0x%4.4x", cid, credits);
5502
5503 chan = l2cap_get_chan_by_dcid(conn, cid);
5504 if (!chan)
5505 return -EBADSLT;
5506
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005507 max_credits = LE_FLOWCTL_MAX_CREDITS - chan->tx_credits;
5508 if (credits > max_credits) {
5509 BT_ERR("LE credits overflow");
5510 l2cap_send_disconn_req(chan, ECONNRESET);
5511
5512 /* Return 0 so that we don't trigger an unnecessary
5513 * command reject packet.
5514 */
5515 return 0;
5516 }
5517
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005518 chan->tx_credits += credits;
5519
5520 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
5521 l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
5522 chan->tx_credits--;
5523 }
5524
5525 if (chan->tx_credits)
5526 chan->ops->resume(chan);
5527
5528 l2cap_chan_unlock(chan);
5529
5530 return 0;
5531}
5532
Johan Hedberg71fb4192013-12-10 10:52:48 +02005533static inline int l2cap_le_command_rej(struct l2cap_conn *conn,
5534 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5535 u8 *data)
5536{
5537 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
5538 struct l2cap_chan *chan;
5539
5540 if (cmd_len < sizeof(*rej))
5541 return -EPROTO;
5542
5543 mutex_lock(&conn->chan_lock);
5544
5545 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5546 if (!chan)
5547 goto done;
5548
5549 l2cap_chan_lock(chan);
5550 l2cap_chan_del(chan, ECONNREFUSED);
5551 l2cap_chan_unlock(chan);
5552
5553done:
5554 mutex_unlock(&conn->chan_lock);
5555 return 0;
5556}
5557
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005558static inline int l2cap_le_sig_cmd(struct l2cap_conn *conn,
Johan Hedberg203e6392013-05-15 10:07:15 +03005559 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5560 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005561{
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005562 int err = 0;
5563
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005564 switch (cmd->code) {
5565 case L2CAP_COMMAND_REJ:
Johan Hedberg71fb4192013-12-10 10:52:48 +02005566 l2cap_le_command_rej(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005567 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005568
5569 case L2CAP_CONN_PARAM_UPDATE_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005570 err = l2cap_conn_param_update_req(conn, cmd, cmd_len, data);
5571 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005572
5573 case L2CAP_CONN_PARAM_UPDATE_RSP:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005574 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005575
Johan Hedbergf1496de2013-05-13 14:15:56 +03005576 case L2CAP_LE_CONN_RSP:
5577 l2cap_le_connect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005578 break;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005579
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005580 case L2CAP_LE_CONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005581 err = l2cap_le_connect_req(conn, cmd, cmd_len, data);
5582 break;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005583
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005584 case L2CAP_LE_CREDITS:
5585 err = l2cap_le_credits(conn, cmd, cmd_len, data);
5586 break;
5587
Johan Hedberg3defe012013-05-15 10:16:06 +03005588 case L2CAP_DISCONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005589 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
5590 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005591
5592 case L2CAP_DISCONN_RSP:
5593 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005594 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005595
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005596 default:
5597 BT_ERR("Unknown LE signaling command 0x%2.2x", cmd->code);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005598 err = -EINVAL;
5599 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005600 }
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005601
5602 return err;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005603}
5604
Johan Hedbergc5623552013-04-29 19:35:33 +03005605static inline void l2cap_le_sig_channel(struct l2cap_conn *conn,
5606 struct sk_buff *skb)
5607{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005608 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005609 struct l2cap_cmd_hdr *cmd;
5610 u16 len;
Johan Hedbergc5623552013-04-29 19:35:33 +03005611 int err;
5612
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005613 if (hcon->type != LE_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005614 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005615
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005616 if (skb->len < L2CAP_CMD_HDR_SIZE)
5617 goto drop;
Johan Hedbergc5623552013-04-29 19:35:33 +03005618
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005619 cmd = (void *) skb->data;
5620 skb_pull(skb, L2CAP_CMD_HDR_SIZE);
Johan Hedbergc5623552013-04-29 19:35:33 +03005621
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005622 len = le16_to_cpu(cmd->len);
Johan Hedbergc5623552013-04-29 19:35:33 +03005623
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005624 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd->code, len, cmd->ident);
Johan Hedbergc5623552013-04-29 19:35:33 +03005625
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005626 if (len != skb->len || !cmd->ident) {
5627 BT_DBG("corrupted command");
5628 goto drop;
5629 }
Johan Hedbergc5623552013-04-29 19:35:33 +03005630
Johan Hedberg203e6392013-05-15 10:07:15 +03005631 err = l2cap_le_sig_cmd(conn, cmd, len, skb->data);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005632 if (err) {
5633 struct l2cap_cmd_rej_unk rej;
Johan Hedbergc5623552013-04-29 19:35:33 +03005634
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005635 BT_ERR("Wrong link type (%d)", err);
Johan Hedbergc5623552013-04-29 19:35:33 +03005636
Johan Hedberga5211492013-10-16 11:20:49 +03005637 rej.reason = __constant_cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005638 l2cap_send_cmd(conn, cmd->ident, L2CAP_COMMAND_REJ,
5639 sizeof(rej), &rej);
Johan Hedbergc5623552013-04-29 19:35:33 +03005640 }
5641
Marcel Holtmann3b166292013-10-02 08:28:21 -07005642drop:
Johan Hedbergc5623552013-04-29 19:35:33 +03005643 kfree_skb(skb);
5644}
5645
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005646static inline void l2cap_sig_channel(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005647 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005648{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005649 struct hci_conn *hcon = conn->hcon;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005650 u8 *data = skb->data;
5651 int len = skb->len;
5652 struct l2cap_cmd_hdr cmd;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005653 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005654
5655 l2cap_raw_recv(conn, skb);
5656
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005657 if (hcon->type != ACL_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005658 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005659
Linus Torvalds1da177e2005-04-16 15:20:36 -07005660 while (len >= L2CAP_CMD_HDR_SIZE) {
Al Viro88219a02007-07-29 00:17:25 -07005661 u16 cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005662 memcpy(&cmd, data, L2CAP_CMD_HDR_SIZE);
5663 data += L2CAP_CMD_HDR_SIZE;
5664 len -= L2CAP_CMD_HDR_SIZE;
5665
Al Viro88219a02007-07-29 00:17:25 -07005666 cmd_len = le16_to_cpu(cmd.len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005667
Gustavo Padovan2d792812012-10-06 10:07:01 +01005668 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd.code, cmd_len,
5669 cmd.ident);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005670
Al Viro88219a02007-07-29 00:17:25 -07005671 if (cmd_len > len || !cmd.ident) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005672 BT_DBG("corrupted command");
5673 break;
5674 }
5675
Johan Hedbergc5623552013-04-29 19:35:33 +03005676 err = l2cap_bredr_sig_cmd(conn, &cmd, cmd_len, data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005677 if (err) {
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03005678 struct l2cap_cmd_rej_unk rej;
Gustavo F. Padovan2c6d1a22011-03-23 14:38:32 -03005679
5680 BT_ERR("Wrong link type (%d)", err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005681
Johan Hedberga5211492013-10-16 11:20:49 +03005682 rej.reason = __constant_cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Gustavo Padovan2d792812012-10-06 10:07:01 +01005683 l2cap_send_cmd(conn, cmd.ident, L2CAP_COMMAND_REJ,
5684 sizeof(rej), &rej);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005685 }
5686
Al Viro88219a02007-07-29 00:17:25 -07005687 data += cmd_len;
5688 len -= cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005689 }
5690
Marcel Holtmann3b166292013-10-02 08:28:21 -07005691drop:
Linus Torvalds1da177e2005-04-16 15:20:36 -07005692 kfree_skb(skb);
5693}
5694
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005695static int l2cap_check_fcs(struct l2cap_chan *chan, struct sk_buff *skb)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005696{
5697 u16 our_fcs, rcv_fcs;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03005698 int hdr_size;
5699
5700 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
5701 hdr_size = L2CAP_EXT_HDR_SIZE;
5702 else
5703 hdr_size = L2CAP_ENH_HDR_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005704
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005705 if (chan->fcs == L2CAP_FCS_CRC16) {
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005706 skb_trim(skb, skb->len - L2CAP_FCS_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005707 rcv_fcs = get_unaligned_le16(skb->data + skb->len);
5708 our_fcs = crc16(0, skb->data - hdr_size, skb->len + hdr_size);
5709
5710 if (our_fcs != rcv_fcs)
João Paulo Rechi Vita7a560e52010-06-22 13:56:27 -03005711 return -EBADMSG;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005712 }
5713 return 0;
5714}
5715
Mat Martineau6ea00482012-05-17 20:53:52 -07005716static void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan)
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005717{
Mat Martineaue31f7632012-05-17 20:53:41 -07005718 struct l2cap_ctrl control;
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005719
Mat Martineaue31f7632012-05-17 20:53:41 -07005720 BT_DBG("chan %p", chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005721
Mat Martineaue31f7632012-05-17 20:53:41 -07005722 memset(&control, 0, sizeof(control));
5723 control.sframe = 1;
5724 control.final = 1;
5725 control.reqseq = chan->buffer_seq;
5726 set_bit(CONN_SEND_FBIT, &chan->conn_state);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005727
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005728 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
Mat Martineaue31f7632012-05-17 20:53:41 -07005729 control.super = L2CAP_SUPER_RNR;
5730 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005731 }
5732
Mat Martineaue31f7632012-05-17 20:53:41 -07005733 if (test_and_clear_bit(CONN_REMOTE_BUSY, &chan->conn_state) &&
5734 chan->unacked_frames > 0)
5735 __set_retrans_timer(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005736
Mat Martineaue31f7632012-05-17 20:53:41 -07005737 /* Send pending iframes */
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03005738 l2cap_ertm_send(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005739
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005740 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
Mat Martineaue31f7632012-05-17 20:53:41 -07005741 test_bit(CONN_SEND_FBIT, &chan->conn_state)) {
5742 /* F-bit wasn't sent in an s-frame or i-frame yet, so
5743 * send it now.
5744 */
5745 control.super = L2CAP_SUPER_RR;
5746 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005747 }
5748}
5749
Gustavo Padovan2d792812012-10-06 10:07:01 +01005750static void append_skb_frag(struct sk_buff *skb, struct sk_buff *new_frag,
5751 struct sk_buff **last_frag)
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005752{
Mat Martineau84084a32011-07-22 14:54:00 -07005753 /* skb->len reflects data in skb as well as all fragments
5754 * skb->data_len reflects only data in fragments
5755 */
5756 if (!skb_has_frag_list(skb))
5757 skb_shinfo(skb)->frag_list = new_frag;
5758
5759 new_frag->next = NULL;
5760
5761 (*last_frag)->next = new_frag;
5762 *last_frag = new_frag;
5763
5764 skb->len += new_frag->len;
5765 skb->data_len += new_frag->len;
5766 skb->truesize += new_frag->truesize;
5767}
5768
Mat Martineau4b51dae92012-05-17 20:53:37 -07005769static int l2cap_reassemble_sdu(struct l2cap_chan *chan, struct sk_buff *skb,
5770 struct l2cap_ctrl *control)
Mat Martineau84084a32011-07-22 14:54:00 -07005771{
5772 int err = -EINVAL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005773
Mat Martineau4b51dae92012-05-17 20:53:37 -07005774 switch (control->sar) {
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005775 case L2CAP_SAR_UNSEGMENTED:
Mat Martineau84084a32011-07-22 14:54:00 -07005776 if (chan->sdu)
5777 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005778
Gustavo Padovan80b98022012-05-27 22:27:51 -03005779 err = chan->ops->recv(chan, skb);
Mat Martineau84084a32011-07-22 14:54:00 -07005780 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005781
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005782 case L2CAP_SAR_START:
Mat Martineau84084a32011-07-22 14:54:00 -07005783 if (chan->sdu)
5784 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005785
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005786 chan->sdu_len = get_unaligned_le16(skb->data);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005787 skb_pull(skb, L2CAP_SDULEN_SIZE);
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005788
Mat Martineau84084a32011-07-22 14:54:00 -07005789 if (chan->sdu_len > chan->imtu) {
5790 err = -EMSGSIZE;
5791 break;
5792 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005793
Mat Martineau84084a32011-07-22 14:54:00 -07005794 if (skb->len >= chan->sdu_len)
5795 break;
5796
5797 chan->sdu = skb;
5798 chan->sdu_last_frag = skb;
5799
5800 skb = NULL;
5801 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005802 break;
5803
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005804 case L2CAP_SAR_CONTINUE:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005805 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005806 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005807
Mat Martineau84084a32011-07-22 14:54:00 -07005808 append_skb_frag(chan->sdu, skb,
5809 &chan->sdu_last_frag);
5810 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005811
Mat Martineau84084a32011-07-22 14:54:00 -07005812 if (chan->sdu->len >= chan->sdu_len)
5813 break;
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005814
Mat Martineau84084a32011-07-22 14:54:00 -07005815 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005816 break;
5817
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005818 case L2CAP_SAR_END:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005819 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005820 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005821
Mat Martineau84084a32011-07-22 14:54:00 -07005822 append_skb_frag(chan->sdu, skb,
5823 &chan->sdu_last_frag);
5824 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005825
Mat Martineau84084a32011-07-22 14:54:00 -07005826 if (chan->sdu->len != chan->sdu_len)
5827 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005828
Gustavo Padovan80b98022012-05-27 22:27:51 -03005829 err = chan->ops->recv(chan, chan->sdu);
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005830
Mat Martineau84084a32011-07-22 14:54:00 -07005831 if (!err) {
5832 /* Reassembly complete */
5833 chan->sdu = NULL;
5834 chan->sdu_last_frag = NULL;
5835 chan->sdu_len = 0;
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005836 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005837 break;
5838 }
5839
Mat Martineau84084a32011-07-22 14:54:00 -07005840 if (err) {
5841 kfree_skb(skb);
5842 kfree_skb(chan->sdu);
5843 chan->sdu = NULL;
5844 chan->sdu_last_frag = NULL;
5845 chan->sdu_len = 0;
5846 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005847
Mat Martineau84084a32011-07-22 14:54:00 -07005848 return err;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005849}
5850
Mat Martineau32b32732012-10-23 15:24:11 -07005851static int l2cap_resegment(struct l2cap_chan *chan)
5852{
5853 /* Placeholder */
5854 return 0;
5855}
5856
Mat Martineaue3281402011-07-07 09:39:02 -07005857void l2cap_chan_busy(struct l2cap_chan *chan, int busy)
Gustavo F. Padovan712132eb2010-06-21 19:39:50 -03005858{
Mat Martineau61aa4f52012-05-17 20:53:40 -07005859 u8 event;
5860
5861 if (chan->mode != L2CAP_MODE_ERTM)
5862 return;
5863
5864 event = busy ? L2CAP_EV_LOCAL_BUSY_DETECTED : L2CAP_EV_LOCAL_BUSY_CLEAR;
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03005865 l2cap_tx(chan, NULL, NULL, event);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005866}
5867
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005868static int l2cap_rx_queued_iframes(struct l2cap_chan *chan)
5869{
Mat Martineau63838722012-05-17 20:53:45 -07005870 int err = 0;
5871 /* Pass sequential frames to l2cap_reassemble_sdu()
5872 * until a gap is encountered.
5873 */
5874
5875 BT_DBG("chan %p", chan);
5876
5877 while (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
5878 struct sk_buff *skb;
5879 BT_DBG("Searching for skb with txseq %d (queue len %d)",
5880 chan->buffer_seq, skb_queue_len(&chan->srej_q));
5881
5882 skb = l2cap_ertm_seq_in_queue(&chan->srej_q, chan->buffer_seq);
5883
5884 if (!skb)
5885 break;
5886
5887 skb_unlink(skb, &chan->srej_q);
5888 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
5889 err = l2cap_reassemble_sdu(chan, skb, &bt_cb(skb)->control);
5890 if (err)
5891 break;
5892 }
5893
5894 if (skb_queue_empty(&chan->srej_q)) {
5895 chan->rx_state = L2CAP_RX_STATE_RECV;
5896 l2cap_send_ack(chan);
5897 }
5898
5899 return err;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005900}
5901
5902static void l2cap_handle_srej(struct l2cap_chan *chan,
5903 struct l2cap_ctrl *control)
5904{
Mat Martineauf80842a2012-05-17 20:53:46 -07005905 struct sk_buff *skb;
5906
5907 BT_DBG("chan %p, control %p", chan, control);
5908
5909 if (control->reqseq == chan->next_tx_seq) {
5910 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005911 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005912 return;
5913 }
5914
5915 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
5916
5917 if (skb == NULL) {
5918 BT_DBG("Seq %d not available for retransmission",
5919 control->reqseq);
5920 return;
5921 }
5922
5923 if (chan->max_tx != 0 && bt_cb(skb)->control.retries >= chan->max_tx) {
5924 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005925 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005926 return;
5927 }
5928
5929 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
5930
5931 if (control->poll) {
5932 l2cap_pass_to_tx(chan, control);
5933
5934 set_bit(CONN_SEND_FBIT, &chan->conn_state);
5935 l2cap_retransmit(chan, control);
5936 l2cap_ertm_send(chan);
5937
5938 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5939 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5940 chan->srej_save_reqseq = control->reqseq;
5941 }
5942 } else {
5943 l2cap_pass_to_tx_fbit(chan, control);
5944
5945 if (control->final) {
5946 if (chan->srej_save_reqseq != control->reqseq ||
5947 !test_and_clear_bit(CONN_SREJ_ACT,
5948 &chan->conn_state))
5949 l2cap_retransmit(chan, control);
5950 } else {
5951 l2cap_retransmit(chan, control);
5952 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5953 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5954 chan->srej_save_reqseq = control->reqseq;
5955 }
5956 }
5957 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005958}
5959
5960static void l2cap_handle_rej(struct l2cap_chan *chan,
5961 struct l2cap_ctrl *control)
5962{
Mat Martineaufcd289d2012-05-17 20:53:47 -07005963 struct sk_buff *skb;
5964
5965 BT_DBG("chan %p, control %p", chan, control);
5966
5967 if (control->reqseq == chan->next_tx_seq) {
5968 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005969 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07005970 return;
5971 }
5972
5973 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
5974
5975 if (chan->max_tx && skb &&
5976 bt_cb(skb)->control.retries >= chan->max_tx) {
5977 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005978 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07005979 return;
5980 }
5981
5982 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
5983
5984 l2cap_pass_to_tx(chan, control);
5985
5986 if (control->final) {
5987 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state))
5988 l2cap_retransmit_all(chan, control);
5989 } else {
5990 l2cap_retransmit_all(chan, control);
5991 l2cap_ertm_send(chan);
5992 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F)
5993 set_bit(CONN_REJ_ACT, &chan->conn_state);
5994 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005995}
5996
Mat Martineau4b51dae92012-05-17 20:53:37 -07005997static u8 l2cap_classify_txseq(struct l2cap_chan *chan, u16 txseq)
5998{
5999 BT_DBG("chan %p, txseq %d", chan, txseq);
6000
6001 BT_DBG("last_acked_seq %d, expected_tx_seq %d", chan->last_acked_seq,
6002 chan->expected_tx_seq);
6003
6004 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
6005 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
Gustavo Padovan2d792812012-10-06 10:07:01 +01006006 chan->tx_win) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07006007 /* See notes below regarding "double poll" and
6008 * invalid packets.
6009 */
6010 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
6011 BT_DBG("Invalid/Ignore - after SREJ");
6012 return L2CAP_TXSEQ_INVALID_IGNORE;
6013 } else {
6014 BT_DBG("Invalid - in window after SREJ sent");
6015 return L2CAP_TXSEQ_INVALID;
6016 }
6017 }
6018
6019 if (chan->srej_list.head == txseq) {
6020 BT_DBG("Expected SREJ");
6021 return L2CAP_TXSEQ_EXPECTED_SREJ;
6022 }
6023
6024 if (l2cap_ertm_seq_in_queue(&chan->srej_q, txseq)) {
6025 BT_DBG("Duplicate SREJ - txseq already stored");
6026 return L2CAP_TXSEQ_DUPLICATE_SREJ;
6027 }
6028
6029 if (l2cap_seq_list_contains(&chan->srej_list, txseq)) {
6030 BT_DBG("Unexpected SREJ - not requested");
6031 return L2CAP_TXSEQ_UNEXPECTED_SREJ;
6032 }
6033 }
6034
6035 if (chan->expected_tx_seq == txseq) {
6036 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
6037 chan->tx_win) {
6038 BT_DBG("Invalid - txseq outside tx window");
6039 return L2CAP_TXSEQ_INVALID;
6040 } else {
6041 BT_DBG("Expected");
6042 return L2CAP_TXSEQ_EXPECTED;
6043 }
6044 }
6045
6046 if (__seq_offset(chan, txseq, chan->last_acked_seq) <
Gustavo Padovan2d792812012-10-06 10:07:01 +01006047 __seq_offset(chan, chan->expected_tx_seq, chan->last_acked_seq)) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07006048 BT_DBG("Duplicate - expected_tx_seq later than txseq");
6049 return L2CAP_TXSEQ_DUPLICATE;
6050 }
6051
6052 if (__seq_offset(chan, txseq, chan->last_acked_seq) >= chan->tx_win) {
6053 /* A source of invalid packets is a "double poll" condition,
6054 * where delays cause us to send multiple poll packets. If
6055 * the remote stack receives and processes both polls,
6056 * sequence numbers can wrap around in such a way that a
6057 * resent frame has a sequence number that looks like new data
6058 * with a sequence gap. This would trigger an erroneous SREJ
6059 * request.
6060 *
6061 * Fortunately, this is impossible with a tx window that's
6062 * less than half of the maximum sequence number, which allows
6063 * invalid frames to be safely ignored.
6064 *
6065 * With tx window sizes greater than half of the tx window
6066 * maximum, the frame is invalid and cannot be ignored. This
6067 * causes a disconnect.
6068 */
6069
6070 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
6071 BT_DBG("Invalid/Ignore - txseq outside tx window");
6072 return L2CAP_TXSEQ_INVALID_IGNORE;
6073 } else {
6074 BT_DBG("Invalid - txseq outside tx window");
6075 return L2CAP_TXSEQ_INVALID;
6076 }
6077 } else {
6078 BT_DBG("Unexpected - txseq indicates missing frames");
6079 return L2CAP_TXSEQ_UNEXPECTED;
6080 }
6081}
6082
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006083static int l2cap_rx_state_recv(struct l2cap_chan *chan,
6084 struct l2cap_ctrl *control,
6085 struct sk_buff *skb, u8 event)
6086{
6087 int err = 0;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006088 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006089
6090 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6091 event);
6092
6093 switch (event) {
6094 case L2CAP_EV_RECV_IFRAME:
6095 switch (l2cap_classify_txseq(chan, control->txseq)) {
6096 case L2CAP_TXSEQ_EXPECTED:
6097 l2cap_pass_to_tx(chan, control);
6098
6099 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6100 BT_DBG("Busy, discarding expected seq %d",
6101 control->txseq);
6102 break;
6103 }
6104
6105 chan->expected_tx_seq = __next_seq(chan,
6106 control->txseq);
6107
6108 chan->buffer_seq = chan->expected_tx_seq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006109 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006110
6111 err = l2cap_reassemble_sdu(chan, skb, control);
6112 if (err)
6113 break;
6114
6115 if (control->final) {
6116 if (!test_and_clear_bit(CONN_REJ_ACT,
6117 &chan->conn_state)) {
6118 control->final = 0;
6119 l2cap_retransmit_all(chan, control);
6120 l2cap_ertm_send(chan);
6121 }
6122 }
6123
6124 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
6125 l2cap_send_ack(chan);
6126 break;
6127 case L2CAP_TXSEQ_UNEXPECTED:
6128 l2cap_pass_to_tx(chan, control);
6129
6130 /* Can't issue SREJ frames in the local busy state.
6131 * Drop this frame, it will be seen as missing
6132 * when local busy is exited.
6133 */
6134 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6135 BT_DBG("Busy, discarding unexpected seq %d",
6136 control->txseq);
6137 break;
6138 }
6139
6140 /* There was a gap in the sequence, so an SREJ
6141 * must be sent for each missing frame. The
6142 * current frame is stored for later use.
6143 */
6144 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006145 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006146 BT_DBG("Queued %p (queue len %d)", skb,
6147 skb_queue_len(&chan->srej_q));
6148
6149 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
6150 l2cap_seq_list_clear(&chan->srej_list);
6151 l2cap_send_srej(chan, control->txseq);
6152
6153 chan->rx_state = L2CAP_RX_STATE_SREJ_SENT;
6154 break;
6155 case L2CAP_TXSEQ_DUPLICATE:
6156 l2cap_pass_to_tx(chan, control);
6157 break;
6158 case L2CAP_TXSEQ_INVALID_IGNORE:
6159 break;
6160 case L2CAP_TXSEQ_INVALID:
6161 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006162 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006163 break;
6164 }
6165 break;
6166 case L2CAP_EV_RECV_RR:
6167 l2cap_pass_to_tx(chan, control);
6168 if (control->final) {
6169 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6170
Mat Martineaue6a3ee62012-10-23 15:24:22 -07006171 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state) &&
6172 !__chan_is_moving(chan)) {
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006173 control->final = 0;
6174 l2cap_retransmit_all(chan, control);
6175 }
6176
6177 l2cap_ertm_send(chan);
6178 } else if (control->poll) {
6179 l2cap_send_i_or_rr_or_rnr(chan);
6180 } else {
6181 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6182 &chan->conn_state) &&
6183 chan->unacked_frames)
6184 __set_retrans_timer(chan);
6185
6186 l2cap_ertm_send(chan);
6187 }
6188 break;
6189 case L2CAP_EV_RECV_RNR:
6190 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6191 l2cap_pass_to_tx(chan, control);
6192 if (control && control->poll) {
6193 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6194 l2cap_send_rr_or_rnr(chan, 0);
6195 }
6196 __clear_retrans_timer(chan);
6197 l2cap_seq_list_clear(&chan->retrans_list);
6198 break;
6199 case L2CAP_EV_RECV_REJ:
6200 l2cap_handle_rej(chan, control);
6201 break;
6202 case L2CAP_EV_RECV_SREJ:
6203 l2cap_handle_srej(chan, control);
6204 break;
6205 default:
6206 break;
6207 }
6208
6209 if (skb && !skb_in_use) {
6210 BT_DBG("Freeing %p", skb);
6211 kfree_skb(skb);
6212 }
6213
6214 return err;
6215}
6216
6217static int l2cap_rx_state_srej_sent(struct l2cap_chan *chan,
6218 struct l2cap_ctrl *control,
6219 struct sk_buff *skb, u8 event)
6220{
6221 int err = 0;
6222 u16 txseq = control->txseq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006223 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006224
6225 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6226 event);
6227
6228 switch (event) {
6229 case L2CAP_EV_RECV_IFRAME:
6230 switch (l2cap_classify_txseq(chan, txseq)) {
6231 case L2CAP_TXSEQ_EXPECTED:
6232 /* Keep frame for reassembly later */
6233 l2cap_pass_to_tx(chan, control);
6234 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006235 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006236 BT_DBG("Queued %p (queue len %d)", skb,
6237 skb_queue_len(&chan->srej_q));
6238
6239 chan->expected_tx_seq = __next_seq(chan, txseq);
6240 break;
6241 case L2CAP_TXSEQ_EXPECTED_SREJ:
6242 l2cap_seq_list_pop(&chan->srej_list);
6243
6244 l2cap_pass_to_tx(chan, control);
6245 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006246 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006247 BT_DBG("Queued %p (queue len %d)", skb,
6248 skb_queue_len(&chan->srej_q));
6249
6250 err = l2cap_rx_queued_iframes(chan);
6251 if (err)
6252 break;
6253
6254 break;
6255 case L2CAP_TXSEQ_UNEXPECTED:
6256 /* Got a frame that can't be reassembled yet.
6257 * Save it for later, and send SREJs to cover
6258 * the missing frames.
6259 */
6260 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006261 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006262 BT_DBG("Queued %p (queue len %d)", skb,
6263 skb_queue_len(&chan->srej_q));
6264
6265 l2cap_pass_to_tx(chan, control);
6266 l2cap_send_srej(chan, control->txseq);
6267 break;
6268 case L2CAP_TXSEQ_UNEXPECTED_SREJ:
6269 /* This frame was requested with an SREJ, but
6270 * some expected retransmitted frames are
6271 * missing. Request retransmission of missing
6272 * SREJ'd frames.
6273 */
6274 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006275 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006276 BT_DBG("Queued %p (queue len %d)", skb,
6277 skb_queue_len(&chan->srej_q));
6278
6279 l2cap_pass_to_tx(chan, control);
6280 l2cap_send_srej_list(chan, control->txseq);
6281 break;
6282 case L2CAP_TXSEQ_DUPLICATE_SREJ:
6283 /* We've already queued this frame. Drop this copy. */
6284 l2cap_pass_to_tx(chan, control);
6285 break;
6286 case L2CAP_TXSEQ_DUPLICATE:
6287 /* Expecting a later sequence number, so this frame
6288 * was already received. Ignore it completely.
6289 */
6290 break;
6291 case L2CAP_TXSEQ_INVALID_IGNORE:
6292 break;
6293 case L2CAP_TXSEQ_INVALID:
6294 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006295 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006296 break;
6297 }
6298 break;
6299 case L2CAP_EV_RECV_RR:
6300 l2cap_pass_to_tx(chan, control);
6301 if (control->final) {
6302 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6303
6304 if (!test_and_clear_bit(CONN_REJ_ACT,
6305 &chan->conn_state)) {
6306 control->final = 0;
6307 l2cap_retransmit_all(chan, control);
6308 }
6309
6310 l2cap_ertm_send(chan);
6311 } else if (control->poll) {
6312 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6313 &chan->conn_state) &&
6314 chan->unacked_frames) {
6315 __set_retrans_timer(chan);
6316 }
6317
6318 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6319 l2cap_send_srej_tail(chan);
6320 } else {
6321 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6322 &chan->conn_state) &&
6323 chan->unacked_frames)
6324 __set_retrans_timer(chan);
6325
6326 l2cap_send_ack(chan);
6327 }
6328 break;
6329 case L2CAP_EV_RECV_RNR:
6330 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6331 l2cap_pass_to_tx(chan, control);
6332 if (control->poll) {
6333 l2cap_send_srej_tail(chan);
6334 } else {
6335 struct l2cap_ctrl rr_control;
6336 memset(&rr_control, 0, sizeof(rr_control));
6337 rr_control.sframe = 1;
6338 rr_control.super = L2CAP_SUPER_RR;
6339 rr_control.reqseq = chan->buffer_seq;
6340 l2cap_send_sframe(chan, &rr_control);
6341 }
6342
6343 break;
6344 case L2CAP_EV_RECV_REJ:
6345 l2cap_handle_rej(chan, control);
6346 break;
6347 case L2CAP_EV_RECV_SREJ:
6348 l2cap_handle_srej(chan, control);
6349 break;
6350 }
6351
6352 if (skb && !skb_in_use) {
6353 BT_DBG("Freeing %p", skb);
6354 kfree_skb(skb);
6355 }
6356
6357 return err;
6358}
6359
Mat Martineau32b32732012-10-23 15:24:11 -07006360static int l2cap_finish_move(struct l2cap_chan *chan)
6361{
6362 BT_DBG("chan %p", chan);
6363
6364 chan->rx_state = L2CAP_RX_STATE_RECV;
6365
6366 if (chan->hs_hcon)
6367 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6368 else
6369 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6370
6371 return l2cap_resegment(chan);
6372}
6373
6374static int l2cap_rx_state_wait_p(struct l2cap_chan *chan,
6375 struct l2cap_ctrl *control,
6376 struct sk_buff *skb, u8 event)
6377{
6378 int err;
6379
6380 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6381 event);
6382
6383 if (!control->poll)
6384 return -EPROTO;
6385
6386 l2cap_process_reqseq(chan, control->reqseq);
6387
6388 if (!skb_queue_empty(&chan->tx_q))
6389 chan->tx_send_head = skb_peek(&chan->tx_q);
6390 else
6391 chan->tx_send_head = NULL;
6392
6393 /* Rewind next_tx_seq to the point expected
6394 * by the receiver.
6395 */
6396 chan->next_tx_seq = control->reqseq;
6397 chan->unacked_frames = 0;
6398
6399 err = l2cap_finish_move(chan);
6400 if (err)
6401 return err;
6402
6403 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6404 l2cap_send_i_or_rr_or_rnr(chan);
6405
6406 if (event == L2CAP_EV_RECV_IFRAME)
6407 return -EPROTO;
6408
6409 return l2cap_rx_state_recv(chan, control, NULL, event);
6410}
6411
6412static int l2cap_rx_state_wait_f(struct l2cap_chan *chan,
6413 struct l2cap_ctrl *control,
6414 struct sk_buff *skb, u8 event)
6415{
6416 int err;
6417
6418 if (!control->final)
6419 return -EPROTO;
6420
6421 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6422
6423 chan->rx_state = L2CAP_RX_STATE_RECV;
6424 l2cap_process_reqseq(chan, control->reqseq);
6425
6426 if (!skb_queue_empty(&chan->tx_q))
6427 chan->tx_send_head = skb_peek(&chan->tx_q);
6428 else
6429 chan->tx_send_head = NULL;
6430
6431 /* Rewind next_tx_seq to the point expected
6432 * by the receiver.
6433 */
6434 chan->next_tx_seq = control->reqseq;
6435 chan->unacked_frames = 0;
6436
6437 if (chan->hs_hcon)
6438 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6439 else
6440 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6441
6442 err = l2cap_resegment(chan);
6443
6444 if (!err)
6445 err = l2cap_rx_state_recv(chan, control, skb, event);
6446
6447 return err;
6448}
6449
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006450static bool __valid_reqseq(struct l2cap_chan *chan, u16 reqseq)
6451{
6452 /* Make sure reqseq is for a packet that has been sent but not acked */
6453 u16 unacked;
6454
6455 unacked = __seq_offset(chan, chan->next_tx_seq, chan->expected_ack_seq);
6456 return __seq_offset(chan, chan->next_tx_seq, reqseq) <= unacked;
6457}
6458
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006459static int l2cap_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6460 struct sk_buff *skb, u8 event)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006461{
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006462 int err = 0;
6463
6464 BT_DBG("chan %p, control %p, skb %p, event %d, state %d", chan,
6465 control, skb, event, chan->rx_state);
6466
6467 if (__valid_reqseq(chan, control->reqseq)) {
6468 switch (chan->rx_state) {
6469 case L2CAP_RX_STATE_RECV:
6470 err = l2cap_rx_state_recv(chan, control, skb, event);
6471 break;
6472 case L2CAP_RX_STATE_SREJ_SENT:
6473 err = l2cap_rx_state_srej_sent(chan, control, skb,
6474 event);
6475 break;
Mat Martineau32b32732012-10-23 15:24:11 -07006476 case L2CAP_RX_STATE_WAIT_P:
6477 err = l2cap_rx_state_wait_p(chan, control, skb, event);
6478 break;
6479 case L2CAP_RX_STATE_WAIT_F:
6480 err = l2cap_rx_state_wait_f(chan, control, skb, event);
6481 break;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006482 default:
6483 /* shut it down */
6484 break;
6485 }
6486 } else {
6487 BT_DBG("Invalid reqseq %d (next_tx_seq %d, expected_ack_seq %d",
6488 control->reqseq, chan->next_tx_seq,
6489 chan->expected_ack_seq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006490 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006491 }
6492
6493 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006494}
6495
6496static int l2cap_stream_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6497 struct sk_buff *skb)
6498{
Mat Martineau4b51dae92012-05-17 20:53:37 -07006499 int err = 0;
6500
6501 BT_DBG("chan %p, control %p, skb %p, state %d", chan, control, skb,
6502 chan->rx_state);
6503
6504 if (l2cap_classify_txseq(chan, control->txseq) ==
6505 L2CAP_TXSEQ_EXPECTED) {
6506 l2cap_pass_to_tx(chan, control);
6507
6508 BT_DBG("buffer_seq %d->%d", chan->buffer_seq,
6509 __next_seq(chan, chan->buffer_seq));
6510
6511 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
6512
6513 l2cap_reassemble_sdu(chan, skb, control);
6514 } else {
6515 if (chan->sdu) {
6516 kfree_skb(chan->sdu);
6517 chan->sdu = NULL;
6518 }
6519 chan->sdu_last_frag = NULL;
6520 chan->sdu_len = 0;
6521
6522 if (skb) {
6523 BT_DBG("Freeing %p", skb);
6524 kfree_skb(skb);
6525 }
6526 }
6527
6528 chan->last_acked_seq = control->txseq;
6529 chan->expected_tx_seq = __next_seq(chan, control->txseq);
6530
6531 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006532}
6533
6534static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6535{
6536 struct l2cap_ctrl *control = &bt_cb(skb)->control;
6537 u16 len;
6538 u8 event;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006539
Mat Martineaub76bbd62012-04-11 10:48:43 -07006540 __unpack_control(chan, skb);
6541
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006542 len = skb->len;
6543
6544 /*
6545 * We can just drop the corrupted I-frame here.
6546 * Receiver will miss it and start proper recovery
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006547 * procedures and ask for retransmission.
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006548 */
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006549 if (l2cap_check_fcs(chan, skb))
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006550 goto drop;
6551
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006552 if (!control->sframe && control->sar == L2CAP_SAR_START)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006553 len -= L2CAP_SDULEN_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006554
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006555 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006556 len -= L2CAP_FCS_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006557
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006558 if (len > chan->mps) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006559 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006560 goto drop;
6561 }
6562
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006563 if (!control->sframe) {
6564 int err;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006565
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006566 BT_DBG("iframe sar %d, reqseq %d, final %d, txseq %d",
6567 control->sar, control->reqseq, control->final,
6568 control->txseq);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03006569
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006570 /* Validate F-bit - F=0 always valid, F=1 only
6571 * valid in TX WAIT_F
6572 */
6573 if (control->final && chan->tx_state != L2CAP_TX_STATE_WAIT_F)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006574 goto drop;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006575
6576 if (chan->mode != L2CAP_MODE_STREAMING) {
6577 event = L2CAP_EV_RECV_IFRAME;
6578 err = l2cap_rx(chan, control, skb, event);
6579 } else {
6580 err = l2cap_stream_rx(chan, control, skb);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006581 }
6582
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006583 if (err)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006584 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006585 } else {
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006586 const u8 rx_func_to_event[4] = {
6587 L2CAP_EV_RECV_RR, L2CAP_EV_RECV_REJ,
6588 L2CAP_EV_RECV_RNR, L2CAP_EV_RECV_SREJ
6589 };
6590
6591 /* Only I-frames are expected in streaming mode */
6592 if (chan->mode == L2CAP_MODE_STREAMING)
6593 goto drop;
6594
6595 BT_DBG("sframe reqseq %d, final %d, poll %d, super %d",
6596 control->reqseq, control->final, control->poll,
6597 control->super);
6598
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006599 if (len != 0) {
Andrei Emeltchenko1bb166e2012-11-20 17:16:21 +02006600 BT_ERR("Trailing bytes: %d in sframe", len);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006601 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006602 goto drop;
6603 }
6604
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006605 /* Validate F and P bits */
6606 if (control->final && (control->poll ||
6607 chan->tx_state != L2CAP_TX_STATE_WAIT_F))
6608 goto drop;
6609
6610 event = rx_func_to_event[control->super];
6611 if (l2cap_rx(chan, control, skb, event))
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006612 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006613 }
6614
6615 return 0;
6616
6617drop:
6618 kfree_skb(skb);
6619 return 0;
6620}
6621
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006622static void l2cap_chan_le_send_credits(struct l2cap_chan *chan)
6623{
6624 struct l2cap_conn *conn = chan->conn;
6625 struct l2cap_le_credits pkt;
6626 u16 return_credits;
6627
6628 /* We return more credits to the sender only after the amount of
6629 * credits falls below half of the initial amount.
6630 */
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02006631 if (chan->rx_credits >= (le_max_credits + 1) / 2)
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006632 return;
6633
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02006634 return_credits = le_max_credits - chan->rx_credits;
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006635
6636 BT_DBG("chan %p returning %u credits to sender", chan, return_credits);
6637
6638 chan->rx_credits += return_credits;
6639
6640 pkt.cid = cpu_to_le16(chan->scid);
6641 pkt.credits = cpu_to_le16(return_credits);
6642
6643 chan->ident = l2cap_get_ident(conn);
6644
6645 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CREDITS, sizeof(pkt), &pkt);
6646}
6647
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006648static int l2cap_le_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6649{
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006650 int err;
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006651
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006652 if (!chan->rx_credits) {
6653 BT_ERR("No credits to receive LE L2CAP data");
Johan Hedbergdfd97742014-01-27 15:11:34 -08006654 l2cap_send_disconn_req(chan, ECONNRESET);
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006655 return -ENOBUFS;
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006656 }
6657
6658 if (chan->imtu < skb->len) {
6659 BT_ERR("Too big LE L2CAP PDU");
6660 return -ENOBUFS;
6661 }
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006662
6663 chan->rx_credits--;
6664 BT_DBG("rx_credits %u -> %u", chan->rx_credits + 1, chan->rx_credits);
6665
6666 l2cap_chan_le_send_credits(chan);
6667
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006668 err = 0;
6669
6670 if (!chan->sdu) {
6671 u16 sdu_len;
6672
6673 sdu_len = get_unaligned_le16(skb->data);
6674 skb_pull(skb, L2CAP_SDULEN_SIZE);
6675
6676 BT_DBG("Start of new SDU. sdu_len %u skb->len %u imtu %u",
6677 sdu_len, skb->len, chan->imtu);
6678
6679 if (sdu_len > chan->imtu) {
6680 BT_ERR("Too big LE L2CAP SDU length received");
6681 err = -EMSGSIZE;
6682 goto failed;
6683 }
6684
6685 if (skb->len > sdu_len) {
6686 BT_ERR("Too much LE L2CAP data received");
6687 err = -EINVAL;
6688 goto failed;
6689 }
6690
6691 if (skb->len == sdu_len)
6692 return chan->ops->recv(chan, skb);
6693
6694 chan->sdu = skb;
6695 chan->sdu_len = sdu_len;
6696 chan->sdu_last_frag = skb;
6697
6698 return 0;
6699 }
6700
6701 BT_DBG("SDU fragment. chan->sdu->len %u skb->len %u chan->sdu_len %u",
6702 chan->sdu->len, skb->len, chan->sdu_len);
6703
6704 if (chan->sdu->len + skb->len > chan->sdu_len) {
6705 BT_ERR("Too much LE L2CAP data received");
6706 err = -EINVAL;
6707 goto failed;
6708 }
6709
6710 append_skb_frag(chan->sdu, skb, &chan->sdu_last_frag);
6711 skb = NULL;
6712
6713 if (chan->sdu->len == chan->sdu_len) {
6714 err = chan->ops->recv(chan, chan->sdu);
6715 if (!err) {
6716 chan->sdu = NULL;
6717 chan->sdu_last_frag = NULL;
6718 chan->sdu_len = 0;
6719 }
6720 }
6721
6722failed:
6723 if (err) {
6724 kfree_skb(skb);
6725 kfree_skb(chan->sdu);
6726 chan->sdu = NULL;
6727 chan->sdu_last_frag = NULL;
6728 chan->sdu_len = 0;
6729 }
6730
6731 /* We can't return an error here since we took care of the skb
6732 * freeing internally. An error return would cause the caller to
6733 * do a double-free of the skb.
6734 */
6735 return 0;
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006736}
6737
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006738static void l2cap_data_channel(struct l2cap_conn *conn, u16 cid,
6739 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006740{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006741 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006742
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03006743 chan = l2cap_get_chan_by_scid(conn, cid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006744 if (!chan) {
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006745 if (cid == L2CAP_CID_A2MP) {
6746 chan = a2mp_channel_create(conn, skb);
6747 if (!chan) {
6748 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006749 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006750 }
6751
6752 l2cap_chan_lock(chan);
6753 } else {
6754 BT_DBG("unknown cid 0x%4.4x", cid);
6755 /* Drop packet and return */
6756 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006757 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006758 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006759 }
6760
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03006761 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006762
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03006763 if (chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006764 goto drop;
6765
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006766 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03006767 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006768 if (l2cap_le_data_rcv(chan, skb) < 0)
6769 goto drop;
6770
6771 goto done;
6772
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006773 case L2CAP_MODE_BASIC:
6774 /* If socket recv buffers overflows we drop data here
6775 * which is *bad* because L2CAP has to be reliable.
6776 * But we don't have any other choice. L2CAP doesn't
6777 * provide flow control mechanism. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07006778
Szymon Janc2c96e032014-02-18 20:48:34 +01006779 if (chan->imtu < skb->len) {
6780 BT_ERR("Dropping L2CAP data: receive buffer overflow");
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006781 goto drop;
Szymon Janc2c96e032014-02-18 20:48:34 +01006782 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006783
Gustavo Padovan80b98022012-05-27 22:27:51 -03006784 if (!chan->ops->recv(chan, skb))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006785 goto done;
6786 break;
6787
6788 case L2CAP_MODE_ERTM:
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006789 case L2CAP_MODE_STREAMING:
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006790 l2cap_data_rcv(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006791 goto done;
6792
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006793 default:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006794 BT_DBG("chan %p: bad mode 0x%2.2x", chan, chan->mode);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006795 break;
6796 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006797
6798drop:
6799 kfree_skb(skb);
6800
6801done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006802 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006803}
6804
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006805static void l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm,
6806 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006807{
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006808 struct hci_conn *hcon = conn->hcon;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006809 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006810
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006811 if (hcon->type != ACL_LINK)
6812 goto drop;
6813
Johan Hedbergbf20fd42013-05-14 13:23:13 +03006814 chan = l2cap_global_chan_by_psm(0, psm, &hcon->src, &hcon->dst,
6815 ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006816 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006817 goto drop;
6818
Andrei Emeltchenko5b4ceda2012-02-24 16:35:32 +02006819 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006820
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03006821 if (chan->state != BT_BOUND && chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006822 goto drop;
6823
Vinicius Costa Gomese13e21d2011-06-17 22:46:27 -03006824 if (chan->imtu < skb->len)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006825 goto drop;
6826
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006827 /* Store remote BD_ADDR and PSM for msg_name */
Marcel Holtmann06ae3312013-10-18 03:43:00 -07006828 bacpy(&bt_cb(skb)->bdaddr, &hcon->dst);
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006829 bt_cb(skb)->psm = psm;
6830
Gustavo Padovan80b98022012-05-27 22:27:51 -03006831 if (!chan->ops->recv(chan, skb))
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006832 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006833
6834drop:
6835 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006836}
6837
Marcel Holtmann72f78352013-04-23 00:59:00 -07006838static void l2cap_att_channel(struct l2cap_conn *conn,
Andrei Emeltchenko6810fca2012-05-31 11:18:57 +03006839 struct sk_buff *skb)
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006840{
Marcel Holtmannb99707d2013-10-03 02:54:11 -07006841 struct hci_conn *hcon = conn->hcon;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006842 struct l2cap_chan *chan;
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006843
Marcel Holtmannb99707d2013-10-03 02:54:11 -07006844 if (hcon->type != LE_LINK)
6845 goto drop;
6846
Johan Hedbergaf1c0132013-04-29 19:35:42 +03006847 chan = l2cap_global_chan_by_scid(BT_CONNECTED, L2CAP_CID_ATT,
Marcel Holtmann06ae3312013-10-18 03:43:00 -07006848 &hcon->src, &hcon->dst);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006849 if (!chan)
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006850 goto drop;
6851
Andrei Emeltchenko5b4ceda2012-02-24 16:35:32 +02006852 BT_DBG("chan %p, len %d", chan, skb->len);
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006853
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07006854 if (hci_blacklist_lookup(hcon->hdev, &hcon->dst, hcon->dst_type))
6855 goto drop;
6856
Vinicius Costa Gomese13e21d2011-06-17 22:46:27 -03006857 if (chan->imtu < skb->len)
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006858 goto drop;
6859
Gustavo Padovan80b98022012-05-27 22:27:51 -03006860 if (!chan->ops->recv(chan, skb))
Andrei Emeltchenko6810fca2012-05-31 11:18:57 +03006861 return;
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006862
6863drop:
6864 kfree_skb(skb);
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006865}
6866
Linus Torvalds1da177e2005-04-16 15:20:36 -07006867static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb)
6868{
6869 struct l2cap_hdr *lh = (void *) skb->data;
Johan Hedberg61a939c2014-01-17 20:45:11 +02006870 struct hci_conn *hcon = conn->hcon;
Al Viro8e036fc2007-07-29 00:16:36 -07006871 u16 cid, len;
6872 __le16 psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006873
Johan Hedberg61a939c2014-01-17 20:45:11 +02006874 if (hcon->state != BT_CONNECTED) {
6875 BT_DBG("queueing pending rx skb");
6876 skb_queue_tail(&conn->pending_rx, skb);
6877 return;
6878 }
6879
Linus Torvalds1da177e2005-04-16 15:20:36 -07006880 skb_pull(skb, L2CAP_HDR_SIZE);
6881 cid = __le16_to_cpu(lh->cid);
6882 len = __le16_to_cpu(lh->len);
6883
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006884 if (len != skb->len) {
6885 kfree_skb(skb);
6886 return;
6887 }
6888
Linus Torvalds1da177e2005-04-16 15:20:36 -07006889 BT_DBG("len %d, cid 0x%4.4x", len, cid);
6890
6891 switch (cid) {
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006892 case L2CAP_CID_SIGNALING:
Linus Torvalds1da177e2005-04-16 15:20:36 -07006893 l2cap_sig_channel(conn, skb);
6894 break;
6895
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006896 case L2CAP_CID_CONN_LESS:
Andrei Emeltchenko097db762012-03-09 14:16:17 +02006897 psm = get_unaligned((__le16 *) skb->data);
Andrei Emeltchenko0181a702012-05-29 10:04:05 +03006898 skb_pull(skb, L2CAP_PSMLEN_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006899 l2cap_conless_channel(conn, psm, skb);
6900 break;
6901
Johan Hedberg073d1cf2013-04-29 19:35:35 +03006902 case L2CAP_CID_ATT:
Marcel Holtmann72f78352013-04-23 00:59:00 -07006903 l2cap_att_channel(conn, skb);
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006904 break;
6905
Marcel Holtmanna2877622013-10-02 23:46:54 -07006906 case L2CAP_CID_LE_SIGNALING:
6907 l2cap_le_sig_channel(conn, skb);
6908 break;
6909
Anderson Brigliab501d6a2011-06-07 18:46:31 -03006910 case L2CAP_CID_SMP:
6911 if (smp_sig_channel(conn, skb))
6912 l2cap_conn_del(conn->hcon, EACCES);
6913 break;
6914
Jukka Rissanen18722c22013-12-11 17:05:37 +02006915 case L2CAP_FC_6LOWPAN:
6916 bt_6lowpan_recv(conn, skb);
6917 break;
6918
Linus Torvalds1da177e2005-04-16 15:20:36 -07006919 default:
6920 l2cap_data_channel(conn, cid, skb);
6921 break;
6922 }
6923}
6924
Johan Hedberg61a939c2014-01-17 20:45:11 +02006925static void process_pending_rx(struct work_struct *work)
6926{
6927 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
6928 pending_rx_work);
6929 struct sk_buff *skb;
6930
6931 BT_DBG("");
6932
6933 while ((skb = skb_dequeue(&conn->pending_rx)))
6934 l2cap_recv_frame(conn, skb);
6935}
6936
Johan Hedberg162b49e2014-01-17 20:45:10 +02006937static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon)
6938{
6939 struct l2cap_conn *conn = hcon->l2cap_data;
6940 struct hci_chan *hchan;
6941
6942 if (conn)
6943 return conn;
6944
6945 hchan = hci_chan_create(hcon);
6946 if (!hchan)
6947 return NULL;
6948
6949 conn = kzalloc(sizeof(struct l2cap_conn), GFP_KERNEL);
6950 if (!conn) {
6951 hci_chan_del(hchan);
6952 return NULL;
6953 }
6954
6955 kref_init(&conn->ref);
6956 hcon->l2cap_data = conn;
6957 conn->hcon = hcon;
6958 hci_conn_get(conn->hcon);
6959 conn->hchan = hchan;
6960
6961 BT_DBG("hcon %p conn %p hchan %p", hcon, conn, hchan);
6962
6963 switch (hcon->type) {
6964 case LE_LINK:
6965 if (hcon->hdev->le_mtu) {
6966 conn->mtu = hcon->hdev->le_mtu;
6967 break;
6968 }
6969 /* fall through */
6970 default:
6971 conn->mtu = hcon->hdev->acl_mtu;
6972 break;
6973 }
6974
6975 conn->feat_mask = 0;
6976
6977 if (hcon->type == ACL_LINK)
6978 conn->hs_enabled = test_bit(HCI_HS_ENABLED,
6979 &hcon->hdev->dev_flags);
6980
6981 spin_lock_init(&conn->lock);
6982 mutex_init(&conn->chan_lock);
6983
6984 INIT_LIST_HEAD(&conn->chan_l);
6985 INIT_LIST_HEAD(&conn->users);
6986
6987 if (hcon->type == LE_LINK)
6988 INIT_DELAYED_WORK(&conn->security_timer, security_timeout);
6989 else
6990 INIT_DELAYED_WORK(&conn->info_timer, l2cap_info_timeout);
6991
Johan Hedberg61a939c2014-01-17 20:45:11 +02006992 skb_queue_head_init(&conn->pending_rx);
6993 INIT_WORK(&conn->pending_rx_work, process_pending_rx);
6994
Johan Hedberg162b49e2014-01-17 20:45:10 +02006995 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
6996
6997 return conn;
6998}
6999
7000static bool is_valid_psm(u16 psm, u8 dst_type) {
7001 if (!psm)
7002 return false;
7003
7004 if (bdaddr_type_is_le(dst_type))
7005 return (psm <= 0x00ff);
7006
7007 /* PSM must be odd and lsb of upper byte must be 0 */
7008 return ((psm & 0x0101) == 0x0001);
7009}
7010
7011int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
7012 bdaddr_t *dst, u8 dst_type)
7013{
7014 struct l2cap_conn *conn;
7015 struct hci_conn *hcon;
7016 struct hci_dev *hdev;
7017 __u8 auth_type;
7018 int err;
7019
7020 BT_DBG("%pMR -> %pMR (type %u) psm 0x%2.2x", &chan->src, dst,
7021 dst_type, __le16_to_cpu(psm));
7022
7023 hdev = hci_get_route(dst, &chan->src);
7024 if (!hdev)
7025 return -EHOSTUNREACH;
7026
7027 hci_dev_lock(hdev);
7028
7029 l2cap_chan_lock(chan);
7030
7031 if (!is_valid_psm(__le16_to_cpu(psm), dst_type) && !cid &&
7032 chan->chan_type != L2CAP_CHAN_RAW) {
7033 err = -EINVAL;
7034 goto done;
7035 }
7036
Johan Hedberg21626e62014-01-24 10:35:41 +02007037 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED && !psm) {
7038 err = -EINVAL;
7039 goto done;
7040 }
7041
7042 if (chan->chan_type == L2CAP_CHAN_FIXED && !cid) {
Johan Hedberg162b49e2014-01-17 20:45:10 +02007043 err = -EINVAL;
7044 goto done;
7045 }
7046
7047 switch (chan->mode) {
7048 case L2CAP_MODE_BASIC:
7049 break;
7050 case L2CAP_MODE_LE_FLOWCTL:
7051 l2cap_le_flowctl_init(chan);
7052 break;
7053 case L2CAP_MODE_ERTM:
7054 case L2CAP_MODE_STREAMING:
7055 if (!disable_ertm)
7056 break;
7057 /* fall through */
7058 default:
7059 err = -ENOTSUPP;
7060 goto done;
7061 }
7062
7063 switch (chan->state) {
7064 case BT_CONNECT:
7065 case BT_CONNECT2:
7066 case BT_CONFIG:
7067 /* Already connecting */
7068 err = 0;
7069 goto done;
7070
7071 case BT_CONNECTED:
7072 /* Already connected */
7073 err = -EISCONN;
7074 goto done;
7075
7076 case BT_OPEN:
7077 case BT_BOUND:
7078 /* Can connect */
7079 break;
7080
7081 default:
7082 err = -EBADFD;
7083 goto done;
7084 }
7085
7086 /* Set destination address and psm */
7087 bacpy(&chan->dst, dst);
7088 chan->dst_type = dst_type;
7089
7090 chan->psm = psm;
7091 chan->dcid = cid;
7092
7093 auth_type = l2cap_get_auth_type(chan);
7094
7095 if (bdaddr_type_is_le(dst_type))
7096 hcon = hci_connect(hdev, LE_LINK, dst, dst_type,
7097 chan->sec_level, auth_type);
7098 else
7099 hcon = hci_connect(hdev, ACL_LINK, dst, dst_type,
7100 chan->sec_level, auth_type);
7101
7102 if (IS_ERR(hcon)) {
7103 err = PTR_ERR(hcon);
7104 goto done;
7105 }
7106
7107 conn = l2cap_conn_add(hcon);
7108 if (!conn) {
7109 hci_conn_drop(hcon);
7110 err = -ENOMEM;
7111 goto done;
7112 }
7113
7114 if (cid && __l2cap_get_chan_by_dcid(conn, cid)) {
7115 hci_conn_drop(hcon);
7116 err = -EBUSY;
7117 goto done;
7118 }
7119
7120 /* Update source addr of the socket */
7121 bacpy(&chan->src, &hcon->src);
7122 chan->src_type = bdaddr_type(hcon, hcon->src_type);
7123
7124 l2cap_chan_unlock(chan);
7125 l2cap_chan_add(conn, chan);
7126 l2cap_chan_lock(chan);
7127
7128 /* l2cap_chan_add takes its own ref so we can drop this one */
7129 hci_conn_drop(hcon);
7130
7131 l2cap_state_change(chan, BT_CONNECT);
7132 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
7133
Johan Hedberg61202e42014-01-28 15:16:48 -08007134 /* Release chan->sport so that it can be reused by other
7135 * sockets (as it's only used for listening sockets).
7136 */
7137 write_lock(&chan_list_lock);
7138 chan->sport = 0;
7139 write_unlock(&chan_list_lock);
7140
Johan Hedberg162b49e2014-01-17 20:45:10 +02007141 if (hcon->state == BT_CONNECTED) {
7142 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
7143 __clear_chan_timer(chan);
7144 if (l2cap_chan_check_security(chan))
7145 l2cap_state_change(chan, BT_CONNECTED);
7146 } else
7147 l2cap_do_start(chan);
7148 }
7149
7150 err = 0;
7151
7152done:
7153 l2cap_chan_unlock(chan);
7154 hci_dev_unlock(hdev);
7155 hci_dev_put(hdev);
7156 return err;
7157}
7158
Linus Torvalds1da177e2005-04-16 15:20:36 -07007159/* ---- L2CAP interface with lower layer (HCI) ---- */
7160
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007161int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007162{
7163 int exact = 0, lm1 = 0, lm2 = 0;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007164 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007165
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03007166 BT_DBG("hdev %s, bdaddr %pMR", hdev->name, bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007167
7168 /* Find listening sockets and check their link_mode */
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007169 read_lock(&chan_list_lock);
7170 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007171 if (c->state != BT_LISTEN)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007172 continue;
7173
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007174 if (!bacmp(&c->src, &hdev->bdaddr)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007175 lm1 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03007176 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007177 lm1 |= HCI_LM_MASTER;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007178 exact++;
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007179 } else if (!bacmp(&c->src, BDADDR_ANY)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007180 lm2 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03007181 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007182 lm2 |= HCI_LM_MASTER;
7183 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007184 }
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007185 read_unlock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007186
7187 return exact ? lm1 : lm2;
7188}
7189
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03007190void l2cap_connect_cfm(struct hci_conn *hcon, u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007191{
Marcel Holtmann01394182006-07-03 10:02:46 +02007192 struct l2cap_conn *conn;
7193
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03007194 BT_DBG("hcon %p bdaddr %pMR status %d", hcon, &hcon->dst, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007195
Linus Torvalds1da177e2005-04-16 15:20:36 -07007196 if (!status) {
Claudio Takahasibaf43252013-04-11 13:55:50 -03007197 conn = l2cap_conn_add(hcon);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007198 if (conn)
7199 l2cap_conn_ready(conn);
Andrei Emeltchenkoba6fc312012-10-31 15:46:26 +02007200 } else {
Joe Perchese1750722011-06-29 18:18:29 -07007201 l2cap_conn_del(hcon, bt_to_errno(status));
Andrei Emeltchenkoba6fc312012-10-31 15:46:26 +02007202 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007203}
7204
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007205int l2cap_disconn_ind(struct hci_conn *hcon)
Marcel Holtmann2950f212009-02-12 14:02:50 +01007206{
7207 struct l2cap_conn *conn = hcon->l2cap_data;
7208
7209 BT_DBG("hcon %p", hcon);
7210
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007211 if (!conn)
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02007212 return HCI_ERROR_REMOTE_USER_TERM;
Marcel Holtmann2950f212009-02-12 14:02:50 +01007213 return conn->disc_reason;
7214}
7215
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03007216void l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007217{
7218 BT_DBG("hcon %p reason %d", hcon, reason);
7219
Jukka Rissanen18722c22013-12-11 17:05:37 +02007220 bt_6lowpan_del_conn(hcon->l2cap_data);
7221
Joe Perchese1750722011-06-29 18:18:29 -07007222 l2cap_conn_del(hcon, bt_to_errno(reason));
Linus Torvalds1da177e2005-04-16 15:20:36 -07007223}
7224
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007225static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt)
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007226{
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03007227 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED)
Marcel Holtmann255c7602009-02-04 21:07:19 +01007228 return;
7229
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007230 if (encrypt == 0x00) {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007231 if (chan->sec_level == BT_SECURITY_MEDIUM) {
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007232 __set_chan_timer(chan, L2CAP_ENC_TIMEOUT);
Marcel Holtmann7d513e92014-01-15 22:37:40 -08007233 } else if (chan->sec_level == BT_SECURITY_HIGH ||
7234 chan->sec_level == BT_SECURITY_FIPS)
Gustavo F. Padovan0f852722011-05-04 19:42:50 -03007235 l2cap_chan_close(chan, ECONNREFUSED);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007236 } else {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007237 if (chan->sec_level == BT_SECURITY_MEDIUM)
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -03007238 __clear_chan_timer(chan);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007239 }
7240}
7241
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007242int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007243{
Marcel Holtmann40be4922008-07-14 20:13:50 +02007244 struct l2cap_conn *conn = hcon->l2cap_data;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03007245 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007246
Marcel Holtmann01394182006-07-03 10:02:46 +02007247 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007248 return 0;
Marcel Holtmann01394182006-07-03 10:02:46 +02007249
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03007250 BT_DBG("conn %p status 0x%2.2x encrypt %u", conn, status, encrypt);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007251
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03007252 if (hcon->type == LE_LINK) {
Hemant Gupta35d4adcc2012-04-18 14:46:26 +05307253 if (!status && encrypt)
7254 smp_distribute_keys(conn, 0);
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02007255 cancel_delayed_work(&conn->security_timer);
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03007256 }
7257
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007258 mutex_lock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007259
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007260 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007261 l2cap_chan_lock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007262
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03007263 BT_DBG("chan %p scid 0x%4.4x state %s", chan, chan->scid,
7264 state_to_string(chan->state));
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007265
Johan Hedberg2338a7e2014-01-24 10:35:40 +02007266 if (chan->scid == L2CAP_CID_A2MP) {
Andrei Emeltchenko78eb2f92012-07-19 17:03:47 +03007267 l2cap_chan_unlock(chan);
7268 continue;
7269 }
7270
Johan Hedberg073d1cf2013-04-29 19:35:35 +03007271 if (chan->scid == L2CAP_CID_ATT) {
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007272 if (!status && encrypt) {
7273 chan->sec_level = hcon->sec_level;
Andrei Emeltchenkocf4cd002012-02-06 15:03:59 +02007274 l2cap_chan_ready(chan);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007275 }
7276
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007277 l2cap_chan_unlock(chan);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007278 continue;
7279 }
7280
Andrei Emeltchenko96eff462012-11-15 18:14:53 +02007281 if (!__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007282 l2cap_chan_unlock(chan);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01007283 continue;
7284 }
7285
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007286 if (!status && (chan->state == BT_CONNECTED ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01007287 chan->state == BT_CONFIG)) {
Marcel Holtmannd97c8992013-10-14 02:53:54 -07007288 chan->ops->resume(chan);
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007289 l2cap_check_encryption(chan, encrypt);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007290 l2cap_chan_unlock(chan);
Marcel Holtmann9719f8a2008-07-14 20:13:45 +02007291 continue;
7292 }
7293
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007294 if (chan->state == BT_CONNECT) {
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007295 if (!status)
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03007296 l2cap_start_connection(chan);
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007297 else
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007298 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007299 } else if (chan->state == BT_CONNECT2) {
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007300 struct l2cap_conn_rsp rsp;
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007301 __u16 res, stat;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007302
7303 if (!status) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07007304 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007305 res = L2CAP_CR_PEND;
7306 stat = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08007307 chan->ops->defer(chan);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007308 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007309 l2cap_state_change(chan, BT_CONFIG);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007310 res = L2CAP_CR_SUCCESS;
7311 stat = L2CAP_CS_NO_INFO;
7312 }
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007313 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007314 l2cap_state_change(chan, BT_DISCONN);
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007315 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007316 res = L2CAP_CR_SEC_BLOCK;
7317 stat = L2CAP_CS_NO_INFO;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007318 }
7319
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03007320 rsp.scid = cpu_to_le16(chan->dcid);
7321 rsp.dcid = cpu_to_le16(chan->scid);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007322 rsp.result = cpu_to_le16(res);
7323 rsp.status = cpu_to_le16(stat);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03007324 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01007325 sizeof(rsp), &rsp);
Mat Martineau2d369352012-05-23 14:59:30 -07007326
7327 if (!test_bit(CONF_REQ_SENT, &chan->conf_state) &&
7328 res == L2CAP_CR_SUCCESS) {
7329 char buf[128];
7330 set_bit(CONF_REQ_SENT, &chan->conf_state);
7331 l2cap_send_cmd(conn, l2cap_get_ident(conn),
7332 L2CAP_CONF_REQ,
7333 l2cap_build_conf_req(chan, buf),
7334 buf);
7335 chan->num_conf_req++;
7336 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007337 }
7338
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007339 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007340 }
7341
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007342 mutex_unlock(&conn->chan_lock);
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007343
Linus Torvalds1da177e2005-04-16 15:20:36 -07007344 return 0;
7345}
7346
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007347int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007348{
7349 struct l2cap_conn *conn = hcon->l2cap_data;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007350 struct l2cap_hdr *hdr;
7351 int len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007352
Andrei Emeltchenko1d13a252012-10-15 11:58:41 +03007353 /* For AMP controller do not create l2cap conn */
7354 if (!conn && hcon->hdev->dev_type != HCI_BREDR)
7355 goto drop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007356
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007357 if (!conn)
Claudio Takahasibaf43252013-04-11 13:55:50 -03007358 conn = l2cap_conn_add(hcon);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007359
7360 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007361 goto drop;
7362
7363 BT_DBG("conn %p len %d flags 0x%x", conn, skb->len, flags);
7364
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007365 switch (flags) {
7366 case ACL_START:
7367 case ACL_START_NO_FLUSH:
7368 case ACL_COMPLETE:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007369 if (conn->rx_len) {
7370 BT_ERR("Unexpected start frame (len %d)", skb->len);
7371 kfree_skb(conn->rx_skb);
7372 conn->rx_skb = NULL;
7373 conn->rx_len = 0;
7374 l2cap_conn_unreliable(conn, ECOMM);
7375 }
7376
Andrei Emeltchenkoaae7fe22010-09-15 14:28:43 +03007377 /* Start fragment always begin with Basic L2CAP header */
7378 if (skb->len < L2CAP_HDR_SIZE) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07007379 BT_ERR("Frame is too short (len %d)", skb->len);
7380 l2cap_conn_unreliable(conn, ECOMM);
7381 goto drop;
7382 }
7383
7384 hdr = (struct l2cap_hdr *) skb->data;
7385 len = __le16_to_cpu(hdr->len) + L2CAP_HDR_SIZE;
7386
7387 if (len == skb->len) {
7388 /* Complete frame received */
7389 l2cap_recv_frame(conn, skb);
7390 return 0;
7391 }
7392
7393 BT_DBG("Start: total len %d, frag len %d", len, skb->len);
7394
7395 if (skb->len > len) {
7396 BT_ERR("Frame is too long (len %d, expected len %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007397 skb->len, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007398 l2cap_conn_unreliable(conn, ECOMM);
7399 goto drop;
7400 }
7401
7402 /* Allocate skb for the complete frame (with header) */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03007403 conn->rx_skb = bt_skb_alloc(len, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03007404 if (!conn->rx_skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007405 goto drop;
7406
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007407 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007408 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007409 conn->rx_len = len - skb->len;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007410 break;
7411
7412 case ACL_CONT:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007413 BT_DBG("Cont: frag len %d (expecting %d)", skb->len, conn->rx_len);
7414
7415 if (!conn->rx_len) {
7416 BT_ERR("Unexpected continuation frame (len %d)", skb->len);
7417 l2cap_conn_unreliable(conn, ECOMM);
7418 goto drop;
7419 }
7420
7421 if (skb->len > conn->rx_len) {
7422 BT_ERR("Fragment is too long (len %d, expected %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007423 skb->len, conn->rx_len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007424 kfree_skb(conn->rx_skb);
7425 conn->rx_skb = NULL;
7426 conn->rx_len = 0;
7427 l2cap_conn_unreliable(conn, ECOMM);
7428 goto drop;
7429 }
7430
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007431 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007432 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007433 conn->rx_len -= skb->len;
7434
7435 if (!conn->rx_len) {
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007436 /* Complete frame received. l2cap_recv_frame
7437 * takes ownership of the skb so set the global
7438 * rx_skb pointer to NULL first.
7439 */
7440 struct sk_buff *rx_skb = conn->rx_skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007441 conn->rx_skb = NULL;
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007442 l2cap_recv_frame(conn, rx_skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007443 }
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007444 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007445 }
7446
7447drop:
7448 kfree_skb(skb);
7449 return 0;
7450}
7451
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007452static int l2cap_debugfs_show(struct seq_file *f, void *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007453{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007454 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007455
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007456 read_lock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007457
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007458 list_for_each_entry(c, &chan_list, global_l) {
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03007459 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 -07007460 &c->src, &c->dst,
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03007461 c->state, __le16_to_cpu(c->psm),
7462 c->scid, c->dcid, c->imtu, c->omtu,
7463 c->sec_level, c->mode);
Andrei Emeltchenko61e1b4b2012-01-19 11:19:50 +02007464 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007465
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007466 read_unlock(&chan_list_lock);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007467
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007468 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007469}
7470
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007471static int l2cap_debugfs_open(struct inode *inode, struct file *file)
7472{
7473 return single_open(file, l2cap_debugfs_show, inode->i_private);
7474}
7475
7476static const struct file_operations l2cap_debugfs_fops = {
7477 .open = l2cap_debugfs_open,
7478 .read = seq_read,
7479 .llseek = seq_lseek,
7480 .release = single_release,
7481};
7482
7483static struct dentry *l2cap_debugfs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007484
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007485int __init l2cap_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007486{
7487 int err;
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007488
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007489 err = l2cap_init_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007490 if (err < 0)
7491 return err;
7492
Marcel Holtmann1120e4b2013-10-17 17:24:16 -07007493 if (IS_ERR_OR_NULL(bt_debugfs))
7494 return 0;
7495
7496 l2cap_debugfs = debugfs_create_file("l2cap", 0444, bt_debugfs,
7497 NULL, &l2cap_debugfs_fops);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007498
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02007499 debugfs_create_u16("l2cap_le_max_credits", 0466, bt_debugfs,
7500 &le_max_credits);
7501 debugfs_create_u16("l2cap_le_default_mps", 0466, bt_debugfs,
7502 &le_default_mps);
7503
Jukka Rissanen18722c22013-12-11 17:05:37 +02007504 bt_6lowpan_init();
7505
Linus Torvalds1da177e2005-04-16 15:20:36 -07007506 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007507}
7508
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007509void l2cap_exit(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007510{
Jukka Rissanen18722c22013-12-11 17:05:37 +02007511 bt_6lowpan_cleanup();
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007512 debugfs_remove(l2cap_debugfs);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007513 l2cap_cleanup_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007514}
7515
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03007516module_param(disable_ertm, bool, 0644);
7517MODULE_PARM_DESC(disable_ertm, "Disable enhanced retransmission mode");