blob: 6d42498e862b2abc5ff43b399f63e3b043ebca0e [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>
Anderson Brigliab501d6a2011-06-07 18:46:31 -030039#include <net/bluetooth/smp.h>
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +030040#include <net/bluetooth/a2mp.h>
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +020041#include <net/bluetooth/amp.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070042
Mat Martineaud1de6d42012-05-17 20:53:55 -070043bool disable_ertm;
Marcel Holtmannf0709e02007-10-20 13:38:51 +020044
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -070045static u32 l2cap_feat_mask = L2CAP_FEAT_FIXED_CHAN;
Mat Martineau50a147c2011-11-02 16:18:34 -070046static u8 l2cap_fixed_chan[8] = { L2CAP_FC_L2CAP, };
Linus Torvalds1da177e2005-04-16 15:20:36 -070047
Johannes Bergb5ad8b72011-06-01 08:54:45 +020048static LIST_HEAD(chan_list);
49static DEFINE_RWLOCK(chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -070050
Linus Torvalds1da177e2005-04-16 15:20:36 -070051static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +010052 u8 code, u8 ident, u16 dlen, void *data);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -030053static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len,
Gustavo Padovan2d792812012-10-06 10:07:01 +010054 void *data);
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -030055static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +020056static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err);
Linus Torvalds1da177e2005-04-16 15:20:36 -070057
Gustavo Padovand6603662012-05-21 13:58:22 -030058static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
Gustavo Padovan2d792812012-10-06 10:07:01 +010059 struct sk_buff_head *skbs, u8 event);
Mat Martineau608bcc62012-05-17 20:53:32 -070060
Marcel Holtmann01394182006-07-03 10:02:46 +020061/* ---- L2CAP channels ---- */
Gustavo F. Padovan71ba0e52011-05-17 14:34:52 -030062
Gustavo Padovan2d792812012-10-06 10:07:01 +010063static struct l2cap_chan *__l2cap_get_chan_by_dcid(struct l2cap_conn *conn,
64 u16 cid)
Marcel Holtmann01394182006-07-03 10:02:46 +020065{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020066 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -030067
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020068 list_for_each_entry(c, &conn->chan_l, list) {
69 if (c->dcid == cid)
70 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +020071 }
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020072 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +020073}
74
Gustavo Padovan2d792812012-10-06 10:07:01 +010075static struct l2cap_chan *__l2cap_get_chan_by_scid(struct l2cap_conn *conn,
76 u16 cid)
Marcel Holtmann01394182006-07-03 10:02:46 +020077{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020078 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -030079
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020080 list_for_each_entry(c, &conn->chan_l, list) {
81 if (c->scid == cid)
82 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +020083 }
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020084 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +020085}
86
87/* Find channel with given SCID.
Mat Martineauef191ad2012-05-02 09:42:00 -070088 * Returns locked channel. */
Gustavo Padovan2d792812012-10-06 10:07:01 +010089static struct l2cap_chan *l2cap_get_chan_by_scid(struct l2cap_conn *conn,
90 u16 cid)
Marcel Holtmann01394182006-07-03 10:02:46 +020091{
Gustavo F. Padovan48454072011-03-25 00:22:30 -030092 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -030093
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020094 mutex_lock(&conn->chan_lock);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -030095 c = __l2cap_get_chan_by_scid(conn, cid);
Mat Martineauef191ad2012-05-02 09:42:00 -070096 if (c)
97 l2cap_chan_lock(c);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020098 mutex_unlock(&conn->chan_lock);
99
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300100 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +0200101}
102
Mat Martineaub1a130b2012-10-23 15:24:09 -0700103/* Find channel with given DCID.
104 * Returns locked channel.
105 */
106static struct l2cap_chan *l2cap_get_chan_by_dcid(struct l2cap_conn *conn,
107 u16 cid)
108{
109 struct l2cap_chan *c;
110
111 mutex_lock(&conn->chan_lock);
112 c = __l2cap_get_chan_by_dcid(conn, cid);
113 if (c)
114 l2cap_chan_lock(c);
115 mutex_unlock(&conn->chan_lock);
116
117 return c;
118}
119
Gustavo Padovan2d792812012-10-06 10:07:01 +0100120static struct l2cap_chan *__l2cap_get_chan_by_ident(struct l2cap_conn *conn,
121 u8 ident)
Marcel Holtmann01394182006-07-03 10:02:46 +0200122{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200123 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300124
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200125 list_for_each_entry(c, &conn->chan_l, list) {
126 if (c->ident == ident)
127 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +0200128 }
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200129 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200130}
131
Mat Martineau5b155ef2012-10-23 15:24:14 -0700132static struct l2cap_chan *l2cap_get_chan_by_ident(struct l2cap_conn *conn,
133 u8 ident)
134{
135 struct l2cap_chan *c;
136
137 mutex_lock(&conn->chan_lock);
138 c = __l2cap_get_chan_by_ident(conn, ident);
139 if (c)
140 l2cap_chan_lock(c);
141 mutex_unlock(&conn->chan_lock);
142
143 return c;
144}
145
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300146static struct l2cap_chan *__l2cap_global_chan_by_addr(__le16 psm, bdaddr_t *src)
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300147{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300148 struct l2cap_chan *c;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300149
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300150 list_for_each_entry(c, &chan_list, global_l) {
151 if (c->sport == psm && !bacmp(&bt_sk(c->sk)->src, src))
Szymon Janc250938c2011-11-16 09:32:22 +0100152 return c;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300153 }
Szymon Janc250938c2011-11-16 09:32:22 +0100154 return NULL;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300155}
156
157int l2cap_add_psm(struct l2cap_chan *chan, bdaddr_t *src, __le16 psm)
158{
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300159 int err;
160
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200161 write_lock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300162
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300163 if (psm && __l2cap_global_chan_by_addr(psm, src)) {
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300164 err = -EADDRINUSE;
165 goto done;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300166 }
167
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300168 if (psm) {
169 chan->psm = psm;
170 chan->sport = psm;
171 err = 0;
172 } else {
173 u16 p;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300174
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300175 err = -EINVAL;
176 for (p = 0x1001; p < 0x1100; p += 2)
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300177 if (!__l2cap_global_chan_by_addr(cpu_to_le16(p), src)) {
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300178 chan->psm = cpu_to_le16(p);
179 chan->sport = cpu_to_le16(p);
180 err = 0;
181 break;
182 }
183 }
184
185done:
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200186 write_unlock(&chan_list_lock);
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300187 return err;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300188}
189
190int l2cap_add_scid(struct l2cap_chan *chan, __u16 scid)
191{
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200192 write_lock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300193
194 chan->scid = scid;
195
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200196 write_unlock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300197
198 return 0;
199}
200
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300201static u16 l2cap_alloc_cid(struct l2cap_conn *conn)
Marcel Holtmann01394182006-07-03 10:02:46 +0200202{
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -0300203 u16 cid = L2CAP_CID_DYN_START;
Marcel Holtmann01394182006-07-03 10:02:46 +0200204
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -0300205 for (; cid < L2CAP_CID_DYN_END; cid++) {
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300206 if (!__l2cap_get_chan_by_scid(conn, cid))
Marcel Holtmann01394182006-07-03 10:02:46 +0200207 return cid;
208 }
209
210 return 0;
211}
212
Andrei Emeltchenko0e587be2012-02-21 12:54:57 +0200213static void __l2cap_state_change(struct l2cap_chan *chan, int state)
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300214{
Andrei Emeltchenko42d2d872012-02-17 11:40:57 +0200215 BT_DBG("chan %p %s -> %s", chan, state_to_string(chan->state),
Gustavo Padovan2d792812012-10-06 10:07:01 +0100216 state_to_string(state));
Gustavo F. Padovanbadaaa02011-11-23 20:11:46 -0200217
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300218 chan->state = state;
Gustavo Padovan80b98022012-05-27 22:27:51 -0300219 chan->ops->state_change(chan, state);
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300220}
221
Andrei Emeltchenko0e587be2012-02-21 12:54:57 +0200222static void l2cap_state_change(struct l2cap_chan *chan, int state)
223{
224 struct sock *sk = chan->sk;
225
226 lock_sock(sk);
227 __l2cap_state_change(chan, state);
228 release_sock(sk);
229}
230
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +0200231static inline void __l2cap_chan_set_err(struct l2cap_chan *chan, int err)
232{
233 struct sock *sk = chan->sk;
234
235 sk->sk_err = err;
236}
237
238static inline void l2cap_chan_set_err(struct l2cap_chan *chan, int err)
239{
240 struct sock *sk = chan->sk;
241
242 lock_sock(sk);
243 __l2cap_chan_set_err(chan, err);
244 release_sock(sk);
245}
246
Mat Martineau4239d162012-05-17 20:53:49 -0700247static void __set_retrans_timer(struct l2cap_chan *chan)
248{
249 if (!delayed_work_pending(&chan->monitor_timer) &&
250 chan->retrans_timeout) {
251 l2cap_set_timer(chan, &chan->retrans_timer,
252 msecs_to_jiffies(chan->retrans_timeout));
253 }
254}
255
256static void __set_monitor_timer(struct l2cap_chan *chan)
257{
258 __clear_retrans_timer(chan);
259 if (chan->monitor_timeout) {
260 l2cap_set_timer(chan, &chan->monitor_timer,
261 msecs_to_jiffies(chan->monitor_timeout));
262 }
263}
264
Mat Martineau608bcc62012-05-17 20:53:32 -0700265static struct sk_buff *l2cap_ertm_seq_in_queue(struct sk_buff_head *head,
266 u16 seq)
267{
268 struct sk_buff *skb;
269
270 skb_queue_walk(head, skb) {
271 if (bt_cb(skb)->control.txseq == seq)
272 return skb;
273 }
274
275 return NULL;
276}
277
Mat Martineau3c588192012-04-11 10:48:42 -0700278/* ---- L2CAP sequence number lists ---- */
279
280/* For ERTM, ordered lists of sequence numbers must be tracked for
281 * SREJ requests that are received and for frames that are to be
282 * retransmitted. These seq_list functions implement a singly-linked
283 * list in an array, where membership in the list can also be checked
284 * in constant time. Items can also be added to the tail of the list
285 * and removed from the head in constant time, without further memory
286 * allocs or frees.
287 */
288
289static int l2cap_seq_list_init(struct l2cap_seq_list *seq_list, u16 size)
290{
291 size_t alloc_size, i;
292
293 /* Allocated size is a power of 2 to map sequence numbers
294 * (which may be up to 14 bits) in to a smaller array that is
295 * sized for the negotiated ERTM transmit windows.
296 */
297 alloc_size = roundup_pow_of_two(size);
298
299 seq_list->list = kmalloc(sizeof(u16) * alloc_size, GFP_KERNEL);
300 if (!seq_list->list)
301 return -ENOMEM;
302
303 seq_list->mask = alloc_size - 1;
304 seq_list->head = L2CAP_SEQ_LIST_CLEAR;
305 seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
306 for (i = 0; i < alloc_size; i++)
307 seq_list->list[i] = L2CAP_SEQ_LIST_CLEAR;
308
309 return 0;
310}
311
312static inline void l2cap_seq_list_free(struct l2cap_seq_list *seq_list)
313{
314 kfree(seq_list->list);
315}
316
317static inline bool l2cap_seq_list_contains(struct l2cap_seq_list *seq_list,
318 u16 seq)
319{
320 /* Constant-time check for list membership */
321 return seq_list->list[seq & seq_list->mask] != L2CAP_SEQ_LIST_CLEAR;
322}
323
324static u16 l2cap_seq_list_remove(struct l2cap_seq_list *seq_list, u16 seq)
325{
326 u16 mask = seq_list->mask;
327
328 if (seq_list->head == L2CAP_SEQ_LIST_CLEAR) {
329 /* In case someone tries to pop the head of an empty list */
330 return L2CAP_SEQ_LIST_CLEAR;
331 } else if (seq_list->head == seq) {
332 /* Head can be removed in constant time */
333 seq_list->head = seq_list->list[seq & mask];
334 seq_list->list[seq & mask] = L2CAP_SEQ_LIST_CLEAR;
335
336 if (seq_list->head == L2CAP_SEQ_LIST_TAIL) {
337 seq_list->head = L2CAP_SEQ_LIST_CLEAR;
338 seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
339 }
340 } else {
341 /* Walk the list to find the sequence number */
342 u16 prev = seq_list->head;
343 while (seq_list->list[prev & mask] != seq) {
344 prev = seq_list->list[prev & mask];
345 if (prev == L2CAP_SEQ_LIST_TAIL)
346 return L2CAP_SEQ_LIST_CLEAR;
347 }
348
349 /* Unlink the number from the list and clear it */
350 seq_list->list[prev & mask] = seq_list->list[seq & mask];
351 seq_list->list[seq & mask] = L2CAP_SEQ_LIST_CLEAR;
352 if (seq_list->tail == seq)
353 seq_list->tail = prev;
354 }
355 return seq;
356}
357
358static inline u16 l2cap_seq_list_pop(struct l2cap_seq_list *seq_list)
359{
360 /* Remove the head in constant time */
361 return l2cap_seq_list_remove(seq_list, seq_list->head);
362}
363
364static void l2cap_seq_list_clear(struct l2cap_seq_list *seq_list)
365{
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300366 u16 i;
Mat Martineau3c588192012-04-11 10:48:42 -0700367
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300368 if (seq_list->head == L2CAP_SEQ_LIST_CLEAR)
369 return;
370
371 for (i = 0; i <= seq_list->mask; i++)
372 seq_list->list[i] = L2CAP_SEQ_LIST_CLEAR;
373
374 seq_list->head = L2CAP_SEQ_LIST_CLEAR;
375 seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
Mat Martineau3c588192012-04-11 10:48:42 -0700376}
377
378static void l2cap_seq_list_append(struct l2cap_seq_list *seq_list, u16 seq)
379{
380 u16 mask = seq_list->mask;
381
382 /* All appends happen in constant time */
383
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300384 if (seq_list->list[seq & mask] != L2CAP_SEQ_LIST_CLEAR)
385 return;
Mat Martineau3c588192012-04-11 10:48:42 -0700386
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300387 if (seq_list->tail == L2CAP_SEQ_LIST_CLEAR)
388 seq_list->head = seq;
389 else
390 seq_list->list[seq_list->tail & mask] = seq;
391
392 seq_list->tail = seq;
393 seq_list->list[seq & mask] = L2CAP_SEQ_LIST_TAIL;
Mat Martineau3c588192012-04-11 10:48:42 -0700394}
395
Gustavo F. Padovan721c4182011-06-23 19:29:58 -0300396static void l2cap_chan_timeout(struct work_struct *work)
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300397{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -0300398 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100399 chan_timer.work);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200400 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300401 int reason;
402
Andrei Emeltchenkoe05dcc32012-02-17 11:40:56 +0200403 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300404
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200405 mutex_lock(&conn->chan_lock);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200406 l2cap_chan_lock(chan);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300407
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300408 if (chan->state == BT_CONNECTED || chan->state == BT_CONFIG)
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300409 reason = ECONNREFUSED;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300410 else if (chan->state == BT_CONNECT &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100411 chan->sec_level != BT_SECURITY_SDP)
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300412 reason = ECONNREFUSED;
413 else
414 reason = ETIMEDOUT;
415
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300416 l2cap_chan_close(chan, reason);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300417
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200418 l2cap_chan_unlock(chan);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300419
Gustavo Padovan80b98022012-05-27 22:27:51 -0300420 chan->ops->close(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200421 mutex_unlock(&conn->chan_lock);
422
Ulisses Furquim371fd832011-12-21 20:02:36 -0200423 l2cap_chan_put(chan);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300424}
425
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -0300426struct l2cap_chan *l2cap_chan_create(void)
Marcel Holtmann01394182006-07-03 10:02:46 +0200427{
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300428 struct l2cap_chan *chan;
Marcel Holtmann01394182006-07-03 10:02:46 +0200429
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300430 chan = kzalloc(sizeof(*chan), GFP_ATOMIC);
431 if (!chan)
432 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200433
Andrei Emeltchenkoc03b3552012-02-21 12:54:56 +0200434 mutex_init(&chan->lock);
435
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200436 write_lock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300437 list_add(&chan->global_l, &chan_list);
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200438 write_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300439
Gustavo F. Padovan721c4182011-06-23 19:29:58 -0300440 INIT_DELAYED_WORK(&chan->chan_timer, l2cap_chan_timeout);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300441
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300442 chan->state = BT_OPEN;
443
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530444 kref_init(&chan->kref);
Gustavo F. Padovan71ba0e52011-05-17 14:34:52 -0300445
Mat Martineau28270112012-05-17 21:14:09 -0700446 /* This flag is cleared in l2cap_chan_ready() */
447 set_bit(CONF_NOT_COMPLETE, &chan->conf_state);
448
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -0300449 BT_DBG("chan %p", chan);
Szymon Jancabc545b2011-11-03 16:05:44 +0100450
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300451 return chan;
Marcel Holtmann01394182006-07-03 10:02:46 +0200452}
453
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530454static void l2cap_chan_destroy(struct kref *kref)
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300455{
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530456 struct l2cap_chan *chan = container_of(kref, struct l2cap_chan, kref);
457
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +0530458 BT_DBG("chan %p", chan);
459
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200460 write_lock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300461 list_del(&chan->global_l);
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200462 write_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300463
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +0530464 kfree(chan);
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300465}
466
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530467void l2cap_chan_hold(struct l2cap_chan *c)
468{
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530469 BT_DBG("chan %p orig refcnt %d", c, atomic_read(&c->kref.refcount));
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530470
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530471 kref_get(&c->kref);
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530472}
473
474void l2cap_chan_put(struct l2cap_chan *c)
475{
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530476 BT_DBG("chan %p orig refcnt %d", c, atomic_read(&c->kref.refcount));
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530477
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530478 kref_put(&c->kref, l2cap_chan_destroy);
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530479}
480
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300481void l2cap_chan_set_defaults(struct l2cap_chan *chan)
482{
483 chan->fcs = L2CAP_FCS_CRC16;
484 chan->max_tx = L2CAP_DEFAULT_MAX_TX;
485 chan->tx_win = L2CAP_DEFAULT_TX_WINDOW;
486 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
Mat Martineauc20f8e32012-07-10 05:47:07 -0700487 chan->ack_win = L2CAP_DEFAULT_TX_WINDOW;
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300488 chan->sec_level = BT_SECURITY_LOW;
489
490 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
491}
492
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +0300493void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
Marcel Holtmann01394182006-07-03 10:02:46 +0200494{
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -0300495 BT_DBG("conn %p, psm 0x%2.2x, dcid 0x%4.4x", conn,
Andrei Emeltchenko097db762012-03-09 14:16:17 +0200496 __le16_to_cpu(chan->psm), chan->dcid);
Marcel Holtmann01394182006-07-03 10:02:46 +0200497
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +0200498 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
Marcel Holtmann2950f212009-02-12 14:02:50 +0100499
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300500 chan->conn = conn;
Marcel Holtmann01394182006-07-03 10:02:46 +0200501
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200502 switch (chan->chan_type) {
503 case L2CAP_CHAN_CONN_ORIENTED:
Ville Tervob62f3282011-02-10 22:38:50 -0300504 if (conn->hcon->type == LE_LINK) {
505 /* LE connection */
Andre Guedes6fcb06a2012-05-31 17:01:33 -0300506 chan->omtu = L2CAP_DEFAULT_MTU;
Johan Hedberg9f22398c2013-04-29 19:35:38 +0300507 if (chan->dcid == L2CAP_CID_ATT)
508 chan->scid = L2CAP_CID_ATT;
509 else
510 chan->scid = l2cap_alloc_cid(conn);
Ville Tervob62f3282011-02-10 22:38:50 -0300511 } else {
512 /* Alloc CID for connection-oriented socket */
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300513 chan->scid = l2cap_alloc_cid(conn);
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300514 chan->omtu = L2CAP_DEFAULT_MTU;
Ville Tervob62f3282011-02-10 22:38:50 -0300515 }
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200516 break;
517
518 case L2CAP_CHAN_CONN_LESS:
Marcel Holtmann01394182006-07-03 10:02:46 +0200519 /* Connectionless socket */
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300520 chan->scid = L2CAP_CID_CONN_LESS;
521 chan->dcid = L2CAP_CID_CONN_LESS;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300522 chan->omtu = L2CAP_DEFAULT_MTU;
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200523 break;
524
Andrei Emeltchenko416fa752012-05-29 13:59:16 +0300525 case L2CAP_CHAN_CONN_FIX_A2MP:
526 chan->scid = L2CAP_CID_A2MP;
527 chan->dcid = L2CAP_CID_A2MP;
528 chan->omtu = L2CAP_A2MP_DEFAULT_MTU;
529 chan->imtu = L2CAP_A2MP_DEFAULT_MTU;
530 break;
531
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200532 default:
Marcel Holtmann01394182006-07-03 10:02:46 +0200533 /* Raw socket can send/recv signalling messages only */
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300534 chan->scid = L2CAP_CID_SIGNALING;
535 chan->dcid = L2CAP_CID_SIGNALING;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300536 chan->omtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann01394182006-07-03 10:02:46 +0200537 }
538
Andrei Emeltchenko8f7975b2011-10-13 16:18:54 +0300539 chan->local_id = L2CAP_BESTEFFORT_ID;
540 chan->local_stype = L2CAP_SERV_BESTEFFORT;
541 chan->local_msdu = L2CAP_DEFAULT_MAX_SDU_SIZE;
542 chan->local_sdu_itime = L2CAP_DEFAULT_SDU_ITIME;
543 chan->local_acc_lat = L2CAP_DEFAULT_ACC_LAT;
Andrei Emeltchenko8936fa62012-10-08 11:14:41 +0300544 chan->local_flush_to = L2CAP_EFS_DEFAULT_FLUSH_TO;
Andrei Emeltchenko8f7975b2011-10-13 16:18:54 +0300545
Ulisses Furquim371fd832011-12-21 20:02:36 -0200546 l2cap_chan_hold(chan);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300547
Johan Hedberg5ee98912013-04-29 19:35:43 +0300548 hci_conn_hold(conn->hcon);
549
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200550 list_add(&chan->list, &conn->chan_l);
Andrei Emeltchenko643162a2012-02-22 17:11:55 +0200551}
552
Andrei Emeltchenko466f8002012-05-29 13:59:01 +0300553void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
Andrei Emeltchenko643162a2012-02-22 17:11:55 +0200554{
555 mutex_lock(&conn->chan_lock);
556 __l2cap_chan_add(conn, chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200557 mutex_unlock(&conn->chan_lock);
Marcel Holtmann01394182006-07-03 10:02:46 +0200558}
559
Andrei Emeltchenko466f8002012-05-29 13:59:01 +0300560void l2cap_chan_del(struct l2cap_chan *chan, int err)
Marcel Holtmann01394182006-07-03 10:02:46 +0200561{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300562 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann01394182006-07-03 10:02:46 +0200563
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -0300564 __clear_chan_timer(chan);
Marcel Holtmann01394182006-07-03 10:02:46 +0200565
Gustavo F. Padovan49208c92011-04-04 15:59:54 -0300566 BT_DBG("chan %p, conn %p, err %d", chan, conn, err);
Marcel Holtmann01394182006-07-03 10:02:46 +0200567
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900568 if (conn) {
Andrei Emeltchenko56f60982012-10-15 11:58:44 +0300569 struct amp_mgr *mgr = conn->hcon->amp_mgr;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300570 /* Delete from channel list */
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200571 list_del(&chan->list);
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -0200572
Ulisses Furquim371fd832011-12-21 20:02:36 -0200573 l2cap_chan_put(chan);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300574
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300575 chan->conn = NULL;
Andrei Emeltchenko3cabbfd2012-05-31 11:01:37 +0300576
577 if (chan->chan_type != L2CAP_CHAN_CONN_FIX_A2MP)
David Herrmann76a68ba2013-04-06 20:28:37 +0200578 hci_conn_drop(conn->hcon);
Andrei Emeltchenko56f60982012-10-15 11:58:44 +0300579
580 if (mgr && mgr->bredr_chan == chan)
581 mgr->bredr_chan = NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200582 }
583
Andrei Emeltchenko419e08c2012-10-31 15:46:34 +0200584 if (chan->hs_hchan) {
585 struct hci_chan *hs_hchan = chan->hs_hchan;
586
587 BT_DBG("chan %p disconnect hs_hchan %p", chan, hs_hchan);
588 amp_disconnect_logical_link(hs_hchan);
589 }
590
Gustavo Padovanb699ec02012-10-06 11:51:54 +0100591 chan->ops->teardown(chan, err);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200592
Mat Martineau28270112012-05-17 21:14:09 -0700593 if (test_bit(CONF_NOT_COMPLETE, &chan->conf_state))
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300594 return;
Gustavo F. Padovan2ead70b2011-04-01 15:13:36 -0300595
Gustavo Padovanee556f62012-05-18 20:22:38 -0300596 switch(chan->mode) {
597 case L2CAP_MODE_BASIC:
598 break;
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300599
Gustavo Padovanee556f62012-05-18 20:22:38 -0300600 case L2CAP_MODE_ERTM:
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -0300601 __clear_retrans_timer(chan);
602 __clear_monitor_timer(chan);
603 __clear_ack_timer(chan);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300604
Gustavo F. Padovanf1c67752011-03-25 20:36:10 -0300605 skb_queue_purge(&chan->srej_q);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300606
Mat Martineau3c588192012-04-11 10:48:42 -0700607 l2cap_seq_list_free(&chan->srej_list);
608 l2cap_seq_list_free(&chan->retrans_list);
Gustavo Padovanee556f62012-05-18 20:22:38 -0300609
610 /* fall through */
611
612 case L2CAP_MODE_STREAMING:
613 skb_queue_purge(&chan->tx_q);
614 break;
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300615 }
Gustavo Padovanee556f62012-05-18 20:22:38 -0300616
617 return;
Marcel Holtmann01394182006-07-03 10:02:46 +0200618}
619
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300620void l2cap_chan_close(struct l2cap_chan *chan, int reason)
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300621{
622 struct l2cap_conn *conn = chan->conn;
623 struct sock *sk = chan->sk;
624
Gustavo Padovan2d792812012-10-06 10:07:01 +0100625 BT_DBG("chan %p state %s sk %p", chan, state_to_string(chan->state),
626 sk);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300627
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300628 switch (chan->state) {
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300629 case BT_LISTEN:
Gustavo Padovanb699ec02012-10-06 11:51:54 +0100630 chan->ops->teardown(chan, 0);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300631 break;
632
633 case BT_CONNECTED:
634 case BT_CONFIG:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300635 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100636 conn->hcon->type == ACL_LINK) {
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -0300637 __set_chan_timer(chan, sk->sk_sndtimeo);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +0200638 l2cap_send_disconn_req(chan, reason);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300639 } else
640 l2cap_chan_del(chan, reason);
641 break;
642
643 case BT_CONNECT2:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300644 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100645 conn->hcon->type == ACL_LINK) {
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300646 struct l2cap_conn_rsp rsp;
647 __u16 result;
648
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300649 if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300650 result = L2CAP_CR_SEC_BLOCK;
651 else
652 result = L2CAP_CR_BAD_PSM;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300653 l2cap_state_change(chan, BT_DISCONN);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300654
655 rsp.scid = cpu_to_le16(chan->dcid);
656 rsp.dcid = cpu_to_le16(chan->scid);
657 rsp.result = cpu_to_le16(result);
Andrei Emeltchenkoac734982012-05-24 15:42:51 +0300658 rsp.status = __constant_cpu_to_le16(L2CAP_CS_NO_INFO);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300659 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100660 sizeof(rsp), &rsp);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300661 }
662
663 l2cap_chan_del(chan, reason);
664 break;
665
666 case BT_CONNECT:
667 case BT_DISCONN:
668 l2cap_chan_del(chan, reason);
669 break;
670
671 default:
Gustavo Padovanb699ec02012-10-06 11:51:54 +0100672 chan->ops->teardown(chan, 0);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300673 break;
674 }
675}
676
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300677static inline u8 l2cap_get_auth_type(struct l2cap_chan *chan)
Johan Hedberg8556edd32011-01-19 12:06:50 +0530678{
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300679 if (chan->chan_type == L2CAP_CHAN_RAW) {
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300680 switch (chan->sec_level) {
Johan Hedberg8556edd32011-01-19 12:06:50 +0530681 case BT_SECURITY_HIGH:
682 return HCI_AT_DEDICATED_BONDING_MITM;
683 case BT_SECURITY_MEDIUM:
684 return HCI_AT_DEDICATED_BONDING;
685 default:
686 return HCI_AT_NO_BONDING;
687 }
Andrei Emeltchenko2983fd62012-05-24 15:42:50 +0300688 } else if (chan->psm == __constant_cpu_to_le16(L2CAP_PSM_SDP)) {
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300689 if (chan->sec_level == BT_SECURITY_LOW)
690 chan->sec_level = BT_SECURITY_SDP;
Johan Hedberg8556edd32011-01-19 12:06:50 +0530691
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300692 if (chan->sec_level == BT_SECURITY_HIGH)
Johan Hedberg8556edd32011-01-19 12:06:50 +0530693 return HCI_AT_NO_BONDING_MITM;
694 else
695 return HCI_AT_NO_BONDING;
696 } else {
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300697 switch (chan->sec_level) {
Johan Hedberg8556edd32011-01-19 12:06:50 +0530698 case BT_SECURITY_HIGH:
699 return HCI_AT_GENERAL_BONDING_MITM;
700 case BT_SECURITY_MEDIUM:
701 return HCI_AT_GENERAL_BONDING;
702 default:
703 return HCI_AT_NO_BONDING;
704 }
705 }
706}
707
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200708/* Service level security */
Gustavo F. Padovand45fc422011-11-05 19:54:24 -0200709int l2cap_chan_check_security(struct l2cap_chan *chan)
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200710{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300711 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100712 __u8 auth_type;
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200713
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300714 auth_type = l2cap_get_auth_type(chan);
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100715
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300716 return hci_conn_security(conn->hcon, chan->sec_level, auth_type);
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200717}
718
Johannes Bergb5ad8b72011-06-01 08:54:45 +0200719static u8 l2cap_get_ident(struct l2cap_conn *conn)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200720{
721 u8 id;
722
723 /* Get next available identificator.
724 * 1 - 128 are used by kernel.
725 * 129 - 199 are reserved.
726 * 200 - 254 are used by utilities like l2ping, etc.
727 */
728
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200729 spin_lock(&conn->lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200730
731 if (++conn->tx_ident > 128)
732 conn->tx_ident = 1;
733
734 id = conn->tx_ident;
735
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200736 spin_unlock(&conn->lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200737
738 return id;
739}
740
Gustavo Padovan2d792812012-10-06 10:07:01 +0100741static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len,
742 void *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200743{
744 struct sk_buff *skb = l2cap_build_cmd(conn, code, ident, len, data);
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +0200745 u8 flags;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200746
747 BT_DBG("code 0x%2.2x", code);
748
749 if (!skb)
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -0300750 return;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200751
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +0200752 if (lmp_no_flush_capable(conn->hcon->hdev))
753 flags = ACL_START_NO_FLUSH;
754 else
755 flags = ACL_START;
756
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700757 bt_cb(skb)->force_active = BT_POWER_FORCE_ACTIVE_ON;
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +0200758 skb->priority = HCI_PRIO_MAX;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700759
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200760 hci_send_acl(conn->hchan, skb, flags);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200761}
762
Mat Martineau02b0fbb2012-10-23 15:24:10 -0700763static bool __chan_is_moving(struct l2cap_chan *chan)
764{
765 return chan->move_state != L2CAP_MOVE_STABLE &&
766 chan->move_state != L2CAP_MOVE_WAIT_PREPARE;
767}
768
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200769static void l2cap_do_send(struct l2cap_chan *chan, struct sk_buff *skb)
770{
771 struct hci_conn *hcon = chan->conn->hcon;
772 u16 flags;
773
774 BT_DBG("chan %p, skb %p len %d priority %u", chan, skb, skb->len,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100775 skb->priority);
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200776
Mat Martineaud5f8a752012-10-23 15:24:18 -0700777 if (chan->hs_hcon && !__chan_is_moving(chan)) {
778 if (chan->hs_hchan)
779 hci_send_acl(chan->hs_hchan, skb, ACL_COMPLETE);
780 else
781 kfree_skb(skb);
782
783 return;
784 }
785
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200786 if (!test_bit(FLAG_FLUSHABLE, &chan->flags) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100787 lmp_no_flush_capable(hcon->hdev))
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200788 flags = ACL_START_NO_FLUSH;
789 else
790 flags = ACL_START;
791
792 bt_cb(skb)->force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
793 hci_send_acl(chan->conn->hchan, skb, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700794}
795
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700796static void __unpack_enhanced_control(u16 enh, struct l2cap_ctrl *control)
797{
798 control->reqseq = (enh & L2CAP_CTRL_REQSEQ) >> L2CAP_CTRL_REQSEQ_SHIFT;
799 control->final = (enh & L2CAP_CTRL_FINAL) >> L2CAP_CTRL_FINAL_SHIFT;
800
801 if (enh & L2CAP_CTRL_FRAME_TYPE) {
802 /* S-Frame */
803 control->sframe = 1;
804 control->poll = (enh & L2CAP_CTRL_POLL) >> L2CAP_CTRL_POLL_SHIFT;
805 control->super = (enh & L2CAP_CTRL_SUPERVISE) >> L2CAP_CTRL_SUPER_SHIFT;
806
807 control->sar = 0;
808 control->txseq = 0;
809 } else {
810 /* I-Frame */
811 control->sframe = 0;
812 control->sar = (enh & L2CAP_CTRL_SAR) >> L2CAP_CTRL_SAR_SHIFT;
813 control->txseq = (enh & L2CAP_CTRL_TXSEQ) >> L2CAP_CTRL_TXSEQ_SHIFT;
814
815 control->poll = 0;
816 control->super = 0;
817 }
818}
819
820static void __unpack_extended_control(u32 ext, struct l2cap_ctrl *control)
821{
822 control->reqseq = (ext & L2CAP_EXT_CTRL_REQSEQ) >> L2CAP_EXT_CTRL_REQSEQ_SHIFT;
823 control->final = (ext & L2CAP_EXT_CTRL_FINAL) >> L2CAP_EXT_CTRL_FINAL_SHIFT;
824
825 if (ext & L2CAP_EXT_CTRL_FRAME_TYPE) {
826 /* S-Frame */
827 control->sframe = 1;
828 control->poll = (ext & L2CAP_EXT_CTRL_POLL) >> L2CAP_EXT_CTRL_POLL_SHIFT;
829 control->super = (ext & L2CAP_EXT_CTRL_SUPERVISE) >> L2CAP_EXT_CTRL_SUPER_SHIFT;
830
831 control->sar = 0;
832 control->txseq = 0;
833 } else {
834 /* I-Frame */
835 control->sframe = 0;
836 control->sar = (ext & L2CAP_EXT_CTRL_SAR) >> L2CAP_EXT_CTRL_SAR_SHIFT;
837 control->txseq = (ext & L2CAP_EXT_CTRL_TXSEQ) >> L2CAP_EXT_CTRL_TXSEQ_SHIFT;
838
839 control->poll = 0;
840 control->super = 0;
841 }
842}
843
844static inline void __unpack_control(struct l2cap_chan *chan,
845 struct sk_buff *skb)
846{
847 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
848 __unpack_extended_control(get_unaligned_le32(skb->data),
849 &bt_cb(skb)->control);
Mat Martineaucec8ab6e2012-05-17 20:53:36 -0700850 skb_pull(skb, L2CAP_EXT_CTRL_SIZE);
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700851 } else {
852 __unpack_enhanced_control(get_unaligned_le16(skb->data),
853 &bt_cb(skb)->control);
Mat Martineaucec8ab6e2012-05-17 20:53:36 -0700854 skb_pull(skb, L2CAP_ENH_CTRL_SIZE);
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700855 }
856}
857
858static u32 __pack_extended_control(struct l2cap_ctrl *control)
859{
860 u32 packed;
861
862 packed = control->reqseq << L2CAP_EXT_CTRL_REQSEQ_SHIFT;
863 packed |= control->final << L2CAP_EXT_CTRL_FINAL_SHIFT;
864
865 if (control->sframe) {
866 packed |= control->poll << L2CAP_EXT_CTRL_POLL_SHIFT;
867 packed |= control->super << L2CAP_EXT_CTRL_SUPER_SHIFT;
868 packed |= L2CAP_EXT_CTRL_FRAME_TYPE;
869 } else {
870 packed |= control->sar << L2CAP_EXT_CTRL_SAR_SHIFT;
871 packed |= control->txseq << L2CAP_EXT_CTRL_TXSEQ_SHIFT;
872 }
873
874 return packed;
875}
876
877static u16 __pack_enhanced_control(struct l2cap_ctrl *control)
878{
879 u16 packed;
880
881 packed = control->reqseq << L2CAP_CTRL_REQSEQ_SHIFT;
882 packed |= control->final << L2CAP_CTRL_FINAL_SHIFT;
883
884 if (control->sframe) {
885 packed |= control->poll << L2CAP_CTRL_POLL_SHIFT;
886 packed |= control->super << L2CAP_CTRL_SUPER_SHIFT;
887 packed |= L2CAP_CTRL_FRAME_TYPE;
888 } else {
889 packed |= control->sar << L2CAP_CTRL_SAR_SHIFT;
890 packed |= control->txseq << L2CAP_CTRL_TXSEQ_SHIFT;
891 }
892
893 return packed;
894}
895
896static inline void __pack_control(struct l2cap_chan *chan,
897 struct l2cap_ctrl *control,
898 struct sk_buff *skb)
899{
900 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
901 put_unaligned_le32(__pack_extended_control(control),
902 skb->data + L2CAP_HDR_SIZE);
903 } else {
904 put_unaligned_le16(__pack_enhanced_control(control),
905 skb->data + L2CAP_HDR_SIZE);
906 }
907}
908
Gustavo Padovanba7aa642012-05-29 13:29:16 -0300909static inline unsigned int __ertm_hdr_size(struct l2cap_chan *chan)
910{
911 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
912 return L2CAP_EXT_HDR_SIZE;
913 else
914 return L2CAP_ENH_HDR_SIZE;
915}
916
Mat Martineaua67d7f62012-05-17 20:53:35 -0700917static struct sk_buff *l2cap_create_sframe_pdu(struct l2cap_chan *chan,
918 u32 control)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300919{
920 struct sk_buff *skb;
921 struct l2cap_hdr *lh;
Gustavo Padovanba7aa642012-05-29 13:29:16 -0300922 int hlen = __ertm_hdr_size(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300923
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300924 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +0300925 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300926
Mat Martineaua67d7f62012-05-17 20:53:35 -0700927 skb = bt_skb_alloc(hlen, GFP_KERNEL);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300928
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300929 if (!skb)
Mat Martineaua67d7f62012-05-17 20:53:35 -0700930 return ERR_PTR(-ENOMEM);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300931
932 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -0300933 lh->len = cpu_to_le16(hlen - L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300934 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +0300935
Mat Martineaua67d7f62012-05-17 20:53:35 -0700936 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
937 put_unaligned_le32(control, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
938 else
939 put_unaligned_le16(control, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300940
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300941 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineaua67d7f62012-05-17 20:53:35 -0700942 u16 fcs = crc16(0, (u8 *)skb->data, skb->len);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +0300943 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -0300944 }
945
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200946 skb->priority = HCI_PRIO_MAX;
Mat Martineaua67d7f62012-05-17 20:53:35 -0700947 return skb;
948}
949
950static void l2cap_send_sframe(struct l2cap_chan *chan,
951 struct l2cap_ctrl *control)
952{
953 struct sk_buff *skb;
954 u32 control_field;
955
956 BT_DBG("chan %p, control %p", chan, control);
957
958 if (!control->sframe)
959 return;
960
Mat Martineaub99e13a2012-10-23 15:24:19 -0700961 if (__chan_is_moving(chan))
962 return;
963
Mat Martineaua67d7f62012-05-17 20:53:35 -0700964 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state) &&
965 !control->poll)
966 control->final = 1;
967
968 if (control->super == L2CAP_SUPER_RR)
969 clear_bit(CONN_RNR_SENT, &chan->conn_state);
970 else if (control->super == L2CAP_SUPER_RNR)
971 set_bit(CONN_RNR_SENT, &chan->conn_state);
972
973 if (control->super != L2CAP_SUPER_SREJ) {
974 chan->last_acked_seq = control->reqseq;
975 __clear_ack_timer(chan);
976 }
977
978 BT_DBG("reqseq %d, final %d, poll %d, super %d", control->reqseq,
979 control->final, control->poll, control->super);
980
981 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
982 control_field = __pack_extended_control(control);
983 else
984 control_field = __pack_enhanced_control(control);
985
986 skb = l2cap_create_sframe_pdu(chan, control_field);
987 if (!IS_ERR(skb))
988 l2cap_do_send(chan, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300989}
990
Mat Martineauc9e3d5e2012-05-17 20:53:48 -0700991static void l2cap_send_rr_or_rnr(struct l2cap_chan *chan, bool poll)
Gustavo F. Padovan7e743092009-08-26 04:04:03 -0300992{
Mat Martineauc9e3d5e2012-05-17 20:53:48 -0700993 struct l2cap_ctrl control;
Gustavo F. Padovan7e743092009-08-26 04:04:03 -0300994
Mat Martineauc9e3d5e2012-05-17 20:53:48 -0700995 BT_DBG("chan %p, poll %d", chan, poll);
996
997 memset(&control, 0, sizeof(control));
998 control.sframe = 1;
999 control.poll = poll;
1000
1001 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
1002 control.super = L2CAP_SUPER_RNR;
1003 else
1004 control.super = L2CAP_SUPER_RR;
1005
1006 control.reqseq = chan->buffer_seq;
1007 l2cap_send_sframe(chan, &control);
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001008}
1009
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001010static inline int __l2cap_no_conn_pending(struct l2cap_chan *chan)
Andrei Emeltchenkoe501d052010-07-08 12:14:41 +03001011{
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001012 return !test_bit(CONF_CONNECT_PEND, &chan->conf_state);
Andrei Emeltchenkoe501d052010-07-08 12:14:41 +03001013}
1014
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001015static bool __amp_capable(struct l2cap_chan *chan)
1016{
1017 struct l2cap_conn *conn = chan->conn;
1018
Marcel Holtmann848566b2013-10-01 22:59:22 -07001019 if (conn->hs_enabled && hci_amp_capable() &&
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001020 chan->chan_policy == BT_CHANNEL_POLICY_AMP_PREFERRED &&
1021 conn->fixed_chan_mask & L2CAP_FC_A2MP)
1022 return true;
Marcel Holtmann848566b2013-10-01 22:59:22 -07001023
1024 return false;
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001025}
1026
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02001027static bool l2cap_check_efs(struct l2cap_chan *chan)
1028{
1029 /* Check EFS parameters */
1030 return true;
1031}
1032
Andrei Emeltchenko2766be42012-09-27 17:26:21 +03001033void l2cap_send_conn_req(struct l2cap_chan *chan)
Andrei Emeltchenko9b27f352012-02-24 16:00:00 +02001034{
1035 struct l2cap_conn *conn = chan->conn;
1036 struct l2cap_conn_req req;
1037
1038 req.scid = cpu_to_le16(chan->scid);
1039 req.psm = chan->psm;
1040
1041 chan->ident = l2cap_get_ident(conn);
1042
1043 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
1044
1045 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_REQ, sizeof(req), &req);
1046}
1047
Mat Martineau8eb200b2012-10-23 15:24:17 -07001048static void l2cap_send_create_chan_req(struct l2cap_chan *chan, u8 amp_id)
1049{
1050 struct l2cap_create_chan_req req;
1051 req.scid = cpu_to_le16(chan->scid);
1052 req.psm = chan->psm;
1053 req.amp_id = amp_id;
1054
1055 chan->ident = l2cap_get_ident(chan->conn);
1056
1057 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_REQ,
1058 sizeof(req), &req);
1059}
1060
Mat Martineau02b0fbb2012-10-23 15:24:10 -07001061static void l2cap_move_setup(struct l2cap_chan *chan)
1062{
1063 struct sk_buff *skb;
1064
1065 BT_DBG("chan %p", chan);
1066
1067 if (chan->mode != L2CAP_MODE_ERTM)
1068 return;
1069
1070 __clear_retrans_timer(chan);
1071 __clear_monitor_timer(chan);
1072 __clear_ack_timer(chan);
1073
1074 chan->retry_count = 0;
1075 skb_queue_walk(&chan->tx_q, skb) {
1076 if (bt_cb(skb)->control.retries)
1077 bt_cb(skb)->control.retries = 1;
1078 else
1079 break;
1080 }
1081
1082 chan->expected_tx_seq = chan->buffer_seq;
1083
1084 clear_bit(CONN_REJ_ACT, &chan->conn_state);
1085 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
1086 l2cap_seq_list_clear(&chan->retrans_list);
1087 l2cap_seq_list_clear(&chan->srej_list);
1088 skb_queue_purge(&chan->srej_q);
1089
1090 chan->tx_state = L2CAP_TX_STATE_XMIT;
1091 chan->rx_state = L2CAP_RX_STATE_MOVE;
1092
1093 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
1094}
1095
Mat Martineau5f3847a2012-10-23 15:24:12 -07001096static void l2cap_move_done(struct l2cap_chan *chan)
1097{
1098 u8 move_role = chan->move_role;
1099 BT_DBG("chan %p", chan);
1100
1101 chan->move_state = L2CAP_MOVE_STABLE;
1102 chan->move_role = L2CAP_MOVE_ROLE_NONE;
1103
1104 if (chan->mode != L2CAP_MODE_ERTM)
1105 return;
1106
1107 switch (move_role) {
1108 case L2CAP_MOVE_ROLE_INITIATOR:
1109 l2cap_tx(chan, NULL, NULL, L2CAP_EV_EXPLICIT_POLL);
1110 chan->rx_state = L2CAP_RX_STATE_WAIT_F;
1111 break;
1112 case L2CAP_MOVE_ROLE_RESPONDER:
1113 chan->rx_state = L2CAP_RX_STATE_WAIT_P;
1114 break;
1115 }
1116}
1117
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001118static void l2cap_chan_ready(struct l2cap_chan *chan)
1119{
Mat Martineau28270112012-05-17 21:14:09 -07001120 /* This clears all conf flags, including CONF_NOT_COMPLETE */
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001121 chan->conf_state = 0;
1122 __clear_chan_timer(chan);
1123
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001124 chan->state = BT_CONNECTED;
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001125
Andrei Emeltchenkofd83e2c2012-05-30 09:55:32 +03001126 chan->ops->ready(chan);
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001127}
1128
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001129static void l2cap_start_connection(struct l2cap_chan *chan)
1130{
1131 if (__amp_capable(chan)) {
1132 BT_DBG("chan %p AMP capable: discover AMPs", chan);
1133 a2mp_discover_amp(chan);
1134 } else {
1135 l2cap_send_conn_req(chan);
1136 }
1137}
1138
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001139static void l2cap_do_start(struct l2cap_chan *chan)
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001140{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03001141 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001142
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001143 if (conn->hcon->type == LE_LINK) {
1144 l2cap_chan_ready(chan);
1145 return;
1146 }
1147
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001148 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) {
Marcel Holtmann984947d2009-02-06 23:35:19 +01001149 if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE))
1150 return;
1151
Gustavo F. Padovand45fc422011-11-05 19:54:24 -02001152 if (l2cap_chan_check_security(chan) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01001153 __l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001154 l2cap_start_connection(chan);
1155 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001156 } else {
1157 struct l2cap_info_req req;
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03001158 req.type = __constant_cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001159
1160 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
1161 conn->info_ident = l2cap_get_ident(conn);
1162
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08001163 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001164
Gustavo Padovan2d792812012-10-06 10:07:01 +01001165 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
1166 sizeof(req), &req);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001167 }
1168}
1169
Gustavo F. Padovancf6c2c02010-06-07 20:54:45 -03001170static inline int l2cap_mode_supported(__u8 mode, __u32 feat_mask)
1171{
1172 u32 local_feat_mask = l2cap_feat_mask;
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03001173 if (!disable_ertm)
Gustavo F. Padovancf6c2c02010-06-07 20:54:45 -03001174 local_feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING;
1175
1176 switch (mode) {
1177 case L2CAP_MODE_ERTM:
1178 return L2CAP_FEAT_ERTM & feat_mask & local_feat_mask;
1179 case L2CAP_MODE_STREAMING:
1180 return L2CAP_FEAT_STREAMING & feat_mask & local_feat_mask;
1181 default:
1182 return 0x00;
1183 }
1184}
1185
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001186static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err)
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001187{
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001188 struct sock *sk = chan->sk;
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001189 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001190 struct l2cap_disconn_req req;
1191
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001192 if (!conn)
1193 return;
1194
Andrei Emeltchenkoaad3d0e2012-09-06 15:05:42 +03001195 if (chan->mode == L2CAP_MODE_ERTM && chan->state == BT_CONNECTED) {
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03001196 __clear_retrans_timer(chan);
1197 __clear_monitor_timer(chan);
1198 __clear_ack_timer(chan);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001199 }
1200
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001201 if (chan->chan_type == L2CAP_CHAN_CONN_FIX_A2MP) {
Gustavo Padovand1177732012-10-06 11:47:38 +01001202 l2cap_state_change(chan, BT_DISCONN);
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001203 return;
1204 }
1205
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001206 req.dcid = cpu_to_le16(chan->dcid);
1207 req.scid = cpu_to_le16(chan->scid);
Gustavo Padovan2d792812012-10-06 10:07:01 +01001208 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_DISCONN_REQ,
1209 sizeof(req), &req);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001210
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001211 lock_sock(sk);
Andrei Emeltchenko0e587be2012-02-21 12:54:57 +02001212 __l2cap_state_change(chan, BT_DISCONN);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +02001213 __l2cap_chan_set_err(chan, err);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001214 release_sock(sk);
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001215}
1216
Linus Torvalds1da177e2005-04-16 15:20:36 -07001217/* ---- L2CAP connections ---- */
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001218static void l2cap_conn_start(struct l2cap_conn *conn)
1219{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001220 struct l2cap_chan *chan, *tmp;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001221
1222 BT_DBG("conn %p", conn);
1223
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001224 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001225
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001226 list_for_each_entry_safe(chan, tmp, &conn->chan_l, list) {
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001227 struct sock *sk = chan->sk;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03001228
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001229 l2cap_chan_lock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001230
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001231 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001232 l2cap_chan_unlock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001233 continue;
1234 }
1235
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001236 if (chan->state == BT_CONNECT) {
Gustavo F. Padovand45fc422011-11-05 19:54:24 -02001237 if (!l2cap_chan_check_security(chan) ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01001238 !__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001239 l2cap_chan_unlock(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001240 continue;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02001241 }
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001242
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001243 if (!l2cap_mode_supported(chan->mode, conn->feat_mask)
Gustavo Padovan2d792812012-10-06 10:07:01 +01001244 && test_bit(CONF_STATE2_DEVICE,
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001245 &chan->conf_state)) {
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001246 l2cap_chan_close(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001247 l2cap_chan_unlock(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001248 continue;
1249 }
1250
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001251 l2cap_start_connection(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001252
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001253 } else if (chan->state == BT_CONNECT2) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001254 struct l2cap_conn_rsp rsp;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001255 char buf[128];
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001256 rsp.scid = cpu_to_le16(chan->dcid);
1257 rsp.dcid = cpu_to_le16(chan->scid);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001258
Gustavo F. Padovand45fc422011-11-05 19:54:24 -02001259 if (l2cap_chan_check_security(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001260 lock_sock(sk);
Gustavo Padovanc5daa682012-05-16 12:17:10 -03001261 if (test_bit(BT_SK_DEFER_SETUP,
1262 &bt_sk(sk)->flags)) {
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03001263 rsp.result = __constant_cpu_to_le16(L2CAP_CR_PEND);
1264 rsp.status = __constant_cpu_to_le16(L2CAP_CS_AUTHOR_PEND);
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001265 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001266
1267 } else {
Andrei Emeltchenko0e587be2012-02-21 12:54:57 +02001268 __l2cap_state_change(chan, BT_CONFIG);
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03001269 rsp.result = __constant_cpu_to_le16(L2CAP_CR_SUCCESS);
1270 rsp.status = __constant_cpu_to_le16(L2CAP_CS_NO_INFO);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001271 }
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001272 release_sock(sk);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001273 } else {
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03001274 rsp.result = __constant_cpu_to_le16(L2CAP_CR_PEND);
1275 rsp.status = __constant_cpu_to_le16(L2CAP_CS_AUTHEN_PEND);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001276 }
1277
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001278 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001279 sizeof(rsp), &rsp);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001280
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001281 if (test_bit(CONF_REQ_SENT, &chan->conf_state) ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01001282 rsp.result != L2CAP_CR_SUCCESS) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001283 l2cap_chan_unlock(chan);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001284 continue;
1285 }
1286
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001287 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001288 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001289 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03001290 chan->num_conf_req++;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001291 }
1292
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001293 l2cap_chan_unlock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001294 }
1295
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001296 mutex_unlock(&conn->chan_lock);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001297}
1298
Ido Yarivc2287682012-04-20 15:46:07 -03001299/* Find socket with cid and source/destination bdaddr.
Ville Tervob62f3282011-02-10 22:38:50 -03001300 * Returns closest match, locked.
1301 */
Andrei Emeltchenkod9b88702012-03-12 12:13:08 +02001302static struct l2cap_chan *l2cap_global_chan_by_scid(int state, u16 cid,
Ido Yarivc2287682012-04-20 15:46:07 -03001303 bdaddr_t *src,
1304 bdaddr_t *dst)
Ville Tervob62f3282011-02-10 22:38:50 -03001305{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001306 struct l2cap_chan *c, *c1 = NULL;
Ville Tervob62f3282011-02-10 22:38:50 -03001307
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001308 read_lock(&chan_list_lock);
Ville Tervob62f3282011-02-10 22:38:50 -03001309
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001310 list_for_each_entry(c, &chan_list, global_l) {
1311 struct sock *sk = c->sk;
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001312
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001313 if (state && c->state != state)
Ville Tervob62f3282011-02-10 22:38:50 -03001314 continue;
1315
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001316 if (c->scid == cid) {
Ido Yarivc2287682012-04-20 15:46:07 -03001317 int src_match, dst_match;
1318 int src_any, dst_any;
1319
Ville Tervob62f3282011-02-10 22:38:50 -03001320 /* Exact match. */
Ido Yarivc2287682012-04-20 15:46:07 -03001321 src_match = !bacmp(&bt_sk(sk)->src, src);
1322 dst_match = !bacmp(&bt_sk(sk)->dst, dst);
1323 if (src_match && dst_match) {
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001324 read_unlock(&chan_list_lock);
1325 return c;
1326 }
Ville Tervob62f3282011-02-10 22:38:50 -03001327
1328 /* Closest match */
Ido Yarivc2287682012-04-20 15:46:07 -03001329 src_any = !bacmp(&bt_sk(sk)->src, BDADDR_ANY);
1330 dst_any = !bacmp(&bt_sk(sk)->dst, BDADDR_ANY);
1331 if ((src_match && dst_any) || (src_any && dst_match) ||
1332 (src_any && dst_any))
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001333 c1 = c;
Ville Tervob62f3282011-02-10 22:38:50 -03001334 }
1335 }
Gustavo F. Padovan280f2942011-04-13 19:01:22 -03001336
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001337 read_unlock(&chan_list_lock);
Ville Tervob62f3282011-02-10 22:38:50 -03001338
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001339 return c1;
Ville Tervob62f3282011-02-10 22:38:50 -03001340}
1341
1342static void l2cap_le_conn_ready(struct l2cap_conn *conn)
1343{
Johan Hedberg60bac182013-04-29 19:35:41 +03001344 struct sock *parent;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001345 struct l2cap_chan *chan, *pchan;
Ville Tervob62f3282011-02-10 22:38:50 -03001346
1347 BT_DBG("");
1348
1349 /* Check if we have socket listening on cid */
Johan Hedberg073d1cf2013-04-29 19:35:35 +03001350 pchan = l2cap_global_chan_by_scid(BT_LISTEN, L2CAP_CID_ATT,
Ido Yarivc2287682012-04-20 15:46:07 -03001351 conn->src, conn->dst);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001352 if (!pchan)
Ville Tervob62f3282011-02-10 22:38:50 -03001353 return;
1354
Johan Hedberg44f3b0f2013-04-29 19:35:45 +03001355 /* Client ATT sockets should override the server one */
1356 if (__l2cap_get_chan_by_dcid(conn, L2CAP_CID_ATT))
1357 return;
1358
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001359 parent = pchan->sk;
1360
Gustavo F. Padovanaa2ac882011-06-24 01:53:01 -03001361 lock_sock(parent);
Gustavo F. Padovan62f3a2c2011-04-14 18:34:34 -03001362
Gustavo Padovan80b98022012-05-27 22:27:51 -03001363 chan = pchan->ops->new_connection(pchan);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001364 if (!chan)
Ville Tervob62f3282011-02-10 22:38:50 -03001365 goto clean;
1366
Johan Hedberg9f22398c2013-04-29 19:35:38 +03001367 chan->dcid = L2CAP_CID_ATT;
1368
Johan Hedberg60bac182013-04-29 19:35:41 +03001369 bacpy(&bt_sk(chan->sk)->src, conn->src);
1370 bacpy(&bt_sk(chan->sk)->dst, conn->dst);
Ville Tervob62f3282011-02-10 22:38:50 -03001371
Johan Hedberg44f3b0f2013-04-29 19:35:45 +03001372 __l2cap_chan_add(conn, chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001373
Ville Tervob62f3282011-02-10 22:38:50 -03001374clean:
Gustavo F. Padovanaa2ac882011-06-24 01:53:01 -03001375 release_sock(parent);
Ville Tervob62f3282011-02-10 22:38:50 -03001376}
1377
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001378static void l2cap_conn_ready(struct l2cap_conn *conn)
1379{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001380 struct l2cap_chan *chan;
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001381 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001382
1383 BT_DBG("conn %p", conn);
1384
Johan Hedbergd8729922013-04-29 19:35:39 +03001385 /* For outgoing pairing which doesn't necessarily have an
1386 * associated socket (e.g. mgmt_pair_device).
1387 */
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001388 if (hcon->out && hcon->type == LE_LINK)
1389 smp_conn_security(hcon, hcon->pending_sec_level);
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03001390
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001391 mutex_lock(&conn->chan_lock);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001392
Johan Hedberg44f3b0f2013-04-29 19:35:45 +03001393 if (hcon->type == LE_LINK)
1394 l2cap_le_conn_ready(conn);
1395
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001396 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03001397
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001398 l2cap_chan_lock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001399
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001400 if (chan->chan_type == L2CAP_CHAN_CONN_FIX_A2MP) {
1401 l2cap_chan_unlock(chan);
1402 continue;
1403 }
1404
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001405 if (hcon->type == LE_LINK) {
1406 if (smp_conn_security(hcon, chan->sec_level))
Andrei Emeltchenkocf4cd002012-02-06 15:03:59 +02001407 l2cap_chan_ready(chan);
Ville Tervoacd7d372011-02-10 22:38:49 -03001408
Vinicius Costa Gomes63128452011-06-17 22:46:26 -03001409 } else if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001410 struct sock *sk = chan->sk;
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -03001411 __clear_chan_timer(chan);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001412 lock_sock(sk);
Andrei Emeltchenko0e587be2012-02-21 12:54:57 +02001413 __l2cap_state_change(chan, BT_CONNECTED);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001414 sk->sk_state_change(sk);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001415 release_sock(sk);
Anderson Brigliab501d6a2011-06-07 18:46:31 -03001416
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001417 } else if (chan->state == BT_CONNECT) {
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001418 l2cap_do_start(chan);
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001419 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001420
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001421 l2cap_chan_unlock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001422 }
1423
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001424 mutex_unlock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001425}
1426
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001427/* Notify sockets that we cannot guaranty reliability anymore */
1428static void l2cap_conn_unreliable(struct l2cap_conn *conn, int err)
1429{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001430 struct l2cap_chan *chan;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001431
1432 BT_DBG("conn %p", conn);
1433
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001434 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001435
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001436 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +03001437 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo Padovan1d8b1fd2012-10-06 11:34:52 +01001438 l2cap_chan_set_err(chan, err);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001439 }
1440
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001441 mutex_unlock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001442}
1443
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001444static void l2cap_info_timeout(struct work_struct *work)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001445{
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001446 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001447 info_timer.work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001448
Marcel Holtmann984947d2009-02-06 23:35:19 +01001449 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01001450 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01001451
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001452 l2cap_conn_start(conn);
1453}
1454
David Herrmann2c8e1412013-04-06 20:28:45 +02001455/*
1456 * l2cap_user
1457 * External modules can register l2cap_user objects on l2cap_conn. The ->probe
1458 * callback is called during registration. The ->remove callback is called
1459 * during unregistration.
1460 * An l2cap_user object can either be explicitly unregistered or when the
1461 * underlying l2cap_conn object is deleted. This guarantees that l2cap->hcon,
1462 * l2cap->hchan, .. are valid as long as the remove callback hasn't been called.
1463 * External modules must own a reference to the l2cap_conn object if they intend
1464 * to call l2cap_unregister_user(). The l2cap_conn object might get destroyed at
1465 * any time if they don't.
1466 */
1467
1468int l2cap_register_user(struct l2cap_conn *conn, struct l2cap_user *user)
1469{
1470 struct hci_dev *hdev = conn->hcon->hdev;
1471 int ret;
1472
1473 /* We need to check whether l2cap_conn is registered. If it is not, we
1474 * must not register the l2cap_user. l2cap_conn_del() is unregisters
1475 * l2cap_conn objects, but doesn't provide its own locking. Instead, it
1476 * relies on the parent hci_conn object to be locked. This itself relies
1477 * on the hci_dev object to be locked. So we must lock the hci device
1478 * here, too. */
1479
1480 hci_dev_lock(hdev);
1481
1482 if (user->list.next || user->list.prev) {
1483 ret = -EINVAL;
1484 goto out_unlock;
1485 }
1486
1487 /* conn->hchan is NULL after l2cap_conn_del() was called */
1488 if (!conn->hchan) {
1489 ret = -ENODEV;
1490 goto out_unlock;
1491 }
1492
1493 ret = user->probe(conn, user);
1494 if (ret)
1495 goto out_unlock;
1496
1497 list_add(&user->list, &conn->users);
1498 ret = 0;
1499
1500out_unlock:
1501 hci_dev_unlock(hdev);
1502 return ret;
1503}
1504EXPORT_SYMBOL(l2cap_register_user);
1505
1506void l2cap_unregister_user(struct l2cap_conn *conn, struct l2cap_user *user)
1507{
1508 struct hci_dev *hdev = conn->hcon->hdev;
1509
1510 hci_dev_lock(hdev);
1511
1512 if (!user->list.next || !user->list.prev)
1513 goto out_unlock;
1514
1515 list_del(&user->list);
1516 user->list.next = NULL;
1517 user->list.prev = NULL;
1518 user->remove(conn, user);
1519
1520out_unlock:
1521 hci_dev_unlock(hdev);
1522}
1523EXPORT_SYMBOL(l2cap_unregister_user);
1524
1525static void l2cap_unregister_all_users(struct l2cap_conn *conn)
1526{
1527 struct l2cap_user *user;
1528
1529 while (!list_empty(&conn->users)) {
1530 user = list_first_entry(&conn->users, struct l2cap_user, list);
1531 list_del(&user->list);
1532 user->list.next = NULL;
1533 user->list.prev = NULL;
1534 user->remove(conn, user);
1535 }
1536}
1537
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001538static void l2cap_conn_del(struct hci_conn *hcon, int err)
1539{
1540 struct l2cap_conn *conn = hcon->l2cap_data;
1541 struct l2cap_chan *chan, *l;
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001542
1543 if (!conn)
1544 return;
1545
1546 BT_DBG("hcon %p conn %p, err %d", hcon, conn, err);
1547
1548 kfree_skb(conn->rx_skb);
1549
David Herrmann2c8e1412013-04-06 20:28:45 +02001550 l2cap_unregister_all_users(conn);
1551
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001552 mutex_lock(&conn->chan_lock);
1553
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001554 /* Kill channels */
1555 list_for_each_entry_safe(chan, l, &conn->chan_l, list) {
Mat Martineau61d6ef32012-04-27 16:50:50 -07001556 l2cap_chan_hold(chan);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001557 l2cap_chan_lock(chan);
1558
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001559 l2cap_chan_del(chan, err);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001560
1561 l2cap_chan_unlock(chan);
1562
Gustavo Padovan80b98022012-05-27 22:27:51 -03001563 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07001564 l2cap_chan_put(chan);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001565 }
1566
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001567 mutex_unlock(&conn->chan_lock);
1568
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001569 hci_chan_del(conn->hchan);
1570
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001571 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT)
Ulisses Furquim127074b2012-01-30 18:26:29 -02001572 cancel_delayed_work_sync(&conn->info_timer);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001573
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001574 if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags)) {
Ulisses Furquim127074b2012-01-30 18:26:29 -02001575 cancel_delayed_work_sync(&conn->security_timer);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001576 smp_chan_destroy(conn);
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001577 }
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001578
1579 hcon->l2cap_data = NULL;
David Herrmann9c903e32013-04-06 20:28:44 +02001580 conn->hchan = NULL;
1581 l2cap_conn_put(conn);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001582}
1583
Gustavo F. Padovan6c9d42a2011-12-20 10:57:27 -02001584static void security_timeout(struct work_struct *work)
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001585{
Gustavo F. Padovan6c9d42a2011-12-20 10:57:27 -02001586 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001587 security_timer.work);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001588
Johan Hedbergd06cc412012-06-06 18:44:11 +08001589 BT_DBG("conn %p", conn);
1590
1591 if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags)) {
1592 smp_chan_destroy(conn);
1593 l2cap_conn_del(conn->hcon, ETIMEDOUT);
1594 }
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001595}
1596
Claudio Takahasibaf43252013-04-11 13:55:50 -03001597static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001598{
Marcel Holtmann01394182006-07-03 10:02:46 +02001599 struct l2cap_conn *conn = hcon->l2cap_data;
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001600 struct hci_chan *hchan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001601
Claudio Takahasibaf43252013-04-11 13:55:50 -03001602 if (conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001603 return conn;
1604
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001605 hchan = hci_chan_create(hcon);
1606 if (!hchan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001607 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001608
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03001609 conn = kzalloc(sizeof(struct l2cap_conn), GFP_KERNEL);
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001610 if (!conn) {
1611 hci_chan_del(hchan);
1612 return NULL;
1613 }
1614
David Herrmann9c903e32013-04-06 20:28:44 +02001615 kref_init(&conn->ref);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001616 hcon->l2cap_data = conn;
1617 conn->hcon = hcon;
David Herrmann9c903e32013-04-06 20:28:44 +02001618 hci_conn_get(conn->hcon);
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001619 conn->hchan = hchan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001620
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001621 BT_DBG("hcon %p conn %p hchan %p", hcon, conn, hchan);
Marcel Holtmann01394182006-07-03 10:02:46 +02001622
Andrei Emeltchenkodcc042d2012-10-05 16:56:57 +03001623 switch (hcon->type) {
Andrei Emeltchenkodcc042d2012-10-05 16:56:57 +03001624 case LE_LINK:
1625 if (hcon->hdev->le_mtu) {
1626 conn->mtu = hcon->hdev->le_mtu;
1627 break;
1628 }
1629 /* fall through */
Andrei Emeltchenkodcc042d2012-10-05 16:56:57 +03001630 default:
Ville Tervoacd7d372011-02-10 22:38:49 -03001631 conn->mtu = hcon->hdev->acl_mtu;
Andrei Emeltchenkodcc042d2012-10-05 16:56:57 +03001632 break;
1633 }
Ville Tervoacd7d372011-02-10 22:38:49 -03001634
Linus Torvalds1da177e2005-04-16 15:20:36 -07001635 conn->src = &hcon->hdev->bdaddr;
1636 conn->dst = &hcon->dst;
1637
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001638 conn->feat_mask = 0;
1639
Marcel Holtmann848566b2013-10-01 22:59:22 -07001640 if (hcon->type == ACL_LINK)
1641 conn->hs_enabled = test_bit(HCI_HS_ENABLED,
1642 &hcon->hdev->dev_flags);
1643
Linus Torvalds1da177e2005-04-16 15:20:36 -07001644 spin_lock_init(&conn->lock);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001645 mutex_init(&conn->chan_lock);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03001646
1647 INIT_LIST_HEAD(&conn->chan_l);
David Herrmann2c8e1412013-04-06 20:28:45 +02001648 INIT_LIST_HEAD(&conn->users);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001649
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001650 if (hcon->type == LE_LINK)
Gustavo F. Padovan6c9d42a2011-12-20 10:57:27 -02001651 INIT_DELAYED_WORK(&conn->security_timer, security_timeout);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001652 else
Gustavo F. Padovan030013d2011-12-20 10:57:28 -02001653 INIT_DELAYED_WORK(&conn->info_timer, l2cap_info_timeout);
Dave Young45054dc2009-10-18 20:28:30 +00001654
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02001655 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
Marcel Holtmann2950f212009-02-12 14:02:50 +01001656
Linus Torvalds1da177e2005-04-16 15:20:36 -07001657 return conn;
1658}
1659
David Herrmann9c903e32013-04-06 20:28:44 +02001660static void l2cap_conn_free(struct kref *ref)
1661{
1662 struct l2cap_conn *conn = container_of(ref, struct l2cap_conn, ref);
1663
1664 hci_conn_put(conn->hcon);
1665 kfree(conn);
1666}
1667
1668void l2cap_conn_get(struct l2cap_conn *conn)
1669{
1670 kref_get(&conn->ref);
1671}
1672EXPORT_SYMBOL(l2cap_conn_get);
1673
1674void l2cap_conn_put(struct l2cap_conn *conn)
1675{
1676 kref_put(&conn->ref, l2cap_conn_free);
1677}
1678EXPORT_SYMBOL(l2cap_conn_put);
1679
Linus Torvalds1da177e2005-04-16 15:20:36 -07001680/* ---- Socket interface ---- */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001681
Ido Yarivc2287682012-04-20 15:46:07 -03001682/* Find socket with psm and source / destination bdaddr.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001683 * Returns closest match.
1684 */
Ido Yarivc2287682012-04-20 15:46:07 -03001685static struct l2cap_chan *l2cap_global_chan_by_psm(int state, __le16 psm,
1686 bdaddr_t *src,
1687 bdaddr_t *dst)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001688{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001689 struct l2cap_chan *c, *c1 = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001690
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001691 read_lock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001692
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001693 list_for_each_entry(c, &chan_list, global_l) {
1694 struct sock *sk = c->sk;
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001695
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001696 if (state && c->state != state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001697 continue;
1698
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001699 if (c->psm == psm) {
Ido Yarivc2287682012-04-20 15:46:07 -03001700 int src_match, dst_match;
1701 int src_any, dst_any;
1702
Linus Torvalds1da177e2005-04-16 15:20:36 -07001703 /* Exact match. */
Ido Yarivc2287682012-04-20 15:46:07 -03001704 src_match = !bacmp(&bt_sk(sk)->src, src);
1705 dst_match = !bacmp(&bt_sk(sk)->dst, dst);
1706 if (src_match && dst_match) {
Johannes Berga7567b22011-06-01 08:29:54 +02001707 read_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001708 return c;
1709 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001710
1711 /* Closest match */
Ido Yarivc2287682012-04-20 15:46:07 -03001712 src_any = !bacmp(&bt_sk(sk)->src, BDADDR_ANY);
1713 dst_any = !bacmp(&bt_sk(sk)->dst, BDADDR_ANY);
1714 if ((src_match && dst_any) || (src_any && dst_match) ||
1715 (src_any && dst_any))
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001716 c1 = c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001717 }
1718 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001719
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001720 read_unlock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001721
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001722 return c1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001723}
1724
Andre Guedes8e9f9892012-04-24 21:02:55 -03001725int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
1726 bdaddr_t *dst, u8 dst_type)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001727{
Gustavo F. Padovan5d41ce12011-04-08 15:40:02 -03001728 struct sock *sk = chan->sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001729 bdaddr_t *src = &bt_sk(sk)->src;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001730 struct l2cap_conn *conn;
1731 struct hci_conn *hcon;
1732 struct hci_dev *hdev;
Marcel Holtmann09ab6f42008-09-09 07:19:20 +02001733 __u8 auth_type;
Marcel Holtmann44d0e482009-04-20 07:09:16 +02001734 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001735
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03001736 BT_DBG("%pMR -> %pMR (type %u) psm 0x%2.2x", src, dst,
Syam Sidhardhanab195162012-07-27 23:51:22 +05301737 dst_type, __le16_to_cpu(psm));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001738
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03001739 hdev = hci_get_route(dst, src);
1740 if (!hdev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001741 return -EHOSTUNREACH;
1742
Gustavo F. Padovan09fd0de2011-06-17 13:03:21 -03001743 hci_dev_lock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001744
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001745 l2cap_chan_lock(chan);
Gustavo F. Padovan03a00192011-12-09 04:48:17 -02001746
1747 /* PSM must be odd and lsb of upper byte must be 0 */
1748 if ((__le16_to_cpu(psm) & 0x0101) != 0x0001 && !cid &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01001749 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan03a00192011-12-09 04:48:17 -02001750 err = -EINVAL;
1751 goto done;
1752 }
1753
1754 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED && !(psm || cid)) {
1755 err = -EINVAL;
1756 goto done;
1757 }
1758
1759 switch (chan->mode) {
1760 case L2CAP_MODE_BASIC:
1761 break;
1762 case L2CAP_MODE_ERTM:
1763 case L2CAP_MODE_STREAMING:
1764 if (!disable_ertm)
1765 break;
1766 /* fall through */
1767 default:
1768 err = -ENOTSUPP;
1769 goto done;
1770 }
1771
Gustavo Padovan0797e012012-05-27 22:27:54 -03001772 switch (chan->state) {
Gustavo F. Padovan03a00192011-12-09 04:48:17 -02001773 case BT_CONNECT:
1774 case BT_CONNECT2:
1775 case BT_CONFIG:
1776 /* Already connecting */
1777 err = 0;
1778 goto done;
1779
1780 case BT_CONNECTED:
1781 /* Already connected */
1782 err = -EISCONN;
1783 goto done;
1784
1785 case BT_OPEN:
1786 case BT_BOUND:
1787 /* Can connect */
1788 break;
1789
1790 default:
1791 err = -EBADFD;
1792 goto done;
1793 }
1794
1795 /* Set destination address and psm */
Gustavo Padovan0797e012012-05-27 22:27:54 -03001796 lock_sock(sk);
Gustavo F. Padovan9219b2a2012-01-02 20:08:04 -02001797 bacpy(&bt_sk(sk)->dst, dst);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001798 release_sock(sk);
1799
Gustavo F. Padovan03a00192011-12-09 04:48:17 -02001800 chan->psm = psm;
1801 chan->dcid = cid;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001802
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001803 auth_type = l2cap_get_auth_type(chan);
Marcel Holtmann09ab6f42008-09-09 07:19:20 +02001804
Johan Hedbergf224ca52013-04-29 19:35:36 +03001805 if (bdaddr_type_is_le(dst_type))
Andre Guedes8e9f9892012-04-24 21:02:55 -03001806 hcon = hci_connect(hdev, LE_LINK, dst, dst_type,
Andre Guedesb12f62c2012-04-24 21:02:54 -03001807 chan->sec_level, auth_type);
Ville Tervoacd7d372011-02-10 22:38:49 -03001808 else
Andre Guedes8e9f9892012-04-24 21:02:55 -03001809 hcon = hci_connect(hdev, ACL_LINK, dst, dst_type,
Andre Guedesb12f62c2012-04-24 21:02:54 -03001810 chan->sec_level, auth_type);
Ville Tervoacd7d372011-02-10 22:38:49 -03001811
Ville Tervo30e76272011-02-22 16:10:53 -03001812 if (IS_ERR(hcon)) {
1813 err = PTR_ERR(hcon);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001814 goto done;
Ville Tervo30e76272011-02-22 16:10:53 -03001815 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001816
Claudio Takahasibaf43252013-04-11 13:55:50 -03001817 conn = l2cap_conn_add(hcon);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001818 if (!conn) {
David Herrmann76a68ba2013-04-06 20:28:37 +02001819 hci_conn_drop(hcon);
Ville Tervo30e76272011-02-22 16:10:53 -03001820 err = -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001821 goto done;
1822 }
1823
Johan Hedberg141d5702013-04-29 19:35:37 +03001824 if (cid && __l2cap_get_chan_by_dcid(conn, cid)) {
1825 hci_conn_drop(hcon);
1826 err = -EBUSY;
1827 goto done;
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001828 }
1829
Linus Torvalds1da177e2005-04-16 15:20:36 -07001830 /* Update source addr of the socket */
1831 bacpy(src, conn->src);
1832
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001833 l2cap_chan_unlock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001834 l2cap_chan_add(conn, chan);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001835 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001836
Johan Hedberg5ee98912013-04-29 19:35:43 +03001837 /* l2cap_chan_add takes its own ref so we can drop this one */
1838 hci_conn_drop(hcon);
1839
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001840 l2cap_state_change(chan, BT_CONNECT);
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -03001841 __set_chan_timer(chan, sk->sk_sndtimeo);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001842
1843 if (hcon->state == BT_CONNECTED) {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001844 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -03001845 __clear_chan_timer(chan);
Gustavo F. Padovand45fc422011-11-05 19:54:24 -02001846 if (l2cap_chan_check_security(chan))
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001847 l2cap_state_change(chan, BT_CONNECTED);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001848 } else
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001849 l2cap_do_start(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001850 }
1851
Ville Tervo30e76272011-02-22 16:10:53 -03001852 err = 0;
1853
Linus Torvalds1da177e2005-04-16 15:20:36 -07001854done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001855 l2cap_chan_unlock(chan);
Gustavo F. Padovan09fd0de2011-06-17 13:03:21 -03001856 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001857 hci_dev_put(hdev);
1858 return err;
1859}
1860
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001861int __l2cap_wait_ack(struct sock *sk)
Gustavo F. Padovan6161c032010-05-01 16:15:44 -03001862{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03001863 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan6161c032010-05-01 16:15:44 -03001864 DECLARE_WAITQUEUE(wait, current);
1865 int err = 0;
1866 int timeo = HZ/5;
1867
Marcel Holtmann2b0b05d2010-05-10 11:33:10 +02001868 add_wait_queue(sk_sleep(sk), &wait);
Peter Hurleya71a0cf2011-07-25 18:36:26 -04001869 set_current_state(TASK_INTERRUPTIBLE);
1870 while (chan->unacked_frames > 0 && chan->conn) {
Gustavo F. Padovan6161c032010-05-01 16:15:44 -03001871 if (!timeo)
1872 timeo = HZ/5;
1873
1874 if (signal_pending(current)) {
1875 err = sock_intr_errno(timeo);
1876 break;
1877 }
1878
1879 release_sock(sk);
1880 timeo = schedule_timeout(timeo);
1881 lock_sock(sk);
Peter Hurleya71a0cf2011-07-25 18:36:26 -04001882 set_current_state(TASK_INTERRUPTIBLE);
Gustavo F. Padovan6161c032010-05-01 16:15:44 -03001883
1884 err = sock_error(sk);
1885 if (err)
1886 break;
1887 }
1888 set_current_state(TASK_RUNNING);
Marcel Holtmann2b0b05d2010-05-10 11:33:10 +02001889 remove_wait_queue(sk_sleep(sk), &wait);
Gustavo F. Padovan6161c032010-05-01 16:15:44 -03001890 return err;
1891}
1892
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001893static void l2cap_monitor_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001894{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001895 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001896 monitor_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001897
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03001898 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001899
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001900 l2cap_chan_lock(chan);
1901
Mat Martineau80909e02012-05-17 20:53:50 -07001902 if (!chan->conn) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001903 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001904 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001905 return;
1906 }
1907
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001908 l2cap_tx(chan, NULL, NULL, L2CAP_EV_MONITOR_TO);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001909
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001910 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001911 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001912}
1913
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001914static void l2cap_retrans_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001915{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001916 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001917 retrans_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001918
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03001919 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001920
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001921 l2cap_chan_lock(chan);
1922
Mat Martineau80909e02012-05-17 20:53:50 -07001923 if (!chan->conn) {
1924 l2cap_chan_unlock(chan);
1925 l2cap_chan_put(chan);
1926 return;
1927 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001928
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001929 l2cap_tx(chan, NULL, NULL, L2CAP_EV_RETRANS_TO);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001930 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001931 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001932}
1933
Gustavo Padovand6603662012-05-21 13:58:22 -03001934static void l2cap_streaming_send(struct l2cap_chan *chan,
1935 struct sk_buff_head *skbs)
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001936{
Gustavo F. Padovanccbb84a2010-08-30 18:44:44 -03001937 struct sk_buff *skb;
Mat Martineau37339372012-05-17 20:53:33 -07001938 struct l2cap_ctrl *control;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001939
Mat Martineau37339372012-05-17 20:53:33 -07001940 BT_DBG("chan %p, skbs %p", chan, skbs);
1941
Mat Martineaub99e13a2012-10-23 15:24:19 -07001942 if (__chan_is_moving(chan))
1943 return;
1944
Mat Martineau37339372012-05-17 20:53:33 -07001945 skb_queue_splice_tail_init(skbs, &chan->tx_q);
1946
1947 while (!skb_queue_empty(&chan->tx_q)) {
1948
1949 skb = skb_dequeue(&chan->tx_q);
1950
1951 bt_cb(skb)->control.retries = 1;
1952 control = &bt_cb(skb)->control;
1953
1954 control->reqseq = 0;
1955 control->txseq = chan->next_tx_seq;
1956
1957 __pack_control(chan, control, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001958
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001959 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau37339372012-05-17 20:53:33 -07001960 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1961 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001962 }
1963
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001964 l2cap_do_send(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001965
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001966 BT_DBG("Sent txseq %u", control->txseq);
Mat Martineau37339372012-05-17 20:53:33 -07001967
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001968 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau37339372012-05-17 20:53:33 -07001969 chan->frames_sent++;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001970 }
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001971}
1972
Szymon Janc67c9e842011-07-28 16:24:33 +02001973static int l2cap_ertm_send(struct l2cap_chan *chan)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001974{
1975 struct sk_buff *skb, *tx_skb;
Mat Martineau18a48e72012-05-17 20:53:34 -07001976 struct l2cap_ctrl *control;
1977 int sent = 0;
1978
1979 BT_DBG("chan %p", chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001980
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001981 if (chan->state != BT_CONNECTED)
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001982 return -ENOTCONN;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001983
Mat Martineau94122bb2012-05-02 09:42:02 -07001984 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1985 return 0;
1986
Mat Martineaub99e13a2012-10-23 15:24:19 -07001987 if (__chan_is_moving(chan))
1988 return 0;
1989
Mat Martineau18a48e72012-05-17 20:53:34 -07001990 while (chan->tx_send_head &&
1991 chan->unacked_frames < chan->remote_tx_win &&
1992 chan->tx_state == L2CAP_TX_STATE_XMIT) {
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001993
Mat Martineau18a48e72012-05-17 20:53:34 -07001994 skb = chan->tx_send_head;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001995
Mat Martineau18a48e72012-05-17 20:53:34 -07001996 bt_cb(skb)->control.retries = 1;
1997 control = &bt_cb(skb)->control;
Gustavo F. Padovan95ffa972010-06-18 20:37:33 -03001998
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001999 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
Mat Martineau18a48e72012-05-17 20:53:34 -07002000 control->final = 1;
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03002001
Mat Martineau18a48e72012-05-17 20:53:34 -07002002 control->reqseq = chan->buffer_seq;
2003 chan->last_acked_seq = chan->buffer_seq;
2004 control->txseq = chan->next_tx_seq;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002005
Mat Martineau18a48e72012-05-17 20:53:34 -07002006 __pack_control(chan, control, skb);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03002007
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03002008 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau18a48e72012-05-17 20:53:34 -07002009 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
2010 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03002011 }
2012
Mat Martineau18a48e72012-05-17 20:53:34 -07002013 /* Clone after data has been modified. Data is assumed to be
2014 read-only (for locking purposes) on cloned sk_buffs.
2015 */
2016 tx_skb = skb_clone(skb, GFP_KERNEL);
2017
2018 if (!tx_skb)
2019 break;
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -03002020
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03002021 __set_retrans_timer(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002022
Andrei Emeltchenko836be932011-10-17 12:19:57 +03002023 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau18a48e72012-05-17 20:53:34 -07002024 chan->unacked_frames++;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03002025 chan->frames_sent++;
Mat Martineau18a48e72012-05-17 20:53:34 -07002026 sent++;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002027
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03002028 if (skb_queue_is_last(&chan->tx_q, skb))
2029 chan->tx_send_head = NULL;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002030 else
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03002031 chan->tx_send_head = skb_queue_next(&chan->tx_q, skb);
Mat Martineau18a48e72012-05-17 20:53:34 -07002032
2033 l2cap_do_send(chan, tx_skb);
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002034 BT_DBG("Sent txseq %u", control->txseq);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002035 }
2036
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002037 BT_DBG("Sent %d, %u unacked, %u in ERTM queue", sent,
2038 chan->unacked_frames, skb_queue_len(&chan->tx_q));
Mat Martineau18a48e72012-05-17 20:53:34 -07002039
2040 return sent;
Gustavo F. Padovan9e917af2010-05-01 16:15:37 -03002041}
2042
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002043static void l2cap_ertm_resend(struct l2cap_chan *chan)
2044{
2045 struct l2cap_ctrl control;
2046 struct sk_buff *skb;
2047 struct sk_buff *tx_skb;
2048 u16 seq;
2049
2050 BT_DBG("chan %p", chan);
2051
2052 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
2053 return;
2054
Mat Martineaub99e13a2012-10-23 15:24:19 -07002055 if (__chan_is_moving(chan))
2056 return;
2057
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002058 while (chan->retrans_list.head != L2CAP_SEQ_LIST_CLEAR) {
2059 seq = l2cap_seq_list_pop(&chan->retrans_list);
2060
2061 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, seq);
2062 if (!skb) {
2063 BT_DBG("Error: Can't retransmit seq %d, frame missing",
Gustavo Padovan2d792812012-10-06 10:07:01 +01002064 seq);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002065 continue;
2066 }
2067
2068 bt_cb(skb)->control.retries++;
2069 control = bt_cb(skb)->control;
2070
2071 if (chan->max_tx != 0 &&
2072 bt_cb(skb)->control.retries > chan->max_tx) {
2073 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02002074 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002075 l2cap_seq_list_clear(&chan->retrans_list);
2076 break;
2077 }
2078
2079 control.reqseq = chan->buffer_seq;
2080 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
2081 control.final = 1;
2082 else
2083 control.final = 0;
2084
2085 if (skb_cloned(skb)) {
2086 /* Cloned sk_buffs are read-only, so we need a
2087 * writeable copy
2088 */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002089 tx_skb = skb_copy(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002090 } else {
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002091 tx_skb = skb_clone(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002092 }
2093
2094 if (!tx_skb) {
2095 l2cap_seq_list_clear(&chan->retrans_list);
2096 break;
2097 }
2098
2099 /* Update skb contents */
2100 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
2101 put_unaligned_le32(__pack_extended_control(&control),
2102 tx_skb->data + L2CAP_HDR_SIZE);
2103 } else {
2104 put_unaligned_le16(__pack_enhanced_control(&control),
2105 tx_skb->data + L2CAP_HDR_SIZE);
2106 }
2107
2108 if (chan->fcs == L2CAP_FCS_CRC16) {
2109 u16 fcs = crc16(0, (u8 *) tx_skb->data, tx_skb->len);
2110 put_unaligned_le16(fcs, skb_put(tx_skb,
2111 L2CAP_FCS_SIZE));
2112 }
2113
2114 l2cap_do_send(chan, tx_skb);
2115
2116 BT_DBG("Resent txseq %d", control.txseq);
2117
2118 chan->last_acked_seq = chan->buffer_seq;
2119 }
2120}
2121
Mat Martineauf80842a2012-05-17 20:53:46 -07002122static void l2cap_retransmit(struct l2cap_chan *chan,
2123 struct l2cap_ctrl *control)
2124{
2125 BT_DBG("chan %p, control %p", chan, control);
2126
2127 l2cap_seq_list_append(&chan->retrans_list, control->reqseq);
2128 l2cap_ertm_resend(chan);
2129}
2130
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002131static void l2cap_retransmit_all(struct l2cap_chan *chan,
2132 struct l2cap_ctrl *control)
2133{
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002134 struct sk_buff *skb;
2135
2136 BT_DBG("chan %p, control %p", chan, control);
2137
2138 if (control->poll)
2139 set_bit(CONN_SEND_FBIT, &chan->conn_state);
2140
2141 l2cap_seq_list_clear(&chan->retrans_list);
2142
2143 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
2144 return;
2145
2146 if (chan->unacked_frames) {
2147 skb_queue_walk(&chan->tx_q, skb) {
2148 if (bt_cb(skb)->control.txseq == control->reqseq ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01002149 skb == chan->tx_send_head)
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002150 break;
2151 }
2152
2153 skb_queue_walk_from(&chan->tx_q, skb) {
2154 if (skb == chan->tx_send_head)
2155 break;
2156
2157 l2cap_seq_list_append(&chan->retrans_list,
2158 bt_cb(skb)->control.txseq);
2159 }
2160
2161 l2cap_ertm_resend(chan);
2162 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002163}
2164
Szymon Jancb17e73b2012-01-11 10:59:47 +01002165static void l2cap_send_ack(struct l2cap_chan *chan)
2166{
Mat Martineau0a0aba42012-05-17 20:53:39 -07002167 struct l2cap_ctrl control;
2168 u16 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
2169 chan->last_acked_seq);
2170 int threshold;
2171
2172 BT_DBG("chan %p last_acked_seq %d buffer_seq %d",
2173 chan, chan->last_acked_seq, chan->buffer_seq);
2174
2175 memset(&control, 0, sizeof(control));
2176 control.sframe = 1;
2177
2178 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
2179 chan->rx_state == L2CAP_RX_STATE_RECV) {
2180 __clear_ack_timer(chan);
2181 control.super = L2CAP_SUPER_RNR;
2182 control.reqseq = chan->buffer_seq;
2183 l2cap_send_sframe(chan, &control);
2184 } else {
2185 if (!test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) {
2186 l2cap_ertm_send(chan);
2187 /* If any i-frames were sent, they included an ack */
2188 if (chan->buffer_seq == chan->last_acked_seq)
2189 frames_to_ack = 0;
2190 }
2191
Mat Martineauc20f8e32012-07-10 05:47:07 -07002192 /* Ack now if the window is 3/4ths full.
Mat Martineau0a0aba42012-05-17 20:53:39 -07002193 * Calculate without mul or div
2194 */
Mat Martineauc20f8e32012-07-10 05:47:07 -07002195 threshold = chan->ack_win;
Mat Martineau0a0aba42012-05-17 20:53:39 -07002196 threshold += threshold << 1;
2197 threshold >>= 2;
2198
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002199 BT_DBG("frames_to_ack %u, threshold %d", frames_to_ack,
Mat Martineau0a0aba42012-05-17 20:53:39 -07002200 threshold);
2201
2202 if (frames_to_ack >= threshold) {
2203 __clear_ack_timer(chan);
2204 control.super = L2CAP_SUPER_RR;
2205 control.reqseq = chan->buffer_seq;
2206 l2cap_send_sframe(chan, &control);
2207 frames_to_ack = 0;
2208 }
2209
2210 if (frames_to_ack)
2211 __set_ack_timer(chan);
2212 }
Szymon Jancb17e73b2012-01-11 10:59:47 +01002213}
2214
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002215static inline int l2cap_skbuff_fromiovec(struct l2cap_chan *chan,
2216 struct msghdr *msg, int len,
2217 int count, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002218{
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002219 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002220 struct sk_buff **frag;
Gustavo Padovan90338942012-04-06 20:15:47 -03002221 int sent = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002222
Gustavo F. Padovan59203a22010-05-01 16:15:43 -03002223 if (memcpy_fromiovec(skb_put(skb, count), msg->msg_iov, count))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002224 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002225
2226 sent += count;
2227 len -= count;
2228
2229 /* Continuation fragments (no L2CAP header) */
2230 frag = &skb_shinfo(skb)->frag_list;
2231 while (len) {
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002232 struct sk_buff *tmp;
2233
Linus Torvalds1da177e2005-04-16 15:20:36 -07002234 count = min_t(unsigned int, conn->mtu, len);
2235
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002236 tmp = chan->ops->alloc_skb(chan, count,
2237 msg->msg_flags & MSG_DONTWAIT);
2238 if (IS_ERR(tmp))
2239 return PTR_ERR(tmp);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002240
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002241 *frag = tmp;
2242
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002243 if (memcpy_fromiovec(skb_put(*frag, count), msg->msg_iov, count))
2244 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002245
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002246 (*frag)->priority = skb->priority;
2247
Linus Torvalds1da177e2005-04-16 15:20:36 -07002248 sent += count;
2249 len -= count;
2250
Gustavo Padovan2d0ed3d2012-05-11 13:16:12 -03002251 skb->len += (*frag)->len;
2252 skb->data_len += (*frag)->len;
2253
Linus Torvalds1da177e2005-04-16 15:20:36 -07002254 frag = &(*frag)->next;
2255 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002256
2257 return sent;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002258}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002259
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002260static struct sk_buff *l2cap_create_connless_pdu(struct l2cap_chan *chan,
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002261 struct msghdr *msg, size_t len,
2262 u32 priority)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002263{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002264 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002265 struct sk_buff *skb;
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002266 int err, count, hlen = L2CAP_HDR_SIZE + L2CAP_PSMLEN_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002267 struct l2cap_hdr *lh;
2268
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002269 BT_DBG("chan %p len %zu priority %u", chan, len, priority);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002270
2271 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002272
2273 skb = chan->ops->alloc_skb(chan, count + hlen,
Gustavo Padovan90338942012-04-06 20:15:47 -03002274 msg->msg_flags & MSG_DONTWAIT);
2275 if (IS_ERR(skb))
2276 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002277
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002278 skb->priority = priority;
2279
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002280 /* Create L2CAP header */
2281 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002282 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenkodaf6a78c2012-05-03 10:55:52 +03002283 lh->len = cpu_to_le16(len + L2CAP_PSMLEN_SIZE);
2284 put_unaligned(chan->psm, skb_put(skb, L2CAP_PSMLEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002285
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002286 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002287 if (unlikely(err < 0)) {
2288 kfree_skb(skb);
2289 return ERR_PTR(err);
2290 }
2291 return skb;
2292}
2293
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002294static struct sk_buff *l2cap_create_basic_pdu(struct l2cap_chan *chan,
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002295 struct msghdr *msg, size_t len,
2296 u32 priority)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002297{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002298 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002299 struct sk_buff *skb;
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002300 int err, count;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002301 struct l2cap_hdr *lh;
2302
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002303 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002304
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002305 count = min_t(unsigned int, (conn->mtu - L2CAP_HDR_SIZE), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002306
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002307 skb = chan->ops->alloc_skb(chan, count + L2CAP_HDR_SIZE,
Gustavo Padovan90338942012-04-06 20:15:47 -03002308 msg->msg_flags & MSG_DONTWAIT);
2309 if (IS_ERR(skb))
2310 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002311
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002312 skb->priority = priority;
2313
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002314 /* Create L2CAP header */
2315 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002316 lh->cid = cpu_to_le16(chan->dcid);
Gustavo Padovan6ff9b5e2012-05-02 11:56:17 -03002317 lh->len = cpu_to_le16(len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002318
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002319 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002320 if (unlikely(err < 0)) {
2321 kfree_skb(skb);
2322 return ERR_PTR(err);
2323 }
2324 return skb;
2325}
2326
Luiz Augusto von Dentzab0ff762011-09-12 20:00:50 +03002327static struct sk_buff *l2cap_create_iframe_pdu(struct l2cap_chan *chan,
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002328 struct msghdr *msg, size_t len,
2329 u16 sdulen)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002330{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002331 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002332 struct sk_buff *skb;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002333 int err, count, hlen;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002334 struct l2cap_hdr *lh;
2335
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002336 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002337
Gustavo F. Padovan0ee0d202010-05-01 16:15:41 -03002338 if (!conn)
2339 return ERR_PTR(-ENOTCONN);
2340
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002341 hlen = __ertm_hdr_size(chan);
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002342
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002343 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002344 hlen += L2CAP_SDULEN_SIZE;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002345
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03002346 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002347 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03002348
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002349 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002350
2351 skb = chan->ops->alloc_skb(chan, count + hlen,
Gustavo Padovan90338942012-04-06 20:15:47 -03002352 msg->msg_flags & MSG_DONTWAIT);
2353 if (IS_ERR(skb))
2354 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002355
2356 /* Create L2CAP header */
2357 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002358 lh->cid = cpu_to_le16(chan->dcid);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002359 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002360
Mat Martineau18a48e72012-05-17 20:53:34 -07002361 /* Control header is populated later */
2362 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
2363 put_unaligned_le32(0, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
2364 else
2365 put_unaligned_le16(0, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002366
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002367 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002368 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002369
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002370 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002371 if (unlikely(err < 0)) {
2372 kfree_skb(skb);
2373 return ERR_PTR(err);
2374 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03002375
Mat Martineau18a48e72012-05-17 20:53:34 -07002376 bt_cb(skb)->control.fcs = chan->fcs;
Mat Martineau3ce35142012-04-25 16:36:14 -07002377 bt_cb(skb)->control.retries = 0;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002378 return skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002379}
2380
Mat Martineau94122bb2012-05-02 09:42:02 -07002381static int l2cap_segment_sdu(struct l2cap_chan *chan,
2382 struct sk_buff_head *seg_queue,
2383 struct msghdr *msg, size_t len)
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002384{
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002385 struct sk_buff *skb;
Mat Martineau94122bb2012-05-02 09:42:02 -07002386 u16 sdu_len;
2387 size_t pdu_len;
Mat Martineau94122bb2012-05-02 09:42:02 -07002388 u8 sar;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002389
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002390 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002391
Mat Martineau94122bb2012-05-02 09:42:02 -07002392 /* It is critical that ERTM PDUs fit in a single HCI fragment,
2393 * so fragmented skbs are not used. The HCI layer's handling
2394 * of fragmented skbs is not compatible with ERTM's queueing.
2395 */
2396
2397 /* PDU size is derived from the HCI MTU */
2398 pdu_len = chan->conn->mtu;
2399
Mat Martineaua5495742012-10-23 15:24:21 -07002400 /* Constrain PDU size for BR/EDR connections */
2401 if (!chan->hs_hcon)
2402 pdu_len = min_t(size_t, pdu_len, L2CAP_BREDR_MAX_PAYLOAD);
Mat Martineau94122bb2012-05-02 09:42:02 -07002403
2404 /* Adjust for largest possible L2CAP overhead. */
Gustavo Padovan35d401d2012-05-25 18:57:05 -03002405 if (chan->fcs)
2406 pdu_len -= L2CAP_FCS_SIZE;
2407
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002408 pdu_len -= __ertm_hdr_size(chan);
Mat Martineau94122bb2012-05-02 09:42:02 -07002409
2410 /* Remote device may have requested smaller PDUs */
2411 pdu_len = min_t(size_t, pdu_len, chan->remote_mps);
2412
2413 if (len <= pdu_len) {
2414 sar = L2CAP_SAR_UNSEGMENTED;
2415 sdu_len = 0;
2416 pdu_len = len;
2417 } else {
2418 sar = L2CAP_SAR_START;
2419 sdu_len = len;
2420 pdu_len -= L2CAP_SDULEN_SIZE;
2421 }
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002422
2423 while (len > 0) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002424 skb = l2cap_create_iframe_pdu(chan, msg, pdu_len, sdu_len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002425
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002426 if (IS_ERR(skb)) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002427 __skb_queue_purge(seg_queue);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002428 return PTR_ERR(skb);
2429 }
2430
Mat Martineau94122bb2012-05-02 09:42:02 -07002431 bt_cb(skb)->control.sar = sar;
2432 __skb_queue_tail(seg_queue, skb);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002433
Mat Martineau94122bb2012-05-02 09:42:02 -07002434 len -= pdu_len;
2435 if (sdu_len) {
2436 sdu_len = 0;
2437 pdu_len += L2CAP_SDULEN_SIZE;
2438 }
2439
2440 if (len <= pdu_len) {
2441 sar = L2CAP_SAR_END;
2442 pdu_len = len;
2443 } else {
2444 sar = L2CAP_SAR_CONTINUE;
2445 }
2446 }
2447
Gustavo Padovanf0f62792012-05-29 13:29:17 -03002448 return 0;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002449}
2450
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002451int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01002452 u32 priority)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002453{
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002454 struct sk_buff *skb;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002455 int err;
Mat Martineau94122bb2012-05-02 09:42:02 -07002456 struct sk_buff_head seg_queue;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002457
2458 /* Connectionless channel */
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002459 if (chan->chan_type == L2CAP_CHAN_CONN_LESS) {
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002460 skb = l2cap_create_connless_pdu(chan, msg, len, priority);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002461 if (IS_ERR(skb))
2462 return PTR_ERR(skb);
2463
2464 l2cap_do_send(chan, skb);
2465 return len;
2466 }
2467
2468 switch (chan->mode) {
2469 case L2CAP_MODE_BASIC:
2470 /* Check outgoing MTU */
2471 if (len > chan->omtu)
2472 return -EMSGSIZE;
2473
2474 /* Create a basic PDU */
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002475 skb = l2cap_create_basic_pdu(chan, msg, len, priority);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002476 if (IS_ERR(skb))
2477 return PTR_ERR(skb);
2478
2479 l2cap_do_send(chan, skb);
2480 err = len;
2481 break;
2482
2483 case L2CAP_MODE_ERTM:
2484 case L2CAP_MODE_STREAMING:
Mat Martineau94122bb2012-05-02 09:42:02 -07002485 /* Check outgoing MTU */
2486 if (len > chan->omtu) {
2487 err = -EMSGSIZE;
2488 break;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002489 }
2490
Mat Martineau94122bb2012-05-02 09:42:02 -07002491 __skb_queue_head_init(&seg_queue);
2492
2493 /* Do segmentation before calling in to the state machine,
2494 * since it's possible to block while waiting for memory
2495 * allocation.
2496 */
2497 err = l2cap_segment_sdu(chan, &seg_queue, msg, len);
2498
2499 /* The channel could have been closed while segmenting,
2500 * check that it is still connected.
2501 */
2502 if (chan->state != BT_CONNECTED) {
2503 __skb_queue_purge(&seg_queue);
2504 err = -ENOTCONN;
2505 }
2506
2507 if (err)
2508 break;
2509
Mat Martineau37339372012-05-17 20:53:33 -07002510 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo Padovand6603662012-05-21 13:58:22 -03002511 l2cap_tx(chan, NULL, &seg_queue, L2CAP_EV_DATA_REQUEST);
Mat Martineau37339372012-05-17 20:53:33 -07002512 else
Gustavo Padovand6603662012-05-21 13:58:22 -03002513 l2cap_streaming_send(chan, &seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002514
Gustavo Padovand6603662012-05-21 13:58:22 -03002515 err = len;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002516
Mat Martineau94122bb2012-05-02 09:42:02 -07002517 /* If the skbs were not queued for sending, they'll still be in
2518 * seg_queue and need to be purged.
2519 */
2520 __skb_queue_purge(&seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002521 break;
2522
2523 default:
2524 BT_DBG("bad state %1.1x", chan->mode);
2525 err = -EBADFD;
2526 }
2527
2528 return err;
2529}
2530
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002531static void l2cap_send_srej(struct l2cap_chan *chan, u16 txseq)
2532{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002533 struct l2cap_ctrl control;
2534 u16 seq;
2535
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002536 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002537
2538 memset(&control, 0, sizeof(control));
2539 control.sframe = 1;
2540 control.super = L2CAP_SUPER_SREJ;
2541
2542 for (seq = chan->expected_tx_seq; seq != txseq;
2543 seq = __next_seq(chan, seq)) {
2544 if (!l2cap_ertm_seq_in_queue(&chan->srej_q, seq)) {
2545 control.reqseq = seq;
2546 l2cap_send_sframe(chan, &control);
2547 l2cap_seq_list_append(&chan->srej_list, seq);
2548 }
2549 }
2550
2551 chan->expected_tx_seq = __next_seq(chan, txseq);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002552}
2553
2554static void l2cap_send_srej_tail(struct l2cap_chan *chan)
2555{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002556 struct l2cap_ctrl control;
2557
2558 BT_DBG("chan %p", chan);
2559
2560 if (chan->srej_list.tail == L2CAP_SEQ_LIST_CLEAR)
2561 return;
2562
2563 memset(&control, 0, sizeof(control));
2564 control.sframe = 1;
2565 control.super = L2CAP_SUPER_SREJ;
2566 control.reqseq = chan->srej_list.tail;
2567 l2cap_send_sframe(chan, &control);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002568}
2569
2570static void l2cap_send_srej_list(struct l2cap_chan *chan, u16 txseq)
2571{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002572 struct l2cap_ctrl control;
2573 u16 initial_head;
2574 u16 seq;
2575
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002576 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002577
2578 memset(&control, 0, sizeof(control));
2579 control.sframe = 1;
2580 control.super = L2CAP_SUPER_SREJ;
2581
2582 /* Capture initial list head to allow only one pass through the list. */
2583 initial_head = chan->srej_list.head;
2584
2585 do {
2586 seq = l2cap_seq_list_pop(&chan->srej_list);
2587 if (seq == txseq || seq == L2CAP_SEQ_LIST_CLEAR)
2588 break;
2589
2590 control.reqseq = seq;
2591 l2cap_send_sframe(chan, &control);
2592 l2cap_seq_list_append(&chan->srej_list, seq);
2593 } while (chan->srej_list.head != initial_head);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002594}
2595
Mat Martineau608bcc62012-05-17 20:53:32 -07002596static void l2cap_process_reqseq(struct l2cap_chan *chan, u16 reqseq)
2597{
2598 struct sk_buff *acked_skb;
2599 u16 ackseq;
2600
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002601 BT_DBG("chan %p, reqseq %u", chan, reqseq);
Mat Martineau608bcc62012-05-17 20:53:32 -07002602
2603 if (chan->unacked_frames == 0 || reqseq == chan->expected_ack_seq)
2604 return;
2605
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002606 BT_DBG("expected_ack_seq %u, unacked_frames %u",
Mat Martineau608bcc62012-05-17 20:53:32 -07002607 chan->expected_ack_seq, chan->unacked_frames);
2608
2609 for (ackseq = chan->expected_ack_seq; ackseq != reqseq;
2610 ackseq = __next_seq(chan, ackseq)) {
2611
2612 acked_skb = l2cap_ertm_seq_in_queue(&chan->tx_q, ackseq);
2613 if (acked_skb) {
2614 skb_unlink(acked_skb, &chan->tx_q);
2615 kfree_skb(acked_skb);
2616 chan->unacked_frames--;
2617 }
2618 }
2619
2620 chan->expected_ack_seq = reqseq;
2621
2622 if (chan->unacked_frames == 0)
2623 __clear_retrans_timer(chan);
2624
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002625 BT_DBG("unacked_frames %u", chan->unacked_frames);
Mat Martineau608bcc62012-05-17 20:53:32 -07002626}
2627
2628static void l2cap_abort_rx_srej_sent(struct l2cap_chan *chan)
2629{
2630 BT_DBG("chan %p", chan);
2631
2632 chan->expected_tx_seq = chan->buffer_seq;
2633 l2cap_seq_list_clear(&chan->srej_list);
2634 skb_queue_purge(&chan->srej_q);
2635 chan->rx_state = L2CAP_RX_STATE_RECV;
2636}
2637
Gustavo Padovand6603662012-05-21 13:58:22 -03002638static void l2cap_tx_state_xmit(struct l2cap_chan *chan,
2639 struct l2cap_ctrl *control,
2640 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002641{
Mat Martineau608bcc62012-05-17 20:53:32 -07002642 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2643 event);
2644
2645 switch (event) {
2646 case L2CAP_EV_DATA_REQUEST:
2647 if (chan->tx_send_head == NULL)
2648 chan->tx_send_head = skb_peek(skbs);
2649
2650 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2651 l2cap_ertm_send(chan);
2652 break;
2653 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2654 BT_DBG("Enter LOCAL_BUSY");
2655 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2656
2657 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2658 /* The SREJ_SENT state must be aborted if we are to
2659 * enter the LOCAL_BUSY state.
2660 */
2661 l2cap_abort_rx_srej_sent(chan);
2662 }
2663
2664 l2cap_send_ack(chan);
2665
2666 break;
2667 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2668 BT_DBG("Exit LOCAL_BUSY");
2669 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2670
2671 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2672 struct l2cap_ctrl local_control;
2673
2674 memset(&local_control, 0, sizeof(local_control));
2675 local_control.sframe = 1;
2676 local_control.super = L2CAP_SUPER_RR;
2677 local_control.poll = 1;
2678 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002679 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002680
2681 chan->retry_count = 1;
2682 __set_monitor_timer(chan);
2683 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2684 }
2685 break;
2686 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2687 l2cap_process_reqseq(chan, control->reqseq);
2688 break;
2689 case L2CAP_EV_EXPLICIT_POLL:
2690 l2cap_send_rr_or_rnr(chan, 1);
2691 chan->retry_count = 1;
2692 __set_monitor_timer(chan);
2693 __clear_ack_timer(chan);
2694 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2695 break;
2696 case L2CAP_EV_RETRANS_TO:
2697 l2cap_send_rr_or_rnr(chan, 1);
2698 chan->retry_count = 1;
2699 __set_monitor_timer(chan);
2700 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2701 break;
2702 case L2CAP_EV_RECV_FBIT:
2703 /* Nothing to process */
2704 break;
2705 default:
2706 break;
2707 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002708}
2709
Gustavo Padovand6603662012-05-21 13:58:22 -03002710static void l2cap_tx_state_wait_f(struct l2cap_chan *chan,
2711 struct l2cap_ctrl *control,
2712 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002713{
Mat Martineau608bcc62012-05-17 20:53:32 -07002714 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2715 event);
2716
2717 switch (event) {
2718 case L2CAP_EV_DATA_REQUEST:
2719 if (chan->tx_send_head == NULL)
2720 chan->tx_send_head = skb_peek(skbs);
2721 /* Queue data, but don't send. */
2722 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2723 break;
2724 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2725 BT_DBG("Enter LOCAL_BUSY");
2726 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2727
2728 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2729 /* The SREJ_SENT state must be aborted if we are to
2730 * enter the LOCAL_BUSY state.
2731 */
2732 l2cap_abort_rx_srej_sent(chan);
2733 }
2734
2735 l2cap_send_ack(chan);
2736
2737 break;
2738 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2739 BT_DBG("Exit LOCAL_BUSY");
2740 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2741
2742 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2743 struct l2cap_ctrl local_control;
2744 memset(&local_control, 0, sizeof(local_control));
2745 local_control.sframe = 1;
2746 local_control.super = L2CAP_SUPER_RR;
2747 local_control.poll = 1;
2748 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002749 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002750
2751 chan->retry_count = 1;
2752 __set_monitor_timer(chan);
2753 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2754 }
2755 break;
2756 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2757 l2cap_process_reqseq(chan, control->reqseq);
2758
2759 /* Fall through */
2760
2761 case L2CAP_EV_RECV_FBIT:
2762 if (control && control->final) {
2763 __clear_monitor_timer(chan);
2764 if (chan->unacked_frames > 0)
2765 __set_retrans_timer(chan);
2766 chan->retry_count = 0;
2767 chan->tx_state = L2CAP_TX_STATE_XMIT;
2768 BT_DBG("recv fbit tx_state 0x2.2%x", chan->tx_state);
2769 }
2770 break;
2771 case L2CAP_EV_EXPLICIT_POLL:
2772 /* Ignore */
2773 break;
2774 case L2CAP_EV_MONITOR_TO:
2775 if (chan->max_tx == 0 || chan->retry_count < chan->max_tx) {
2776 l2cap_send_rr_or_rnr(chan, 1);
2777 __set_monitor_timer(chan);
2778 chan->retry_count++;
2779 } else {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02002780 l2cap_send_disconn_req(chan, ECONNABORTED);
Mat Martineau608bcc62012-05-17 20:53:32 -07002781 }
2782 break;
2783 default:
2784 break;
2785 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002786}
2787
Gustavo Padovand6603662012-05-21 13:58:22 -03002788static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
2789 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002790{
Mat Martineau608bcc62012-05-17 20:53:32 -07002791 BT_DBG("chan %p, control %p, skbs %p, event %d, state %d",
2792 chan, control, skbs, event, chan->tx_state);
2793
2794 switch (chan->tx_state) {
2795 case L2CAP_TX_STATE_XMIT:
Gustavo Padovand6603662012-05-21 13:58:22 -03002796 l2cap_tx_state_xmit(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002797 break;
2798 case L2CAP_TX_STATE_WAIT_F:
Gustavo Padovand6603662012-05-21 13:58:22 -03002799 l2cap_tx_state_wait_f(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002800 break;
2801 default:
2802 /* Ignore event */
2803 break;
2804 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002805}
2806
Mat Martineau4b51dae92012-05-17 20:53:37 -07002807static void l2cap_pass_to_tx(struct l2cap_chan *chan,
2808 struct l2cap_ctrl *control)
2809{
2810 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002811 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_REQSEQ_AND_FBIT);
Mat Martineau4b51dae92012-05-17 20:53:37 -07002812}
2813
Mat Martineauf80842a2012-05-17 20:53:46 -07002814static void l2cap_pass_to_tx_fbit(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_FBIT);
Mat Martineauf80842a2012-05-17 20:53:46 -07002819}
2820
Linus Torvalds1da177e2005-04-16 15:20:36 -07002821/* Copy frame to all raw sockets on that connection */
2822static void l2cap_raw_recv(struct l2cap_conn *conn, struct sk_buff *skb)
2823{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002824 struct sk_buff *nskb;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03002825 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002826
2827 BT_DBG("conn %p", conn);
2828
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002829 mutex_lock(&conn->chan_lock);
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002830
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002831 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovan48454072011-03-25 00:22:30 -03002832 struct sock *sk = chan->sk;
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002833 if (chan->chan_type != L2CAP_CHAN_RAW)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002834 continue;
2835
2836 /* Don't send frame to the socket it came from */
2837 if (skb->sk == sk)
2838 continue;
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002839 nskb = skb_clone(skb, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03002840 if (!nskb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002841 continue;
2842
Gustavo Padovan80b98022012-05-27 22:27:51 -03002843 if (chan->ops->recv(chan, nskb))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002844 kfree_skb(nskb);
2845 }
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002846
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002847 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002848}
2849
2850/* ---- L2CAP signalling commands ---- */
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002851static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn, u8 code,
2852 u8 ident, u16 dlen, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002853{
2854 struct sk_buff *skb, **frag;
2855 struct l2cap_cmd_hdr *cmd;
2856 struct l2cap_hdr *lh;
2857 int len, count;
2858
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002859 BT_DBG("conn %p, code 0x%2.2x, ident 0x%2.2x, len %u",
2860 conn, code, ident, dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002861
Anderson Lizardo300b9622013-06-02 16:30:40 -04002862 if (conn->mtu < L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE)
2863 return NULL;
2864
Linus Torvalds1da177e2005-04-16 15:20:36 -07002865 len = L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE + dlen;
2866 count = min_t(unsigned int, conn->mtu, len);
2867
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002868 skb = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002869 if (!skb)
2870 return NULL;
2871
2872 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002873 lh->len = cpu_to_le16(L2CAP_CMD_HDR_SIZE + dlen);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002874
2875 if (conn->hcon->type == LE_LINK)
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03002876 lh->cid = __constant_cpu_to_le16(L2CAP_CID_LE_SIGNALING);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002877 else
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03002878 lh->cid = __constant_cpu_to_le16(L2CAP_CID_SIGNALING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002879
2880 cmd = (struct l2cap_cmd_hdr *) skb_put(skb, L2CAP_CMD_HDR_SIZE);
2881 cmd->code = code;
2882 cmd->ident = ident;
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002883 cmd->len = cpu_to_le16(dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002884
2885 if (dlen) {
2886 count -= L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE;
2887 memcpy(skb_put(skb, count), data, count);
2888 data += count;
2889 }
2890
2891 len -= skb->len;
2892
2893 /* Continuation fragments (no L2CAP header) */
2894 frag = &skb_shinfo(skb)->frag_list;
2895 while (len) {
2896 count = min_t(unsigned int, conn->mtu, len);
2897
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002898 *frag = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002899 if (!*frag)
2900 goto fail;
2901
2902 memcpy(skb_put(*frag, count), data, count);
2903
2904 len -= count;
2905 data += count;
2906
2907 frag = &(*frag)->next;
2908 }
2909
2910 return skb;
2911
2912fail:
2913 kfree_skb(skb);
2914 return NULL;
2915}
2916
Gustavo Padovan2d792812012-10-06 10:07:01 +01002917static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen,
2918 unsigned long *val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002919{
2920 struct l2cap_conf_opt *opt = *ptr;
2921 int len;
2922
2923 len = L2CAP_CONF_OPT_SIZE + opt->len;
2924 *ptr += len;
2925
2926 *type = opt->type;
2927 *olen = opt->len;
2928
2929 switch (opt->len) {
2930 case 1:
2931 *val = *((u8 *) opt->val);
2932 break;
2933
2934 case 2:
steven miaobfaaeb32010-10-16 18:29:47 -04002935 *val = get_unaligned_le16(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002936 break;
2937
2938 case 4:
steven miaobfaaeb32010-10-16 18:29:47 -04002939 *val = get_unaligned_le32(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002940 break;
2941
2942 default:
2943 *val = (unsigned long) opt->val;
2944 break;
2945 }
2946
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002947 BT_DBG("type 0x%2.2x len %u val 0x%lx", *type, opt->len, *val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002948 return len;
2949}
2950
Linus Torvalds1da177e2005-04-16 15:20:36 -07002951static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val)
2952{
2953 struct l2cap_conf_opt *opt = *ptr;
2954
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002955 BT_DBG("type 0x%2.2x len %u val 0x%lx", type, len, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002956
2957 opt->type = type;
2958 opt->len = len;
2959
2960 switch (len) {
2961 case 1:
2962 *((u8 *) opt->val) = val;
2963 break;
2964
2965 case 2:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02002966 put_unaligned_le16(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002967 break;
2968
2969 case 4:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02002970 put_unaligned_le32(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002971 break;
2972
2973 default:
2974 memcpy(opt->val, (void *) val, len);
2975 break;
2976 }
2977
2978 *ptr += L2CAP_CONF_OPT_SIZE + len;
2979}
2980
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03002981static void l2cap_add_opt_efs(void **ptr, struct l2cap_chan *chan)
2982{
2983 struct l2cap_conf_efs efs;
2984
Szymon Janc1ec918c2011-11-16 09:32:21 +01002985 switch (chan->mode) {
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03002986 case L2CAP_MODE_ERTM:
2987 efs.id = chan->local_id;
2988 efs.stype = chan->local_stype;
2989 efs.msdu = cpu_to_le16(chan->local_msdu);
2990 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03002991 efs.acc_lat = __constant_cpu_to_le32(L2CAP_DEFAULT_ACC_LAT);
Andrei Emeltchenko8936fa62012-10-08 11:14:41 +03002992 efs.flush_to = __constant_cpu_to_le32(L2CAP_EFS_DEFAULT_FLUSH_TO);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03002993 break;
2994
2995 case L2CAP_MODE_STREAMING:
2996 efs.id = 1;
2997 efs.stype = L2CAP_SERV_BESTEFFORT;
2998 efs.msdu = cpu_to_le16(chan->local_msdu);
2999 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
3000 efs.acc_lat = 0;
3001 efs.flush_to = 0;
3002 break;
3003
3004 default:
3005 return;
3006 }
3007
3008 l2cap_add_conf_opt(ptr, L2CAP_CONF_EFS, sizeof(efs),
Andrei Emeltchenko8936fa62012-10-08 11:14:41 +03003009 (unsigned long) &efs);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003010}
3011
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003012static void l2cap_ack_timeout(struct work_struct *work)
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003013{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003014 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau03625202012-05-17 20:53:51 -07003015 ack_timer.work);
3016 u16 frames_to_ack;
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003017
Gustavo F. Padovan2fb9b3d2011-12-22 16:56:05 -02003018 BT_DBG("chan %p", chan);
3019
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003020 l2cap_chan_lock(chan);
3021
Mat Martineau03625202012-05-17 20:53:51 -07003022 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
3023 chan->last_acked_seq);
3024
3025 if (frames_to_ack)
3026 l2cap_send_rr_or_rnr(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003027
3028 l2cap_chan_unlock(chan);
Szymon Janc09bfb2e2012-01-11 10:59:49 +01003029 l2cap_chan_put(chan);
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003030}
3031
Andrei Emeltchenko466f8002012-05-29 13:59:01 +03003032int l2cap_ertm_init(struct l2cap_chan *chan)
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003033{
Mat Martineau3c588192012-04-11 10:48:42 -07003034 int err;
3035
Mat Martineau105bdf92012-04-27 16:50:48 -07003036 chan->next_tx_seq = 0;
3037 chan->expected_tx_seq = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003038 chan->expected_ack_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003039 chan->unacked_frames = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003040 chan->buffer_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003041 chan->frames_sent = 0;
Mat Martineau105bdf92012-04-27 16:50:48 -07003042 chan->last_acked_seq = 0;
3043 chan->sdu = NULL;
3044 chan->sdu_last_frag = NULL;
3045 chan->sdu_len = 0;
3046
Mat Martineaud34c34f2012-05-14 14:49:27 -07003047 skb_queue_head_init(&chan->tx_q);
3048
Mat Martineau08333282012-10-23 15:24:06 -07003049 chan->local_amp_id = 0;
3050 chan->move_id = 0;
3051 chan->move_state = L2CAP_MOVE_STABLE;
3052 chan->move_role = L2CAP_MOVE_ROLE_NONE;
3053
Mat Martineau105bdf92012-04-27 16:50:48 -07003054 if (chan->mode != L2CAP_MODE_ERTM)
3055 return 0;
3056
3057 chan->rx_state = L2CAP_RX_STATE_RECV;
3058 chan->tx_state = L2CAP_TX_STATE_XMIT;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003059
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003060 INIT_DELAYED_WORK(&chan->retrans_timer, l2cap_retrans_timeout);
3061 INIT_DELAYED_WORK(&chan->monitor_timer, l2cap_monitor_timeout);
3062 INIT_DELAYED_WORK(&chan->ack_timer, l2cap_ack_timeout);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003063
Gustavo F. Padovanf1c67752011-03-25 20:36:10 -03003064 skb_queue_head_init(&chan->srej_q);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03003065
Mat Martineau3c588192012-04-11 10:48:42 -07003066 err = l2cap_seq_list_init(&chan->srej_list, chan->tx_win);
3067 if (err < 0)
3068 return err;
3069
Mat Martineau9dc9aff2012-05-17 16:20:14 -07003070 err = l2cap_seq_list_init(&chan->retrans_list, chan->remote_tx_win);
3071 if (err < 0)
3072 l2cap_seq_list_free(&chan->srej_list);
3073
3074 return err;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003075}
3076
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003077static inline __u8 l2cap_select_mode(__u8 mode, __u16 remote_feat_mask)
3078{
3079 switch (mode) {
3080 case L2CAP_MODE_STREAMING:
3081 case L2CAP_MODE_ERTM:
3082 if (l2cap_mode_supported(mode, remote_feat_mask))
3083 return mode;
3084 /* fall through */
3085 default:
3086 return L2CAP_MODE_BASIC;
3087 }
3088}
3089
Marcel Holtmann848566b2013-10-01 22:59:22 -07003090static inline bool __l2cap_ews_supported(struct l2cap_conn *conn)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003091{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003092 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003093}
3094
Marcel Holtmann848566b2013-10-01 22:59:22 -07003095static inline bool __l2cap_efs_supported(struct l2cap_conn *conn)
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003096{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003097 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_FLOW;
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003098}
3099
Mat Martineau36c86c82012-10-23 15:24:20 -07003100static void __l2cap_set_ertm_timeouts(struct l2cap_chan *chan,
3101 struct l2cap_conf_rfc *rfc)
3102{
3103 if (chan->local_amp_id && chan->hs_hcon) {
3104 u64 ertm_to = chan->hs_hcon->hdev->amp_be_flush_to;
3105
3106 /* Class 1 devices have must have ERTM timeouts
3107 * exceeding the Link Supervision Timeout. The
3108 * default Link Supervision Timeout for AMP
3109 * controllers is 10 seconds.
3110 *
3111 * Class 1 devices use 0xffffffff for their
3112 * best-effort flush timeout, so the clamping logic
3113 * will result in a timeout that meets the above
3114 * requirement. ERTM timeouts are 16-bit values, so
3115 * the maximum timeout is 65.535 seconds.
3116 */
3117
3118 /* Convert timeout to milliseconds and round */
3119 ertm_to = DIV_ROUND_UP_ULL(ertm_to, 1000);
3120
3121 /* This is the recommended formula for class 2 devices
3122 * that start ERTM timers when packets are sent to the
3123 * controller.
3124 */
3125 ertm_to = 3 * ertm_to + 500;
3126
3127 if (ertm_to > 0xffff)
3128 ertm_to = 0xffff;
3129
3130 rfc->retrans_timeout = cpu_to_le16((u16) ertm_to);
3131 rfc->monitor_timeout = rfc->retrans_timeout;
3132 } else {
3133 rfc->retrans_timeout = __constant_cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO);
3134 rfc->monitor_timeout = __constant_cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO);
3135 }
3136}
3137
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003138static inline void l2cap_txwin_setup(struct l2cap_chan *chan)
3139{
3140 if (chan->tx_win > L2CAP_DEFAULT_TX_WINDOW &&
Marcel Holtmann848566b2013-10-01 22:59:22 -07003141 __l2cap_ews_supported(chan->conn)) {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003142 /* use extended control field */
3143 set_bit(FLAG_EXT_CTRL, &chan->flags);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003144 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
3145 } else {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003146 chan->tx_win = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003147 L2CAP_DEFAULT_TX_WINDOW);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003148 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
3149 }
Mat Martineauc20f8e32012-07-10 05:47:07 -07003150 chan->ack_win = chan->tx_win;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003151}
3152
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003153static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003154{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003155 struct l2cap_conf_req *req = data;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003156 struct l2cap_conf_rfc rfc = { .mode = chan->mode };
Linus Torvalds1da177e2005-04-16 15:20:36 -07003157 void *ptr = req->data;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003158 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003159
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03003160 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003161
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003162 if (chan->num_conf_req || chan->num_conf_rsp)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003163 goto done;
3164
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003165 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003166 case L2CAP_MODE_STREAMING:
3167 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003168 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state))
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003169 break;
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003170
Marcel Holtmann848566b2013-10-01 22:59:22 -07003171 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003172 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3173
Gustavo F. Padovan2ba13ed2010-06-09 16:39:05 -03003174 /* fall through */
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003175 default:
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003176 chan->mode = l2cap_select_mode(rfc.mode, chan->conn->feat_mask);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003177 break;
3178 }
3179
3180done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003181 if (chan->imtu != L2CAP_DEFAULT_MTU)
3182 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovan7990681c2011-01-24 16:01:43 -02003183
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003184 switch (chan->mode) {
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003185 case L2CAP_MODE_BASIC:
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003186 if (!(chan->conn->feat_mask & L2CAP_FEAT_ERTM) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003187 !(chan->conn->feat_mask & L2CAP_FEAT_STREAMING))
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003188 break;
3189
Gustavo F. Padovan62547752010-06-08 20:05:31 -03003190 rfc.mode = L2CAP_MODE_BASIC;
3191 rfc.txwin_size = 0;
3192 rfc.max_transmit = 0;
3193 rfc.retrans_timeout = 0;
3194 rfc.monitor_timeout = 0;
3195 rfc.max_pdu_size = 0;
3196
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003197 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003198 (unsigned long) &rfc);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003199 break;
3200
3201 case L2CAP_MODE_ERTM:
3202 rfc.mode = L2CAP_MODE_ERTM;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003203 rfc.max_transmit = chan->max_tx;
Mat Martineau36c86c82012-10-23 15:24:20 -07003204
3205 __l2cap_set_ertm_timeouts(chan, &rfc);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003206
3207 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003208 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3209 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003210 rfc.max_pdu_size = cpu_to_le16(size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003211
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003212 l2cap_txwin_setup(chan);
3213
3214 rfc.txwin_size = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003215 L2CAP_DEFAULT_TX_WINDOW);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003216
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003217 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003218 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003219
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003220 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3221 l2cap_add_opt_efs(&ptr, chan);
3222
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003223 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3224 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003225 chan->tx_win);
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003226
3227 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3228 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003229 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003230 chan->fcs = L2CAP_FCS_NONE;
3231 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3232 chan->fcs);
3233 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003234 break;
3235
3236 case L2CAP_MODE_STREAMING:
Mat Martineau273759e2012-05-17 20:53:53 -07003237 l2cap_txwin_setup(chan);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003238 rfc.mode = L2CAP_MODE_STREAMING;
3239 rfc.txwin_size = 0;
3240 rfc.max_transmit = 0;
3241 rfc.retrans_timeout = 0;
3242 rfc.monitor_timeout = 0;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003243
3244 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003245 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3246 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003247 rfc.max_pdu_size = cpu_to_le16(size);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003248
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003249 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003250 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003251
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003252 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3253 l2cap_add_opt_efs(&ptr, chan);
3254
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003255 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3256 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003257 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003258 chan->fcs = L2CAP_FCS_NONE;
3259 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3260 chan->fcs);
3261 }
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003262 break;
3263 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003264
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003265 req->dcid = cpu_to_le16(chan->dcid);
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03003266 req->flags = __constant_cpu_to_le16(0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003267
3268 return ptr - data;
3269}
3270
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003271static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003272{
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003273 struct l2cap_conf_rsp *rsp = data;
3274 void *ptr = rsp->data;
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003275 void *req = chan->conf_req;
3276 int len = chan->conf_len;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003277 int type, hint, olen;
3278 unsigned long val;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003279 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003280 struct l2cap_conf_efs efs;
3281 u8 remote_efs = 0;
Marcel Holtmann861d6882007-10-20 13:37:06 +02003282 u16 mtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003283 u16 result = L2CAP_CONF_SUCCESS;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003284 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003285
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003286 BT_DBG("chan %p", chan);
Marcel Holtmann820ae1b2006-11-18 22:15:00 +01003287
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003288 while (len >= L2CAP_CONF_OPT_SIZE) {
3289 len -= l2cap_get_conf_opt(&req, &type, &olen, &val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003290
Gustavo F. Padovan589d2742009-04-20 01:31:07 -03003291 hint = type & L2CAP_CONF_HINT;
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07003292 type &= L2CAP_CONF_MASK;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003293
3294 switch (type) {
3295 case L2CAP_CONF_MTU:
Marcel Holtmann861d6882007-10-20 13:37:06 +02003296 mtu = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003297 break;
3298
3299 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003300 chan->flush_to = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003301 break;
3302
3303 case L2CAP_CONF_QOS:
3304 break;
3305
Marcel Holtmann6464f352007-10-20 13:39:51 +02003306 case L2CAP_CONF_RFC:
3307 if (olen == sizeof(rfc))
3308 memcpy(&rfc, (void *) val, olen);
3309 break;
3310
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003311 case L2CAP_CONF_FCS:
3312 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003313 set_bit(CONF_RECV_NO_FCS, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003314 break;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003315
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003316 case L2CAP_CONF_EFS:
3317 remote_efs = 1;
3318 if (olen == sizeof(efs))
3319 memcpy(&efs, (void *) val, olen);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003320 break;
3321
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003322 case L2CAP_CONF_EWS:
Marcel Holtmann848566b2013-10-01 22:59:22 -07003323 if (!chan->conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003324 return -ECONNREFUSED;
3325
3326 set_bit(FLAG_EXT_CTRL, &chan->flags);
3327 set_bit(CONF_EWS_RECV, &chan->conf_state);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003328 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003329 chan->remote_tx_win = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003330 break;
3331
3332 default:
3333 if (hint)
3334 break;
3335
3336 result = L2CAP_CONF_UNKNOWN;
3337 *((u8 *) ptr++) = type;
3338 break;
3339 }
3340 }
3341
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003342 if (chan->num_conf_rsp || chan->num_conf_req > 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003343 goto done;
3344
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003345 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003346 case L2CAP_MODE_STREAMING:
3347 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003348 if (!test_bit(CONF_STATE2_DEVICE, &chan->conf_state)) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003349 chan->mode = l2cap_select_mode(rfc.mode,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003350 chan->conn->feat_mask);
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003351 break;
3352 }
3353
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003354 if (remote_efs) {
Marcel Holtmann848566b2013-10-01 22:59:22 -07003355 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003356 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3357 else
3358 return -ECONNREFUSED;
3359 }
3360
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003361 if (chan->mode != rfc.mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003362 return -ECONNREFUSED;
Gustavo F. Padovan742e5192010-06-08 19:09:48 -03003363
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003364 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003365 }
3366
3367done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003368 if (chan->mode != rfc.mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003369 result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003370 rfc.mode = chan->mode;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003371
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003372 if (chan->num_conf_rsp == 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003373 return -ECONNREFUSED;
3374
Gustavo Padovan2d792812012-10-06 10:07:01 +01003375 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3376 (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003377 }
3378
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003379 if (result == L2CAP_CONF_SUCCESS) {
3380 /* Configure output options and let the other side know
3381 * which ones we don't like. */
3382
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003383 if (mtu < L2CAP_DEFAULT_MIN_MTU)
3384 result = L2CAP_CONF_UNACCEPT;
3385 else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003386 chan->omtu = mtu;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003387 set_bit(CONF_MTU_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003388 }
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003389 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->omtu);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003390
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003391 if (remote_efs) {
3392 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003393 efs.stype != L2CAP_SERV_NOTRAFIC &&
3394 efs.stype != chan->local_stype) {
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003395
3396 result = L2CAP_CONF_UNACCEPT;
3397
3398 if (chan->num_conf_req >= 1)
3399 return -ECONNREFUSED;
3400
3401 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003402 sizeof(efs),
3403 (unsigned long) &efs);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003404 } else {
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003405 /* Send PENDING Conf Rsp */
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003406 result = L2CAP_CONF_PENDING;
3407 set_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003408 }
3409 }
3410
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003411 switch (rfc.mode) {
3412 case L2CAP_MODE_BASIC:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003413 chan->fcs = L2CAP_FCS_NONE;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003414 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003415 break;
3416
3417 case L2CAP_MODE_ERTM:
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003418 if (!test_bit(CONF_EWS_RECV, &chan->conf_state))
3419 chan->remote_tx_win = rfc.txwin_size;
3420 else
3421 rfc.txwin_size = L2CAP_DEFAULT_TX_WINDOW;
3422
Gustavo F. Padovan2c03a7a2011-03-25 20:15:28 -03003423 chan->remote_max_tx = rfc.max_transmit;
Mat Martineau86b1b262010-08-05 15:54:22 -07003424
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003425 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003426 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3427 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003428 rfc.max_pdu_size = cpu_to_le16(size);
3429 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003430
Mat Martineau36c86c82012-10-23 15:24:20 -07003431 __l2cap_set_ertm_timeouts(chan, &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003432
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003433 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003434
3435 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003436 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003437
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003438 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3439 chan->remote_id = efs.id;
3440 chan->remote_stype = efs.stype;
3441 chan->remote_msdu = le16_to_cpu(efs.msdu);
3442 chan->remote_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003443 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003444 chan->remote_acc_lat =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003445 le32_to_cpu(efs.acc_lat);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003446 chan->remote_sdu_itime =
3447 le32_to_cpu(efs.sdu_itime);
3448 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003449 sizeof(efs),
3450 (unsigned long) &efs);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003451 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003452 break;
3453
3454 case L2CAP_MODE_STREAMING:
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003455 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003456 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3457 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003458 rfc.max_pdu_size = cpu_to_le16(size);
3459 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003460
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003461 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003462
Gustavo Padovan2d792812012-10-06 10:07:01 +01003463 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3464 (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003465
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003466 break;
3467
3468 default:
Marcel Holtmann6464f352007-10-20 13:39:51 +02003469 result = L2CAP_CONF_UNACCEPT;
3470
3471 memset(&rfc, 0, sizeof(rfc));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003472 rfc.mode = chan->mode;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003473 }
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003474
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003475 if (result == L2CAP_CONF_SUCCESS)
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003476 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003477 }
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003478 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003479 rsp->result = cpu_to_le16(result);
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03003480 rsp->flags = __constant_cpu_to_le16(0);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003481
3482 return ptr - data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003483}
3484
Gustavo Padovan2d792812012-10-06 10:07:01 +01003485static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len,
3486 void *data, u16 *result)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003487{
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003488 struct l2cap_conf_req *req = data;
3489 void *ptr = req->data;
3490 int type, olen;
3491 unsigned long val;
Mat Martineau36e999a2011-12-08 17:23:21 -08003492 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003493 struct l2cap_conf_efs efs;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003494
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003495 BT_DBG("chan %p, rsp %p, len %d, req %p", chan, rsp, len, data);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003496
3497 while (len >= L2CAP_CONF_OPT_SIZE) {
3498 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3499
3500 switch (type) {
3501 case L2CAP_CONF_MTU:
3502 if (val < L2CAP_DEFAULT_MIN_MTU) {
3503 *result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003504 chan->imtu = L2CAP_DEFAULT_MIN_MTU;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003505 } else
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003506 chan->imtu = val;
3507 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003508 break;
3509
3510 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003511 chan->flush_to = val;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003512 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003513 2, chan->flush_to);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003514 break;
3515
3516 case L2CAP_CONF_RFC:
3517 if (olen == sizeof(rfc))
3518 memcpy(&rfc, (void *)val, olen);
3519
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003520 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003521 rfc.mode != chan->mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003522 return -ECONNREFUSED;
3523
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003524 chan->fcs = 0;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003525
3526 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003527 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003528 break;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003529
3530 case L2CAP_CONF_EWS:
Mat Martineauc20f8e32012-07-10 05:47:07 -07003531 chan->ack_win = min_t(u16, val, chan->ack_win);
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003532 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Mat Martineauc20f8e32012-07-10 05:47:07 -07003533 chan->tx_win);
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003534 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003535
3536 case L2CAP_CONF_EFS:
3537 if (olen == sizeof(efs))
3538 memcpy(&efs, (void *)val, olen);
3539
3540 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003541 efs.stype != L2CAP_SERV_NOTRAFIC &&
3542 efs.stype != chan->local_stype)
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003543 return -ECONNREFUSED;
3544
Gustavo Padovan2d792812012-10-06 10:07:01 +01003545 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS, sizeof(efs),
3546 (unsigned long) &efs);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003547 break;
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003548
3549 case L2CAP_CONF_FCS:
3550 if (*result == L2CAP_CONF_PENDING)
3551 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003552 set_bit(CONF_RECV_NO_FCS,
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003553 &chan->conf_state);
3554 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003555 }
3556 }
3557
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003558 if (chan->mode == L2CAP_MODE_BASIC && chan->mode != rfc.mode)
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003559 return -ECONNREFUSED;
3560
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003561 chan->mode = rfc.mode;
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003562
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003563 if (*result == L2CAP_CONF_SUCCESS || *result == L2CAP_CONF_PENDING) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003564 switch (rfc.mode) {
3565 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003566 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3567 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
3568 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003569 if (!test_bit(FLAG_EXT_CTRL, &chan->flags))
3570 chan->ack_win = min_t(u16, chan->ack_win,
3571 rfc.txwin_size);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003572
3573 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3574 chan->local_msdu = le16_to_cpu(efs.msdu);
3575 chan->local_sdu_itime =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003576 le32_to_cpu(efs.sdu_itime);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003577 chan->local_acc_lat = le32_to_cpu(efs.acc_lat);
3578 chan->local_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003579 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003580 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003581 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003582
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003583 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003584 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003585 }
3586 }
3587
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003588 req->dcid = cpu_to_le16(chan->dcid);
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03003589 req->flags = __constant_cpu_to_le16(0);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003590
3591 return ptr - data;
3592}
3593
Gustavo Padovan2d792812012-10-06 10:07:01 +01003594static int l2cap_build_conf_rsp(struct l2cap_chan *chan, void *data,
3595 u16 result, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003596{
3597 struct l2cap_conf_rsp *rsp = data;
3598 void *ptr = rsp->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003599
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003600 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003601
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003602 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003603 rsp->result = cpu_to_le16(result);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003604 rsp->flags = cpu_to_le16(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003605
3606 return ptr - data;
3607}
3608
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003609void __l2cap_connect_rsp_defer(struct l2cap_chan *chan)
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003610{
3611 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003612 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003613 u8 buf[128];
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003614 u8 rsp_code;
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003615
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003616 rsp.scid = cpu_to_le16(chan->dcid);
3617 rsp.dcid = cpu_to_le16(chan->scid);
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03003618 rsp.result = __constant_cpu_to_le16(L2CAP_CR_SUCCESS);
3619 rsp.status = __constant_cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003620
3621 if (chan->hs_hcon)
3622 rsp_code = L2CAP_CREATE_CHAN_RSP;
3623 else
3624 rsp_code = L2CAP_CONN_RSP;
3625
3626 BT_DBG("chan %p rsp_code %u", chan, rsp_code);
3627
3628 l2cap_send_cmd(conn, chan->ident, rsp_code, sizeof(rsp), &rsp);
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003629
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003630 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003631 return;
3632
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003633 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003634 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003635 chan->num_conf_req++;
3636}
3637
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003638static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len)
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003639{
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003640 int type, olen;
3641 unsigned long val;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003642 /* Use sane default values in case a misbehaving remote device
3643 * did not send an RFC or extended window size option.
3644 */
3645 u16 txwin_ext = chan->ack_win;
3646 struct l2cap_conf_rfc rfc = {
3647 .mode = chan->mode,
3648 .retrans_timeout = __constant_cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO),
3649 .monitor_timeout = __constant_cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO),
3650 .max_pdu_size = cpu_to_le16(chan->imtu),
3651 .txwin_size = min_t(u16, chan->ack_win, L2CAP_DEFAULT_TX_WINDOW),
3652 };
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003653
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003654 BT_DBG("chan %p, rsp %p, len %d", chan, rsp, len);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003655
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003656 if ((chan->mode != L2CAP_MODE_ERTM) && (chan->mode != L2CAP_MODE_STREAMING))
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003657 return;
3658
3659 while (len >= L2CAP_CONF_OPT_SIZE) {
3660 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3661
Mat Martineauc20f8e32012-07-10 05:47:07 -07003662 switch (type) {
3663 case L2CAP_CONF_RFC:
3664 if (olen == sizeof(rfc))
3665 memcpy(&rfc, (void *)val, olen);
Szymon Janc8f321f82012-06-08 11:33:33 +02003666 break;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003667 case L2CAP_CONF_EWS:
3668 txwin_ext = val;
3669 break;
3670 }
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003671 }
3672
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003673 switch (rfc.mode) {
3674 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003675 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3676 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003677 chan->mps = le16_to_cpu(rfc.max_pdu_size);
3678 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3679 chan->ack_win = min_t(u16, chan->ack_win, txwin_ext);
3680 else
3681 chan->ack_win = min_t(u16, chan->ack_win,
3682 rfc.txwin_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003683 break;
3684 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003685 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003686 }
3687}
3688
Gustavo Padovan2d792812012-10-06 10:07:01 +01003689static inline int l2cap_command_rej(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003690 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3691 u8 *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003692{
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003693 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003694
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003695 if (cmd_len < sizeof(*rej))
3696 return -EPROTO;
3697
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003698 if (rej->reason != L2CAP_REJ_NOT_UNDERSTOOD)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003699 return 0;
3700
3701 if ((conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003702 cmd->ident == conn->info_ident) {
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02003703 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann984947d2009-02-06 23:35:19 +01003704
3705 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01003706 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01003707
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003708 l2cap_conn_start(conn);
3709 }
3710
3711 return 0;
3712}
3713
Mat Martineau17009152012-10-23 15:24:07 -07003714static struct l2cap_chan *l2cap_connect(struct l2cap_conn *conn,
3715 struct l2cap_cmd_hdr *cmd,
3716 u8 *data, u8 rsp_code, u8 amp_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003717{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003718 struct l2cap_conn_req *req = (struct l2cap_conn_req *) data;
3719 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003720 struct l2cap_chan *chan = NULL, *pchan;
Nathan Holsteind793fe82010-10-15 11:54:02 -04003721 struct sock *parent, *sk = NULL;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003722 int result, status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003723
3724 u16 dcid = 0, scid = __le16_to_cpu(req->scid);
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003725 __le16 psm = req->psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003726
Andrei Emeltchenko097db762012-03-09 14:16:17 +02003727 BT_DBG("psm 0x%2.2x scid 0x%4.4x", __le16_to_cpu(psm), scid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003728
3729 /* Check if we have socket listening on psm */
Ido Yarivc2287682012-04-20 15:46:07 -03003730 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, conn->src, conn->dst);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003731 if (!pchan) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003732 result = L2CAP_CR_BAD_PSM;
3733 goto sendresp;
3734 }
3735
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003736 parent = pchan->sk;
3737
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003738 mutex_lock(&conn->chan_lock);
Gustavo F. Padovanaa2ac882011-06-24 01:53:01 -03003739 lock_sock(parent);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00003740
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003741 /* Check if the ACL is secure enough (if not SDP) */
Andrei Emeltchenko2983fd62012-05-24 15:42:50 +03003742 if (psm != __constant_cpu_to_le16(L2CAP_PSM_SDP) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003743 !hci_conn_check_link_mode(conn->hcon)) {
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02003744 conn->disc_reason = HCI_ERROR_AUTH_FAILURE;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003745 result = L2CAP_CR_SEC_BLOCK;
3746 goto response;
3747 }
3748
Linus Torvalds1da177e2005-04-16 15:20:36 -07003749 result = L2CAP_CR_NO_MEM;
3750
Gustavo Padovan2dfa1002012-05-27 22:27:58 -03003751 /* Check if we already have channel with that dcid */
3752 if (__l2cap_get_chan_by_dcid(conn, scid))
3753 goto response;
3754
Gustavo Padovan80b98022012-05-27 22:27:51 -03003755 chan = pchan->ops->new_connection(pchan);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03003756 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003757 goto response;
3758
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03003759 sk = chan->sk;
3760
Syam Sidhardhan330b6c12013-08-06 01:59:12 +09003761 /* For certain devices (ex: HID mouse), support for authentication,
3762 * pairing and bonding is optional. For such devices, inorder to avoid
3763 * the ACL alive for too long after L2CAP disconnection, reset the ACL
3764 * disc_timeout back to HCI_DISCONN_TIMEOUT during L2CAP connect.
3765 */
3766 conn->hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
3767
Linus Torvalds1da177e2005-04-16 15:20:36 -07003768 bacpy(&bt_sk(sk)->src, conn->src);
3769 bacpy(&bt_sk(sk)->dst, conn->dst);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003770 chan->psm = psm;
3771 chan->dcid = scid;
Mat Martineau17009152012-10-23 15:24:07 -07003772 chan->local_amp_id = amp_id;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003773
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003774 __l2cap_chan_add(conn, chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003775
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003776 dcid = chan->scid;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003777
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -03003778 __set_chan_timer(chan, sk->sk_sndtimeo);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003779
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003780 chan->ident = cmd->ident;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003781
Marcel Holtmann984947d2009-02-06 23:35:19 +01003782 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) {
Gustavo F. Padovand45fc422011-11-05 19:54:24 -02003783 if (l2cap_chan_check_security(chan)) {
Gustavo Padovanc5daa682012-05-16 12:17:10 -03003784 if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) {
Andrei Emeltchenko0e587be2012-02-21 12:54:57 +02003785 __l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003786 result = L2CAP_CR_PEND;
3787 status = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08003788 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003789 } else {
Mat Martineau17009152012-10-23 15:24:07 -07003790 /* Force pending result for AMP controllers.
3791 * The connection will succeed after the
3792 * physical link is up.
3793 */
3794 if (amp_id) {
3795 __l2cap_state_change(chan, BT_CONNECT2);
3796 result = L2CAP_CR_PEND;
3797 } else {
3798 __l2cap_state_change(chan, BT_CONFIG);
3799 result = L2CAP_CR_SUCCESS;
3800 }
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003801 status = L2CAP_CS_NO_INFO;
3802 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003803 } else {
Andrei Emeltchenko0e587be2012-02-21 12:54:57 +02003804 __l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003805 result = L2CAP_CR_PEND;
3806 status = L2CAP_CS_AUTHEN_PEND;
3807 }
3808 } else {
Andrei Emeltchenko0e587be2012-02-21 12:54:57 +02003809 __l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003810 result = L2CAP_CR_PEND;
3811 status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003812 }
3813
Linus Torvalds1da177e2005-04-16 15:20:36 -07003814response:
Gustavo F. Padovanaa2ac882011-06-24 01:53:01 -03003815 release_sock(parent);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003816 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003817
3818sendresp:
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003819 rsp.scid = cpu_to_le16(scid);
3820 rsp.dcid = cpu_to_le16(dcid);
3821 rsp.result = cpu_to_le16(result);
3822 rsp.status = cpu_to_le16(status);
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003823 l2cap_send_cmd(conn, cmd->ident, rsp_code, sizeof(rsp), &rsp);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003824
3825 if (result == L2CAP_CR_PEND && status == L2CAP_CS_NO_INFO) {
3826 struct l2cap_info_req info;
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03003827 info.type = __constant_cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003828
3829 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
3830 conn->info_ident = l2cap_get_ident(conn);
3831
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08003832 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003833
Gustavo Padovan2d792812012-10-06 10:07:01 +01003834 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
3835 sizeof(info), &info);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003836 }
3837
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003838 if (chan && !test_bit(CONF_REQ_SENT, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003839 result == L2CAP_CR_SUCCESS) {
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003840 u8 buf[128];
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003841 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003842 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003843 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003844 chan->num_conf_req++;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003845 }
Mat Martineau17009152012-10-23 15:24:07 -07003846
3847 return chan;
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003848}
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003849
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003850static int l2cap_connect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003851 struct l2cap_cmd_hdr *cmd, u16 cmd_len, u8 *data)
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003852{
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303853 struct hci_dev *hdev = conn->hcon->hdev;
3854 struct hci_conn *hcon = conn->hcon;
3855
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003856 if (cmd_len < sizeof(struct l2cap_conn_req))
3857 return -EPROTO;
3858
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303859 hci_dev_lock(hdev);
3860 if (test_bit(HCI_MGMT, &hdev->dev_flags) &&
3861 !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &hcon->flags))
3862 mgmt_device_connected(hdev, &hcon->dst, hcon->type,
3863 hcon->dst_type, 0, NULL, 0,
3864 hcon->dev_class);
3865 hci_dev_unlock(hdev);
3866
Gustavo Padovan300229f2012-10-12 19:40:40 +08003867 l2cap_connect(conn, cmd, data, L2CAP_CONN_RSP, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003868 return 0;
3869}
3870
Mat Martineau5909cf32012-10-23 15:24:08 -07003871static int l2cap_connect_create_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003872 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3873 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003874{
3875 struct l2cap_conn_rsp *rsp = (struct l2cap_conn_rsp *) data;
3876 u16 scid, dcid, result, status;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003877 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003878 u8 req[128];
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003879 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003880
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003881 if (cmd_len < sizeof(*rsp))
3882 return -EPROTO;
3883
Linus Torvalds1da177e2005-04-16 15:20:36 -07003884 scid = __le16_to_cpu(rsp->scid);
3885 dcid = __le16_to_cpu(rsp->dcid);
3886 result = __le16_to_cpu(rsp->result);
3887 status = __le16_to_cpu(rsp->status);
3888
Andrei Emeltchenko1b009c92012-02-21 12:54:54 +02003889 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 +01003890 dcid, scid, result, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003891
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003892 mutex_lock(&conn->chan_lock);
3893
Linus Torvalds1da177e2005-04-16 15:20:36 -07003894 if (scid) {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003895 chan = __l2cap_get_chan_by_scid(conn, scid);
3896 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003897 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003898 goto unlock;
3899 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003900 } else {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003901 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
3902 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003903 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003904 goto unlock;
3905 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003906 }
3907
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003908 err = 0;
3909
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003910 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003911
Linus Torvalds1da177e2005-04-16 15:20:36 -07003912 switch (result) {
3913 case L2CAP_CR_SUCCESS:
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03003914 l2cap_state_change(chan, BT_CONFIG);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003915 chan->ident = 0;
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003916 chan->dcid = dcid;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003917 clear_bit(CONF_CONNECT_PEND, &chan->conf_state);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01003918
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003919 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003920 break;
3921
Linus Torvalds1da177e2005-04-16 15:20:36 -07003922 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003923 l2cap_build_conf_req(chan, req), req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003924 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003925 break;
3926
3927 case L2CAP_CR_PEND:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003928 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003929 break;
3930
3931 default:
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003932 l2cap_chan_del(chan, ECONNREFUSED);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003933 break;
3934 }
3935
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003936 l2cap_chan_unlock(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003937
3938unlock:
3939 mutex_unlock(&conn->chan_lock);
3940
3941 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003942}
3943
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003944static inline void set_default_fcs(struct l2cap_chan *chan)
Mat Martineau8c462b62010-08-24 15:35:42 -07003945{
3946 /* FCS is enabled only in ERTM or streaming mode, if one or both
3947 * sides request it.
3948 */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003949 if (chan->mode != L2CAP_MODE_ERTM && chan->mode != L2CAP_MODE_STREAMING)
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003950 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003951 else if (!test_bit(CONF_RECV_NO_FCS, &chan->conf_state))
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003952 chan->fcs = L2CAP_FCS_CRC16;
Mat Martineau8c462b62010-08-24 15:35:42 -07003953}
3954
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03003955static void l2cap_send_efs_conf_rsp(struct l2cap_chan *chan, void *data,
3956 u8 ident, u16 flags)
3957{
3958 struct l2cap_conn *conn = chan->conn;
3959
3960 BT_DBG("conn %p chan %p ident %d flags 0x%4.4x", conn, chan, ident,
3961 flags);
3962
3963 clear_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
3964 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
3965
3966 l2cap_send_cmd(conn, ident, L2CAP_CONF_RSP,
3967 l2cap_build_conf_rsp(chan, data,
3968 L2CAP_CONF_SUCCESS, flags), data);
3969}
3970
Gustavo Padovan2d792812012-10-06 10:07:01 +01003971static inline int l2cap_config_req(struct l2cap_conn *conn,
3972 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3973 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003974{
3975 struct l2cap_conf_req *req = (struct l2cap_conf_req *) data;
3976 u16 dcid, flags;
3977 u8 rsp[64];
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003978 struct l2cap_chan *chan;
Mat Martineau3c588192012-04-11 10:48:42 -07003979 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003980
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003981 if (cmd_len < sizeof(*req))
3982 return -EPROTO;
3983
Linus Torvalds1da177e2005-04-16 15:20:36 -07003984 dcid = __le16_to_cpu(req->dcid);
3985 flags = __le16_to_cpu(req->flags);
3986
3987 BT_DBG("dcid 0x%4.4x flags 0x%2.2x", dcid, flags);
3988
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03003989 chan = l2cap_get_chan_by_scid(conn, dcid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003990 if (!chan)
Johan Hedberg21870b52013-09-16 13:05:14 +03003991 return -EBADSLT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003992
David S. Miller033b1142011-07-21 13:38:42 -07003993 if (chan->state != BT_CONFIG && chan->state != BT_CONNECT2) {
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003994 struct l2cap_cmd_rej_cid rej;
Gustavo F. Padovandf6bd742010-06-14 02:26:15 -03003995
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03003996 rej.reason = __constant_cpu_to_le16(L2CAP_REJ_INVALID_CID);
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003997 rej.scid = cpu_to_le16(chan->scid);
3998 rej.dcid = cpu_to_le16(chan->dcid);
3999
Gustavo F. Padovandf6bd742010-06-14 02:26:15 -03004000 l2cap_send_cmd(conn, cmd->ident, L2CAP_COMMAND_REJ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004001 sizeof(rej), &rej);
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004002 goto unlock;
Gustavo F. Padovandf6bd742010-06-14 02:26:15 -03004003 }
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004004
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004005 /* Reject if config buffer is too small. */
Al Viro88219a02007-07-29 00:17:25 -07004006 len = cmd_len - sizeof(*req);
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004007 if (chan->conf_len + len > sizeof(chan->conf_req)) {
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004008 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004009 l2cap_build_conf_rsp(chan, rsp,
4010 L2CAP_CONF_REJECT, flags), rsp);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004011 goto unlock;
4012 }
4013
4014 /* Store config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004015 memcpy(chan->conf_req + chan->conf_len, req->data, len);
4016 chan->conf_len += len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004017
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004018 if (flags & L2CAP_CONF_FLAG_CONTINUATION) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004019 /* Incomplete config. Send empty response. */
4020 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004021 l2cap_build_conf_rsp(chan, rsp,
4022 L2CAP_CONF_SUCCESS, flags), rsp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004023 goto unlock;
4024 }
4025
4026 /* Complete config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004027 len = l2cap_parse_conf_req(chan, rsp);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004028 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004029 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004030 goto unlock;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004031 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004032
Mat Martineau1500109b2012-10-23 15:24:15 -07004033 chan->ident = cmd->ident;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004034 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004035 chan->num_conf_rsp++;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004036
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004037 /* Reset config buffer. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004038 chan->conf_len = 0;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004039
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004040 if (!test_bit(CONF_OUTPUT_DONE, &chan->conf_state))
Marcel Holtmann876d9482007-10-20 13:35:42 +02004041 goto unlock;
4042
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004043 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004044 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004045
Mat Martineau105bdf92012-04-27 16:50:48 -07004046 if (chan->mode == L2CAP_MODE_ERTM ||
4047 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004048 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004049
Mat Martineau3c588192012-04-11 10:48:42 -07004050 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004051 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004052 else
4053 l2cap_chan_ready(chan);
4054
Marcel Holtmann876d9482007-10-20 13:35:42 +02004055 goto unlock;
4056 }
4057
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004058 if (!test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02004059 u8 buf[64];
Linus Torvalds1da177e2005-04-16 15:20:36 -07004060 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004061 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004062 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004063 }
4064
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004065 /* Got Conf Rsp PENDING from remote side and asume we sent
4066 Conf Rsp PENDING in the code above */
4067 if (test_bit(CONF_REM_CONF_PEND, &chan->conf_state) &&
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03004068 test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004069
4070 /* check compatibility */
4071
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004072 /* Send rsp for BR/EDR channel */
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004073 if (!chan->hs_hcon)
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004074 l2cap_send_efs_conf_rsp(chan, rsp, cmd->ident, flags);
4075 else
4076 chan->ident = cmd->ident;
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004077 }
4078
Linus Torvalds1da177e2005-04-16 15:20:36 -07004079unlock:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004080 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004081 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004082}
4083
Gustavo Padovan2d792812012-10-06 10:07:01 +01004084static inline int l2cap_config_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004085 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4086 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004087{
4088 struct l2cap_conf_rsp *rsp = (struct l2cap_conf_rsp *)data;
4089 u16 scid, flags, result;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004090 struct l2cap_chan *chan;
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004091 int len = cmd_len - sizeof(*rsp);
Mat Martineau3c588192012-04-11 10:48:42 -07004092 int err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004093
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004094 if (cmd_len < sizeof(*rsp))
4095 return -EPROTO;
4096
Linus Torvalds1da177e2005-04-16 15:20:36 -07004097 scid = __le16_to_cpu(rsp->scid);
4098 flags = __le16_to_cpu(rsp->flags);
4099 result = __le16_to_cpu(rsp->result);
4100
Andrei Emeltchenko61386cb2012-03-12 12:13:07 +02004101 BT_DBG("scid 0x%4.4x flags 0x%2.2x result 0x%2.2x len %d", scid, flags,
4102 result, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004103
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004104 chan = l2cap_get_chan_by_scid(conn, scid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004105 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004106 return 0;
4107
4108 switch (result) {
4109 case L2CAP_CONF_SUCCESS:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004110 l2cap_conf_rfc_get(chan, rsp->data, len);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004111 clear_bit(CONF_REM_CONF_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004112 break;
4113
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004114 case L2CAP_CONF_PENDING:
4115 set_bit(CONF_REM_CONF_PEND, &chan->conf_state);
4116
4117 if (test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
4118 char buf[64];
4119
4120 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004121 buf, &result);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004122 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004123 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004124 goto done;
4125 }
4126
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004127 if (!chan->hs_hcon) {
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004128 l2cap_send_efs_conf_rsp(chan, buf, cmd->ident,
4129 0);
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02004130 } else {
4131 if (l2cap_check_efs(chan)) {
4132 amp_create_logical_link(chan);
4133 chan->ident = cmd->ident;
4134 }
4135 }
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004136 }
4137 goto done;
4138
Linus Torvalds1da177e2005-04-16 15:20:36 -07004139 case L2CAP_CONF_UNACCEPT:
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004140 if (chan->num_conf_rsp <= L2CAP_CONF_MAX_CONF_RSP) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004141 char req[64];
4142
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004143 if (len > sizeof(req) - sizeof(struct l2cap_conf_req)) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004144 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004145 goto done;
4146 }
4147
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004148 /* throw out any old stored conf requests */
4149 result = L2CAP_CONF_SUCCESS;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03004150 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004151 req, &result);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004152 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004153 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004154 goto done;
4155 }
4156
4157 l2cap_send_cmd(conn, l2cap_get_ident(conn),
Gustavo Padovan2d792812012-10-06 10:07:01 +01004158 L2CAP_CONF_REQ, len, req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004159 chan->num_conf_req++;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004160 if (result != L2CAP_CONF_SUCCESS)
4161 goto done;
4162 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004163 }
4164
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09004165 default:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004166 l2cap_chan_set_err(chan, ECONNRESET);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +02004167
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08004168 __set_chan_timer(chan, L2CAP_DISC_REJ_TIMEOUT);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004169 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004170 goto done;
4171 }
4172
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004173 if (flags & L2CAP_CONF_FLAG_CONTINUATION)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004174 goto done;
4175
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004176 set_bit(CONF_INPUT_DONE, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004177
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004178 if (test_bit(CONF_OUTPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004179 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004180
Mat Martineau105bdf92012-04-27 16:50:48 -07004181 if (chan->mode == L2CAP_MODE_ERTM ||
4182 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004183 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004184
Mat Martineau3c588192012-04-11 10:48:42 -07004185 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004186 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004187 else
4188 l2cap_chan_ready(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004189 }
4190
4191done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004192 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004193 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004194}
4195
Gustavo Padovan2d792812012-10-06 10:07:01 +01004196static inline int l2cap_disconnect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004197 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4198 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004199{
4200 struct l2cap_disconn_req *req = (struct l2cap_disconn_req *) data;
4201 struct l2cap_disconn_rsp rsp;
4202 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004203 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004204 struct sock *sk;
4205
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004206 if (cmd_len != sizeof(*req))
4207 return -EPROTO;
4208
Linus Torvalds1da177e2005-04-16 15:20:36 -07004209 scid = __le16_to_cpu(req->scid);
4210 dcid = __le16_to_cpu(req->dcid);
4211
4212 BT_DBG("scid 0x%4.4x dcid 0x%4.4x", scid, dcid);
4213
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004214 mutex_lock(&conn->chan_lock);
4215
4216 chan = __l2cap_get_chan_by_scid(conn, dcid);
4217 if (!chan) {
4218 mutex_unlock(&conn->chan_lock);
Johan Hedbergc4ea2492013-09-16 13:05:15 +03004219 return -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004220 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004221
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004222 l2cap_chan_lock(chan);
4223
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004224 sk = chan->sk;
4225
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03004226 rsp.dcid = cpu_to_le16(chan->scid);
4227 rsp.scid = cpu_to_le16(chan->dcid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004228 l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp);
4229
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004230 lock_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004231 sk->sk_shutdown = SHUTDOWN_MASK;
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004232 release_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004233
Mat Martineau61d6ef32012-04-27 16:50:50 -07004234 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004235 l2cap_chan_del(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004236
4237 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004238
Gustavo Padovan80b98022012-05-27 22:27:51 -03004239 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004240 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004241
4242 mutex_unlock(&conn->chan_lock);
4243
Linus Torvalds1da177e2005-04-16 15:20:36 -07004244 return 0;
4245}
4246
Gustavo Padovan2d792812012-10-06 10:07:01 +01004247static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004248 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4249 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004250{
4251 struct l2cap_disconn_rsp *rsp = (struct l2cap_disconn_rsp *) data;
4252 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004253 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004254
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004255 if (cmd_len != sizeof(*rsp))
4256 return -EPROTO;
4257
Linus Torvalds1da177e2005-04-16 15:20:36 -07004258 scid = __le16_to_cpu(rsp->scid);
4259 dcid = __le16_to_cpu(rsp->dcid);
4260
4261 BT_DBG("dcid 0x%4.4x scid 0x%4.4x", dcid, scid);
4262
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004263 mutex_lock(&conn->chan_lock);
4264
4265 chan = __l2cap_get_chan_by_scid(conn, scid);
4266 if (!chan) {
4267 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004268 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004269 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004270
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004271 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004272
Mat Martineau61d6ef32012-04-27 16:50:50 -07004273 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004274 l2cap_chan_del(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004275
4276 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004277
Gustavo Padovan80b98022012-05-27 22:27:51 -03004278 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004279 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004280
4281 mutex_unlock(&conn->chan_lock);
4282
Linus Torvalds1da177e2005-04-16 15:20:36 -07004283 return 0;
4284}
4285
Gustavo Padovan2d792812012-10-06 10:07:01 +01004286static inline int l2cap_information_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004287 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4288 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004289{
4290 struct l2cap_info_req *req = (struct l2cap_info_req *) data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004291 u16 type;
4292
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004293 if (cmd_len != sizeof(*req))
4294 return -EPROTO;
4295
Linus Torvalds1da177e2005-04-16 15:20:36 -07004296 type = __le16_to_cpu(req->type);
4297
4298 BT_DBG("type 0x%4.4x", type);
4299
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004300 if (type == L2CAP_IT_FEAT_MASK) {
4301 u8 buf[8];
Marcel Holtmann44dd46d2009-05-02 19:09:01 -07004302 u32 feat_mask = l2cap_feat_mask;
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004303 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03004304 rsp->type = __constant_cpu_to_le16(L2CAP_IT_FEAT_MASK);
4305 rsp->result = __constant_cpu_to_le16(L2CAP_IR_SUCCESS);
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03004306 if (!disable_ertm)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004307 feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING
Gustavo Padovan2d792812012-10-06 10:07:01 +01004308 | L2CAP_FEAT_FCS;
Marcel Holtmann848566b2013-10-01 22:59:22 -07004309 if (conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03004310 feat_mask |= L2CAP_FEAT_EXT_FLOW
Gustavo Padovan2d792812012-10-06 10:07:01 +01004311 | L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenkoa5fd6f32011-09-16 16:26:32 +03004312
Gustavo F. Padovan1b7bf4e2009-08-24 00:45:20 -03004313 put_unaligned_le32(feat_mask, rsp->data);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004314 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4315 buf);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004316 } else if (type == L2CAP_IT_FIXED_CHAN) {
4317 u8 buf[12];
4318 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Mat Martineau50a147c2011-11-02 16:18:34 -07004319
Marcel Holtmann848566b2013-10-01 22:59:22 -07004320 if (conn->hs_enabled)
Mat Martineau50a147c2011-11-02 16:18:34 -07004321 l2cap_fixed_chan[0] |= L2CAP_FC_A2MP;
4322 else
4323 l2cap_fixed_chan[0] &= ~L2CAP_FC_A2MP;
4324
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03004325 rsp->type = __constant_cpu_to_le16(L2CAP_IT_FIXED_CHAN);
4326 rsp->result = __constant_cpu_to_le16(L2CAP_IR_SUCCESS);
Andrei Emeltchenkoc6337ea2011-10-20 17:02:44 +03004327 memcpy(rsp->data, l2cap_fixed_chan, sizeof(l2cap_fixed_chan));
Gustavo Padovan2d792812012-10-06 10:07:01 +01004328 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4329 buf);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004330 } else {
4331 struct l2cap_info_rsp rsp;
4332 rsp.type = cpu_to_le16(type);
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03004333 rsp.result = __constant_cpu_to_le16(L2CAP_IR_NOTSUPP);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004334 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(rsp),
4335 &rsp);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004336 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004337
4338 return 0;
4339}
4340
Gustavo Padovan2d792812012-10-06 10:07:01 +01004341static inline int l2cap_information_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004342 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4343 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004344{
4345 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) data;
4346 u16 type, result;
4347
Jaganath Kanakkassery3f6fa3d2013-06-21 19:55:11 +05304348 if (cmd_len < sizeof(*rsp))
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004349 return -EPROTO;
4350
Linus Torvalds1da177e2005-04-16 15:20:36 -07004351 type = __le16_to_cpu(rsp->type);
4352 result = __le16_to_cpu(rsp->result);
4353
4354 BT_DBG("type 0x%4.4x result 0x%2.2x", type, result);
4355
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004356 /* L2CAP Info req/rsp are unbound to channels, add extra checks */
4357 if (cmd->ident != conn->info_ident ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01004358 conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004359 return 0;
4360
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02004361 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004362
Ville Tervoadb08ed2010-08-04 09:43:33 +03004363 if (result != L2CAP_IR_SUCCESS) {
4364 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4365 conn->info_ident = 0;
4366
4367 l2cap_conn_start(conn);
4368
4369 return 0;
4370 }
4371
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004372 switch (type) {
4373 case L2CAP_IT_FEAT_MASK:
Harvey Harrison83985312008-05-02 16:25:46 -07004374 conn->feat_mask = get_unaligned_le32(rsp->data);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004375
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07004376 if (conn->feat_mask & L2CAP_FEAT_FIXED_CHAN) {
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004377 struct l2cap_info_req req;
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03004378 req.type = __constant_cpu_to_le16(L2CAP_IT_FIXED_CHAN);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004379
4380 conn->info_ident = l2cap_get_ident(conn);
4381
4382 l2cap_send_cmd(conn, conn->info_ident,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004383 L2CAP_INFO_REQ, sizeof(req), &req);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004384 } else {
4385 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4386 conn->info_ident = 0;
4387
4388 l2cap_conn_start(conn);
4389 }
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004390 break;
4391
4392 case L2CAP_IT_FIXED_CHAN:
4393 conn->fixed_chan_mask = rsp->data[0];
Marcel Holtmann984947d2009-02-06 23:35:19 +01004394 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004395 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004396
4397 l2cap_conn_start(conn);
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004398 break;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004399 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004400
Linus Torvalds1da177e2005-04-16 15:20:36 -07004401 return 0;
4402}
4403
Mat Martineau17009152012-10-23 15:24:07 -07004404static int l2cap_create_channel_req(struct l2cap_conn *conn,
4405 struct l2cap_cmd_hdr *cmd,
4406 u16 cmd_len, void *data)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004407{
4408 struct l2cap_create_chan_req *req = data;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004409 struct l2cap_create_chan_rsp rsp;
Mat Martineau17009152012-10-23 15:24:07 -07004410 struct l2cap_chan *chan;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004411 struct hci_dev *hdev;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004412 u16 psm, scid;
4413
4414 if (cmd_len != sizeof(*req))
4415 return -EPROTO;
4416
Marcel Holtmann848566b2013-10-01 22:59:22 -07004417 if (!conn->hs_enabled)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004418 return -EINVAL;
4419
4420 psm = le16_to_cpu(req->psm);
4421 scid = le16_to_cpu(req->scid);
4422
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004423 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 -07004424
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004425 /* For controller id 0 make BR/EDR connection */
4426 if (req->amp_id == HCI_BREDR_ID) {
4427 l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4428 req->amp_id);
4429 return 0;
4430 }
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004431
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004432 /* Validate AMP controller id */
4433 hdev = hci_dev_get(req->amp_id);
4434 if (!hdev)
4435 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004436
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004437 if (hdev->dev_type != HCI_AMP || !test_bit(HCI_UP, &hdev->flags)) {
Mat Martineau17009152012-10-23 15:24:07 -07004438 hci_dev_put(hdev);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004439 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004440 }
4441
4442 chan = l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4443 req->amp_id);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004444 if (chan) {
4445 struct amp_mgr *mgr = conn->hcon->amp_mgr;
4446 struct hci_conn *hs_hcon;
4447
4448 hs_hcon = hci_conn_hash_lookup_ba(hdev, AMP_LINK, conn->dst);
4449 if (!hs_hcon) {
4450 hci_dev_put(hdev);
Johan Hedberg21870b52013-09-16 13:05:14 +03004451 return -EBADSLT;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004452 }
4453
4454 BT_DBG("mgr %p bredr_chan %p hs_hcon %p", mgr, chan, hs_hcon);
4455
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004456 mgr->bredr_chan = chan;
4457 chan->hs_hcon = hs_hcon;
Andrei Emeltchenkofd45bf42012-11-20 17:16:22 +02004458 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004459 conn->mtu = hdev->block_mtu;
4460 }
4461
4462 hci_dev_put(hdev);
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004463
4464 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004465
4466error:
4467 rsp.dcid = 0;
4468 rsp.scid = cpu_to_le16(scid);
4469 rsp.result = __constant_cpu_to_le16(L2CAP_CR_BAD_AMP);
4470 rsp.status = __constant_cpu_to_le16(L2CAP_CS_NO_INFO);
4471
4472 l2cap_send_cmd(conn, cmd->ident, L2CAP_CREATE_CHAN_RSP,
4473 sizeof(rsp), &rsp);
4474
Johan Hedbergdc280802013-09-16 13:05:13 +03004475 return 0;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004476}
4477
Mat Martineau8eb200b2012-10-23 15:24:17 -07004478static void l2cap_send_move_chan_req(struct l2cap_chan *chan, u8 dest_amp_id)
4479{
4480 struct l2cap_move_chan_req req;
4481 u8 ident;
4482
4483 BT_DBG("chan %p, dest_amp_id %d", chan, dest_amp_id);
4484
4485 ident = l2cap_get_ident(chan->conn);
4486 chan->ident = ident;
4487
4488 req.icid = cpu_to_le16(chan->scid);
4489 req.dest_amp_id = dest_amp_id;
4490
4491 l2cap_send_cmd(chan->conn, ident, L2CAP_MOVE_CHAN_REQ, sizeof(req),
4492 &req);
4493
4494 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4495}
4496
Mat Martineau1500109b2012-10-23 15:24:15 -07004497static void l2cap_send_move_chan_rsp(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004498{
4499 struct l2cap_move_chan_rsp rsp;
4500
Mat Martineau1500109b2012-10-23 15:24:15 -07004501 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004502
Mat Martineau1500109b2012-10-23 15:24:15 -07004503 rsp.icid = cpu_to_le16(chan->dcid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004504 rsp.result = cpu_to_le16(result);
4505
Mat Martineau1500109b2012-10-23 15:24:15 -07004506 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_RSP,
4507 sizeof(rsp), &rsp);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004508}
4509
Mat Martineau5b155ef2012-10-23 15:24:14 -07004510static void l2cap_send_move_chan_cfm(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004511{
4512 struct l2cap_move_chan_cfm cfm;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004513
Mat Martineau5b155ef2012-10-23 15:24:14 -07004514 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004515
Mat Martineau5b155ef2012-10-23 15:24:14 -07004516 chan->ident = l2cap_get_ident(chan->conn);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004517
Mat Martineau5b155ef2012-10-23 15:24:14 -07004518 cfm.icid = cpu_to_le16(chan->scid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004519 cfm.result = cpu_to_le16(result);
4520
Mat Martineau5b155ef2012-10-23 15:24:14 -07004521 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_CFM,
4522 sizeof(cfm), &cfm);
4523
4524 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4525}
4526
4527static void l2cap_send_move_chan_cfm_icid(struct l2cap_conn *conn, u16 icid)
4528{
4529 struct l2cap_move_chan_cfm cfm;
4530
4531 BT_DBG("conn %p, icid 0x%4.4x", conn, icid);
4532
4533 cfm.icid = cpu_to_le16(icid);
4534 cfm.result = __constant_cpu_to_le16(L2CAP_MC_UNCONFIRMED);
4535
4536 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_MOVE_CHAN_CFM,
4537 sizeof(cfm), &cfm);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004538}
4539
4540static void l2cap_send_move_chan_cfm_rsp(struct l2cap_conn *conn, u8 ident,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004541 u16 icid)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004542{
4543 struct l2cap_move_chan_cfm_rsp rsp;
4544
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004545 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004546
4547 rsp.icid = cpu_to_le16(icid);
4548 l2cap_send_cmd(conn, ident, L2CAP_MOVE_CHAN_CFM_RSP, sizeof(rsp), &rsp);
4549}
4550
Mat Martineau5f3847a2012-10-23 15:24:12 -07004551static void __release_logical_link(struct l2cap_chan *chan)
4552{
4553 chan->hs_hchan = NULL;
4554 chan->hs_hcon = NULL;
4555
4556 /* Placeholder - release the logical link */
4557}
4558
Mat Martineau1500109b2012-10-23 15:24:15 -07004559static void l2cap_logical_fail(struct l2cap_chan *chan)
4560{
4561 /* Logical link setup failed */
4562 if (chan->state != BT_CONNECTED) {
4563 /* Create channel failure, disconnect */
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004564 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineau1500109b2012-10-23 15:24:15 -07004565 return;
4566 }
4567
4568 switch (chan->move_role) {
4569 case L2CAP_MOVE_ROLE_RESPONDER:
4570 l2cap_move_done(chan);
4571 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_SUPP);
4572 break;
4573 case L2CAP_MOVE_ROLE_INITIATOR:
4574 if (chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_COMP ||
4575 chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_CFM) {
4576 /* Remote has only sent pending or
4577 * success responses, clean up
4578 */
4579 l2cap_move_done(chan);
4580 }
4581
4582 /* Other amp move states imply that the move
4583 * has already aborted
4584 */
4585 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
4586 break;
4587 }
4588}
4589
4590static void l2cap_logical_finish_create(struct l2cap_chan *chan,
4591 struct hci_chan *hchan)
4592{
4593 struct l2cap_conf_rsp rsp;
Mat Martineau1500109b2012-10-23 15:24:15 -07004594
Andrei Emeltchenko336178a2012-10-31 15:46:27 +02004595 chan->hs_hchan = hchan;
Mat Martineau1500109b2012-10-23 15:24:15 -07004596 chan->hs_hcon->l2cap_data = chan->conn;
4597
Andrei Emeltchenko35ba9562012-10-25 15:20:43 +03004598 l2cap_send_efs_conf_rsp(chan, &rsp, chan->ident, 0);
Mat Martineau1500109b2012-10-23 15:24:15 -07004599
4600 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Andrei Emeltchenkofe79c6f2012-10-25 15:20:42 +03004601 int err;
Mat Martineau1500109b2012-10-23 15:24:15 -07004602
4603 set_default_fcs(chan);
4604
4605 err = l2cap_ertm_init(chan);
4606 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004607 l2cap_send_disconn_req(chan, -err);
Mat Martineau1500109b2012-10-23 15:24:15 -07004608 else
4609 l2cap_chan_ready(chan);
4610 }
4611}
4612
4613static void l2cap_logical_finish_move(struct l2cap_chan *chan,
4614 struct hci_chan *hchan)
4615{
4616 chan->hs_hcon = hchan->conn;
4617 chan->hs_hcon->l2cap_data = chan->conn;
4618
4619 BT_DBG("move_state %d", chan->move_state);
4620
4621 switch (chan->move_state) {
4622 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
4623 /* Move confirm will be sent after a success
4624 * response is received
4625 */
4626 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4627 break;
4628 case L2CAP_MOVE_WAIT_LOGICAL_CFM:
4629 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4630 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4631 } else if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
4632 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
4633 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
4634 } else if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4635 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4636 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4637 }
4638 break;
4639 default:
4640 /* Move was not in expected state, free the channel */
4641 __release_logical_link(chan);
4642
4643 chan->move_state = L2CAP_MOVE_STABLE;
4644 }
4645}
4646
4647/* Call with chan locked */
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004648void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan,
4649 u8 status)
Mat Martineau5b155ef2012-10-23 15:24:14 -07004650{
Mat Martineau1500109b2012-10-23 15:24:15 -07004651 BT_DBG("chan %p, hchan %p, status %d", chan, hchan, status);
4652
4653 if (status) {
4654 l2cap_logical_fail(chan);
4655 __release_logical_link(chan);
4656 return;
4657 }
4658
4659 if (chan->state != BT_CONNECTED) {
4660 /* Ignore logical link if channel is on BR/EDR */
4661 if (chan->local_amp_id)
4662 l2cap_logical_finish_create(chan, hchan);
4663 } else {
4664 l2cap_logical_finish_move(chan, hchan);
4665 }
Mat Martineau5b155ef2012-10-23 15:24:14 -07004666}
4667
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004668void l2cap_move_start(struct l2cap_chan *chan)
4669{
4670 BT_DBG("chan %p", chan);
4671
4672 if (chan->local_amp_id == HCI_BREDR_ID) {
4673 if (chan->chan_policy != BT_CHANNEL_POLICY_AMP_PREFERRED)
4674 return;
4675 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4676 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4677 /* Placeholder - start physical link setup */
4678 } else {
4679 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4680 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4681 chan->move_id = 0;
4682 l2cap_move_setup(chan);
4683 l2cap_send_move_chan_req(chan, 0);
4684 }
4685}
4686
Mat Martineau8eb200b2012-10-23 15:24:17 -07004687static void l2cap_do_create(struct l2cap_chan *chan, int result,
4688 u8 local_amp_id, u8 remote_amp_id)
4689{
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004690 BT_DBG("chan %p state %s %u -> %u", chan, state_to_string(chan->state),
4691 local_amp_id, remote_amp_id);
4692
Andrei Emeltchenko12d6cc62012-11-14 17:39:31 +02004693 chan->fcs = L2CAP_FCS_NONE;
4694
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004695 /* Outgoing channel on AMP */
4696 if (chan->state == BT_CONNECT) {
4697 if (result == L2CAP_CR_SUCCESS) {
4698 chan->local_amp_id = local_amp_id;
4699 l2cap_send_create_chan_req(chan, remote_amp_id);
4700 } else {
4701 /* Revert to BR/EDR connect */
4702 l2cap_send_conn_req(chan);
4703 }
4704
4705 return;
4706 }
4707
4708 /* Incoming channel on AMP */
4709 if (__l2cap_no_conn_pending(chan)) {
Mat Martineau8eb200b2012-10-23 15:24:17 -07004710 struct l2cap_conn_rsp rsp;
4711 char buf[128];
4712 rsp.scid = cpu_to_le16(chan->dcid);
4713 rsp.dcid = cpu_to_le16(chan->scid);
4714
Mat Martineau8eb200b2012-10-23 15:24:17 -07004715 if (result == L2CAP_CR_SUCCESS) {
4716 /* Send successful response */
Andrei Emeltchenko62cd50e2012-11-14 17:39:32 +02004717 rsp.result = __constant_cpu_to_le16(L2CAP_CR_SUCCESS);
4718 rsp.status = __constant_cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004719 } else {
4720 /* Send negative response */
Andrei Emeltchenko62cd50e2012-11-14 17:39:32 +02004721 rsp.result = __constant_cpu_to_le16(L2CAP_CR_NO_MEM);
4722 rsp.status = __constant_cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004723 }
4724
4725 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_RSP,
4726 sizeof(rsp), &rsp);
4727
4728 if (result == L2CAP_CR_SUCCESS) {
4729 __l2cap_state_change(chan, BT_CONFIG);
4730 set_bit(CONF_REQ_SENT, &chan->conf_state);
4731 l2cap_send_cmd(chan->conn, l2cap_get_ident(chan->conn),
4732 L2CAP_CONF_REQ,
4733 l2cap_build_conf_req(chan, buf), buf);
4734 chan->num_conf_req++;
4735 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004736 }
4737}
4738
4739static void l2cap_do_move_initiate(struct l2cap_chan *chan, u8 local_amp_id,
4740 u8 remote_amp_id)
4741{
4742 l2cap_move_setup(chan);
4743 chan->move_id = local_amp_id;
4744 chan->move_state = L2CAP_MOVE_WAIT_RSP;
4745
4746 l2cap_send_move_chan_req(chan, remote_amp_id);
4747}
4748
4749static void l2cap_do_move_respond(struct l2cap_chan *chan, int result)
4750{
4751 struct hci_chan *hchan = NULL;
4752
4753 /* Placeholder - get hci_chan for logical link */
4754
4755 if (hchan) {
4756 if (hchan->state == BT_CONNECTED) {
4757 /* Logical link is ready to go */
4758 chan->hs_hcon = hchan->conn;
4759 chan->hs_hcon->l2cap_data = chan->conn;
4760 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4761 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4762
4763 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
4764 } else {
4765 /* Wait for logical link to be ready */
4766 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4767 }
4768 } else {
4769 /* Logical link not available */
4770 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_ALLOWED);
4771 }
4772}
4773
4774static void l2cap_do_move_cancel(struct l2cap_chan *chan, int result)
4775{
4776 if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4777 u8 rsp_result;
4778 if (result == -EINVAL)
4779 rsp_result = L2CAP_MR_BAD_ID;
4780 else
4781 rsp_result = L2CAP_MR_NOT_ALLOWED;
4782
4783 l2cap_send_move_chan_rsp(chan, rsp_result);
4784 }
4785
4786 chan->move_role = L2CAP_MOVE_ROLE_NONE;
4787 chan->move_state = L2CAP_MOVE_STABLE;
4788
4789 /* Restart data transmission */
4790 l2cap_ertm_send(chan);
4791}
4792
Andrei Emeltchenkoa514b172012-11-14 17:39:30 +02004793/* Invoke with locked chan */
4794void __l2cap_physical_cfm(struct l2cap_chan *chan, int result)
Mat Martineau8eb200b2012-10-23 15:24:17 -07004795{
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004796 u8 local_amp_id = chan->local_amp_id;
Andrei Emeltchenkofffadc02012-11-01 15:37:03 +02004797 u8 remote_amp_id = chan->remote_amp_id;
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004798
Mat Martineau8eb200b2012-10-23 15:24:17 -07004799 BT_DBG("chan %p, result %d, local_amp_id %d, remote_amp_id %d",
4800 chan, result, local_amp_id, remote_amp_id);
4801
Mat Martineau8eb200b2012-10-23 15:24:17 -07004802 if (chan->state == BT_DISCONN || chan->state == BT_CLOSED) {
4803 l2cap_chan_unlock(chan);
4804 return;
4805 }
4806
4807 if (chan->state != BT_CONNECTED) {
4808 l2cap_do_create(chan, result, local_amp_id, remote_amp_id);
4809 } else if (result != L2CAP_MR_SUCCESS) {
4810 l2cap_do_move_cancel(chan, result);
4811 } else {
4812 switch (chan->move_role) {
4813 case L2CAP_MOVE_ROLE_INITIATOR:
4814 l2cap_do_move_initiate(chan, local_amp_id,
4815 remote_amp_id);
4816 break;
4817 case L2CAP_MOVE_ROLE_RESPONDER:
4818 l2cap_do_move_respond(chan, result);
4819 break;
4820 default:
4821 l2cap_do_move_cancel(chan, result);
4822 break;
4823 }
4824 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004825}
4826
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004827static inline int l2cap_move_channel_req(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004828 struct l2cap_cmd_hdr *cmd,
4829 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004830{
4831 struct l2cap_move_chan_req *req = data;
Mat Martineau1500109b2012-10-23 15:24:15 -07004832 struct l2cap_move_chan_rsp rsp;
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004833 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004834 u16 icid = 0;
4835 u16 result = L2CAP_MR_NOT_ALLOWED;
4836
4837 if (cmd_len != sizeof(*req))
4838 return -EPROTO;
4839
4840 icid = le16_to_cpu(req->icid);
4841
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004842 BT_DBG("icid 0x%4.4x, dest_amp_id %d", icid, req->dest_amp_id);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004843
Marcel Holtmann848566b2013-10-01 22:59:22 -07004844 if (!conn->hs_enabled)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004845 return -EINVAL;
4846
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004847 chan = l2cap_get_chan_by_dcid(conn, icid);
4848 if (!chan) {
Mat Martineau1500109b2012-10-23 15:24:15 -07004849 rsp.icid = cpu_to_le16(icid);
4850 rsp.result = __constant_cpu_to_le16(L2CAP_MR_NOT_ALLOWED);
4851 l2cap_send_cmd(conn, cmd->ident, L2CAP_MOVE_CHAN_RSP,
4852 sizeof(rsp), &rsp);
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004853 return 0;
4854 }
4855
Mat Martineau1500109b2012-10-23 15:24:15 -07004856 chan->ident = cmd->ident;
4857
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004858 if (chan->scid < L2CAP_CID_DYN_START ||
4859 chan->chan_policy == BT_CHANNEL_POLICY_BREDR_ONLY ||
4860 (chan->mode != L2CAP_MODE_ERTM &&
4861 chan->mode != L2CAP_MODE_STREAMING)) {
4862 result = L2CAP_MR_NOT_ALLOWED;
4863 goto send_move_response;
4864 }
4865
4866 if (chan->local_amp_id == req->dest_amp_id) {
4867 result = L2CAP_MR_SAME_ID;
4868 goto send_move_response;
4869 }
4870
4871 if (req->dest_amp_id) {
4872 struct hci_dev *hdev;
4873 hdev = hci_dev_get(req->dest_amp_id);
4874 if (!hdev || hdev->dev_type != HCI_AMP ||
4875 !test_bit(HCI_UP, &hdev->flags)) {
4876 if (hdev)
4877 hci_dev_put(hdev);
4878
4879 result = L2CAP_MR_BAD_ID;
4880 goto send_move_response;
4881 }
4882 hci_dev_put(hdev);
4883 }
4884
4885 /* Detect a move collision. Only send a collision response
4886 * if this side has "lost", otherwise proceed with the move.
4887 * The winner has the larger bd_addr.
4888 */
4889 if ((__chan_is_moving(chan) ||
4890 chan->move_role != L2CAP_MOVE_ROLE_NONE) &&
4891 bacmp(conn->src, conn->dst) > 0) {
4892 result = L2CAP_MR_COLLISION;
4893 goto send_move_response;
4894 }
4895
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004896 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
4897 l2cap_move_setup(chan);
4898 chan->move_id = req->dest_amp_id;
4899 icid = chan->dcid;
4900
4901 if (!req->dest_amp_id) {
4902 /* Moving to BR/EDR */
4903 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4904 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4905 result = L2CAP_MR_PEND;
4906 } else {
4907 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4908 result = L2CAP_MR_SUCCESS;
4909 }
4910 } else {
4911 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4912 /* Placeholder - uncomment when amp functions are available */
4913 /*amp_accept_physical(chan, req->dest_amp_id);*/
4914 result = L2CAP_MR_PEND;
4915 }
4916
4917send_move_response:
Mat Martineau1500109b2012-10-23 15:24:15 -07004918 l2cap_send_move_chan_rsp(chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004919
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004920 l2cap_chan_unlock(chan);
4921
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004922 return 0;
4923}
4924
Mat Martineau5b155ef2012-10-23 15:24:14 -07004925static void l2cap_move_continue(struct l2cap_conn *conn, u16 icid, u16 result)
4926{
4927 struct l2cap_chan *chan;
4928 struct hci_chan *hchan = NULL;
4929
4930 chan = l2cap_get_chan_by_scid(conn, icid);
4931 if (!chan) {
4932 l2cap_send_move_chan_cfm_icid(conn, icid);
4933 return;
4934 }
4935
4936 __clear_chan_timer(chan);
4937 if (result == L2CAP_MR_PEND)
4938 __set_chan_timer(chan, L2CAP_MOVE_ERTX_TIMEOUT);
4939
4940 switch (chan->move_state) {
4941 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
4942 /* Move confirm will be sent when logical link
4943 * is complete.
4944 */
4945 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4946 break;
4947 case L2CAP_MOVE_WAIT_RSP_SUCCESS:
4948 if (result == L2CAP_MR_PEND) {
4949 break;
4950 } else if (test_bit(CONN_LOCAL_BUSY,
4951 &chan->conn_state)) {
4952 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4953 } else {
4954 /* Logical link is up or moving to BR/EDR,
4955 * proceed with move
4956 */
4957 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
4958 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
4959 }
4960 break;
4961 case L2CAP_MOVE_WAIT_RSP:
4962 /* Moving to AMP */
4963 if (result == L2CAP_MR_SUCCESS) {
4964 /* Remote is ready, send confirm immediately
4965 * after logical link is ready
4966 */
4967 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4968 } else {
4969 /* Both logical link and move success
4970 * are required to confirm
4971 */
4972 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_COMP;
4973 }
4974
4975 /* Placeholder - get hci_chan for logical link */
4976 if (!hchan) {
4977 /* Logical link not available */
4978 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
4979 break;
4980 }
4981
4982 /* If the logical link is not yet connected, do not
4983 * send confirmation.
4984 */
4985 if (hchan->state != BT_CONNECTED)
4986 break;
4987
4988 /* Logical link is already ready to go */
4989
4990 chan->hs_hcon = hchan->conn;
4991 chan->hs_hcon->l2cap_data = chan->conn;
4992
4993 if (result == L2CAP_MR_SUCCESS) {
4994 /* Can confirm now */
4995 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
4996 } else {
4997 /* Now only need move success
4998 * to confirm
4999 */
5000 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
5001 }
5002
5003 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
5004 break;
5005 default:
5006 /* Any other amp move state means the move failed. */
5007 chan->move_id = chan->local_amp_id;
5008 l2cap_move_done(chan);
5009 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5010 }
5011
5012 l2cap_chan_unlock(chan);
5013}
5014
5015static void l2cap_move_fail(struct l2cap_conn *conn, u8 ident, u16 icid,
5016 u16 result)
5017{
5018 struct l2cap_chan *chan;
5019
5020 chan = l2cap_get_chan_by_ident(conn, ident);
5021 if (!chan) {
5022 /* Could not locate channel, icid is best guess */
5023 l2cap_send_move_chan_cfm_icid(conn, icid);
5024 return;
5025 }
5026
5027 __clear_chan_timer(chan);
5028
5029 if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
5030 if (result == L2CAP_MR_COLLISION) {
5031 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
5032 } else {
5033 /* Cleanup - cancel move */
5034 chan->move_id = chan->local_amp_id;
5035 l2cap_move_done(chan);
5036 }
5037 }
5038
5039 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5040
5041 l2cap_chan_unlock(chan);
5042}
5043
5044static int l2cap_move_channel_rsp(struct l2cap_conn *conn,
5045 struct l2cap_cmd_hdr *cmd,
5046 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005047{
5048 struct l2cap_move_chan_rsp *rsp = data;
5049 u16 icid, result;
5050
5051 if (cmd_len != sizeof(*rsp))
5052 return -EPROTO;
5053
5054 icid = le16_to_cpu(rsp->icid);
5055 result = le16_to_cpu(rsp->result);
5056
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005057 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005058
Mat Martineau5b155ef2012-10-23 15:24:14 -07005059 if (result == L2CAP_MR_SUCCESS || result == L2CAP_MR_PEND)
5060 l2cap_move_continue(conn, icid, result);
5061 else
5062 l2cap_move_fail(conn, cmd->ident, icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005063
5064 return 0;
5065}
5066
Mat Martineau5f3847a2012-10-23 15:24:12 -07005067static int l2cap_move_channel_confirm(struct l2cap_conn *conn,
5068 struct l2cap_cmd_hdr *cmd,
5069 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005070{
5071 struct l2cap_move_chan_cfm *cfm = data;
Mat Martineau5f3847a2012-10-23 15:24:12 -07005072 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005073 u16 icid, result;
5074
5075 if (cmd_len != sizeof(*cfm))
5076 return -EPROTO;
5077
5078 icid = le16_to_cpu(cfm->icid);
5079 result = le16_to_cpu(cfm->result);
5080
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005081 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005082
Mat Martineau5f3847a2012-10-23 15:24:12 -07005083 chan = l2cap_get_chan_by_dcid(conn, icid);
5084 if (!chan) {
5085 /* Spec requires a response even if the icid was not found */
5086 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5087 return 0;
5088 }
5089
5090 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM) {
5091 if (result == L2CAP_MC_CONFIRMED) {
5092 chan->local_amp_id = chan->move_id;
5093 if (!chan->local_amp_id)
5094 __release_logical_link(chan);
5095 } else {
5096 chan->move_id = chan->local_amp_id;
5097 }
5098
5099 l2cap_move_done(chan);
5100 }
5101
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005102 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5103
Mat Martineau5f3847a2012-10-23 15:24:12 -07005104 l2cap_chan_unlock(chan);
5105
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005106 return 0;
5107}
5108
5109static inline int l2cap_move_channel_confirm_rsp(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005110 struct l2cap_cmd_hdr *cmd,
5111 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005112{
5113 struct l2cap_move_chan_cfm_rsp *rsp = data;
Mat Martineau3fd71a02012-10-23 15:24:16 -07005114 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005115 u16 icid;
5116
5117 if (cmd_len != sizeof(*rsp))
5118 return -EPROTO;
5119
5120 icid = le16_to_cpu(rsp->icid);
5121
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005122 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005123
Mat Martineau3fd71a02012-10-23 15:24:16 -07005124 chan = l2cap_get_chan_by_scid(conn, icid);
5125 if (!chan)
5126 return 0;
5127
5128 __clear_chan_timer(chan);
5129
5130 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM_RSP) {
5131 chan->local_amp_id = chan->move_id;
5132
5133 if (!chan->local_amp_id && chan->hs_hchan)
5134 __release_logical_link(chan);
5135
5136 l2cap_move_done(chan);
5137 }
5138
5139 l2cap_chan_unlock(chan);
5140
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005141 return 0;
5142}
5143
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03005144static inline int l2cap_check_conn_param(u16 min, u16 max, u16 latency,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005145 u16 to_multiplier)
Claudio Takahaside731152011-02-11 19:28:55 -02005146{
5147 u16 max_latency;
5148
5149 if (min > max || min < 6 || max > 3200)
5150 return -EINVAL;
5151
5152 if (to_multiplier < 10 || to_multiplier > 3200)
5153 return -EINVAL;
5154
5155 if (max >= to_multiplier * 8)
5156 return -EINVAL;
5157
5158 max_latency = (to_multiplier * 8 / max) - 1;
5159 if (latency > 499 || latency > max_latency)
5160 return -EINVAL;
5161
5162 return 0;
5163}
5164
5165static inline int l2cap_conn_param_update_req(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005166 struct l2cap_cmd_hdr *cmd,
5167 u8 *data)
Claudio Takahaside731152011-02-11 19:28:55 -02005168{
5169 struct hci_conn *hcon = conn->hcon;
5170 struct l2cap_conn_param_update_req *req;
5171 struct l2cap_conn_param_update_rsp rsp;
5172 u16 min, max, latency, to_multiplier, cmd_len;
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005173 int err;
Claudio Takahaside731152011-02-11 19:28:55 -02005174
5175 if (!(hcon->link_mode & HCI_LM_MASTER))
5176 return -EINVAL;
5177
5178 cmd_len = __le16_to_cpu(cmd->len);
5179 if (cmd_len != sizeof(struct l2cap_conn_param_update_req))
5180 return -EPROTO;
5181
5182 req = (struct l2cap_conn_param_update_req *) data;
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03005183 min = __le16_to_cpu(req->min);
5184 max = __le16_to_cpu(req->max);
Claudio Takahaside731152011-02-11 19:28:55 -02005185 latency = __le16_to_cpu(req->latency);
5186 to_multiplier = __le16_to_cpu(req->to_multiplier);
5187
5188 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 +01005189 min, max, latency, to_multiplier);
Claudio Takahaside731152011-02-11 19:28:55 -02005190
5191 memset(&rsp, 0, sizeof(rsp));
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005192
5193 err = l2cap_check_conn_param(min, max, latency, to_multiplier);
5194 if (err)
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03005195 rsp.result = __constant_cpu_to_le16(L2CAP_CONN_PARAM_REJECTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005196 else
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03005197 rsp.result = __constant_cpu_to_le16(L2CAP_CONN_PARAM_ACCEPTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005198
5199 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONN_PARAM_UPDATE_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005200 sizeof(rsp), &rsp);
Claudio Takahaside731152011-02-11 19:28:55 -02005201
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005202 if (!err)
5203 hci_le_conn_update(hcon, min, max, latency, to_multiplier);
5204
Claudio Takahaside731152011-02-11 19:28:55 -02005205 return 0;
5206}
5207
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005208static inline int l2cap_bredr_sig_cmd(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005209 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5210 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005211{
5212 int err = 0;
5213
5214 switch (cmd->code) {
5215 case L2CAP_COMMAND_REJ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005216 l2cap_command_rej(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005217 break;
5218
5219 case L2CAP_CONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005220 err = l2cap_connect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005221 break;
5222
5223 case L2CAP_CONN_RSP:
Mat Martineauf5a25982012-10-11 17:48:21 +03005224 case L2CAP_CREATE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005225 l2cap_connect_create_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005226 break;
5227
5228 case L2CAP_CONF_REQ:
5229 err = l2cap_config_req(conn, cmd, cmd_len, data);
5230 break;
5231
5232 case L2CAP_CONF_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005233 l2cap_config_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005234 break;
5235
5236 case L2CAP_DISCONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005237 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005238 break;
5239
5240 case L2CAP_DISCONN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005241 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005242 break;
5243
5244 case L2CAP_ECHO_REQ:
5245 l2cap_send_cmd(conn, cmd->ident, L2CAP_ECHO_RSP, cmd_len, data);
5246 break;
5247
5248 case L2CAP_ECHO_RSP:
5249 break;
5250
5251 case L2CAP_INFO_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005252 err = l2cap_information_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005253 break;
5254
5255 case L2CAP_INFO_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005256 l2cap_information_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005257 break;
5258
Mat Martineauf94ff6f2011-11-02 16:18:32 -07005259 case L2CAP_CREATE_CHAN_REQ:
5260 err = l2cap_create_channel_req(conn, cmd, cmd_len, data);
5261 break;
5262
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005263 case L2CAP_MOVE_CHAN_REQ:
5264 err = l2cap_move_channel_req(conn, cmd, cmd_len, data);
5265 break;
5266
5267 case L2CAP_MOVE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005268 l2cap_move_channel_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005269 break;
5270
5271 case L2CAP_MOVE_CHAN_CFM:
5272 err = l2cap_move_channel_confirm(conn, cmd, cmd_len, data);
5273 break;
5274
5275 case L2CAP_MOVE_CHAN_CFM_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005276 l2cap_move_channel_confirm_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005277 break;
5278
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005279 default:
5280 BT_ERR("Unknown BR/EDR signaling command 0x%2.2x", cmd->code);
5281 err = -EINVAL;
5282 break;
5283 }
5284
5285 return err;
5286}
5287
5288static inline int l2cap_le_sig_cmd(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005289 struct l2cap_cmd_hdr *cmd, u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005290{
5291 switch (cmd->code) {
5292 case L2CAP_COMMAND_REJ:
5293 return 0;
5294
5295 case L2CAP_CONN_PARAM_UPDATE_REQ:
Claudio Takahaside731152011-02-11 19:28:55 -02005296 return l2cap_conn_param_update_req(conn, cmd, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005297
5298 case L2CAP_CONN_PARAM_UPDATE_RSP:
5299 return 0;
5300
5301 default:
5302 BT_ERR("Unknown LE signaling command 0x%2.2x", cmd->code);
5303 return -EINVAL;
5304 }
5305}
5306
Johan Hedberg7c2005d2013-09-16 13:05:16 +03005307static __le16 l2cap_err_to_reason(int err)
5308{
5309 switch (err) {
5310 case -EBADSLT:
5311 return __constant_cpu_to_le16(L2CAP_REJ_INVALID_CID);
5312 case -EMSGSIZE:
5313 return __constant_cpu_to_le16(L2CAP_REJ_MTU_EXCEEDED);
5314 case -EINVAL:
5315 case -EPROTO:
5316 default:
5317 return __constant_cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
5318 }
5319}
5320
Johan Hedbergc5623552013-04-29 19:35:33 +03005321static inline void l2cap_le_sig_channel(struct l2cap_conn *conn,
5322 struct sk_buff *skb)
5323{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005324 struct hci_conn *hcon = conn->hcon;
Johan Hedbergc5623552013-04-29 19:35:33 +03005325 u8 *data = skb->data;
5326 int len = skb->len;
5327 struct l2cap_cmd_hdr cmd;
5328 int err;
5329
5330 l2cap_raw_recv(conn, skb);
5331
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005332 if (hcon->type != LE_LINK)
5333 return;
5334
Johan Hedbergc5623552013-04-29 19:35:33 +03005335 while (len >= L2CAP_CMD_HDR_SIZE) {
5336 u16 cmd_len;
5337 memcpy(&cmd, data, L2CAP_CMD_HDR_SIZE);
5338 data += L2CAP_CMD_HDR_SIZE;
5339 len -= L2CAP_CMD_HDR_SIZE;
5340
5341 cmd_len = le16_to_cpu(cmd.len);
5342
5343 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd.code, cmd_len,
5344 cmd.ident);
5345
5346 if (cmd_len > len || !cmd.ident) {
5347 BT_DBG("corrupted command");
5348 break;
5349 }
5350
5351 err = l2cap_le_sig_cmd(conn, &cmd, data);
5352 if (err) {
5353 struct l2cap_cmd_rej_unk rej;
5354
5355 BT_ERR("Wrong link type (%d)", err);
5356
Johan Hedberg7c2005d2013-09-16 13:05:16 +03005357 rej.reason = l2cap_err_to_reason(err);
Johan Hedbergc5623552013-04-29 19:35:33 +03005358 l2cap_send_cmd(conn, cmd.ident, L2CAP_COMMAND_REJ,
5359 sizeof(rej), &rej);
5360 }
5361
5362 data += cmd_len;
5363 len -= cmd_len;
5364 }
5365
5366 kfree_skb(skb);
5367}
5368
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005369static inline void l2cap_sig_channel(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005370 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005371{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005372 struct hci_conn *hcon = conn->hcon;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005373 u8 *data = skb->data;
5374 int len = skb->len;
5375 struct l2cap_cmd_hdr cmd;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005376 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005377
5378 l2cap_raw_recv(conn, skb);
5379
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005380 if (hcon->type != ACL_LINK)
5381 return;
5382
Linus Torvalds1da177e2005-04-16 15:20:36 -07005383 while (len >= L2CAP_CMD_HDR_SIZE) {
Al Viro88219a02007-07-29 00:17:25 -07005384 u16 cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005385 memcpy(&cmd, data, L2CAP_CMD_HDR_SIZE);
5386 data += L2CAP_CMD_HDR_SIZE;
5387 len -= L2CAP_CMD_HDR_SIZE;
5388
Al Viro88219a02007-07-29 00:17:25 -07005389 cmd_len = le16_to_cpu(cmd.len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005390
Gustavo Padovan2d792812012-10-06 10:07:01 +01005391 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd.code, cmd_len,
5392 cmd.ident);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005393
Al Viro88219a02007-07-29 00:17:25 -07005394 if (cmd_len > len || !cmd.ident) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005395 BT_DBG("corrupted command");
5396 break;
5397 }
5398
Johan Hedbergc5623552013-04-29 19:35:33 +03005399 err = l2cap_bredr_sig_cmd(conn, &cmd, cmd_len, data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005400 if (err) {
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03005401 struct l2cap_cmd_rej_unk rej;
Gustavo F. Padovan2c6d1a22011-03-23 14:38:32 -03005402
5403 BT_ERR("Wrong link type (%d)", err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005404
Johan Hedberg7c2005d2013-09-16 13:05:16 +03005405 rej.reason = l2cap_err_to_reason(err);
Gustavo Padovan2d792812012-10-06 10:07:01 +01005406 l2cap_send_cmd(conn, cmd.ident, L2CAP_COMMAND_REJ,
5407 sizeof(rej), &rej);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005408 }
5409
Al Viro88219a02007-07-29 00:17:25 -07005410 data += cmd_len;
5411 len -= cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005412 }
5413
5414 kfree_skb(skb);
5415}
5416
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005417static int l2cap_check_fcs(struct l2cap_chan *chan, struct sk_buff *skb)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005418{
5419 u16 our_fcs, rcv_fcs;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03005420 int hdr_size;
5421
5422 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
5423 hdr_size = L2CAP_EXT_HDR_SIZE;
5424 else
5425 hdr_size = L2CAP_ENH_HDR_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005426
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005427 if (chan->fcs == L2CAP_FCS_CRC16) {
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005428 skb_trim(skb, skb->len - L2CAP_FCS_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005429 rcv_fcs = get_unaligned_le16(skb->data + skb->len);
5430 our_fcs = crc16(0, skb->data - hdr_size, skb->len + hdr_size);
5431
5432 if (our_fcs != rcv_fcs)
João Paulo Rechi Vita7a560e52010-06-22 13:56:27 -03005433 return -EBADMSG;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005434 }
5435 return 0;
5436}
5437
Mat Martineau6ea00482012-05-17 20:53:52 -07005438static void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan)
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005439{
Mat Martineaue31f7632012-05-17 20:53:41 -07005440 struct l2cap_ctrl control;
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005441
Mat Martineaue31f7632012-05-17 20:53:41 -07005442 BT_DBG("chan %p", chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005443
Mat Martineaue31f7632012-05-17 20:53:41 -07005444 memset(&control, 0, sizeof(control));
5445 control.sframe = 1;
5446 control.final = 1;
5447 control.reqseq = chan->buffer_seq;
5448 set_bit(CONN_SEND_FBIT, &chan->conn_state);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005449
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005450 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
Mat Martineaue31f7632012-05-17 20:53:41 -07005451 control.super = L2CAP_SUPER_RNR;
5452 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005453 }
5454
Mat Martineaue31f7632012-05-17 20:53:41 -07005455 if (test_and_clear_bit(CONN_REMOTE_BUSY, &chan->conn_state) &&
5456 chan->unacked_frames > 0)
5457 __set_retrans_timer(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005458
Mat Martineaue31f7632012-05-17 20:53:41 -07005459 /* Send pending iframes */
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03005460 l2cap_ertm_send(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005461
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005462 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
Mat Martineaue31f7632012-05-17 20:53:41 -07005463 test_bit(CONN_SEND_FBIT, &chan->conn_state)) {
5464 /* F-bit wasn't sent in an s-frame or i-frame yet, so
5465 * send it now.
5466 */
5467 control.super = L2CAP_SUPER_RR;
5468 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005469 }
5470}
5471
Gustavo Padovan2d792812012-10-06 10:07:01 +01005472static void append_skb_frag(struct sk_buff *skb, struct sk_buff *new_frag,
5473 struct sk_buff **last_frag)
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005474{
Mat Martineau84084a32011-07-22 14:54:00 -07005475 /* skb->len reflects data in skb as well as all fragments
5476 * skb->data_len reflects only data in fragments
5477 */
5478 if (!skb_has_frag_list(skb))
5479 skb_shinfo(skb)->frag_list = new_frag;
5480
5481 new_frag->next = NULL;
5482
5483 (*last_frag)->next = new_frag;
5484 *last_frag = new_frag;
5485
5486 skb->len += new_frag->len;
5487 skb->data_len += new_frag->len;
5488 skb->truesize += new_frag->truesize;
5489}
5490
Mat Martineau4b51dae92012-05-17 20:53:37 -07005491static int l2cap_reassemble_sdu(struct l2cap_chan *chan, struct sk_buff *skb,
5492 struct l2cap_ctrl *control)
Mat Martineau84084a32011-07-22 14:54:00 -07005493{
5494 int err = -EINVAL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005495
Mat Martineau4b51dae92012-05-17 20:53:37 -07005496 switch (control->sar) {
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005497 case L2CAP_SAR_UNSEGMENTED:
Mat Martineau84084a32011-07-22 14:54:00 -07005498 if (chan->sdu)
5499 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005500
Gustavo Padovan80b98022012-05-27 22:27:51 -03005501 err = chan->ops->recv(chan, skb);
Mat Martineau84084a32011-07-22 14:54:00 -07005502 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005503
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005504 case L2CAP_SAR_START:
Mat Martineau84084a32011-07-22 14:54:00 -07005505 if (chan->sdu)
5506 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005507
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005508 chan->sdu_len = get_unaligned_le16(skb->data);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005509 skb_pull(skb, L2CAP_SDULEN_SIZE);
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005510
Mat Martineau84084a32011-07-22 14:54:00 -07005511 if (chan->sdu_len > chan->imtu) {
5512 err = -EMSGSIZE;
5513 break;
5514 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005515
Mat Martineau84084a32011-07-22 14:54:00 -07005516 if (skb->len >= chan->sdu_len)
5517 break;
5518
5519 chan->sdu = skb;
5520 chan->sdu_last_frag = skb;
5521
5522 skb = NULL;
5523 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005524 break;
5525
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005526 case L2CAP_SAR_CONTINUE:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005527 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005528 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005529
Mat Martineau84084a32011-07-22 14:54:00 -07005530 append_skb_frag(chan->sdu, skb,
5531 &chan->sdu_last_frag);
5532 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005533
Mat Martineau84084a32011-07-22 14:54:00 -07005534 if (chan->sdu->len >= chan->sdu_len)
5535 break;
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005536
Mat Martineau84084a32011-07-22 14:54:00 -07005537 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005538 break;
5539
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005540 case L2CAP_SAR_END:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005541 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005542 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005543
Mat Martineau84084a32011-07-22 14:54:00 -07005544 append_skb_frag(chan->sdu, skb,
5545 &chan->sdu_last_frag);
5546 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005547
Mat Martineau84084a32011-07-22 14:54:00 -07005548 if (chan->sdu->len != chan->sdu_len)
5549 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005550
Gustavo Padovan80b98022012-05-27 22:27:51 -03005551 err = chan->ops->recv(chan, chan->sdu);
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005552
Mat Martineau84084a32011-07-22 14:54:00 -07005553 if (!err) {
5554 /* Reassembly complete */
5555 chan->sdu = NULL;
5556 chan->sdu_last_frag = NULL;
5557 chan->sdu_len = 0;
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005558 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005559 break;
5560 }
5561
Mat Martineau84084a32011-07-22 14:54:00 -07005562 if (err) {
5563 kfree_skb(skb);
5564 kfree_skb(chan->sdu);
5565 chan->sdu = NULL;
5566 chan->sdu_last_frag = NULL;
5567 chan->sdu_len = 0;
5568 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005569
Mat Martineau84084a32011-07-22 14:54:00 -07005570 return err;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005571}
5572
Mat Martineau32b32732012-10-23 15:24:11 -07005573static int l2cap_resegment(struct l2cap_chan *chan)
5574{
5575 /* Placeholder */
5576 return 0;
5577}
5578
Mat Martineaue3281402011-07-07 09:39:02 -07005579void l2cap_chan_busy(struct l2cap_chan *chan, int busy)
Gustavo F. Padovan712132e2010-06-21 19:39:50 -03005580{
Mat Martineau61aa4f52012-05-17 20:53:40 -07005581 u8 event;
5582
5583 if (chan->mode != L2CAP_MODE_ERTM)
5584 return;
5585
5586 event = busy ? L2CAP_EV_LOCAL_BUSY_DETECTED : L2CAP_EV_LOCAL_BUSY_CLEAR;
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03005587 l2cap_tx(chan, NULL, NULL, event);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005588}
5589
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005590static int l2cap_rx_queued_iframes(struct l2cap_chan *chan)
5591{
Mat Martineau63838722012-05-17 20:53:45 -07005592 int err = 0;
5593 /* Pass sequential frames to l2cap_reassemble_sdu()
5594 * until a gap is encountered.
5595 */
5596
5597 BT_DBG("chan %p", chan);
5598
5599 while (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
5600 struct sk_buff *skb;
5601 BT_DBG("Searching for skb with txseq %d (queue len %d)",
5602 chan->buffer_seq, skb_queue_len(&chan->srej_q));
5603
5604 skb = l2cap_ertm_seq_in_queue(&chan->srej_q, chan->buffer_seq);
5605
5606 if (!skb)
5607 break;
5608
5609 skb_unlink(skb, &chan->srej_q);
5610 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
5611 err = l2cap_reassemble_sdu(chan, skb, &bt_cb(skb)->control);
5612 if (err)
5613 break;
5614 }
5615
5616 if (skb_queue_empty(&chan->srej_q)) {
5617 chan->rx_state = L2CAP_RX_STATE_RECV;
5618 l2cap_send_ack(chan);
5619 }
5620
5621 return err;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005622}
5623
5624static void l2cap_handle_srej(struct l2cap_chan *chan,
5625 struct l2cap_ctrl *control)
5626{
Mat Martineauf80842a2012-05-17 20:53:46 -07005627 struct sk_buff *skb;
5628
5629 BT_DBG("chan %p, control %p", chan, control);
5630
5631 if (control->reqseq == chan->next_tx_seq) {
5632 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005633 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005634 return;
5635 }
5636
5637 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
5638
5639 if (skb == NULL) {
5640 BT_DBG("Seq %d not available for retransmission",
5641 control->reqseq);
5642 return;
5643 }
5644
5645 if (chan->max_tx != 0 && bt_cb(skb)->control.retries >= chan->max_tx) {
5646 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005647 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005648 return;
5649 }
5650
5651 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
5652
5653 if (control->poll) {
5654 l2cap_pass_to_tx(chan, control);
5655
5656 set_bit(CONN_SEND_FBIT, &chan->conn_state);
5657 l2cap_retransmit(chan, control);
5658 l2cap_ertm_send(chan);
5659
5660 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5661 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5662 chan->srej_save_reqseq = control->reqseq;
5663 }
5664 } else {
5665 l2cap_pass_to_tx_fbit(chan, control);
5666
5667 if (control->final) {
5668 if (chan->srej_save_reqseq != control->reqseq ||
5669 !test_and_clear_bit(CONN_SREJ_ACT,
5670 &chan->conn_state))
5671 l2cap_retransmit(chan, control);
5672 } else {
5673 l2cap_retransmit(chan, control);
5674 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5675 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5676 chan->srej_save_reqseq = control->reqseq;
5677 }
5678 }
5679 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005680}
5681
5682static void l2cap_handle_rej(struct l2cap_chan *chan,
5683 struct l2cap_ctrl *control)
5684{
Mat Martineaufcd289d2012-05-17 20:53:47 -07005685 struct sk_buff *skb;
5686
5687 BT_DBG("chan %p, control %p", chan, control);
5688
5689 if (control->reqseq == chan->next_tx_seq) {
5690 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005691 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07005692 return;
5693 }
5694
5695 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
5696
5697 if (chan->max_tx && skb &&
5698 bt_cb(skb)->control.retries >= chan->max_tx) {
5699 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005700 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07005701 return;
5702 }
5703
5704 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
5705
5706 l2cap_pass_to_tx(chan, control);
5707
5708 if (control->final) {
5709 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state))
5710 l2cap_retransmit_all(chan, control);
5711 } else {
5712 l2cap_retransmit_all(chan, control);
5713 l2cap_ertm_send(chan);
5714 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F)
5715 set_bit(CONN_REJ_ACT, &chan->conn_state);
5716 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005717}
5718
Mat Martineau4b51dae92012-05-17 20:53:37 -07005719static u8 l2cap_classify_txseq(struct l2cap_chan *chan, u16 txseq)
5720{
5721 BT_DBG("chan %p, txseq %d", chan, txseq);
5722
5723 BT_DBG("last_acked_seq %d, expected_tx_seq %d", chan->last_acked_seq,
5724 chan->expected_tx_seq);
5725
5726 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
5727 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
Gustavo Padovan2d792812012-10-06 10:07:01 +01005728 chan->tx_win) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07005729 /* See notes below regarding "double poll" and
5730 * invalid packets.
5731 */
5732 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
5733 BT_DBG("Invalid/Ignore - after SREJ");
5734 return L2CAP_TXSEQ_INVALID_IGNORE;
5735 } else {
5736 BT_DBG("Invalid - in window after SREJ sent");
5737 return L2CAP_TXSEQ_INVALID;
5738 }
5739 }
5740
5741 if (chan->srej_list.head == txseq) {
5742 BT_DBG("Expected SREJ");
5743 return L2CAP_TXSEQ_EXPECTED_SREJ;
5744 }
5745
5746 if (l2cap_ertm_seq_in_queue(&chan->srej_q, txseq)) {
5747 BT_DBG("Duplicate SREJ - txseq already stored");
5748 return L2CAP_TXSEQ_DUPLICATE_SREJ;
5749 }
5750
5751 if (l2cap_seq_list_contains(&chan->srej_list, txseq)) {
5752 BT_DBG("Unexpected SREJ - not requested");
5753 return L2CAP_TXSEQ_UNEXPECTED_SREJ;
5754 }
5755 }
5756
5757 if (chan->expected_tx_seq == txseq) {
5758 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
5759 chan->tx_win) {
5760 BT_DBG("Invalid - txseq outside tx window");
5761 return L2CAP_TXSEQ_INVALID;
5762 } else {
5763 BT_DBG("Expected");
5764 return L2CAP_TXSEQ_EXPECTED;
5765 }
5766 }
5767
5768 if (__seq_offset(chan, txseq, chan->last_acked_seq) <
Gustavo Padovan2d792812012-10-06 10:07:01 +01005769 __seq_offset(chan, chan->expected_tx_seq, chan->last_acked_seq)) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07005770 BT_DBG("Duplicate - expected_tx_seq later than txseq");
5771 return L2CAP_TXSEQ_DUPLICATE;
5772 }
5773
5774 if (__seq_offset(chan, txseq, chan->last_acked_seq) >= chan->tx_win) {
5775 /* A source of invalid packets is a "double poll" condition,
5776 * where delays cause us to send multiple poll packets. If
5777 * the remote stack receives and processes both polls,
5778 * sequence numbers can wrap around in such a way that a
5779 * resent frame has a sequence number that looks like new data
5780 * with a sequence gap. This would trigger an erroneous SREJ
5781 * request.
5782 *
5783 * Fortunately, this is impossible with a tx window that's
5784 * less than half of the maximum sequence number, which allows
5785 * invalid frames to be safely ignored.
5786 *
5787 * With tx window sizes greater than half of the tx window
5788 * maximum, the frame is invalid and cannot be ignored. This
5789 * causes a disconnect.
5790 */
5791
5792 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
5793 BT_DBG("Invalid/Ignore - txseq outside tx window");
5794 return L2CAP_TXSEQ_INVALID_IGNORE;
5795 } else {
5796 BT_DBG("Invalid - txseq outside tx window");
5797 return L2CAP_TXSEQ_INVALID;
5798 }
5799 } else {
5800 BT_DBG("Unexpected - txseq indicates missing frames");
5801 return L2CAP_TXSEQ_UNEXPECTED;
5802 }
5803}
5804
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005805static int l2cap_rx_state_recv(struct l2cap_chan *chan,
5806 struct l2cap_ctrl *control,
5807 struct sk_buff *skb, u8 event)
5808{
5809 int err = 0;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02005810 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005811
5812 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
5813 event);
5814
5815 switch (event) {
5816 case L2CAP_EV_RECV_IFRAME:
5817 switch (l2cap_classify_txseq(chan, control->txseq)) {
5818 case L2CAP_TXSEQ_EXPECTED:
5819 l2cap_pass_to_tx(chan, control);
5820
5821 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
5822 BT_DBG("Busy, discarding expected seq %d",
5823 control->txseq);
5824 break;
5825 }
5826
5827 chan->expected_tx_seq = __next_seq(chan,
5828 control->txseq);
5829
5830 chan->buffer_seq = chan->expected_tx_seq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02005831 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005832
5833 err = l2cap_reassemble_sdu(chan, skb, control);
5834 if (err)
5835 break;
5836
5837 if (control->final) {
5838 if (!test_and_clear_bit(CONN_REJ_ACT,
5839 &chan->conn_state)) {
5840 control->final = 0;
5841 l2cap_retransmit_all(chan, control);
5842 l2cap_ertm_send(chan);
5843 }
5844 }
5845
5846 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
5847 l2cap_send_ack(chan);
5848 break;
5849 case L2CAP_TXSEQ_UNEXPECTED:
5850 l2cap_pass_to_tx(chan, control);
5851
5852 /* Can't issue SREJ frames in the local busy state.
5853 * Drop this frame, it will be seen as missing
5854 * when local busy is exited.
5855 */
5856 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
5857 BT_DBG("Busy, discarding unexpected seq %d",
5858 control->txseq);
5859 break;
5860 }
5861
5862 /* There was a gap in the sequence, so an SREJ
5863 * must be sent for each missing frame. The
5864 * current frame is stored for later use.
5865 */
5866 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02005867 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005868 BT_DBG("Queued %p (queue len %d)", skb,
5869 skb_queue_len(&chan->srej_q));
5870
5871 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
5872 l2cap_seq_list_clear(&chan->srej_list);
5873 l2cap_send_srej(chan, control->txseq);
5874
5875 chan->rx_state = L2CAP_RX_STATE_SREJ_SENT;
5876 break;
5877 case L2CAP_TXSEQ_DUPLICATE:
5878 l2cap_pass_to_tx(chan, control);
5879 break;
5880 case L2CAP_TXSEQ_INVALID_IGNORE:
5881 break;
5882 case L2CAP_TXSEQ_INVALID:
5883 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005884 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005885 break;
5886 }
5887 break;
5888 case L2CAP_EV_RECV_RR:
5889 l2cap_pass_to_tx(chan, control);
5890 if (control->final) {
5891 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
5892
Mat Martineaue6a3ee62012-10-23 15:24:22 -07005893 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state) &&
5894 !__chan_is_moving(chan)) {
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005895 control->final = 0;
5896 l2cap_retransmit_all(chan, control);
5897 }
5898
5899 l2cap_ertm_send(chan);
5900 } else if (control->poll) {
5901 l2cap_send_i_or_rr_or_rnr(chan);
5902 } else {
5903 if (test_and_clear_bit(CONN_REMOTE_BUSY,
5904 &chan->conn_state) &&
5905 chan->unacked_frames)
5906 __set_retrans_timer(chan);
5907
5908 l2cap_ertm_send(chan);
5909 }
5910 break;
5911 case L2CAP_EV_RECV_RNR:
5912 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
5913 l2cap_pass_to_tx(chan, control);
5914 if (control && control->poll) {
5915 set_bit(CONN_SEND_FBIT, &chan->conn_state);
5916 l2cap_send_rr_or_rnr(chan, 0);
5917 }
5918 __clear_retrans_timer(chan);
5919 l2cap_seq_list_clear(&chan->retrans_list);
5920 break;
5921 case L2CAP_EV_RECV_REJ:
5922 l2cap_handle_rej(chan, control);
5923 break;
5924 case L2CAP_EV_RECV_SREJ:
5925 l2cap_handle_srej(chan, control);
5926 break;
5927 default:
5928 break;
5929 }
5930
5931 if (skb && !skb_in_use) {
5932 BT_DBG("Freeing %p", skb);
5933 kfree_skb(skb);
5934 }
5935
5936 return err;
5937}
5938
5939static int l2cap_rx_state_srej_sent(struct l2cap_chan *chan,
5940 struct l2cap_ctrl *control,
5941 struct sk_buff *skb, u8 event)
5942{
5943 int err = 0;
5944 u16 txseq = control->txseq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02005945 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005946
5947 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
5948 event);
5949
5950 switch (event) {
5951 case L2CAP_EV_RECV_IFRAME:
5952 switch (l2cap_classify_txseq(chan, txseq)) {
5953 case L2CAP_TXSEQ_EXPECTED:
5954 /* Keep frame for reassembly later */
5955 l2cap_pass_to_tx(chan, control);
5956 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02005957 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005958 BT_DBG("Queued %p (queue len %d)", skb,
5959 skb_queue_len(&chan->srej_q));
5960
5961 chan->expected_tx_seq = __next_seq(chan, txseq);
5962 break;
5963 case L2CAP_TXSEQ_EXPECTED_SREJ:
5964 l2cap_seq_list_pop(&chan->srej_list);
5965
5966 l2cap_pass_to_tx(chan, control);
5967 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02005968 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005969 BT_DBG("Queued %p (queue len %d)", skb,
5970 skb_queue_len(&chan->srej_q));
5971
5972 err = l2cap_rx_queued_iframes(chan);
5973 if (err)
5974 break;
5975
5976 break;
5977 case L2CAP_TXSEQ_UNEXPECTED:
5978 /* Got a frame that can't be reassembled yet.
5979 * Save it for later, and send SREJs to cover
5980 * the missing frames.
5981 */
5982 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02005983 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005984 BT_DBG("Queued %p (queue len %d)", skb,
5985 skb_queue_len(&chan->srej_q));
5986
5987 l2cap_pass_to_tx(chan, control);
5988 l2cap_send_srej(chan, control->txseq);
5989 break;
5990 case L2CAP_TXSEQ_UNEXPECTED_SREJ:
5991 /* This frame was requested with an SREJ, but
5992 * some expected retransmitted frames are
5993 * missing. Request retransmission of missing
5994 * SREJ'd frames.
5995 */
5996 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02005997 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005998 BT_DBG("Queued %p (queue len %d)", skb,
5999 skb_queue_len(&chan->srej_q));
6000
6001 l2cap_pass_to_tx(chan, control);
6002 l2cap_send_srej_list(chan, control->txseq);
6003 break;
6004 case L2CAP_TXSEQ_DUPLICATE_SREJ:
6005 /* We've already queued this frame. Drop this copy. */
6006 l2cap_pass_to_tx(chan, control);
6007 break;
6008 case L2CAP_TXSEQ_DUPLICATE:
6009 /* Expecting a later sequence number, so this frame
6010 * was already received. Ignore it completely.
6011 */
6012 break;
6013 case L2CAP_TXSEQ_INVALID_IGNORE:
6014 break;
6015 case L2CAP_TXSEQ_INVALID:
6016 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006017 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006018 break;
6019 }
6020 break;
6021 case L2CAP_EV_RECV_RR:
6022 l2cap_pass_to_tx(chan, control);
6023 if (control->final) {
6024 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6025
6026 if (!test_and_clear_bit(CONN_REJ_ACT,
6027 &chan->conn_state)) {
6028 control->final = 0;
6029 l2cap_retransmit_all(chan, control);
6030 }
6031
6032 l2cap_ertm_send(chan);
6033 } else if (control->poll) {
6034 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6035 &chan->conn_state) &&
6036 chan->unacked_frames) {
6037 __set_retrans_timer(chan);
6038 }
6039
6040 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6041 l2cap_send_srej_tail(chan);
6042 } else {
6043 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6044 &chan->conn_state) &&
6045 chan->unacked_frames)
6046 __set_retrans_timer(chan);
6047
6048 l2cap_send_ack(chan);
6049 }
6050 break;
6051 case L2CAP_EV_RECV_RNR:
6052 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6053 l2cap_pass_to_tx(chan, control);
6054 if (control->poll) {
6055 l2cap_send_srej_tail(chan);
6056 } else {
6057 struct l2cap_ctrl rr_control;
6058 memset(&rr_control, 0, sizeof(rr_control));
6059 rr_control.sframe = 1;
6060 rr_control.super = L2CAP_SUPER_RR;
6061 rr_control.reqseq = chan->buffer_seq;
6062 l2cap_send_sframe(chan, &rr_control);
6063 }
6064
6065 break;
6066 case L2CAP_EV_RECV_REJ:
6067 l2cap_handle_rej(chan, control);
6068 break;
6069 case L2CAP_EV_RECV_SREJ:
6070 l2cap_handle_srej(chan, control);
6071 break;
6072 }
6073
6074 if (skb && !skb_in_use) {
6075 BT_DBG("Freeing %p", skb);
6076 kfree_skb(skb);
6077 }
6078
6079 return err;
6080}
6081
Mat Martineau32b32732012-10-23 15:24:11 -07006082static int l2cap_finish_move(struct l2cap_chan *chan)
6083{
6084 BT_DBG("chan %p", chan);
6085
6086 chan->rx_state = L2CAP_RX_STATE_RECV;
6087
6088 if (chan->hs_hcon)
6089 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6090 else
6091 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6092
6093 return l2cap_resegment(chan);
6094}
6095
6096static int l2cap_rx_state_wait_p(struct l2cap_chan *chan,
6097 struct l2cap_ctrl *control,
6098 struct sk_buff *skb, u8 event)
6099{
6100 int err;
6101
6102 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6103 event);
6104
6105 if (!control->poll)
6106 return -EPROTO;
6107
6108 l2cap_process_reqseq(chan, control->reqseq);
6109
6110 if (!skb_queue_empty(&chan->tx_q))
6111 chan->tx_send_head = skb_peek(&chan->tx_q);
6112 else
6113 chan->tx_send_head = NULL;
6114
6115 /* Rewind next_tx_seq to the point expected
6116 * by the receiver.
6117 */
6118 chan->next_tx_seq = control->reqseq;
6119 chan->unacked_frames = 0;
6120
6121 err = l2cap_finish_move(chan);
6122 if (err)
6123 return err;
6124
6125 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6126 l2cap_send_i_or_rr_or_rnr(chan);
6127
6128 if (event == L2CAP_EV_RECV_IFRAME)
6129 return -EPROTO;
6130
6131 return l2cap_rx_state_recv(chan, control, NULL, event);
6132}
6133
6134static int l2cap_rx_state_wait_f(struct l2cap_chan *chan,
6135 struct l2cap_ctrl *control,
6136 struct sk_buff *skb, u8 event)
6137{
6138 int err;
6139
6140 if (!control->final)
6141 return -EPROTO;
6142
6143 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6144
6145 chan->rx_state = L2CAP_RX_STATE_RECV;
6146 l2cap_process_reqseq(chan, control->reqseq);
6147
6148 if (!skb_queue_empty(&chan->tx_q))
6149 chan->tx_send_head = skb_peek(&chan->tx_q);
6150 else
6151 chan->tx_send_head = NULL;
6152
6153 /* Rewind next_tx_seq to the point expected
6154 * by the receiver.
6155 */
6156 chan->next_tx_seq = control->reqseq;
6157 chan->unacked_frames = 0;
6158
6159 if (chan->hs_hcon)
6160 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6161 else
6162 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6163
6164 err = l2cap_resegment(chan);
6165
6166 if (!err)
6167 err = l2cap_rx_state_recv(chan, control, skb, event);
6168
6169 return err;
6170}
6171
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006172static bool __valid_reqseq(struct l2cap_chan *chan, u16 reqseq)
6173{
6174 /* Make sure reqseq is for a packet that has been sent but not acked */
6175 u16 unacked;
6176
6177 unacked = __seq_offset(chan, chan->next_tx_seq, chan->expected_ack_seq);
6178 return __seq_offset(chan, chan->next_tx_seq, reqseq) <= unacked;
6179}
6180
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006181static int l2cap_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6182 struct sk_buff *skb, u8 event)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006183{
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006184 int err = 0;
6185
6186 BT_DBG("chan %p, control %p, skb %p, event %d, state %d", chan,
6187 control, skb, event, chan->rx_state);
6188
6189 if (__valid_reqseq(chan, control->reqseq)) {
6190 switch (chan->rx_state) {
6191 case L2CAP_RX_STATE_RECV:
6192 err = l2cap_rx_state_recv(chan, control, skb, event);
6193 break;
6194 case L2CAP_RX_STATE_SREJ_SENT:
6195 err = l2cap_rx_state_srej_sent(chan, control, skb,
6196 event);
6197 break;
Mat Martineau32b32732012-10-23 15:24:11 -07006198 case L2CAP_RX_STATE_WAIT_P:
6199 err = l2cap_rx_state_wait_p(chan, control, skb, event);
6200 break;
6201 case L2CAP_RX_STATE_WAIT_F:
6202 err = l2cap_rx_state_wait_f(chan, control, skb, event);
6203 break;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006204 default:
6205 /* shut it down */
6206 break;
6207 }
6208 } else {
6209 BT_DBG("Invalid reqseq %d (next_tx_seq %d, expected_ack_seq %d",
6210 control->reqseq, chan->next_tx_seq,
6211 chan->expected_ack_seq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006212 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006213 }
6214
6215 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006216}
6217
6218static int l2cap_stream_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6219 struct sk_buff *skb)
6220{
Mat Martineau4b51dae92012-05-17 20:53:37 -07006221 int err = 0;
6222
6223 BT_DBG("chan %p, control %p, skb %p, state %d", chan, control, skb,
6224 chan->rx_state);
6225
6226 if (l2cap_classify_txseq(chan, control->txseq) ==
6227 L2CAP_TXSEQ_EXPECTED) {
6228 l2cap_pass_to_tx(chan, control);
6229
6230 BT_DBG("buffer_seq %d->%d", chan->buffer_seq,
6231 __next_seq(chan, chan->buffer_seq));
6232
6233 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
6234
6235 l2cap_reassemble_sdu(chan, skb, control);
6236 } else {
6237 if (chan->sdu) {
6238 kfree_skb(chan->sdu);
6239 chan->sdu = NULL;
6240 }
6241 chan->sdu_last_frag = NULL;
6242 chan->sdu_len = 0;
6243
6244 if (skb) {
6245 BT_DBG("Freeing %p", skb);
6246 kfree_skb(skb);
6247 }
6248 }
6249
6250 chan->last_acked_seq = control->txseq;
6251 chan->expected_tx_seq = __next_seq(chan, control->txseq);
6252
6253 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006254}
6255
6256static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6257{
6258 struct l2cap_ctrl *control = &bt_cb(skb)->control;
6259 u16 len;
6260 u8 event;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006261
Mat Martineaub76bbd62012-04-11 10:48:43 -07006262 __unpack_control(chan, skb);
6263
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006264 len = skb->len;
6265
6266 /*
6267 * We can just drop the corrupted I-frame here.
6268 * Receiver will miss it and start proper recovery
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006269 * procedures and ask for retransmission.
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006270 */
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006271 if (l2cap_check_fcs(chan, skb))
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006272 goto drop;
6273
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006274 if (!control->sframe && control->sar == L2CAP_SAR_START)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006275 len -= L2CAP_SDULEN_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006276
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006277 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006278 len -= L2CAP_FCS_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006279
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006280 if (len > chan->mps) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006281 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006282 goto drop;
6283 }
6284
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006285 if (!control->sframe) {
6286 int err;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006287
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006288 BT_DBG("iframe sar %d, reqseq %d, final %d, txseq %d",
6289 control->sar, control->reqseq, control->final,
6290 control->txseq);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03006291
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006292 /* Validate F-bit - F=0 always valid, F=1 only
6293 * valid in TX WAIT_F
6294 */
6295 if (control->final && chan->tx_state != L2CAP_TX_STATE_WAIT_F)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006296 goto drop;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006297
6298 if (chan->mode != L2CAP_MODE_STREAMING) {
6299 event = L2CAP_EV_RECV_IFRAME;
6300 err = l2cap_rx(chan, control, skb, event);
6301 } else {
6302 err = l2cap_stream_rx(chan, control, skb);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006303 }
6304
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006305 if (err)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006306 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006307 } else {
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006308 const u8 rx_func_to_event[4] = {
6309 L2CAP_EV_RECV_RR, L2CAP_EV_RECV_REJ,
6310 L2CAP_EV_RECV_RNR, L2CAP_EV_RECV_SREJ
6311 };
6312
6313 /* Only I-frames are expected in streaming mode */
6314 if (chan->mode == L2CAP_MODE_STREAMING)
6315 goto drop;
6316
6317 BT_DBG("sframe reqseq %d, final %d, poll %d, super %d",
6318 control->reqseq, control->final, control->poll,
6319 control->super);
6320
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006321 if (len != 0) {
Andrei Emeltchenko1bb166e2012-11-20 17:16:21 +02006322 BT_ERR("Trailing bytes: %d in sframe", len);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006323 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006324 goto drop;
6325 }
6326
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006327 /* Validate F and P bits */
6328 if (control->final && (control->poll ||
6329 chan->tx_state != L2CAP_TX_STATE_WAIT_F))
6330 goto drop;
6331
6332 event = rx_func_to_event[control->super];
6333 if (l2cap_rx(chan, control, skb, event))
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006334 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006335 }
6336
6337 return 0;
6338
6339drop:
6340 kfree_skb(skb);
6341 return 0;
6342}
6343
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006344static void l2cap_data_channel(struct l2cap_conn *conn, u16 cid,
6345 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006346{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006347 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006348
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03006349 chan = l2cap_get_chan_by_scid(conn, cid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006350 if (!chan) {
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006351 if (cid == L2CAP_CID_A2MP) {
6352 chan = a2mp_channel_create(conn, skb);
6353 if (!chan) {
6354 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006355 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006356 }
6357
6358 l2cap_chan_lock(chan);
6359 } else {
6360 BT_DBG("unknown cid 0x%4.4x", cid);
6361 /* Drop packet and return */
6362 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006363 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006364 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006365 }
6366
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03006367 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006368
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03006369 if (chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006370 goto drop;
6371
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006372 switch (chan->mode) {
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006373 case L2CAP_MODE_BASIC:
6374 /* If socket recv buffers overflows we drop data here
6375 * which is *bad* because L2CAP has to be reliable.
6376 * But we don't have any other choice. L2CAP doesn't
6377 * provide flow control mechanism. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07006378
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006379 if (chan->imtu < skb->len)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006380 goto drop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006381
Gustavo Padovan80b98022012-05-27 22:27:51 -03006382 if (!chan->ops->recv(chan, skb))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006383 goto done;
6384 break;
6385
6386 case L2CAP_MODE_ERTM:
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006387 case L2CAP_MODE_STREAMING:
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006388 l2cap_data_rcv(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006389 goto done;
6390
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006391 default:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006392 BT_DBG("chan %p: bad mode 0x%2.2x", chan, chan->mode);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006393 break;
6394 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006395
6396drop:
6397 kfree_skb(skb);
6398
6399done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006400 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006401}
6402
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006403static void l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm,
6404 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006405{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006406 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006407
Ido Yarivc2287682012-04-20 15:46:07 -03006408 chan = l2cap_global_chan_by_psm(0, psm, conn->src, conn->dst);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006409 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006410 goto drop;
6411
Andrei Emeltchenko5b4ceda2012-02-24 16:35:32 +02006412 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006413
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03006414 if (chan->state != BT_BOUND && chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006415 goto drop;
6416
Vinicius Costa Gomese13e21d2011-06-17 22:46:27 -03006417 if (chan->imtu < skb->len)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006418 goto drop;
6419
Gustavo Padovan80b98022012-05-27 22:27:51 -03006420 if (!chan->ops->recv(chan, skb))
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006421 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006422
6423drop:
6424 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006425}
6426
Marcel Holtmann72f78352013-04-23 00:59:00 -07006427static void l2cap_att_channel(struct l2cap_conn *conn,
Andrei Emeltchenko6810fca2012-05-31 11:18:57 +03006428 struct sk_buff *skb)
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006429{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006430 struct l2cap_chan *chan;
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006431
Johan Hedbergaf1c0132013-04-29 19:35:42 +03006432 chan = l2cap_global_chan_by_scid(BT_CONNECTED, L2CAP_CID_ATT,
Marcel Holtmann72f78352013-04-23 00:59:00 -07006433 conn->src, conn->dst);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006434 if (!chan)
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006435 goto drop;
6436
Andrei Emeltchenko5b4ceda2012-02-24 16:35:32 +02006437 BT_DBG("chan %p, len %d", chan, skb->len);
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006438
Vinicius Costa Gomese13e21d2011-06-17 22:46:27 -03006439 if (chan->imtu < skb->len)
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006440 goto drop;
6441
Gustavo Padovan80b98022012-05-27 22:27:51 -03006442 if (!chan->ops->recv(chan, skb))
Andrei Emeltchenko6810fca2012-05-31 11:18:57 +03006443 return;
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006444
6445drop:
6446 kfree_skb(skb);
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006447}
6448
Linus Torvalds1da177e2005-04-16 15:20:36 -07006449static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb)
6450{
6451 struct l2cap_hdr *lh = (void *) skb->data;
Al Viro8e036fc2007-07-29 00:16:36 -07006452 u16 cid, len;
6453 __le16 psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006454
6455 skb_pull(skb, L2CAP_HDR_SIZE);
6456 cid = __le16_to_cpu(lh->cid);
6457 len = __le16_to_cpu(lh->len);
6458
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006459 if (len != skb->len) {
6460 kfree_skb(skb);
6461 return;
6462 }
6463
Linus Torvalds1da177e2005-04-16 15:20:36 -07006464 BT_DBG("len %d, cid 0x%4.4x", len, cid);
6465
6466 switch (cid) {
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02006467 case L2CAP_CID_LE_SIGNALING:
Johan Hedbergc5623552013-04-29 19:35:33 +03006468 l2cap_le_sig_channel(conn, skb);
6469 break;
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006470 case L2CAP_CID_SIGNALING:
Linus Torvalds1da177e2005-04-16 15:20:36 -07006471 l2cap_sig_channel(conn, skb);
6472 break;
6473
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006474 case L2CAP_CID_CONN_LESS:
Andrei Emeltchenko097db762012-03-09 14:16:17 +02006475 psm = get_unaligned((__le16 *) skb->data);
Andrei Emeltchenko0181a702012-05-29 10:04:05 +03006476 skb_pull(skb, L2CAP_PSMLEN_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006477 l2cap_conless_channel(conn, psm, skb);
6478 break;
6479
Johan Hedberg073d1cf2013-04-29 19:35:35 +03006480 case L2CAP_CID_ATT:
Marcel Holtmann72f78352013-04-23 00:59:00 -07006481 l2cap_att_channel(conn, skb);
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006482 break;
6483
Anderson Brigliab501d6a2011-06-07 18:46:31 -03006484 case L2CAP_CID_SMP:
6485 if (smp_sig_channel(conn, skb))
6486 l2cap_conn_del(conn->hcon, EACCES);
6487 break;
6488
Linus Torvalds1da177e2005-04-16 15:20:36 -07006489 default:
6490 l2cap_data_channel(conn, cid, skb);
6491 break;
6492 }
6493}
6494
6495/* ---- L2CAP interface with lower layer (HCI) ---- */
6496
Ulisses Furquim686ebf22011-12-21 10:11:33 -02006497int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006498{
6499 int exact = 0, lm1 = 0, lm2 = 0;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006500 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006501
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03006502 BT_DBG("hdev %s, bdaddr %pMR", hdev->name, bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006503
6504 /* Find listening sockets and check their link_mode */
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006505 read_lock(&chan_list_lock);
6506 list_for_each_entry(c, &chan_list, global_l) {
6507 struct sock *sk = c->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -03006508
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03006509 if (c->state != BT_LISTEN)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006510 continue;
6511
6512 if (!bacmp(&bt_sk(sk)->src, &hdev->bdaddr)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01006513 lm1 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03006514 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01006515 lm1 |= HCI_LM_MASTER;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006516 exact++;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01006517 } else if (!bacmp(&bt_sk(sk)->src, BDADDR_ANY)) {
6518 lm2 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03006519 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01006520 lm2 |= HCI_LM_MASTER;
6521 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006522 }
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006523 read_unlock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006524
6525 return exact ? lm1 : lm2;
6526}
6527
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03006528void l2cap_connect_cfm(struct hci_conn *hcon, u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006529{
Marcel Holtmann01394182006-07-03 10:02:46 +02006530 struct l2cap_conn *conn;
6531
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03006532 BT_DBG("hcon %p bdaddr %pMR status %d", hcon, &hcon->dst, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006533
Linus Torvalds1da177e2005-04-16 15:20:36 -07006534 if (!status) {
Claudio Takahasibaf43252013-04-11 13:55:50 -03006535 conn = l2cap_conn_add(hcon);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006536 if (conn)
6537 l2cap_conn_ready(conn);
Andrei Emeltchenkoba6fc312012-10-31 15:46:26 +02006538 } else {
Joe Perchese1750722011-06-29 18:18:29 -07006539 l2cap_conn_del(hcon, bt_to_errno(status));
Andrei Emeltchenkoba6fc312012-10-31 15:46:26 +02006540 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006541}
6542
Ulisses Furquim686ebf22011-12-21 10:11:33 -02006543int l2cap_disconn_ind(struct hci_conn *hcon)
Marcel Holtmann2950f212009-02-12 14:02:50 +01006544{
6545 struct l2cap_conn *conn = hcon->l2cap_data;
6546
6547 BT_DBG("hcon %p", hcon);
6548
Ulisses Furquim686ebf22011-12-21 10:11:33 -02006549 if (!conn)
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02006550 return HCI_ERROR_REMOTE_USER_TERM;
Marcel Holtmann2950f212009-02-12 14:02:50 +01006551 return conn->disc_reason;
6552}
6553
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03006554void l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006555{
6556 BT_DBG("hcon %p reason %d", hcon, reason);
6557
Joe Perchese1750722011-06-29 18:18:29 -07006558 l2cap_conn_del(hcon, bt_to_errno(reason));
Linus Torvalds1da177e2005-04-16 15:20:36 -07006559}
6560
Gustavo F. Padovan43434782011-04-12 18:31:57 -03006561static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt)
Marcel Holtmannf62e4322009-01-15 21:58:44 +01006562{
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03006563 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED)
Marcel Holtmann255c7602009-02-04 21:07:19 +01006564 return;
6565
Marcel Holtmannf62e4322009-01-15 21:58:44 +01006566 if (encrypt == 0x00) {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03006567 if (chan->sec_level == BT_SECURITY_MEDIUM) {
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08006568 __set_chan_timer(chan, L2CAP_ENC_TIMEOUT);
Gustavo F. Padovan43434782011-04-12 18:31:57 -03006569 } else if (chan->sec_level == BT_SECURITY_HIGH)
Gustavo F. Padovan0f852722011-05-04 19:42:50 -03006570 l2cap_chan_close(chan, ECONNREFUSED);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01006571 } else {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03006572 if (chan->sec_level == BT_SECURITY_MEDIUM)
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -03006573 __clear_chan_timer(chan);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01006574 }
6575}
6576
Ulisses Furquim686ebf22011-12-21 10:11:33 -02006577int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006578{
Marcel Holtmann40be4922008-07-14 20:13:50 +02006579 struct l2cap_conn *conn = hcon->l2cap_data;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006580 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006581
Marcel Holtmann01394182006-07-03 10:02:46 +02006582 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006583 return 0;
Marcel Holtmann01394182006-07-03 10:02:46 +02006584
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03006585 BT_DBG("conn %p status 0x%2.2x encrypt %u", conn, status, encrypt);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006586
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03006587 if (hcon->type == LE_LINK) {
Hemant Gupta35d4adcc2012-04-18 14:46:26 +05306588 if (!status && encrypt)
6589 smp_distribute_keys(conn, 0);
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02006590 cancel_delayed_work(&conn->security_timer);
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03006591 }
6592
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02006593 mutex_lock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006594
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02006595 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006596 l2cap_chan_lock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006597
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03006598 BT_DBG("chan %p scid 0x%4.4x state %s", chan, chan->scid,
6599 state_to_string(chan->state));
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03006600
Andrei Emeltchenko78eb2f92012-07-19 17:03:47 +03006601 if (chan->chan_type == L2CAP_CHAN_CONN_FIX_A2MP) {
6602 l2cap_chan_unlock(chan);
6603 continue;
6604 }
6605
Johan Hedberg073d1cf2013-04-29 19:35:35 +03006606 if (chan->scid == L2CAP_CID_ATT) {
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03006607 if (!status && encrypt) {
6608 chan->sec_level = hcon->sec_level;
Andrei Emeltchenkocf4cd002012-02-06 15:03:59 +02006609 l2cap_chan_ready(chan);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03006610 }
6611
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006612 l2cap_chan_unlock(chan);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03006613 continue;
6614 }
6615
Andrei Emeltchenko96eff462012-11-15 18:14:53 +02006616 if (!__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006617 l2cap_chan_unlock(chan);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01006618 continue;
6619 }
6620
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03006621 if (!status && (chan->state == BT_CONNECTED ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01006622 chan->state == BT_CONFIG)) {
Gustavo Padovana7d77232012-05-13 03:20:07 -03006623 struct sock *sk = chan->sk;
6624
Gustavo Padovanc5daa682012-05-16 12:17:10 -03006625 clear_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
Gustavo Padovana7d77232012-05-13 03:20:07 -03006626 sk->sk_state_change(sk);
6627
Gustavo F. Padovan43434782011-04-12 18:31:57 -03006628 l2cap_check_encryption(chan, encrypt);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006629 l2cap_chan_unlock(chan);
Marcel Holtmann9719f8a2008-07-14 20:13:45 +02006630 continue;
6631 }
6632
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03006633 if (chan->state == BT_CONNECT) {
Marcel Holtmannb1235d72008-07-14 20:13:54 +02006634 if (!status) {
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03006635 l2cap_start_connection(chan);
Marcel Holtmannb1235d72008-07-14 20:13:54 +02006636 } else {
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08006637 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Marcel Holtmannb1235d72008-07-14 20:13:54 +02006638 }
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03006639 } else if (chan->state == BT_CONNECT2) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006640 struct sock *sk = chan->sk;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02006641 struct l2cap_conn_rsp rsp;
Johan Hedbergdf3c3932011-06-14 12:48:19 +03006642 __u16 res, stat;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02006643
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006644 lock_sock(sk);
6645
Marcel Holtmannb1235d72008-07-14 20:13:54 +02006646 if (!status) {
Gustavo Padovanc5daa682012-05-16 12:17:10 -03006647 if (test_bit(BT_SK_DEFER_SETUP,
6648 &bt_sk(sk)->flags)) {
Johan Hedbergdf3c3932011-06-14 12:48:19 +03006649 res = L2CAP_CR_PEND;
6650 stat = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08006651 chan->ops->defer(chan);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03006652 } else {
Andrei Emeltchenko0e587be2012-02-21 12:54:57 +02006653 __l2cap_state_change(chan, BT_CONFIG);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03006654 res = L2CAP_CR_SUCCESS;
6655 stat = L2CAP_CS_NO_INFO;
6656 }
Marcel Holtmannb1235d72008-07-14 20:13:54 +02006657 } else {
Andrei Emeltchenko0e587be2012-02-21 12:54:57 +02006658 __l2cap_state_change(chan, BT_DISCONN);
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08006659 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03006660 res = L2CAP_CR_SEC_BLOCK;
6661 stat = L2CAP_CS_NO_INFO;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02006662 }
6663
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006664 release_sock(sk);
6665
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03006666 rsp.scid = cpu_to_le16(chan->dcid);
6667 rsp.dcid = cpu_to_le16(chan->scid);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03006668 rsp.result = cpu_to_le16(res);
6669 rsp.status = cpu_to_le16(stat);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03006670 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01006671 sizeof(rsp), &rsp);
Mat Martineau2d369352012-05-23 14:59:30 -07006672
6673 if (!test_bit(CONF_REQ_SENT, &chan->conf_state) &&
6674 res == L2CAP_CR_SUCCESS) {
6675 char buf[128];
6676 set_bit(CONF_REQ_SENT, &chan->conf_state);
6677 l2cap_send_cmd(conn, l2cap_get_ident(conn),
6678 L2CAP_CONF_REQ,
6679 l2cap_build_conf_req(chan, buf),
6680 buf);
6681 chan->num_conf_req++;
6682 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006683 }
6684
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006685 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006686 }
6687
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02006688 mutex_unlock(&conn->chan_lock);
Marcel Holtmannb1235d72008-07-14 20:13:54 +02006689
Linus Torvalds1da177e2005-04-16 15:20:36 -07006690 return 0;
6691}
6692
Ulisses Furquim686ebf22011-12-21 10:11:33 -02006693int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006694{
6695 struct l2cap_conn *conn = hcon->l2cap_data;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03006696 struct l2cap_hdr *hdr;
6697 int len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006698
Andrei Emeltchenko1d13a252012-10-15 11:58:41 +03006699 /* For AMP controller do not create l2cap conn */
6700 if (!conn && hcon->hdev->dev_type != HCI_BREDR)
6701 goto drop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006702
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02006703 if (!conn)
Claudio Takahasibaf43252013-04-11 13:55:50 -03006704 conn = l2cap_conn_add(hcon);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02006705
6706 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006707 goto drop;
6708
6709 BT_DBG("conn %p len %d flags 0x%x", conn, skb->len, flags);
6710
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03006711 switch (flags) {
6712 case ACL_START:
6713 case ACL_START_NO_FLUSH:
6714 case ACL_COMPLETE:
Linus Torvalds1da177e2005-04-16 15:20:36 -07006715 if (conn->rx_len) {
6716 BT_ERR("Unexpected start frame (len %d)", skb->len);
6717 kfree_skb(conn->rx_skb);
6718 conn->rx_skb = NULL;
6719 conn->rx_len = 0;
6720 l2cap_conn_unreliable(conn, ECOMM);
6721 }
6722
Andrei Emeltchenkoaae7fe22010-09-15 14:28:43 +03006723 /* Start fragment always begin with Basic L2CAP header */
6724 if (skb->len < L2CAP_HDR_SIZE) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006725 BT_ERR("Frame is too short (len %d)", skb->len);
6726 l2cap_conn_unreliable(conn, ECOMM);
6727 goto drop;
6728 }
6729
6730 hdr = (struct l2cap_hdr *) skb->data;
6731 len = __le16_to_cpu(hdr->len) + L2CAP_HDR_SIZE;
6732
6733 if (len == skb->len) {
6734 /* Complete frame received */
6735 l2cap_recv_frame(conn, skb);
6736 return 0;
6737 }
6738
6739 BT_DBG("Start: total len %d, frag len %d", len, skb->len);
6740
6741 if (skb->len > len) {
6742 BT_ERR("Frame is too long (len %d, expected len %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01006743 skb->len, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006744 l2cap_conn_unreliable(conn, ECOMM);
6745 goto drop;
6746 }
6747
6748 /* Allocate skb for the complete frame (with header) */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03006749 conn->rx_skb = bt_skb_alloc(len, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03006750 if (!conn->rx_skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006751 goto drop;
6752
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03006753 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01006754 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006755 conn->rx_len = len - skb->len;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03006756 break;
6757
6758 case ACL_CONT:
Linus Torvalds1da177e2005-04-16 15:20:36 -07006759 BT_DBG("Cont: frag len %d (expecting %d)", skb->len, conn->rx_len);
6760
6761 if (!conn->rx_len) {
6762 BT_ERR("Unexpected continuation frame (len %d)", skb->len);
6763 l2cap_conn_unreliable(conn, ECOMM);
6764 goto drop;
6765 }
6766
6767 if (skb->len > conn->rx_len) {
6768 BT_ERR("Fragment is too long (len %d, expected %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01006769 skb->len, conn->rx_len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006770 kfree_skb(conn->rx_skb);
6771 conn->rx_skb = NULL;
6772 conn->rx_len = 0;
6773 l2cap_conn_unreliable(conn, ECOMM);
6774 goto drop;
6775 }
6776
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03006777 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01006778 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006779 conn->rx_len -= skb->len;
6780
6781 if (!conn->rx_len) {
6782 /* Complete frame received */
6783 l2cap_recv_frame(conn, conn->rx_skb);
6784 conn->rx_skb = NULL;
6785 }
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03006786 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006787 }
6788
6789drop:
6790 kfree_skb(skb);
6791 return 0;
6792}
6793
Marcel Holtmannaef7d972010-03-21 05:27:45 +01006794static int l2cap_debugfs_show(struct seq_file *f, void *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006795{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006796 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006797
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02006798 read_lock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006799
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006800 list_for_each_entry(c, &chan_list, global_l) {
6801 struct sock *sk = c->sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006802
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03006803 seq_printf(f, "%pMR %pMR %d %d 0x%4.4x 0x%4.4x %d %d %d %d\n",
6804 &bt_sk(sk)->src, &bt_sk(sk)->dst,
6805 c->state, __le16_to_cpu(c->psm),
6806 c->scid, c->dcid, c->imtu, c->omtu,
6807 c->sec_level, c->mode);
Andrei Emeltchenko61e1b4b2012-01-19 11:19:50 +02006808 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006809
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02006810 read_unlock(&chan_list_lock);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08006811
Marcel Holtmannaef7d972010-03-21 05:27:45 +01006812 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006813}
6814
Marcel Holtmannaef7d972010-03-21 05:27:45 +01006815static int l2cap_debugfs_open(struct inode *inode, struct file *file)
6816{
6817 return single_open(file, l2cap_debugfs_show, inode->i_private);
6818}
6819
6820static const struct file_operations l2cap_debugfs_fops = {
6821 .open = l2cap_debugfs_open,
6822 .read = seq_read,
6823 .llseek = seq_lseek,
6824 .release = single_release,
6825};
6826
6827static struct dentry *l2cap_debugfs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006828
Gustavo F. Padovan64274512011-02-07 20:08:52 -02006829int __init l2cap_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006830{
6831 int err;
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08006832
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02006833 err = l2cap_init_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07006834 if (err < 0)
6835 return err;
6836
Marcel Holtmannaef7d972010-03-21 05:27:45 +01006837 if (bt_debugfs) {
Gustavo Padovan2d792812012-10-06 10:07:01 +01006838 l2cap_debugfs = debugfs_create_file("l2cap", 0444, bt_debugfs,
6839 NULL, &l2cap_debugfs_fops);
Marcel Holtmannaef7d972010-03-21 05:27:45 +01006840 if (!l2cap_debugfs)
6841 BT_ERR("Failed to create L2CAP debug file");
6842 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006843
Linus Torvalds1da177e2005-04-16 15:20:36 -07006844 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006845}
6846
Gustavo F. Padovan64274512011-02-07 20:08:52 -02006847void l2cap_exit(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006848{
Marcel Holtmannaef7d972010-03-21 05:27:45 +01006849 debugfs_remove(l2cap_debugfs);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02006850 l2cap_cleanup_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07006851}
6852
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03006853module_param(disable_ertm, bool, 0644);
6854MODULE_PARM_DESC(disable_ertm, "Disable enhanced retransmission mode");