blob: 417d17723ee9d94b2e21f7718e0d02ee3625748f [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. Padovan710f9b0a2011-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
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200548 list_add(&chan->list, &conn->chan_l);
Andrei Emeltchenko643162a2012-02-22 17:11:55 +0200549}
550
Andrei Emeltchenko466f8002012-05-29 13:59:01 +0300551void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
Andrei Emeltchenko643162a2012-02-22 17:11:55 +0200552{
553 mutex_lock(&conn->chan_lock);
554 __l2cap_chan_add(conn, chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200555 mutex_unlock(&conn->chan_lock);
Marcel Holtmann01394182006-07-03 10:02:46 +0200556}
557
Andrei Emeltchenko466f8002012-05-29 13:59:01 +0300558void l2cap_chan_del(struct l2cap_chan *chan, int err)
Marcel Holtmann01394182006-07-03 10:02:46 +0200559{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300560 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann01394182006-07-03 10:02:46 +0200561
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -0300562 __clear_chan_timer(chan);
Marcel Holtmann01394182006-07-03 10:02:46 +0200563
Gustavo F. Padovan49208c92011-04-04 15:59:54 -0300564 BT_DBG("chan %p, conn %p, err %d", chan, conn, err);
Marcel Holtmann01394182006-07-03 10:02:46 +0200565
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900566 if (conn) {
Andrei Emeltchenko56f60982012-10-15 11:58:44 +0300567 struct amp_mgr *mgr = conn->hcon->amp_mgr;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300568 /* Delete from channel list */
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200569 list_del(&chan->list);
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -0200570
Ulisses Furquim371fd832011-12-21 20:02:36 -0200571 l2cap_chan_put(chan);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300572
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300573 chan->conn = NULL;
Andrei Emeltchenko3cabbfd2012-05-31 11:01:37 +0300574
575 if (chan->chan_type != L2CAP_CHAN_CONN_FIX_A2MP)
David Herrmann76a68ba2013-04-06 20:28:37 +0200576 hci_conn_drop(conn->hcon);
Andrei Emeltchenko56f60982012-10-15 11:58:44 +0300577
578 if (mgr && mgr->bredr_chan == chan)
579 mgr->bredr_chan = NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200580 }
581
Andrei Emeltchenko419e08c2012-10-31 15:46:34 +0200582 if (chan->hs_hchan) {
583 struct hci_chan *hs_hchan = chan->hs_hchan;
584
585 BT_DBG("chan %p disconnect hs_hchan %p", chan, hs_hchan);
586 amp_disconnect_logical_link(hs_hchan);
587 }
588
Gustavo Padovanb699ec02012-10-06 11:51:54 +0100589 chan->ops->teardown(chan, err);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200590
Mat Martineau28270112012-05-17 21:14:09 -0700591 if (test_bit(CONF_NOT_COMPLETE, &chan->conf_state))
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300592 return;
Gustavo F. Padovan2ead70b2011-04-01 15:13:36 -0300593
Gustavo Padovanee556f62012-05-18 20:22:38 -0300594 switch(chan->mode) {
595 case L2CAP_MODE_BASIC:
596 break;
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300597
Gustavo Padovanee556f62012-05-18 20:22:38 -0300598 case L2CAP_MODE_ERTM:
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -0300599 __clear_retrans_timer(chan);
600 __clear_monitor_timer(chan);
601 __clear_ack_timer(chan);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300602
Gustavo F. Padovanf1c67752011-03-25 20:36:10 -0300603 skb_queue_purge(&chan->srej_q);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300604
Mat Martineau3c588192012-04-11 10:48:42 -0700605 l2cap_seq_list_free(&chan->srej_list);
606 l2cap_seq_list_free(&chan->retrans_list);
Gustavo Padovanee556f62012-05-18 20:22:38 -0300607
608 /* fall through */
609
610 case L2CAP_MODE_STREAMING:
611 skb_queue_purge(&chan->tx_q);
612 break;
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300613 }
Gustavo Padovanee556f62012-05-18 20:22:38 -0300614
615 return;
Marcel Holtmann01394182006-07-03 10:02:46 +0200616}
617
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300618void l2cap_chan_close(struct l2cap_chan *chan, int reason)
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300619{
620 struct l2cap_conn *conn = chan->conn;
621 struct sock *sk = chan->sk;
622
Gustavo Padovan2d792812012-10-06 10:07:01 +0100623 BT_DBG("chan %p state %s sk %p", chan, state_to_string(chan->state),
624 sk);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300625
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300626 switch (chan->state) {
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300627 case BT_LISTEN:
Gustavo Padovanb699ec02012-10-06 11:51:54 +0100628 chan->ops->teardown(chan, 0);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300629 break;
630
631 case BT_CONNECTED:
632 case BT_CONFIG:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300633 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100634 conn->hcon->type == ACL_LINK) {
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -0300635 __set_chan_timer(chan, sk->sk_sndtimeo);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +0200636 l2cap_send_disconn_req(chan, reason);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300637 } else
638 l2cap_chan_del(chan, reason);
639 break;
640
641 case BT_CONNECT2:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300642 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100643 conn->hcon->type == ACL_LINK) {
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300644 struct l2cap_conn_rsp rsp;
645 __u16 result;
646
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300647 if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300648 result = L2CAP_CR_SEC_BLOCK;
649 else
650 result = L2CAP_CR_BAD_PSM;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300651 l2cap_state_change(chan, BT_DISCONN);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300652
653 rsp.scid = cpu_to_le16(chan->dcid);
654 rsp.dcid = cpu_to_le16(chan->scid);
655 rsp.result = cpu_to_le16(result);
Andrei Emeltchenkoac734982012-05-24 15:42:51 +0300656 rsp.status = __constant_cpu_to_le16(L2CAP_CS_NO_INFO);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300657 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100658 sizeof(rsp), &rsp);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300659 }
660
661 l2cap_chan_del(chan, reason);
662 break;
663
664 case BT_CONNECT:
665 case BT_DISCONN:
666 l2cap_chan_del(chan, reason);
667 break;
668
669 default:
Gustavo Padovanb699ec02012-10-06 11:51:54 +0100670 chan->ops->teardown(chan, 0);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300671 break;
672 }
673}
674
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300675static inline u8 l2cap_get_auth_type(struct l2cap_chan *chan)
Johan Hedberg8556edd32011-01-19 12:06:50 +0530676{
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300677 if (chan->chan_type == L2CAP_CHAN_RAW) {
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300678 switch (chan->sec_level) {
Johan Hedberg8556edd32011-01-19 12:06:50 +0530679 case BT_SECURITY_HIGH:
680 return HCI_AT_DEDICATED_BONDING_MITM;
681 case BT_SECURITY_MEDIUM:
682 return HCI_AT_DEDICATED_BONDING;
683 default:
684 return HCI_AT_NO_BONDING;
685 }
Andrei Emeltchenko2983fd62012-05-24 15:42:50 +0300686 } else if (chan->psm == __constant_cpu_to_le16(L2CAP_PSM_SDP)) {
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300687 if (chan->sec_level == BT_SECURITY_LOW)
688 chan->sec_level = BT_SECURITY_SDP;
Johan Hedberg8556edd32011-01-19 12:06:50 +0530689
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300690 if (chan->sec_level == BT_SECURITY_HIGH)
Johan Hedberg8556edd32011-01-19 12:06:50 +0530691 return HCI_AT_NO_BONDING_MITM;
692 else
693 return HCI_AT_NO_BONDING;
694 } else {
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300695 switch (chan->sec_level) {
Johan Hedberg8556edd32011-01-19 12:06:50 +0530696 case BT_SECURITY_HIGH:
697 return HCI_AT_GENERAL_BONDING_MITM;
698 case BT_SECURITY_MEDIUM:
699 return HCI_AT_GENERAL_BONDING;
700 default:
701 return HCI_AT_NO_BONDING;
702 }
703 }
704}
705
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200706/* Service level security */
Gustavo F. Padovand45fc422011-11-05 19:54:24 -0200707int l2cap_chan_check_security(struct l2cap_chan *chan)
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200708{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300709 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100710 __u8 auth_type;
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200711
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300712 auth_type = l2cap_get_auth_type(chan);
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100713
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300714 return hci_conn_security(conn->hcon, chan->sec_level, auth_type);
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200715}
716
Johannes Bergb5ad8b72011-06-01 08:54:45 +0200717static u8 l2cap_get_ident(struct l2cap_conn *conn)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200718{
719 u8 id;
720
721 /* Get next available identificator.
722 * 1 - 128 are used by kernel.
723 * 129 - 199 are reserved.
724 * 200 - 254 are used by utilities like l2ping, etc.
725 */
726
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200727 spin_lock(&conn->lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200728
729 if (++conn->tx_ident > 128)
730 conn->tx_ident = 1;
731
732 id = conn->tx_ident;
733
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200734 spin_unlock(&conn->lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200735
736 return id;
737}
738
Gustavo Padovan2d792812012-10-06 10:07:01 +0100739static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len,
740 void *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200741{
742 struct sk_buff *skb = l2cap_build_cmd(conn, code, ident, len, data);
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +0200743 u8 flags;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200744
745 BT_DBG("code 0x%2.2x", code);
746
747 if (!skb)
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -0300748 return;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200749
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +0200750 if (lmp_no_flush_capable(conn->hcon->hdev))
751 flags = ACL_START_NO_FLUSH;
752 else
753 flags = ACL_START;
754
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700755 bt_cb(skb)->force_active = BT_POWER_FORCE_ACTIVE_ON;
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +0200756 skb->priority = HCI_PRIO_MAX;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700757
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200758 hci_send_acl(conn->hchan, skb, flags);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200759}
760
Mat Martineau02b0fbb2012-10-23 15:24:10 -0700761static bool __chan_is_moving(struct l2cap_chan *chan)
762{
763 return chan->move_state != L2CAP_MOVE_STABLE &&
764 chan->move_state != L2CAP_MOVE_WAIT_PREPARE;
765}
766
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200767static void l2cap_do_send(struct l2cap_chan *chan, struct sk_buff *skb)
768{
769 struct hci_conn *hcon = chan->conn->hcon;
770 u16 flags;
771
772 BT_DBG("chan %p, skb %p len %d priority %u", chan, skb, skb->len,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100773 skb->priority);
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200774
Mat Martineaud5f8a752012-10-23 15:24:18 -0700775 if (chan->hs_hcon && !__chan_is_moving(chan)) {
776 if (chan->hs_hchan)
777 hci_send_acl(chan->hs_hchan, skb, ACL_COMPLETE);
778 else
779 kfree_skb(skb);
780
781 return;
782 }
783
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200784 if (!test_bit(FLAG_FLUSHABLE, &chan->flags) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100785 lmp_no_flush_capable(hcon->hdev))
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200786 flags = ACL_START_NO_FLUSH;
787 else
788 flags = ACL_START;
789
790 bt_cb(skb)->force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
791 hci_send_acl(chan->conn->hchan, skb, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700792}
793
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700794static void __unpack_enhanced_control(u16 enh, struct l2cap_ctrl *control)
795{
796 control->reqseq = (enh & L2CAP_CTRL_REQSEQ) >> L2CAP_CTRL_REQSEQ_SHIFT;
797 control->final = (enh & L2CAP_CTRL_FINAL) >> L2CAP_CTRL_FINAL_SHIFT;
798
799 if (enh & L2CAP_CTRL_FRAME_TYPE) {
800 /* S-Frame */
801 control->sframe = 1;
802 control->poll = (enh & L2CAP_CTRL_POLL) >> L2CAP_CTRL_POLL_SHIFT;
803 control->super = (enh & L2CAP_CTRL_SUPERVISE) >> L2CAP_CTRL_SUPER_SHIFT;
804
805 control->sar = 0;
806 control->txseq = 0;
807 } else {
808 /* I-Frame */
809 control->sframe = 0;
810 control->sar = (enh & L2CAP_CTRL_SAR) >> L2CAP_CTRL_SAR_SHIFT;
811 control->txseq = (enh & L2CAP_CTRL_TXSEQ) >> L2CAP_CTRL_TXSEQ_SHIFT;
812
813 control->poll = 0;
814 control->super = 0;
815 }
816}
817
818static void __unpack_extended_control(u32 ext, struct l2cap_ctrl *control)
819{
820 control->reqseq = (ext & L2CAP_EXT_CTRL_REQSEQ) >> L2CAP_EXT_CTRL_REQSEQ_SHIFT;
821 control->final = (ext & L2CAP_EXT_CTRL_FINAL) >> L2CAP_EXT_CTRL_FINAL_SHIFT;
822
823 if (ext & L2CAP_EXT_CTRL_FRAME_TYPE) {
824 /* S-Frame */
825 control->sframe = 1;
826 control->poll = (ext & L2CAP_EXT_CTRL_POLL) >> L2CAP_EXT_CTRL_POLL_SHIFT;
827 control->super = (ext & L2CAP_EXT_CTRL_SUPERVISE) >> L2CAP_EXT_CTRL_SUPER_SHIFT;
828
829 control->sar = 0;
830 control->txseq = 0;
831 } else {
832 /* I-Frame */
833 control->sframe = 0;
834 control->sar = (ext & L2CAP_EXT_CTRL_SAR) >> L2CAP_EXT_CTRL_SAR_SHIFT;
835 control->txseq = (ext & L2CAP_EXT_CTRL_TXSEQ) >> L2CAP_EXT_CTRL_TXSEQ_SHIFT;
836
837 control->poll = 0;
838 control->super = 0;
839 }
840}
841
842static inline void __unpack_control(struct l2cap_chan *chan,
843 struct sk_buff *skb)
844{
845 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
846 __unpack_extended_control(get_unaligned_le32(skb->data),
847 &bt_cb(skb)->control);
Mat Martineaucec8ab6e2012-05-17 20:53:36 -0700848 skb_pull(skb, L2CAP_EXT_CTRL_SIZE);
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700849 } else {
850 __unpack_enhanced_control(get_unaligned_le16(skb->data),
851 &bt_cb(skb)->control);
Mat Martineaucec8ab6e2012-05-17 20:53:36 -0700852 skb_pull(skb, L2CAP_ENH_CTRL_SIZE);
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700853 }
854}
855
856static u32 __pack_extended_control(struct l2cap_ctrl *control)
857{
858 u32 packed;
859
860 packed = control->reqseq << L2CAP_EXT_CTRL_REQSEQ_SHIFT;
861 packed |= control->final << L2CAP_EXT_CTRL_FINAL_SHIFT;
862
863 if (control->sframe) {
864 packed |= control->poll << L2CAP_EXT_CTRL_POLL_SHIFT;
865 packed |= control->super << L2CAP_EXT_CTRL_SUPER_SHIFT;
866 packed |= L2CAP_EXT_CTRL_FRAME_TYPE;
867 } else {
868 packed |= control->sar << L2CAP_EXT_CTRL_SAR_SHIFT;
869 packed |= control->txseq << L2CAP_EXT_CTRL_TXSEQ_SHIFT;
870 }
871
872 return packed;
873}
874
875static u16 __pack_enhanced_control(struct l2cap_ctrl *control)
876{
877 u16 packed;
878
879 packed = control->reqseq << L2CAP_CTRL_REQSEQ_SHIFT;
880 packed |= control->final << L2CAP_CTRL_FINAL_SHIFT;
881
882 if (control->sframe) {
883 packed |= control->poll << L2CAP_CTRL_POLL_SHIFT;
884 packed |= control->super << L2CAP_CTRL_SUPER_SHIFT;
885 packed |= L2CAP_CTRL_FRAME_TYPE;
886 } else {
887 packed |= control->sar << L2CAP_CTRL_SAR_SHIFT;
888 packed |= control->txseq << L2CAP_CTRL_TXSEQ_SHIFT;
889 }
890
891 return packed;
892}
893
894static inline void __pack_control(struct l2cap_chan *chan,
895 struct l2cap_ctrl *control,
896 struct sk_buff *skb)
897{
898 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
899 put_unaligned_le32(__pack_extended_control(control),
900 skb->data + L2CAP_HDR_SIZE);
901 } else {
902 put_unaligned_le16(__pack_enhanced_control(control),
903 skb->data + L2CAP_HDR_SIZE);
904 }
905}
906
Gustavo Padovanba7aa642012-05-29 13:29:16 -0300907static inline unsigned int __ertm_hdr_size(struct l2cap_chan *chan)
908{
909 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
910 return L2CAP_EXT_HDR_SIZE;
911 else
912 return L2CAP_ENH_HDR_SIZE;
913}
914
Mat Martineaua67d7f62012-05-17 20:53:35 -0700915static struct sk_buff *l2cap_create_sframe_pdu(struct l2cap_chan *chan,
916 u32 control)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300917{
918 struct sk_buff *skb;
919 struct l2cap_hdr *lh;
Gustavo Padovanba7aa642012-05-29 13:29:16 -0300920 int hlen = __ertm_hdr_size(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300921
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300922 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +0300923 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300924
Mat Martineaua67d7f62012-05-17 20:53:35 -0700925 skb = bt_skb_alloc(hlen, GFP_KERNEL);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300926
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300927 if (!skb)
Mat Martineaua67d7f62012-05-17 20:53:35 -0700928 return ERR_PTR(-ENOMEM);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300929
930 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -0300931 lh->len = cpu_to_le16(hlen - L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300932 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +0300933
Mat Martineaua67d7f62012-05-17 20:53:35 -0700934 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
935 put_unaligned_le32(control, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
936 else
937 put_unaligned_le16(control, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300938
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300939 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineaua67d7f62012-05-17 20:53:35 -0700940 u16 fcs = crc16(0, (u8 *)skb->data, skb->len);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +0300941 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -0300942 }
943
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200944 skb->priority = HCI_PRIO_MAX;
Mat Martineaua67d7f62012-05-17 20:53:35 -0700945 return skb;
946}
947
948static void l2cap_send_sframe(struct l2cap_chan *chan,
949 struct l2cap_ctrl *control)
950{
951 struct sk_buff *skb;
952 u32 control_field;
953
954 BT_DBG("chan %p, control %p", chan, control);
955
956 if (!control->sframe)
957 return;
958
Mat Martineaub99e13a2012-10-23 15:24:19 -0700959 if (__chan_is_moving(chan))
960 return;
961
Mat Martineaua67d7f62012-05-17 20:53:35 -0700962 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state) &&
963 !control->poll)
964 control->final = 1;
965
966 if (control->super == L2CAP_SUPER_RR)
967 clear_bit(CONN_RNR_SENT, &chan->conn_state);
968 else if (control->super == L2CAP_SUPER_RNR)
969 set_bit(CONN_RNR_SENT, &chan->conn_state);
970
971 if (control->super != L2CAP_SUPER_SREJ) {
972 chan->last_acked_seq = control->reqseq;
973 __clear_ack_timer(chan);
974 }
975
976 BT_DBG("reqseq %d, final %d, poll %d, super %d", control->reqseq,
977 control->final, control->poll, control->super);
978
979 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
980 control_field = __pack_extended_control(control);
981 else
982 control_field = __pack_enhanced_control(control);
983
984 skb = l2cap_create_sframe_pdu(chan, control_field);
985 if (!IS_ERR(skb))
986 l2cap_do_send(chan, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300987}
988
Mat Martineauc9e3d5e2012-05-17 20:53:48 -0700989static void l2cap_send_rr_or_rnr(struct l2cap_chan *chan, bool poll)
Gustavo F. Padovan7e743092009-08-26 04:04:03 -0300990{
Mat Martineauc9e3d5e2012-05-17 20:53:48 -0700991 struct l2cap_ctrl control;
Gustavo F. Padovan7e743092009-08-26 04:04:03 -0300992
Mat Martineauc9e3d5e2012-05-17 20:53:48 -0700993 BT_DBG("chan %p, poll %d", chan, poll);
994
995 memset(&control, 0, sizeof(control));
996 control.sframe = 1;
997 control.poll = poll;
998
999 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
1000 control.super = L2CAP_SUPER_RNR;
1001 else
1002 control.super = L2CAP_SUPER_RR;
1003
1004 control.reqseq = chan->buffer_seq;
1005 l2cap_send_sframe(chan, &control);
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001006}
1007
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001008static inline int __l2cap_no_conn_pending(struct l2cap_chan *chan)
Andrei Emeltchenkoe501d052010-07-08 12:14:41 +03001009{
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001010 return !test_bit(CONF_CONNECT_PEND, &chan->conf_state);
Andrei Emeltchenkoe501d052010-07-08 12:14:41 +03001011}
1012
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001013static bool __amp_capable(struct l2cap_chan *chan)
1014{
1015 struct l2cap_conn *conn = chan->conn;
1016
1017 if (enable_hs &&
Andrei Emeltchenko5d054162012-11-29 17:46:05 +02001018 hci_amp_capable() &&
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001019 chan->chan_policy == BT_CHANNEL_POLICY_AMP_PREFERRED &&
1020 conn->fixed_chan_mask & L2CAP_FC_A2MP)
1021 return true;
1022 else
1023 return false;
1024}
1025
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02001026static bool l2cap_check_efs(struct l2cap_chan *chan)
1027{
1028 /* Check EFS parameters */
1029 return true;
1030}
1031
Andrei Emeltchenko2766be42012-09-27 17:26:21 +03001032void l2cap_send_conn_req(struct l2cap_chan *chan)
Andrei Emeltchenko9b27f352012-02-24 16:00:00 +02001033{
1034 struct l2cap_conn *conn = chan->conn;
1035 struct l2cap_conn_req req;
1036
1037 req.scid = cpu_to_le16(chan->scid);
1038 req.psm = chan->psm;
1039
1040 chan->ident = l2cap_get_ident(conn);
1041
1042 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
1043
1044 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_REQ, sizeof(req), &req);
1045}
1046
Mat Martineau8eb200b2012-10-23 15:24:17 -07001047static void l2cap_send_create_chan_req(struct l2cap_chan *chan, u8 amp_id)
1048{
1049 struct l2cap_create_chan_req req;
1050 req.scid = cpu_to_le16(chan->scid);
1051 req.psm = chan->psm;
1052 req.amp_id = amp_id;
1053
1054 chan->ident = l2cap_get_ident(chan->conn);
1055
1056 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_REQ,
1057 sizeof(req), &req);
1058}
1059
Mat Martineau02b0fbb2012-10-23 15:24:10 -07001060static void l2cap_move_setup(struct l2cap_chan *chan)
1061{
1062 struct sk_buff *skb;
1063
1064 BT_DBG("chan %p", chan);
1065
1066 if (chan->mode != L2CAP_MODE_ERTM)
1067 return;
1068
1069 __clear_retrans_timer(chan);
1070 __clear_monitor_timer(chan);
1071 __clear_ack_timer(chan);
1072
1073 chan->retry_count = 0;
1074 skb_queue_walk(&chan->tx_q, skb) {
1075 if (bt_cb(skb)->control.retries)
1076 bt_cb(skb)->control.retries = 1;
1077 else
1078 break;
1079 }
1080
1081 chan->expected_tx_seq = chan->buffer_seq;
1082
1083 clear_bit(CONN_REJ_ACT, &chan->conn_state);
1084 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
1085 l2cap_seq_list_clear(&chan->retrans_list);
1086 l2cap_seq_list_clear(&chan->srej_list);
1087 skb_queue_purge(&chan->srej_q);
1088
1089 chan->tx_state = L2CAP_TX_STATE_XMIT;
1090 chan->rx_state = L2CAP_RX_STATE_MOVE;
1091
1092 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
1093}
1094
Mat Martineau5f3847a2012-10-23 15:24:12 -07001095static void l2cap_move_done(struct l2cap_chan *chan)
1096{
1097 u8 move_role = chan->move_role;
1098 BT_DBG("chan %p", chan);
1099
1100 chan->move_state = L2CAP_MOVE_STABLE;
1101 chan->move_role = L2CAP_MOVE_ROLE_NONE;
1102
1103 if (chan->mode != L2CAP_MODE_ERTM)
1104 return;
1105
1106 switch (move_role) {
1107 case L2CAP_MOVE_ROLE_INITIATOR:
1108 l2cap_tx(chan, NULL, NULL, L2CAP_EV_EXPLICIT_POLL);
1109 chan->rx_state = L2CAP_RX_STATE_WAIT_F;
1110 break;
1111 case L2CAP_MOVE_ROLE_RESPONDER:
1112 chan->rx_state = L2CAP_RX_STATE_WAIT_P;
1113 break;
1114 }
1115}
1116
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001117static void l2cap_chan_ready(struct l2cap_chan *chan)
1118{
Mat Martineau28270112012-05-17 21:14:09 -07001119 /* This clears all conf flags, including CONF_NOT_COMPLETE */
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001120 chan->conf_state = 0;
1121 __clear_chan_timer(chan);
1122
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001123 chan->state = BT_CONNECTED;
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001124
Andrei Emeltchenkofd83e2c2012-05-30 09:55:32 +03001125 chan->ops->ready(chan);
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001126}
1127
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001128static void l2cap_start_connection(struct l2cap_chan *chan)
1129{
1130 if (__amp_capable(chan)) {
1131 BT_DBG("chan %p AMP capable: discover AMPs", chan);
1132 a2mp_discover_amp(chan);
1133 } else {
1134 l2cap_send_conn_req(chan);
1135 }
1136}
1137
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001138static void l2cap_do_start(struct l2cap_chan *chan)
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001139{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03001140 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001141
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001142 if (conn->hcon->type == LE_LINK) {
1143 l2cap_chan_ready(chan);
1144 return;
1145 }
1146
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001147 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) {
Marcel Holtmann984947d2009-02-06 23:35:19 +01001148 if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE))
1149 return;
1150
Gustavo F. Padovand45fc422011-11-05 19:54:24 -02001151 if (l2cap_chan_check_security(chan) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01001152 __l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001153 l2cap_start_connection(chan);
1154 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001155 } else {
1156 struct l2cap_info_req req;
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03001157 req.type = __constant_cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001158
1159 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
1160 conn->info_ident = l2cap_get_ident(conn);
1161
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08001162 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001163
Gustavo Padovan2d792812012-10-06 10:07:01 +01001164 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
1165 sizeof(req), &req);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001166 }
1167}
1168
Gustavo F. Padovancf6c2c02010-06-07 20:54:45 -03001169static inline int l2cap_mode_supported(__u8 mode, __u32 feat_mask)
1170{
1171 u32 local_feat_mask = l2cap_feat_mask;
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03001172 if (!disable_ertm)
Gustavo F. Padovancf6c2c02010-06-07 20:54:45 -03001173 local_feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING;
1174
1175 switch (mode) {
1176 case L2CAP_MODE_ERTM:
1177 return L2CAP_FEAT_ERTM & feat_mask & local_feat_mask;
1178 case L2CAP_MODE_STREAMING:
1179 return L2CAP_FEAT_STREAMING & feat_mask & local_feat_mask;
1180 default:
1181 return 0x00;
1182 }
1183}
1184
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001185static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err)
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001186{
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001187 struct sock *sk = chan->sk;
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001188 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001189 struct l2cap_disconn_req req;
1190
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001191 if (!conn)
1192 return;
1193
Andrei Emeltchenkoaad3d0e2012-09-06 15:05:42 +03001194 if (chan->mode == L2CAP_MODE_ERTM && chan->state == BT_CONNECTED) {
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03001195 __clear_retrans_timer(chan);
1196 __clear_monitor_timer(chan);
1197 __clear_ack_timer(chan);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001198 }
1199
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001200 if (chan->chan_type == L2CAP_CHAN_CONN_FIX_A2MP) {
Gustavo Padovand1177732012-10-06 11:47:38 +01001201 l2cap_state_change(chan, BT_DISCONN);
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001202 return;
1203 }
1204
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001205 req.dcid = cpu_to_le16(chan->dcid);
1206 req.scid = cpu_to_le16(chan->scid);
Gustavo Padovan2d792812012-10-06 10:07:01 +01001207 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_DISCONN_REQ,
1208 sizeof(req), &req);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001209
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001210 lock_sock(sk);
Andrei Emeltchenko0e587be2012-02-21 12:54:57 +02001211 __l2cap_state_change(chan, BT_DISCONN);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +02001212 __l2cap_chan_set_err(chan, err);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001213 release_sock(sk);
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001214}
1215
Linus Torvalds1da177e2005-04-16 15:20:36 -07001216/* ---- L2CAP connections ---- */
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001217static void l2cap_conn_start(struct l2cap_conn *conn)
1218{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001219 struct l2cap_chan *chan, *tmp;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001220
1221 BT_DBG("conn %p", conn);
1222
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001223 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001224
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001225 list_for_each_entry_safe(chan, tmp, &conn->chan_l, list) {
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001226 struct sock *sk = chan->sk;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03001227
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001228 l2cap_chan_lock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001229
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001230 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001231 l2cap_chan_unlock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001232 continue;
1233 }
1234
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001235 if (chan->state == BT_CONNECT) {
Gustavo F. Padovand45fc422011-11-05 19:54:24 -02001236 if (!l2cap_chan_check_security(chan) ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01001237 !__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001238 l2cap_chan_unlock(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001239 continue;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02001240 }
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001241
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001242 if (!l2cap_mode_supported(chan->mode, conn->feat_mask)
Gustavo Padovan2d792812012-10-06 10:07:01 +01001243 && test_bit(CONF_STATE2_DEVICE,
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001244 &chan->conf_state)) {
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001245 l2cap_chan_close(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001246 l2cap_chan_unlock(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001247 continue;
1248 }
1249
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001250 l2cap_start_connection(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001251
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001252 } else if (chan->state == BT_CONNECT2) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001253 struct l2cap_conn_rsp rsp;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001254 char buf[128];
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001255 rsp.scid = cpu_to_le16(chan->dcid);
1256 rsp.dcid = cpu_to_le16(chan->scid);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001257
Gustavo F. Padovand45fc422011-11-05 19:54:24 -02001258 if (l2cap_chan_check_security(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001259 lock_sock(sk);
Gustavo Padovanc5daa682012-05-16 12:17:10 -03001260 if (test_bit(BT_SK_DEFER_SETUP,
1261 &bt_sk(sk)->flags)) {
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03001262 rsp.result = __constant_cpu_to_le16(L2CAP_CR_PEND);
1263 rsp.status = __constant_cpu_to_le16(L2CAP_CS_AUTHOR_PEND);
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001264 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001265
1266 } else {
Andrei Emeltchenko0e587be2012-02-21 12:54:57 +02001267 __l2cap_state_change(chan, BT_CONFIG);
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03001268 rsp.result = __constant_cpu_to_le16(L2CAP_CR_SUCCESS);
1269 rsp.status = __constant_cpu_to_le16(L2CAP_CS_NO_INFO);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001270 }
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001271 release_sock(sk);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001272 } else {
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03001273 rsp.result = __constant_cpu_to_le16(L2CAP_CR_PEND);
1274 rsp.status = __constant_cpu_to_le16(L2CAP_CS_AUTHEN_PEND);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001275 }
1276
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001277 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001278 sizeof(rsp), &rsp);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001279
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001280 if (test_bit(CONF_REQ_SENT, &chan->conf_state) ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01001281 rsp.result != L2CAP_CR_SUCCESS) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001282 l2cap_chan_unlock(chan);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001283 continue;
1284 }
1285
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001286 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001287 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001288 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03001289 chan->num_conf_req++;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001290 }
1291
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001292 l2cap_chan_unlock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001293 }
1294
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001295 mutex_unlock(&conn->chan_lock);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001296}
1297
Ido Yarivc2287682012-04-20 15:46:07 -03001298/* Find socket with cid and source/destination bdaddr.
Ville Tervob62f3282011-02-10 22:38:50 -03001299 * Returns closest match, locked.
1300 */
Andrei Emeltchenkod9b88702012-03-12 12:13:08 +02001301static struct l2cap_chan *l2cap_global_chan_by_scid(int state, u16 cid,
Ido Yarivc2287682012-04-20 15:46:07 -03001302 bdaddr_t *src,
1303 bdaddr_t *dst)
Ville Tervob62f3282011-02-10 22:38:50 -03001304{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001305 struct l2cap_chan *c, *c1 = NULL;
Ville Tervob62f3282011-02-10 22:38:50 -03001306
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001307 read_lock(&chan_list_lock);
Ville Tervob62f3282011-02-10 22:38:50 -03001308
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001309 list_for_each_entry(c, &chan_list, global_l) {
1310 struct sock *sk = c->sk;
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001311
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001312 if (state && c->state != state)
Ville Tervob62f3282011-02-10 22:38:50 -03001313 continue;
1314
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001315 if (c->scid == cid) {
Ido Yarivc2287682012-04-20 15:46:07 -03001316 int src_match, dst_match;
1317 int src_any, dst_any;
1318
Ville Tervob62f3282011-02-10 22:38:50 -03001319 /* Exact match. */
Ido Yarivc2287682012-04-20 15:46:07 -03001320 src_match = !bacmp(&bt_sk(sk)->src, src);
1321 dst_match = !bacmp(&bt_sk(sk)->dst, dst);
1322 if (src_match && dst_match) {
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001323 read_unlock(&chan_list_lock);
1324 return c;
1325 }
Ville Tervob62f3282011-02-10 22:38:50 -03001326
1327 /* Closest match */
Ido Yarivc2287682012-04-20 15:46:07 -03001328 src_any = !bacmp(&bt_sk(sk)->src, BDADDR_ANY);
1329 dst_any = !bacmp(&bt_sk(sk)->dst, BDADDR_ANY);
1330 if ((src_match && dst_any) || (src_any && dst_match) ||
1331 (src_any && dst_any))
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001332 c1 = c;
Ville Tervob62f3282011-02-10 22:38:50 -03001333 }
1334 }
Gustavo F. Padovan280f2942011-04-13 19:01:22 -03001335
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001336 read_unlock(&chan_list_lock);
Ville Tervob62f3282011-02-10 22:38:50 -03001337
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001338 return c1;
Ville Tervob62f3282011-02-10 22:38:50 -03001339}
1340
1341static void l2cap_le_conn_ready(struct l2cap_conn *conn)
1342{
Gustavo F. Padovanc916fbe2011-04-04 16:00:55 -03001343 struct sock *parent, *sk;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001344 struct l2cap_chan *chan, *pchan;
Ville Tervob62f3282011-02-10 22:38:50 -03001345
1346 BT_DBG("");
1347
1348 /* Check if we have socket listening on cid */
Johan Hedberg073d1cf2013-04-29 19:35:35 +03001349 pchan = l2cap_global_chan_by_scid(BT_LISTEN, L2CAP_CID_ATT,
Ido Yarivc2287682012-04-20 15:46:07 -03001350 conn->src, conn->dst);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001351 if (!pchan)
Ville Tervob62f3282011-02-10 22:38:50 -03001352 return;
1353
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001354 parent = pchan->sk;
1355
Gustavo F. Padovanaa2ac882011-06-24 01:53:01 -03001356 lock_sock(parent);
Gustavo F. Padovan62f3a2c2011-04-14 18:34:34 -03001357
Gustavo Padovan80b98022012-05-27 22:27:51 -03001358 chan = pchan->ops->new_connection(pchan);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001359 if (!chan)
Ville Tervob62f3282011-02-10 22:38:50 -03001360 goto clean;
1361
Johan Hedberg9f22398c2013-04-29 19:35:38 +03001362 chan->dcid = L2CAP_CID_ATT;
1363
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001364 sk = chan->sk;
Gustavo F. Padovan5d41ce12011-04-08 15:40:02 -03001365
Ville Tervob62f3282011-02-10 22:38:50 -03001366 hci_conn_hold(conn->hcon);
Szymon Janca9ea3ed2012-07-19 14:46:08 +02001367 conn->hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
Ville Tervob62f3282011-02-10 22:38:50 -03001368
Ville Tervob62f3282011-02-10 22:38:50 -03001369 bacpy(&bt_sk(sk)->src, conn->src);
1370 bacpy(&bt_sk(sk)->dst, conn->dst);
1371
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02001372 l2cap_chan_add(conn, chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001373
Gustavo Padovan6754e0d2012-05-25 09:30:56 -03001374 l2cap_chan_ready(chan);
Ville Tervob62f3282011-02-10 22:38:50 -03001375
Ville Tervob62f3282011-02-10 22:38:50 -03001376clean:
Gustavo F. Padovanaa2ac882011-06-24 01:53:01 -03001377 release_sock(parent);
Ville Tervob62f3282011-02-10 22:38:50 -03001378}
1379
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001380static void l2cap_conn_ready(struct l2cap_conn *conn)
1381{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001382 struct l2cap_chan *chan;
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001383 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001384
1385 BT_DBG("conn %p", conn);
1386
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001387 if (!hcon->out && hcon->type == LE_LINK)
Ville Tervob62f3282011-02-10 22:38:50 -03001388 l2cap_le_conn_ready(conn);
1389
Johan Hedbergd8729922013-04-29 19:35:39 +03001390 /* For outgoing pairing which doesn't necessarily have an
1391 * associated socket (e.g. mgmt_pair_device).
1392 */
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001393 if (hcon->out && hcon->type == LE_LINK)
1394 smp_conn_security(hcon, hcon->pending_sec_level);
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03001395
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001396 mutex_lock(&conn->chan_lock);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001397
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001398 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03001399
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001400 l2cap_chan_lock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001401
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001402 if (chan->chan_type == L2CAP_CHAN_CONN_FIX_A2MP) {
1403 l2cap_chan_unlock(chan);
1404 continue;
1405 }
1406
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001407 if (hcon->type == LE_LINK) {
1408 if (smp_conn_security(hcon, chan->sec_level))
Andrei Emeltchenkocf4cd002012-02-06 15:03:59 +02001409 l2cap_chan_ready(chan);
Ville Tervoacd7d372011-02-10 22:38:49 -03001410
Vinicius Costa Gomes63128452011-06-17 22:46:26 -03001411 } else if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001412 struct sock *sk = chan->sk;
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -03001413 __clear_chan_timer(chan);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001414 lock_sock(sk);
Andrei Emeltchenko0e587be2012-02-21 12:54:57 +02001415 __l2cap_state_change(chan, BT_CONNECTED);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001416 sk->sk_state_change(sk);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001417 release_sock(sk);
Anderson Brigliab501d6a2011-06-07 18:46:31 -03001418
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001419 } else if (chan->state == BT_CONNECT)
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001420 l2cap_do_start(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001421
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001422 l2cap_chan_unlock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001423 }
1424
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001425 mutex_unlock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001426}
1427
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001428/* Notify sockets that we cannot guaranty reliability anymore */
1429static void l2cap_conn_unreliable(struct l2cap_conn *conn, int err)
1430{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001431 struct l2cap_chan *chan;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001432
1433 BT_DBG("conn %p", conn);
1434
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001435 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001436
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001437 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +03001438 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo Padovan1d8b1fd2012-10-06 11:34:52 +01001439 l2cap_chan_set_err(chan, err);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001440 }
1441
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001442 mutex_unlock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001443}
1444
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001445static void l2cap_info_timeout(struct work_struct *work)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001446{
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001447 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001448 info_timer.work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001449
Marcel Holtmann984947d2009-02-06 23:35:19 +01001450 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01001451 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01001452
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001453 l2cap_conn_start(conn);
1454}
1455
David Herrmann2c8e1412013-04-06 20:28:45 +02001456/*
1457 * l2cap_user
1458 * External modules can register l2cap_user objects on l2cap_conn. The ->probe
1459 * callback is called during registration. The ->remove callback is called
1460 * during unregistration.
1461 * An l2cap_user object can either be explicitly unregistered or when the
1462 * underlying l2cap_conn object is deleted. This guarantees that l2cap->hcon,
1463 * l2cap->hchan, .. are valid as long as the remove callback hasn't been called.
1464 * External modules must own a reference to the l2cap_conn object if they intend
1465 * to call l2cap_unregister_user(). The l2cap_conn object might get destroyed at
1466 * any time if they don't.
1467 */
1468
1469int l2cap_register_user(struct l2cap_conn *conn, struct l2cap_user *user)
1470{
1471 struct hci_dev *hdev = conn->hcon->hdev;
1472 int ret;
1473
1474 /* We need to check whether l2cap_conn is registered. If it is not, we
1475 * must not register the l2cap_user. l2cap_conn_del() is unregisters
1476 * l2cap_conn objects, but doesn't provide its own locking. Instead, it
1477 * relies on the parent hci_conn object to be locked. This itself relies
1478 * on the hci_dev object to be locked. So we must lock the hci device
1479 * here, too. */
1480
1481 hci_dev_lock(hdev);
1482
1483 if (user->list.next || user->list.prev) {
1484 ret = -EINVAL;
1485 goto out_unlock;
1486 }
1487
1488 /* conn->hchan is NULL after l2cap_conn_del() was called */
1489 if (!conn->hchan) {
1490 ret = -ENODEV;
1491 goto out_unlock;
1492 }
1493
1494 ret = user->probe(conn, user);
1495 if (ret)
1496 goto out_unlock;
1497
1498 list_add(&user->list, &conn->users);
1499 ret = 0;
1500
1501out_unlock:
1502 hci_dev_unlock(hdev);
1503 return ret;
1504}
1505EXPORT_SYMBOL(l2cap_register_user);
1506
1507void l2cap_unregister_user(struct l2cap_conn *conn, struct l2cap_user *user)
1508{
1509 struct hci_dev *hdev = conn->hcon->hdev;
1510
1511 hci_dev_lock(hdev);
1512
1513 if (!user->list.next || !user->list.prev)
1514 goto out_unlock;
1515
1516 list_del(&user->list);
1517 user->list.next = NULL;
1518 user->list.prev = NULL;
1519 user->remove(conn, user);
1520
1521out_unlock:
1522 hci_dev_unlock(hdev);
1523}
1524EXPORT_SYMBOL(l2cap_unregister_user);
1525
1526static void l2cap_unregister_all_users(struct l2cap_conn *conn)
1527{
1528 struct l2cap_user *user;
1529
1530 while (!list_empty(&conn->users)) {
1531 user = list_first_entry(&conn->users, struct l2cap_user, list);
1532 list_del(&user->list);
1533 user->list.next = NULL;
1534 user->list.prev = NULL;
1535 user->remove(conn, user);
1536 }
1537}
1538
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001539static void l2cap_conn_del(struct hci_conn *hcon, int err)
1540{
1541 struct l2cap_conn *conn = hcon->l2cap_data;
1542 struct l2cap_chan *chan, *l;
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001543
1544 if (!conn)
1545 return;
1546
1547 BT_DBG("hcon %p conn %p, err %d", hcon, conn, err);
1548
1549 kfree_skb(conn->rx_skb);
1550
David Herrmann2c8e1412013-04-06 20:28:45 +02001551 l2cap_unregister_all_users(conn);
1552
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001553 mutex_lock(&conn->chan_lock);
1554
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001555 /* Kill channels */
1556 list_for_each_entry_safe(chan, l, &conn->chan_l, list) {
Mat Martineau61d6ef32012-04-27 16:50:50 -07001557 l2cap_chan_hold(chan);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001558 l2cap_chan_lock(chan);
1559
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001560 l2cap_chan_del(chan, err);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001561
1562 l2cap_chan_unlock(chan);
1563
Gustavo Padovan80b98022012-05-27 22:27:51 -03001564 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07001565 l2cap_chan_put(chan);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001566 }
1567
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001568 mutex_unlock(&conn->chan_lock);
1569
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001570 hci_chan_del(conn->hchan);
1571
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001572 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT)
Ulisses Furquim127074b2012-01-30 18:26:29 -02001573 cancel_delayed_work_sync(&conn->info_timer);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001574
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001575 if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags)) {
Ulisses Furquim127074b2012-01-30 18:26:29 -02001576 cancel_delayed_work_sync(&conn->security_timer);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001577 smp_chan_destroy(conn);
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001578 }
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001579
1580 hcon->l2cap_data = NULL;
David Herrmann9c903e32013-04-06 20:28:44 +02001581 conn->hchan = NULL;
1582 l2cap_conn_put(conn);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001583}
1584
Gustavo F. Padovan6c9d42a2011-12-20 10:57:27 -02001585static void security_timeout(struct work_struct *work)
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001586{
Gustavo F. Padovan6c9d42a2011-12-20 10:57:27 -02001587 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001588 security_timer.work);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001589
Johan Hedbergd06cc412012-06-06 18:44:11 +08001590 BT_DBG("conn %p", conn);
1591
1592 if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags)) {
1593 smp_chan_destroy(conn);
1594 l2cap_conn_del(conn->hcon, ETIMEDOUT);
1595 }
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001596}
1597
Claudio Takahasibaf43252013-04-11 13:55:50 -03001598static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001599{
Marcel Holtmann01394182006-07-03 10:02:46 +02001600 struct l2cap_conn *conn = hcon->l2cap_data;
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001601 struct hci_chan *hchan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001602
Claudio Takahasibaf43252013-04-11 13:55:50 -03001603 if (conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001604 return conn;
1605
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001606 hchan = hci_chan_create(hcon);
1607 if (!hchan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001608 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001609
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03001610 conn = kzalloc(sizeof(struct l2cap_conn), GFP_KERNEL);
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001611 if (!conn) {
1612 hci_chan_del(hchan);
1613 return NULL;
1614 }
1615
David Herrmann9c903e32013-04-06 20:28:44 +02001616 kref_init(&conn->ref);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001617 hcon->l2cap_data = conn;
1618 conn->hcon = hcon;
David Herrmann9c903e32013-04-06 20:28:44 +02001619 hci_conn_get(conn->hcon);
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001620 conn->hchan = hchan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001621
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001622 BT_DBG("hcon %p conn %p hchan %p", hcon, conn, hchan);
Marcel Holtmann01394182006-07-03 10:02:46 +02001623
Andrei Emeltchenkodcc042d2012-10-05 16:56:57 +03001624 switch (hcon->type) {
Andrei Emeltchenkodcc042d2012-10-05 16:56:57 +03001625 case LE_LINK:
1626 if (hcon->hdev->le_mtu) {
1627 conn->mtu = hcon->hdev->le_mtu;
1628 break;
1629 }
1630 /* fall through */
Andrei Emeltchenkodcc042d2012-10-05 16:56:57 +03001631 default:
Ville Tervoacd7d372011-02-10 22:38:49 -03001632 conn->mtu = hcon->hdev->acl_mtu;
Andrei Emeltchenkodcc042d2012-10-05 16:56:57 +03001633 break;
1634 }
Ville Tervoacd7d372011-02-10 22:38:49 -03001635
Linus Torvalds1da177e2005-04-16 15:20:36 -07001636 conn->src = &hcon->hdev->bdaddr;
1637 conn->dst = &hcon->dst;
1638
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001639 conn->feat_mask = 0;
1640
Linus Torvalds1da177e2005-04-16 15:20:36 -07001641 spin_lock_init(&conn->lock);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001642 mutex_init(&conn->chan_lock);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03001643
1644 INIT_LIST_HEAD(&conn->chan_l);
David Herrmann2c8e1412013-04-06 20:28:45 +02001645 INIT_LIST_HEAD(&conn->users);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001646
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001647 if (hcon->type == LE_LINK)
Gustavo F. Padovan6c9d42a2011-12-20 10:57:27 -02001648 INIT_DELAYED_WORK(&conn->security_timer, security_timeout);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001649 else
Gustavo F. Padovan030013d2011-12-20 10:57:28 -02001650 INIT_DELAYED_WORK(&conn->info_timer, l2cap_info_timeout);
Dave Young45054dc2009-10-18 20:28:30 +00001651
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02001652 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
Marcel Holtmann2950f212009-02-12 14:02:50 +01001653
Linus Torvalds1da177e2005-04-16 15:20:36 -07001654 return conn;
1655}
1656
David Herrmann9c903e32013-04-06 20:28:44 +02001657static void l2cap_conn_free(struct kref *ref)
1658{
1659 struct l2cap_conn *conn = container_of(ref, struct l2cap_conn, ref);
1660
1661 hci_conn_put(conn->hcon);
1662 kfree(conn);
1663}
1664
1665void l2cap_conn_get(struct l2cap_conn *conn)
1666{
1667 kref_get(&conn->ref);
1668}
1669EXPORT_SYMBOL(l2cap_conn_get);
1670
1671void l2cap_conn_put(struct l2cap_conn *conn)
1672{
1673 kref_put(&conn->ref, l2cap_conn_free);
1674}
1675EXPORT_SYMBOL(l2cap_conn_put);
1676
Linus Torvalds1da177e2005-04-16 15:20:36 -07001677/* ---- Socket interface ---- */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001678
Ido Yarivc2287682012-04-20 15:46:07 -03001679/* Find socket with psm and source / destination bdaddr.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001680 * Returns closest match.
1681 */
Ido Yarivc2287682012-04-20 15:46:07 -03001682static struct l2cap_chan *l2cap_global_chan_by_psm(int state, __le16 psm,
1683 bdaddr_t *src,
1684 bdaddr_t *dst)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001685{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001686 struct l2cap_chan *c, *c1 = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001687
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001688 read_lock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001689
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001690 list_for_each_entry(c, &chan_list, global_l) {
1691 struct sock *sk = c->sk;
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001692
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001693 if (state && c->state != state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001694 continue;
1695
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001696 if (c->psm == psm) {
Ido Yarivc2287682012-04-20 15:46:07 -03001697 int src_match, dst_match;
1698 int src_any, dst_any;
1699
Linus Torvalds1da177e2005-04-16 15:20:36 -07001700 /* Exact match. */
Ido Yarivc2287682012-04-20 15:46:07 -03001701 src_match = !bacmp(&bt_sk(sk)->src, src);
1702 dst_match = !bacmp(&bt_sk(sk)->dst, dst);
1703 if (src_match && dst_match) {
Johannes Berga7567b22011-06-01 08:29:54 +02001704 read_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001705 return c;
1706 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001707
1708 /* Closest match */
Ido Yarivc2287682012-04-20 15:46:07 -03001709 src_any = !bacmp(&bt_sk(sk)->src, BDADDR_ANY);
1710 dst_any = !bacmp(&bt_sk(sk)->dst, BDADDR_ANY);
1711 if ((src_match && dst_any) || (src_any && dst_match) ||
1712 (src_any && dst_any))
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001713 c1 = c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001714 }
1715 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001716
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001717 read_unlock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001718
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001719 return c1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001720}
1721
Andre Guedes8e9f9892012-04-24 21:02:55 -03001722int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
1723 bdaddr_t *dst, u8 dst_type)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001724{
Gustavo F. Padovan5d41ce12011-04-08 15:40:02 -03001725 struct sock *sk = chan->sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001726 bdaddr_t *src = &bt_sk(sk)->src;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001727 struct l2cap_conn *conn;
1728 struct hci_conn *hcon;
1729 struct hci_dev *hdev;
Marcel Holtmann09ab6f42008-09-09 07:19:20 +02001730 __u8 auth_type;
Marcel Holtmann44d0e482009-04-20 07:09:16 +02001731 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001732
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03001733 BT_DBG("%pMR -> %pMR (type %u) psm 0x%2.2x", src, dst,
Syam Sidhardhanab195162012-07-27 23:51:22 +05301734 dst_type, __le16_to_cpu(psm));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001735
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03001736 hdev = hci_get_route(dst, src);
1737 if (!hdev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001738 return -EHOSTUNREACH;
1739
Gustavo F. Padovan09fd0de2011-06-17 13:03:21 -03001740 hci_dev_lock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001741
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001742 l2cap_chan_lock(chan);
Gustavo F. Padovan03a00192011-12-09 04:48:17 -02001743
1744 /* PSM must be odd and lsb of upper byte must be 0 */
1745 if ((__le16_to_cpu(psm) & 0x0101) != 0x0001 && !cid &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01001746 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan03a00192011-12-09 04:48:17 -02001747 err = -EINVAL;
1748 goto done;
1749 }
1750
1751 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED && !(psm || cid)) {
1752 err = -EINVAL;
1753 goto done;
1754 }
1755
1756 switch (chan->mode) {
1757 case L2CAP_MODE_BASIC:
1758 break;
1759 case L2CAP_MODE_ERTM:
1760 case L2CAP_MODE_STREAMING:
1761 if (!disable_ertm)
1762 break;
1763 /* fall through */
1764 default:
1765 err = -ENOTSUPP;
1766 goto done;
1767 }
1768
Gustavo Padovan0797e012012-05-27 22:27:54 -03001769 switch (chan->state) {
Gustavo F. Padovan03a00192011-12-09 04:48:17 -02001770 case BT_CONNECT:
1771 case BT_CONNECT2:
1772 case BT_CONFIG:
1773 /* Already connecting */
1774 err = 0;
1775 goto done;
1776
1777 case BT_CONNECTED:
1778 /* Already connected */
1779 err = -EISCONN;
1780 goto done;
1781
1782 case BT_OPEN:
1783 case BT_BOUND:
1784 /* Can connect */
1785 break;
1786
1787 default:
1788 err = -EBADFD;
1789 goto done;
1790 }
1791
1792 /* Set destination address and psm */
Gustavo Padovan0797e012012-05-27 22:27:54 -03001793 lock_sock(sk);
Gustavo F. Padovan9219b2a2012-01-02 20:08:04 -02001794 bacpy(&bt_sk(sk)->dst, dst);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001795 release_sock(sk);
1796
Gustavo F. Padovan03a00192011-12-09 04:48:17 -02001797 chan->psm = psm;
1798 chan->dcid = cid;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001799
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001800 auth_type = l2cap_get_auth_type(chan);
Marcel Holtmann09ab6f42008-09-09 07:19:20 +02001801
Johan Hedbergf224ca52013-04-29 19:35:36 +03001802 if (bdaddr_type_is_le(dst_type))
Andre Guedes8e9f9892012-04-24 21:02:55 -03001803 hcon = hci_connect(hdev, LE_LINK, dst, dst_type,
Andre Guedesb12f62c2012-04-24 21:02:54 -03001804 chan->sec_level, auth_type);
Ville Tervoacd7d372011-02-10 22:38:49 -03001805 else
Andre Guedes8e9f9892012-04-24 21:02:55 -03001806 hcon = hci_connect(hdev, ACL_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
Ville Tervo30e76272011-02-22 16:10:53 -03001809 if (IS_ERR(hcon)) {
1810 err = PTR_ERR(hcon);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001811 goto done;
Ville Tervo30e76272011-02-22 16:10:53 -03001812 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001813
Claudio Takahasibaf43252013-04-11 13:55:50 -03001814 conn = l2cap_conn_add(hcon);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001815 if (!conn) {
David Herrmann76a68ba2013-04-06 20:28:37 +02001816 hci_conn_drop(hcon);
Ville Tervo30e76272011-02-22 16:10:53 -03001817 err = -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001818 goto done;
1819 }
1820
Johan Hedberg141d5702013-04-29 19:35:37 +03001821 if (cid && __l2cap_get_chan_by_dcid(conn, cid)) {
1822 hci_conn_drop(hcon);
1823 err = -EBUSY;
1824 goto done;
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001825 }
1826
Linus Torvalds1da177e2005-04-16 15:20:36 -07001827 /* Update source addr of the socket */
1828 bacpy(src, conn->src);
1829
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001830 l2cap_chan_unlock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001831 l2cap_chan_add(conn, chan);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001832 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001833
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001834 l2cap_state_change(chan, BT_CONNECT);
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -03001835 __set_chan_timer(chan, sk->sk_sndtimeo);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001836
1837 if (hcon->state == BT_CONNECTED) {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001838 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -03001839 __clear_chan_timer(chan);
Gustavo F. Padovand45fc422011-11-05 19:54:24 -02001840 if (l2cap_chan_check_security(chan))
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001841 l2cap_state_change(chan, BT_CONNECTED);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001842 } else
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001843 l2cap_do_start(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001844 }
1845
Ville Tervo30e76272011-02-22 16:10:53 -03001846 err = 0;
1847
Linus Torvalds1da177e2005-04-16 15:20:36 -07001848done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001849 l2cap_chan_unlock(chan);
Gustavo F. Padovan09fd0de2011-06-17 13:03:21 -03001850 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001851 hci_dev_put(hdev);
1852 return err;
1853}
1854
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001855int __l2cap_wait_ack(struct sock *sk)
Gustavo F. Padovan6161c032010-05-01 16:15:44 -03001856{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03001857 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan6161c032010-05-01 16:15:44 -03001858 DECLARE_WAITQUEUE(wait, current);
1859 int err = 0;
1860 int timeo = HZ/5;
1861
Marcel Holtmann2b0b05d2010-05-10 11:33:10 +02001862 add_wait_queue(sk_sleep(sk), &wait);
Peter Hurleya71a0cf2011-07-25 18:36:26 -04001863 set_current_state(TASK_INTERRUPTIBLE);
1864 while (chan->unacked_frames > 0 && chan->conn) {
Gustavo F. Padovan6161c032010-05-01 16:15:44 -03001865 if (!timeo)
1866 timeo = HZ/5;
1867
1868 if (signal_pending(current)) {
1869 err = sock_intr_errno(timeo);
1870 break;
1871 }
1872
1873 release_sock(sk);
1874 timeo = schedule_timeout(timeo);
1875 lock_sock(sk);
Peter Hurleya71a0cf2011-07-25 18:36:26 -04001876 set_current_state(TASK_INTERRUPTIBLE);
Gustavo F. Padovan6161c032010-05-01 16:15:44 -03001877
1878 err = sock_error(sk);
1879 if (err)
1880 break;
1881 }
1882 set_current_state(TASK_RUNNING);
Marcel Holtmann2b0b05d2010-05-10 11:33:10 +02001883 remove_wait_queue(sk_sleep(sk), &wait);
Gustavo F. Padovan6161c032010-05-01 16:15:44 -03001884 return err;
1885}
1886
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001887static void l2cap_monitor_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001888{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001889 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001890 monitor_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001891
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03001892 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001893
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001894 l2cap_chan_lock(chan);
1895
Mat Martineau80909e02012-05-17 20:53:50 -07001896 if (!chan->conn) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001897 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001898 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001899 return;
1900 }
1901
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001902 l2cap_tx(chan, NULL, NULL, L2CAP_EV_MONITOR_TO);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001903
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001904 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001905 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001906}
1907
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001908static void l2cap_retrans_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001909{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001910 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001911 retrans_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001912
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03001913 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001914
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001915 l2cap_chan_lock(chan);
1916
Mat Martineau80909e02012-05-17 20:53:50 -07001917 if (!chan->conn) {
1918 l2cap_chan_unlock(chan);
1919 l2cap_chan_put(chan);
1920 return;
1921 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001922
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001923 l2cap_tx(chan, NULL, NULL, L2CAP_EV_RETRANS_TO);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001924 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001925 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001926}
1927
Gustavo Padovand6603662012-05-21 13:58:22 -03001928static void l2cap_streaming_send(struct l2cap_chan *chan,
1929 struct sk_buff_head *skbs)
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001930{
Gustavo F. Padovanccbb84a2010-08-30 18:44:44 -03001931 struct sk_buff *skb;
Mat Martineau37339372012-05-17 20:53:33 -07001932 struct l2cap_ctrl *control;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001933
Mat Martineau37339372012-05-17 20:53:33 -07001934 BT_DBG("chan %p, skbs %p", chan, skbs);
1935
Mat Martineaub99e13a2012-10-23 15:24:19 -07001936 if (__chan_is_moving(chan))
1937 return;
1938
Mat Martineau37339372012-05-17 20:53:33 -07001939 skb_queue_splice_tail_init(skbs, &chan->tx_q);
1940
1941 while (!skb_queue_empty(&chan->tx_q)) {
1942
1943 skb = skb_dequeue(&chan->tx_q);
1944
1945 bt_cb(skb)->control.retries = 1;
1946 control = &bt_cb(skb)->control;
1947
1948 control->reqseq = 0;
1949 control->txseq = chan->next_tx_seq;
1950
1951 __pack_control(chan, control, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001952
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001953 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau37339372012-05-17 20:53:33 -07001954 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1955 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001956 }
1957
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001958 l2cap_do_send(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001959
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001960 BT_DBG("Sent txseq %u", control->txseq);
Mat Martineau37339372012-05-17 20:53:33 -07001961
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001962 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau37339372012-05-17 20:53:33 -07001963 chan->frames_sent++;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001964 }
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001965}
1966
Szymon Janc67c9e842011-07-28 16:24:33 +02001967static int l2cap_ertm_send(struct l2cap_chan *chan)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001968{
1969 struct sk_buff *skb, *tx_skb;
Mat Martineau18a48e72012-05-17 20:53:34 -07001970 struct l2cap_ctrl *control;
1971 int sent = 0;
1972
1973 BT_DBG("chan %p", chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001974
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001975 if (chan->state != BT_CONNECTED)
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001976 return -ENOTCONN;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001977
Mat Martineau94122bb2012-05-02 09:42:02 -07001978 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1979 return 0;
1980
Mat Martineaub99e13a2012-10-23 15:24:19 -07001981 if (__chan_is_moving(chan))
1982 return 0;
1983
Mat Martineau18a48e72012-05-17 20:53:34 -07001984 while (chan->tx_send_head &&
1985 chan->unacked_frames < chan->remote_tx_win &&
1986 chan->tx_state == L2CAP_TX_STATE_XMIT) {
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001987
Mat Martineau18a48e72012-05-17 20:53:34 -07001988 skb = chan->tx_send_head;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001989
Mat Martineau18a48e72012-05-17 20:53:34 -07001990 bt_cb(skb)->control.retries = 1;
1991 control = &bt_cb(skb)->control;
Gustavo F. Padovan95ffa972010-06-18 20:37:33 -03001992
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001993 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
Mat Martineau18a48e72012-05-17 20:53:34 -07001994 control->final = 1;
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001995
Mat Martineau18a48e72012-05-17 20:53:34 -07001996 control->reqseq = chan->buffer_seq;
1997 chan->last_acked_seq = chan->buffer_seq;
1998 control->txseq = chan->next_tx_seq;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001999
Mat Martineau18a48e72012-05-17 20:53:34 -07002000 __pack_control(chan, control, skb);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03002001
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03002002 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau18a48e72012-05-17 20:53:34 -07002003 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
2004 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03002005 }
2006
Mat Martineau18a48e72012-05-17 20:53:34 -07002007 /* Clone after data has been modified. Data is assumed to be
2008 read-only (for locking purposes) on cloned sk_buffs.
2009 */
2010 tx_skb = skb_clone(skb, GFP_KERNEL);
2011
2012 if (!tx_skb)
2013 break;
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -03002014
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03002015 __set_retrans_timer(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002016
Andrei Emeltchenko836be932011-10-17 12:19:57 +03002017 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau18a48e72012-05-17 20:53:34 -07002018 chan->unacked_frames++;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03002019 chan->frames_sent++;
Mat Martineau18a48e72012-05-17 20:53:34 -07002020 sent++;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002021
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03002022 if (skb_queue_is_last(&chan->tx_q, skb))
2023 chan->tx_send_head = NULL;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002024 else
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03002025 chan->tx_send_head = skb_queue_next(&chan->tx_q, skb);
Mat Martineau18a48e72012-05-17 20:53:34 -07002026
2027 l2cap_do_send(chan, tx_skb);
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002028 BT_DBG("Sent txseq %u", control->txseq);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002029 }
2030
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002031 BT_DBG("Sent %d, %u unacked, %u in ERTM queue", sent,
2032 chan->unacked_frames, skb_queue_len(&chan->tx_q));
Mat Martineau18a48e72012-05-17 20:53:34 -07002033
2034 return sent;
Gustavo F. Padovan9e917af2010-05-01 16:15:37 -03002035}
2036
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002037static void l2cap_ertm_resend(struct l2cap_chan *chan)
2038{
2039 struct l2cap_ctrl control;
2040 struct sk_buff *skb;
2041 struct sk_buff *tx_skb;
2042 u16 seq;
2043
2044 BT_DBG("chan %p", chan);
2045
2046 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
2047 return;
2048
Mat Martineaub99e13a2012-10-23 15:24:19 -07002049 if (__chan_is_moving(chan))
2050 return;
2051
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002052 while (chan->retrans_list.head != L2CAP_SEQ_LIST_CLEAR) {
2053 seq = l2cap_seq_list_pop(&chan->retrans_list);
2054
2055 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, seq);
2056 if (!skb) {
2057 BT_DBG("Error: Can't retransmit seq %d, frame missing",
Gustavo Padovan2d792812012-10-06 10:07:01 +01002058 seq);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002059 continue;
2060 }
2061
2062 bt_cb(skb)->control.retries++;
2063 control = bt_cb(skb)->control;
2064
2065 if (chan->max_tx != 0 &&
2066 bt_cb(skb)->control.retries > chan->max_tx) {
2067 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02002068 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002069 l2cap_seq_list_clear(&chan->retrans_list);
2070 break;
2071 }
2072
2073 control.reqseq = chan->buffer_seq;
2074 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
2075 control.final = 1;
2076 else
2077 control.final = 0;
2078
2079 if (skb_cloned(skb)) {
2080 /* Cloned sk_buffs are read-only, so we need a
2081 * writeable copy
2082 */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002083 tx_skb = skb_copy(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002084 } else {
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002085 tx_skb = skb_clone(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002086 }
2087
2088 if (!tx_skb) {
2089 l2cap_seq_list_clear(&chan->retrans_list);
2090 break;
2091 }
2092
2093 /* Update skb contents */
2094 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
2095 put_unaligned_le32(__pack_extended_control(&control),
2096 tx_skb->data + L2CAP_HDR_SIZE);
2097 } else {
2098 put_unaligned_le16(__pack_enhanced_control(&control),
2099 tx_skb->data + L2CAP_HDR_SIZE);
2100 }
2101
2102 if (chan->fcs == L2CAP_FCS_CRC16) {
2103 u16 fcs = crc16(0, (u8 *) tx_skb->data, tx_skb->len);
2104 put_unaligned_le16(fcs, skb_put(tx_skb,
2105 L2CAP_FCS_SIZE));
2106 }
2107
2108 l2cap_do_send(chan, tx_skb);
2109
2110 BT_DBG("Resent txseq %d", control.txseq);
2111
2112 chan->last_acked_seq = chan->buffer_seq;
2113 }
2114}
2115
Mat Martineauf80842a2012-05-17 20:53:46 -07002116static void l2cap_retransmit(struct l2cap_chan *chan,
2117 struct l2cap_ctrl *control)
2118{
2119 BT_DBG("chan %p, control %p", chan, control);
2120
2121 l2cap_seq_list_append(&chan->retrans_list, control->reqseq);
2122 l2cap_ertm_resend(chan);
2123}
2124
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002125static void l2cap_retransmit_all(struct l2cap_chan *chan,
2126 struct l2cap_ctrl *control)
2127{
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002128 struct sk_buff *skb;
2129
2130 BT_DBG("chan %p, control %p", chan, control);
2131
2132 if (control->poll)
2133 set_bit(CONN_SEND_FBIT, &chan->conn_state);
2134
2135 l2cap_seq_list_clear(&chan->retrans_list);
2136
2137 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
2138 return;
2139
2140 if (chan->unacked_frames) {
2141 skb_queue_walk(&chan->tx_q, skb) {
2142 if (bt_cb(skb)->control.txseq == control->reqseq ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01002143 skb == chan->tx_send_head)
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002144 break;
2145 }
2146
2147 skb_queue_walk_from(&chan->tx_q, skb) {
2148 if (skb == chan->tx_send_head)
2149 break;
2150
2151 l2cap_seq_list_append(&chan->retrans_list,
2152 bt_cb(skb)->control.txseq);
2153 }
2154
2155 l2cap_ertm_resend(chan);
2156 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002157}
2158
Szymon Jancb17e73b2012-01-11 10:59:47 +01002159static void l2cap_send_ack(struct l2cap_chan *chan)
2160{
Mat Martineau0a0aba42012-05-17 20:53:39 -07002161 struct l2cap_ctrl control;
2162 u16 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
2163 chan->last_acked_seq);
2164 int threshold;
2165
2166 BT_DBG("chan %p last_acked_seq %d buffer_seq %d",
2167 chan, chan->last_acked_seq, chan->buffer_seq);
2168
2169 memset(&control, 0, sizeof(control));
2170 control.sframe = 1;
2171
2172 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
2173 chan->rx_state == L2CAP_RX_STATE_RECV) {
2174 __clear_ack_timer(chan);
2175 control.super = L2CAP_SUPER_RNR;
2176 control.reqseq = chan->buffer_seq;
2177 l2cap_send_sframe(chan, &control);
2178 } else {
2179 if (!test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) {
2180 l2cap_ertm_send(chan);
2181 /* If any i-frames were sent, they included an ack */
2182 if (chan->buffer_seq == chan->last_acked_seq)
2183 frames_to_ack = 0;
2184 }
2185
Mat Martineauc20f8e32012-07-10 05:47:07 -07002186 /* Ack now if the window is 3/4ths full.
Mat Martineau0a0aba42012-05-17 20:53:39 -07002187 * Calculate without mul or div
2188 */
Mat Martineauc20f8e32012-07-10 05:47:07 -07002189 threshold = chan->ack_win;
Mat Martineau0a0aba42012-05-17 20:53:39 -07002190 threshold += threshold << 1;
2191 threshold >>= 2;
2192
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002193 BT_DBG("frames_to_ack %u, threshold %d", frames_to_ack,
Mat Martineau0a0aba42012-05-17 20:53:39 -07002194 threshold);
2195
2196 if (frames_to_ack >= threshold) {
2197 __clear_ack_timer(chan);
2198 control.super = L2CAP_SUPER_RR;
2199 control.reqseq = chan->buffer_seq;
2200 l2cap_send_sframe(chan, &control);
2201 frames_to_ack = 0;
2202 }
2203
2204 if (frames_to_ack)
2205 __set_ack_timer(chan);
2206 }
Szymon Jancb17e73b2012-01-11 10:59:47 +01002207}
2208
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002209static inline int l2cap_skbuff_fromiovec(struct l2cap_chan *chan,
2210 struct msghdr *msg, int len,
2211 int count, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002212{
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002213 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002214 struct sk_buff **frag;
Gustavo Padovan90338942012-04-06 20:15:47 -03002215 int sent = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002216
Gustavo F. Padovan59203a22010-05-01 16:15:43 -03002217 if (memcpy_fromiovec(skb_put(skb, count), msg->msg_iov, count))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002218 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002219
2220 sent += count;
2221 len -= count;
2222
2223 /* Continuation fragments (no L2CAP header) */
2224 frag = &skb_shinfo(skb)->frag_list;
2225 while (len) {
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002226 struct sk_buff *tmp;
2227
Linus Torvalds1da177e2005-04-16 15:20:36 -07002228 count = min_t(unsigned int, conn->mtu, len);
2229
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002230 tmp = chan->ops->alloc_skb(chan, count,
2231 msg->msg_flags & MSG_DONTWAIT);
2232 if (IS_ERR(tmp))
2233 return PTR_ERR(tmp);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002234
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002235 *frag = tmp;
2236
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002237 if (memcpy_fromiovec(skb_put(*frag, count), msg->msg_iov, count))
2238 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002239
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002240 (*frag)->priority = skb->priority;
2241
Linus Torvalds1da177e2005-04-16 15:20:36 -07002242 sent += count;
2243 len -= count;
2244
Gustavo Padovan2d0ed3d2012-05-11 13:16:12 -03002245 skb->len += (*frag)->len;
2246 skb->data_len += (*frag)->len;
2247
Linus Torvalds1da177e2005-04-16 15:20:36 -07002248 frag = &(*frag)->next;
2249 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002250
2251 return sent;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002252}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002253
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002254static struct sk_buff *l2cap_create_connless_pdu(struct l2cap_chan *chan,
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002255 struct msghdr *msg, size_t len,
2256 u32 priority)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002257{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002258 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002259 struct sk_buff *skb;
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002260 int err, count, hlen = L2CAP_HDR_SIZE + L2CAP_PSMLEN_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002261 struct l2cap_hdr *lh;
2262
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002263 BT_DBG("chan %p len %zu priority %u", chan, len, priority);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002264
2265 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002266
2267 skb = chan->ops->alloc_skb(chan, count + hlen,
Gustavo Padovan90338942012-04-06 20:15:47 -03002268 msg->msg_flags & MSG_DONTWAIT);
2269 if (IS_ERR(skb))
2270 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002271
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002272 skb->priority = priority;
2273
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002274 /* Create L2CAP header */
2275 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002276 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenkodaf6a78c2012-05-03 10:55:52 +03002277 lh->len = cpu_to_le16(len + L2CAP_PSMLEN_SIZE);
2278 put_unaligned(chan->psm, skb_put(skb, L2CAP_PSMLEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002279
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002280 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002281 if (unlikely(err < 0)) {
2282 kfree_skb(skb);
2283 return ERR_PTR(err);
2284 }
2285 return skb;
2286}
2287
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002288static struct sk_buff *l2cap_create_basic_pdu(struct l2cap_chan *chan,
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002289 struct msghdr *msg, size_t len,
2290 u32 priority)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002291{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002292 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002293 struct sk_buff *skb;
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002294 int err, count;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002295 struct l2cap_hdr *lh;
2296
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002297 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002298
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002299 count = min_t(unsigned int, (conn->mtu - L2CAP_HDR_SIZE), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002300
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002301 skb = chan->ops->alloc_skb(chan, count + L2CAP_HDR_SIZE,
Gustavo Padovan90338942012-04-06 20:15:47 -03002302 msg->msg_flags & MSG_DONTWAIT);
2303 if (IS_ERR(skb))
2304 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002305
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002306 skb->priority = priority;
2307
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002308 /* Create L2CAP header */
2309 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002310 lh->cid = cpu_to_le16(chan->dcid);
Gustavo Padovan6ff9b5e2012-05-02 11:56:17 -03002311 lh->len = cpu_to_le16(len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002312
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002313 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002314 if (unlikely(err < 0)) {
2315 kfree_skb(skb);
2316 return ERR_PTR(err);
2317 }
2318 return skb;
2319}
2320
Luiz Augusto von Dentzab0ff762011-09-12 20:00:50 +03002321static struct sk_buff *l2cap_create_iframe_pdu(struct l2cap_chan *chan,
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002322 struct msghdr *msg, size_t len,
2323 u16 sdulen)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002324{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002325 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002326 struct sk_buff *skb;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002327 int err, count, hlen;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002328 struct l2cap_hdr *lh;
2329
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002330 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002331
Gustavo F. Padovan0ee0d202010-05-01 16:15:41 -03002332 if (!conn)
2333 return ERR_PTR(-ENOTCONN);
2334
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002335 hlen = __ertm_hdr_size(chan);
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002336
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002337 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002338 hlen += L2CAP_SDULEN_SIZE;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002339
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03002340 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002341 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03002342
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002343 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002344
2345 skb = chan->ops->alloc_skb(chan, count + hlen,
Gustavo Padovan90338942012-04-06 20:15:47 -03002346 msg->msg_flags & MSG_DONTWAIT);
2347 if (IS_ERR(skb))
2348 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002349
2350 /* Create L2CAP header */
2351 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002352 lh->cid = cpu_to_le16(chan->dcid);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002353 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002354
Mat Martineau18a48e72012-05-17 20:53:34 -07002355 /* Control header is populated later */
2356 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
2357 put_unaligned_le32(0, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
2358 else
2359 put_unaligned_le16(0, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002360
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002361 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002362 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002363
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002364 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002365 if (unlikely(err < 0)) {
2366 kfree_skb(skb);
2367 return ERR_PTR(err);
2368 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03002369
Mat Martineau18a48e72012-05-17 20:53:34 -07002370 bt_cb(skb)->control.fcs = chan->fcs;
Mat Martineau3ce35142012-04-25 16:36:14 -07002371 bt_cb(skb)->control.retries = 0;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002372 return skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002373}
2374
Mat Martineau94122bb2012-05-02 09:42:02 -07002375static int l2cap_segment_sdu(struct l2cap_chan *chan,
2376 struct sk_buff_head *seg_queue,
2377 struct msghdr *msg, size_t len)
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002378{
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002379 struct sk_buff *skb;
Mat Martineau94122bb2012-05-02 09:42:02 -07002380 u16 sdu_len;
2381 size_t pdu_len;
Mat Martineau94122bb2012-05-02 09:42:02 -07002382 u8 sar;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002383
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002384 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002385
Mat Martineau94122bb2012-05-02 09:42:02 -07002386 /* It is critical that ERTM PDUs fit in a single HCI fragment,
2387 * so fragmented skbs are not used. The HCI layer's handling
2388 * of fragmented skbs is not compatible with ERTM's queueing.
2389 */
2390
2391 /* PDU size is derived from the HCI MTU */
2392 pdu_len = chan->conn->mtu;
2393
Mat Martineaua5495742012-10-23 15:24:21 -07002394 /* Constrain PDU size for BR/EDR connections */
2395 if (!chan->hs_hcon)
2396 pdu_len = min_t(size_t, pdu_len, L2CAP_BREDR_MAX_PAYLOAD);
Mat Martineau94122bb2012-05-02 09:42:02 -07002397
2398 /* Adjust for largest possible L2CAP overhead. */
Gustavo Padovan35d401d2012-05-25 18:57:05 -03002399 if (chan->fcs)
2400 pdu_len -= L2CAP_FCS_SIZE;
2401
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002402 pdu_len -= __ertm_hdr_size(chan);
Mat Martineau94122bb2012-05-02 09:42:02 -07002403
2404 /* Remote device may have requested smaller PDUs */
2405 pdu_len = min_t(size_t, pdu_len, chan->remote_mps);
2406
2407 if (len <= pdu_len) {
2408 sar = L2CAP_SAR_UNSEGMENTED;
2409 sdu_len = 0;
2410 pdu_len = len;
2411 } else {
2412 sar = L2CAP_SAR_START;
2413 sdu_len = len;
2414 pdu_len -= L2CAP_SDULEN_SIZE;
2415 }
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002416
2417 while (len > 0) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002418 skb = l2cap_create_iframe_pdu(chan, msg, pdu_len, sdu_len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002419
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002420 if (IS_ERR(skb)) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002421 __skb_queue_purge(seg_queue);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002422 return PTR_ERR(skb);
2423 }
2424
Mat Martineau94122bb2012-05-02 09:42:02 -07002425 bt_cb(skb)->control.sar = sar;
2426 __skb_queue_tail(seg_queue, skb);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002427
Mat Martineau94122bb2012-05-02 09:42:02 -07002428 len -= pdu_len;
2429 if (sdu_len) {
2430 sdu_len = 0;
2431 pdu_len += L2CAP_SDULEN_SIZE;
2432 }
2433
2434 if (len <= pdu_len) {
2435 sar = L2CAP_SAR_END;
2436 pdu_len = len;
2437 } else {
2438 sar = L2CAP_SAR_CONTINUE;
2439 }
2440 }
2441
Gustavo Padovanf0f62792012-05-29 13:29:17 -03002442 return 0;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002443}
2444
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002445int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01002446 u32 priority)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002447{
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002448 struct sk_buff *skb;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002449 int err;
Mat Martineau94122bb2012-05-02 09:42:02 -07002450 struct sk_buff_head seg_queue;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002451
2452 /* Connectionless channel */
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002453 if (chan->chan_type == L2CAP_CHAN_CONN_LESS) {
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002454 skb = l2cap_create_connless_pdu(chan, msg, len, priority);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002455 if (IS_ERR(skb))
2456 return PTR_ERR(skb);
2457
2458 l2cap_do_send(chan, skb);
2459 return len;
2460 }
2461
2462 switch (chan->mode) {
2463 case L2CAP_MODE_BASIC:
2464 /* Check outgoing MTU */
2465 if (len > chan->omtu)
2466 return -EMSGSIZE;
2467
2468 /* Create a basic PDU */
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002469 skb = l2cap_create_basic_pdu(chan, msg, len, priority);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002470 if (IS_ERR(skb))
2471 return PTR_ERR(skb);
2472
2473 l2cap_do_send(chan, skb);
2474 err = len;
2475 break;
2476
2477 case L2CAP_MODE_ERTM:
2478 case L2CAP_MODE_STREAMING:
Mat Martineau94122bb2012-05-02 09:42:02 -07002479 /* Check outgoing MTU */
2480 if (len > chan->omtu) {
2481 err = -EMSGSIZE;
2482 break;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002483 }
2484
Mat Martineau94122bb2012-05-02 09:42:02 -07002485 __skb_queue_head_init(&seg_queue);
2486
2487 /* Do segmentation before calling in to the state machine,
2488 * since it's possible to block while waiting for memory
2489 * allocation.
2490 */
2491 err = l2cap_segment_sdu(chan, &seg_queue, msg, len);
2492
2493 /* The channel could have been closed while segmenting,
2494 * check that it is still connected.
2495 */
2496 if (chan->state != BT_CONNECTED) {
2497 __skb_queue_purge(&seg_queue);
2498 err = -ENOTCONN;
2499 }
2500
2501 if (err)
2502 break;
2503
Mat Martineau37339372012-05-17 20:53:33 -07002504 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo Padovand6603662012-05-21 13:58:22 -03002505 l2cap_tx(chan, NULL, &seg_queue, L2CAP_EV_DATA_REQUEST);
Mat Martineau37339372012-05-17 20:53:33 -07002506 else
Gustavo Padovand6603662012-05-21 13:58:22 -03002507 l2cap_streaming_send(chan, &seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002508
Gustavo Padovand6603662012-05-21 13:58:22 -03002509 err = len;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002510
Mat Martineau94122bb2012-05-02 09:42:02 -07002511 /* If the skbs were not queued for sending, they'll still be in
2512 * seg_queue and need to be purged.
2513 */
2514 __skb_queue_purge(&seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002515 break;
2516
2517 default:
2518 BT_DBG("bad state %1.1x", chan->mode);
2519 err = -EBADFD;
2520 }
2521
2522 return err;
2523}
2524
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002525static void l2cap_send_srej(struct l2cap_chan *chan, u16 txseq)
2526{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002527 struct l2cap_ctrl control;
2528 u16 seq;
2529
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002530 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002531
2532 memset(&control, 0, sizeof(control));
2533 control.sframe = 1;
2534 control.super = L2CAP_SUPER_SREJ;
2535
2536 for (seq = chan->expected_tx_seq; seq != txseq;
2537 seq = __next_seq(chan, seq)) {
2538 if (!l2cap_ertm_seq_in_queue(&chan->srej_q, seq)) {
2539 control.reqseq = seq;
2540 l2cap_send_sframe(chan, &control);
2541 l2cap_seq_list_append(&chan->srej_list, seq);
2542 }
2543 }
2544
2545 chan->expected_tx_seq = __next_seq(chan, txseq);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002546}
2547
2548static void l2cap_send_srej_tail(struct l2cap_chan *chan)
2549{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002550 struct l2cap_ctrl control;
2551
2552 BT_DBG("chan %p", chan);
2553
2554 if (chan->srej_list.tail == L2CAP_SEQ_LIST_CLEAR)
2555 return;
2556
2557 memset(&control, 0, sizeof(control));
2558 control.sframe = 1;
2559 control.super = L2CAP_SUPER_SREJ;
2560 control.reqseq = chan->srej_list.tail;
2561 l2cap_send_sframe(chan, &control);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002562}
2563
2564static void l2cap_send_srej_list(struct l2cap_chan *chan, u16 txseq)
2565{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002566 struct l2cap_ctrl control;
2567 u16 initial_head;
2568 u16 seq;
2569
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002570 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002571
2572 memset(&control, 0, sizeof(control));
2573 control.sframe = 1;
2574 control.super = L2CAP_SUPER_SREJ;
2575
2576 /* Capture initial list head to allow only one pass through the list. */
2577 initial_head = chan->srej_list.head;
2578
2579 do {
2580 seq = l2cap_seq_list_pop(&chan->srej_list);
2581 if (seq == txseq || seq == L2CAP_SEQ_LIST_CLEAR)
2582 break;
2583
2584 control.reqseq = seq;
2585 l2cap_send_sframe(chan, &control);
2586 l2cap_seq_list_append(&chan->srej_list, seq);
2587 } while (chan->srej_list.head != initial_head);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002588}
2589
Mat Martineau608bcc62012-05-17 20:53:32 -07002590static void l2cap_process_reqseq(struct l2cap_chan *chan, u16 reqseq)
2591{
2592 struct sk_buff *acked_skb;
2593 u16 ackseq;
2594
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002595 BT_DBG("chan %p, reqseq %u", chan, reqseq);
Mat Martineau608bcc62012-05-17 20:53:32 -07002596
2597 if (chan->unacked_frames == 0 || reqseq == chan->expected_ack_seq)
2598 return;
2599
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002600 BT_DBG("expected_ack_seq %u, unacked_frames %u",
Mat Martineau608bcc62012-05-17 20:53:32 -07002601 chan->expected_ack_seq, chan->unacked_frames);
2602
2603 for (ackseq = chan->expected_ack_seq; ackseq != reqseq;
2604 ackseq = __next_seq(chan, ackseq)) {
2605
2606 acked_skb = l2cap_ertm_seq_in_queue(&chan->tx_q, ackseq);
2607 if (acked_skb) {
2608 skb_unlink(acked_skb, &chan->tx_q);
2609 kfree_skb(acked_skb);
2610 chan->unacked_frames--;
2611 }
2612 }
2613
2614 chan->expected_ack_seq = reqseq;
2615
2616 if (chan->unacked_frames == 0)
2617 __clear_retrans_timer(chan);
2618
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002619 BT_DBG("unacked_frames %u", chan->unacked_frames);
Mat Martineau608bcc62012-05-17 20:53:32 -07002620}
2621
2622static void l2cap_abort_rx_srej_sent(struct l2cap_chan *chan)
2623{
2624 BT_DBG("chan %p", chan);
2625
2626 chan->expected_tx_seq = chan->buffer_seq;
2627 l2cap_seq_list_clear(&chan->srej_list);
2628 skb_queue_purge(&chan->srej_q);
2629 chan->rx_state = L2CAP_RX_STATE_RECV;
2630}
2631
Gustavo Padovand6603662012-05-21 13:58:22 -03002632static void l2cap_tx_state_xmit(struct l2cap_chan *chan,
2633 struct l2cap_ctrl *control,
2634 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002635{
Mat Martineau608bcc62012-05-17 20:53:32 -07002636 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2637 event);
2638
2639 switch (event) {
2640 case L2CAP_EV_DATA_REQUEST:
2641 if (chan->tx_send_head == NULL)
2642 chan->tx_send_head = skb_peek(skbs);
2643
2644 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2645 l2cap_ertm_send(chan);
2646 break;
2647 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2648 BT_DBG("Enter LOCAL_BUSY");
2649 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2650
2651 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2652 /* The SREJ_SENT state must be aborted if we are to
2653 * enter the LOCAL_BUSY state.
2654 */
2655 l2cap_abort_rx_srej_sent(chan);
2656 }
2657
2658 l2cap_send_ack(chan);
2659
2660 break;
2661 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2662 BT_DBG("Exit LOCAL_BUSY");
2663 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2664
2665 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2666 struct l2cap_ctrl local_control;
2667
2668 memset(&local_control, 0, sizeof(local_control));
2669 local_control.sframe = 1;
2670 local_control.super = L2CAP_SUPER_RR;
2671 local_control.poll = 1;
2672 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002673 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002674
2675 chan->retry_count = 1;
2676 __set_monitor_timer(chan);
2677 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2678 }
2679 break;
2680 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2681 l2cap_process_reqseq(chan, control->reqseq);
2682 break;
2683 case L2CAP_EV_EXPLICIT_POLL:
2684 l2cap_send_rr_or_rnr(chan, 1);
2685 chan->retry_count = 1;
2686 __set_monitor_timer(chan);
2687 __clear_ack_timer(chan);
2688 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2689 break;
2690 case L2CAP_EV_RETRANS_TO:
2691 l2cap_send_rr_or_rnr(chan, 1);
2692 chan->retry_count = 1;
2693 __set_monitor_timer(chan);
2694 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2695 break;
2696 case L2CAP_EV_RECV_FBIT:
2697 /* Nothing to process */
2698 break;
2699 default:
2700 break;
2701 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002702}
2703
Gustavo Padovand6603662012-05-21 13:58:22 -03002704static void l2cap_tx_state_wait_f(struct l2cap_chan *chan,
2705 struct l2cap_ctrl *control,
2706 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002707{
Mat Martineau608bcc62012-05-17 20:53:32 -07002708 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2709 event);
2710
2711 switch (event) {
2712 case L2CAP_EV_DATA_REQUEST:
2713 if (chan->tx_send_head == NULL)
2714 chan->tx_send_head = skb_peek(skbs);
2715 /* Queue data, but don't send. */
2716 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2717 break;
2718 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2719 BT_DBG("Enter LOCAL_BUSY");
2720 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2721
2722 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2723 /* The SREJ_SENT state must be aborted if we are to
2724 * enter the LOCAL_BUSY state.
2725 */
2726 l2cap_abort_rx_srej_sent(chan);
2727 }
2728
2729 l2cap_send_ack(chan);
2730
2731 break;
2732 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2733 BT_DBG("Exit LOCAL_BUSY");
2734 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2735
2736 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2737 struct l2cap_ctrl local_control;
2738 memset(&local_control, 0, sizeof(local_control));
2739 local_control.sframe = 1;
2740 local_control.super = L2CAP_SUPER_RR;
2741 local_control.poll = 1;
2742 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002743 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002744
2745 chan->retry_count = 1;
2746 __set_monitor_timer(chan);
2747 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2748 }
2749 break;
2750 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2751 l2cap_process_reqseq(chan, control->reqseq);
2752
2753 /* Fall through */
2754
2755 case L2CAP_EV_RECV_FBIT:
2756 if (control && control->final) {
2757 __clear_monitor_timer(chan);
2758 if (chan->unacked_frames > 0)
2759 __set_retrans_timer(chan);
2760 chan->retry_count = 0;
2761 chan->tx_state = L2CAP_TX_STATE_XMIT;
2762 BT_DBG("recv fbit tx_state 0x2.2%x", chan->tx_state);
2763 }
2764 break;
2765 case L2CAP_EV_EXPLICIT_POLL:
2766 /* Ignore */
2767 break;
2768 case L2CAP_EV_MONITOR_TO:
2769 if (chan->max_tx == 0 || chan->retry_count < chan->max_tx) {
2770 l2cap_send_rr_or_rnr(chan, 1);
2771 __set_monitor_timer(chan);
2772 chan->retry_count++;
2773 } else {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02002774 l2cap_send_disconn_req(chan, ECONNABORTED);
Mat Martineau608bcc62012-05-17 20:53:32 -07002775 }
2776 break;
2777 default:
2778 break;
2779 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002780}
2781
Gustavo Padovand6603662012-05-21 13:58:22 -03002782static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
2783 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002784{
Mat Martineau608bcc62012-05-17 20:53:32 -07002785 BT_DBG("chan %p, control %p, skbs %p, event %d, state %d",
2786 chan, control, skbs, event, chan->tx_state);
2787
2788 switch (chan->tx_state) {
2789 case L2CAP_TX_STATE_XMIT:
Gustavo Padovand6603662012-05-21 13:58:22 -03002790 l2cap_tx_state_xmit(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002791 break;
2792 case L2CAP_TX_STATE_WAIT_F:
Gustavo Padovand6603662012-05-21 13:58:22 -03002793 l2cap_tx_state_wait_f(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002794 break;
2795 default:
2796 /* Ignore event */
2797 break;
2798 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002799}
2800
Mat Martineau4b51dae92012-05-17 20:53:37 -07002801static void l2cap_pass_to_tx(struct l2cap_chan *chan,
2802 struct l2cap_ctrl *control)
2803{
2804 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002805 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_REQSEQ_AND_FBIT);
Mat Martineau4b51dae92012-05-17 20:53:37 -07002806}
2807
Mat Martineauf80842a2012-05-17 20:53:46 -07002808static void l2cap_pass_to_tx_fbit(struct l2cap_chan *chan,
2809 struct l2cap_ctrl *control)
2810{
2811 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002812 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_FBIT);
Mat Martineauf80842a2012-05-17 20:53:46 -07002813}
2814
Linus Torvalds1da177e2005-04-16 15:20:36 -07002815/* Copy frame to all raw sockets on that connection */
2816static void l2cap_raw_recv(struct l2cap_conn *conn, struct sk_buff *skb)
2817{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002818 struct sk_buff *nskb;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03002819 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002820
2821 BT_DBG("conn %p", conn);
2822
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002823 mutex_lock(&conn->chan_lock);
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002824
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002825 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovan48454072011-03-25 00:22:30 -03002826 struct sock *sk = chan->sk;
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002827 if (chan->chan_type != L2CAP_CHAN_RAW)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002828 continue;
2829
2830 /* Don't send frame to the socket it came from */
2831 if (skb->sk == sk)
2832 continue;
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002833 nskb = skb_clone(skb, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03002834 if (!nskb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002835 continue;
2836
Gustavo Padovan80b98022012-05-27 22:27:51 -03002837 if (chan->ops->recv(chan, nskb))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002838 kfree_skb(nskb);
2839 }
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002840
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002841 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002842}
2843
2844/* ---- L2CAP signalling commands ---- */
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002845static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn, u8 code,
2846 u8 ident, u16 dlen, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002847{
2848 struct sk_buff *skb, **frag;
2849 struct l2cap_cmd_hdr *cmd;
2850 struct l2cap_hdr *lh;
2851 int len, count;
2852
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002853 BT_DBG("conn %p, code 0x%2.2x, ident 0x%2.2x, len %u",
2854 conn, code, ident, dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002855
Anderson Lizardo300b9622013-06-02 16:30:40 -04002856 if (conn->mtu < L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE)
2857 return NULL;
2858
Linus Torvalds1da177e2005-04-16 15:20:36 -07002859 len = L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE + dlen;
2860 count = min_t(unsigned int, conn->mtu, len);
2861
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002862 skb = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002863 if (!skb)
2864 return NULL;
2865
2866 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002867 lh->len = cpu_to_le16(L2CAP_CMD_HDR_SIZE + dlen);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002868
2869 if (conn->hcon->type == LE_LINK)
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03002870 lh->cid = __constant_cpu_to_le16(L2CAP_CID_LE_SIGNALING);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002871 else
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03002872 lh->cid = __constant_cpu_to_le16(L2CAP_CID_SIGNALING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002873
2874 cmd = (struct l2cap_cmd_hdr *) skb_put(skb, L2CAP_CMD_HDR_SIZE);
2875 cmd->code = code;
2876 cmd->ident = ident;
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002877 cmd->len = cpu_to_le16(dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002878
2879 if (dlen) {
2880 count -= L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE;
2881 memcpy(skb_put(skb, count), data, count);
2882 data += count;
2883 }
2884
2885 len -= skb->len;
2886
2887 /* Continuation fragments (no L2CAP header) */
2888 frag = &skb_shinfo(skb)->frag_list;
2889 while (len) {
2890 count = min_t(unsigned int, conn->mtu, len);
2891
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002892 *frag = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002893 if (!*frag)
2894 goto fail;
2895
2896 memcpy(skb_put(*frag, count), data, count);
2897
2898 len -= count;
2899 data += count;
2900
2901 frag = &(*frag)->next;
2902 }
2903
2904 return skb;
2905
2906fail:
2907 kfree_skb(skb);
2908 return NULL;
2909}
2910
Gustavo Padovan2d792812012-10-06 10:07:01 +01002911static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen,
2912 unsigned long *val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002913{
2914 struct l2cap_conf_opt *opt = *ptr;
2915 int len;
2916
2917 len = L2CAP_CONF_OPT_SIZE + opt->len;
2918 *ptr += len;
2919
2920 *type = opt->type;
2921 *olen = opt->len;
2922
2923 switch (opt->len) {
2924 case 1:
2925 *val = *((u8 *) opt->val);
2926 break;
2927
2928 case 2:
steven miaobfaaeb32010-10-16 18:29:47 -04002929 *val = get_unaligned_le16(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002930 break;
2931
2932 case 4:
steven miaobfaaeb32010-10-16 18:29:47 -04002933 *val = get_unaligned_le32(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002934 break;
2935
2936 default:
2937 *val = (unsigned long) opt->val;
2938 break;
2939 }
2940
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002941 BT_DBG("type 0x%2.2x len %u val 0x%lx", *type, opt->len, *val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002942 return len;
2943}
2944
Linus Torvalds1da177e2005-04-16 15:20:36 -07002945static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val)
2946{
2947 struct l2cap_conf_opt *opt = *ptr;
2948
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002949 BT_DBG("type 0x%2.2x len %u val 0x%lx", type, len, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002950
2951 opt->type = type;
2952 opt->len = len;
2953
2954 switch (len) {
2955 case 1:
2956 *((u8 *) opt->val) = val;
2957 break;
2958
2959 case 2:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02002960 put_unaligned_le16(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002961 break;
2962
2963 case 4:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02002964 put_unaligned_le32(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002965 break;
2966
2967 default:
2968 memcpy(opt->val, (void *) val, len);
2969 break;
2970 }
2971
2972 *ptr += L2CAP_CONF_OPT_SIZE + len;
2973}
2974
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03002975static void l2cap_add_opt_efs(void **ptr, struct l2cap_chan *chan)
2976{
2977 struct l2cap_conf_efs efs;
2978
Szymon Janc1ec918c2011-11-16 09:32:21 +01002979 switch (chan->mode) {
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03002980 case L2CAP_MODE_ERTM:
2981 efs.id = chan->local_id;
2982 efs.stype = chan->local_stype;
2983 efs.msdu = cpu_to_le16(chan->local_msdu);
2984 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03002985 efs.acc_lat = __constant_cpu_to_le32(L2CAP_DEFAULT_ACC_LAT);
Andrei Emeltchenko8936fa62012-10-08 11:14:41 +03002986 efs.flush_to = __constant_cpu_to_le32(L2CAP_EFS_DEFAULT_FLUSH_TO);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03002987 break;
2988
2989 case L2CAP_MODE_STREAMING:
2990 efs.id = 1;
2991 efs.stype = L2CAP_SERV_BESTEFFORT;
2992 efs.msdu = cpu_to_le16(chan->local_msdu);
2993 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
2994 efs.acc_lat = 0;
2995 efs.flush_to = 0;
2996 break;
2997
2998 default:
2999 return;
3000 }
3001
3002 l2cap_add_conf_opt(ptr, L2CAP_CONF_EFS, sizeof(efs),
Andrei Emeltchenko8936fa62012-10-08 11:14:41 +03003003 (unsigned long) &efs);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003004}
3005
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003006static void l2cap_ack_timeout(struct work_struct *work)
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003007{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003008 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau03625202012-05-17 20:53:51 -07003009 ack_timer.work);
3010 u16 frames_to_ack;
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003011
Gustavo F. Padovan2fb9b3d2011-12-22 16:56:05 -02003012 BT_DBG("chan %p", chan);
3013
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003014 l2cap_chan_lock(chan);
3015
Mat Martineau03625202012-05-17 20:53:51 -07003016 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
3017 chan->last_acked_seq);
3018
3019 if (frames_to_ack)
3020 l2cap_send_rr_or_rnr(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003021
3022 l2cap_chan_unlock(chan);
Szymon Janc09bfb2e2012-01-11 10:59:49 +01003023 l2cap_chan_put(chan);
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003024}
3025
Andrei Emeltchenko466f8002012-05-29 13:59:01 +03003026int l2cap_ertm_init(struct l2cap_chan *chan)
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003027{
Mat Martineau3c588192012-04-11 10:48:42 -07003028 int err;
3029
Mat Martineau105bdf92012-04-27 16:50:48 -07003030 chan->next_tx_seq = 0;
3031 chan->expected_tx_seq = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003032 chan->expected_ack_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003033 chan->unacked_frames = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003034 chan->buffer_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003035 chan->frames_sent = 0;
Mat Martineau105bdf92012-04-27 16:50:48 -07003036 chan->last_acked_seq = 0;
3037 chan->sdu = NULL;
3038 chan->sdu_last_frag = NULL;
3039 chan->sdu_len = 0;
3040
Mat Martineaud34c34f2012-05-14 14:49:27 -07003041 skb_queue_head_init(&chan->tx_q);
3042
Mat Martineau08333282012-10-23 15:24:06 -07003043 chan->local_amp_id = 0;
3044 chan->move_id = 0;
3045 chan->move_state = L2CAP_MOVE_STABLE;
3046 chan->move_role = L2CAP_MOVE_ROLE_NONE;
3047
Mat Martineau105bdf92012-04-27 16:50:48 -07003048 if (chan->mode != L2CAP_MODE_ERTM)
3049 return 0;
3050
3051 chan->rx_state = L2CAP_RX_STATE_RECV;
3052 chan->tx_state = L2CAP_TX_STATE_XMIT;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003053
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003054 INIT_DELAYED_WORK(&chan->retrans_timer, l2cap_retrans_timeout);
3055 INIT_DELAYED_WORK(&chan->monitor_timer, l2cap_monitor_timeout);
3056 INIT_DELAYED_WORK(&chan->ack_timer, l2cap_ack_timeout);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003057
Gustavo F. Padovanf1c67752011-03-25 20:36:10 -03003058 skb_queue_head_init(&chan->srej_q);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03003059
Mat Martineau3c588192012-04-11 10:48:42 -07003060 err = l2cap_seq_list_init(&chan->srej_list, chan->tx_win);
3061 if (err < 0)
3062 return err;
3063
Mat Martineau9dc9aff2012-05-17 16:20:14 -07003064 err = l2cap_seq_list_init(&chan->retrans_list, chan->remote_tx_win);
3065 if (err < 0)
3066 l2cap_seq_list_free(&chan->srej_list);
3067
3068 return err;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003069}
3070
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003071static inline __u8 l2cap_select_mode(__u8 mode, __u16 remote_feat_mask)
3072{
3073 switch (mode) {
3074 case L2CAP_MODE_STREAMING:
3075 case L2CAP_MODE_ERTM:
3076 if (l2cap_mode_supported(mode, remote_feat_mask))
3077 return mode;
3078 /* fall through */
3079 default:
3080 return L2CAP_MODE_BASIC;
3081 }
3082}
3083
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003084static inline bool __l2cap_ews_supported(struct l2cap_chan *chan)
3085{
3086 return enable_hs && chan->conn->feat_mask & L2CAP_FEAT_EXT_WINDOW;
3087}
3088
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003089static inline bool __l2cap_efs_supported(struct l2cap_chan *chan)
3090{
3091 return enable_hs && chan->conn->feat_mask & L2CAP_FEAT_EXT_FLOW;
3092}
3093
Mat Martineau36c86c82012-10-23 15:24:20 -07003094static void __l2cap_set_ertm_timeouts(struct l2cap_chan *chan,
3095 struct l2cap_conf_rfc *rfc)
3096{
3097 if (chan->local_amp_id && chan->hs_hcon) {
3098 u64 ertm_to = chan->hs_hcon->hdev->amp_be_flush_to;
3099
3100 /* Class 1 devices have must have ERTM timeouts
3101 * exceeding the Link Supervision Timeout. The
3102 * default Link Supervision Timeout for AMP
3103 * controllers is 10 seconds.
3104 *
3105 * Class 1 devices use 0xffffffff for their
3106 * best-effort flush timeout, so the clamping logic
3107 * will result in a timeout that meets the above
3108 * requirement. ERTM timeouts are 16-bit values, so
3109 * the maximum timeout is 65.535 seconds.
3110 */
3111
3112 /* Convert timeout to milliseconds and round */
3113 ertm_to = DIV_ROUND_UP_ULL(ertm_to, 1000);
3114
3115 /* This is the recommended formula for class 2 devices
3116 * that start ERTM timers when packets are sent to the
3117 * controller.
3118 */
3119 ertm_to = 3 * ertm_to + 500;
3120
3121 if (ertm_to > 0xffff)
3122 ertm_to = 0xffff;
3123
3124 rfc->retrans_timeout = cpu_to_le16((u16) ertm_to);
3125 rfc->monitor_timeout = rfc->retrans_timeout;
3126 } else {
3127 rfc->retrans_timeout = __constant_cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO);
3128 rfc->monitor_timeout = __constant_cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO);
3129 }
3130}
3131
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003132static inline void l2cap_txwin_setup(struct l2cap_chan *chan)
3133{
3134 if (chan->tx_win > L2CAP_DEFAULT_TX_WINDOW &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003135 __l2cap_ews_supported(chan)) {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003136 /* use extended control field */
3137 set_bit(FLAG_EXT_CTRL, &chan->flags);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003138 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
3139 } else {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003140 chan->tx_win = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003141 L2CAP_DEFAULT_TX_WINDOW);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003142 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
3143 }
Mat Martineauc20f8e32012-07-10 05:47:07 -07003144 chan->ack_win = chan->tx_win;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003145}
3146
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003147static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003148{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003149 struct l2cap_conf_req *req = data;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003150 struct l2cap_conf_rfc rfc = { .mode = chan->mode };
Linus Torvalds1da177e2005-04-16 15:20:36 -07003151 void *ptr = req->data;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003152 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003153
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03003154 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003155
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003156 if (chan->num_conf_req || chan->num_conf_rsp)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003157 goto done;
3158
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003159 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003160 case L2CAP_MODE_STREAMING:
3161 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003162 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state))
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003163 break;
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003164
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003165 if (__l2cap_efs_supported(chan))
3166 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3167
Gustavo F. Padovan2ba13ed2010-06-09 16:39:05 -03003168 /* fall through */
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003169 default:
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003170 chan->mode = l2cap_select_mode(rfc.mode, chan->conn->feat_mask);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003171 break;
3172 }
3173
3174done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003175 if (chan->imtu != L2CAP_DEFAULT_MTU)
3176 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovan7990681c2011-01-24 16:01:43 -02003177
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003178 switch (chan->mode) {
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003179 case L2CAP_MODE_BASIC:
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003180 if (!(chan->conn->feat_mask & L2CAP_FEAT_ERTM) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003181 !(chan->conn->feat_mask & L2CAP_FEAT_STREAMING))
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003182 break;
3183
Gustavo F. Padovan62547752010-06-08 20:05:31 -03003184 rfc.mode = L2CAP_MODE_BASIC;
3185 rfc.txwin_size = 0;
3186 rfc.max_transmit = 0;
3187 rfc.retrans_timeout = 0;
3188 rfc.monitor_timeout = 0;
3189 rfc.max_pdu_size = 0;
3190
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003191 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003192 (unsigned long) &rfc);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003193 break;
3194
3195 case L2CAP_MODE_ERTM:
3196 rfc.mode = L2CAP_MODE_ERTM;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003197 rfc.max_transmit = chan->max_tx;
Mat Martineau36c86c82012-10-23 15:24:20 -07003198
3199 __l2cap_set_ertm_timeouts(chan, &rfc);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003200
3201 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003202 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3203 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003204 rfc.max_pdu_size = cpu_to_le16(size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003205
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003206 l2cap_txwin_setup(chan);
3207
3208 rfc.txwin_size = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003209 L2CAP_DEFAULT_TX_WINDOW);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003210
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003211 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003212 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003213
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003214 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3215 l2cap_add_opt_efs(&ptr, chan);
3216
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003217 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3218 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003219 chan->tx_win);
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003220
3221 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3222 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003223 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003224 chan->fcs = L2CAP_FCS_NONE;
3225 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3226 chan->fcs);
3227 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003228 break;
3229
3230 case L2CAP_MODE_STREAMING:
Mat Martineau273759e2012-05-17 20:53:53 -07003231 l2cap_txwin_setup(chan);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003232 rfc.mode = L2CAP_MODE_STREAMING;
3233 rfc.txwin_size = 0;
3234 rfc.max_transmit = 0;
3235 rfc.retrans_timeout = 0;
3236 rfc.monitor_timeout = 0;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003237
3238 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003239 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3240 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003241 rfc.max_pdu_size = cpu_to_le16(size);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003242
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003243 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003244 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003245
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003246 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3247 l2cap_add_opt_efs(&ptr, chan);
3248
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003249 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3250 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003251 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003252 chan->fcs = L2CAP_FCS_NONE;
3253 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3254 chan->fcs);
3255 }
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003256 break;
3257 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003258
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003259 req->dcid = cpu_to_le16(chan->dcid);
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03003260 req->flags = __constant_cpu_to_le16(0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003261
3262 return ptr - data;
3263}
3264
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003265static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003266{
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003267 struct l2cap_conf_rsp *rsp = data;
3268 void *ptr = rsp->data;
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003269 void *req = chan->conf_req;
3270 int len = chan->conf_len;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003271 int type, hint, olen;
3272 unsigned long val;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003273 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003274 struct l2cap_conf_efs efs;
3275 u8 remote_efs = 0;
Marcel Holtmann861d6882007-10-20 13:37:06 +02003276 u16 mtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003277 u16 result = L2CAP_CONF_SUCCESS;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003278 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003279
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003280 BT_DBG("chan %p", chan);
Marcel Holtmann820ae1b2006-11-18 22:15:00 +01003281
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003282 while (len >= L2CAP_CONF_OPT_SIZE) {
3283 len -= l2cap_get_conf_opt(&req, &type, &olen, &val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003284
Gustavo F. Padovan589d2742009-04-20 01:31:07 -03003285 hint = type & L2CAP_CONF_HINT;
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07003286 type &= L2CAP_CONF_MASK;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003287
3288 switch (type) {
3289 case L2CAP_CONF_MTU:
Marcel Holtmann861d6882007-10-20 13:37:06 +02003290 mtu = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003291 break;
3292
3293 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003294 chan->flush_to = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003295 break;
3296
3297 case L2CAP_CONF_QOS:
3298 break;
3299
Marcel Holtmann6464f352007-10-20 13:39:51 +02003300 case L2CAP_CONF_RFC:
3301 if (olen == sizeof(rfc))
3302 memcpy(&rfc, (void *) val, olen);
3303 break;
3304
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003305 case L2CAP_CONF_FCS:
3306 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003307 set_bit(CONF_RECV_NO_FCS, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003308 break;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003309
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003310 case L2CAP_CONF_EFS:
3311 remote_efs = 1;
3312 if (olen == sizeof(efs))
3313 memcpy(&efs, (void *) val, olen);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003314 break;
3315
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003316 case L2CAP_CONF_EWS:
3317 if (!enable_hs)
3318 return -ECONNREFUSED;
3319
3320 set_bit(FLAG_EXT_CTRL, &chan->flags);
3321 set_bit(CONF_EWS_RECV, &chan->conf_state);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003322 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003323 chan->remote_tx_win = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003324 break;
3325
3326 default:
3327 if (hint)
3328 break;
3329
3330 result = L2CAP_CONF_UNKNOWN;
3331 *((u8 *) ptr++) = type;
3332 break;
3333 }
3334 }
3335
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003336 if (chan->num_conf_rsp || chan->num_conf_req > 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003337 goto done;
3338
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003339 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003340 case L2CAP_MODE_STREAMING:
3341 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003342 if (!test_bit(CONF_STATE2_DEVICE, &chan->conf_state)) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003343 chan->mode = l2cap_select_mode(rfc.mode,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003344 chan->conn->feat_mask);
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003345 break;
3346 }
3347
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003348 if (remote_efs) {
3349 if (__l2cap_efs_supported(chan))
3350 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3351 else
3352 return -ECONNREFUSED;
3353 }
3354
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003355 if (chan->mode != rfc.mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003356 return -ECONNREFUSED;
Gustavo F. Padovan742e5192010-06-08 19:09:48 -03003357
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003358 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003359 }
3360
3361done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003362 if (chan->mode != rfc.mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003363 result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003364 rfc.mode = chan->mode;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003365
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003366 if (chan->num_conf_rsp == 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003367 return -ECONNREFUSED;
3368
Gustavo Padovan2d792812012-10-06 10:07:01 +01003369 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3370 (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003371 }
3372
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003373 if (result == L2CAP_CONF_SUCCESS) {
3374 /* Configure output options and let the other side know
3375 * which ones we don't like. */
3376
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003377 if (mtu < L2CAP_DEFAULT_MIN_MTU)
3378 result = L2CAP_CONF_UNACCEPT;
3379 else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003380 chan->omtu = mtu;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003381 set_bit(CONF_MTU_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003382 }
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003383 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->omtu);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003384
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003385 if (remote_efs) {
3386 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003387 efs.stype != L2CAP_SERV_NOTRAFIC &&
3388 efs.stype != chan->local_stype) {
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003389
3390 result = L2CAP_CONF_UNACCEPT;
3391
3392 if (chan->num_conf_req >= 1)
3393 return -ECONNREFUSED;
3394
3395 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003396 sizeof(efs),
3397 (unsigned long) &efs);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003398 } else {
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003399 /* Send PENDING Conf Rsp */
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003400 result = L2CAP_CONF_PENDING;
3401 set_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003402 }
3403 }
3404
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003405 switch (rfc.mode) {
3406 case L2CAP_MODE_BASIC:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003407 chan->fcs = L2CAP_FCS_NONE;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003408 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003409 break;
3410
3411 case L2CAP_MODE_ERTM:
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003412 if (!test_bit(CONF_EWS_RECV, &chan->conf_state))
3413 chan->remote_tx_win = rfc.txwin_size;
3414 else
3415 rfc.txwin_size = L2CAP_DEFAULT_TX_WINDOW;
3416
Gustavo F. Padovan2c03a7a2011-03-25 20:15:28 -03003417 chan->remote_max_tx = rfc.max_transmit;
Mat Martineau86b1b262010-08-05 15:54:22 -07003418
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003419 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003420 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3421 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003422 rfc.max_pdu_size = cpu_to_le16(size);
3423 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003424
Mat Martineau36c86c82012-10-23 15:24:20 -07003425 __l2cap_set_ertm_timeouts(chan, &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003426
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003427 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003428
3429 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003430 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003431
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003432 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3433 chan->remote_id = efs.id;
3434 chan->remote_stype = efs.stype;
3435 chan->remote_msdu = le16_to_cpu(efs.msdu);
3436 chan->remote_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003437 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003438 chan->remote_acc_lat =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003439 le32_to_cpu(efs.acc_lat);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003440 chan->remote_sdu_itime =
3441 le32_to_cpu(efs.sdu_itime);
3442 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003443 sizeof(efs),
3444 (unsigned long) &efs);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003445 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003446 break;
3447
3448 case L2CAP_MODE_STREAMING:
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003449 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003450 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3451 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003452 rfc.max_pdu_size = cpu_to_le16(size);
3453 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003454
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003455 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003456
Gustavo Padovan2d792812012-10-06 10:07:01 +01003457 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3458 (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003459
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003460 break;
3461
3462 default:
Marcel Holtmann6464f352007-10-20 13:39:51 +02003463 result = L2CAP_CONF_UNACCEPT;
3464
3465 memset(&rfc, 0, sizeof(rfc));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003466 rfc.mode = chan->mode;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003467 }
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003468
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003469 if (result == L2CAP_CONF_SUCCESS)
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003470 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003471 }
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003472 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003473 rsp->result = cpu_to_le16(result);
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03003474 rsp->flags = __constant_cpu_to_le16(0);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003475
3476 return ptr - data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003477}
3478
Gustavo Padovan2d792812012-10-06 10:07:01 +01003479static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len,
3480 void *data, u16 *result)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003481{
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003482 struct l2cap_conf_req *req = data;
3483 void *ptr = req->data;
3484 int type, olen;
3485 unsigned long val;
Mat Martineau36e999a2011-12-08 17:23:21 -08003486 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003487 struct l2cap_conf_efs efs;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003488
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003489 BT_DBG("chan %p, rsp %p, len %d, req %p", chan, rsp, len, data);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003490
3491 while (len >= L2CAP_CONF_OPT_SIZE) {
3492 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3493
3494 switch (type) {
3495 case L2CAP_CONF_MTU:
3496 if (val < L2CAP_DEFAULT_MIN_MTU) {
3497 *result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003498 chan->imtu = L2CAP_DEFAULT_MIN_MTU;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003499 } else
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003500 chan->imtu = val;
3501 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003502 break;
3503
3504 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003505 chan->flush_to = val;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003506 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003507 2, chan->flush_to);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003508 break;
3509
3510 case L2CAP_CONF_RFC:
3511 if (olen == sizeof(rfc))
3512 memcpy(&rfc, (void *)val, olen);
3513
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003514 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003515 rfc.mode != chan->mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003516 return -ECONNREFUSED;
3517
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003518 chan->fcs = 0;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003519
3520 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003521 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003522 break;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003523
3524 case L2CAP_CONF_EWS:
Mat Martineauc20f8e32012-07-10 05:47:07 -07003525 chan->ack_win = min_t(u16, val, chan->ack_win);
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003526 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Mat Martineauc20f8e32012-07-10 05:47:07 -07003527 chan->tx_win);
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003528 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003529
3530 case L2CAP_CONF_EFS:
3531 if (olen == sizeof(efs))
3532 memcpy(&efs, (void *)val, olen);
3533
3534 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003535 efs.stype != L2CAP_SERV_NOTRAFIC &&
3536 efs.stype != chan->local_stype)
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003537 return -ECONNREFUSED;
3538
Gustavo Padovan2d792812012-10-06 10:07:01 +01003539 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS, sizeof(efs),
3540 (unsigned long) &efs);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003541 break;
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003542
3543 case L2CAP_CONF_FCS:
3544 if (*result == L2CAP_CONF_PENDING)
3545 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003546 set_bit(CONF_RECV_NO_FCS,
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003547 &chan->conf_state);
3548 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003549 }
3550 }
3551
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003552 if (chan->mode == L2CAP_MODE_BASIC && chan->mode != rfc.mode)
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003553 return -ECONNREFUSED;
3554
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003555 chan->mode = rfc.mode;
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003556
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003557 if (*result == L2CAP_CONF_SUCCESS || *result == L2CAP_CONF_PENDING) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003558 switch (rfc.mode) {
3559 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003560 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3561 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
3562 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003563 if (!test_bit(FLAG_EXT_CTRL, &chan->flags))
3564 chan->ack_win = min_t(u16, chan->ack_win,
3565 rfc.txwin_size);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003566
3567 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3568 chan->local_msdu = le16_to_cpu(efs.msdu);
3569 chan->local_sdu_itime =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003570 le32_to_cpu(efs.sdu_itime);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003571 chan->local_acc_lat = le32_to_cpu(efs.acc_lat);
3572 chan->local_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003573 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003574 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003575 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003576
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003577 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003578 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003579 }
3580 }
3581
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003582 req->dcid = cpu_to_le16(chan->dcid);
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03003583 req->flags = __constant_cpu_to_le16(0);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003584
3585 return ptr - data;
3586}
3587
Gustavo Padovan2d792812012-10-06 10:07:01 +01003588static int l2cap_build_conf_rsp(struct l2cap_chan *chan, void *data,
3589 u16 result, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003590{
3591 struct l2cap_conf_rsp *rsp = data;
3592 void *ptr = rsp->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003593
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003594 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003595
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003596 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003597 rsp->result = cpu_to_le16(result);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003598 rsp->flags = cpu_to_le16(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003599
3600 return ptr - data;
3601}
3602
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003603void __l2cap_connect_rsp_defer(struct l2cap_chan *chan)
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003604{
3605 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003606 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003607 u8 buf[128];
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003608 u8 rsp_code;
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003609
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003610 rsp.scid = cpu_to_le16(chan->dcid);
3611 rsp.dcid = cpu_to_le16(chan->scid);
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03003612 rsp.result = __constant_cpu_to_le16(L2CAP_CR_SUCCESS);
3613 rsp.status = __constant_cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003614
3615 if (chan->hs_hcon)
3616 rsp_code = L2CAP_CREATE_CHAN_RSP;
3617 else
3618 rsp_code = L2CAP_CONN_RSP;
3619
3620 BT_DBG("chan %p rsp_code %u", chan, rsp_code);
3621
3622 l2cap_send_cmd(conn, chan->ident, rsp_code, sizeof(rsp), &rsp);
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003623
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003624 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003625 return;
3626
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003627 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003628 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003629 chan->num_conf_req++;
3630}
3631
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003632static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len)
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003633{
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003634 int type, olen;
3635 unsigned long val;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003636 /* Use sane default values in case a misbehaving remote device
3637 * did not send an RFC or extended window size option.
3638 */
3639 u16 txwin_ext = chan->ack_win;
3640 struct l2cap_conf_rfc rfc = {
3641 .mode = chan->mode,
3642 .retrans_timeout = __constant_cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO),
3643 .monitor_timeout = __constant_cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO),
3644 .max_pdu_size = cpu_to_le16(chan->imtu),
3645 .txwin_size = min_t(u16, chan->ack_win, L2CAP_DEFAULT_TX_WINDOW),
3646 };
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003647
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003648 BT_DBG("chan %p, rsp %p, len %d", chan, rsp, len);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003649
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003650 if ((chan->mode != L2CAP_MODE_ERTM) && (chan->mode != L2CAP_MODE_STREAMING))
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003651 return;
3652
3653 while (len >= L2CAP_CONF_OPT_SIZE) {
3654 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3655
Mat Martineauc20f8e32012-07-10 05:47:07 -07003656 switch (type) {
3657 case L2CAP_CONF_RFC:
3658 if (olen == sizeof(rfc))
3659 memcpy(&rfc, (void *)val, olen);
Szymon Janc8f321f82012-06-08 11:33:33 +02003660 break;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003661 case L2CAP_CONF_EWS:
3662 txwin_ext = val;
3663 break;
3664 }
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003665 }
3666
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003667 switch (rfc.mode) {
3668 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003669 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3670 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003671 chan->mps = le16_to_cpu(rfc.max_pdu_size);
3672 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3673 chan->ack_win = min_t(u16, chan->ack_win, txwin_ext);
3674 else
3675 chan->ack_win = min_t(u16, chan->ack_win,
3676 rfc.txwin_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003677 break;
3678 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003679 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003680 }
3681}
3682
Gustavo Padovan2d792812012-10-06 10:07:01 +01003683static inline int l2cap_command_rej(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003684 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3685 u8 *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003686{
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003687 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003688
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003689 if (cmd_len < sizeof(*rej))
3690 return -EPROTO;
3691
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003692 if (rej->reason != L2CAP_REJ_NOT_UNDERSTOOD)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003693 return 0;
3694
3695 if ((conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003696 cmd->ident == conn->info_ident) {
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02003697 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann984947d2009-02-06 23:35:19 +01003698
3699 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01003700 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01003701
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003702 l2cap_conn_start(conn);
3703 }
3704
3705 return 0;
3706}
3707
Mat Martineau17009152012-10-23 15:24:07 -07003708static struct l2cap_chan *l2cap_connect(struct l2cap_conn *conn,
3709 struct l2cap_cmd_hdr *cmd,
3710 u8 *data, u8 rsp_code, u8 amp_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003711{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003712 struct l2cap_conn_req *req = (struct l2cap_conn_req *) data;
3713 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003714 struct l2cap_chan *chan = NULL, *pchan;
Nathan Holsteind793fe82010-10-15 11:54:02 -04003715 struct sock *parent, *sk = NULL;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003716 int result, status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003717
3718 u16 dcid = 0, scid = __le16_to_cpu(req->scid);
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003719 __le16 psm = req->psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003720
Andrei Emeltchenko097db762012-03-09 14:16:17 +02003721 BT_DBG("psm 0x%2.2x scid 0x%4.4x", __le16_to_cpu(psm), scid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003722
3723 /* Check if we have socket listening on psm */
Ido Yarivc2287682012-04-20 15:46:07 -03003724 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, conn->src, conn->dst);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003725 if (!pchan) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003726 result = L2CAP_CR_BAD_PSM;
3727 goto sendresp;
3728 }
3729
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003730 parent = pchan->sk;
3731
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003732 mutex_lock(&conn->chan_lock);
Gustavo F. Padovanaa2ac882011-06-24 01:53:01 -03003733 lock_sock(parent);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00003734
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003735 /* Check if the ACL is secure enough (if not SDP) */
Andrei Emeltchenko2983fd62012-05-24 15:42:50 +03003736 if (psm != __constant_cpu_to_le16(L2CAP_PSM_SDP) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003737 !hci_conn_check_link_mode(conn->hcon)) {
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02003738 conn->disc_reason = HCI_ERROR_AUTH_FAILURE;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003739 result = L2CAP_CR_SEC_BLOCK;
3740 goto response;
3741 }
3742
Linus Torvalds1da177e2005-04-16 15:20:36 -07003743 result = L2CAP_CR_NO_MEM;
3744
Gustavo Padovan2dfa1002012-05-27 22:27:58 -03003745 /* Check if we already have channel with that dcid */
3746 if (__l2cap_get_chan_by_dcid(conn, scid))
3747 goto response;
3748
Gustavo Padovan80b98022012-05-27 22:27:51 -03003749 chan = pchan->ops->new_connection(pchan);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03003750 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003751 goto response;
3752
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03003753 sk = chan->sk;
3754
Linus Torvalds1da177e2005-04-16 15:20:36 -07003755 hci_conn_hold(conn->hcon);
3756
Linus Torvalds1da177e2005-04-16 15:20:36 -07003757 bacpy(&bt_sk(sk)->src, conn->src);
3758 bacpy(&bt_sk(sk)->dst, conn->dst);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003759 chan->psm = psm;
3760 chan->dcid = scid;
Mat Martineau17009152012-10-23 15:24:07 -07003761 chan->local_amp_id = amp_id;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003762
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003763 __l2cap_chan_add(conn, chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003764
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003765 dcid = chan->scid;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003766
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -03003767 __set_chan_timer(chan, sk->sk_sndtimeo);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003768
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003769 chan->ident = cmd->ident;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003770
Marcel Holtmann984947d2009-02-06 23:35:19 +01003771 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) {
Gustavo F. Padovand45fc422011-11-05 19:54:24 -02003772 if (l2cap_chan_check_security(chan)) {
Gustavo Padovanc5daa682012-05-16 12:17:10 -03003773 if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) {
Andrei Emeltchenko0e587be2012-02-21 12:54:57 +02003774 __l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003775 result = L2CAP_CR_PEND;
3776 status = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08003777 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003778 } else {
Mat Martineau17009152012-10-23 15:24:07 -07003779 /* Force pending result for AMP controllers.
3780 * The connection will succeed after the
3781 * physical link is up.
3782 */
3783 if (amp_id) {
3784 __l2cap_state_change(chan, BT_CONNECT2);
3785 result = L2CAP_CR_PEND;
3786 } else {
3787 __l2cap_state_change(chan, BT_CONFIG);
3788 result = L2CAP_CR_SUCCESS;
3789 }
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003790 status = L2CAP_CS_NO_INFO;
3791 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003792 } else {
Andrei Emeltchenko0e587be2012-02-21 12:54:57 +02003793 __l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003794 result = L2CAP_CR_PEND;
3795 status = L2CAP_CS_AUTHEN_PEND;
3796 }
3797 } else {
Andrei Emeltchenko0e587be2012-02-21 12:54:57 +02003798 __l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003799 result = L2CAP_CR_PEND;
3800 status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003801 }
3802
Linus Torvalds1da177e2005-04-16 15:20:36 -07003803response:
Gustavo F. Padovanaa2ac882011-06-24 01:53:01 -03003804 release_sock(parent);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003805 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003806
3807sendresp:
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003808 rsp.scid = cpu_to_le16(scid);
3809 rsp.dcid = cpu_to_le16(dcid);
3810 rsp.result = cpu_to_le16(result);
3811 rsp.status = cpu_to_le16(status);
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003812 l2cap_send_cmd(conn, cmd->ident, rsp_code, sizeof(rsp), &rsp);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003813
3814 if (result == L2CAP_CR_PEND && status == L2CAP_CS_NO_INFO) {
3815 struct l2cap_info_req info;
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03003816 info.type = __constant_cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003817
3818 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
3819 conn->info_ident = l2cap_get_ident(conn);
3820
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08003821 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003822
Gustavo Padovan2d792812012-10-06 10:07:01 +01003823 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
3824 sizeof(info), &info);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003825 }
3826
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003827 if (chan && !test_bit(CONF_REQ_SENT, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003828 result == L2CAP_CR_SUCCESS) {
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003829 u8 buf[128];
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003830 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003831 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003832 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003833 chan->num_conf_req++;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003834 }
Mat Martineau17009152012-10-23 15:24:07 -07003835
3836 return chan;
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003837}
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003838
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003839static int l2cap_connect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003840 struct l2cap_cmd_hdr *cmd, u16 cmd_len, u8 *data)
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003841{
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303842 struct hci_dev *hdev = conn->hcon->hdev;
3843 struct hci_conn *hcon = conn->hcon;
3844
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003845 if (cmd_len < sizeof(struct l2cap_conn_req))
3846 return -EPROTO;
3847
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303848 hci_dev_lock(hdev);
3849 if (test_bit(HCI_MGMT, &hdev->dev_flags) &&
3850 !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &hcon->flags))
3851 mgmt_device_connected(hdev, &hcon->dst, hcon->type,
3852 hcon->dst_type, 0, NULL, 0,
3853 hcon->dev_class);
3854 hci_dev_unlock(hdev);
3855
Gustavo Padovan300229f2012-10-12 19:40:40 +08003856 l2cap_connect(conn, cmd, data, L2CAP_CONN_RSP, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003857 return 0;
3858}
3859
Mat Martineau5909cf32012-10-23 15:24:08 -07003860static int l2cap_connect_create_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003861 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3862 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003863{
3864 struct l2cap_conn_rsp *rsp = (struct l2cap_conn_rsp *) data;
3865 u16 scid, dcid, result, status;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003866 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003867 u8 req[128];
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003868 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003869
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003870 if (cmd_len < sizeof(*rsp))
3871 return -EPROTO;
3872
Linus Torvalds1da177e2005-04-16 15:20:36 -07003873 scid = __le16_to_cpu(rsp->scid);
3874 dcid = __le16_to_cpu(rsp->dcid);
3875 result = __le16_to_cpu(rsp->result);
3876 status = __le16_to_cpu(rsp->status);
3877
Andrei Emeltchenko1b009c92012-02-21 12:54:54 +02003878 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 +01003879 dcid, scid, result, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003880
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003881 mutex_lock(&conn->chan_lock);
3882
Linus Torvalds1da177e2005-04-16 15:20:36 -07003883 if (scid) {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003884 chan = __l2cap_get_chan_by_scid(conn, scid);
3885 if (!chan) {
3886 err = -EFAULT;
3887 goto unlock;
3888 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003889 } else {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003890 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
3891 if (!chan) {
3892 err = -EFAULT;
3893 goto unlock;
3894 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003895 }
3896
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003897 err = 0;
3898
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003899 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003900
Linus Torvalds1da177e2005-04-16 15:20:36 -07003901 switch (result) {
3902 case L2CAP_CR_SUCCESS:
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03003903 l2cap_state_change(chan, BT_CONFIG);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003904 chan->ident = 0;
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003905 chan->dcid = dcid;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003906 clear_bit(CONF_CONNECT_PEND, &chan->conf_state);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01003907
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003908 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003909 break;
3910
Linus Torvalds1da177e2005-04-16 15:20:36 -07003911 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003912 l2cap_build_conf_req(chan, req), req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003913 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003914 break;
3915
3916 case L2CAP_CR_PEND:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003917 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003918 break;
3919
3920 default:
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003921 l2cap_chan_del(chan, ECONNREFUSED);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003922 break;
3923 }
3924
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003925 l2cap_chan_unlock(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003926
3927unlock:
3928 mutex_unlock(&conn->chan_lock);
3929
3930 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003931}
3932
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003933static inline void set_default_fcs(struct l2cap_chan *chan)
Mat Martineau8c462b62010-08-24 15:35:42 -07003934{
3935 /* FCS is enabled only in ERTM or streaming mode, if one or both
3936 * sides request it.
3937 */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003938 if (chan->mode != L2CAP_MODE_ERTM && chan->mode != L2CAP_MODE_STREAMING)
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003939 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003940 else if (!test_bit(CONF_RECV_NO_FCS, &chan->conf_state))
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003941 chan->fcs = L2CAP_FCS_CRC16;
Mat Martineau8c462b62010-08-24 15:35:42 -07003942}
3943
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03003944static void l2cap_send_efs_conf_rsp(struct l2cap_chan *chan, void *data,
3945 u8 ident, u16 flags)
3946{
3947 struct l2cap_conn *conn = chan->conn;
3948
3949 BT_DBG("conn %p chan %p ident %d flags 0x%4.4x", conn, chan, ident,
3950 flags);
3951
3952 clear_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
3953 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
3954
3955 l2cap_send_cmd(conn, ident, L2CAP_CONF_RSP,
3956 l2cap_build_conf_rsp(chan, data,
3957 L2CAP_CONF_SUCCESS, flags), data);
3958}
3959
Gustavo Padovan2d792812012-10-06 10:07:01 +01003960static inline int l2cap_config_req(struct l2cap_conn *conn,
3961 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3962 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003963{
3964 struct l2cap_conf_req *req = (struct l2cap_conf_req *) data;
3965 u16 dcid, flags;
3966 u8 rsp[64];
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003967 struct l2cap_chan *chan;
Mat Martineau3c588192012-04-11 10:48:42 -07003968 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003969
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003970 if (cmd_len < sizeof(*req))
3971 return -EPROTO;
3972
Linus Torvalds1da177e2005-04-16 15:20:36 -07003973 dcid = __le16_to_cpu(req->dcid);
3974 flags = __le16_to_cpu(req->flags);
3975
3976 BT_DBG("dcid 0x%4.4x flags 0x%2.2x", dcid, flags);
3977
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03003978 chan = l2cap_get_chan_by_scid(conn, dcid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003979 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003980 return -ENOENT;
3981
David S. Miller033b1142011-07-21 13:38:42 -07003982 if (chan->state != BT_CONFIG && chan->state != BT_CONNECT2) {
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003983 struct l2cap_cmd_rej_cid rej;
Gustavo F. Padovandf6bd742010-06-14 02:26:15 -03003984
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03003985 rej.reason = __constant_cpu_to_le16(L2CAP_REJ_INVALID_CID);
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003986 rej.scid = cpu_to_le16(chan->scid);
3987 rej.dcid = cpu_to_le16(chan->dcid);
3988
Gustavo F. Padovandf6bd742010-06-14 02:26:15 -03003989 l2cap_send_cmd(conn, cmd->ident, L2CAP_COMMAND_REJ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003990 sizeof(rej), &rej);
Marcel Holtmann354f60a2006-11-18 22:15:20 +01003991 goto unlock;
Gustavo F. Padovandf6bd742010-06-14 02:26:15 -03003992 }
Marcel Holtmann354f60a2006-11-18 22:15:20 +01003993
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003994 /* Reject if config buffer is too small. */
Al Viro88219a02007-07-29 00:17:25 -07003995 len = cmd_len - sizeof(*req);
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003996 if (chan->conf_len + len > sizeof(chan->conf_req)) {
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003997 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003998 l2cap_build_conf_rsp(chan, rsp,
3999 L2CAP_CONF_REJECT, flags), rsp);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004000 goto unlock;
4001 }
4002
4003 /* Store config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004004 memcpy(chan->conf_req + chan->conf_len, req->data, len);
4005 chan->conf_len += len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004006
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004007 if (flags & L2CAP_CONF_FLAG_CONTINUATION) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004008 /* Incomplete config. Send empty response. */
4009 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004010 l2cap_build_conf_rsp(chan, rsp,
4011 L2CAP_CONF_SUCCESS, flags), rsp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004012 goto unlock;
4013 }
4014
4015 /* Complete config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004016 len = l2cap_parse_conf_req(chan, rsp);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004017 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004018 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004019 goto unlock;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004020 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004021
Mat Martineau1500109b2012-10-23 15:24:15 -07004022 chan->ident = cmd->ident;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004023 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004024 chan->num_conf_rsp++;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004025
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004026 /* Reset config buffer. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004027 chan->conf_len = 0;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004028
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004029 if (!test_bit(CONF_OUTPUT_DONE, &chan->conf_state))
Marcel Holtmann876d9482007-10-20 13:35:42 +02004030 goto unlock;
4031
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004032 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004033 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004034
Mat Martineau105bdf92012-04-27 16:50:48 -07004035 if (chan->mode == L2CAP_MODE_ERTM ||
4036 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004037 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004038
Mat Martineau3c588192012-04-11 10:48:42 -07004039 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004040 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004041 else
4042 l2cap_chan_ready(chan);
4043
Marcel Holtmann876d9482007-10-20 13:35:42 +02004044 goto unlock;
4045 }
4046
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004047 if (!test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02004048 u8 buf[64];
Linus Torvalds1da177e2005-04-16 15:20:36 -07004049 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004050 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004051 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004052 }
4053
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004054 /* Got Conf Rsp PENDING from remote side and asume we sent
4055 Conf Rsp PENDING in the code above */
4056 if (test_bit(CONF_REM_CONF_PEND, &chan->conf_state) &&
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03004057 test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004058
4059 /* check compatibility */
4060
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004061 /* Send rsp for BR/EDR channel */
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004062 if (!chan->hs_hcon)
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004063 l2cap_send_efs_conf_rsp(chan, rsp, cmd->ident, flags);
4064 else
4065 chan->ident = cmd->ident;
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004066 }
4067
Linus Torvalds1da177e2005-04-16 15:20:36 -07004068unlock:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004069 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004070 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004071}
4072
Gustavo Padovan2d792812012-10-06 10:07:01 +01004073static inline int l2cap_config_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004074 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4075 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004076{
4077 struct l2cap_conf_rsp *rsp = (struct l2cap_conf_rsp *)data;
4078 u16 scid, flags, result;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004079 struct l2cap_chan *chan;
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004080 int len = cmd_len - sizeof(*rsp);
Mat Martineau3c588192012-04-11 10:48:42 -07004081 int err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004082
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004083 if (cmd_len < sizeof(*rsp))
4084 return -EPROTO;
4085
Linus Torvalds1da177e2005-04-16 15:20:36 -07004086 scid = __le16_to_cpu(rsp->scid);
4087 flags = __le16_to_cpu(rsp->flags);
4088 result = __le16_to_cpu(rsp->result);
4089
Andrei Emeltchenko61386cb2012-03-12 12:13:07 +02004090 BT_DBG("scid 0x%4.4x flags 0x%2.2x result 0x%2.2x len %d", scid, flags,
4091 result, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004092
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004093 chan = l2cap_get_chan_by_scid(conn, scid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004094 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004095 return 0;
4096
4097 switch (result) {
4098 case L2CAP_CONF_SUCCESS:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004099 l2cap_conf_rfc_get(chan, rsp->data, len);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004100 clear_bit(CONF_REM_CONF_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004101 break;
4102
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004103 case L2CAP_CONF_PENDING:
4104 set_bit(CONF_REM_CONF_PEND, &chan->conf_state);
4105
4106 if (test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
4107 char buf[64];
4108
4109 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004110 buf, &result);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004111 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004112 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004113 goto done;
4114 }
4115
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004116 if (!chan->hs_hcon) {
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004117 l2cap_send_efs_conf_rsp(chan, buf, cmd->ident,
4118 0);
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02004119 } else {
4120 if (l2cap_check_efs(chan)) {
4121 amp_create_logical_link(chan);
4122 chan->ident = cmd->ident;
4123 }
4124 }
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004125 }
4126 goto done;
4127
Linus Torvalds1da177e2005-04-16 15:20:36 -07004128 case L2CAP_CONF_UNACCEPT:
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004129 if (chan->num_conf_rsp <= L2CAP_CONF_MAX_CONF_RSP) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004130 char req[64];
4131
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004132 if (len > sizeof(req) - sizeof(struct l2cap_conf_req)) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004133 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004134 goto done;
4135 }
4136
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004137 /* throw out any old stored conf requests */
4138 result = L2CAP_CONF_SUCCESS;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03004139 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004140 req, &result);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004141 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004142 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004143 goto done;
4144 }
4145
4146 l2cap_send_cmd(conn, l2cap_get_ident(conn),
Gustavo Padovan2d792812012-10-06 10:07:01 +01004147 L2CAP_CONF_REQ, len, req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004148 chan->num_conf_req++;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004149 if (result != L2CAP_CONF_SUCCESS)
4150 goto done;
4151 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004152 }
4153
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09004154 default:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004155 l2cap_chan_set_err(chan, ECONNRESET);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +02004156
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08004157 __set_chan_timer(chan, L2CAP_DISC_REJ_TIMEOUT);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004158 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004159 goto done;
4160 }
4161
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004162 if (flags & L2CAP_CONF_FLAG_CONTINUATION)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004163 goto done;
4164
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004165 set_bit(CONF_INPUT_DONE, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004166
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004167 if (test_bit(CONF_OUTPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004168 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004169
Mat Martineau105bdf92012-04-27 16:50:48 -07004170 if (chan->mode == L2CAP_MODE_ERTM ||
4171 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004172 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004173
Mat Martineau3c588192012-04-11 10:48:42 -07004174 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004175 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004176 else
4177 l2cap_chan_ready(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004178 }
4179
4180done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004181 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004182 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004183}
4184
Gustavo Padovan2d792812012-10-06 10:07:01 +01004185static inline int l2cap_disconnect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004186 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4187 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004188{
4189 struct l2cap_disconn_req *req = (struct l2cap_disconn_req *) data;
4190 struct l2cap_disconn_rsp rsp;
4191 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004192 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004193 struct sock *sk;
4194
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004195 if (cmd_len != sizeof(*req))
4196 return -EPROTO;
4197
Linus Torvalds1da177e2005-04-16 15:20:36 -07004198 scid = __le16_to_cpu(req->scid);
4199 dcid = __le16_to_cpu(req->dcid);
4200
4201 BT_DBG("scid 0x%4.4x dcid 0x%4.4x", scid, dcid);
4202
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004203 mutex_lock(&conn->chan_lock);
4204
4205 chan = __l2cap_get_chan_by_scid(conn, dcid);
4206 if (!chan) {
4207 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004208 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004209 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004210
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004211 l2cap_chan_lock(chan);
4212
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004213 sk = chan->sk;
4214
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03004215 rsp.dcid = cpu_to_le16(chan->scid);
4216 rsp.scid = cpu_to_le16(chan->dcid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004217 l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp);
4218
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004219 lock_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004220 sk->sk_shutdown = SHUTDOWN_MASK;
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004221 release_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004222
Mat Martineau61d6ef32012-04-27 16:50:50 -07004223 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004224 l2cap_chan_del(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004225
4226 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004227
Gustavo Padovan80b98022012-05-27 22:27:51 -03004228 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004229 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004230
4231 mutex_unlock(&conn->chan_lock);
4232
Linus Torvalds1da177e2005-04-16 15:20:36 -07004233 return 0;
4234}
4235
Gustavo Padovan2d792812012-10-06 10:07:01 +01004236static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004237 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4238 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004239{
4240 struct l2cap_disconn_rsp *rsp = (struct l2cap_disconn_rsp *) data;
4241 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004242 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004243
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004244 if (cmd_len != sizeof(*rsp))
4245 return -EPROTO;
4246
Linus Torvalds1da177e2005-04-16 15:20:36 -07004247 scid = __le16_to_cpu(rsp->scid);
4248 dcid = __le16_to_cpu(rsp->dcid);
4249
4250 BT_DBG("dcid 0x%4.4x scid 0x%4.4x", dcid, scid);
4251
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004252 mutex_lock(&conn->chan_lock);
4253
4254 chan = __l2cap_get_chan_by_scid(conn, scid);
4255 if (!chan) {
4256 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004257 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004258 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004259
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004260 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004261
Mat Martineau61d6ef32012-04-27 16:50:50 -07004262 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004263 l2cap_chan_del(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004264
4265 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004266
Gustavo Padovan80b98022012-05-27 22:27:51 -03004267 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004268 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004269
4270 mutex_unlock(&conn->chan_lock);
4271
Linus Torvalds1da177e2005-04-16 15:20:36 -07004272 return 0;
4273}
4274
Gustavo Padovan2d792812012-10-06 10:07:01 +01004275static inline int l2cap_information_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004276 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4277 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004278{
4279 struct l2cap_info_req *req = (struct l2cap_info_req *) data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004280 u16 type;
4281
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004282 if (cmd_len != sizeof(*req))
4283 return -EPROTO;
4284
Linus Torvalds1da177e2005-04-16 15:20:36 -07004285 type = __le16_to_cpu(req->type);
4286
4287 BT_DBG("type 0x%4.4x", type);
4288
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004289 if (type == L2CAP_IT_FEAT_MASK) {
4290 u8 buf[8];
Marcel Holtmann44dd46d2009-05-02 19:09:01 -07004291 u32 feat_mask = l2cap_feat_mask;
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004292 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03004293 rsp->type = __constant_cpu_to_le16(L2CAP_IT_FEAT_MASK);
4294 rsp->result = __constant_cpu_to_le16(L2CAP_IR_SUCCESS);
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03004295 if (!disable_ertm)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004296 feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING
Gustavo Padovan2d792812012-10-06 10:07:01 +01004297 | L2CAP_FEAT_FCS;
Andrei Emeltchenkoa5fd6f32011-09-16 16:26:32 +03004298 if (enable_hs)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03004299 feat_mask |= L2CAP_FEAT_EXT_FLOW
Gustavo Padovan2d792812012-10-06 10:07:01 +01004300 | L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenkoa5fd6f32011-09-16 16:26:32 +03004301
Gustavo F. Padovan1b7bf4e2009-08-24 00:45:20 -03004302 put_unaligned_le32(feat_mask, rsp->data);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004303 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4304 buf);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004305 } else if (type == L2CAP_IT_FIXED_CHAN) {
4306 u8 buf[12];
4307 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Mat Martineau50a147c2011-11-02 16:18:34 -07004308
4309 if (enable_hs)
4310 l2cap_fixed_chan[0] |= L2CAP_FC_A2MP;
4311 else
4312 l2cap_fixed_chan[0] &= ~L2CAP_FC_A2MP;
4313
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03004314 rsp->type = __constant_cpu_to_le16(L2CAP_IT_FIXED_CHAN);
4315 rsp->result = __constant_cpu_to_le16(L2CAP_IR_SUCCESS);
Andrei Emeltchenkoc6337ea2011-10-20 17:02:44 +03004316 memcpy(rsp->data, l2cap_fixed_chan, sizeof(l2cap_fixed_chan));
Gustavo Padovan2d792812012-10-06 10:07:01 +01004317 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4318 buf);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004319 } else {
4320 struct l2cap_info_rsp rsp;
4321 rsp.type = cpu_to_le16(type);
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03004322 rsp.result = __constant_cpu_to_le16(L2CAP_IR_NOTSUPP);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004323 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(rsp),
4324 &rsp);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004325 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004326
4327 return 0;
4328}
4329
Gustavo Padovan2d792812012-10-06 10:07:01 +01004330static inline int l2cap_information_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004331 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4332 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004333{
4334 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) data;
4335 u16 type, result;
4336
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004337 if (cmd_len != sizeof(*rsp))
4338 return -EPROTO;
4339
Linus Torvalds1da177e2005-04-16 15:20:36 -07004340 type = __le16_to_cpu(rsp->type);
4341 result = __le16_to_cpu(rsp->result);
4342
4343 BT_DBG("type 0x%4.4x result 0x%2.2x", type, result);
4344
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004345 /* L2CAP Info req/rsp are unbound to channels, add extra checks */
4346 if (cmd->ident != conn->info_ident ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01004347 conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004348 return 0;
4349
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02004350 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004351
Ville Tervoadb08ed2010-08-04 09:43:33 +03004352 if (result != L2CAP_IR_SUCCESS) {
4353 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4354 conn->info_ident = 0;
4355
4356 l2cap_conn_start(conn);
4357
4358 return 0;
4359 }
4360
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004361 switch (type) {
4362 case L2CAP_IT_FEAT_MASK:
Harvey Harrison83985312008-05-02 16:25:46 -07004363 conn->feat_mask = get_unaligned_le32(rsp->data);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004364
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07004365 if (conn->feat_mask & L2CAP_FEAT_FIXED_CHAN) {
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004366 struct l2cap_info_req req;
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03004367 req.type = __constant_cpu_to_le16(L2CAP_IT_FIXED_CHAN);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004368
4369 conn->info_ident = l2cap_get_ident(conn);
4370
4371 l2cap_send_cmd(conn, conn->info_ident,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004372 L2CAP_INFO_REQ, sizeof(req), &req);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004373 } else {
4374 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4375 conn->info_ident = 0;
4376
4377 l2cap_conn_start(conn);
4378 }
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004379 break;
4380
4381 case L2CAP_IT_FIXED_CHAN:
4382 conn->fixed_chan_mask = rsp->data[0];
Marcel Holtmann984947d2009-02-06 23:35:19 +01004383 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004384 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004385
4386 l2cap_conn_start(conn);
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004387 break;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004388 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004389
Linus Torvalds1da177e2005-04-16 15:20:36 -07004390 return 0;
4391}
4392
Mat Martineau17009152012-10-23 15:24:07 -07004393static int l2cap_create_channel_req(struct l2cap_conn *conn,
4394 struct l2cap_cmd_hdr *cmd,
4395 u16 cmd_len, void *data)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004396{
4397 struct l2cap_create_chan_req *req = data;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004398 struct l2cap_create_chan_rsp rsp;
Mat Martineau17009152012-10-23 15:24:07 -07004399 struct l2cap_chan *chan;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004400 struct hci_dev *hdev;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004401 u16 psm, scid;
4402
4403 if (cmd_len != sizeof(*req))
4404 return -EPROTO;
4405
4406 if (!enable_hs)
4407 return -EINVAL;
4408
4409 psm = le16_to_cpu(req->psm);
4410 scid = le16_to_cpu(req->scid);
4411
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004412 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 -07004413
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004414 /* For controller id 0 make BR/EDR connection */
4415 if (req->amp_id == HCI_BREDR_ID) {
4416 l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4417 req->amp_id);
4418 return 0;
4419 }
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004420
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004421 /* Validate AMP controller id */
4422 hdev = hci_dev_get(req->amp_id);
4423 if (!hdev)
4424 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004425
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004426 if (hdev->dev_type != HCI_AMP || !test_bit(HCI_UP, &hdev->flags)) {
Mat Martineau17009152012-10-23 15:24:07 -07004427 hci_dev_put(hdev);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004428 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004429 }
4430
4431 chan = l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4432 req->amp_id);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004433 if (chan) {
4434 struct amp_mgr *mgr = conn->hcon->amp_mgr;
4435 struct hci_conn *hs_hcon;
4436
4437 hs_hcon = hci_conn_hash_lookup_ba(hdev, AMP_LINK, conn->dst);
4438 if (!hs_hcon) {
4439 hci_dev_put(hdev);
4440 return -EFAULT;
4441 }
4442
4443 BT_DBG("mgr %p bredr_chan %p hs_hcon %p", mgr, chan, hs_hcon);
4444
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004445 mgr->bredr_chan = chan;
4446 chan->hs_hcon = hs_hcon;
Andrei Emeltchenkofd45bf42012-11-20 17:16:22 +02004447 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004448 conn->mtu = hdev->block_mtu;
4449 }
4450
4451 hci_dev_put(hdev);
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004452
4453 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004454
4455error:
4456 rsp.dcid = 0;
4457 rsp.scid = cpu_to_le16(scid);
4458 rsp.result = __constant_cpu_to_le16(L2CAP_CR_BAD_AMP);
4459 rsp.status = __constant_cpu_to_le16(L2CAP_CS_NO_INFO);
4460
4461 l2cap_send_cmd(conn, cmd->ident, L2CAP_CREATE_CHAN_RSP,
4462 sizeof(rsp), &rsp);
4463
4464 return -EFAULT;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004465}
4466
Mat Martineau8eb200b2012-10-23 15:24:17 -07004467static void l2cap_send_move_chan_req(struct l2cap_chan *chan, u8 dest_amp_id)
4468{
4469 struct l2cap_move_chan_req req;
4470 u8 ident;
4471
4472 BT_DBG("chan %p, dest_amp_id %d", chan, dest_amp_id);
4473
4474 ident = l2cap_get_ident(chan->conn);
4475 chan->ident = ident;
4476
4477 req.icid = cpu_to_le16(chan->scid);
4478 req.dest_amp_id = dest_amp_id;
4479
4480 l2cap_send_cmd(chan->conn, ident, L2CAP_MOVE_CHAN_REQ, sizeof(req),
4481 &req);
4482
4483 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4484}
4485
Mat Martineau1500109b2012-10-23 15:24:15 -07004486static void l2cap_send_move_chan_rsp(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004487{
4488 struct l2cap_move_chan_rsp rsp;
4489
Mat Martineau1500109b2012-10-23 15:24:15 -07004490 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004491
Mat Martineau1500109b2012-10-23 15:24:15 -07004492 rsp.icid = cpu_to_le16(chan->dcid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004493 rsp.result = cpu_to_le16(result);
4494
Mat Martineau1500109b2012-10-23 15:24:15 -07004495 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_RSP,
4496 sizeof(rsp), &rsp);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004497}
4498
Mat Martineau5b155ef2012-10-23 15:24:14 -07004499static void l2cap_send_move_chan_cfm(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004500{
4501 struct l2cap_move_chan_cfm cfm;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004502
Mat Martineau5b155ef2012-10-23 15:24:14 -07004503 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004504
Mat Martineau5b155ef2012-10-23 15:24:14 -07004505 chan->ident = l2cap_get_ident(chan->conn);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004506
Mat Martineau5b155ef2012-10-23 15:24:14 -07004507 cfm.icid = cpu_to_le16(chan->scid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004508 cfm.result = cpu_to_le16(result);
4509
Mat Martineau5b155ef2012-10-23 15:24:14 -07004510 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_CFM,
4511 sizeof(cfm), &cfm);
4512
4513 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4514}
4515
4516static void l2cap_send_move_chan_cfm_icid(struct l2cap_conn *conn, u16 icid)
4517{
4518 struct l2cap_move_chan_cfm cfm;
4519
4520 BT_DBG("conn %p, icid 0x%4.4x", conn, icid);
4521
4522 cfm.icid = cpu_to_le16(icid);
4523 cfm.result = __constant_cpu_to_le16(L2CAP_MC_UNCONFIRMED);
4524
4525 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_MOVE_CHAN_CFM,
4526 sizeof(cfm), &cfm);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004527}
4528
4529static void l2cap_send_move_chan_cfm_rsp(struct l2cap_conn *conn, u8 ident,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004530 u16 icid)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004531{
4532 struct l2cap_move_chan_cfm_rsp rsp;
4533
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004534 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004535
4536 rsp.icid = cpu_to_le16(icid);
4537 l2cap_send_cmd(conn, ident, L2CAP_MOVE_CHAN_CFM_RSP, sizeof(rsp), &rsp);
4538}
4539
Mat Martineau5f3847a2012-10-23 15:24:12 -07004540static void __release_logical_link(struct l2cap_chan *chan)
4541{
4542 chan->hs_hchan = NULL;
4543 chan->hs_hcon = NULL;
4544
4545 /* Placeholder - release the logical link */
4546}
4547
Mat Martineau1500109b2012-10-23 15:24:15 -07004548static void l2cap_logical_fail(struct l2cap_chan *chan)
4549{
4550 /* Logical link setup failed */
4551 if (chan->state != BT_CONNECTED) {
4552 /* Create channel failure, disconnect */
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004553 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineau1500109b2012-10-23 15:24:15 -07004554 return;
4555 }
4556
4557 switch (chan->move_role) {
4558 case L2CAP_MOVE_ROLE_RESPONDER:
4559 l2cap_move_done(chan);
4560 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_SUPP);
4561 break;
4562 case L2CAP_MOVE_ROLE_INITIATOR:
4563 if (chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_COMP ||
4564 chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_CFM) {
4565 /* Remote has only sent pending or
4566 * success responses, clean up
4567 */
4568 l2cap_move_done(chan);
4569 }
4570
4571 /* Other amp move states imply that the move
4572 * has already aborted
4573 */
4574 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
4575 break;
4576 }
4577}
4578
4579static void l2cap_logical_finish_create(struct l2cap_chan *chan,
4580 struct hci_chan *hchan)
4581{
4582 struct l2cap_conf_rsp rsp;
Mat Martineau1500109b2012-10-23 15:24:15 -07004583
Andrei Emeltchenko336178a2012-10-31 15:46:27 +02004584 chan->hs_hchan = hchan;
Mat Martineau1500109b2012-10-23 15:24:15 -07004585 chan->hs_hcon->l2cap_data = chan->conn;
4586
Andrei Emeltchenko35ba9562012-10-25 15:20:43 +03004587 l2cap_send_efs_conf_rsp(chan, &rsp, chan->ident, 0);
Mat Martineau1500109b2012-10-23 15:24:15 -07004588
4589 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Andrei Emeltchenkofe79c6f2012-10-25 15:20:42 +03004590 int err;
Mat Martineau1500109b2012-10-23 15:24:15 -07004591
4592 set_default_fcs(chan);
4593
4594 err = l2cap_ertm_init(chan);
4595 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004596 l2cap_send_disconn_req(chan, -err);
Mat Martineau1500109b2012-10-23 15:24:15 -07004597 else
4598 l2cap_chan_ready(chan);
4599 }
4600}
4601
4602static void l2cap_logical_finish_move(struct l2cap_chan *chan,
4603 struct hci_chan *hchan)
4604{
4605 chan->hs_hcon = hchan->conn;
4606 chan->hs_hcon->l2cap_data = chan->conn;
4607
4608 BT_DBG("move_state %d", chan->move_state);
4609
4610 switch (chan->move_state) {
4611 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
4612 /* Move confirm will be sent after a success
4613 * response is received
4614 */
4615 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4616 break;
4617 case L2CAP_MOVE_WAIT_LOGICAL_CFM:
4618 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4619 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4620 } else if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
4621 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
4622 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
4623 } else if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4624 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4625 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4626 }
4627 break;
4628 default:
4629 /* Move was not in expected state, free the channel */
4630 __release_logical_link(chan);
4631
4632 chan->move_state = L2CAP_MOVE_STABLE;
4633 }
4634}
4635
4636/* Call with chan locked */
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004637void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan,
4638 u8 status)
Mat Martineau5b155ef2012-10-23 15:24:14 -07004639{
Mat Martineau1500109b2012-10-23 15:24:15 -07004640 BT_DBG("chan %p, hchan %p, status %d", chan, hchan, status);
4641
4642 if (status) {
4643 l2cap_logical_fail(chan);
4644 __release_logical_link(chan);
4645 return;
4646 }
4647
4648 if (chan->state != BT_CONNECTED) {
4649 /* Ignore logical link if channel is on BR/EDR */
4650 if (chan->local_amp_id)
4651 l2cap_logical_finish_create(chan, hchan);
4652 } else {
4653 l2cap_logical_finish_move(chan, hchan);
4654 }
Mat Martineau5b155ef2012-10-23 15:24:14 -07004655}
4656
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004657void l2cap_move_start(struct l2cap_chan *chan)
4658{
4659 BT_DBG("chan %p", chan);
4660
4661 if (chan->local_amp_id == HCI_BREDR_ID) {
4662 if (chan->chan_policy != BT_CHANNEL_POLICY_AMP_PREFERRED)
4663 return;
4664 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4665 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4666 /* Placeholder - start physical link setup */
4667 } else {
4668 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4669 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4670 chan->move_id = 0;
4671 l2cap_move_setup(chan);
4672 l2cap_send_move_chan_req(chan, 0);
4673 }
4674}
4675
Mat Martineau8eb200b2012-10-23 15:24:17 -07004676static void l2cap_do_create(struct l2cap_chan *chan, int result,
4677 u8 local_amp_id, u8 remote_amp_id)
4678{
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004679 BT_DBG("chan %p state %s %u -> %u", chan, state_to_string(chan->state),
4680 local_amp_id, remote_amp_id);
4681
Andrei Emeltchenko12d6cc62012-11-14 17:39:31 +02004682 chan->fcs = L2CAP_FCS_NONE;
4683
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004684 /* Outgoing channel on AMP */
4685 if (chan->state == BT_CONNECT) {
4686 if (result == L2CAP_CR_SUCCESS) {
4687 chan->local_amp_id = local_amp_id;
4688 l2cap_send_create_chan_req(chan, remote_amp_id);
4689 } else {
4690 /* Revert to BR/EDR connect */
4691 l2cap_send_conn_req(chan);
4692 }
4693
4694 return;
4695 }
4696
4697 /* Incoming channel on AMP */
4698 if (__l2cap_no_conn_pending(chan)) {
Mat Martineau8eb200b2012-10-23 15:24:17 -07004699 struct l2cap_conn_rsp rsp;
4700 char buf[128];
4701 rsp.scid = cpu_to_le16(chan->dcid);
4702 rsp.dcid = cpu_to_le16(chan->scid);
4703
Mat Martineau8eb200b2012-10-23 15:24:17 -07004704 if (result == L2CAP_CR_SUCCESS) {
4705 /* Send successful response */
Andrei Emeltchenko62cd50e2012-11-14 17:39:32 +02004706 rsp.result = __constant_cpu_to_le16(L2CAP_CR_SUCCESS);
4707 rsp.status = __constant_cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004708 } else {
4709 /* Send negative response */
Andrei Emeltchenko62cd50e2012-11-14 17:39:32 +02004710 rsp.result = __constant_cpu_to_le16(L2CAP_CR_NO_MEM);
4711 rsp.status = __constant_cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004712 }
4713
4714 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_RSP,
4715 sizeof(rsp), &rsp);
4716
4717 if (result == L2CAP_CR_SUCCESS) {
4718 __l2cap_state_change(chan, BT_CONFIG);
4719 set_bit(CONF_REQ_SENT, &chan->conf_state);
4720 l2cap_send_cmd(chan->conn, l2cap_get_ident(chan->conn),
4721 L2CAP_CONF_REQ,
4722 l2cap_build_conf_req(chan, buf), buf);
4723 chan->num_conf_req++;
4724 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004725 }
4726}
4727
4728static void l2cap_do_move_initiate(struct l2cap_chan *chan, u8 local_amp_id,
4729 u8 remote_amp_id)
4730{
4731 l2cap_move_setup(chan);
4732 chan->move_id = local_amp_id;
4733 chan->move_state = L2CAP_MOVE_WAIT_RSP;
4734
4735 l2cap_send_move_chan_req(chan, remote_amp_id);
4736}
4737
4738static void l2cap_do_move_respond(struct l2cap_chan *chan, int result)
4739{
4740 struct hci_chan *hchan = NULL;
4741
4742 /* Placeholder - get hci_chan for logical link */
4743
4744 if (hchan) {
4745 if (hchan->state == BT_CONNECTED) {
4746 /* Logical link is ready to go */
4747 chan->hs_hcon = hchan->conn;
4748 chan->hs_hcon->l2cap_data = chan->conn;
4749 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4750 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4751
4752 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
4753 } else {
4754 /* Wait for logical link to be ready */
4755 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4756 }
4757 } else {
4758 /* Logical link not available */
4759 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_ALLOWED);
4760 }
4761}
4762
4763static void l2cap_do_move_cancel(struct l2cap_chan *chan, int result)
4764{
4765 if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4766 u8 rsp_result;
4767 if (result == -EINVAL)
4768 rsp_result = L2CAP_MR_BAD_ID;
4769 else
4770 rsp_result = L2CAP_MR_NOT_ALLOWED;
4771
4772 l2cap_send_move_chan_rsp(chan, rsp_result);
4773 }
4774
4775 chan->move_role = L2CAP_MOVE_ROLE_NONE;
4776 chan->move_state = L2CAP_MOVE_STABLE;
4777
4778 /* Restart data transmission */
4779 l2cap_ertm_send(chan);
4780}
4781
Andrei Emeltchenkoa514b172012-11-14 17:39:30 +02004782/* Invoke with locked chan */
4783void __l2cap_physical_cfm(struct l2cap_chan *chan, int result)
Mat Martineau8eb200b2012-10-23 15:24:17 -07004784{
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004785 u8 local_amp_id = chan->local_amp_id;
Andrei Emeltchenkofffadc02012-11-01 15:37:03 +02004786 u8 remote_amp_id = chan->remote_amp_id;
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004787
Mat Martineau8eb200b2012-10-23 15:24:17 -07004788 BT_DBG("chan %p, result %d, local_amp_id %d, remote_amp_id %d",
4789 chan, result, local_amp_id, remote_amp_id);
4790
Mat Martineau8eb200b2012-10-23 15:24:17 -07004791 if (chan->state == BT_DISCONN || chan->state == BT_CLOSED) {
4792 l2cap_chan_unlock(chan);
4793 return;
4794 }
4795
4796 if (chan->state != BT_CONNECTED) {
4797 l2cap_do_create(chan, result, local_amp_id, remote_amp_id);
4798 } else if (result != L2CAP_MR_SUCCESS) {
4799 l2cap_do_move_cancel(chan, result);
4800 } else {
4801 switch (chan->move_role) {
4802 case L2CAP_MOVE_ROLE_INITIATOR:
4803 l2cap_do_move_initiate(chan, local_amp_id,
4804 remote_amp_id);
4805 break;
4806 case L2CAP_MOVE_ROLE_RESPONDER:
4807 l2cap_do_move_respond(chan, result);
4808 break;
4809 default:
4810 l2cap_do_move_cancel(chan, result);
4811 break;
4812 }
4813 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004814}
4815
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004816static inline int l2cap_move_channel_req(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004817 struct l2cap_cmd_hdr *cmd,
4818 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004819{
4820 struct l2cap_move_chan_req *req = data;
Mat Martineau1500109b2012-10-23 15:24:15 -07004821 struct l2cap_move_chan_rsp rsp;
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004822 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004823 u16 icid = 0;
4824 u16 result = L2CAP_MR_NOT_ALLOWED;
4825
4826 if (cmd_len != sizeof(*req))
4827 return -EPROTO;
4828
4829 icid = le16_to_cpu(req->icid);
4830
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004831 BT_DBG("icid 0x%4.4x, dest_amp_id %d", icid, req->dest_amp_id);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004832
4833 if (!enable_hs)
4834 return -EINVAL;
4835
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004836 chan = l2cap_get_chan_by_dcid(conn, icid);
4837 if (!chan) {
Mat Martineau1500109b2012-10-23 15:24:15 -07004838 rsp.icid = cpu_to_le16(icid);
4839 rsp.result = __constant_cpu_to_le16(L2CAP_MR_NOT_ALLOWED);
4840 l2cap_send_cmd(conn, cmd->ident, L2CAP_MOVE_CHAN_RSP,
4841 sizeof(rsp), &rsp);
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004842 return 0;
4843 }
4844
Mat Martineau1500109b2012-10-23 15:24:15 -07004845 chan->ident = cmd->ident;
4846
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004847 if (chan->scid < L2CAP_CID_DYN_START ||
4848 chan->chan_policy == BT_CHANNEL_POLICY_BREDR_ONLY ||
4849 (chan->mode != L2CAP_MODE_ERTM &&
4850 chan->mode != L2CAP_MODE_STREAMING)) {
4851 result = L2CAP_MR_NOT_ALLOWED;
4852 goto send_move_response;
4853 }
4854
4855 if (chan->local_amp_id == req->dest_amp_id) {
4856 result = L2CAP_MR_SAME_ID;
4857 goto send_move_response;
4858 }
4859
4860 if (req->dest_amp_id) {
4861 struct hci_dev *hdev;
4862 hdev = hci_dev_get(req->dest_amp_id);
4863 if (!hdev || hdev->dev_type != HCI_AMP ||
4864 !test_bit(HCI_UP, &hdev->flags)) {
4865 if (hdev)
4866 hci_dev_put(hdev);
4867
4868 result = L2CAP_MR_BAD_ID;
4869 goto send_move_response;
4870 }
4871 hci_dev_put(hdev);
4872 }
4873
4874 /* Detect a move collision. Only send a collision response
4875 * if this side has "lost", otherwise proceed with the move.
4876 * The winner has the larger bd_addr.
4877 */
4878 if ((__chan_is_moving(chan) ||
4879 chan->move_role != L2CAP_MOVE_ROLE_NONE) &&
4880 bacmp(conn->src, conn->dst) > 0) {
4881 result = L2CAP_MR_COLLISION;
4882 goto send_move_response;
4883 }
4884
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004885 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
4886 l2cap_move_setup(chan);
4887 chan->move_id = req->dest_amp_id;
4888 icid = chan->dcid;
4889
4890 if (!req->dest_amp_id) {
4891 /* Moving to BR/EDR */
4892 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4893 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4894 result = L2CAP_MR_PEND;
4895 } else {
4896 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4897 result = L2CAP_MR_SUCCESS;
4898 }
4899 } else {
4900 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4901 /* Placeholder - uncomment when amp functions are available */
4902 /*amp_accept_physical(chan, req->dest_amp_id);*/
4903 result = L2CAP_MR_PEND;
4904 }
4905
4906send_move_response:
Mat Martineau1500109b2012-10-23 15:24:15 -07004907 l2cap_send_move_chan_rsp(chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004908
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004909 l2cap_chan_unlock(chan);
4910
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004911 return 0;
4912}
4913
Mat Martineau5b155ef2012-10-23 15:24:14 -07004914static void l2cap_move_continue(struct l2cap_conn *conn, u16 icid, u16 result)
4915{
4916 struct l2cap_chan *chan;
4917 struct hci_chan *hchan = NULL;
4918
4919 chan = l2cap_get_chan_by_scid(conn, icid);
4920 if (!chan) {
4921 l2cap_send_move_chan_cfm_icid(conn, icid);
4922 return;
4923 }
4924
4925 __clear_chan_timer(chan);
4926 if (result == L2CAP_MR_PEND)
4927 __set_chan_timer(chan, L2CAP_MOVE_ERTX_TIMEOUT);
4928
4929 switch (chan->move_state) {
4930 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
4931 /* Move confirm will be sent when logical link
4932 * is complete.
4933 */
4934 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4935 break;
4936 case L2CAP_MOVE_WAIT_RSP_SUCCESS:
4937 if (result == L2CAP_MR_PEND) {
4938 break;
4939 } else if (test_bit(CONN_LOCAL_BUSY,
4940 &chan->conn_state)) {
4941 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4942 } else {
4943 /* Logical link is up or moving to BR/EDR,
4944 * proceed with move
4945 */
4946 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
4947 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
4948 }
4949 break;
4950 case L2CAP_MOVE_WAIT_RSP:
4951 /* Moving to AMP */
4952 if (result == L2CAP_MR_SUCCESS) {
4953 /* Remote is ready, send confirm immediately
4954 * after logical link is ready
4955 */
4956 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4957 } else {
4958 /* Both logical link and move success
4959 * are required to confirm
4960 */
4961 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_COMP;
4962 }
4963
4964 /* Placeholder - get hci_chan for logical link */
4965 if (!hchan) {
4966 /* Logical link not available */
4967 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
4968 break;
4969 }
4970
4971 /* If the logical link is not yet connected, do not
4972 * send confirmation.
4973 */
4974 if (hchan->state != BT_CONNECTED)
4975 break;
4976
4977 /* Logical link is already ready to go */
4978
4979 chan->hs_hcon = hchan->conn;
4980 chan->hs_hcon->l2cap_data = chan->conn;
4981
4982 if (result == L2CAP_MR_SUCCESS) {
4983 /* Can confirm now */
4984 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
4985 } else {
4986 /* Now only need move success
4987 * to confirm
4988 */
4989 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4990 }
4991
4992 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
4993 break;
4994 default:
4995 /* Any other amp move state means the move failed. */
4996 chan->move_id = chan->local_amp_id;
4997 l2cap_move_done(chan);
4998 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
4999 }
5000
5001 l2cap_chan_unlock(chan);
5002}
5003
5004static void l2cap_move_fail(struct l2cap_conn *conn, u8 ident, u16 icid,
5005 u16 result)
5006{
5007 struct l2cap_chan *chan;
5008
5009 chan = l2cap_get_chan_by_ident(conn, ident);
5010 if (!chan) {
5011 /* Could not locate channel, icid is best guess */
5012 l2cap_send_move_chan_cfm_icid(conn, icid);
5013 return;
5014 }
5015
5016 __clear_chan_timer(chan);
5017
5018 if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
5019 if (result == L2CAP_MR_COLLISION) {
5020 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
5021 } else {
5022 /* Cleanup - cancel move */
5023 chan->move_id = chan->local_amp_id;
5024 l2cap_move_done(chan);
5025 }
5026 }
5027
5028 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5029
5030 l2cap_chan_unlock(chan);
5031}
5032
5033static int l2cap_move_channel_rsp(struct l2cap_conn *conn,
5034 struct l2cap_cmd_hdr *cmd,
5035 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005036{
5037 struct l2cap_move_chan_rsp *rsp = data;
5038 u16 icid, result;
5039
5040 if (cmd_len != sizeof(*rsp))
5041 return -EPROTO;
5042
5043 icid = le16_to_cpu(rsp->icid);
5044 result = le16_to_cpu(rsp->result);
5045
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005046 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005047
Mat Martineau5b155ef2012-10-23 15:24:14 -07005048 if (result == L2CAP_MR_SUCCESS || result == L2CAP_MR_PEND)
5049 l2cap_move_continue(conn, icid, result);
5050 else
5051 l2cap_move_fail(conn, cmd->ident, icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005052
5053 return 0;
5054}
5055
Mat Martineau5f3847a2012-10-23 15:24:12 -07005056static int l2cap_move_channel_confirm(struct l2cap_conn *conn,
5057 struct l2cap_cmd_hdr *cmd,
5058 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005059{
5060 struct l2cap_move_chan_cfm *cfm = data;
Mat Martineau5f3847a2012-10-23 15:24:12 -07005061 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005062 u16 icid, result;
5063
5064 if (cmd_len != sizeof(*cfm))
5065 return -EPROTO;
5066
5067 icid = le16_to_cpu(cfm->icid);
5068 result = le16_to_cpu(cfm->result);
5069
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005070 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005071
Mat Martineau5f3847a2012-10-23 15:24:12 -07005072 chan = l2cap_get_chan_by_dcid(conn, icid);
5073 if (!chan) {
5074 /* Spec requires a response even if the icid was not found */
5075 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5076 return 0;
5077 }
5078
5079 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM) {
5080 if (result == L2CAP_MC_CONFIRMED) {
5081 chan->local_amp_id = chan->move_id;
5082 if (!chan->local_amp_id)
5083 __release_logical_link(chan);
5084 } else {
5085 chan->move_id = chan->local_amp_id;
5086 }
5087
5088 l2cap_move_done(chan);
5089 }
5090
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005091 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5092
Mat Martineau5f3847a2012-10-23 15:24:12 -07005093 l2cap_chan_unlock(chan);
5094
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005095 return 0;
5096}
5097
5098static inline int l2cap_move_channel_confirm_rsp(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005099 struct l2cap_cmd_hdr *cmd,
5100 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005101{
5102 struct l2cap_move_chan_cfm_rsp *rsp = data;
Mat Martineau3fd71a02012-10-23 15:24:16 -07005103 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005104 u16 icid;
5105
5106 if (cmd_len != sizeof(*rsp))
5107 return -EPROTO;
5108
5109 icid = le16_to_cpu(rsp->icid);
5110
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005111 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005112
Mat Martineau3fd71a02012-10-23 15:24:16 -07005113 chan = l2cap_get_chan_by_scid(conn, icid);
5114 if (!chan)
5115 return 0;
5116
5117 __clear_chan_timer(chan);
5118
5119 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM_RSP) {
5120 chan->local_amp_id = chan->move_id;
5121
5122 if (!chan->local_amp_id && chan->hs_hchan)
5123 __release_logical_link(chan);
5124
5125 l2cap_move_done(chan);
5126 }
5127
5128 l2cap_chan_unlock(chan);
5129
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005130 return 0;
5131}
5132
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03005133static inline int l2cap_check_conn_param(u16 min, u16 max, u16 latency,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005134 u16 to_multiplier)
Claudio Takahaside731152011-02-11 19:28:55 -02005135{
5136 u16 max_latency;
5137
5138 if (min > max || min < 6 || max > 3200)
5139 return -EINVAL;
5140
5141 if (to_multiplier < 10 || to_multiplier > 3200)
5142 return -EINVAL;
5143
5144 if (max >= to_multiplier * 8)
5145 return -EINVAL;
5146
5147 max_latency = (to_multiplier * 8 / max) - 1;
5148 if (latency > 499 || latency > max_latency)
5149 return -EINVAL;
5150
5151 return 0;
5152}
5153
5154static inline int l2cap_conn_param_update_req(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005155 struct l2cap_cmd_hdr *cmd,
5156 u8 *data)
Claudio Takahaside731152011-02-11 19:28:55 -02005157{
5158 struct hci_conn *hcon = conn->hcon;
5159 struct l2cap_conn_param_update_req *req;
5160 struct l2cap_conn_param_update_rsp rsp;
5161 u16 min, max, latency, to_multiplier, cmd_len;
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005162 int err;
Claudio Takahaside731152011-02-11 19:28:55 -02005163
5164 if (!(hcon->link_mode & HCI_LM_MASTER))
5165 return -EINVAL;
5166
5167 cmd_len = __le16_to_cpu(cmd->len);
5168 if (cmd_len != sizeof(struct l2cap_conn_param_update_req))
5169 return -EPROTO;
5170
5171 req = (struct l2cap_conn_param_update_req *) data;
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03005172 min = __le16_to_cpu(req->min);
5173 max = __le16_to_cpu(req->max);
Claudio Takahaside731152011-02-11 19:28:55 -02005174 latency = __le16_to_cpu(req->latency);
5175 to_multiplier = __le16_to_cpu(req->to_multiplier);
5176
5177 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 +01005178 min, max, latency, to_multiplier);
Claudio Takahaside731152011-02-11 19:28:55 -02005179
5180 memset(&rsp, 0, sizeof(rsp));
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005181
5182 err = l2cap_check_conn_param(min, max, latency, to_multiplier);
5183 if (err)
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03005184 rsp.result = __constant_cpu_to_le16(L2CAP_CONN_PARAM_REJECTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005185 else
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03005186 rsp.result = __constant_cpu_to_le16(L2CAP_CONN_PARAM_ACCEPTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005187
5188 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONN_PARAM_UPDATE_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005189 sizeof(rsp), &rsp);
Claudio Takahaside731152011-02-11 19:28:55 -02005190
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005191 if (!err)
5192 hci_le_conn_update(hcon, min, max, latency, to_multiplier);
5193
Claudio Takahaside731152011-02-11 19:28:55 -02005194 return 0;
5195}
5196
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005197static inline int l2cap_bredr_sig_cmd(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005198 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5199 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005200{
5201 int err = 0;
5202
5203 switch (cmd->code) {
5204 case L2CAP_COMMAND_REJ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005205 l2cap_command_rej(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005206 break;
5207
5208 case L2CAP_CONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005209 err = l2cap_connect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005210 break;
5211
5212 case L2CAP_CONN_RSP:
Mat Martineauf5a25982012-10-11 17:48:21 +03005213 case L2CAP_CREATE_CHAN_RSP:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005214 err = l2cap_connect_create_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005215 break;
5216
5217 case L2CAP_CONF_REQ:
5218 err = l2cap_config_req(conn, cmd, cmd_len, data);
5219 break;
5220
5221 case L2CAP_CONF_RSP:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005222 err = l2cap_config_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005223 break;
5224
5225 case L2CAP_DISCONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005226 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005227 break;
5228
5229 case L2CAP_DISCONN_RSP:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005230 err = l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005231 break;
5232
5233 case L2CAP_ECHO_REQ:
5234 l2cap_send_cmd(conn, cmd->ident, L2CAP_ECHO_RSP, cmd_len, data);
5235 break;
5236
5237 case L2CAP_ECHO_RSP:
5238 break;
5239
5240 case L2CAP_INFO_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005241 err = l2cap_information_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005242 break;
5243
5244 case L2CAP_INFO_RSP:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005245 err = l2cap_information_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005246 break;
5247
Mat Martineauf94ff6f2011-11-02 16:18:32 -07005248 case L2CAP_CREATE_CHAN_REQ:
5249 err = l2cap_create_channel_req(conn, cmd, cmd_len, data);
5250 break;
5251
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005252 case L2CAP_MOVE_CHAN_REQ:
5253 err = l2cap_move_channel_req(conn, cmd, cmd_len, data);
5254 break;
5255
5256 case L2CAP_MOVE_CHAN_RSP:
5257 err = l2cap_move_channel_rsp(conn, cmd, cmd_len, data);
5258 break;
5259
5260 case L2CAP_MOVE_CHAN_CFM:
5261 err = l2cap_move_channel_confirm(conn, cmd, cmd_len, data);
5262 break;
5263
5264 case L2CAP_MOVE_CHAN_CFM_RSP:
5265 err = l2cap_move_channel_confirm_rsp(conn, cmd, cmd_len, data);
5266 break;
5267
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005268 default:
5269 BT_ERR("Unknown BR/EDR signaling command 0x%2.2x", cmd->code);
5270 err = -EINVAL;
5271 break;
5272 }
5273
5274 return err;
5275}
5276
5277static inline int l2cap_le_sig_cmd(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005278 struct l2cap_cmd_hdr *cmd, u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005279{
5280 switch (cmd->code) {
5281 case L2CAP_COMMAND_REJ:
5282 return 0;
5283
5284 case L2CAP_CONN_PARAM_UPDATE_REQ:
Claudio Takahaside731152011-02-11 19:28:55 -02005285 return l2cap_conn_param_update_req(conn, cmd, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005286
5287 case L2CAP_CONN_PARAM_UPDATE_RSP:
5288 return 0;
5289
5290 default:
5291 BT_ERR("Unknown LE signaling command 0x%2.2x", cmd->code);
5292 return -EINVAL;
5293 }
5294}
5295
Johan Hedbergc5623552013-04-29 19:35:33 +03005296static inline void l2cap_le_sig_channel(struct l2cap_conn *conn,
5297 struct sk_buff *skb)
5298{
5299 u8 *data = skb->data;
5300 int len = skb->len;
5301 struct l2cap_cmd_hdr cmd;
5302 int err;
5303
5304 l2cap_raw_recv(conn, skb);
5305
5306 while (len >= L2CAP_CMD_HDR_SIZE) {
5307 u16 cmd_len;
5308 memcpy(&cmd, data, L2CAP_CMD_HDR_SIZE);
5309 data += L2CAP_CMD_HDR_SIZE;
5310 len -= L2CAP_CMD_HDR_SIZE;
5311
5312 cmd_len = le16_to_cpu(cmd.len);
5313
5314 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd.code, cmd_len,
5315 cmd.ident);
5316
5317 if (cmd_len > len || !cmd.ident) {
5318 BT_DBG("corrupted command");
5319 break;
5320 }
5321
5322 err = l2cap_le_sig_cmd(conn, &cmd, data);
5323 if (err) {
5324 struct l2cap_cmd_rej_unk rej;
5325
5326 BT_ERR("Wrong link type (%d)", err);
5327
5328 /* FIXME: Map err to a valid reason */
5329 rej.reason = __constant_cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
5330 l2cap_send_cmd(conn, cmd.ident, L2CAP_COMMAND_REJ,
5331 sizeof(rej), &rej);
5332 }
5333
5334 data += cmd_len;
5335 len -= cmd_len;
5336 }
5337
5338 kfree_skb(skb);
5339}
5340
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005341static inline void l2cap_sig_channel(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005342 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005343{
5344 u8 *data = skb->data;
5345 int len = skb->len;
5346 struct l2cap_cmd_hdr cmd;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005347 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005348
5349 l2cap_raw_recv(conn, skb);
5350
5351 while (len >= L2CAP_CMD_HDR_SIZE) {
Al Viro88219a02007-07-29 00:17:25 -07005352 u16 cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005353 memcpy(&cmd, data, L2CAP_CMD_HDR_SIZE);
5354 data += L2CAP_CMD_HDR_SIZE;
5355 len -= L2CAP_CMD_HDR_SIZE;
5356
Al Viro88219a02007-07-29 00:17:25 -07005357 cmd_len = le16_to_cpu(cmd.len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005358
Gustavo Padovan2d792812012-10-06 10:07:01 +01005359 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd.code, cmd_len,
5360 cmd.ident);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005361
Al Viro88219a02007-07-29 00:17:25 -07005362 if (cmd_len > len || !cmd.ident) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005363 BT_DBG("corrupted command");
5364 break;
5365 }
5366
Johan Hedbergc5623552013-04-29 19:35:33 +03005367 err = l2cap_bredr_sig_cmd(conn, &cmd, cmd_len, data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005368 if (err) {
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03005369 struct l2cap_cmd_rej_unk rej;
Gustavo F. Padovan2c6d1a22011-03-23 14:38:32 -03005370
5371 BT_ERR("Wrong link type (%d)", err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005372
5373 /* FIXME: Map err to a valid reason */
Andrei Emeltchenkoac734982012-05-24 15:42:51 +03005374 rej.reason = __constant_cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Gustavo Padovan2d792812012-10-06 10:07:01 +01005375 l2cap_send_cmd(conn, cmd.ident, L2CAP_COMMAND_REJ,
5376 sizeof(rej), &rej);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005377 }
5378
Al Viro88219a02007-07-29 00:17:25 -07005379 data += cmd_len;
5380 len -= cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005381 }
5382
5383 kfree_skb(skb);
5384}
5385
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005386static int l2cap_check_fcs(struct l2cap_chan *chan, struct sk_buff *skb)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005387{
5388 u16 our_fcs, rcv_fcs;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03005389 int hdr_size;
5390
5391 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
5392 hdr_size = L2CAP_EXT_HDR_SIZE;
5393 else
5394 hdr_size = L2CAP_ENH_HDR_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005395
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005396 if (chan->fcs == L2CAP_FCS_CRC16) {
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005397 skb_trim(skb, skb->len - L2CAP_FCS_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005398 rcv_fcs = get_unaligned_le16(skb->data + skb->len);
5399 our_fcs = crc16(0, skb->data - hdr_size, skb->len + hdr_size);
5400
5401 if (our_fcs != rcv_fcs)
João Paulo Rechi Vita7a560e52010-06-22 13:56:27 -03005402 return -EBADMSG;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005403 }
5404 return 0;
5405}
5406
Mat Martineau6ea00482012-05-17 20:53:52 -07005407static void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan)
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005408{
Mat Martineaue31f7632012-05-17 20:53:41 -07005409 struct l2cap_ctrl control;
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005410
Mat Martineaue31f7632012-05-17 20:53:41 -07005411 BT_DBG("chan %p", chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005412
Mat Martineaue31f7632012-05-17 20:53:41 -07005413 memset(&control, 0, sizeof(control));
5414 control.sframe = 1;
5415 control.final = 1;
5416 control.reqseq = chan->buffer_seq;
5417 set_bit(CONN_SEND_FBIT, &chan->conn_state);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005418
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005419 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
Mat Martineaue31f7632012-05-17 20:53:41 -07005420 control.super = L2CAP_SUPER_RNR;
5421 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005422 }
5423
Mat Martineaue31f7632012-05-17 20:53:41 -07005424 if (test_and_clear_bit(CONN_REMOTE_BUSY, &chan->conn_state) &&
5425 chan->unacked_frames > 0)
5426 __set_retrans_timer(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005427
Mat Martineaue31f7632012-05-17 20:53:41 -07005428 /* Send pending iframes */
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03005429 l2cap_ertm_send(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005430
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005431 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
Mat Martineaue31f7632012-05-17 20:53:41 -07005432 test_bit(CONN_SEND_FBIT, &chan->conn_state)) {
5433 /* F-bit wasn't sent in an s-frame or i-frame yet, so
5434 * send it now.
5435 */
5436 control.super = L2CAP_SUPER_RR;
5437 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005438 }
5439}
5440
Gustavo Padovan2d792812012-10-06 10:07:01 +01005441static void append_skb_frag(struct sk_buff *skb, struct sk_buff *new_frag,
5442 struct sk_buff **last_frag)
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005443{
Mat Martineau84084a32011-07-22 14:54:00 -07005444 /* skb->len reflects data in skb as well as all fragments
5445 * skb->data_len reflects only data in fragments
5446 */
5447 if (!skb_has_frag_list(skb))
5448 skb_shinfo(skb)->frag_list = new_frag;
5449
5450 new_frag->next = NULL;
5451
5452 (*last_frag)->next = new_frag;
5453 *last_frag = new_frag;
5454
5455 skb->len += new_frag->len;
5456 skb->data_len += new_frag->len;
5457 skb->truesize += new_frag->truesize;
5458}
5459
Mat Martineau4b51dae92012-05-17 20:53:37 -07005460static int l2cap_reassemble_sdu(struct l2cap_chan *chan, struct sk_buff *skb,
5461 struct l2cap_ctrl *control)
Mat Martineau84084a32011-07-22 14:54:00 -07005462{
5463 int err = -EINVAL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005464
Mat Martineau4b51dae92012-05-17 20:53:37 -07005465 switch (control->sar) {
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005466 case L2CAP_SAR_UNSEGMENTED:
Mat Martineau84084a32011-07-22 14:54:00 -07005467 if (chan->sdu)
5468 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005469
Gustavo Padovan80b98022012-05-27 22:27:51 -03005470 err = chan->ops->recv(chan, skb);
Mat Martineau84084a32011-07-22 14:54:00 -07005471 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005472
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005473 case L2CAP_SAR_START:
Mat Martineau84084a32011-07-22 14:54:00 -07005474 if (chan->sdu)
5475 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005476
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005477 chan->sdu_len = get_unaligned_le16(skb->data);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005478 skb_pull(skb, L2CAP_SDULEN_SIZE);
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005479
Mat Martineau84084a32011-07-22 14:54:00 -07005480 if (chan->sdu_len > chan->imtu) {
5481 err = -EMSGSIZE;
5482 break;
5483 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005484
Mat Martineau84084a32011-07-22 14:54:00 -07005485 if (skb->len >= chan->sdu_len)
5486 break;
5487
5488 chan->sdu = skb;
5489 chan->sdu_last_frag = skb;
5490
5491 skb = NULL;
5492 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005493 break;
5494
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005495 case L2CAP_SAR_CONTINUE:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005496 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005497 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005498
Mat Martineau84084a32011-07-22 14:54:00 -07005499 append_skb_frag(chan->sdu, skb,
5500 &chan->sdu_last_frag);
5501 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005502
Mat Martineau84084a32011-07-22 14:54:00 -07005503 if (chan->sdu->len >= chan->sdu_len)
5504 break;
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005505
Mat Martineau84084a32011-07-22 14:54:00 -07005506 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005507 break;
5508
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005509 case L2CAP_SAR_END:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005510 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005511 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005512
Mat Martineau84084a32011-07-22 14:54:00 -07005513 append_skb_frag(chan->sdu, skb,
5514 &chan->sdu_last_frag);
5515 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005516
Mat Martineau84084a32011-07-22 14:54:00 -07005517 if (chan->sdu->len != chan->sdu_len)
5518 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005519
Gustavo Padovan80b98022012-05-27 22:27:51 -03005520 err = chan->ops->recv(chan, chan->sdu);
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005521
Mat Martineau84084a32011-07-22 14:54:00 -07005522 if (!err) {
5523 /* Reassembly complete */
5524 chan->sdu = NULL;
5525 chan->sdu_last_frag = NULL;
5526 chan->sdu_len = 0;
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005527 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005528 break;
5529 }
5530
Mat Martineau84084a32011-07-22 14:54:00 -07005531 if (err) {
5532 kfree_skb(skb);
5533 kfree_skb(chan->sdu);
5534 chan->sdu = NULL;
5535 chan->sdu_last_frag = NULL;
5536 chan->sdu_len = 0;
5537 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005538
Mat Martineau84084a32011-07-22 14:54:00 -07005539 return err;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005540}
5541
Mat Martineau32b32732012-10-23 15:24:11 -07005542static int l2cap_resegment(struct l2cap_chan *chan)
5543{
5544 /* Placeholder */
5545 return 0;
5546}
5547
Mat Martineaue3281402011-07-07 09:39:02 -07005548void l2cap_chan_busy(struct l2cap_chan *chan, int busy)
Gustavo F. Padovan712132e2010-06-21 19:39:50 -03005549{
Mat Martineau61aa4f52012-05-17 20:53:40 -07005550 u8 event;
5551
5552 if (chan->mode != L2CAP_MODE_ERTM)
5553 return;
5554
5555 event = busy ? L2CAP_EV_LOCAL_BUSY_DETECTED : L2CAP_EV_LOCAL_BUSY_CLEAR;
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03005556 l2cap_tx(chan, NULL, NULL, event);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005557}
5558
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005559static int l2cap_rx_queued_iframes(struct l2cap_chan *chan)
5560{
Mat Martineau63838722012-05-17 20:53:45 -07005561 int err = 0;
5562 /* Pass sequential frames to l2cap_reassemble_sdu()
5563 * until a gap is encountered.
5564 */
5565
5566 BT_DBG("chan %p", chan);
5567
5568 while (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
5569 struct sk_buff *skb;
5570 BT_DBG("Searching for skb with txseq %d (queue len %d)",
5571 chan->buffer_seq, skb_queue_len(&chan->srej_q));
5572
5573 skb = l2cap_ertm_seq_in_queue(&chan->srej_q, chan->buffer_seq);
5574
5575 if (!skb)
5576 break;
5577
5578 skb_unlink(skb, &chan->srej_q);
5579 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
5580 err = l2cap_reassemble_sdu(chan, skb, &bt_cb(skb)->control);
5581 if (err)
5582 break;
5583 }
5584
5585 if (skb_queue_empty(&chan->srej_q)) {
5586 chan->rx_state = L2CAP_RX_STATE_RECV;
5587 l2cap_send_ack(chan);
5588 }
5589
5590 return err;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005591}
5592
5593static void l2cap_handle_srej(struct l2cap_chan *chan,
5594 struct l2cap_ctrl *control)
5595{
Mat Martineauf80842a2012-05-17 20:53:46 -07005596 struct sk_buff *skb;
5597
5598 BT_DBG("chan %p, control %p", chan, control);
5599
5600 if (control->reqseq == chan->next_tx_seq) {
5601 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005602 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005603 return;
5604 }
5605
5606 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
5607
5608 if (skb == NULL) {
5609 BT_DBG("Seq %d not available for retransmission",
5610 control->reqseq);
5611 return;
5612 }
5613
5614 if (chan->max_tx != 0 && bt_cb(skb)->control.retries >= chan->max_tx) {
5615 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005616 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005617 return;
5618 }
5619
5620 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
5621
5622 if (control->poll) {
5623 l2cap_pass_to_tx(chan, control);
5624
5625 set_bit(CONN_SEND_FBIT, &chan->conn_state);
5626 l2cap_retransmit(chan, control);
5627 l2cap_ertm_send(chan);
5628
5629 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5630 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5631 chan->srej_save_reqseq = control->reqseq;
5632 }
5633 } else {
5634 l2cap_pass_to_tx_fbit(chan, control);
5635
5636 if (control->final) {
5637 if (chan->srej_save_reqseq != control->reqseq ||
5638 !test_and_clear_bit(CONN_SREJ_ACT,
5639 &chan->conn_state))
5640 l2cap_retransmit(chan, control);
5641 } else {
5642 l2cap_retransmit(chan, control);
5643 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5644 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5645 chan->srej_save_reqseq = control->reqseq;
5646 }
5647 }
5648 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005649}
5650
5651static void l2cap_handle_rej(struct l2cap_chan *chan,
5652 struct l2cap_ctrl *control)
5653{
Mat Martineaufcd289d2012-05-17 20:53:47 -07005654 struct sk_buff *skb;
5655
5656 BT_DBG("chan %p, control %p", chan, control);
5657
5658 if (control->reqseq == chan->next_tx_seq) {
5659 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005660 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07005661 return;
5662 }
5663
5664 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
5665
5666 if (chan->max_tx && skb &&
5667 bt_cb(skb)->control.retries >= chan->max_tx) {
5668 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005669 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07005670 return;
5671 }
5672
5673 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
5674
5675 l2cap_pass_to_tx(chan, control);
5676
5677 if (control->final) {
5678 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state))
5679 l2cap_retransmit_all(chan, control);
5680 } else {
5681 l2cap_retransmit_all(chan, control);
5682 l2cap_ertm_send(chan);
5683 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F)
5684 set_bit(CONN_REJ_ACT, &chan->conn_state);
5685 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005686}
5687
Mat Martineau4b51dae92012-05-17 20:53:37 -07005688static u8 l2cap_classify_txseq(struct l2cap_chan *chan, u16 txseq)
5689{
5690 BT_DBG("chan %p, txseq %d", chan, txseq);
5691
5692 BT_DBG("last_acked_seq %d, expected_tx_seq %d", chan->last_acked_seq,
5693 chan->expected_tx_seq);
5694
5695 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
5696 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
Gustavo Padovan2d792812012-10-06 10:07:01 +01005697 chan->tx_win) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07005698 /* See notes below regarding "double poll" and
5699 * invalid packets.
5700 */
5701 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
5702 BT_DBG("Invalid/Ignore - after SREJ");
5703 return L2CAP_TXSEQ_INVALID_IGNORE;
5704 } else {
5705 BT_DBG("Invalid - in window after SREJ sent");
5706 return L2CAP_TXSEQ_INVALID;
5707 }
5708 }
5709
5710 if (chan->srej_list.head == txseq) {
5711 BT_DBG("Expected SREJ");
5712 return L2CAP_TXSEQ_EXPECTED_SREJ;
5713 }
5714
5715 if (l2cap_ertm_seq_in_queue(&chan->srej_q, txseq)) {
5716 BT_DBG("Duplicate SREJ - txseq already stored");
5717 return L2CAP_TXSEQ_DUPLICATE_SREJ;
5718 }
5719
5720 if (l2cap_seq_list_contains(&chan->srej_list, txseq)) {
5721 BT_DBG("Unexpected SREJ - not requested");
5722 return L2CAP_TXSEQ_UNEXPECTED_SREJ;
5723 }
5724 }
5725
5726 if (chan->expected_tx_seq == txseq) {
5727 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
5728 chan->tx_win) {
5729 BT_DBG("Invalid - txseq outside tx window");
5730 return L2CAP_TXSEQ_INVALID;
5731 } else {
5732 BT_DBG("Expected");
5733 return L2CAP_TXSEQ_EXPECTED;
5734 }
5735 }
5736
5737 if (__seq_offset(chan, txseq, chan->last_acked_seq) <
Gustavo Padovan2d792812012-10-06 10:07:01 +01005738 __seq_offset(chan, chan->expected_tx_seq, chan->last_acked_seq)) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07005739 BT_DBG("Duplicate - expected_tx_seq later than txseq");
5740 return L2CAP_TXSEQ_DUPLICATE;
5741 }
5742
5743 if (__seq_offset(chan, txseq, chan->last_acked_seq) >= chan->tx_win) {
5744 /* A source of invalid packets is a "double poll" condition,
5745 * where delays cause us to send multiple poll packets. If
5746 * the remote stack receives and processes both polls,
5747 * sequence numbers can wrap around in such a way that a
5748 * resent frame has a sequence number that looks like new data
5749 * with a sequence gap. This would trigger an erroneous SREJ
5750 * request.
5751 *
5752 * Fortunately, this is impossible with a tx window that's
5753 * less than half of the maximum sequence number, which allows
5754 * invalid frames to be safely ignored.
5755 *
5756 * With tx window sizes greater than half of the tx window
5757 * maximum, the frame is invalid and cannot be ignored. This
5758 * causes a disconnect.
5759 */
5760
5761 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
5762 BT_DBG("Invalid/Ignore - txseq outside tx window");
5763 return L2CAP_TXSEQ_INVALID_IGNORE;
5764 } else {
5765 BT_DBG("Invalid - txseq outside tx window");
5766 return L2CAP_TXSEQ_INVALID;
5767 }
5768 } else {
5769 BT_DBG("Unexpected - txseq indicates missing frames");
5770 return L2CAP_TXSEQ_UNEXPECTED;
5771 }
5772}
5773
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005774static int l2cap_rx_state_recv(struct l2cap_chan *chan,
5775 struct l2cap_ctrl *control,
5776 struct sk_buff *skb, u8 event)
5777{
5778 int err = 0;
5779 bool skb_in_use = 0;
5780
5781 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
5782 event);
5783
5784 switch (event) {
5785 case L2CAP_EV_RECV_IFRAME:
5786 switch (l2cap_classify_txseq(chan, control->txseq)) {
5787 case L2CAP_TXSEQ_EXPECTED:
5788 l2cap_pass_to_tx(chan, control);
5789
5790 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
5791 BT_DBG("Busy, discarding expected seq %d",
5792 control->txseq);
5793 break;
5794 }
5795
5796 chan->expected_tx_seq = __next_seq(chan,
5797 control->txseq);
5798
5799 chan->buffer_seq = chan->expected_tx_seq;
5800 skb_in_use = 1;
5801
5802 err = l2cap_reassemble_sdu(chan, skb, control);
5803 if (err)
5804 break;
5805
5806 if (control->final) {
5807 if (!test_and_clear_bit(CONN_REJ_ACT,
5808 &chan->conn_state)) {
5809 control->final = 0;
5810 l2cap_retransmit_all(chan, control);
5811 l2cap_ertm_send(chan);
5812 }
5813 }
5814
5815 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
5816 l2cap_send_ack(chan);
5817 break;
5818 case L2CAP_TXSEQ_UNEXPECTED:
5819 l2cap_pass_to_tx(chan, control);
5820
5821 /* Can't issue SREJ frames in the local busy state.
5822 * Drop this frame, it will be seen as missing
5823 * when local busy is exited.
5824 */
5825 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
5826 BT_DBG("Busy, discarding unexpected seq %d",
5827 control->txseq);
5828 break;
5829 }
5830
5831 /* There was a gap in the sequence, so an SREJ
5832 * must be sent for each missing frame. The
5833 * current frame is stored for later use.
5834 */
5835 skb_queue_tail(&chan->srej_q, skb);
5836 skb_in_use = 1;
5837 BT_DBG("Queued %p (queue len %d)", skb,
5838 skb_queue_len(&chan->srej_q));
5839
5840 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
5841 l2cap_seq_list_clear(&chan->srej_list);
5842 l2cap_send_srej(chan, control->txseq);
5843
5844 chan->rx_state = L2CAP_RX_STATE_SREJ_SENT;
5845 break;
5846 case L2CAP_TXSEQ_DUPLICATE:
5847 l2cap_pass_to_tx(chan, control);
5848 break;
5849 case L2CAP_TXSEQ_INVALID_IGNORE:
5850 break;
5851 case L2CAP_TXSEQ_INVALID:
5852 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005853 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005854 break;
5855 }
5856 break;
5857 case L2CAP_EV_RECV_RR:
5858 l2cap_pass_to_tx(chan, control);
5859 if (control->final) {
5860 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
5861
Mat Martineaue6a3ee62012-10-23 15:24:22 -07005862 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state) &&
5863 !__chan_is_moving(chan)) {
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005864 control->final = 0;
5865 l2cap_retransmit_all(chan, control);
5866 }
5867
5868 l2cap_ertm_send(chan);
5869 } else if (control->poll) {
5870 l2cap_send_i_or_rr_or_rnr(chan);
5871 } else {
5872 if (test_and_clear_bit(CONN_REMOTE_BUSY,
5873 &chan->conn_state) &&
5874 chan->unacked_frames)
5875 __set_retrans_timer(chan);
5876
5877 l2cap_ertm_send(chan);
5878 }
5879 break;
5880 case L2CAP_EV_RECV_RNR:
5881 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
5882 l2cap_pass_to_tx(chan, control);
5883 if (control && control->poll) {
5884 set_bit(CONN_SEND_FBIT, &chan->conn_state);
5885 l2cap_send_rr_or_rnr(chan, 0);
5886 }
5887 __clear_retrans_timer(chan);
5888 l2cap_seq_list_clear(&chan->retrans_list);
5889 break;
5890 case L2CAP_EV_RECV_REJ:
5891 l2cap_handle_rej(chan, control);
5892 break;
5893 case L2CAP_EV_RECV_SREJ:
5894 l2cap_handle_srej(chan, control);
5895 break;
5896 default:
5897 break;
5898 }
5899
5900 if (skb && !skb_in_use) {
5901 BT_DBG("Freeing %p", skb);
5902 kfree_skb(skb);
5903 }
5904
5905 return err;
5906}
5907
5908static int l2cap_rx_state_srej_sent(struct l2cap_chan *chan,
5909 struct l2cap_ctrl *control,
5910 struct sk_buff *skb, u8 event)
5911{
5912 int err = 0;
5913 u16 txseq = control->txseq;
5914 bool skb_in_use = 0;
5915
5916 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
5917 event);
5918
5919 switch (event) {
5920 case L2CAP_EV_RECV_IFRAME:
5921 switch (l2cap_classify_txseq(chan, txseq)) {
5922 case L2CAP_TXSEQ_EXPECTED:
5923 /* Keep frame for reassembly later */
5924 l2cap_pass_to_tx(chan, control);
5925 skb_queue_tail(&chan->srej_q, skb);
5926 skb_in_use = 1;
5927 BT_DBG("Queued %p (queue len %d)", skb,
5928 skb_queue_len(&chan->srej_q));
5929
5930 chan->expected_tx_seq = __next_seq(chan, txseq);
5931 break;
5932 case L2CAP_TXSEQ_EXPECTED_SREJ:
5933 l2cap_seq_list_pop(&chan->srej_list);
5934
5935 l2cap_pass_to_tx(chan, control);
5936 skb_queue_tail(&chan->srej_q, skb);
5937 skb_in_use = 1;
5938 BT_DBG("Queued %p (queue len %d)", skb,
5939 skb_queue_len(&chan->srej_q));
5940
5941 err = l2cap_rx_queued_iframes(chan);
5942 if (err)
5943 break;
5944
5945 break;
5946 case L2CAP_TXSEQ_UNEXPECTED:
5947 /* Got a frame that can't be reassembled yet.
5948 * Save it for later, and send SREJs to cover
5949 * the missing frames.
5950 */
5951 skb_queue_tail(&chan->srej_q, skb);
5952 skb_in_use = 1;
5953 BT_DBG("Queued %p (queue len %d)", skb,
5954 skb_queue_len(&chan->srej_q));
5955
5956 l2cap_pass_to_tx(chan, control);
5957 l2cap_send_srej(chan, control->txseq);
5958 break;
5959 case L2CAP_TXSEQ_UNEXPECTED_SREJ:
5960 /* This frame was requested with an SREJ, but
5961 * some expected retransmitted frames are
5962 * missing. Request retransmission of missing
5963 * SREJ'd frames.
5964 */
5965 skb_queue_tail(&chan->srej_q, skb);
5966 skb_in_use = 1;
5967 BT_DBG("Queued %p (queue len %d)", skb,
5968 skb_queue_len(&chan->srej_q));
5969
5970 l2cap_pass_to_tx(chan, control);
5971 l2cap_send_srej_list(chan, control->txseq);
5972 break;
5973 case L2CAP_TXSEQ_DUPLICATE_SREJ:
5974 /* We've already queued this frame. Drop this copy. */
5975 l2cap_pass_to_tx(chan, control);
5976 break;
5977 case L2CAP_TXSEQ_DUPLICATE:
5978 /* Expecting a later sequence number, so this frame
5979 * was already received. Ignore it completely.
5980 */
5981 break;
5982 case L2CAP_TXSEQ_INVALID_IGNORE:
5983 break;
5984 case L2CAP_TXSEQ_INVALID:
5985 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005986 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005987 break;
5988 }
5989 break;
5990 case L2CAP_EV_RECV_RR:
5991 l2cap_pass_to_tx(chan, control);
5992 if (control->final) {
5993 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
5994
5995 if (!test_and_clear_bit(CONN_REJ_ACT,
5996 &chan->conn_state)) {
5997 control->final = 0;
5998 l2cap_retransmit_all(chan, control);
5999 }
6000
6001 l2cap_ertm_send(chan);
6002 } else if (control->poll) {
6003 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6004 &chan->conn_state) &&
6005 chan->unacked_frames) {
6006 __set_retrans_timer(chan);
6007 }
6008
6009 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6010 l2cap_send_srej_tail(chan);
6011 } else {
6012 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6013 &chan->conn_state) &&
6014 chan->unacked_frames)
6015 __set_retrans_timer(chan);
6016
6017 l2cap_send_ack(chan);
6018 }
6019 break;
6020 case L2CAP_EV_RECV_RNR:
6021 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6022 l2cap_pass_to_tx(chan, control);
6023 if (control->poll) {
6024 l2cap_send_srej_tail(chan);
6025 } else {
6026 struct l2cap_ctrl rr_control;
6027 memset(&rr_control, 0, sizeof(rr_control));
6028 rr_control.sframe = 1;
6029 rr_control.super = L2CAP_SUPER_RR;
6030 rr_control.reqseq = chan->buffer_seq;
6031 l2cap_send_sframe(chan, &rr_control);
6032 }
6033
6034 break;
6035 case L2CAP_EV_RECV_REJ:
6036 l2cap_handle_rej(chan, control);
6037 break;
6038 case L2CAP_EV_RECV_SREJ:
6039 l2cap_handle_srej(chan, control);
6040 break;
6041 }
6042
6043 if (skb && !skb_in_use) {
6044 BT_DBG("Freeing %p", skb);
6045 kfree_skb(skb);
6046 }
6047
6048 return err;
6049}
6050
Mat Martineau32b32732012-10-23 15:24:11 -07006051static int l2cap_finish_move(struct l2cap_chan *chan)
6052{
6053 BT_DBG("chan %p", chan);
6054
6055 chan->rx_state = L2CAP_RX_STATE_RECV;
6056
6057 if (chan->hs_hcon)
6058 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6059 else
6060 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6061
6062 return l2cap_resegment(chan);
6063}
6064
6065static int l2cap_rx_state_wait_p(struct l2cap_chan *chan,
6066 struct l2cap_ctrl *control,
6067 struct sk_buff *skb, u8 event)
6068{
6069 int err;
6070
6071 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6072 event);
6073
6074 if (!control->poll)
6075 return -EPROTO;
6076
6077 l2cap_process_reqseq(chan, control->reqseq);
6078
6079 if (!skb_queue_empty(&chan->tx_q))
6080 chan->tx_send_head = skb_peek(&chan->tx_q);
6081 else
6082 chan->tx_send_head = NULL;
6083
6084 /* Rewind next_tx_seq to the point expected
6085 * by the receiver.
6086 */
6087 chan->next_tx_seq = control->reqseq;
6088 chan->unacked_frames = 0;
6089
6090 err = l2cap_finish_move(chan);
6091 if (err)
6092 return err;
6093
6094 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6095 l2cap_send_i_or_rr_or_rnr(chan);
6096
6097 if (event == L2CAP_EV_RECV_IFRAME)
6098 return -EPROTO;
6099
6100 return l2cap_rx_state_recv(chan, control, NULL, event);
6101}
6102
6103static int l2cap_rx_state_wait_f(struct l2cap_chan *chan,
6104 struct l2cap_ctrl *control,
6105 struct sk_buff *skb, u8 event)
6106{
6107 int err;
6108
6109 if (!control->final)
6110 return -EPROTO;
6111
6112 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6113
6114 chan->rx_state = L2CAP_RX_STATE_RECV;
6115 l2cap_process_reqseq(chan, control->reqseq);
6116
6117 if (!skb_queue_empty(&chan->tx_q))
6118 chan->tx_send_head = skb_peek(&chan->tx_q);
6119 else
6120 chan->tx_send_head = NULL;
6121
6122 /* Rewind next_tx_seq to the point expected
6123 * by the receiver.
6124 */
6125 chan->next_tx_seq = control->reqseq;
6126 chan->unacked_frames = 0;
6127
6128 if (chan->hs_hcon)
6129 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6130 else
6131 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6132
6133 err = l2cap_resegment(chan);
6134
6135 if (!err)
6136 err = l2cap_rx_state_recv(chan, control, skb, event);
6137
6138 return err;
6139}
6140
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006141static bool __valid_reqseq(struct l2cap_chan *chan, u16 reqseq)
6142{
6143 /* Make sure reqseq is for a packet that has been sent but not acked */
6144 u16 unacked;
6145
6146 unacked = __seq_offset(chan, chan->next_tx_seq, chan->expected_ack_seq);
6147 return __seq_offset(chan, chan->next_tx_seq, reqseq) <= unacked;
6148}
6149
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006150static int l2cap_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6151 struct sk_buff *skb, u8 event)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006152{
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006153 int err = 0;
6154
6155 BT_DBG("chan %p, control %p, skb %p, event %d, state %d", chan,
6156 control, skb, event, chan->rx_state);
6157
6158 if (__valid_reqseq(chan, control->reqseq)) {
6159 switch (chan->rx_state) {
6160 case L2CAP_RX_STATE_RECV:
6161 err = l2cap_rx_state_recv(chan, control, skb, event);
6162 break;
6163 case L2CAP_RX_STATE_SREJ_SENT:
6164 err = l2cap_rx_state_srej_sent(chan, control, skb,
6165 event);
6166 break;
Mat Martineau32b32732012-10-23 15:24:11 -07006167 case L2CAP_RX_STATE_WAIT_P:
6168 err = l2cap_rx_state_wait_p(chan, control, skb, event);
6169 break;
6170 case L2CAP_RX_STATE_WAIT_F:
6171 err = l2cap_rx_state_wait_f(chan, control, skb, event);
6172 break;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006173 default:
6174 /* shut it down */
6175 break;
6176 }
6177 } else {
6178 BT_DBG("Invalid reqseq %d (next_tx_seq %d, expected_ack_seq %d",
6179 control->reqseq, chan->next_tx_seq,
6180 chan->expected_ack_seq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006181 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006182 }
6183
6184 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006185}
6186
6187static int l2cap_stream_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6188 struct sk_buff *skb)
6189{
Mat Martineau4b51dae92012-05-17 20:53:37 -07006190 int err = 0;
6191
6192 BT_DBG("chan %p, control %p, skb %p, state %d", chan, control, skb,
6193 chan->rx_state);
6194
6195 if (l2cap_classify_txseq(chan, control->txseq) ==
6196 L2CAP_TXSEQ_EXPECTED) {
6197 l2cap_pass_to_tx(chan, control);
6198
6199 BT_DBG("buffer_seq %d->%d", chan->buffer_seq,
6200 __next_seq(chan, chan->buffer_seq));
6201
6202 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
6203
6204 l2cap_reassemble_sdu(chan, skb, control);
6205 } else {
6206 if (chan->sdu) {
6207 kfree_skb(chan->sdu);
6208 chan->sdu = NULL;
6209 }
6210 chan->sdu_last_frag = NULL;
6211 chan->sdu_len = 0;
6212
6213 if (skb) {
6214 BT_DBG("Freeing %p", skb);
6215 kfree_skb(skb);
6216 }
6217 }
6218
6219 chan->last_acked_seq = control->txseq;
6220 chan->expected_tx_seq = __next_seq(chan, control->txseq);
6221
6222 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006223}
6224
6225static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6226{
6227 struct l2cap_ctrl *control = &bt_cb(skb)->control;
6228 u16 len;
6229 u8 event;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006230
Mat Martineaub76bbd62012-04-11 10:48:43 -07006231 __unpack_control(chan, skb);
6232
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006233 len = skb->len;
6234
6235 /*
6236 * We can just drop the corrupted I-frame here.
6237 * Receiver will miss it and start proper recovery
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006238 * procedures and ask for retransmission.
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006239 */
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006240 if (l2cap_check_fcs(chan, skb))
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006241 goto drop;
6242
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006243 if (!control->sframe && control->sar == L2CAP_SAR_START)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006244 len -= L2CAP_SDULEN_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006245
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006246 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006247 len -= L2CAP_FCS_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006248
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006249 if (len > chan->mps) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006250 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006251 goto drop;
6252 }
6253
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006254 if (!control->sframe) {
6255 int err;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006256
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006257 BT_DBG("iframe sar %d, reqseq %d, final %d, txseq %d",
6258 control->sar, control->reqseq, control->final,
6259 control->txseq);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03006260
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006261 /* Validate F-bit - F=0 always valid, F=1 only
6262 * valid in TX WAIT_F
6263 */
6264 if (control->final && chan->tx_state != L2CAP_TX_STATE_WAIT_F)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006265 goto drop;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006266
6267 if (chan->mode != L2CAP_MODE_STREAMING) {
6268 event = L2CAP_EV_RECV_IFRAME;
6269 err = l2cap_rx(chan, control, skb, event);
6270 } else {
6271 err = l2cap_stream_rx(chan, control, skb);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006272 }
6273
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006274 if (err)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006275 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006276 } else {
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006277 const u8 rx_func_to_event[4] = {
6278 L2CAP_EV_RECV_RR, L2CAP_EV_RECV_REJ,
6279 L2CAP_EV_RECV_RNR, L2CAP_EV_RECV_SREJ
6280 };
6281
6282 /* Only I-frames are expected in streaming mode */
6283 if (chan->mode == L2CAP_MODE_STREAMING)
6284 goto drop;
6285
6286 BT_DBG("sframe reqseq %d, final %d, poll %d, super %d",
6287 control->reqseq, control->final, control->poll,
6288 control->super);
6289
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006290 if (len != 0) {
Andrei Emeltchenko1bb166e2012-11-20 17:16:21 +02006291 BT_ERR("Trailing bytes: %d in sframe", len);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006292 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006293 goto drop;
6294 }
6295
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006296 /* Validate F and P bits */
6297 if (control->final && (control->poll ||
6298 chan->tx_state != L2CAP_TX_STATE_WAIT_F))
6299 goto drop;
6300
6301 event = rx_func_to_event[control->super];
6302 if (l2cap_rx(chan, control, skb, event))
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006303 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006304 }
6305
6306 return 0;
6307
6308drop:
6309 kfree_skb(skb);
6310 return 0;
6311}
6312
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006313static void l2cap_data_channel(struct l2cap_conn *conn, u16 cid,
6314 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006315{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006316 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006317
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03006318 chan = l2cap_get_chan_by_scid(conn, cid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006319 if (!chan) {
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006320 if (cid == L2CAP_CID_A2MP) {
6321 chan = a2mp_channel_create(conn, skb);
6322 if (!chan) {
6323 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006324 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006325 }
6326
6327 l2cap_chan_lock(chan);
6328 } else {
6329 BT_DBG("unknown cid 0x%4.4x", cid);
6330 /* Drop packet and return */
6331 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006332 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006333 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006334 }
6335
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03006336 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006337
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03006338 if (chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006339 goto drop;
6340
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006341 switch (chan->mode) {
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006342 case L2CAP_MODE_BASIC:
6343 /* If socket recv buffers overflows we drop data here
6344 * which is *bad* because L2CAP has to be reliable.
6345 * But we don't have any other choice. L2CAP doesn't
6346 * provide flow control mechanism. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07006347
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006348 if (chan->imtu < skb->len)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006349 goto drop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006350
Gustavo Padovan80b98022012-05-27 22:27:51 -03006351 if (!chan->ops->recv(chan, skb))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006352 goto done;
6353 break;
6354
6355 case L2CAP_MODE_ERTM:
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006356 case L2CAP_MODE_STREAMING:
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006357 l2cap_data_rcv(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006358 goto done;
6359
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006360 default:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006361 BT_DBG("chan %p: bad mode 0x%2.2x", chan, chan->mode);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006362 break;
6363 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006364
6365drop:
6366 kfree_skb(skb);
6367
6368done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006369 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006370}
6371
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006372static void l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm,
6373 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006374{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006375 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006376
Ido Yarivc2287682012-04-20 15:46:07 -03006377 chan = l2cap_global_chan_by_psm(0, psm, conn->src, conn->dst);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006378 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006379 goto drop;
6380
Andrei Emeltchenko5b4ceda2012-02-24 16:35:32 +02006381 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006382
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03006383 if (chan->state != BT_BOUND && chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006384 goto drop;
6385
Vinicius Costa Gomese13e21d2011-06-17 22:46:27 -03006386 if (chan->imtu < skb->len)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006387 goto drop;
6388
Gustavo Padovan80b98022012-05-27 22:27:51 -03006389 if (!chan->ops->recv(chan, skb))
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006390 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006391
6392drop:
6393 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006394}
6395
Marcel Holtmann72f78352013-04-23 00:59:00 -07006396static void l2cap_att_channel(struct l2cap_conn *conn,
Andrei Emeltchenko6810fca2012-05-31 11:18:57 +03006397 struct sk_buff *skb)
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006398{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006399 struct l2cap_chan *chan;
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006400
Johan Hedberg073d1cf2013-04-29 19:35:35 +03006401 chan = l2cap_global_chan_by_scid(0, L2CAP_CID_ATT,
Marcel Holtmann72f78352013-04-23 00:59:00 -07006402 conn->src, conn->dst);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006403 if (!chan)
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006404 goto drop;
6405
Andrei Emeltchenko5b4ceda2012-02-24 16:35:32 +02006406 BT_DBG("chan %p, len %d", chan, skb->len);
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006407
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03006408 if (chan->state != BT_BOUND && chan->state != BT_CONNECTED)
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006409 goto drop;
6410
Vinicius Costa Gomese13e21d2011-06-17 22:46:27 -03006411 if (chan->imtu < skb->len)
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006412 goto drop;
6413
Gustavo Padovan80b98022012-05-27 22:27:51 -03006414 if (!chan->ops->recv(chan, skb))
Andrei Emeltchenko6810fca2012-05-31 11:18:57 +03006415 return;
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006416
6417drop:
6418 kfree_skb(skb);
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006419}
6420
Linus Torvalds1da177e2005-04-16 15:20:36 -07006421static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb)
6422{
6423 struct l2cap_hdr *lh = (void *) skb->data;
Al Viro8e036fc2007-07-29 00:16:36 -07006424 u16 cid, len;
6425 __le16 psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006426
6427 skb_pull(skb, L2CAP_HDR_SIZE);
6428 cid = __le16_to_cpu(lh->cid);
6429 len = __le16_to_cpu(lh->len);
6430
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006431 if (len != skb->len) {
6432 kfree_skb(skb);
6433 return;
6434 }
6435
Linus Torvalds1da177e2005-04-16 15:20:36 -07006436 BT_DBG("len %d, cid 0x%4.4x", len, cid);
6437
6438 switch (cid) {
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02006439 case L2CAP_CID_LE_SIGNALING:
Johan Hedbergc5623552013-04-29 19:35:33 +03006440 l2cap_le_sig_channel(conn, skb);
6441 break;
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006442 case L2CAP_CID_SIGNALING:
Linus Torvalds1da177e2005-04-16 15:20:36 -07006443 l2cap_sig_channel(conn, skb);
6444 break;
6445
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006446 case L2CAP_CID_CONN_LESS:
Andrei Emeltchenko097db762012-03-09 14:16:17 +02006447 psm = get_unaligned((__le16 *) skb->data);
Andrei Emeltchenko0181a702012-05-29 10:04:05 +03006448 skb_pull(skb, L2CAP_PSMLEN_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006449 l2cap_conless_channel(conn, psm, skb);
6450 break;
6451
Johan Hedberg073d1cf2013-04-29 19:35:35 +03006452 case L2CAP_CID_ATT:
Marcel Holtmann72f78352013-04-23 00:59:00 -07006453 l2cap_att_channel(conn, skb);
Gustavo F. Padovan9f69bda2011-04-07 16:40:25 -03006454 break;
6455
Anderson Brigliab501d6a2011-06-07 18:46:31 -03006456 case L2CAP_CID_SMP:
6457 if (smp_sig_channel(conn, skb))
6458 l2cap_conn_del(conn->hcon, EACCES);
6459 break;
6460
Linus Torvalds1da177e2005-04-16 15:20:36 -07006461 default:
6462 l2cap_data_channel(conn, cid, skb);
6463 break;
6464 }
6465}
6466
6467/* ---- L2CAP interface with lower layer (HCI) ---- */
6468
Ulisses Furquim686ebf22011-12-21 10:11:33 -02006469int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006470{
6471 int exact = 0, lm1 = 0, lm2 = 0;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006472 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006473
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03006474 BT_DBG("hdev %s, bdaddr %pMR", hdev->name, bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006475
6476 /* Find listening sockets and check their link_mode */
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006477 read_lock(&chan_list_lock);
6478 list_for_each_entry(c, &chan_list, global_l) {
6479 struct sock *sk = c->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -03006480
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03006481 if (c->state != BT_LISTEN)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006482 continue;
6483
6484 if (!bacmp(&bt_sk(sk)->src, &hdev->bdaddr)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01006485 lm1 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03006486 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01006487 lm1 |= HCI_LM_MASTER;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006488 exact++;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01006489 } else if (!bacmp(&bt_sk(sk)->src, BDADDR_ANY)) {
6490 lm2 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03006491 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01006492 lm2 |= HCI_LM_MASTER;
6493 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006494 }
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006495 read_unlock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006496
6497 return exact ? lm1 : lm2;
6498}
6499
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03006500void l2cap_connect_cfm(struct hci_conn *hcon, u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006501{
Marcel Holtmann01394182006-07-03 10:02:46 +02006502 struct l2cap_conn *conn;
6503
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03006504 BT_DBG("hcon %p bdaddr %pMR status %d", hcon, &hcon->dst, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006505
Linus Torvalds1da177e2005-04-16 15:20:36 -07006506 if (!status) {
Claudio Takahasibaf43252013-04-11 13:55:50 -03006507 conn = l2cap_conn_add(hcon);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006508 if (conn)
6509 l2cap_conn_ready(conn);
Andrei Emeltchenkoba6fc312012-10-31 15:46:26 +02006510 } else {
Joe Perchese1750722011-06-29 18:18:29 -07006511 l2cap_conn_del(hcon, bt_to_errno(status));
Andrei Emeltchenkoba6fc312012-10-31 15:46:26 +02006512 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006513}
6514
Ulisses Furquim686ebf22011-12-21 10:11:33 -02006515int l2cap_disconn_ind(struct hci_conn *hcon)
Marcel Holtmann2950f212009-02-12 14:02:50 +01006516{
6517 struct l2cap_conn *conn = hcon->l2cap_data;
6518
6519 BT_DBG("hcon %p", hcon);
6520
Ulisses Furquim686ebf22011-12-21 10:11:33 -02006521 if (!conn)
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02006522 return HCI_ERROR_REMOTE_USER_TERM;
Marcel Holtmann2950f212009-02-12 14:02:50 +01006523 return conn->disc_reason;
6524}
6525
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03006526void l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006527{
6528 BT_DBG("hcon %p reason %d", hcon, reason);
6529
Joe Perchese1750722011-06-29 18:18:29 -07006530 l2cap_conn_del(hcon, bt_to_errno(reason));
Linus Torvalds1da177e2005-04-16 15:20:36 -07006531}
6532
Gustavo F. Padovan43434782011-04-12 18:31:57 -03006533static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt)
Marcel Holtmannf62e4322009-01-15 21:58:44 +01006534{
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03006535 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED)
Marcel Holtmann255c7602009-02-04 21:07:19 +01006536 return;
6537
Marcel Holtmannf62e4322009-01-15 21:58:44 +01006538 if (encrypt == 0x00) {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03006539 if (chan->sec_level == BT_SECURITY_MEDIUM) {
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08006540 __set_chan_timer(chan, L2CAP_ENC_TIMEOUT);
Gustavo F. Padovan43434782011-04-12 18:31:57 -03006541 } else if (chan->sec_level == BT_SECURITY_HIGH)
Gustavo F. Padovan0f852722011-05-04 19:42:50 -03006542 l2cap_chan_close(chan, ECONNREFUSED);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01006543 } else {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03006544 if (chan->sec_level == BT_SECURITY_MEDIUM)
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -03006545 __clear_chan_timer(chan);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01006546 }
6547}
6548
Ulisses Furquim686ebf22011-12-21 10:11:33 -02006549int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006550{
Marcel Holtmann40be4922008-07-14 20:13:50 +02006551 struct l2cap_conn *conn = hcon->l2cap_data;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006552 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006553
Marcel Holtmann01394182006-07-03 10:02:46 +02006554 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006555 return 0;
Marcel Holtmann01394182006-07-03 10:02:46 +02006556
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03006557 BT_DBG("conn %p status 0x%2.2x encrypt %u", conn, status, encrypt);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006558
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03006559 if (hcon->type == LE_LINK) {
Hemant Gupta35d4adcc2012-04-18 14:46:26 +05306560 if (!status && encrypt)
6561 smp_distribute_keys(conn, 0);
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02006562 cancel_delayed_work(&conn->security_timer);
Vinicius Costa Gomes160dc6a2011-08-19 21:06:55 -03006563 }
6564
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02006565 mutex_lock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006566
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02006567 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006568 l2cap_chan_lock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006569
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03006570 BT_DBG("chan %p scid 0x%4.4x state %s", chan, chan->scid,
6571 state_to_string(chan->state));
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03006572
Andrei Emeltchenko78eb2f92012-07-19 17:03:47 +03006573 if (chan->chan_type == L2CAP_CHAN_CONN_FIX_A2MP) {
6574 l2cap_chan_unlock(chan);
6575 continue;
6576 }
6577
Johan Hedberg073d1cf2013-04-29 19:35:35 +03006578 if (chan->scid == L2CAP_CID_ATT) {
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03006579 if (!status && encrypt) {
6580 chan->sec_level = hcon->sec_level;
Andrei Emeltchenkocf4cd002012-02-06 15:03:59 +02006581 l2cap_chan_ready(chan);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03006582 }
6583
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006584 l2cap_chan_unlock(chan);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03006585 continue;
6586 }
6587
Andrei Emeltchenko96eff462012-11-15 18:14:53 +02006588 if (!__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006589 l2cap_chan_unlock(chan);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01006590 continue;
6591 }
6592
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03006593 if (!status && (chan->state == BT_CONNECTED ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01006594 chan->state == BT_CONFIG)) {
Gustavo Padovana7d77232012-05-13 03:20:07 -03006595 struct sock *sk = chan->sk;
6596
Gustavo Padovanc5daa682012-05-16 12:17:10 -03006597 clear_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
Gustavo Padovana7d77232012-05-13 03:20:07 -03006598 sk->sk_state_change(sk);
6599
Gustavo F. Padovan43434782011-04-12 18:31:57 -03006600 l2cap_check_encryption(chan, encrypt);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006601 l2cap_chan_unlock(chan);
Marcel Holtmann9719f8a2008-07-14 20:13:45 +02006602 continue;
6603 }
6604
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03006605 if (chan->state == BT_CONNECT) {
Marcel Holtmannb1235d72008-07-14 20:13:54 +02006606 if (!status) {
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03006607 l2cap_start_connection(chan);
Marcel Holtmannb1235d72008-07-14 20:13:54 +02006608 } else {
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08006609 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Marcel Holtmannb1235d72008-07-14 20:13:54 +02006610 }
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03006611 } else if (chan->state == BT_CONNECT2) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006612 struct sock *sk = chan->sk;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02006613 struct l2cap_conn_rsp rsp;
Johan Hedbergdf3c3932011-06-14 12:48:19 +03006614 __u16 res, stat;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02006615
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006616 lock_sock(sk);
6617
Marcel Holtmannb1235d72008-07-14 20:13:54 +02006618 if (!status) {
Gustavo Padovanc5daa682012-05-16 12:17:10 -03006619 if (test_bit(BT_SK_DEFER_SETUP,
6620 &bt_sk(sk)->flags)) {
Johan Hedbergdf3c3932011-06-14 12:48:19 +03006621 res = L2CAP_CR_PEND;
6622 stat = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08006623 chan->ops->defer(chan);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03006624 } else {
Andrei Emeltchenko0e587be2012-02-21 12:54:57 +02006625 __l2cap_state_change(chan, BT_CONFIG);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03006626 res = L2CAP_CR_SUCCESS;
6627 stat = L2CAP_CS_NO_INFO;
6628 }
Marcel Holtmannb1235d72008-07-14 20:13:54 +02006629 } else {
Andrei Emeltchenko0e587be2012-02-21 12:54:57 +02006630 __l2cap_state_change(chan, BT_DISCONN);
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08006631 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03006632 res = L2CAP_CR_SEC_BLOCK;
6633 stat = L2CAP_CS_NO_INFO;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02006634 }
6635
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006636 release_sock(sk);
6637
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03006638 rsp.scid = cpu_to_le16(chan->dcid);
6639 rsp.dcid = cpu_to_le16(chan->scid);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03006640 rsp.result = cpu_to_le16(res);
6641 rsp.status = cpu_to_le16(stat);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03006642 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01006643 sizeof(rsp), &rsp);
Mat Martineau2d369352012-05-23 14:59:30 -07006644
6645 if (!test_bit(CONF_REQ_SENT, &chan->conf_state) &&
6646 res == L2CAP_CR_SUCCESS) {
6647 char buf[128];
6648 set_bit(CONF_REQ_SENT, &chan->conf_state);
6649 l2cap_send_cmd(conn, l2cap_get_ident(conn),
6650 L2CAP_CONF_REQ,
6651 l2cap_build_conf_req(chan, buf),
6652 buf);
6653 chan->num_conf_req++;
6654 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006655 }
6656
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006657 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006658 }
6659
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02006660 mutex_unlock(&conn->chan_lock);
Marcel Holtmannb1235d72008-07-14 20:13:54 +02006661
Linus Torvalds1da177e2005-04-16 15:20:36 -07006662 return 0;
6663}
6664
Ulisses Furquim686ebf22011-12-21 10:11:33 -02006665int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006666{
6667 struct l2cap_conn *conn = hcon->l2cap_data;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03006668 struct l2cap_hdr *hdr;
6669 int len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006670
Andrei Emeltchenko1d13a252012-10-15 11:58:41 +03006671 /* For AMP controller do not create l2cap conn */
6672 if (!conn && hcon->hdev->dev_type != HCI_BREDR)
6673 goto drop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006674
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02006675 if (!conn)
Claudio Takahasibaf43252013-04-11 13:55:50 -03006676 conn = l2cap_conn_add(hcon);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02006677
6678 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006679 goto drop;
6680
6681 BT_DBG("conn %p len %d flags 0x%x", conn, skb->len, flags);
6682
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03006683 switch (flags) {
6684 case ACL_START:
6685 case ACL_START_NO_FLUSH:
6686 case ACL_COMPLETE:
Linus Torvalds1da177e2005-04-16 15:20:36 -07006687 if (conn->rx_len) {
6688 BT_ERR("Unexpected start frame (len %d)", skb->len);
6689 kfree_skb(conn->rx_skb);
6690 conn->rx_skb = NULL;
6691 conn->rx_len = 0;
6692 l2cap_conn_unreliable(conn, ECOMM);
6693 }
6694
Andrei Emeltchenkoaae7fe22010-09-15 14:28:43 +03006695 /* Start fragment always begin with Basic L2CAP header */
6696 if (skb->len < L2CAP_HDR_SIZE) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07006697 BT_ERR("Frame is too short (len %d)", skb->len);
6698 l2cap_conn_unreliable(conn, ECOMM);
6699 goto drop;
6700 }
6701
6702 hdr = (struct l2cap_hdr *) skb->data;
6703 len = __le16_to_cpu(hdr->len) + L2CAP_HDR_SIZE;
6704
6705 if (len == skb->len) {
6706 /* Complete frame received */
6707 l2cap_recv_frame(conn, skb);
6708 return 0;
6709 }
6710
6711 BT_DBG("Start: total len %d, frag len %d", len, skb->len);
6712
6713 if (skb->len > len) {
6714 BT_ERR("Frame is too long (len %d, expected len %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01006715 skb->len, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006716 l2cap_conn_unreliable(conn, ECOMM);
6717 goto drop;
6718 }
6719
6720 /* Allocate skb for the complete frame (with header) */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03006721 conn->rx_skb = bt_skb_alloc(len, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03006722 if (!conn->rx_skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006723 goto drop;
6724
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03006725 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01006726 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006727 conn->rx_len = len - skb->len;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03006728 break;
6729
6730 case ACL_CONT:
Linus Torvalds1da177e2005-04-16 15:20:36 -07006731 BT_DBG("Cont: frag len %d (expecting %d)", skb->len, conn->rx_len);
6732
6733 if (!conn->rx_len) {
6734 BT_ERR("Unexpected continuation frame (len %d)", skb->len);
6735 l2cap_conn_unreliable(conn, ECOMM);
6736 goto drop;
6737 }
6738
6739 if (skb->len > conn->rx_len) {
6740 BT_ERR("Fragment is too long (len %d, expected %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01006741 skb->len, conn->rx_len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006742 kfree_skb(conn->rx_skb);
6743 conn->rx_skb = NULL;
6744 conn->rx_len = 0;
6745 l2cap_conn_unreliable(conn, ECOMM);
6746 goto drop;
6747 }
6748
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03006749 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01006750 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006751 conn->rx_len -= skb->len;
6752
6753 if (!conn->rx_len) {
6754 /* Complete frame received */
6755 l2cap_recv_frame(conn, conn->rx_skb);
6756 conn->rx_skb = NULL;
6757 }
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03006758 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006759 }
6760
6761drop:
6762 kfree_skb(skb);
6763 return 0;
6764}
6765
Marcel Holtmannaef7d972010-03-21 05:27:45 +01006766static int l2cap_debugfs_show(struct seq_file *f, void *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006767{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006768 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006769
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02006770 read_lock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006771
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006772 list_for_each_entry(c, &chan_list, global_l) {
6773 struct sock *sk = c->sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006774
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03006775 seq_printf(f, "%pMR %pMR %d %d 0x%4.4x 0x%4.4x %d %d %d %d\n",
6776 &bt_sk(sk)->src, &bt_sk(sk)->dst,
6777 c->state, __le16_to_cpu(c->psm),
6778 c->scid, c->dcid, c->imtu, c->omtu,
6779 c->sec_level, c->mode);
Andrei Emeltchenko61e1b4b2012-01-19 11:19:50 +02006780 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006781
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02006782 read_unlock(&chan_list_lock);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08006783
Marcel Holtmannaef7d972010-03-21 05:27:45 +01006784 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006785}
6786
Marcel Holtmannaef7d972010-03-21 05:27:45 +01006787static int l2cap_debugfs_open(struct inode *inode, struct file *file)
6788{
6789 return single_open(file, l2cap_debugfs_show, inode->i_private);
6790}
6791
6792static const struct file_operations l2cap_debugfs_fops = {
6793 .open = l2cap_debugfs_open,
6794 .read = seq_read,
6795 .llseek = seq_lseek,
6796 .release = single_release,
6797};
6798
6799static struct dentry *l2cap_debugfs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006800
Gustavo F. Padovan64274512011-02-07 20:08:52 -02006801int __init l2cap_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006802{
6803 int err;
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08006804
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02006805 err = l2cap_init_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07006806 if (err < 0)
6807 return err;
6808
Marcel Holtmannaef7d972010-03-21 05:27:45 +01006809 if (bt_debugfs) {
Gustavo Padovan2d792812012-10-06 10:07:01 +01006810 l2cap_debugfs = debugfs_create_file("l2cap", 0444, bt_debugfs,
6811 NULL, &l2cap_debugfs_fops);
Marcel Holtmannaef7d972010-03-21 05:27:45 +01006812 if (!l2cap_debugfs)
6813 BT_ERR("Failed to create L2CAP debug file");
6814 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006815
Linus Torvalds1da177e2005-04-16 15:20:36 -07006816 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006817}
6818
Gustavo F. Padovan64274512011-02-07 20:08:52 -02006819void l2cap_exit(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006820{
Marcel Holtmannaef7d972010-03-21 05:27:45 +01006821 debugfs_remove(l2cap_debugfs);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02006822 l2cap_cleanup_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07006823}
6824
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03006825module_param(disable_ertm, bool, 0644);
6826MODULE_PARM_DESC(disable_ertm, "Disable enhanced retransmission mode");