blob: 514899f7f0d4bfa12b8dcc7424a0379b9a87891c [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>
Daniel Borkmanndbb50882016-07-27 11:40:14 -070035#include <linux/filter.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070036
37#include <net/bluetooth/bluetooth.h>
38#include <net/bluetooth/hci_core.h>
39#include <net/bluetooth/l2cap.h>
Marcel Holtmann7ef9fbf2013-10-10 14:54:14 -070040
Marcel Holtmannac4b7232013-10-10 14:54:16 -070041#include "smp.h"
Marcel Holtmann70247282013-10-10 14:54:15 -070042#include "a2mp.h"
Marcel Holtmann7ef9fbf2013-10-10 14:54:14 -070043#include "amp.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070044
Johan Hedberg0f1bfe42014-01-27 15:11:35 -080045#define LE_FLOWCTL_MAX_CREDITS 65535
46
Mat Martineaud1de6d42012-05-17 20:53:55 -070047bool disable_ertm;
Marcel Holtmannf0709e02007-10-20 13:38:51 +020048
Marcel Holtmann547d1032013-10-12 08:18:19 -070049static u32 l2cap_feat_mask = L2CAP_FEAT_FIXED_CHAN | L2CAP_FEAT_UCD;
Linus Torvalds1da177e2005-04-16 15:20:36 -070050
Johannes Bergb5ad8b72011-06-01 08:54:45 +020051static LIST_HEAD(chan_list);
52static DEFINE_RWLOCK(chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -070053
Linus Torvalds1da177e2005-04-16 15:20:36 -070054static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +010055 u8 code, u8 ident, u16 dlen, void *data);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -030056static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len,
Gustavo Padovan2d792812012-10-06 10:07:01 +010057 void *data);
Ben Serie860d2c2017-09-09 23:15:59 +020058static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data, size_t data_size);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +020059static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err);
Linus Torvalds1da177e2005-04-16 15:20:36 -070060
Gustavo Padovand6603662012-05-21 13:58:22 -030061static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
Gustavo Padovan2d792812012-10-06 10:07:01 +010062 struct sk_buff_head *skbs, u8 event);
Mat Martineau608bcc62012-05-17 20:53:32 -070063
Johan Hedberga250e042015-01-15 13:06:44 +020064static inline u8 bdaddr_type(u8 link_type, u8 bdaddr_type)
Marcel Holtmann4f1654e2013-10-13 08:50:41 -070065{
Johan Hedberga250e042015-01-15 13:06:44 +020066 if (link_type == LE_LINK) {
67 if (bdaddr_type == ADDR_LE_DEV_PUBLIC)
Marcel Holtmann4f1654e2013-10-13 08:50:41 -070068 return BDADDR_LE_PUBLIC;
69 else
70 return BDADDR_LE_RANDOM;
71 }
72
73 return BDADDR_BREDR;
74}
75
Johan Hedberga250e042015-01-15 13:06:44 +020076static inline u8 bdaddr_src_type(struct hci_conn *hcon)
77{
78 return bdaddr_type(hcon->type, hcon->src_type);
79}
80
81static inline u8 bdaddr_dst_type(struct hci_conn *hcon)
82{
83 return bdaddr_type(hcon->type, hcon->dst_type);
84}
85
Marcel Holtmann01394182006-07-03 10:02:46 +020086/* ---- L2CAP channels ---- */
Gustavo F. Padovan71ba0e52011-05-17 14:34:52 -030087
Gustavo Padovan2d792812012-10-06 10:07:01 +010088static struct l2cap_chan *__l2cap_get_chan_by_dcid(struct l2cap_conn *conn,
89 u16 cid)
Marcel Holtmann01394182006-07-03 10:02:46 +020090{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020091 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -030092
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020093 list_for_each_entry(c, &conn->chan_l, list) {
94 if (c->dcid == cid)
95 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +020096 }
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020097 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +020098}
99
Gustavo Padovan2d792812012-10-06 10:07:01 +0100100static struct l2cap_chan *__l2cap_get_chan_by_scid(struct l2cap_conn *conn,
101 u16 cid)
Marcel Holtmann01394182006-07-03 10:02:46 +0200102{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200103 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300104
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200105 list_for_each_entry(c, &conn->chan_l, list) {
106 if (c->scid == cid)
107 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +0200108 }
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200109 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200110}
111
112/* Find channel with given SCID.
Mat Martineauef191ad2012-05-02 09:42:00 -0700113 * Returns locked channel. */
Gustavo Padovan2d792812012-10-06 10:07:01 +0100114static struct l2cap_chan *l2cap_get_chan_by_scid(struct l2cap_conn *conn,
115 u16 cid)
Marcel Holtmann01394182006-07-03 10:02:46 +0200116{
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300117 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300118
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200119 mutex_lock(&conn->chan_lock);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300120 c = __l2cap_get_chan_by_scid(conn, cid);
Mat Martineauef191ad2012-05-02 09:42:00 -0700121 if (c)
122 l2cap_chan_lock(c);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200123 mutex_unlock(&conn->chan_lock);
124
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300125 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +0200126}
127
Mat Martineaub1a130b2012-10-23 15:24:09 -0700128/* Find channel with given DCID.
129 * Returns locked channel.
130 */
131static struct l2cap_chan *l2cap_get_chan_by_dcid(struct l2cap_conn *conn,
132 u16 cid)
133{
134 struct l2cap_chan *c;
135
136 mutex_lock(&conn->chan_lock);
137 c = __l2cap_get_chan_by_dcid(conn, cid);
138 if (c)
139 l2cap_chan_lock(c);
140 mutex_unlock(&conn->chan_lock);
141
142 return c;
143}
144
Gustavo Padovan2d792812012-10-06 10:07:01 +0100145static struct l2cap_chan *__l2cap_get_chan_by_ident(struct l2cap_conn *conn,
146 u8 ident)
Marcel Holtmann01394182006-07-03 10:02:46 +0200147{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200148 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300149
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200150 list_for_each_entry(c, &conn->chan_l, list) {
151 if (c->ident == ident)
152 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +0200153 }
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200154 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200155}
156
Mat Martineau5b155ef2012-10-23 15:24:14 -0700157static struct l2cap_chan *l2cap_get_chan_by_ident(struct l2cap_conn *conn,
158 u8 ident)
159{
160 struct l2cap_chan *c;
161
162 mutex_lock(&conn->chan_lock);
163 c = __l2cap_get_chan_by_ident(conn, ident);
164 if (c)
165 l2cap_chan_lock(c);
166 mutex_unlock(&conn->chan_lock);
167
168 return c;
169}
170
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300171static struct l2cap_chan *__l2cap_global_chan_by_addr(__le16 psm, bdaddr_t *src)
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300172{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300173 struct l2cap_chan *c;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300174
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300175 list_for_each_entry(c, &chan_list, global_l) {
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700176 if (c->sport == psm && !bacmp(&c->src, src))
Szymon Janc250938c2011-11-16 09:32:22 +0100177 return c;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300178 }
Szymon Janc250938c2011-11-16 09:32:22 +0100179 return NULL;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300180}
181
182int l2cap_add_psm(struct l2cap_chan *chan, bdaddr_t *src, __le16 psm)
183{
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300184 int err;
185
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200186 write_lock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300187
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300188 if (psm && __l2cap_global_chan_by_addr(psm, src)) {
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300189 err = -EADDRINUSE;
190 goto done;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300191 }
192
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300193 if (psm) {
194 chan->psm = psm;
195 chan->sport = psm;
196 err = 0;
197 } else {
Johan Hedberg92594a52016-01-26 17:19:10 -0500198 u16 p, start, end, incr;
199
200 if (chan->src_type == BDADDR_BREDR) {
201 start = L2CAP_PSM_DYN_START;
202 end = L2CAP_PSM_AUTO_END;
203 incr = 2;
204 } else {
205 start = L2CAP_PSM_LE_DYN_START;
206 end = L2CAP_PSM_LE_DYN_END;
207 incr = 1;
208 }
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300209
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300210 err = -EINVAL;
Johan Hedberg92594a52016-01-26 17:19:10 -0500211 for (p = start; p <= end; p += incr)
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300212 if (!__l2cap_global_chan_by_addr(cpu_to_le16(p), src)) {
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300213 chan->psm = cpu_to_le16(p);
214 chan->sport = cpu_to_le16(p);
215 err = 0;
216 break;
217 }
218 }
219
220done:
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200221 write_unlock(&chan_list_lock);
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300222 return err;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300223}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300224EXPORT_SYMBOL_GPL(l2cap_add_psm);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300225
226int l2cap_add_scid(struct l2cap_chan *chan, __u16 scid)
227{
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200228 write_lock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300229
Johan Hedberg14824302014-08-07 22:56:50 +0300230 /* Override the defaults (which are for conn-oriented) */
231 chan->omtu = L2CAP_DEFAULT_MTU;
232 chan->chan_type = L2CAP_CHAN_FIXED;
233
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300234 chan->scid = scid;
235
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200236 write_unlock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300237
238 return 0;
239}
240
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300241static u16 l2cap_alloc_cid(struct l2cap_conn *conn)
Marcel Holtmann01394182006-07-03 10:02:46 +0200242{
Johan Hedberge77af752013-10-08 10:31:00 +0200243 u16 cid, dyn_end;
Marcel Holtmann01394182006-07-03 10:02:46 +0200244
Johan Hedberge77af752013-10-08 10:31:00 +0200245 if (conn->hcon->type == LE_LINK)
246 dyn_end = L2CAP_CID_LE_DYN_END;
247 else
248 dyn_end = L2CAP_CID_DYN_END;
249
Johan Hedbergab0c1272015-11-02 14:39:16 +0200250 for (cid = L2CAP_CID_DYN_START; cid <= dyn_end; cid++) {
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300251 if (!__l2cap_get_chan_by_scid(conn, cid))
Marcel Holtmann01394182006-07-03 10:02:46 +0200252 return cid;
253 }
254
255 return 0;
256}
257
Gustavo Padovanf93fa272013-10-21 14:21:40 -0200258static void l2cap_state_change(struct l2cap_chan *chan, int state)
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300259{
Andrei Emeltchenko42d2d872012-02-17 11:40:57 +0200260 BT_DBG("chan %p %s -> %s", chan, state_to_string(chan->state),
Gustavo Padovan2d792812012-10-06 10:07:01 +0100261 state_to_string(state));
Gustavo F. Padovanbadaaa02011-11-23 20:11:46 -0200262
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300263 chan->state = state;
Gustavo Padovan53f52122013-10-15 19:24:45 -0300264 chan->ops->state_change(chan, state, 0);
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300265}
266
Gustavo Padovanf8e73012013-10-15 19:24:46 -0300267static inline void l2cap_state_change_and_error(struct l2cap_chan *chan,
268 int state, int err)
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +0200269{
Gustavo Padovanf8e73012013-10-15 19:24:46 -0300270 chan->state = state;
Gustavo Padovan53f52122013-10-15 19:24:45 -0300271 chan->ops->state_change(chan, chan->state, err);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +0200272}
273
274static inline void l2cap_chan_set_err(struct l2cap_chan *chan, int err)
275{
Gustavo Padovanf8e73012013-10-15 19:24:46 -0300276 chan->ops->state_change(chan, chan->state, err);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +0200277}
278
Mat Martineau4239d162012-05-17 20:53:49 -0700279static void __set_retrans_timer(struct l2cap_chan *chan)
280{
281 if (!delayed_work_pending(&chan->monitor_timer) &&
282 chan->retrans_timeout) {
283 l2cap_set_timer(chan, &chan->retrans_timer,
284 msecs_to_jiffies(chan->retrans_timeout));
285 }
286}
287
288static void __set_monitor_timer(struct l2cap_chan *chan)
289{
290 __clear_retrans_timer(chan);
291 if (chan->monitor_timeout) {
292 l2cap_set_timer(chan, &chan->monitor_timer,
293 msecs_to_jiffies(chan->monitor_timeout));
294 }
295}
296
Mat Martineau608bcc62012-05-17 20:53:32 -0700297static struct sk_buff *l2cap_ertm_seq_in_queue(struct sk_buff_head *head,
298 u16 seq)
299{
300 struct sk_buff *skb;
301
302 skb_queue_walk(head, skb) {
Johan Hedberga4368ff2015-03-30 23:21:01 +0300303 if (bt_cb(skb)->l2cap.txseq == seq)
Mat Martineau608bcc62012-05-17 20:53:32 -0700304 return skb;
305 }
306
307 return NULL;
308}
309
Mat Martineau3c588192012-04-11 10:48:42 -0700310/* ---- L2CAP sequence number lists ---- */
311
312/* For ERTM, ordered lists of sequence numbers must be tracked for
313 * SREJ requests that are received and for frames that are to be
314 * retransmitted. These seq_list functions implement a singly-linked
315 * list in an array, where membership in the list can also be checked
316 * in constant time. Items can also be added to the tail of the list
317 * and removed from the head in constant time, without further memory
318 * allocs or frees.
319 */
320
321static int l2cap_seq_list_init(struct l2cap_seq_list *seq_list, u16 size)
322{
323 size_t alloc_size, i;
324
325 /* Allocated size is a power of 2 to map sequence numbers
326 * (which may be up to 14 bits) in to a smaller array that is
327 * sized for the negotiated ERTM transmit windows.
328 */
329 alloc_size = roundup_pow_of_two(size);
330
Kees Cook6da2ec52018-06-12 13:55:00 -0700331 seq_list->list = kmalloc_array(alloc_size, sizeof(u16), GFP_KERNEL);
Mat Martineau3c588192012-04-11 10:48:42 -0700332 if (!seq_list->list)
333 return -ENOMEM;
334
335 seq_list->mask = alloc_size - 1;
336 seq_list->head = L2CAP_SEQ_LIST_CLEAR;
337 seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
338 for (i = 0; i < alloc_size; i++)
339 seq_list->list[i] = L2CAP_SEQ_LIST_CLEAR;
340
341 return 0;
342}
343
344static inline void l2cap_seq_list_free(struct l2cap_seq_list *seq_list)
345{
346 kfree(seq_list->list);
347}
348
349static inline bool l2cap_seq_list_contains(struct l2cap_seq_list *seq_list,
350 u16 seq)
351{
352 /* Constant-time check for list membership */
353 return seq_list->list[seq & seq_list->mask] != L2CAP_SEQ_LIST_CLEAR;
354}
355
Mat Martineau3c588192012-04-11 10:48:42 -0700356static inline u16 l2cap_seq_list_pop(struct l2cap_seq_list *seq_list)
357{
Johan Hedberg03a0c5d2014-01-18 21:32:59 +0200358 u16 seq = seq_list->head;
359 u16 mask = seq_list->mask;
360
361 seq_list->head = seq_list->list[seq & mask];
362 seq_list->list[seq & mask] = L2CAP_SEQ_LIST_CLEAR;
363
364 if (seq_list->head == L2CAP_SEQ_LIST_TAIL) {
365 seq_list->head = L2CAP_SEQ_LIST_CLEAR;
366 seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
367 }
368
369 return seq;
Mat Martineau3c588192012-04-11 10:48:42 -0700370}
371
372static void l2cap_seq_list_clear(struct l2cap_seq_list *seq_list)
373{
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300374 u16 i;
Mat Martineau3c588192012-04-11 10:48:42 -0700375
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300376 if (seq_list->head == L2CAP_SEQ_LIST_CLEAR)
377 return;
378
379 for (i = 0; i <= seq_list->mask; i++)
380 seq_list->list[i] = L2CAP_SEQ_LIST_CLEAR;
381
382 seq_list->head = L2CAP_SEQ_LIST_CLEAR;
383 seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
Mat Martineau3c588192012-04-11 10:48:42 -0700384}
385
386static void l2cap_seq_list_append(struct l2cap_seq_list *seq_list, u16 seq)
387{
388 u16 mask = seq_list->mask;
389
390 /* All appends happen in constant time */
391
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300392 if (seq_list->list[seq & mask] != L2CAP_SEQ_LIST_CLEAR)
393 return;
Mat Martineau3c588192012-04-11 10:48:42 -0700394
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300395 if (seq_list->tail == L2CAP_SEQ_LIST_CLEAR)
396 seq_list->head = seq;
397 else
398 seq_list->list[seq_list->tail & mask] = seq;
399
400 seq_list->tail = seq;
401 seq_list->list[seq & mask] = L2CAP_SEQ_LIST_TAIL;
Mat Martineau3c588192012-04-11 10:48:42 -0700402}
403
Gustavo F. Padovan721c4182011-06-23 19:29:58 -0300404static void l2cap_chan_timeout(struct work_struct *work)
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300405{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -0300406 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100407 chan_timer.work);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200408 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300409 int reason;
410
Andrei Emeltchenkoe05dcc32012-02-17 11:40:56 +0200411 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300412
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200413 mutex_lock(&conn->chan_lock);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200414 l2cap_chan_lock(chan);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300415
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300416 if (chan->state == BT_CONNECTED || chan->state == BT_CONFIG)
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300417 reason = ECONNREFUSED;
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300418 else if (chan->state == BT_CONNECT &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100419 chan->sec_level != BT_SECURITY_SDP)
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300420 reason = ECONNREFUSED;
421 else
422 reason = ETIMEDOUT;
423
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300424 l2cap_chan_close(chan, reason);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300425
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200426 l2cap_chan_unlock(chan);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300427
Gustavo Padovan80b98022012-05-27 22:27:51 -0300428 chan->ops->close(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200429 mutex_unlock(&conn->chan_lock);
430
Ulisses Furquim371fd832011-12-21 20:02:36 -0200431 l2cap_chan_put(chan);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300432}
433
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -0300434struct l2cap_chan *l2cap_chan_create(void)
Marcel Holtmann01394182006-07-03 10:02:46 +0200435{
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300436 struct l2cap_chan *chan;
Marcel Holtmann01394182006-07-03 10:02:46 +0200437
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300438 chan = kzalloc(sizeof(*chan), GFP_ATOMIC);
439 if (!chan)
440 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200441
Andrei Emeltchenkoc03b3552012-02-21 12:54:56 +0200442 mutex_init(&chan->lock);
443
Johan Hedbergff714112014-11-13 09:46:04 +0200444 /* Set default lock nesting level */
445 atomic_set(&chan->nesting, L2CAP_NESTING_NORMAL);
446
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200447 write_lock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300448 list_add(&chan->global_l, &chan_list);
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200449 write_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300450
Gustavo F. Padovan721c4182011-06-23 19:29:58 -0300451 INIT_DELAYED_WORK(&chan->chan_timer, l2cap_chan_timeout);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300452
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300453 chan->state = BT_OPEN;
454
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530455 kref_init(&chan->kref);
Gustavo F. Padovan71ba0e52011-05-17 14:34:52 -0300456
Mat Martineau28270112012-05-17 21:14:09 -0700457 /* This flag is cleared in l2cap_chan_ready() */
458 set_bit(CONF_NOT_COMPLETE, &chan->conf_state);
459
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -0300460 BT_DBG("chan %p", chan);
Szymon Jancabc545b2011-11-03 16:05:44 +0100461
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300462 return chan;
Marcel Holtmann01394182006-07-03 10:02:46 +0200463}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300464EXPORT_SYMBOL_GPL(l2cap_chan_create);
Marcel Holtmann01394182006-07-03 10:02:46 +0200465
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530466static void l2cap_chan_destroy(struct kref *kref)
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300467{
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530468 struct l2cap_chan *chan = container_of(kref, struct l2cap_chan, kref);
469
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +0530470 BT_DBG("chan %p", chan);
471
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200472 write_lock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300473 list_del(&chan->global_l);
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200474 write_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300475
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +0530476 kfree(chan);
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300477}
478
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530479void l2cap_chan_hold(struct l2cap_chan *c)
480{
Peter Zijlstra2c935bc2016-11-14 17:29:48 +0100481 BT_DBG("chan %p orig refcnt %d", c, kref_read(&c->kref));
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530482
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530483 kref_get(&c->kref);
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530484}
485
486void l2cap_chan_put(struct l2cap_chan *c)
487{
Peter Zijlstra2c935bc2016-11-14 17:29:48 +0100488 BT_DBG("chan %p orig refcnt %d", c, kref_read(&c->kref));
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530489
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530490 kref_put(&c->kref, l2cap_chan_destroy);
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530491}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300492EXPORT_SYMBOL_GPL(l2cap_chan_put);
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530493
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300494void l2cap_chan_set_defaults(struct l2cap_chan *chan)
495{
496 chan->fcs = L2CAP_FCS_CRC16;
497 chan->max_tx = L2CAP_DEFAULT_MAX_TX;
498 chan->tx_win = L2CAP_DEFAULT_TX_WINDOW;
499 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
Jukka Rissanen6a5e8162014-05-28 14:43:04 +0300500 chan->remote_max_tx = chan->max_tx;
501 chan->remote_tx_win = chan->tx_win;
Mat Martineauc20f8e32012-07-10 05:47:07 -0700502 chan->ack_win = L2CAP_DEFAULT_TX_WINDOW;
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300503 chan->sec_level = BT_SECURITY_LOW;
Jukka Rissanen6a5e8162014-05-28 14:43:04 +0300504 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
505 chan->retrans_timeout = L2CAP_DEFAULT_RETRANS_TO;
506 chan->monitor_timeout = L2CAP_DEFAULT_MONITOR_TO;
507 chan->conf_state = 0;
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300508
509 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
510}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300511EXPORT_SYMBOL_GPL(l2cap_chan_set_defaults);
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300512
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200513static void l2cap_le_flowctl_init(struct l2cap_chan *chan)
Johan Hedberg38319712013-05-17 12:49:23 +0300514{
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200515 chan->sdu = NULL;
516 chan->sdu_last_frag = NULL;
517 chan->sdu_len = 0;
Johan Hedberg0cd75f72013-05-17 13:09:05 +0300518 chan->tx_credits = 0;
Luiz Augusto von Dentzfe149312018-09-04 13:39:20 +0300519 /* Derive MPS from connection MTU to stop HCI fragmentation */
520 chan->mps = min_t(u16, chan->imtu, chan->conn->mtu - L2CAP_HDR_SIZE);
Luiz Augusto von Dentz96cd8ea2018-09-04 13:39:21 +0300521 /* Give enough credits for a full packet */
522 chan->rx_credits = (chan->imtu / chan->mps) + 1;
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200523
524 skb_queue_head_init(&chan->tx_q);
Johan Hedberg38319712013-05-17 12:49:23 +0300525}
526
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +0300527void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
Marcel Holtmann01394182006-07-03 10:02:46 +0200528{
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -0300529 BT_DBG("conn %p, psm 0x%2.2x, dcid 0x%4.4x", conn,
Andrei Emeltchenko097db762012-03-09 14:16:17 +0200530 __le16_to_cpu(chan->psm), chan->dcid);
Marcel Holtmann01394182006-07-03 10:02:46 +0200531
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +0200532 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
Marcel Holtmann2950f212009-02-12 14:02:50 +0100533
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300534 chan->conn = conn;
Marcel Holtmann01394182006-07-03 10:02:46 +0200535
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200536 switch (chan->chan_type) {
537 case L2CAP_CHAN_CONN_ORIENTED:
Johan Hedberg21626e62014-01-24 10:35:41 +0200538 /* Alloc CID for connection-oriented socket */
539 chan->scid = l2cap_alloc_cid(conn);
540 if (conn->hcon->type == ACL_LINK)
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300541 chan->omtu = L2CAP_DEFAULT_MTU;
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200542 break;
543
544 case L2CAP_CHAN_CONN_LESS:
Marcel Holtmann01394182006-07-03 10:02:46 +0200545 /* Connectionless socket */
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300546 chan->scid = L2CAP_CID_CONN_LESS;
547 chan->dcid = L2CAP_CID_CONN_LESS;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300548 chan->omtu = L2CAP_DEFAULT_MTU;
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200549 break;
550
Johan Hedberg2338a7e2014-01-24 10:35:40 +0200551 case L2CAP_CHAN_FIXED:
552 /* Caller will set CID and CID specific MTU values */
Andrei Emeltchenko416fa752012-05-29 13:59:16 +0300553 break;
554
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200555 default:
Marcel Holtmann01394182006-07-03 10:02:46 +0200556 /* Raw socket can send/recv signalling messages only */
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300557 chan->scid = L2CAP_CID_SIGNALING;
558 chan->dcid = L2CAP_CID_SIGNALING;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300559 chan->omtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann01394182006-07-03 10:02:46 +0200560 }
561
Andrei Emeltchenko8f7975b2011-10-13 16:18:54 +0300562 chan->local_id = L2CAP_BESTEFFORT_ID;
563 chan->local_stype = L2CAP_SERV_BESTEFFORT;
564 chan->local_msdu = L2CAP_DEFAULT_MAX_SDU_SIZE;
565 chan->local_sdu_itime = L2CAP_DEFAULT_SDU_ITIME;
566 chan->local_acc_lat = L2CAP_DEFAULT_ACC_LAT;
Andrei Emeltchenko8936fa62012-10-08 11:14:41 +0300567 chan->local_flush_to = L2CAP_EFS_DEFAULT_FLUSH_TO;
Andrei Emeltchenko8f7975b2011-10-13 16:18:54 +0300568
Ulisses Furquim371fd832011-12-21 20:02:36 -0200569 l2cap_chan_hold(chan);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300570
Johan Hedbergc16900c2014-08-15 21:17:06 +0300571 /* Only keep a reference for fixed channels if they requested it */
572 if (chan->chan_type != L2CAP_CHAN_FIXED ||
573 test_bit(FLAG_HOLD_HCI_CONN, &chan->flags))
574 hci_conn_hold(conn->hcon);
Johan Hedberg5ee98912013-04-29 19:35:43 +0300575
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200576 list_add(&chan->list, &conn->chan_l);
Andrei Emeltchenko643162a2012-02-22 17:11:55 +0200577}
578
Andrei Emeltchenko466f8002012-05-29 13:59:01 +0300579void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
Andrei Emeltchenko643162a2012-02-22 17:11:55 +0200580{
581 mutex_lock(&conn->chan_lock);
582 __l2cap_chan_add(conn, chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200583 mutex_unlock(&conn->chan_lock);
Marcel Holtmann01394182006-07-03 10:02:46 +0200584}
585
Andrei Emeltchenko466f8002012-05-29 13:59:01 +0300586void l2cap_chan_del(struct l2cap_chan *chan, int err)
Marcel Holtmann01394182006-07-03 10:02:46 +0200587{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300588 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann01394182006-07-03 10:02:46 +0200589
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -0300590 __clear_chan_timer(chan);
Marcel Holtmann01394182006-07-03 10:02:46 +0200591
Johan Hedberg49d11742014-11-13 14:37:50 +0200592 BT_DBG("chan %p, conn %p, err %d, state %s", chan, conn, err,
593 state_to_string(chan->state));
Marcel Holtmann01394182006-07-03 10:02:46 +0200594
Johan Hedberg72847ce2014-08-08 09:28:03 +0300595 chan->ops->teardown(chan, err);
596
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900597 if (conn) {
Andrei Emeltchenko56f60982012-10-15 11:58:44 +0300598 struct amp_mgr *mgr = conn->hcon->amp_mgr;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300599 /* Delete from channel list */
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200600 list_del(&chan->list);
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -0200601
Ulisses Furquim371fd832011-12-21 20:02:36 -0200602 l2cap_chan_put(chan);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300603
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300604 chan->conn = NULL;
Andrei Emeltchenko3cabbfd2012-05-31 11:01:37 +0300605
Johan Hedbergc16900c2014-08-15 21:17:06 +0300606 /* Reference was only held for non-fixed channels or
607 * fixed channels that explicitly requested it using the
608 * FLAG_HOLD_HCI_CONN flag.
609 */
610 if (chan->chan_type != L2CAP_CHAN_FIXED ||
611 test_bit(FLAG_HOLD_HCI_CONN, &chan->flags))
David Herrmann76a68ba2013-04-06 20:28:37 +0200612 hci_conn_drop(conn->hcon);
Andrei Emeltchenko56f60982012-10-15 11:58:44 +0300613
614 if (mgr && mgr->bredr_chan == chan)
615 mgr->bredr_chan = NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200616 }
617
Andrei Emeltchenko419e08c2012-10-31 15:46:34 +0200618 if (chan->hs_hchan) {
619 struct hci_chan *hs_hchan = chan->hs_hchan;
620
621 BT_DBG("chan %p disconnect hs_hchan %p", chan, hs_hchan);
622 amp_disconnect_logical_link(hs_hchan);
623 }
624
Mat Martineau28270112012-05-17 21:14:09 -0700625 if (test_bit(CONF_NOT_COMPLETE, &chan->conf_state))
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300626 return;
Gustavo F. Padovan2ead70b2011-04-01 15:13:36 -0300627
Gustavo Padovanee556f62012-05-18 20:22:38 -0300628 switch(chan->mode) {
629 case L2CAP_MODE_BASIC:
630 break;
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300631
Johan Hedberg38319712013-05-17 12:49:23 +0300632 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedberg177f8f22013-05-31 17:54:51 +0300633 skb_queue_purge(&chan->tx_q);
Johan Hedberg38319712013-05-17 12:49:23 +0300634 break;
635
Gustavo Padovanee556f62012-05-18 20:22:38 -0300636 case L2CAP_MODE_ERTM:
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -0300637 __clear_retrans_timer(chan);
638 __clear_monitor_timer(chan);
639 __clear_ack_timer(chan);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300640
Gustavo F. Padovanf1c67752011-03-25 20:36:10 -0300641 skb_queue_purge(&chan->srej_q);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300642
Mat Martineau3c588192012-04-11 10:48:42 -0700643 l2cap_seq_list_free(&chan->srej_list);
644 l2cap_seq_list_free(&chan->retrans_list);
Gustavo Padovanee556f62012-05-18 20:22:38 -0300645
646 /* fall through */
647
648 case L2CAP_MODE_STREAMING:
649 skb_queue_purge(&chan->tx_q);
650 break;
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300651 }
Gustavo Padovanee556f62012-05-18 20:22:38 -0300652
653 return;
Marcel Holtmann01394182006-07-03 10:02:46 +0200654}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300655EXPORT_SYMBOL_GPL(l2cap_chan_del);
Marcel Holtmann01394182006-07-03 10:02:46 +0200656
Johan Hedbergf3d82d02014-09-05 22:19:50 +0300657static void l2cap_conn_update_id_addr(struct work_struct *work)
Johan Hedberg387a33e2014-02-18 21:41:33 +0200658{
Johan Hedbergf3d82d02014-09-05 22:19:50 +0300659 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
660 id_addr_update_work);
661 struct hci_conn *hcon = conn->hcon;
Johan Hedberg387a33e2014-02-18 21:41:33 +0200662 struct l2cap_chan *chan;
663
664 mutex_lock(&conn->chan_lock);
665
666 list_for_each_entry(chan, &conn->chan_l, list) {
667 l2cap_chan_lock(chan);
668 bacpy(&chan->dst, &hcon->dst);
Johan Hedberga250e042015-01-15 13:06:44 +0200669 chan->dst_type = bdaddr_dst_type(hcon);
Johan Hedberg387a33e2014-02-18 21:41:33 +0200670 l2cap_chan_unlock(chan);
671 }
672
673 mutex_unlock(&conn->chan_lock);
674}
675
Johan Hedberg27e2d4c2013-05-14 13:27:21 +0300676static void l2cap_chan_le_connect_reject(struct l2cap_chan *chan)
677{
678 struct l2cap_conn *conn = chan->conn;
679 struct l2cap_le_conn_rsp rsp;
680 u16 result;
681
682 if (test_bit(FLAG_DEFER_SETUP, &chan->flags))
683 result = L2CAP_CR_AUTHORIZATION;
684 else
685 result = L2CAP_CR_BAD_PSM;
686
687 l2cap_state_change(chan, BT_DISCONN);
688
689 rsp.dcid = cpu_to_le16(chan->scid);
690 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +0200691 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +0300692 rsp.credits = cpu_to_le16(chan->rx_credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +0300693 rsp.result = cpu_to_le16(result);
694
695 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp),
696 &rsp);
697}
698
Johan Hedberg791d60f2013-05-14 22:24:44 +0300699static void l2cap_chan_connect_reject(struct l2cap_chan *chan)
700{
701 struct l2cap_conn *conn = chan->conn;
702 struct l2cap_conn_rsp rsp;
703 u16 result;
704
705 if (test_bit(FLAG_DEFER_SETUP, &chan->flags))
706 result = L2CAP_CR_SEC_BLOCK;
707 else
708 result = L2CAP_CR_BAD_PSM;
709
710 l2cap_state_change(chan, BT_DISCONN);
711
712 rsp.scid = cpu_to_le16(chan->dcid);
713 rsp.dcid = cpu_to_le16(chan->scid);
714 rsp.result = cpu_to_le16(result);
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700715 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Johan Hedberg791d60f2013-05-14 22:24:44 +0300716
717 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, sizeof(rsp), &rsp);
718}
719
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300720void l2cap_chan_close(struct l2cap_chan *chan, int reason)
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300721{
722 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300723
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700724 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300725
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300726 switch (chan->state) {
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300727 case BT_LISTEN:
Gustavo Padovanb699ec02012-10-06 11:51:54 +0100728 chan->ops->teardown(chan, 0);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300729 break;
730
731 case BT_CONNECTED:
732 case BT_CONFIG:
Johan Hedberg7b25c9b2014-01-28 15:28:04 -0800733 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED) {
Gustavo Padovan8d836d72013-10-15 19:24:47 -0300734 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +0200735 l2cap_send_disconn_req(chan, reason);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300736 } else
737 l2cap_chan_del(chan, reason);
738 break;
739
740 case BT_CONNECT2:
Johan Hedberg791d60f2013-05-14 22:24:44 +0300741 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED) {
742 if (conn->hcon->type == ACL_LINK)
743 l2cap_chan_connect_reject(chan);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +0300744 else if (conn->hcon->type == LE_LINK)
745 l2cap_chan_le_connect_reject(chan);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300746 }
747
748 l2cap_chan_del(chan, reason);
749 break;
750
751 case BT_CONNECT:
752 case BT_DISCONN:
753 l2cap_chan_del(chan, reason);
754 break;
755
756 default:
Gustavo Padovanb699ec02012-10-06 11:51:54 +0100757 chan->ops->teardown(chan, 0);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300758 break;
759 }
760}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300761EXPORT_SYMBOL(l2cap_chan_close);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300762
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300763static inline u8 l2cap_get_auth_type(struct l2cap_chan *chan)
Johan Hedberg8556edd32011-01-19 12:06:50 +0530764{
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700765 switch (chan->chan_type) {
766 case L2CAP_CHAN_RAW:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300767 switch (chan->sec_level) {
Johan Hedberg8556edd32011-01-19 12:06:50 +0530768 case BT_SECURITY_HIGH:
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800769 case BT_SECURITY_FIPS:
Johan Hedberg8556edd32011-01-19 12:06:50 +0530770 return HCI_AT_DEDICATED_BONDING_MITM;
771 case BT_SECURITY_MEDIUM:
772 return HCI_AT_DEDICATED_BONDING;
773 default:
774 return HCI_AT_NO_BONDING;
775 }
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700776 break;
Marcel Holtmann3124b842013-10-12 07:19:32 -0700777 case L2CAP_CHAN_CONN_LESS:
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700778 if (chan->psm == cpu_to_le16(L2CAP_PSM_3DSP)) {
Marcel Holtmann3124b842013-10-12 07:19:32 -0700779 if (chan->sec_level == BT_SECURITY_LOW)
780 chan->sec_level = BT_SECURITY_SDP;
781 }
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800782 if (chan->sec_level == BT_SECURITY_HIGH ||
783 chan->sec_level == BT_SECURITY_FIPS)
Marcel Holtmann3124b842013-10-12 07:19:32 -0700784 return HCI_AT_NO_BONDING_MITM;
785 else
786 return HCI_AT_NO_BONDING;
787 break;
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700788 case L2CAP_CHAN_CONN_ORIENTED:
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700789 if (chan->psm == cpu_to_le16(L2CAP_PSM_SDP)) {
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700790 if (chan->sec_level == BT_SECURITY_LOW)
791 chan->sec_level = BT_SECURITY_SDP;
Johan Hedberg8556edd32011-01-19 12:06:50 +0530792
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800793 if (chan->sec_level == BT_SECURITY_HIGH ||
794 chan->sec_level == BT_SECURITY_FIPS)
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700795 return HCI_AT_NO_BONDING_MITM;
796 else
797 return HCI_AT_NO_BONDING;
798 }
799 /* fall through */
800 default:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300801 switch (chan->sec_level) {
Johan Hedberg8556edd32011-01-19 12:06:50 +0530802 case BT_SECURITY_HIGH:
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800803 case BT_SECURITY_FIPS:
Johan Hedberg8556edd32011-01-19 12:06:50 +0530804 return HCI_AT_GENERAL_BONDING_MITM;
805 case BT_SECURITY_MEDIUM:
806 return HCI_AT_GENERAL_BONDING;
807 default:
808 return HCI_AT_NO_BONDING;
809 }
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700810 break;
Johan Hedberg8556edd32011-01-19 12:06:50 +0530811 }
812}
813
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200814/* Service level security */
Johan Hedberge7cafc42014-07-17 15:35:38 +0300815int l2cap_chan_check_security(struct l2cap_chan *chan, bool initiator)
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200816{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300817 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100818 __u8 auth_type;
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200819
Johan Hedberga17de2f2013-05-14 13:25:37 +0300820 if (conn->hcon->type == LE_LINK)
821 return smp_conn_security(conn->hcon, chan->sec_level);
822
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300823 auth_type = l2cap_get_auth_type(chan);
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100824
Johan Hedberge7cafc42014-07-17 15:35:38 +0300825 return hci_conn_security(conn->hcon, chan->sec_level, auth_type,
826 initiator);
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200827}
828
Johannes Bergb5ad8b72011-06-01 08:54:45 +0200829static u8 l2cap_get_ident(struct l2cap_conn *conn)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200830{
831 u8 id;
832
833 /* Get next available identificator.
834 * 1 - 128 are used by kernel.
835 * 129 - 199 are reserved.
836 * 200 - 254 are used by utilities like l2ping, etc.
837 */
838
Marcel Holtmann5a54e7c2014-07-13 20:50:15 +0200839 mutex_lock(&conn->ident_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200840
841 if (++conn->tx_ident > 128)
842 conn->tx_ident = 1;
843
844 id = conn->tx_ident;
845
Marcel Holtmann5a54e7c2014-07-13 20:50:15 +0200846 mutex_unlock(&conn->ident_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200847
848 return id;
849}
850
Gustavo Padovan2d792812012-10-06 10:07:01 +0100851static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len,
852 void *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200853{
854 struct sk_buff *skb = l2cap_build_cmd(conn, code, ident, len, data);
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +0200855 u8 flags;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200856
857 BT_DBG("code 0x%2.2x", code);
858
859 if (!skb)
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -0300860 return;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200861
Steven Walterf6af6752014-11-19 09:41:17 -0500862 /* Use NO_FLUSH if supported or we have an LE link (which does
863 * not support auto-flushing packets) */
864 if (lmp_no_flush_capable(conn->hcon->hdev) ||
865 conn->hcon->type == LE_LINK)
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +0200866 flags = ACL_START_NO_FLUSH;
867 else
868 flags = ACL_START;
869
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700870 bt_cb(skb)->force_active = BT_POWER_FORCE_ACTIVE_ON;
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +0200871 skb->priority = HCI_PRIO_MAX;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700872
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200873 hci_send_acl(conn->hchan, skb, flags);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200874}
875
Mat Martineau02b0fbb2012-10-23 15:24:10 -0700876static bool __chan_is_moving(struct l2cap_chan *chan)
877{
878 return chan->move_state != L2CAP_MOVE_STABLE &&
879 chan->move_state != L2CAP_MOVE_WAIT_PREPARE;
880}
881
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200882static void l2cap_do_send(struct l2cap_chan *chan, struct sk_buff *skb)
883{
884 struct hci_conn *hcon = chan->conn->hcon;
885 u16 flags;
886
887 BT_DBG("chan %p, skb %p len %d priority %u", chan, skb, skb->len,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100888 skb->priority);
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200889
Mat Martineaud5f8a752012-10-23 15:24:18 -0700890 if (chan->hs_hcon && !__chan_is_moving(chan)) {
891 if (chan->hs_hchan)
892 hci_send_acl(chan->hs_hchan, skb, ACL_COMPLETE);
893 else
894 kfree_skb(skb);
895
896 return;
897 }
898
Steven Walterf6af6752014-11-19 09:41:17 -0500899 /* Use NO_FLUSH for LE links (where this is the only option) or
900 * if the BR/EDR link supports it and flushing has not been
901 * explicitly requested (through FLAG_FLUSHABLE).
902 */
903 if (hcon->type == LE_LINK ||
904 (!test_bit(FLAG_FLUSHABLE, &chan->flags) &&
905 lmp_no_flush_capable(hcon->hdev)))
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200906 flags = ACL_START_NO_FLUSH;
907 else
908 flags = ACL_START;
909
910 bt_cb(skb)->force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
911 hci_send_acl(chan->conn->hchan, skb, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700912}
913
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700914static void __unpack_enhanced_control(u16 enh, struct l2cap_ctrl *control)
915{
916 control->reqseq = (enh & L2CAP_CTRL_REQSEQ) >> L2CAP_CTRL_REQSEQ_SHIFT;
917 control->final = (enh & L2CAP_CTRL_FINAL) >> L2CAP_CTRL_FINAL_SHIFT;
918
919 if (enh & L2CAP_CTRL_FRAME_TYPE) {
920 /* S-Frame */
921 control->sframe = 1;
922 control->poll = (enh & L2CAP_CTRL_POLL) >> L2CAP_CTRL_POLL_SHIFT;
923 control->super = (enh & L2CAP_CTRL_SUPERVISE) >> L2CAP_CTRL_SUPER_SHIFT;
924
925 control->sar = 0;
926 control->txseq = 0;
927 } else {
928 /* I-Frame */
929 control->sframe = 0;
930 control->sar = (enh & L2CAP_CTRL_SAR) >> L2CAP_CTRL_SAR_SHIFT;
931 control->txseq = (enh & L2CAP_CTRL_TXSEQ) >> L2CAP_CTRL_TXSEQ_SHIFT;
932
933 control->poll = 0;
934 control->super = 0;
935 }
936}
937
938static void __unpack_extended_control(u32 ext, struct l2cap_ctrl *control)
939{
940 control->reqseq = (ext & L2CAP_EXT_CTRL_REQSEQ) >> L2CAP_EXT_CTRL_REQSEQ_SHIFT;
941 control->final = (ext & L2CAP_EXT_CTRL_FINAL) >> L2CAP_EXT_CTRL_FINAL_SHIFT;
942
943 if (ext & L2CAP_EXT_CTRL_FRAME_TYPE) {
944 /* S-Frame */
945 control->sframe = 1;
946 control->poll = (ext & L2CAP_EXT_CTRL_POLL) >> L2CAP_EXT_CTRL_POLL_SHIFT;
947 control->super = (ext & L2CAP_EXT_CTRL_SUPERVISE) >> L2CAP_EXT_CTRL_SUPER_SHIFT;
948
949 control->sar = 0;
950 control->txseq = 0;
951 } else {
952 /* I-Frame */
953 control->sframe = 0;
954 control->sar = (ext & L2CAP_EXT_CTRL_SAR) >> L2CAP_EXT_CTRL_SAR_SHIFT;
955 control->txseq = (ext & L2CAP_EXT_CTRL_TXSEQ) >> L2CAP_EXT_CTRL_TXSEQ_SHIFT;
956
957 control->poll = 0;
958 control->super = 0;
959 }
960}
961
962static inline void __unpack_control(struct l2cap_chan *chan,
963 struct sk_buff *skb)
964{
965 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
966 __unpack_extended_control(get_unaligned_le32(skb->data),
Johan Hedberga4368ff2015-03-30 23:21:01 +0300967 &bt_cb(skb)->l2cap);
Mat Martineaucec8ab6e2012-05-17 20:53:36 -0700968 skb_pull(skb, L2CAP_EXT_CTRL_SIZE);
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700969 } else {
970 __unpack_enhanced_control(get_unaligned_le16(skb->data),
Johan Hedberga4368ff2015-03-30 23:21:01 +0300971 &bt_cb(skb)->l2cap);
Mat Martineaucec8ab6e2012-05-17 20:53:36 -0700972 skb_pull(skb, L2CAP_ENH_CTRL_SIZE);
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700973 }
974}
975
976static u32 __pack_extended_control(struct l2cap_ctrl *control)
977{
978 u32 packed;
979
980 packed = control->reqseq << L2CAP_EXT_CTRL_REQSEQ_SHIFT;
981 packed |= control->final << L2CAP_EXT_CTRL_FINAL_SHIFT;
982
983 if (control->sframe) {
984 packed |= control->poll << L2CAP_EXT_CTRL_POLL_SHIFT;
985 packed |= control->super << L2CAP_EXT_CTRL_SUPER_SHIFT;
986 packed |= L2CAP_EXT_CTRL_FRAME_TYPE;
987 } else {
988 packed |= control->sar << L2CAP_EXT_CTRL_SAR_SHIFT;
989 packed |= control->txseq << L2CAP_EXT_CTRL_TXSEQ_SHIFT;
990 }
991
992 return packed;
993}
994
995static u16 __pack_enhanced_control(struct l2cap_ctrl *control)
996{
997 u16 packed;
998
999 packed = control->reqseq << L2CAP_CTRL_REQSEQ_SHIFT;
1000 packed |= control->final << L2CAP_CTRL_FINAL_SHIFT;
1001
1002 if (control->sframe) {
1003 packed |= control->poll << L2CAP_CTRL_POLL_SHIFT;
1004 packed |= control->super << L2CAP_CTRL_SUPER_SHIFT;
1005 packed |= L2CAP_CTRL_FRAME_TYPE;
1006 } else {
1007 packed |= control->sar << L2CAP_CTRL_SAR_SHIFT;
1008 packed |= control->txseq << L2CAP_CTRL_TXSEQ_SHIFT;
1009 }
1010
1011 return packed;
1012}
1013
1014static inline void __pack_control(struct l2cap_chan *chan,
1015 struct l2cap_ctrl *control,
1016 struct sk_buff *skb)
1017{
1018 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
1019 put_unaligned_le32(__pack_extended_control(control),
1020 skb->data + L2CAP_HDR_SIZE);
1021 } else {
1022 put_unaligned_le16(__pack_enhanced_control(control),
1023 skb->data + L2CAP_HDR_SIZE);
1024 }
1025}
1026
Gustavo Padovanba7aa642012-05-29 13:29:16 -03001027static inline unsigned int __ertm_hdr_size(struct l2cap_chan *chan)
1028{
1029 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
1030 return L2CAP_EXT_HDR_SIZE;
1031 else
1032 return L2CAP_ENH_HDR_SIZE;
1033}
1034
Mat Martineaua67d7f62012-05-17 20:53:35 -07001035static struct sk_buff *l2cap_create_sframe_pdu(struct l2cap_chan *chan,
1036 u32 control)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001037{
1038 struct sk_buff *skb;
1039 struct l2cap_hdr *lh;
Gustavo Padovanba7aa642012-05-29 13:29:16 -03001040 int hlen = __ertm_hdr_size(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001041
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001042 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03001043 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001044
Mat Martineaua67d7f62012-05-17 20:53:35 -07001045 skb = bt_skb_alloc(hlen, GFP_KERNEL);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001046
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001047 if (!skb)
Mat Martineaua67d7f62012-05-17 20:53:35 -07001048 return ERR_PTR(-ENOMEM);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001049
Johannes Berg4df864c2017-06-16 14:29:21 +02001050 lh = skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001051 lh->len = cpu_to_le16(hlen - L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001052 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03001053
Mat Martineaua67d7f62012-05-17 20:53:35 -07001054 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
1055 put_unaligned_le32(control, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
1056 else
1057 put_unaligned_le16(control, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001058
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001059 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineaua67d7f62012-05-17 20:53:35 -07001060 u16 fcs = crc16(0, (u8 *)skb->data, skb->len);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03001061 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001062 }
1063
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001064 skb->priority = HCI_PRIO_MAX;
Mat Martineaua67d7f62012-05-17 20:53:35 -07001065 return skb;
1066}
1067
1068static void l2cap_send_sframe(struct l2cap_chan *chan,
1069 struct l2cap_ctrl *control)
1070{
1071 struct sk_buff *skb;
1072 u32 control_field;
1073
1074 BT_DBG("chan %p, control %p", chan, control);
1075
1076 if (!control->sframe)
1077 return;
1078
Mat Martineaub99e13a2012-10-23 15:24:19 -07001079 if (__chan_is_moving(chan))
1080 return;
1081
Mat Martineaua67d7f62012-05-17 20:53:35 -07001082 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state) &&
1083 !control->poll)
1084 control->final = 1;
1085
1086 if (control->super == L2CAP_SUPER_RR)
1087 clear_bit(CONN_RNR_SENT, &chan->conn_state);
1088 else if (control->super == L2CAP_SUPER_RNR)
1089 set_bit(CONN_RNR_SENT, &chan->conn_state);
1090
1091 if (control->super != L2CAP_SUPER_SREJ) {
1092 chan->last_acked_seq = control->reqseq;
1093 __clear_ack_timer(chan);
1094 }
1095
1096 BT_DBG("reqseq %d, final %d, poll %d, super %d", control->reqseq,
1097 control->final, control->poll, control->super);
1098
1099 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
1100 control_field = __pack_extended_control(control);
1101 else
1102 control_field = __pack_enhanced_control(control);
1103
1104 skb = l2cap_create_sframe_pdu(chan, control_field);
1105 if (!IS_ERR(skb))
1106 l2cap_do_send(chan, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001107}
1108
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001109static void l2cap_send_rr_or_rnr(struct l2cap_chan *chan, bool poll)
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001110{
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001111 struct l2cap_ctrl control;
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001112
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001113 BT_DBG("chan %p, poll %d", chan, poll);
1114
1115 memset(&control, 0, sizeof(control));
1116 control.sframe = 1;
1117 control.poll = poll;
1118
1119 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
1120 control.super = L2CAP_SUPER_RNR;
1121 else
1122 control.super = L2CAP_SUPER_RR;
1123
1124 control.reqseq = chan->buffer_seq;
1125 l2cap_send_sframe(chan, &control);
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001126}
1127
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001128static inline int __l2cap_no_conn_pending(struct l2cap_chan *chan)
Andrei Emeltchenkoe501d052010-07-08 12:14:41 +03001129{
Johan Hedberg5ff6f342014-08-07 22:56:43 +03001130 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED)
1131 return true;
1132
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001133 return !test_bit(CONF_CONNECT_PEND, &chan->conf_state);
Andrei Emeltchenkoe501d052010-07-08 12:14:41 +03001134}
1135
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001136static bool __amp_capable(struct l2cap_chan *chan)
1137{
1138 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann1df7b172013-10-05 11:47:49 -07001139 struct hci_dev *hdev;
1140 bool amp_available = false;
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001141
Johan Hedberg0bd49fc2014-12-02 10:09:26 +02001142 if (!(conn->local_fixed_chan & L2CAP_FC_A2MP))
Marcel Holtmann1df7b172013-10-05 11:47:49 -07001143 return false;
1144
Johan Hedberg0bd49fc2014-12-02 10:09:26 +02001145 if (!(conn->remote_fixed_chan & L2CAP_FC_A2MP))
Marcel Holtmann1df7b172013-10-05 11:47:49 -07001146 return false;
1147
1148 read_lock(&hci_dev_list_lock);
1149 list_for_each_entry(hdev, &hci_dev_list, list) {
1150 if (hdev->amp_type != AMP_TYPE_BREDR &&
1151 test_bit(HCI_UP, &hdev->flags)) {
1152 amp_available = true;
1153 break;
1154 }
1155 }
1156 read_unlock(&hci_dev_list_lock);
1157
1158 if (chan->chan_policy == BT_CHANNEL_POLICY_AMP_PREFERRED)
1159 return amp_available;
Marcel Holtmann848566b2013-10-01 22:59:22 -07001160
1161 return false;
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001162}
1163
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02001164static bool l2cap_check_efs(struct l2cap_chan *chan)
1165{
1166 /* Check EFS parameters */
1167 return true;
1168}
1169
Andrei Emeltchenko2766be42012-09-27 17:26:21 +03001170void l2cap_send_conn_req(struct l2cap_chan *chan)
Andrei Emeltchenko9b27f352012-02-24 16:00:00 +02001171{
1172 struct l2cap_conn *conn = chan->conn;
1173 struct l2cap_conn_req req;
1174
1175 req.scid = cpu_to_le16(chan->scid);
1176 req.psm = chan->psm;
1177
1178 chan->ident = l2cap_get_ident(conn);
1179
1180 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
1181
1182 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_REQ, sizeof(req), &req);
1183}
1184
Mat Martineau8eb200b2012-10-23 15:24:17 -07001185static void l2cap_send_create_chan_req(struct l2cap_chan *chan, u8 amp_id)
1186{
1187 struct l2cap_create_chan_req req;
1188 req.scid = cpu_to_le16(chan->scid);
1189 req.psm = chan->psm;
1190 req.amp_id = amp_id;
1191
1192 chan->ident = l2cap_get_ident(chan->conn);
1193
1194 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_REQ,
1195 sizeof(req), &req);
1196}
1197
Mat Martineau02b0fbb2012-10-23 15:24:10 -07001198static void l2cap_move_setup(struct l2cap_chan *chan)
1199{
1200 struct sk_buff *skb;
1201
1202 BT_DBG("chan %p", chan);
1203
1204 if (chan->mode != L2CAP_MODE_ERTM)
1205 return;
1206
1207 __clear_retrans_timer(chan);
1208 __clear_monitor_timer(chan);
1209 __clear_ack_timer(chan);
1210
1211 chan->retry_count = 0;
1212 skb_queue_walk(&chan->tx_q, skb) {
Johan Hedberga4368ff2015-03-30 23:21:01 +03001213 if (bt_cb(skb)->l2cap.retries)
1214 bt_cb(skb)->l2cap.retries = 1;
Mat Martineau02b0fbb2012-10-23 15:24:10 -07001215 else
1216 break;
1217 }
1218
1219 chan->expected_tx_seq = chan->buffer_seq;
1220
1221 clear_bit(CONN_REJ_ACT, &chan->conn_state);
1222 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
1223 l2cap_seq_list_clear(&chan->retrans_list);
1224 l2cap_seq_list_clear(&chan->srej_list);
1225 skb_queue_purge(&chan->srej_q);
1226
1227 chan->tx_state = L2CAP_TX_STATE_XMIT;
1228 chan->rx_state = L2CAP_RX_STATE_MOVE;
1229
1230 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
1231}
1232
Mat Martineau5f3847a2012-10-23 15:24:12 -07001233static void l2cap_move_done(struct l2cap_chan *chan)
1234{
1235 u8 move_role = chan->move_role;
1236 BT_DBG("chan %p", chan);
1237
1238 chan->move_state = L2CAP_MOVE_STABLE;
1239 chan->move_role = L2CAP_MOVE_ROLE_NONE;
1240
1241 if (chan->mode != L2CAP_MODE_ERTM)
1242 return;
1243
1244 switch (move_role) {
1245 case L2CAP_MOVE_ROLE_INITIATOR:
1246 l2cap_tx(chan, NULL, NULL, L2CAP_EV_EXPLICIT_POLL);
1247 chan->rx_state = L2CAP_RX_STATE_WAIT_F;
1248 break;
1249 case L2CAP_MOVE_ROLE_RESPONDER:
1250 chan->rx_state = L2CAP_RX_STATE_WAIT_P;
1251 break;
1252 }
1253}
1254
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001255static void l2cap_chan_ready(struct l2cap_chan *chan)
1256{
Johan Hedberg315917e2015-02-16 11:42:11 +02001257 /* The channel may have already been flagged as connected in
1258 * case of receiving data before the L2CAP info req/rsp
1259 * procedure is complete.
1260 */
1261 if (chan->state == BT_CONNECTED)
1262 return;
1263
Mat Martineau28270112012-05-17 21:14:09 -07001264 /* This clears all conf flags, including CONF_NOT_COMPLETE */
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001265 chan->conf_state = 0;
1266 __clear_chan_timer(chan);
1267
Johan Hedberg0ce43ce2013-12-05 14:55:33 +02001268 if (chan->mode == L2CAP_MODE_LE_FLOWCTL && !chan->tx_credits)
1269 chan->ops->suspend(chan);
Johan Hedberg177f8f22013-05-31 17:54:51 +03001270
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001271 chan->state = BT_CONNECTED;
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001272
Andrei Emeltchenkofd83e2c2012-05-30 09:55:32 +03001273 chan->ops->ready(chan);
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001274}
1275
Johan Hedbergf1496de2013-05-13 14:15:56 +03001276static void l2cap_le_connect(struct l2cap_chan *chan)
1277{
1278 struct l2cap_conn *conn = chan->conn;
1279 struct l2cap_le_conn_req req;
1280
Johan Hedberg595177f2013-12-02 22:12:22 +02001281 if (test_and_set_bit(FLAG_LE_CONN_REQ_SENT, &chan->flags))
1282 return;
1283
Luiz Augusto von Dentzfe149312018-09-04 13:39:20 +03001284 l2cap_le_flowctl_init(chan);
1285
Johan Hedbergf1496de2013-05-13 14:15:56 +03001286 req.psm = chan->psm;
1287 req.scid = cpu_to_le16(chan->scid);
1288 req.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02001289 req.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03001290 req.credits = cpu_to_le16(chan->rx_credits);
Johan Hedbergf1496de2013-05-13 14:15:56 +03001291
1292 chan->ident = l2cap_get_ident(conn);
1293
1294 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_REQ,
1295 sizeof(req), &req);
1296}
1297
1298static void l2cap_le_start(struct l2cap_chan *chan)
1299{
1300 struct l2cap_conn *conn = chan->conn;
1301
1302 if (!smp_conn_security(conn->hcon, chan->sec_level))
1303 return;
1304
1305 if (!chan->psm) {
1306 l2cap_chan_ready(chan);
1307 return;
1308 }
1309
1310 if (chan->state == BT_CONNECT)
1311 l2cap_le_connect(chan);
1312}
1313
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001314static void l2cap_start_connection(struct l2cap_chan *chan)
1315{
1316 if (__amp_capable(chan)) {
1317 BT_DBG("chan %p AMP capable: discover AMPs", chan);
1318 a2mp_discover_amp(chan);
Johan Hedbergf1496de2013-05-13 14:15:56 +03001319 } else if (chan->conn->hcon->type == LE_LINK) {
1320 l2cap_le_start(chan);
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001321 } else {
1322 l2cap_send_conn_req(chan);
1323 }
1324}
1325
Johan Hedbergaeaeb4b2014-09-10 17:37:46 -07001326static void l2cap_request_info(struct l2cap_conn *conn)
1327{
1328 struct l2cap_info_req req;
1329
1330 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT)
1331 return;
1332
1333 req.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
1334
1335 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
1336 conn->info_ident = l2cap_get_ident(conn);
1337
1338 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
1339
1340 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
1341 sizeof(req), &req);
1342}
1343
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001344static void l2cap_do_start(struct l2cap_chan *chan)
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001345{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03001346 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001347
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001348 if (conn->hcon->type == LE_LINK) {
Johan Hedberg96ac34f2013-05-13 11:15:07 +03001349 l2cap_le_start(chan);
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001350 return;
1351 }
1352
Johan Hedbergaeaeb4b2014-09-10 17:37:46 -07001353 if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT)) {
1354 l2cap_request_info(conn);
1355 return;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001356 }
Johan Hedbergaeaeb4b2014-09-10 17:37:46 -07001357
1358 if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE))
1359 return;
1360
1361 if (l2cap_chan_check_security(chan, true) &&
1362 __l2cap_no_conn_pending(chan))
1363 l2cap_start_connection(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001364}
1365
Gustavo F. Padovancf6c2c02010-06-07 20:54:45 -03001366static inline int l2cap_mode_supported(__u8 mode, __u32 feat_mask)
1367{
1368 u32 local_feat_mask = l2cap_feat_mask;
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03001369 if (!disable_ertm)
Gustavo F. Padovancf6c2c02010-06-07 20:54:45 -03001370 local_feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING;
1371
1372 switch (mode) {
1373 case L2CAP_MODE_ERTM:
1374 return L2CAP_FEAT_ERTM & feat_mask & local_feat_mask;
1375 case L2CAP_MODE_STREAMING:
1376 return L2CAP_FEAT_STREAMING & feat_mask & local_feat_mask;
1377 default:
1378 return 0x00;
1379 }
1380}
1381
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001382static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err)
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001383{
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001384 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001385 struct l2cap_disconn_req req;
1386
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001387 if (!conn)
1388 return;
1389
Andrei Emeltchenkoaad3d0e2012-09-06 15:05:42 +03001390 if (chan->mode == L2CAP_MODE_ERTM && chan->state == BT_CONNECTED) {
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03001391 __clear_retrans_timer(chan);
1392 __clear_monitor_timer(chan);
1393 __clear_ack_timer(chan);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001394 }
1395
Johan Hedberg2338a7e2014-01-24 10:35:40 +02001396 if (chan->scid == L2CAP_CID_A2MP) {
Gustavo Padovand1177732012-10-06 11:47:38 +01001397 l2cap_state_change(chan, BT_DISCONN);
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001398 return;
1399 }
1400
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001401 req.dcid = cpu_to_le16(chan->dcid);
1402 req.scid = cpu_to_le16(chan->scid);
Gustavo Padovan2d792812012-10-06 10:07:01 +01001403 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_DISCONN_REQ,
1404 sizeof(req), &req);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001405
Gustavo Padovanf8e73012013-10-15 19:24:46 -03001406 l2cap_state_change_and_error(chan, BT_DISCONN, err);
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001407}
1408
Linus Torvalds1da177e2005-04-16 15:20:36 -07001409/* ---- L2CAP connections ---- */
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001410static void l2cap_conn_start(struct l2cap_conn *conn)
1411{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001412 struct l2cap_chan *chan, *tmp;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001413
1414 BT_DBG("conn %p", conn);
1415
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001416 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001417
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001418 list_for_each_entry_safe(chan, tmp, &conn->chan_l, list) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001419 l2cap_chan_lock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001420
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001421 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Johan Hedbergaeaeb4b2014-09-10 17:37:46 -07001422 l2cap_chan_ready(chan);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001423 l2cap_chan_unlock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001424 continue;
1425 }
1426
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001427 if (chan->state == BT_CONNECT) {
Johan Hedberge7cafc42014-07-17 15:35:38 +03001428 if (!l2cap_chan_check_security(chan, true) ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01001429 !__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001430 l2cap_chan_unlock(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001431 continue;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02001432 }
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001433
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001434 if (!l2cap_mode_supported(chan->mode, conn->feat_mask)
Gustavo Padovan2d792812012-10-06 10:07:01 +01001435 && test_bit(CONF_STATE2_DEVICE,
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001436 &chan->conf_state)) {
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001437 l2cap_chan_close(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001438 l2cap_chan_unlock(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001439 continue;
1440 }
1441
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001442 l2cap_start_connection(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001443
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001444 } else if (chan->state == BT_CONNECT2) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001445 struct l2cap_conn_rsp rsp;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001446 char buf[128];
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001447 rsp.scid = cpu_to_le16(chan->dcid);
1448 rsp.dcid = cpu_to_le16(chan->scid);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001449
Johan Hedberge7cafc42014-07-17 15:35:38 +03001450 if (l2cap_chan_check_security(chan, false)) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07001451 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001452 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
1453 rsp.status = cpu_to_le16(L2CAP_CS_AUTHOR_PEND);
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001454 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001455
1456 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001457 l2cap_state_change(chan, BT_CONFIG);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001458 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
1459 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001460 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001461 } else {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001462 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
1463 rsp.status = cpu_to_le16(L2CAP_CS_AUTHEN_PEND);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001464 }
1465
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001466 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001467 sizeof(rsp), &rsp);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001468
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001469 if (test_bit(CONF_REQ_SENT, &chan->conf_state) ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01001470 rsp.result != L2CAP_CR_SUCCESS) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001471 l2cap_chan_unlock(chan);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001472 continue;
1473 }
1474
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001475 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001476 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Ben Serie860d2c2017-09-09 23:15:59 +02001477 l2cap_build_conf_req(chan, buf, sizeof(buf)), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03001478 chan->num_conf_req++;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001479 }
1480
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001481 l2cap_chan_unlock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001482 }
1483
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001484 mutex_unlock(&conn->chan_lock);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001485}
1486
Ville Tervob62f3282011-02-10 22:38:50 -03001487static void l2cap_le_conn_ready(struct l2cap_conn *conn)
1488{
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001489 struct hci_conn *hcon = conn->hcon;
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001490 struct hci_dev *hdev = hcon->hdev;
Ville Tervob62f3282011-02-10 22:38:50 -03001491
Johan Hedberge760ec12014-08-07 22:56:47 +03001492 BT_DBG("%s conn %p", hdev->name, conn);
Ville Tervob62f3282011-02-10 22:38:50 -03001493
Johan Hedberge760ec12014-08-07 22:56:47 +03001494 /* For outgoing pairing which doesn't necessarily have an
1495 * associated socket (e.g. mgmt_pair_device).
1496 */
1497 if (hcon->out)
1498 smp_conn_security(hcon, hcon->pending_sec_level);
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001499
Marcel Holtmann80afeb62014-06-23 12:18:51 +02001500 /* For LE slave connections, make sure the connection interval
1501 * is in the range of the minium and maximum interval that has
1502 * been configured for this connection. If not, then trigger
1503 * the connection update procedure.
1504 */
Johan Hedberg40bef302014-07-16 11:42:27 +03001505 if (hcon->role == HCI_ROLE_SLAVE &&
Marcel Holtmann80afeb62014-06-23 12:18:51 +02001506 (hcon->le_conn_interval < hcon->le_conn_min_interval ||
1507 hcon->le_conn_interval > hcon->le_conn_max_interval)) {
1508 struct l2cap_conn_param_update_req req;
1509
1510 req.min = cpu_to_le16(hcon->le_conn_min_interval);
1511 req.max = cpu_to_le16(hcon->le_conn_max_interval);
1512 req.latency = cpu_to_le16(hcon->le_conn_latency);
1513 req.to_multiplier = cpu_to_le16(hcon->le_supv_timeout);
1514
1515 l2cap_send_cmd(conn, l2cap_get_ident(conn),
1516 L2CAP_CONN_PARAM_UPDATE_REQ, sizeof(req), &req);
1517 }
Ville Tervob62f3282011-02-10 22:38:50 -03001518}
1519
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001520static void l2cap_conn_ready(struct l2cap_conn *conn)
1521{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001522 struct l2cap_chan *chan;
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001523 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001524
1525 BT_DBG("conn %p", conn);
1526
Johan Hedbergaeaeb4b2014-09-10 17:37:46 -07001527 if (hcon->type == ACL_LINK)
1528 l2cap_request_info(conn);
1529
Johan Hedberge760ec12014-08-07 22:56:47 +03001530 mutex_lock(&conn->chan_lock);
1531
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001532 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03001533
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001534 l2cap_chan_lock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001535
Johan Hedberg2338a7e2014-01-24 10:35:40 +02001536 if (chan->scid == L2CAP_CID_A2MP) {
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001537 l2cap_chan_unlock(chan);
1538 continue;
1539 }
1540
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001541 if (hcon->type == LE_LINK) {
Johan Hedbergf1496de2013-05-13 14:15:56 +03001542 l2cap_le_start(chan);
Vinicius Costa Gomes63128452011-06-17 22:46:26 -03001543 } else if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Johan Hedbergaeaeb4b2014-09-10 17:37:46 -07001544 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)
1545 l2cap_chan_ready(chan);
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001546 } else if (chan->state == BT_CONNECT) {
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001547 l2cap_do_start(chan);
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001548 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001549
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001550 l2cap_chan_unlock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001551 }
1552
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001553 mutex_unlock(&conn->chan_lock);
Johan Hedberg61a939c2014-01-17 20:45:11 +02001554
Johan Hedberg79a05722014-08-08 09:28:04 +03001555 if (hcon->type == LE_LINK)
1556 l2cap_le_conn_ready(conn);
1557
Johan Hedberg61a939c2014-01-17 20:45:11 +02001558 queue_work(hcon->hdev->workqueue, &conn->pending_rx_work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001559}
1560
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001561/* Notify sockets that we cannot guaranty reliability anymore */
1562static void l2cap_conn_unreliable(struct l2cap_conn *conn, int err)
1563{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001564 struct l2cap_chan *chan;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001565
1566 BT_DBG("conn %p", conn);
1567
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001568 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001569
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001570 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +03001571 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo Padovan1d8b1fd2012-10-06 11:34:52 +01001572 l2cap_chan_set_err(chan, err);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001573 }
1574
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001575 mutex_unlock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001576}
1577
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001578static void l2cap_info_timeout(struct work_struct *work)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001579{
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001580 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001581 info_timer.work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001582
Marcel Holtmann984947d2009-02-06 23:35:19 +01001583 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01001584 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01001585
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001586 l2cap_conn_start(conn);
1587}
1588
David Herrmann2c8e1412013-04-06 20:28:45 +02001589/*
1590 * l2cap_user
1591 * External modules can register l2cap_user objects on l2cap_conn. The ->probe
1592 * callback is called during registration. The ->remove callback is called
1593 * during unregistration.
1594 * An l2cap_user object can either be explicitly unregistered or when the
1595 * underlying l2cap_conn object is deleted. This guarantees that l2cap->hcon,
1596 * l2cap->hchan, .. are valid as long as the remove callback hasn't been called.
1597 * External modules must own a reference to the l2cap_conn object if they intend
1598 * to call l2cap_unregister_user(). The l2cap_conn object might get destroyed at
1599 * any time if they don't.
1600 */
1601
1602int l2cap_register_user(struct l2cap_conn *conn, struct l2cap_user *user)
1603{
1604 struct hci_dev *hdev = conn->hcon->hdev;
1605 int ret;
1606
1607 /* We need to check whether l2cap_conn is registered. If it is not, we
1608 * must not register the l2cap_user. l2cap_conn_del() is unregisters
1609 * l2cap_conn objects, but doesn't provide its own locking. Instead, it
1610 * relies on the parent hci_conn object to be locked. This itself relies
1611 * on the hci_dev object to be locked. So we must lock the hci device
1612 * here, too. */
1613
1614 hci_dev_lock(hdev);
1615
Alexey Dobriyan835a6a22015-06-10 20:28:33 +03001616 if (!list_empty(&user->list)) {
David Herrmann2c8e1412013-04-06 20:28:45 +02001617 ret = -EINVAL;
1618 goto out_unlock;
1619 }
1620
1621 /* conn->hchan is NULL after l2cap_conn_del() was called */
1622 if (!conn->hchan) {
1623 ret = -ENODEV;
1624 goto out_unlock;
1625 }
1626
1627 ret = user->probe(conn, user);
1628 if (ret)
1629 goto out_unlock;
1630
1631 list_add(&user->list, &conn->users);
1632 ret = 0;
1633
1634out_unlock:
1635 hci_dev_unlock(hdev);
1636 return ret;
1637}
1638EXPORT_SYMBOL(l2cap_register_user);
1639
1640void l2cap_unregister_user(struct l2cap_conn *conn, struct l2cap_user *user)
1641{
1642 struct hci_dev *hdev = conn->hcon->hdev;
1643
1644 hci_dev_lock(hdev);
1645
Alexey Dobriyan835a6a22015-06-10 20:28:33 +03001646 if (list_empty(&user->list))
David Herrmann2c8e1412013-04-06 20:28:45 +02001647 goto out_unlock;
1648
Tedd Ho-Jeong Anab944c82015-06-30 11:43:40 -07001649 list_del_init(&user->list);
David Herrmann2c8e1412013-04-06 20:28:45 +02001650 user->remove(conn, user);
1651
1652out_unlock:
1653 hci_dev_unlock(hdev);
1654}
1655EXPORT_SYMBOL(l2cap_unregister_user);
1656
1657static void l2cap_unregister_all_users(struct l2cap_conn *conn)
1658{
1659 struct l2cap_user *user;
1660
1661 while (!list_empty(&conn->users)) {
1662 user = list_first_entry(&conn->users, struct l2cap_user, list);
Tedd Ho-Jeong Anab944c82015-06-30 11:43:40 -07001663 list_del_init(&user->list);
David Herrmann2c8e1412013-04-06 20:28:45 +02001664 user->remove(conn, user);
1665 }
1666}
1667
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001668static void l2cap_conn_del(struct hci_conn *hcon, int err)
1669{
1670 struct l2cap_conn *conn = hcon->l2cap_data;
1671 struct l2cap_chan *chan, *l;
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001672
1673 if (!conn)
1674 return;
1675
1676 BT_DBG("hcon %p conn %p, err %d", hcon, conn, err);
1677
1678 kfree_skb(conn->rx_skb);
1679
Johan Hedberg61a939c2014-01-17 20:45:11 +02001680 skb_queue_purge(&conn->pending_rx);
Jukka Taimisto7ab56c32014-06-12 10:15:13 +00001681
1682 /* We can not call flush_work(&conn->pending_rx_work) here since we
1683 * might block if we are running on a worker from the same workqueue
1684 * pending_rx_work is waiting on.
1685 */
1686 if (work_pending(&conn->pending_rx_work))
1687 cancel_work_sync(&conn->pending_rx_work);
Johan Hedberg61a939c2014-01-17 20:45:11 +02001688
Johan Hedbergf3d82d02014-09-05 22:19:50 +03001689 if (work_pending(&conn->id_addr_update_work))
1690 cancel_work_sync(&conn->id_addr_update_work);
1691
David Herrmann2c8e1412013-04-06 20:28:45 +02001692 l2cap_unregister_all_users(conn);
1693
Johan Hedberge31fb862014-08-18 20:33:28 +03001694 /* Force the connection to be immediately dropped */
1695 hcon->disc_timeout = 0;
1696
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001697 mutex_lock(&conn->chan_lock);
1698
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001699 /* Kill channels */
1700 list_for_each_entry_safe(chan, l, &conn->chan_l, list) {
Mat Martineau61d6ef32012-04-27 16:50:50 -07001701 l2cap_chan_hold(chan);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001702 l2cap_chan_lock(chan);
1703
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001704 l2cap_chan_del(chan, err);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001705
1706 l2cap_chan_unlock(chan);
1707
Gustavo Padovan80b98022012-05-27 22:27:51 -03001708 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07001709 l2cap_chan_put(chan);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001710 }
1711
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001712 mutex_unlock(&conn->chan_lock);
1713
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001714 hci_chan_del(conn->hchan);
1715
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001716 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT)
Ulisses Furquim127074b2012-01-30 18:26:29 -02001717 cancel_delayed_work_sync(&conn->info_timer);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001718
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001719 hcon->l2cap_data = NULL;
David Herrmann9c903e32013-04-06 20:28:44 +02001720 conn->hchan = NULL;
1721 l2cap_conn_put(conn);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001722}
1723
David Herrmann9c903e32013-04-06 20:28:44 +02001724static void l2cap_conn_free(struct kref *ref)
1725{
1726 struct l2cap_conn *conn = container_of(ref, struct l2cap_conn, ref);
1727
1728 hci_conn_put(conn->hcon);
1729 kfree(conn);
1730}
1731
Johan Hedberg51bb84572014-08-15 21:06:57 +03001732struct l2cap_conn *l2cap_conn_get(struct l2cap_conn *conn)
David Herrmann9c903e32013-04-06 20:28:44 +02001733{
1734 kref_get(&conn->ref);
Johan Hedberg51bb84572014-08-15 21:06:57 +03001735 return conn;
David Herrmann9c903e32013-04-06 20:28:44 +02001736}
1737EXPORT_SYMBOL(l2cap_conn_get);
1738
1739void l2cap_conn_put(struct l2cap_conn *conn)
1740{
1741 kref_put(&conn->ref, l2cap_conn_free);
1742}
1743EXPORT_SYMBOL(l2cap_conn_put);
1744
Linus Torvalds1da177e2005-04-16 15:20:36 -07001745/* ---- Socket interface ---- */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001746
Ido Yarivc2287682012-04-20 15:46:07 -03001747/* Find socket with psm and source / destination bdaddr.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001748 * Returns closest match.
1749 */
Ido Yarivc2287682012-04-20 15:46:07 -03001750static struct l2cap_chan *l2cap_global_chan_by_psm(int state, __le16 psm,
1751 bdaddr_t *src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001752 bdaddr_t *dst,
1753 u8 link_type)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001754{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001755 struct l2cap_chan *c, *c1 = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001756
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001757 read_lock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001758
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001759 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001760 if (state && c->state != state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001761 continue;
1762
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001763 if (link_type == ACL_LINK && c->src_type != BDADDR_BREDR)
1764 continue;
1765
1766 if (link_type == LE_LINK && c->src_type == BDADDR_BREDR)
1767 continue;
1768
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001769 if (c->psm == psm) {
Ido Yarivc2287682012-04-20 15:46:07 -03001770 int src_match, dst_match;
1771 int src_any, dst_any;
1772
Linus Torvalds1da177e2005-04-16 15:20:36 -07001773 /* Exact match. */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001774 src_match = !bacmp(&c->src, src);
1775 dst_match = !bacmp(&c->dst, dst);
Ido Yarivc2287682012-04-20 15:46:07 -03001776 if (src_match && dst_match) {
Johan Hedberga24cce12014-08-07 22:56:42 +03001777 l2cap_chan_hold(c);
Johannes Berga7567b22011-06-01 08:29:54 +02001778 read_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001779 return c;
1780 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001781
1782 /* Closest match */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001783 src_any = !bacmp(&c->src, BDADDR_ANY);
1784 dst_any = !bacmp(&c->dst, BDADDR_ANY);
Ido Yarivc2287682012-04-20 15:46:07 -03001785 if ((src_match && dst_any) || (src_any && dst_match) ||
1786 (src_any && dst_any))
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001787 c1 = c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001788 }
1789 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001790
Johan Hedberga24cce12014-08-07 22:56:42 +03001791 if (c1)
1792 l2cap_chan_hold(c1);
1793
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001794 read_unlock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001795
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001796 return c1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001797}
1798
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001799static void l2cap_monitor_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001800{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001801 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001802 monitor_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001803
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03001804 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001805
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001806 l2cap_chan_lock(chan);
1807
Mat Martineau80909e02012-05-17 20:53:50 -07001808 if (!chan->conn) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001809 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001810 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001811 return;
1812 }
1813
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001814 l2cap_tx(chan, NULL, NULL, L2CAP_EV_MONITOR_TO);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001815
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001816 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001817 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001818}
1819
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001820static void l2cap_retrans_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001821{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001822 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001823 retrans_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001824
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03001825 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001826
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001827 l2cap_chan_lock(chan);
1828
Mat Martineau80909e02012-05-17 20:53:50 -07001829 if (!chan->conn) {
1830 l2cap_chan_unlock(chan);
1831 l2cap_chan_put(chan);
1832 return;
1833 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001834
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001835 l2cap_tx(chan, NULL, NULL, L2CAP_EV_RETRANS_TO);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001836 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001837 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001838}
1839
Gustavo Padovand6603662012-05-21 13:58:22 -03001840static void l2cap_streaming_send(struct l2cap_chan *chan,
1841 struct sk_buff_head *skbs)
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001842{
Gustavo F. Padovanccbb84a2010-08-30 18:44:44 -03001843 struct sk_buff *skb;
Mat Martineau37339372012-05-17 20:53:33 -07001844 struct l2cap_ctrl *control;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001845
Mat Martineau37339372012-05-17 20:53:33 -07001846 BT_DBG("chan %p, skbs %p", chan, skbs);
1847
Mat Martineaub99e13a2012-10-23 15:24:19 -07001848 if (__chan_is_moving(chan))
1849 return;
1850
Mat Martineau37339372012-05-17 20:53:33 -07001851 skb_queue_splice_tail_init(skbs, &chan->tx_q);
1852
1853 while (!skb_queue_empty(&chan->tx_q)) {
1854
1855 skb = skb_dequeue(&chan->tx_q);
1856
Johan Hedberga4368ff2015-03-30 23:21:01 +03001857 bt_cb(skb)->l2cap.retries = 1;
1858 control = &bt_cb(skb)->l2cap;
Mat Martineau37339372012-05-17 20:53:33 -07001859
1860 control->reqseq = 0;
1861 control->txseq = chan->next_tx_seq;
1862
1863 __pack_control(chan, control, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001864
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001865 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau37339372012-05-17 20:53:33 -07001866 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1867 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001868 }
1869
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001870 l2cap_do_send(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001871
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001872 BT_DBG("Sent txseq %u", control->txseq);
Mat Martineau37339372012-05-17 20:53:33 -07001873
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001874 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau37339372012-05-17 20:53:33 -07001875 chan->frames_sent++;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001876 }
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001877}
1878
Szymon Janc67c9e842011-07-28 16:24:33 +02001879static int l2cap_ertm_send(struct l2cap_chan *chan)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001880{
1881 struct sk_buff *skb, *tx_skb;
Mat Martineau18a48e72012-05-17 20:53:34 -07001882 struct l2cap_ctrl *control;
1883 int sent = 0;
1884
1885 BT_DBG("chan %p", chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001886
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001887 if (chan->state != BT_CONNECTED)
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001888 return -ENOTCONN;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001889
Mat Martineau94122bb2012-05-02 09:42:02 -07001890 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1891 return 0;
1892
Mat Martineaub99e13a2012-10-23 15:24:19 -07001893 if (__chan_is_moving(chan))
1894 return 0;
1895
Mat Martineau18a48e72012-05-17 20:53:34 -07001896 while (chan->tx_send_head &&
1897 chan->unacked_frames < chan->remote_tx_win &&
1898 chan->tx_state == L2CAP_TX_STATE_XMIT) {
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001899
Mat Martineau18a48e72012-05-17 20:53:34 -07001900 skb = chan->tx_send_head;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001901
Johan Hedberga4368ff2015-03-30 23:21:01 +03001902 bt_cb(skb)->l2cap.retries = 1;
1903 control = &bt_cb(skb)->l2cap;
Gustavo F. Padovan95ffa972010-06-18 20:37:33 -03001904
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001905 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
Mat Martineau18a48e72012-05-17 20:53:34 -07001906 control->final = 1;
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001907
Mat Martineau18a48e72012-05-17 20:53:34 -07001908 control->reqseq = chan->buffer_seq;
1909 chan->last_acked_seq = chan->buffer_seq;
1910 control->txseq = chan->next_tx_seq;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001911
Mat Martineau18a48e72012-05-17 20:53:34 -07001912 __pack_control(chan, control, skb);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001913
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001914 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau18a48e72012-05-17 20:53:34 -07001915 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1916 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001917 }
1918
Mat Martineau18a48e72012-05-17 20:53:34 -07001919 /* Clone after data has been modified. Data is assumed to be
1920 read-only (for locking purposes) on cloned sk_buffs.
1921 */
1922 tx_skb = skb_clone(skb, GFP_KERNEL);
1923
1924 if (!tx_skb)
1925 break;
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -03001926
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03001927 __set_retrans_timer(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001928
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001929 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau18a48e72012-05-17 20:53:34 -07001930 chan->unacked_frames++;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03001931 chan->frames_sent++;
Mat Martineau18a48e72012-05-17 20:53:34 -07001932 sent++;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001933
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001934 if (skb_queue_is_last(&chan->tx_q, skb))
1935 chan->tx_send_head = NULL;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001936 else
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001937 chan->tx_send_head = skb_queue_next(&chan->tx_q, skb);
Mat Martineau18a48e72012-05-17 20:53:34 -07001938
1939 l2cap_do_send(chan, tx_skb);
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001940 BT_DBG("Sent txseq %u", control->txseq);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001941 }
1942
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001943 BT_DBG("Sent %d, %u unacked, %u in ERTM queue", sent,
1944 chan->unacked_frames, skb_queue_len(&chan->tx_q));
Mat Martineau18a48e72012-05-17 20:53:34 -07001945
1946 return sent;
Gustavo F. Padovan9e917af2010-05-01 16:15:37 -03001947}
1948
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001949static void l2cap_ertm_resend(struct l2cap_chan *chan)
1950{
1951 struct l2cap_ctrl control;
1952 struct sk_buff *skb;
1953 struct sk_buff *tx_skb;
1954 u16 seq;
1955
1956 BT_DBG("chan %p", chan);
1957
1958 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1959 return;
1960
Mat Martineaub99e13a2012-10-23 15:24:19 -07001961 if (__chan_is_moving(chan))
1962 return;
1963
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001964 while (chan->retrans_list.head != L2CAP_SEQ_LIST_CLEAR) {
1965 seq = l2cap_seq_list_pop(&chan->retrans_list);
1966
1967 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, seq);
1968 if (!skb) {
1969 BT_DBG("Error: Can't retransmit seq %d, frame missing",
Gustavo Padovan2d792812012-10-06 10:07:01 +01001970 seq);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001971 continue;
1972 }
1973
Johan Hedberga4368ff2015-03-30 23:21:01 +03001974 bt_cb(skb)->l2cap.retries++;
1975 control = bt_cb(skb)->l2cap;
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001976
1977 if (chan->max_tx != 0 &&
Johan Hedberga4368ff2015-03-30 23:21:01 +03001978 bt_cb(skb)->l2cap.retries > chan->max_tx) {
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001979 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001980 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001981 l2cap_seq_list_clear(&chan->retrans_list);
1982 break;
1983 }
1984
1985 control.reqseq = chan->buffer_seq;
1986 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
1987 control.final = 1;
1988 else
1989 control.final = 0;
1990
1991 if (skb_cloned(skb)) {
1992 /* Cloned sk_buffs are read-only, so we need a
1993 * writeable copy
1994 */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03001995 tx_skb = skb_copy(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001996 } else {
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03001997 tx_skb = skb_clone(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001998 }
1999
2000 if (!tx_skb) {
2001 l2cap_seq_list_clear(&chan->retrans_list);
2002 break;
2003 }
2004
2005 /* Update skb contents */
2006 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
2007 put_unaligned_le32(__pack_extended_control(&control),
2008 tx_skb->data + L2CAP_HDR_SIZE);
2009 } else {
2010 put_unaligned_le16(__pack_enhanced_control(&control),
2011 tx_skb->data + L2CAP_HDR_SIZE);
2012 }
2013
Lukasz Rymanowski13cac152014-08-14 09:35:34 +02002014 /* Update FCS */
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002015 if (chan->fcs == L2CAP_FCS_CRC16) {
Lukasz Rymanowski13cac152014-08-14 09:35:34 +02002016 u16 fcs = crc16(0, (u8 *) tx_skb->data,
2017 tx_skb->len - L2CAP_FCS_SIZE);
2018 put_unaligned_le16(fcs, skb_tail_pointer(tx_skb) -
2019 L2CAP_FCS_SIZE);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002020 }
2021
2022 l2cap_do_send(chan, tx_skb);
2023
2024 BT_DBG("Resent txseq %d", control.txseq);
2025
2026 chan->last_acked_seq = chan->buffer_seq;
2027 }
2028}
2029
Mat Martineauf80842a2012-05-17 20:53:46 -07002030static void l2cap_retransmit(struct l2cap_chan *chan,
2031 struct l2cap_ctrl *control)
2032{
2033 BT_DBG("chan %p, control %p", chan, control);
2034
2035 l2cap_seq_list_append(&chan->retrans_list, control->reqseq);
2036 l2cap_ertm_resend(chan);
2037}
2038
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002039static void l2cap_retransmit_all(struct l2cap_chan *chan,
2040 struct l2cap_ctrl *control)
2041{
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002042 struct sk_buff *skb;
2043
2044 BT_DBG("chan %p, control %p", chan, control);
2045
2046 if (control->poll)
2047 set_bit(CONN_SEND_FBIT, &chan->conn_state);
2048
2049 l2cap_seq_list_clear(&chan->retrans_list);
2050
2051 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
2052 return;
2053
2054 if (chan->unacked_frames) {
2055 skb_queue_walk(&chan->tx_q, skb) {
Johan Hedberga4368ff2015-03-30 23:21:01 +03002056 if (bt_cb(skb)->l2cap.txseq == control->reqseq ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01002057 skb == chan->tx_send_head)
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002058 break;
2059 }
2060
2061 skb_queue_walk_from(&chan->tx_q, skb) {
2062 if (skb == chan->tx_send_head)
2063 break;
2064
2065 l2cap_seq_list_append(&chan->retrans_list,
Johan Hedberga4368ff2015-03-30 23:21:01 +03002066 bt_cb(skb)->l2cap.txseq);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002067 }
2068
2069 l2cap_ertm_resend(chan);
2070 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002071}
2072
Szymon Jancb17e73b2012-01-11 10:59:47 +01002073static void l2cap_send_ack(struct l2cap_chan *chan)
2074{
Mat Martineau0a0aba42012-05-17 20:53:39 -07002075 struct l2cap_ctrl control;
2076 u16 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
2077 chan->last_acked_seq);
2078 int threshold;
2079
2080 BT_DBG("chan %p last_acked_seq %d buffer_seq %d",
2081 chan, chan->last_acked_seq, chan->buffer_seq);
2082
2083 memset(&control, 0, sizeof(control));
2084 control.sframe = 1;
2085
2086 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
2087 chan->rx_state == L2CAP_RX_STATE_RECV) {
2088 __clear_ack_timer(chan);
2089 control.super = L2CAP_SUPER_RNR;
2090 control.reqseq = chan->buffer_seq;
2091 l2cap_send_sframe(chan, &control);
2092 } else {
2093 if (!test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) {
2094 l2cap_ertm_send(chan);
2095 /* If any i-frames were sent, they included an ack */
2096 if (chan->buffer_seq == chan->last_acked_seq)
2097 frames_to_ack = 0;
2098 }
2099
Mat Martineauc20f8e32012-07-10 05:47:07 -07002100 /* Ack now if the window is 3/4ths full.
Mat Martineau0a0aba42012-05-17 20:53:39 -07002101 * Calculate without mul or div
2102 */
Mat Martineauc20f8e32012-07-10 05:47:07 -07002103 threshold = chan->ack_win;
Mat Martineau0a0aba42012-05-17 20:53:39 -07002104 threshold += threshold << 1;
2105 threshold >>= 2;
2106
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002107 BT_DBG("frames_to_ack %u, threshold %d", frames_to_ack,
Mat Martineau0a0aba42012-05-17 20:53:39 -07002108 threshold);
2109
2110 if (frames_to_ack >= threshold) {
2111 __clear_ack_timer(chan);
2112 control.super = L2CAP_SUPER_RR;
2113 control.reqseq = chan->buffer_seq;
2114 l2cap_send_sframe(chan, &control);
2115 frames_to_ack = 0;
2116 }
2117
2118 if (frames_to_ack)
2119 __set_ack_timer(chan);
2120 }
Szymon Jancb17e73b2012-01-11 10:59:47 +01002121}
2122
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002123static inline int l2cap_skbuff_fromiovec(struct l2cap_chan *chan,
2124 struct msghdr *msg, int len,
2125 int count, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002126{
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002127 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002128 struct sk_buff **frag;
Gustavo Padovan90338942012-04-06 20:15:47 -03002129 int sent = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002130
Al Virocbbd26b2016-11-01 22:09:04 -04002131 if (!copy_from_iter_full(skb_put(skb, count), count, &msg->msg_iter))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002132 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002133
2134 sent += count;
2135 len -= count;
2136
2137 /* Continuation fragments (no L2CAP header) */
2138 frag = &skb_shinfo(skb)->frag_list;
2139 while (len) {
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002140 struct sk_buff *tmp;
2141
Linus Torvalds1da177e2005-04-16 15:20:36 -07002142 count = min_t(unsigned int, conn->mtu, len);
2143
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002144 tmp = chan->ops->alloc_skb(chan, 0, count,
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002145 msg->msg_flags & MSG_DONTWAIT);
2146 if (IS_ERR(tmp))
2147 return PTR_ERR(tmp);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002148
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002149 *frag = tmp;
2150
Al Virocbbd26b2016-11-01 22:09:04 -04002151 if (!copy_from_iter_full(skb_put(*frag, count), count,
2152 &msg->msg_iter))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002153 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002154
2155 sent += count;
2156 len -= count;
2157
Gustavo Padovan2d0ed3d2012-05-11 13:16:12 -03002158 skb->len += (*frag)->len;
2159 skb->data_len += (*frag)->len;
2160
Linus Torvalds1da177e2005-04-16 15:20:36 -07002161 frag = &(*frag)->next;
2162 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002163
2164 return sent;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002165}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002166
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002167static struct sk_buff *l2cap_create_connless_pdu(struct l2cap_chan *chan,
Marcel Holtmann8d463212014-06-05 15:22:51 +02002168 struct msghdr *msg, size_t len)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002169{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002170 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002171 struct sk_buff *skb;
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002172 int err, count, hlen = L2CAP_HDR_SIZE + L2CAP_PSMLEN_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002173 struct l2cap_hdr *lh;
2174
Marcel Holtmann8d463212014-06-05 15:22:51 +02002175 BT_DBG("chan %p psm 0x%2.2x len %zu", chan,
2176 __le16_to_cpu(chan->psm), len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002177
2178 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002179
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002180 skb = chan->ops->alloc_skb(chan, hlen, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002181 msg->msg_flags & MSG_DONTWAIT);
2182 if (IS_ERR(skb))
2183 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002184
2185 /* Create L2CAP header */
Johannes Berg4df864c2017-06-16 14:29:21 +02002186 lh = skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002187 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenkodaf6a78c2012-05-03 10:55:52 +03002188 lh->len = cpu_to_le16(len + L2CAP_PSMLEN_SIZE);
Marcel Holtmann43b1b8d2013-10-12 06:01:26 -07002189 put_unaligned(chan->psm, (__le16 *) skb_put(skb, L2CAP_PSMLEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002190
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002191 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002192 if (unlikely(err < 0)) {
2193 kfree_skb(skb);
2194 return ERR_PTR(err);
2195 }
2196 return skb;
2197}
2198
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002199static struct sk_buff *l2cap_create_basic_pdu(struct l2cap_chan *chan,
Marcel Holtmann8d463212014-06-05 15:22:51 +02002200 struct msghdr *msg, size_t len)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002201{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002202 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002203 struct sk_buff *skb;
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002204 int err, count;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002205 struct l2cap_hdr *lh;
2206
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002207 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002208
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002209 count = min_t(unsigned int, (conn->mtu - L2CAP_HDR_SIZE), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002210
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002211 skb = chan->ops->alloc_skb(chan, L2CAP_HDR_SIZE, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002212 msg->msg_flags & MSG_DONTWAIT);
2213 if (IS_ERR(skb))
2214 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002215
2216 /* Create L2CAP header */
Johannes Berg4df864c2017-06-16 14:29:21 +02002217 lh = skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002218 lh->cid = cpu_to_le16(chan->dcid);
Gustavo Padovan6ff9b5e2012-05-02 11:56:17 -03002219 lh->len = cpu_to_le16(len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002220
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002221 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002222 if (unlikely(err < 0)) {
2223 kfree_skb(skb);
2224 return ERR_PTR(err);
2225 }
2226 return skb;
2227}
2228
Luiz Augusto von Dentzab0ff762011-09-12 20:00:50 +03002229static struct sk_buff *l2cap_create_iframe_pdu(struct l2cap_chan *chan,
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002230 struct msghdr *msg, size_t len,
2231 u16 sdulen)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002232{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002233 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002234 struct sk_buff *skb;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002235 int err, count, hlen;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002236 struct l2cap_hdr *lh;
2237
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002238 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002239
Gustavo F. Padovan0ee0d202010-05-01 16:15:41 -03002240 if (!conn)
2241 return ERR_PTR(-ENOTCONN);
2242
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002243 hlen = __ertm_hdr_size(chan);
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002244
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002245 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002246 hlen += L2CAP_SDULEN_SIZE;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002247
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03002248 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002249 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03002250
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002251 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002252
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002253 skb = chan->ops->alloc_skb(chan, hlen, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002254 msg->msg_flags & MSG_DONTWAIT);
2255 if (IS_ERR(skb))
2256 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002257
2258 /* Create L2CAP header */
Johannes Berg4df864c2017-06-16 14:29:21 +02002259 lh = skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002260 lh->cid = cpu_to_le16(chan->dcid);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002261 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002262
Mat Martineau18a48e72012-05-17 20:53:34 -07002263 /* Control header is populated later */
2264 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
2265 put_unaligned_le32(0, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
2266 else
2267 put_unaligned_le16(0, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002268
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002269 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002270 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002271
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002272 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002273 if (unlikely(err < 0)) {
2274 kfree_skb(skb);
2275 return ERR_PTR(err);
2276 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03002277
Johan Hedberga4368ff2015-03-30 23:21:01 +03002278 bt_cb(skb)->l2cap.fcs = chan->fcs;
2279 bt_cb(skb)->l2cap.retries = 0;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002280 return skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002281}
2282
Mat Martineau94122bb2012-05-02 09:42:02 -07002283static int l2cap_segment_sdu(struct l2cap_chan *chan,
2284 struct sk_buff_head *seg_queue,
2285 struct msghdr *msg, size_t len)
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002286{
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002287 struct sk_buff *skb;
Mat Martineau94122bb2012-05-02 09:42:02 -07002288 u16 sdu_len;
2289 size_t pdu_len;
Mat Martineau94122bb2012-05-02 09:42:02 -07002290 u8 sar;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002291
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002292 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002293
Mat Martineau94122bb2012-05-02 09:42:02 -07002294 /* It is critical that ERTM PDUs fit in a single HCI fragment,
2295 * so fragmented skbs are not used. The HCI layer's handling
2296 * of fragmented skbs is not compatible with ERTM's queueing.
2297 */
2298
2299 /* PDU size is derived from the HCI MTU */
2300 pdu_len = chan->conn->mtu;
2301
Mat Martineaua5495742012-10-23 15:24:21 -07002302 /* Constrain PDU size for BR/EDR connections */
2303 if (!chan->hs_hcon)
2304 pdu_len = min_t(size_t, pdu_len, L2CAP_BREDR_MAX_PAYLOAD);
Mat Martineau94122bb2012-05-02 09:42:02 -07002305
2306 /* Adjust for largest possible L2CAP overhead. */
Gustavo Padovan35d401d2012-05-25 18:57:05 -03002307 if (chan->fcs)
2308 pdu_len -= L2CAP_FCS_SIZE;
2309
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002310 pdu_len -= __ertm_hdr_size(chan);
Mat Martineau94122bb2012-05-02 09:42:02 -07002311
2312 /* Remote device may have requested smaller PDUs */
2313 pdu_len = min_t(size_t, pdu_len, chan->remote_mps);
2314
2315 if (len <= pdu_len) {
2316 sar = L2CAP_SAR_UNSEGMENTED;
2317 sdu_len = 0;
2318 pdu_len = len;
2319 } else {
2320 sar = L2CAP_SAR_START;
2321 sdu_len = len;
Mat Martineau94122bb2012-05-02 09:42:02 -07002322 }
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002323
2324 while (len > 0) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002325 skb = l2cap_create_iframe_pdu(chan, msg, pdu_len, sdu_len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002326
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002327 if (IS_ERR(skb)) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002328 __skb_queue_purge(seg_queue);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002329 return PTR_ERR(skb);
2330 }
2331
Johan Hedberga4368ff2015-03-30 23:21:01 +03002332 bt_cb(skb)->l2cap.sar = sar;
Mat Martineau94122bb2012-05-02 09:42:02 -07002333 __skb_queue_tail(seg_queue, skb);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002334
Mat Martineau94122bb2012-05-02 09:42:02 -07002335 len -= pdu_len;
Lukasz Rymanowski069cb272014-08-13 16:01:41 +02002336 if (sdu_len)
Mat Martineau94122bb2012-05-02 09:42:02 -07002337 sdu_len = 0;
Mat Martineau94122bb2012-05-02 09:42:02 -07002338
2339 if (len <= pdu_len) {
2340 sar = L2CAP_SAR_END;
2341 pdu_len = len;
2342 } else {
2343 sar = L2CAP_SAR_CONTINUE;
2344 }
2345 }
2346
Gustavo Padovanf0f62792012-05-29 13:29:17 -03002347 return 0;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002348}
2349
Johan Hedberg177f8f22013-05-31 17:54:51 +03002350static struct sk_buff *l2cap_create_le_flowctl_pdu(struct l2cap_chan *chan,
2351 struct msghdr *msg,
2352 size_t len, u16 sdulen)
2353{
2354 struct l2cap_conn *conn = chan->conn;
2355 struct sk_buff *skb;
2356 int err, count, hlen;
2357 struct l2cap_hdr *lh;
2358
2359 BT_DBG("chan %p len %zu", chan, len);
2360
2361 if (!conn)
2362 return ERR_PTR(-ENOTCONN);
2363
2364 hlen = L2CAP_HDR_SIZE;
2365
2366 if (sdulen)
2367 hlen += L2CAP_SDULEN_SIZE;
2368
2369 count = min_t(unsigned int, (conn->mtu - hlen), len);
2370
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002371 skb = chan->ops->alloc_skb(chan, hlen, count,
Johan Hedberg177f8f22013-05-31 17:54:51 +03002372 msg->msg_flags & MSG_DONTWAIT);
2373 if (IS_ERR(skb))
2374 return skb;
2375
2376 /* Create L2CAP header */
Johannes Berg4df864c2017-06-16 14:29:21 +02002377 lh = skb_put(skb, L2CAP_HDR_SIZE);
Johan Hedberg177f8f22013-05-31 17:54:51 +03002378 lh->cid = cpu_to_le16(chan->dcid);
2379 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
2380
2381 if (sdulen)
2382 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
2383
2384 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
2385 if (unlikely(err < 0)) {
2386 kfree_skb(skb);
2387 return ERR_PTR(err);
2388 }
2389
2390 return skb;
2391}
2392
2393static int l2cap_segment_le_sdu(struct l2cap_chan *chan,
2394 struct sk_buff_head *seg_queue,
2395 struct msghdr *msg, size_t len)
2396{
2397 struct sk_buff *skb;
2398 size_t pdu_len;
2399 u16 sdu_len;
2400
2401 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
2402
Johan Hedberg177f8f22013-05-31 17:54:51 +03002403 sdu_len = len;
Johan Hedberg72c6fb92014-08-15 21:06:51 +03002404 pdu_len = chan->remote_mps - L2CAP_SDULEN_SIZE;
Johan Hedberg177f8f22013-05-31 17:54:51 +03002405
2406 while (len > 0) {
2407 if (len <= pdu_len)
2408 pdu_len = len;
2409
2410 skb = l2cap_create_le_flowctl_pdu(chan, msg, pdu_len, sdu_len);
2411 if (IS_ERR(skb)) {
2412 __skb_queue_purge(seg_queue);
2413 return PTR_ERR(skb);
2414 }
2415
2416 __skb_queue_tail(seg_queue, skb);
2417
2418 len -= pdu_len;
2419
2420 if (sdu_len) {
2421 sdu_len = 0;
2422 pdu_len += L2CAP_SDULEN_SIZE;
2423 }
2424 }
2425
2426 return 0;
2427}
2428
Luiz Augusto von Dentz8a505b72017-04-11 22:21:01 +03002429static void l2cap_le_flowctl_send(struct l2cap_chan *chan)
2430{
2431 int sent = 0;
2432
2433 BT_DBG("chan %p", chan);
2434
2435 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
2436 l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
2437 chan->tx_credits--;
2438 sent++;
2439 }
2440
2441 BT_DBG("Sent %d credits %u queued %u", sent, chan->tx_credits,
2442 skb_queue_len(&chan->tx_q));
2443}
2444
Marcel Holtmann8d463212014-06-05 15:22:51 +02002445int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002446{
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002447 struct sk_buff *skb;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002448 int err;
Mat Martineau94122bb2012-05-02 09:42:02 -07002449 struct sk_buff_head seg_queue;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002450
Seung-Woo Kim31e8ce82013-11-05 18:46:33 +09002451 if (!chan->conn)
2452 return -ENOTCONN;
2453
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002454 /* Connectionless channel */
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002455 if (chan->chan_type == L2CAP_CHAN_CONN_LESS) {
Marcel Holtmann8d463212014-06-05 15:22:51 +02002456 skb = l2cap_create_connless_pdu(chan, msg, len);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002457 if (IS_ERR(skb))
2458 return PTR_ERR(skb);
2459
Andrzej Kaczmarekede81a22014-02-25 17:16:22 +01002460 /* Channel lock is released before requesting new skb and then
2461 * reacquired thus we need to recheck channel state.
2462 */
2463 if (chan->state != BT_CONNECTED) {
2464 kfree_skb(skb);
2465 return -ENOTCONN;
2466 }
2467
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002468 l2cap_do_send(chan, skb);
2469 return len;
2470 }
2471
2472 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03002473 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedberg177f8f22013-05-31 17:54:51 +03002474 /* Check outgoing MTU */
2475 if (len > chan->omtu)
2476 return -EMSGSIZE;
2477
Johan Hedberg177f8f22013-05-31 17:54:51 +03002478 __skb_queue_head_init(&seg_queue);
2479
2480 err = l2cap_segment_le_sdu(chan, &seg_queue, msg, len);
2481
2482 if (chan->state != BT_CONNECTED) {
2483 __skb_queue_purge(&seg_queue);
2484 err = -ENOTCONN;
2485 }
2486
2487 if (err)
2488 return err;
2489
2490 skb_queue_splice_tail_init(&seg_queue, &chan->tx_q);
2491
Luiz Augusto von Dentz8a505b72017-04-11 22:21:01 +03002492 l2cap_le_flowctl_send(chan);
Johan Hedberg177f8f22013-05-31 17:54:51 +03002493
2494 if (!chan->tx_credits)
2495 chan->ops->suspend(chan);
2496
2497 err = len;
2498
2499 break;
2500
Johan Hedbergfad5fc82013-12-05 09:45:01 +02002501 case L2CAP_MODE_BASIC:
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002502 /* Check outgoing MTU */
2503 if (len > chan->omtu)
2504 return -EMSGSIZE;
2505
2506 /* Create a basic PDU */
Marcel Holtmann8d463212014-06-05 15:22:51 +02002507 skb = l2cap_create_basic_pdu(chan, msg, len);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002508 if (IS_ERR(skb))
2509 return PTR_ERR(skb);
2510
Andrzej Kaczmarekede81a22014-02-25 17:16:22 +01002511 /* Channel lock is released before requesting new skb and then
2512 * reacquired thus we need to recheck channel state.
2513 */
2514 if (chan->state != BT_CONNECTED) {
2515 kfree_skb(skb);
2516 return -ENOTCONN;
2517 }
2518
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002519 l2cap_do_send(chan, skb);
2520 err = len;
2521 break;
2522
2523 case L2CAP_MODE_ERTM:
2524 case L2CAP_MODE_STREAMING:
Mat Martineau94122bb2012-05-02 09:42:02 -07002525 /* Check outgoing MTU */
2526 if (len > chan->omtu) {
2527 err = -EMSGSIZE;
2528 break;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002529 }
2530
Mat Martineau94122bb2012-05-02 09:42:02 -07002531 __skb_queue_head_init(&seg_queue);
2532
2533 /* Do segmentation before calling in to the state machine,
2534 * since it's possible to block while waiting for memory
2535 * allocation.
2536 */
2537 err = l2cap_segment_sdu(chan, &seg_queue, msg, len);
2538
2539 /* The channel could have been closed while segmenting,
2540 * check that it is still connected.
2541 */
2542 if (chan->state != BT_CONNECTED) {
2543 __skb_queue_purge(&seg_queue);
2544 err = -ENOTCONN;
2545 }
2546
2547 if (err)
2548 break;
2549
Mat Martineau37339372012-05-17 20:53:33 -07002550 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo Padovand6603662012-05-21 13:58:22 -03002551 l2cap_tx(chan, NULL, &seg_queue, L2CAP_EV_DATA_REQUEST);
Mat Martineau37339372012-05-17 20:53:33 -07002552 else
Gustavo Padovand6603662012-05-21 13:58:22 -03002553 l2cap_streaming_send(chan, &seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002554
Gustavo Padovand6603662012-05-21 13:58:22 -03002555 err = len;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002556
Mat Martineau94122bb2012-05-02 09:42:02 -07002557 /* If the skbs were not queued for sending, they'll still be in
2558 * seg_queue and need to be purged.
2559 */
2560 __skb_queue_purge(&seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002561 break;
2562
2563 default:
2564 BT_DBG("bad state %1.1x", chan->mode);
2565 err = -EBADFD;
2566 }
2567
2568 return err;
2569}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +03002570EXPORT_SYMBOL_GPL(l2cap_chan_send);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002571
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002572static void l2cap_send_srej(struct l2cap_chan *chan, u16 txseq)
2573{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002574 struct l2cap_ctrl control;
2575 u16 seq;
2576
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002577 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002578
2579 memset(&control, 0, sizeof(control));
2580 control.sframe = 1;
2581 control.super = L2CAP_SUPER_SREJ;
2582
2583 for (seq = chan->expected_tx_seq; seq != txseq;
2584 seq = __next_seq(chan, seq)) {
2585 if (!l2cap_ertm_seq_in_queue(&chan->srej_q, seq)) {
2586 control.reqseq = seq;
2587 l2cap_send_sframe(chan, &control);
2588 l2cap_seq_list_append(&chan->srej_list, seq);
2589 }
2590 }
2591
2592 chan->expected_tx_seq = __next_seq(chan, txseq);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002593}
2594
2595static void l2cap_send_srej_tail(struct l2cap_chan *chan)
2596{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002597 struct l2cap_ctrl control;
2598
2599 BT_DBG("chan %p", chan);
2600
2601 if (chan->srej_list.tail == L2CAP_SEQ_LIST_CLEAR)
2602 return;
2603
2604 memset(&control, 0, sizeof(control));
2605 control.sframe = 1;
2606 control.super = L2CAP_SUPER_SREJ;
2607 control.reqseq = chan->srej_list.tail;
2608 l2cap_send_sframe(chan, &control);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002609}
2610
2611static void l2cap_send_srej_list(struct l2cap_chan *chan, u16 txseq)
2612{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002613 struct l2cap_ctrl control;
2614 u16 initial_head;
2615 u16 seq;
2616
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002617 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002618
2619 memset(&control, 0, sizeof(control));
2620 control.sframe = 1;
2621 control.super = L2CAP_SUPER_SREJ;
2622
2623 /* Capture initial list head to allow only one pass through the list. */
2624 initial_head = chan->srej_list.head;
2625
2626 do {
2627 seq = l2cap_seq_list_pop(&chan->srej_list);
2628 if (seq == txseq || seq == L2CAP_SEQ_LIST_CLEAR)
2629 break;
2630
2631 control.reqseq = seq;
2632 l2cap_send_sframe(chan, &control);
2633 l2cap_seq_list_append(&chan->srej_list, seq);
2634 } while (chan->srej_list.head != initial_head);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002635}
2636
Mat Martineau608bcc62012-05-17 20:53:32 -07002637static void l2cap_process_reqseq(struct l2cap_chan *chan, u16 reqseq)
2638{
2639 struct sk_buff *acked_skb;
2640 u16 ackseq;
2641
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002642 BT_DBG("chan %p, reqseq %u", chan, reqseq);
Mat Martineau608bcc62012-05-17 20:53:32 -07002643
2644 if (chan->unacked_frames == 0 || reqseq == chan->expected_ack_seq)
2645 return;
2646
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002647 BT_DBG("expected_ack_seq %u, unacked_frames %u",
Mat Martineau608bcc62012-05-17 20:53:32 -07002648 chan->expected_ack_seq, chan->unacked_frames);
2649
2650 for (ackseq = chan->expected_ack_seq; ackseq != reqseq;
2651 ackseq = __next_seq(chan, ackseq)) {
2652
2653 acked_skb = l2cap_ertm_seq_in_queue(&chan->tx_q, ackseq);
2654 if (acked_skb) {
2655 skb_unlink(acked_skb, &chan->tx_q);
2656 kfree_skb(acked_skb);
2657 chan->unacked_frames--;
2658 }
2659 }
2660
2661 chan->expected_ack_seq = reqseq;
2662
2663 if (chan->unacked_frames == 0)
2664 __clear_retrans_timer(chan);
2665
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002666 BT_DBG("unacked_frames %u", chan->unacked_frames);
Mat Martineau608bcc62012-05-17 20:53:32 -07002667}
2668
2669static void l2cap_abort_rx_srej_sent(struct l2cap_chan *chan)
2670{
2671 BT_DBG("chan %p", chan);
2672
2673 chan->expected_tx_seq = chan->buffer_seq;
2674 l2cap_seq_list_clear(&chan->srej_list);
2675 skb_queue_purge(&chan->srej_q);
2676 chan->rx_state = L2CAP_RX_STATE_RECV;
2677}
2678
Gustavo Padovand6603662012-05-21 13:58:22 -03002679static void l2cap_tx_state_xmit(struct l2cap_chan *chan,
2680 struct l2cap_ctrl *control,
2681 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002682{
Mat Martineau608bcc62012-05-17 20:53:32 -07002683 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2684 event);
2685
2686 switch (event) {
2687 case L2CAP_EV_DATA_REQUEST:
2688 if (chan->tx_send_head == NULL)
2689 chan->tx_send_head = skb_peek(skbs);
2690
2691 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2692 l2cap_ertm_send(chan);
2693 break;
2694 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2695 BT_DBG("Enter LOCAL_BUSY");
2696 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2697
2698 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2699 /* The SREJ_SENT state must be aborted if we are to
2700 * enter the LOCAL_BUSY state.
2701 */
2702 l2cap_abort_rx_srej_sent(chan);
2703 }
2704
2705 l2cap_send_ack(chan);
2706
2707 break;
2708 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2709 BT_DBG("Exit LOCAL_BUSY");
2710 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2711
2712 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2713 struct l2cap_ctrl local_control;
2714
2715 memset(&local_control, 0, sizeof(local_control));
2716 local_control.sframe = 1;
2717 local_control.super = L2CAP_SUPER_RR;
2718 local_control.poll = 1;
2719 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002720 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002721
2722 chan->retry_count = 1;
2723 __set_monitor_timer(chan);
2724 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2725 }
2726 break;
2727 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2728 l2cap_process_reqseq(chan, control->reqseq);
2729 break;
2730 case L2CAP_EV_EXPLICIT_POLL:
2731 l2cap_send_rr_or_rnr(chan, 1);
2732 chan->retry_count = 1;
2733 __set_monitor_timer(chan);
2734 __clear_ack_timer(chan);
2735 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2736 break;
2737 case L2CAP_EV_RETRANS_TO:
2738 l2cap_send_rr_or_rnr(chan, 1);
2739 chan->retry_count = 1;
2740 __set_monitor_timer(chan);
2741 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2742 break;
2743 case L2CAP_EV_RECV_FBIT:
2744 /* Nothing to process */
2745 break;
2746 default:
2747 break;
2748 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002749}
2750
Gustavo Padovand6603662012-05-21 13:58:22 -03002751static void l2cap_tx_state_wait_f(struct l2cap_chan *chan,
2752 struct l2cap_ctrl *control,
2753 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002754{
Mat Martineau608bcc62012-05-17 20:53:32 -07002755 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2756 event);
2757
2758 switch (event) {
2759 case L2CAP_EV_DATA_REQUEST:
2760 if (chan->tx_send_head == NULL)
2761 chan->tx_send_head = skb_peek(skbs);
2762 /* Queue data, but don't send. */
2763 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2764 break;
2765 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2766 BT_DBG("Enter LOCAL_BUSY");
2767 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2768
2769 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2770 /* The SREJ_SENT state must be aborted if we are to
2771 * enter the LOCAL_BUSY state.
2772 */
2773 l2cap_abort_rx_srej_sent(chan);
2774 }
2775
2776 l2cap_send_ack(chan);
2777
2778 break;
2779 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2780 BT_DBG("Exit LOCAL_BUSY");
2781 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2782
2783 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2784 struct l2cap_ctrl local_control;
2785 memset(&local_control, 0, sizeof(local_control));
2786 local_control.sframe = 1;
2787 local_control.super = L2CAP_SUPER_RR;
2788 local_control.poll = 1;
2789 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002790 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002791
2792 chan->retry_count = 1;
2793 __set_monitor_timer(chan);
2794 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2795 }
2796 break;
2797 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2798 l2cap_process_reqseq(chan, control->reqseq);
2799
2800 /* Fall through */
2801
2802 case L2CAP_EV_RECV_FBIT:
2803 if (control && control->final) {
2804 __clear_monitor_timer(chan);
2805 if (chan->unacked_frames > 0)
2806 __set_retrans_timer(chan);
2807 chan->retry_count = 0;
2808 chan->tx_state = L2CAP_TX_STATE_XMIT;
2809 BT_DBG("recv fbit tx_state 0x2.2%x", chan->tx_state);
2810 }
2811 break;
2812 case L2CAP_EV_EXPLICIT_POLL:
2813 /* Ignore */
2814 break;
2815 case L2CAP_EV_MONITOR_TO:
2816 if (chan->max_tx == 0 || chan->retry_count < chan->max_tx) {
2817 l2cap_send_rr_or_rnr(chan, 1);
2818 __set_monitor_timer(chan);
2819 chan->retry_count++;
2820 } else {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02002821 l2cap_send_disconn_req(chan, ECONNABORTED);
Mat Martineau608bcc62012-05-17 20:53:32 -07002822 }
2823 break;
2824 default:
2825 break;
2826 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002827}
2828
Gustavo Padovand6603662012-05-21 13:58:22 -03002829static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
2830 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002831{
Mat Martineau608bcc62012-05-17 20:53:32 -07002832 BT_DBG("chan %p, control %p, skbs %p, event %d, state %d",
2833 chan, control, skbs, event, chan->tx_state);
2834
2835 switch (chan->tx_state) {
2836 case L2CAP_TX_STATE_XMIT:
Gustavo Padovand6603662012-05-21 13:58:22 -03002837 l2cap_tx_state_xmit(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002838 break;
2839 case L2CAP_TX_STATE_WAIT_F:
Gustavo Padovand6603662012-05-21 13:58:22 -03002840 l2cap_tx_state_wait_f(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002841 break;
2842 default:
2843 /* Ignore event */
2844 break;
2845 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002846}
2847
Mat Martineau4b51dae92012-05-17 20:53:37 -07002848static void l2cap_pass_to_tx(struct l2cap_chan *chan,
2849 struct l2cap_ctrl *control)
2850{
2851 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002852 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_REQSEQ_AND_FBIT);
Mat Martineau4b51dae92012-05-17 20:53:37 -07002853}
2854
Mat Martineauf80842a2012-05-17 20:53:46 -07002855static void l2cap_pass_to_tx_fbit(struct l2cap_chan *chan,
2856 struct l2cap_ctrl *control)
2857{
2858 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002859 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_FBIT);
Mat Martineauf80842a2012-05-17 20:53:46 -07002860}
2861
Linus Torvalds1da177e2005-04-16 15:20:36 -07002862/* Copy frame to all raw sockets on that connection */
2863static void l2cap_raw_recv(struct l2cap_conn *conn, struct sk_buff *skb)
2864{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002865 struct sk_buff *nskb;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03002866 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002867
2868 BT_DBG("conn %p", conn);
2869
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002870 mutex_lock(&conn->chan_lock);
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002871
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002872 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002873 if (chan->chan_type != L2CAP_CHAN_RAW)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002874 continue;
2875
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002876 /* Don't send frame to the channel it came from */
Johan Hedberga4368ff2015-03-30 23:21:01 +03002877 if (bt_cb(skb)->l2cap.chan == chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002878 continue;
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002879
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002880 nskb = skb_clone(skb, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03002881 if (!nskb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002882 continue;
Gustavo Padovan80b98022012-05-27 22:27:51 -03002883 if (chan->ops->recv(chan, nskb))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002884 kfree_skb(nskb);
2885 }
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002886
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002887 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002888}
2889
2890/* ---- L2CAP signalling commands ---- */
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002891static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn, u8 code,
2892 u8 ident, u16 dlen, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002893{
2894 struct sk_buff *skb, **frag;
2895 struct l2cap_cmd_hdr *cmd;
2896 struct l2cap_hdr *lh;
2897 int len, count;
2898
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002899 BT_DBG("conn %p, code 0x%2.2x, ident 0x%2.2x, len %u",
2900 conn, code, ident, dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002901
Anderson Lizardo300b9622013-06-02 16:30:40 -04002902 if (conn->mtu < L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE)
2903 return NULL;
2904
Linus Torvalds1da177e2005-04-16 15:20:36 -07002905 len = L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE + dlen;
2906 count = min_t(unsigned int, conn->mtu, len);
2907
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002908 skb = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002909 if (!skb)
2910 return NULL;
2911
Johannes Berg4df864c2017-06-16 14:29:21 +02002912 lh = skb_put(skb, L2CAP_HDR_SIZE);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002913 lh->len = cpu_to_le16(L2CAP_CMD_HDR_SIZE + dlen);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002914
2915 if (conn->hcon->type == LE_LINK)
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002916 lh->cid = cpu_to_le16(L2CAP_CID_LE_SIGNALING);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002917 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002918 lh->cid = cpu_to_le16(L2CAP_CID_SIGNALING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002919
Johannes Berg4df864c2017-06-16 14:29:21 +02002920 cmd = skb_put(skb, L2CAP_CMD_HDR_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002921 cmd->code = code;
2922 cmd->ident = ident;
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002923 cmd->len = cpu_to_le16(dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002924
2925 if (dlen) {
2926 count -= L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE;
Johannes Berg59ae1d12017-06-16 14:29:20 +02002927 skb_put_data(skb, data, count);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002928 data += count;
2929 }
2930
2931 len -= skb->len;
2932
2933 /* Continuation fragments (no L2CAP header) */
2934 frag = &skb_shinfo(skb)->frag_list;
2935 while (len) {
2936 count = min_t(unsigned int, conn->mtu, len);
2937
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002938 *frag = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002939 if (!*frag)
2940 goto fail;
2941
Johannes Berg59ae1d12017-06-16 14:29:20 +02002942 skb_put_data(*frag, data, count);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002943
2944 len -= count;
2945 data += count;
2946
2947 frag = &(*frag)->next;
2948 }
2949
2950 return skb;
2951
2952fail:
2953 kfree_skb(skb);
2954 return NULL;
2955}
2956
Gustavo Padovan2d792812012-10-06 10:07:01 +01002957static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen,
2958 unsigned long *val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002959{
2960 struct l2cap_conf_opt *opt = *ptr;
2961 int len;
2962
2963 len = L2CAP_CONF_OPT_SIZE + opt->len;
2964 *ptr += len;
2965
2966 *type = opt->type;
2967 *olen = opt->len;
2968
2969 switch (opt->len) {
2970 case 1:
2971 *val = *((u8 *) opt->val);
2972 break;
2973
2974 case 2:
steven miaobfaaeb32010-10-16 18:29:47 -04002975 *val = get_unaligned_le16(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002976 break;
2977
2978 case 4:
steven miaobfaaeb32010-10-16 18:29:47 -04002979 *val = get_unaligned_le32(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002980 break;
2981
2982 default:
2983 *val = (unsigned long) opt->val;
2984 break;
2985 }
2986
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002987 BT_DBG("type 0x%2.2x len %u val 0x%lx", *type, opt->len, *val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002988 return len;
2989}
2990
Ben Serie860d2c2017-09-09 23:15:59 +02002991static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val, size_t size)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002992{
2993 struct l2cap_conf_opt *opt = *ptr;
2994
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002995 BT_DBG("type 0x%2.2x len %u val 0x%lx", type, len, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002996
Ben Serie860d2c2017-09-09 23:15:59 +02002997 if (size < L2CAP_CONF_OPT_SIZE + len)
2998 return;
2999
Linus Torvalds1da177e2005-04-16 15:20:36 -07003000 opt->type = type;
3001 opt->len = len;
3002
3003 switch (len) {
3004 case 1:
3005 *((u8 *) opt->val) = val;
3006 break;
3007
3008 case 2:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02003009 put_unaligned_le16(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003010 break;
3011
3012 case 4:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02003013 put_unaligned_le32(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003014 break;
3015
3016 default:
3017 memcpy(opt->val, (void *) val, len);
3018 break;
3019 }
3020
3021 *ptr += L2CAP_CONF_OPT_SIZE + len;
3022}
3023
Ben Serie860d2c2017-09-09 23:15:59 +02003024static void l2cap_add_opt_efs(void **ptr, struct l2cap_chan *chan, size_t size)
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003025{
3026 struct l2cap_conf_efs efs;
3027
Szymon Janc1ec918c2011-11-16 09:32:21 +01003028 switch (chan->mode) {
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003029 case L2CAP_MODE_ERTM:
3030 efs.id = chan->local_id;
3031 efs.stype = chan->local_stype;
3032 efs.msdu = cpu_to_le16(chan->local_msdu);
3033 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003034 efs.acc_lat = cpu_to_le32(L2CAP_DEFAULT_ACC_LAT);
3035 efs.flush_to = cpu_to_le32(L2CAP_EFS_DEFAULT_FLUSH_TO);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003036 break;
3037
3038 case L2CAP_MODE_STREAMING:
3039 efs.id = 1;
3040 efs.stype = L2CAP_SERV_BESTEFFORT;
3041 efs.msdu = cpu_to_le16(chan->local_msdu);
3042 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
3043 efs.acc_lat = 0;
3044 efs.flush_to = 0;
3045 break;
3046
3047 default:
3048 return;
3049 }
3050
3051 l2cap_add_conf_opt(ptr, L2CAP_CONF_EFS, sizeof(efs),
Ben Serie860d2c2017-09-09 23:15:59 +02003052 (unsigned long) &efs, size);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003053}
3054
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003055static void l2cap_ack_timeout(struct work_struct *work)
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003056{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003057 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau03625202012-05-17 20:53:51 -07003058 ack_timer.work);
3059 u16 frames_to_ack;
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003060
Gustavo F. Padovan2fb9b3d2011-12-22 16:56:05 -02003061 BT_DBG("chan %p", chan);
3062
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003063 l2cap_chan_lock(chan);
3064
Mat Martineau03625202012-05-17 20:53:51 -07003065 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
3066 chan->last_acked_seq);
3067
3068 if (frames_to_ack)
3069 l2cap_send_rr_or_rnr(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003070
3071 l2cap_chan_unlock(chan);
Szymon Janc09bfb2e2012-01-11 10:59:49 +01003072 l2cap_chan_put(chan);
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003073}
3074
Andrei Emeltchenko466f8002012-05-29 13:59:01 +03003075int l2cap_ertm_init(struct l2cap_chan *chan)
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003076{
Mat Martineau3c588192012-04-11 10:48:42 -07003077 int err;
3078
Mat Martineau105bdf92012-04-27 16:50:48 -07003079 chan->next_tx_seq = 0;
3080 chan->expected_tx_seq = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003081 chan->expected_ack_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003082 chan->unacked_frames = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003083 chan->buffer_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003084 chan->frames_sent = 0;
Mat Martineau105bdf92012-04-27 16:50:48 -07003085 chan->last_acked_seq = 0;
3086 chan->sdu = NULL;
3087 chan->sdu_last_frag = NULL;
3088 chan->sdu_len = 0;
3089
Mat Martineaud34c34f2012-05-14 14:49:27 -07003090 skb_queue_head_init(&chan->tx_q);
3091
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003092 chan->local_amp_id = AMP_ID_BREDR;
3093 chan->move_id = AMP_ID_BREDR;
Mat Martineau08333282012-10-23 15:24:06 -07003094 chan->move_state = L2CAP_MOVE_STABLE;
3095 chan->move_role = L2CAP_MOVE_ROLE_NONE;
3096
Mat Martineau105bdf92012-04-27 16:50:48 -07003097 if (chan->mode != L2CAP_MODE_ERTM)
3098 return 0;
3099
3100 chan->rx_state = L2CAP_RX_STATE_RECV;
3101 chan->tx_state = L2CAP_TX_STATE_XMIT;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003102
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003103 INIT_DELAYED_WORK(&chan->retrans_timer, l2cap_retrans_timeout);
3104 INIT_DELAYED_WORK(&chan->monitor_timer, l2cap_monitor_timeout);
3105 INIT_DELAYED_WORK(&chan->ack_timer, l2cap_ack_timeout);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003106
Gustavo F. Padovanf1c67752011-03-25 20:36:10 -03003107 skb_queue_head_init(&chan->srej_q);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03003108
Mat Martineau3c588192012-04-11 10:48:42 -07003109 err = l2cap_seq_list_init(&chan->srej_list, chan->tx_win);
3110 if (err < 0)
3111 return err;
3112
Mat Martineau9dc9aff2012-05-17 16:20:14 -07003113 err = l2cap_seq_list_init(&chan->retrans_list, chan->remote_tx_win);
3114 if (err < 0)
3115 l2cap_seq_list_free(&chan->srej_list);
3116
3117 return err;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003118}
3119
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003120static inline __u8 l2cap_select_mode(__u8 mode, __u16 remote_feat_mask)
3121{
3122 switch (mode) {
3123 case L2CAP_MODE_STREAMING:
3124 case L2CAP_MODE_ERTM:
3125 if (l2cap_mode_supported(mode, remote_feat_mask))
3126 return mode;
3127 /* fall through */
3128 default:
3129 return L2CAP_MODE_BASIC;
3130 }
3131}
3132
Marcel Holtmann848566b2013-10-01 22:59:22 -07003133static inline bool __l2cap_ews_supported(struct l2cap_conn *conn)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003134{
Johan Hedberg0bd49fc2014-12-02 10:09:26 +02003135 return ((conn->local_fixed_chan & L2CAP_FC_A2MP) &&
3136 (conn->feat_mask & L2CAP_FEAT_EXT_WINDOW));
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003137}
3138
Marcel Holtmann848566b2013-10-01 22:59:22 -07003139static inline bool __l2cap_efs_supported(struct l2cap_conn *conn)
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003140{
Johan Hedberg0bd49fc2014-12-02 10:09:26 +02003141 return ((conn->local_fixed_chan & L2CAP_FC_A2MP) &&
3142 (conn->feat_mask & L2CAP_FEAT_EXT_FLOW));
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003143}
3144
Mat Martineau36c86c82012-10-23 15:24:20 -07003145static void __l2cap_set_ertm_timeouts(struct l2cap_chan *chan,
3146 struct l2cap_conf_rfc *rfc)
3147{
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003148 if (chan->local_amp_id != AMP_ID_BREDR && chan->hs_hcon) {
Mat Martineau36c86c82012-10-23 15:24:20 -07003149 u64 ertm_to = chan->hs_hcon->hdev->amp_be_flush_to;
3150
3151 /* Class 1 devices have must have ERTM timeouts
3152 * exceeding the Link Supervision Timeout. The
3153 * default Link Supervision Timeout for AMP
3154 * controllers is 10 seconds.
3155 *
3156 * Class 1 devices use 0xffffffff for their
3157 * best-effort flush timeout, so the clamping logic
3158 * will result in a timeout that meets the above
3159 * requirement. ERTM timeouts are 16-bit values, so
3160 * the maximum timeout is 65.535 seconds.
3161 */
3162
3163 /* Convert timeout to milliseconds and round */
3164 ertm_to = DIV_ROUND_UP_ULL(ertm_to, 1000);
3165
3166 /* This is the recommended formula for class 2 devices
3167 * that start ERTM timers when packets are sent to the
3168 * controller.
3169 */
3170 ertm_to = 3 * ertm_to + 500;
3171
3172 if (ertm_to > 0xffff)
3173 ertm_to = 0xffff;
3174
3175 rfc->retrans_timeout = cpu_to_le16((u16) ertm_to);
3176 rfc->monitor_timeout = rfc->retrans_timeout;
3177 } else {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003178 rfc->retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO);
3179 rfc->monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO);
Mat Martineau36c86c82012-10-23 15:24:20 -07003180 }
3181}
3182
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003183static inline void l2cap_txwin_setup(struct l2cap_chan *chan)
3184{
3185 if (chan->tx_win > L2CAP_DEFAULT_TX_WINDOW &&
Marcel Holtmann848566b2013-10-01 22:59:22 -07003186 __l2cap_ews_supported(chan->conn)) {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003187 /* use extended control field */
3188 set_bit(FLAG_EXT_CTRL, &chan->flags);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003189 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
3190 } else {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003191 chan->tx_win = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003192 L2CAP_DEFAULT_TX_WINDOW);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003193 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
3194 }
Mat Martineauc20f8e32012-07-10 05:47:07 -07003195 chan->ack_win = chan->tx_win;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003196}
3197
Ben Serie860d2c2017-09-09 23:15:59 +02003198static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data, size_t data_size)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003199{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003200 struct l2cap_conf_req *req = data;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003201 struct l2cap_conf_rfc rfc = { .mode = chan->mode };
Linus Torvalds1da177e2005-04-16 15:20:36 -07003202 void *ptr = req->data;
Ben Serie860d2c2017-09-09 23:15:59 +02003203 void *endptr = data + data_size;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003204 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003205
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03003206 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003207
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003208 if (chan->num_conf_req || chan->num_conf_rsp)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003209 goto done;
3210
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003211 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003212 case L2CAP_MODE_STREAMING:
3213 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003214 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state))
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003215 break;
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003216
Marcel Holtmann848566b2013-10-01 22:59:22 -07003217 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003218 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3219
Gustavo F. Padovan2ba13ed2010-06-09 16:39:05 -03003220 /* fall through */
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003221 default:
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003222 chan->mode = l2cap_select_mode(rfc.mode, chan->conn->feat_mask);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003223 break;
3224 }
3225
3226done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003227 if (chan->imtu != L2CAP_DEFAULT_MTU)
Ben Serie860d2c2017-09-09 23:15:59 +02003228 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu, endptr - ptr);
Gustavo F. Padovan7990681c2011-01-24 16:01:43 -02003229
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003230 switch (chan->mode) {
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003231 case L2CAP_MODE_BASIC:
Marcel Holtmann6fea7ad2014-07-09 11:53:35 +02003232 if (disable_ertm)
3233 break;
3234
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003235 if (!(chan->conn->feat_mask & L2CAP_FEAT_ERTM) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003236 !(chan->conn->feat_mask & L2CAP_FEAT_STREAMING))
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003237 break;
3238
Gustavo F. Padovan62547752010-06-08 20:05:31 -03003239 rfc.mode = L2CAP_MODE_BASIC;
3240 rfc.txwin_size = 0;
3241 rfc.max_transmit = 0;
3242 rfc.retrans_timeout = 0;
3243 rfc.monitor_timeout = 0;
3244 rfc.max_pdu_size = 0;
3245
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003246 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Ben Serie860d2c2017-09-09 23:15:59 +02003247 (unsigned long) &rfc, endptr - ptr);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003248 break;
3249
3250 case L2CAP_MODE_ERTM:
3251 rfc.mode = L2CAP_MODE_ERTM;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003252 rfc.max_transmit = chan->max_tx;
Mat Martineau36c86c82012-10-23 15:24:20 -07003253
3254 __l2cap_set_ertm_timeouts(chan, &rfc);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003255
3256 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003257 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3258 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003259 rfc.max_pdu_size = cpu_to_le16(size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003260
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003261 l2cap_txwin_setup(chan);
3262
3263 rfc.txwin_size = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003264 L2CAP_DEFAULT_TX_WINDOW);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003265
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003266 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Ben Serie860d2c2017-09-09 23:15:59 +02003267 (unsigned long) &rfc, endptr - ptr);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003268
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003269 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
Ben Serie860d2c2017-09-09 23:15:59 +02003270 l2cap_add_opt_efs(&ptr, chan, endptr - ptr);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003271
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003272 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3273 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Ben Serie860d2c2017-09-09 23:15:59 +02003274 chan->tx_win, endptr - ptr);
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003275
3276 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3277 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003278 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003279 chan->fcs = L2CAP_FCS_NONE;
3280 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
Ben Serie860d2c2017-09-09 23:15:59 +02003281 chan->fcs, endptr - ptr);
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003282 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003283 break;
3284
3285 case L2CAP_MODE_STREAMING:
Mat Martineau273759e2012-05-17 20:53:53 -07003286 l2cap_txwin_setup(chan);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003287 rfc.mode = L2CAP_MODE_STREAMING;
3288 rfc.txwin_size = 0;
3289 rfc.max_transmit = 0;
3290 rfc.retrans_timeout = 0;
3291 rfc.monitor_timeout = 0;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003292
3293 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003294 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3295 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003296 rfc.max_pdu_size = cpu_to_le16(size);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003297
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003298 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Ben Serie860d2c2017-09-09 23:15:59 +02003299 (unsigned long) &rfc, endptr - ptr);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003300
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003301 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
Ben Serie860d2c2017-09-09 23:15:59 +02003302 l2cap_add_opt_efs(&ptr, chan, endptr - ptr);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003303
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003304 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3305 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003306 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003307 chan->fcs = L2CAP_FCS_NONE;
3308 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
Ben Serie860d2c2017-09-09 23:15:59 +02003309 chan->fcs, endptr - ptr);
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003310 }
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003311 break;
3312 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003313
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003314 req->dcid = cpu_to_le16(chan->dcid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003315 req->flags = cpu_to_le16(0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003316
3317 return ptr - data;
3318}
3319
Ben Serie860d2c2017-09-09 23:15:59 +02003320static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data, size_t data_size)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003321{
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003322 struct l2cap_conf_rsp *rsp = data;
3323 void *ptr = rsp->data;
Ben Serie860d2c2017-09-09 23:15:59 +02003324 void *endptr = data + data_size;
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003325 void *req = chan->conf_req;
3326 int len = chan->conf_len;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003327 int type, hint, olen;
3328 unsigned long val;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003329 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003330 struct l2cap_conf_efs efs;
3331 u8 remote_efs = 0;
Marcel Holtmann861d6882007-10-20 13:37:06 +02003332 u16 mtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003333 u16 result = L2CAP_CONF_SUCCESS;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003334 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003335
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003336 BT_DBG("chan %p", chan);
Marcel Holtmann820ae1b2006-11-18 22:15:00 +01003337
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003338 while (len >= L2CAP_CONF_OPT_SIZE) {
3339 len -= l2cap_get_conf_opt(&req, &type, &olen, &val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003340
Gustavo F. Padovan589d2742009-04-20 01:31:07 -03003341 hint = type & L2CAP_CONF_HINT;
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07003342 type &= L2CAP_CONF_MASK;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003343
3344 switch (type) {
3345 case L2CAP_CONF_MTU:
Marcel Holtmann861d6882007-10-20 13:37:06 +02003346 mtu = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003347 break;
3348
3349 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003350 chan->flush_to = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003351 break;
3352
3353 case L2CAP_CONF_QOS:
3354 break;
3355
Marcel Holtmann6464f352007-10-20 13:39:51 +02003356 case L2CAP_CONF_RFC:
3357 if (olen == sizeof(rfc))
3358 memcpy(&rfc, (void *) val, olen);
3359 break;
3360
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003361 case L2CAP_CONF_FCS:
3362 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003363 set_bit(CONF_RECV_NO_FCS, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003364 break;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003365
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003366 case L2CAP_CONF_EFS:
Ben Seri06e7e772017-12-08 15:14:47 +01003367 if (olen == sizeof(efs)) {
3368 remote_efs = 1;
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003369 memcpy(&efs, (void *) val, olen);
Ben Seri06e7e772017-12-08 15:14:47 +01003370 }
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003371 break;
3372
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003373 case L2CAP_CONF_EWS:
Johan Hedberg0bd49fc2014-12-02 10:09:26 +02003374 if (!(chan->conn->local_fixed_chan & L2CAP_FC_A2MP))
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003375 return -ECONNREFUSED;
3376
3377 set_bit(FLAG_EXT_CTRL, &chan->flags);
3378 set_bit(CONF_EWS_RECV, &chan->conf_state);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003379 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003380 chan->remote_tx_win = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003381 break;
3382
3383 default:
3384 if (hint)
3385 break;
3386
3387 result = L2CAP_CONF_UNKNOWN;
3388 *((u8 *) ptr++) = type;
3389 break;
3390 }
3391 }
3392
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003393 if (chan->num_conf_rsp || chan->num_conf_req > 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003394 goto done;
3395
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003396 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003397 case L2CAP_MODE_STREAMING:
3398 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003399 if (!test_bit(CONF_STATE2_DEVICE, &chan->conf_state)) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003400 chan->mode = l2cap_select_mode(rfc.mode,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003401 chan->conn->feat_mask);
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003402 break;
3403 }
3404
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003405 if (remote_efs) {
Marcel Holtmann848566b2013-10-01 22:59:22 -07003406 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003407 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3408 else
3409 return -ECONNREFUSED;
3410 }
3411
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003412 if (chan->mode != rfc.mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003413 return -ECONNREFUSED;
Gustavo F. Padovan742e5192010-06-08 19:09:48 -03003414
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003415 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003416 }
3417
3418done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003419 if (chan->mode != rfc.mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003420 result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003421 rfc.mode = chan->mode;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003422
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003423 if (chan->num_conf_rsp == 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003424 return -ECONNREFUSED;
3425
Gustavo Padovan2d792812012-10-06 10:07:01 +01003426 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Ben Serie860d2c2017-09-09 23:15:59 +02003427 (unsigned long) &rfc, endptr - ptr);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003428 }
3429
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003430 if (result == L2CAP_CONF_SUCCESS) {
3431 /* Configure output options and let the other side know
3432 * which ones we don't like. */
3433
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003434 if (mtu < L2CAP_DEFAULT_MIN_MTU)
3435 result = L2CAP_CONF_UNACCEPT;
3436 else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003437 chan->omtu = mtu;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003438 set_bit(CONF_MTU_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003439 }
Ben Serie860d2c2017-09-09 23:15:59 +02003440 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->omtu, endptr - ptr);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003441
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003442 if (remote_efs) {
3443 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003444 efs.stype != L2CAP_SERV_NOTRAFIC &&
3445 efs.stype != chan->local_stype) {
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003446
3447 result = L2CAP_CONF_UNACCEPT;
3448
3449 if (chan->num_conf_req >= 1)
3450 return -ECONNREFUSED;
3451
3452 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003453 sizeof(efs),
Ben Serie860d2c2017-09-09 23:15:59 +02003454 (unsigned long) &efs, endptr - ptr);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003455 } else {
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003456 /* Send PENDING Conf Rsp */
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003457 result = L2CAP_CONF_PENDING;
3458 set_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003459 }
3460 }
3461
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003462 switch (rfc.mode) {
3463 case L2CAP_MODE_BASIC:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003464 chan->fcs = L2CAP_FCS_NONE;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003465 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003466 break;
3467
3468 case L2CAP_MODE_ERTM:
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003469 if (!test_bit(CONF_EWS_RECV, &chan->conf_state))
3470 chan->remote_tx_win = rfc.txwin_size;
3471 else
3472 rfc.txwin_size = L2CAP_DEFAULT_TX_WINDOW;
3473
Gustavo F. Padovan2c03a7a2011-03-25 20:15:28 -03003474 chan->remote_max_tx = rfc.max_transmit;
Mat Martineau86b1b262010-08-05 15:54:22 -07003475
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003476 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003477 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3478 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003479 rfc.max_pdu_size = cpu_to_le16(size);
3480 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003481
Mat Martineau36c86c82012-10-23 15:24:20 -07003482 __l2cap_set_ertm_timeouts(chan, &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003483
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003484 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003485
3486 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Ben Serie860d2c2017-09-09 23:15:59 +02003487 sizeof(rfc), (unsigned long) &rfc, endptr - ptr);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003488
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003489 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3490 chan->remote_id = efs.id;
3491 chan->remote_stype = efs.stype;
3492 chan->remote_msdu = le16_to_cpu(efs.msdu);
3493 chan->remote_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003494 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003495 chan->remote_acc_lat =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003496 le32_to_cpu(efs.acc_lat);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003497 chan->remote_sdu_itime =
3498 le32_to_cpu(efs.sdu_itime);
3499 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003500 sizeof(efs),
Ben Serie860d2c2017-09-09 23:15:59 +02003501 (unsigned long) &efs, endptr - ptr);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003502 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003503 break;
3504
3505 case L2CAP_MODE_STREAMING:
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003506 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003507 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3508 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003509 rfc.max_pdu_size = cpu_to_le16(size);
3510 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003511
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003512 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003513
Gustavo Padovan2d792812012-10-06 10:07:01 +01003514 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Ben Serie860d2c2017-09-09 23:15:59 +02003515 (unsigned long) &rfc, endptr - ptr);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003516
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003517 break;
3518
3519 default:
Marcel Holtmann6464f352007-10-20 13:39:51 +02003520 result = L2CAP_CONF_UNACCEPT;
3521
3522 memset(&rfc, 0, sizeof(rfc));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003523 rfc.mode = chan->mode;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003524 }
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003525
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003526 if (result == L2CAP_CONF_SUCCESS)
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003527 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003528 }
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003529 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003530 rsp->result = cpu_to_le16(result);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003531 rsp->flags = cpu_to_le16(0);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003532
3533 return ptr - data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003534}
3535
Gustavo Padovan2d792812012-10-06 10:07:01 +01003536static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len,
Ben Serie860d2c2017-09-09 23:15:59 +02003537 void *data, size_t size, u16 *result)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003538{
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003539 struct l2cap_conf_req *req = data;
3540 void *ptr = req->data;
Ben Serie860d2c2017-09-09 23:15:59 +02003541 void *endptr = data + size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003542 int type, olen;
3543 unsigned long val;
Mat Martineau36e999a2011-12-08 17:23:21 -08003544 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003545 struct l2cap_conf_efs efs;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003546
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003547 BT_DBG("chan %p, rsp %p, len %d, req %p", chan, rsp, len, data);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003548
3549 while (len >= L2CAP_CONF_OPT_SIZE) {
3550 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3551
3552 switch (type) {
3553 case L2CAP_CONF_MTU:
3554 if (val < L2CAP_DEFAULT_MIN_MTU) {
3555 *result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003556 chan->imtu = L2CAP_DEFAULT_MIN_MTU;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003557 } else
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003558 chan->imtu = val;
Ben Serie860d2c2017-09-09 23:15:59 +02003559 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu, endptr - ptr);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003560 break;
3561
3562 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003563 chan->flush_to = val;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003564 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO,
Ben Serie860d2c2017-09-09 23:15:59 +02003565 2, chan->flush_to, endptr - ptr);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003566 break;
3567
3568 case L2CAP_CONF_RFC:
3569 if (olen == sizeof(rfc))
3570 memcpy(&rfc, (void *)val, olen);
3571
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003572 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003573 rfc.mode != chan->mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003574 return -ECONNREFUSED;
3575
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003576 chan->fcs = 0;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003577
3578 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Ben Serie860d2c2017-09-09 23:15:59 +02003579 sizeof(rfc), (unsigned long) &rfc, endptr - ptr);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003580 break;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003581
3582 case L2CAP_CONF_EWS:
Mat Martineauc20f8e32012-07-10 05:47:07 -07003583 chan->ack_win = min_t(u16, val, chan->ack_win);
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003584 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Ben Serie860d2c2017-09-09 23:15:59 +02003585 chan->tx_win, endptr - ptr);
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003586 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003587
3588 case L2CAP_CONF_EFS:
Ben Seri06e7e772017-12-08 15:14:47 +01003589 if (olen == sizeof(efs)) {
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003590 memcpy(&efs, (void *)val, olen);
3591
Ben Seri06e7e772017-12-08 15:14:47 +01003592 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
3593 efs.stype != L2CAP_SERV_NOTRAFIC &&
3594 efs.stype != chan->local_stype)
3595 return -ECONNREFUSED;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003596
Ben Seri06e7e772017-12-08 15:14:47 +01003597 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS, sizeof(efs),
3598 (unsigned long) &efs, endptr - ptr);
3599 }
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003600 break;
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003601
3602 case L2CAP_CONF_FCS:
3603 if (*result == L2CAP_CONF_PENDING)
3604 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003605 set_bit(CONF_RECV_NO_FCS,
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003606 &chan->conf_state);
3607 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003608 }
3609 }
3610
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003611 if (chan->mode == L2CAP_MODE_BASIC && chan->mode != rfc.mode)
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003612 return -ECONNREFUSED;
3613
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003614 chan->mode = rfc.mode;
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003615
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003616 if (*result == L2CAP_CONF_SUCCESS || *result == L2CAP_CONF_PENDING) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003617 switch (rfc.mode) {
3618 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003619 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3620 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
3621 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003622 if (!test_bit(FLAG_EXT_CTRL, &chan->flags))
3623 chan->ack_win = min_t(u16, chan->ack_win,
3624 rfc.txwin_size);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003625
3626 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3627 chan->local_msdu = le16_to_cpu(efs.msdu);
3628 chan->local_sdu_itime =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003629 le32_to_cpu(efs.sdu_itime);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003630 chan->local_acc_lat = le32_to_cpu(efs.acc_lat);
3631 chan->local_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003632 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003633 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003634 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003635
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003636 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003637 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003638 }
3639 }
3640
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003641 req->dcid = cpu_to_le16(chan->dcid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003642 req->flags = cpu_to_le16(0);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003643
3644 return ptr - data;
3645}
3646
Gustavo Padovan2d792812012-10-06 10:07:01 +01003647static int l2cap_build_conf_rsp(struct l2cap_chan *chan, void *data,
3648 u16 result, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003649{
3650 struct l2cap_conf_rsp *rsp = data;
3651 void *ptr = rsp->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003652
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003653 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003654
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003655 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003656 rsp->result = cpu_to_le16(result);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003657 rsp->flags = cpu_to_le16(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003658
3659 return ptr - data;
3660}
3661
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003662void __l2cap_le_connect_rsp_defer(struct l2cap_chan *chan)
3663{
3664 struct l2cap_le_conn_rsp rsp;
3665 struct l2cap_conn *conn = chan->conn;
3666
3667 BT_DBG("chan %p", chan);
3668
3669 rsp.dcid = cpu_to_le16(chan->scid);
3670 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02003671 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03003672 rsp.credits = cpu_to_le16(chan->rx_credits);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003673 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003674
3675 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp),
3676 &rsp);
3677}
3678
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003679void __l2cap_connect_rsp_defer(struct l2cap_chan *chan)
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003680{
3681 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003682 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003683 u8 buf[128];
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003684 u8 rsp_code;
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003685
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003686 rsp.scid = cpu_to_le16(chan->dcid);
3687 rsp.dcid = cpu_to_le16(chan->scid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003688 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
3689 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003690
3691 if (chan->hs_hcon)
3692 rsp_code = L2CAP_CREATE_CHAN_RSP;
3693 else
3694 rsp_code = L2CAP_CONN_RSP;
3695
3696 BT_DBG("chan %p rsp_code %u", chan, rsp_code);
3697
3698 l2cap_send_cmd(conn, chan->ident, rsp_code, sizeof(rsp), &rsp);
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003699
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003700 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003701 return;
3702
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003703 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Ben Serie860d2c2017-09-09 23:15:59 +02003704 l2cap_build_conf_req(chan, buf, sizeof(buf)), buf);
Gustavo F. Padovan710f9b02011-03-25 14:30:37 -03003705 chan->num_conf_req++;
3706}
3707
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003708static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len)
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003709{
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003710 int type, olen;
3711 unsigned long val;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003712 /* Use sane default values in case a misbehaving remote device
3713 * did not send an RFC or extended window size option.
3714 */
3715 u16 txwin_ext = chan->ack_win;
3716 struct l2cap_conf_rfc rfc = {
3717 .mode = chan->mode,
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003718 .retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO),
3719 .monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO),
Mat Martineauc20f8e32012-07-10 05:47:07 -07003720 .max_pdu_size = cpu_to_le16(chan->imtu),
3721 .txwin_size = min_t(u16, chan->ack_win, L2CAP_DEFAULT_TX_WINDOW),
3722 };
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003723
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003724 BT_DBG("chan %p, rsp %p, len %d", chan, rsp, len);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003725
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003726 if ((chan->mode != L2CAP_MODE_ERTM) && (chan->mode != L2CAP_MODE_STREAMING))
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003727 return;
3728
3729 while (len >= L2CAP_CONF_OPT_SIZE) {
3730 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3731
Mat Martineauc20f8e32012-07-10 05:47:07 -07003732 switch (type) {
3733 case L2CAP_CONF_RFC:
3734 if (olen == sizeof(rfc))
3735 memcpy(&rfc, (void *)val, olen);
Szymon Janc8f321f82012-06-08 11:33:33 +02003736 break;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003737 case L2CAP_CONF_EWS:
3738 txwin_ext = val;
3739 break;
3740 }
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003741 }
3742
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003743 switch (rfc.mode) {
3744 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003745 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3746 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003747 chan->mps = le16_to_cpu(rfc.max_pdu_size);
3748 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3749 chan->ack_win = min_t(u16, chan->ack_win, txwin_ext);
3750 else
3751 chan->ack_win = min_t(u16, chan->ack_win,
3752 rfc.txwin_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003753 break;
3754 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003755 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003756 }
3757}
3758
Gustavo Padovan2d792812012-10-06 10:07:01 +01003759static inline int l2cap_command_rej(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003760 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3761 u8 *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003762{
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003763 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003764
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003765 if (cmd_len < sizeof(*rej))
3766 return -EPROTO;
3767
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003768 if (rej->reason != L2CAP_REJ_NOT_UNDERSTOOD)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003769 return 0;
3770
3771 if ((conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003772 cmd->ident == conn->info_ident) {
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02003773 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann984947d2009-02-06 23:35:19 +01003774
3775 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01003776 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01003777
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003778 l2cap_conn_start(conn);
3779 }
3780
3781 return 0;
3782}
3783
Mat Martineau17009152012-10-23 15:24:07 -07003784static struct l2cap_chan *l2cap_connect(struct l2cap_conn *conn,
3785 struct l2cap_cmd_hdr *cmd,
3786 u8 *data, u8 rsp_code, u8 amp_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003787{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003788 struct l2cap_conn_req *req = (struct l2cap_conn_req *) data;
3789 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003790 struct l2cap_chan *chan = NULL, *pchan;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003791 int result, status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003792
3793 u16 dcid = 0, scid = __le16_to_cpu(req->scid);
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003794 __le16 psm = req->psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003795
Andrei Emeltchenko097db762012-03-09 14:16:17 +02003796 BT_DBG("psm 0x%2.2x scid 0x%4.4x", __le16_to_cpu(psm), scid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003797
3798 /* Check if we have socket listening on psm */
Marcel Holtmann6f59b902013-10-13 05:24:01 -07003799 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03003800 &conn->hcon->dst, ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003801 if (!pchan) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003802 result = L2CAP_CR_BAD_PSM;
3803 goto sendresp;
3804 }
3805
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003806 mutex_lock(&conn->chan_lock);
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003807 l2cap_chan_lock(pchan);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00003808
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003809 /* Check if the ACL is secure enough (if not SDP) */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003810 if (psm != cpu_to_le16(L2CAP_PSM_SDP) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003811 !hci_conn_check_link_mode(conn->hcon)) {
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02003812 conn->disc_reason = HCI_ERROR_AUTH_FAILURE;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003813 result = L2CAP_CR_SEC_BLOCK;
3814 goto response;
3815 }
3816
Linus Torvalds1da177e2005-04-16 15:20:36 -07003817 result = L2CAP_CR_NO_MEM;
3818
Gustavo Padovan2dfa1002012-05-27 22:27:58 -03003819 /* Check if we already have channel with that dcid */
3820 if (__l2cap_get_chan_by_dcid(conn, scid))
3821 goto response;
3822
Gustavo Padovan80b98022012-05-27 22:27:51 -03003823 chan = pchan->ops->new_connection(pchan);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03003824 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003825 goto response;
3826
Syam Sidhardhan330b6c12013-08-06 01:59:12 +09003827 /* For certain devices (ex: HID mouse), support for authentication,
3828 * pairing and bonding is optional. For such devices, inorder to avoid
3829 * the ACL alive for too long after L2CAP disconnection, reset the ACL
3830 * disc_timeout back to HCI_DISCONN_TIMEOUT during L2CAP connect.
3831 */
3832 conn->hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
3833
Marcel Holtmann7eafc592013-10-13 08:12:47 -07003834 bacpy(&chan->src, &conn->hcon->src);
3835 bacpy(&chan->dst, &conn->hcon->dst);
Johan Hedberga250e042015-01-15 13:06:44 +02003836 chan->src_type = bdaddr_src_type(conn->hcon);
3837 chan->dst_type = bdaddr_dst_type(conn->hcon);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003838 chan->psm = psm;
3839 chan->dcid = scid;
Mat Martineau17009152012-10-23 15:24:07 -07003840 chan->local_amp_id = amp_id;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003841
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003842 __l2cap_chan_add(conn, chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003843
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003844 dcid = chan->scid;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003845
Gustavo Padovan8d836d72013-10-15 19:24:47 -03003846 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003847
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003848 chan->ident = cmd->ident;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003849
Marcel Holtmann984947d2009-02-06 23:35:19 +01003850 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) {
Johan Hedberge7cafc42014-07-17 15:35:38 +03003851 if (l2cap_chan_check_security(chan, false)) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07003852 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003853 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003854 result = L2CAP_CR_PEND;
3855 status = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08003856 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003857 } else {
Mat Martineau17009152012-10-23 15:24:07 -07003858 /* Force pending result for AMP controllers.
3859 * The connection will succeed after the
3860 * physical link is up.
3861 */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003862 if (amp_id == AMP_ID_BREDR) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003863 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau17009152012-10-23 15:24:07 -07003864 result = L2CAP_CR_SUCCESS;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003865 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003866 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003867 result = L2CAP_CR_PEND;
Mat Martineau17009152012-10-23 15:24:07 -07003868 }
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003869 status = L2CAP_CS_NO_INFO;
3870 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003871 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003872 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003873 result = L2CAP_CR_PEND;
3874 status = L2CAP_CS_AUTHEN_PEND;
3875 }
3876 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003877 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003878 result = L2CAP_CR_PEND;
3879 status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003880 }
3881
Linus Torvalds1da177e2005-04-16 15:20:36 -07003882response:
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003883 l2cap_chan_unlock(pchan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003884 mutex_unlock(&conn->chan_lock);
Johan Hedberga24cce12014-08-07 22:56:42 +03003885 l2cap_chan_put(pchan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003886
3887sendresp:
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003888 rsp.scid = cpu_to_le16(scid);
3889 rsp.dcid = cpu_to_le16(dcid);
3890 rsp.result = cpu_to_le16(result);
3891 rsp.status = cpu_to_le16(status);
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003892 l2cap_send_cmd(conn, cmd->ident, rsp_code, sizeof(rsp), &rsp);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003893
3894 if (result == L2CAP_CR_PEND && status == L2CAP_CS_NO_INFO) {
3895 struct l2cap_info_req info;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003896 info.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003897
3898 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
3899 conn->info_ident = l2cap_get_ident(conn);
3900
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08003901 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003902
Gustavo Padovan2d792812012-10-06 10:07:01 +01003903 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
3904 sizeof(info), &info);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003905 }
3906
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003907 if (chan && !test_bit(CONF_REQ_SENT, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003908 result == L2CAP_CR_SUCCESS) {
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003909 u8 buf[128];
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003910 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003911 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Ben Serie860d2c2017-09-09 23:15:59 +02003912 l2cap_build_conf_req(chan, buf, sizeof(buf)), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003913 chan->num_conf_req++;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003914 }
Mat Martineau17009152012-10-23 15:24:07 -07003915
3916 return chan;
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003917}
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003918
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003919static int l2cap_connect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003920 struct l2cap_cmd_hdr *cmd, u16 cmd_len, u8 *data)
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003921{
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303922 struct hci_dev *hdev = conn->hcon->hdev;
3923 struct hci_conn *hcon = conn->hcon;
3924
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003925 if (cmd_len < sizeof(struct l2cap_conn_req))
3926 return -EPROTO;
3927
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303928 hci_dev_lock(hdev);
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003929 if (hci_dev_test_flag(hdev, HCI_MGMT) &&
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303930 !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &hcon->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00003931 mgmt_device_connected(hdev, hcon, 0, NULL, 0);
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303932 hci_dev_unlock(hdev);
3933
Gustavo Padovan300229f2012-10-12 19:40:40 +08003934 l2cap_connect(conn, cmd, data, L2CAP_CONN_RSP, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003935 return 0;
3936}
3937
Mat Martineau5909cf32012-10-23 15:24:08 -07003938static int l2cap_connect_create_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003939 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3940 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003941{
3942 struct l2cap_conn_rsp *rsp = (struct l2cap_conn_rsp *) data;
3943 u16 scid, dcid, result, status;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003944 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003945 u8 req[128];
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003946 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003947
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003948 if (cmd_len < sizeof(*rsp))
3949 return -EPROTO;
3950
Linus Torvalds1da177e2005-04-16 15:20:36 -07003951 scid = __le16_to_cpu(rsp->scid);
3952 dcid = __le16_to_cpu(rsp->dcid);
3953 result = __le16_to_cpu(rsp->result);
3954 status = __le16_to_cpu(rsp->status);
3955
Andrei Emeltchenko1b009c92012-02-21 12:54:54 +02003956 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 +01003957 dcid, scid, result, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003958
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003959 mutex_lock(&conn->chan_lock);
3960
Linus Torvalds1da177e2005-04-16 15:20:36 -07003961 if (scid) {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003962 chan = __l2cap_get_chan_by_scid(conn, scid);
3963 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003964 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003965 goto unlock;
3966 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003967 } else {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003968 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
3969 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003970 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003971 goto unlock;
3972 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003973 }
3974
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003975 err = 0;
3976
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003977 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003978
Linus Torvalds1da177e2005-04-16 15:20:36 -07003979 switch (result) {
3980 case L2CAP_CR_SUCCESS:
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03003981 l2cap_state_change(chan, BT_CONFIG);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003982 chan->ident = 0;
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003983 chan->dcid = dcid;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003984 clear_bit(CONF_CONNECT_PEND, &chan->conf_state);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01003985
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003986 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003987 break;
3988
Linus Torvalds1da177e2005-04-16 15:20:36 -07003989 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Ben Serie860d2c2017-09-09 23:15:59 +02003990 l2cap_build_conf_req(chan, req, sizeof(req)), req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003991 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003992 break;
3993
3994 case L2CAP_CR_PEND:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003995 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003996 break;
3997
3998 default:
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003999 l2cap_chan_del(chan, ECONNREFUSED);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004000 break;
4001 }
4002
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004003 l2cap_chan_unlock(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004004
4005unlock:
4006 mutex_unlock(&conn->chan_lock);
4007
4008 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004009}
4010
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004011static inline void set_default_fcs(struct l2cap_chan *chan)
Mat Martineau8c462b62010-08-24 15:35:42 -07004012{
4013 /* FCS is enabled only in ERTM or streaming mode, if one or both
4014 * sides request it.
4015 */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03004016 if (chan->mode != L2CAP_MODE_ERTM && chan->mode != L2CAP_MODE_STREAMING)
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004017 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02004018 else if (!test_bit(CONF_RECV_NO_FCS, &chan->conf_state))
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004019 chan->fcs = L2CAP_FCS_CRC16;
Mat Martineau8c462b62010-08-24 15:35:42 -07004020}
4021
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03004022static void l2cap_send_efs_conf_rsp(struct l2cap_chan *chan, void *data,
4023 u8 ident, u16 flags)
4024{
4025 struct l2cap_conn *conn = chan->conn;
4026
4027 BT_DBG("conn %p chan %p ident %d flags 0x%4.4x", conn, chan, ident,
4028 flags);
4029
4030 clear_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
4031 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
4032
4033 l2cap_send_cmd(conn, ident, L2CAP_CONF_RSP,
4034 l2cap_build_conf_rsp(chan, data,
4035 L2CAP_CONF_SUCCESS, flags), data);
4036}
4037
Johan Hedberg662d6522013-10-16 11:20:47 +03004038static void cmd_reject_invalid_cid(struct l2cap_conn *conn, u8 ident,
4039 u16 scid, u16 dcid)
4040{
4041 struct l2cap_cmd_rej_cid rej;
4042
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004043 rej.reason = cpu_to_le16(L2CAP_REJ_INVALID_CID);
Johan Hedberg662d6522013-10-16 11:20:47 +03004044 rej.scid = __cpu_to_le16(scid);
4045 rej.dcid = __cpu_to_le16(dcid);
4046
4047 l2cap_send_cmd(conn, ident, L2CAP_COMMAND_REJ, sizeof(rej), &rej);
4048}
4049
Gustavo Padovan2d792812012-10-06 10:07:01 +01004050static inline int l2cap_config_req(struct l2cap_conn *conn,
4051 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4052 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004053{
4054 struct l2cap_conf_req *req = (struct l2cap_conf_req *) data;
4055 u16 dcid, flags;
4056 u8 rsp[64];
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004057 struct l2cap_chan *chan;
Mat Martineau3c588192012-04-11 10:48:42 -07004058 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004059
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004060 if (cmd_len < sizeof(*req))
4061 return -EPROTO;
4062
Linus Torvalds1da177e2005-04-16 15:20:36 -07004063 dcid = __le16_to_cpu(req->dcid);
4064 flags = __le16_to_cpu(req->flags);
4065
4066 BT_DBG("dcid 0x%4.4x flags 0x%2.2x", dcid, flags);
4067
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004068 chan = l2cap_get_chan_by_scid(conn, dcid);
Johan Hedberg662d6522013-10-16 11:20:47 +03004069 if (!chan) {
4070 cmd_reject_invalid_cid(conn, cmd->ident, dcid, 0);
4071 return 0;
4072 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004073
David S. Miller033b1142011-07-21 13:38:42 -07004074 if (chan->state != BT_CONFIG && chan->state != BT_CONNECT2) {
Johan Hedberg662d6522013-10-16 11:20:47 +03004075 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4076 chan->dcid);
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004077 goto unlock;
Gustavo F. Padovandf6bd742010-06-14 02:26:15 -03004078 }
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004079
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004080 /* Reject if config buffer is too small. */
Al Viro88219a02007-07-29 00:17:25 -07004081 len = cmd_len - sizeof(*req);
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004082 if (chan->conf_len + len > sizeof(chan->conf_req)) {
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004083 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004084 l2cap_build_conf_rsp(chan, rsp,
4085 L2CAP_CONF_REJECT, flags), rsp);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004086 goto unlock;
4087 }
4088
4089 /* Store config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004090 memcpy(chan->conf_req + chan->conf_len, req->data, len);
4091 chan->conf_len += len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004092
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004093 if (flags & L2CAP_CONF_FLAG_CONTINUATION) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004094 /* Incomplete config. Send empty response. */
4095 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004096 l2cap_build_conf_rsp(chan, rsp,
4097 L2CAP_CONF_SUCCESS, flags), rsp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004098 goto unlock;
4099 }
4100
4101 /* Complete config. */
Ben Serie860d2c2017-09-09 23:15:59 +02004102 len = l2cap_parse_conf_req(chan, rsp, sizeof(rsp));
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004103 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004104 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004105 goto unlock;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004106 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004107
Mat Martineau1500109b2012-10-23 15:24:15 -07004108 chan->ident = cmd->ident;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004109 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004110 chan->num_conf_rsp++;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004111
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004112 /* Reset config buffer. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004113 chan->conf_len = 0;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004114
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004115 if (!test_bit(CONF_OUTPUT_DONE, &chan->conf_state))
Marcel Holtmann876d9482007-10-20 13:35:42 +02004116 goto unlock;
4117
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004118 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004119 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004120
Mat Martineau105bdf92012-04-27 16:50:48 -07004121 if (chan->mode == L2CAP_MODE_ERTM ||
4122 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004123 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004124
Mat Martineau3c588192012-04-11 10:48:42 -07004125 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004126 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004127 else
4128 l2cap_chan_ready(chan);
4129
Marcel Holtmann876d9482007-10-20 13:35:42 +02004130 goto unlock;
4131 }
4132
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004133 if (!test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02004134 u8 buf[64];
Linus Torvalds1da177e2005-04-16 15:20:36 -07004135 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Ben Serie860d2c2017-09-09 23:15:59 +02004136 l2cap_build_conf_req(chan, buf, sizeof(buf)), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004137 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004138 }
4139
Stephen Hemminger49c922b2014-10-27 21:12:20 -07004140 /* Got Conf Rsp PENDING from remote side and assume we sent
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004141 Conf Rsp PENDING in the code above */
4142 if (test_bit(CONF_REM_CONF_PEND, &chan->conf_state) &&
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03004143 test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004144
4145 /* check compatibility */
4146
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004147 /* Send rsp for BR/EDR channel */
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004148 if (!chan->hs_hcon)
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004149 l2cap_send_efs_conf_rsp(chan, rsp, cmd->ident, flags);
4150 else
4151 chan->ident = cmd->ident;
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004152 }
4153
Linus Torvalds1da177e2005-04-16 15:20:36 -07004154unlock:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004155 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004156 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004157}
4158
Gustavo Padovan2d792812012-10-06 10:07:01 +01004159static inline int l2cap_config_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004160 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4161 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004162{
4163 struct l2cap_conf_rsp *rsp = (struct l2cap_conf_rsp *)data;
4164 u16 scid, flags, result;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004165 struct l2cap_chan *chan;
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004166 int len = cmd_len - sizeof(*rsp);
Mat Martineau3c588192012-04-11 10:48:42 -07004167 int err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004168
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004169 if (cmd_len < sizeof(*rsp))
4170 return -EPROTO;
4171
Linus Torvalds1da177e2005-04-16 15:20:36 -07004172 scid = __le16_to_cpu(rsp->scid);
4173 flags = __le16_to_cpu(rsp->flags);
4174 result = __le16_to_cpu(rsp->result);
4175
Andrei Emeltchenko61386cb2012-03-12 12:13:07 +02004176 BT_DBG("scid 0x%4.4x flags 0x%2.2x result 0x%2.2x len %d", scid, flags,
4177 result, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004178
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004179 chan = l2cap_get_chan_by_scid(conn, scid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004180 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004181 return 0;
4182
4183 switch (result) {
4184 case L2CAP_CONF_SUCCESS:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004185 l2cap_conf_rfc_get(chan, rsp->data, len);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004186 clear_bit(CONF_REM_CONF_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004187 break;
4188
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004189 case L2CAP_CONF_PENDING:
4190 set_bit(CONF_REM_CONF_PEND, &chan->conf_state);
4191
4192 if (test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
4193 char buf[64];
4194
4195 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Ben Serie860d2c2017-09-09 23:15:59 +02004196 buf, sizeof(buf), &result);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004197 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004198 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004199 goto done;
4200 }
4201
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004202 if (!chan->hs_hcon) {
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004203 l2cap_send_efs_conf_rsp(chan, buf, cmd->ident,
4204 0);
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02004205 } else {
4206 if (l2cap_check_efs(chan)) {
4207 amp_create_logical_link(chan);
4208 chan->ident = cmd->ident;
4209 }
4210 }
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004211 }
4212 goto done;
4213
Linus Torvalds1da177e2005-04-16 15:20:36 -07004214 case L2CAP_CONF_UNACCEPT:
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004215 if (chan->num_conf_rsp <= L2CAP_CONF_MAX_CONF_RSP) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004216 char req[64];
4217
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004218 if (len > sizeof(req) - sizeof(struct l2cap_conf_req)) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004219 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004220 goto done;
4221 }
4222
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004223 /* throw out any old stored conf requests */
4224 result = L2CAP_CONF_SUCCESS;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03004225 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Ben Serie860d2c2017-09-09 23:15:59 +02004226 req, sizeof(req), &result);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004227 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004228 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004229 goto done;
4230 }
4231
4232 l2cap_send_cmd(conn, l2cap_get_ident(conn),
Gustavo Padovan2d792812012-10-06 10:07:01 +01004233 L2CAP_CONF_REQ, len, req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004234 chan->num_conf_req++;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004235 if (result != L2CAP_CONF_SUCCESS)
4236 goto done;
4237 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004238 }
4239
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09004240 default:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004241 l2cap_chan_set_err(chan, ECONNRESET);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +02004242
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08004243 __set_chan_timer(chan, L2CAP_DISC_REJ_TIMEOUT);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004244 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004245 goto done;
4246 }
4247
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004248 if (flags & L2CAP_CONF_FLAG_CONTINUATION)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004249 goto done;
4250
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004251 set_bit(CONF_INPUT_DONE, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004252
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004253 if (test_bit(CONF_OUTPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004254 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004255
Mat Martineau105bdf92012-04-27 16:50:48 -07004256 if (chan->mode == L2CAP_MODE_ERTM ||
4257 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004258 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004259
Mat Martineau3c588192012-04-11 10:48:42 -07004260 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004261 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004262 else
4263 l2cap_chan_ready(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004264 }
4265
4266done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004267 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004268 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004269}
4270
Gustavo Padovan2d792812012-10-06 10:07:01 +01004271static inline int l2cap_disconnect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004272 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4273 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004274{
4275 struct l2cap_disconn_req *req = (struct l2cap_disconn_req *) data;
4276 struct l2cap_disconn_rsp rsp;
4277 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004278 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004279
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004280 if (cmd_len != sizeof(*req))
4281 return -EPROTO;
4282
Linus Torvalds1da177e2005-04-16 15:20:36 -07004283 scid = __le16_to_cpu(req->scid);
4284 dcid = __le16_to_cpu(req->dcid);
4285
4286 BT_DBG("scid 0x%4.4x dcid 0x%4.4x", scid, dcid);
4287
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004288 mutex_lock(&conn->chan_lock);
4289
4290 chan = __l2cap_get_chan_by_scid(conn, dcid);
4291 if (!chan) {
4292 mutex_unlock(&conn->chan_lock);
Johan Hedberg662d6522013-10-16 11:20:47 +03004293 cmd_reject_invalid_cid(conn, cmd->ident, dcid, scid);
4294 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004295 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004296
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004297 l2cap_chan_lock(chan);
4298
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03004299 rsp.dcid = cpu_to_le16(chan->scid);
4300 rsp.scid = cpu_to_le16(chan->dcid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004301 l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp);
4302
Gustavo Padovan5ec1bbe2013-10-15 19:24:48 -03004303 chan->ops->set_shutdown(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004304
Mat Martineau61d6ef32012-04-27 16:50:50 -07004305 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004306 l2cap_chan_del(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004307
4308 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004309
Gustavo Padovan80b98022012-05-27 22:27:51 -03004310 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004311 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004312
4313 mutex_unlock(&conn->chan_lock);
4314
Linus Torvalds1da177e2005-04-16 15:20:36 -07004315 return 0;
4316}
4317
Gustavo Padovan2d792812012-10-06 10:07:01 +01004318static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004319 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4320 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004321{
4322 struct l2cap_disconn_rsp *rsp = (struct l2cap_disconn_rsp *) data;
4323 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004324 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004325
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004326 if (cmd_len != sizeof(*rsp))
4327 return -EPROTO;
4328
Linus Torvalds1da177e2005-04-16 15:20:36 -07004329 scid = __le16_to_cpu(rsp->scid);
4330 dcid = __le16_to_cpu(rsp->dcid);
4331
4332 BT_DBG("dcid 0x%4.4x scid 0x%4.4x", dcid, scid);
4333
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004334 mutex_lock(&conn->chan_lock);
4335
4336 chan = __l2cap_get_chan_by_scid(conn, scid);
4337 if (!chan) {
4338 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004339 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004340 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004341
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004342 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004343
Mat Martineau61d6ef32012-04-27 16:50:50 -07004344 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004345 l2cap_chan_del(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004346
4347 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004348
Gustavo Padovan80b98022012-05-27 22:27:51 -03004349 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004350 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004351
4352 mutex_unlock(&conn->chan_lock);
4353
Linus Torvalds1da177e2005-04-16 15:20:36 -07004354 return 0;
4355}
4356
Gustavo Padovan2d792812012-10-06 10:07:01 +01004357static inline int l2cap_information_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004358 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4359 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004360{
4361 struct l2cap_info_req *req = (struct l2cap_info_req *) data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004362 u16 type;
4363
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004364 if (cmd_len != sizeof(*req))
4365 return -EPROTO;
4366
Linus Torvalds1da177e2005-04-16 15:20:36 -07004367 type = __le16_to_cpu(req->type);
4368
4369 BT_DBG("type 0x%4.4x", type);
4370
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004371 if (type == L2CAP_IT_FEAT_MASK) {
4372 u8 buf[8];
Marcel Holtmann44dd46d2009-05-02 19:09:01 -07004373 u32 feat_mask = l2cap_feat_mask;
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004374 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004375 rsp->type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
4376 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03004377 if (!disable_ertm)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004378 feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING
Gustavo Padovan2d792812012-10-06 10:07:01 +01004379 | L2CAP_FEAT_FCS;
Johan Hedberg0bd49fc2014-12-02 10:09:26 +02004380 if (conn->local_fixed_chan & L2CAP_FC_A2MP)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03004381 feat_mask |= L2CAP_FEAT_EXT_FLOW
Gustavo Padovan2d792812012-10-06 10:07:01 +01004382 | L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenkoa5fd6f32011-09-16 16:26:32 +03004383
Gustavo F. Padovan1b7bf4e2009-08-24 00:45:20 -03004384 put_unaligned_le32(feat_mask, rsp->data);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004385 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4386 buf);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004387 } else if (type == L2CAP_IT_FIXED_CHAN) {
4388 u8 buf[12];
4389 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Mat Martineau50a147c2011-11-02 16:18:34 -07004390
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004391 rsp->type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
4392 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Johan Hedberg0bd49fc2014-12-02 10:09:26 +02004393 rsp->data[0] = conn->local_fixed_chan;
4394 memset(rsp->data + 1, 0, 7);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004395 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4396 buf);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004397 } else {
4398 struct l2cap_info_rsp rsp;
4399 rsp.type = cpu_to_le16(type);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004400 rsp.result = cpu_to_le16(L2CAP_IR_NOTSUPP);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004401 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(rsp),
4402 &rsp);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004403 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004404
4405 return 0;
4406}
4407
Gustavo Padovan2d792812012-10-06 10:07:01 +01004408static inline int l2cap_information_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004409 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4410 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004411{
4412 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) data;
4413 u16 type, result;
4414
Jaganath Kanakkassery3f6fa3d2013-06-21 19:55:11 +05304415 if (cmd_len < sizeof(*rsp))
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004416 return -EPROTO;
4417
Linus Torvalds1da177e2005-04-16 15:20:36 -07004418 type = __le16_to_cpu(rsp->type);
4419 result = __le16_to_cpu(rsp->result);
4420
4421 BT_DBG("type 0x%4.4x result 0x%2.2x", type, result);
4422
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004423 /* L2CAP Info req/rsp are unbound to channels, add extra checks */
4424 if (cmd->ident != conn->info_ident ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01004425 conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004426 return 0;
4427
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02004428 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004429
Ville Tervoadb08ed2010-08-04 09:43:33 +03004430 if (result != L2CAP_IR_SUCCESS) {
4431 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4432 conn->info_ident = 0;
4433
4434 l2cap_conn_start(conn);
4435
4436 return 0;
4437 }
4438
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004439 switch (type) {
4440 case L2CAP_IT_FEAT_MASK:
Harvey Harrison83985312008-05-02 16:25:46 -07004441 conn->feat_mask = get_unaligned_le32(rsp->data);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004442
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07004443 if (conn->feat_mask & L2CAP_FEAT_FIXED_CHAN) {
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004444 struct l2cap_info_req req;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004445 req.type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004446
4447 conn->info_ident = l2cap_get_ident(conn);
4448
4449 l2cap_send_cmd(conn, conn->info_ident,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004450 L2CAP_INFO_REQ, sizeof(req), &req);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004451 } else {
4452 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4453 conn->info_ident = 0;
4454
4455 l2cap_conn_start(conn);
4456 }
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004457 break;
4458
4459 case L2CAP_IT_FIXED_CHAN:
Johan Hedberg0bd49fc2014-12-02 10:09:26 +02004460 conn->remote_fixed_chan = rsp->data[0];
Marcel Holtmann984947d2009-02-06 23:35:19 +01004461 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004462 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004463
4464 l2cap_conn_start(conn);
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004465 break;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004466 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004467
Linus Torvalds1da177e2005-04-16 15:20:36 -07004468 return 0;
4469}
4470
Mat Martineau17009152012-10-23 15:24:07 -07004471static int l2cap_create_channel_req(struct l2cap_conn *conn,
4472 struct l2cap_cmd_hdr *cmd,
4473 u16 cmd_len, void *data)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004474{
4475 struct l2cap_create_chan_req *req = data;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004476 struct l2cap_create_chan_rsp rsp;
Mat Martineau17009152012-10-23 15:24:07 -07004477 struct l2cap_chan *chan;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004478 struct hci_dev *hdev;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004479 u16 psm, scid;
4480
4481 if (cmd_len != sizeof(*req))
4482 return -EPROTO;
4483
Johan Hedberg0bd49fc2014-12-02 10:09:26 +02004484 if (!(conn->local_fixed_chan & L2CAP_FC_A2MP))
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004485 return -EINVAL;
4486
4487 psm = le16_to_cpu(req->psm);
4488 scid = le16_to_cpu(req->scid);
4489
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004490 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 -07004491
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004492 /* For controller id 0 make BR/EDR connection */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004493 if (req->amp_id == AMP_ID_BREDR) {
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004494 l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4495 req->amp_id);
4496 return 0;
4497 }
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004498
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004499 /* Validate AMP controller id */
4500 hdev = hci_dev_get(req->amp_id);
4501 if (!hdev)
4502 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004503
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004504 if (hdev->dev_type != HCI_AMP || !test_bit(HCI_UP, &hdev->flags)) {
Mat Martineau17009152012-10-23 15:24:07 -07004505 hci_dev_put(hdev);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004506 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004507 }
4508
4509 chan = l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4510 req->amp_id);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004511 if (chan) {
4512 struct amp_mgr *mgr = conn->hcon->amp_mgr;
4513 struct hci_conn *hs_hcon;
4514
Marcel Holtmann98e0f7e2013-10-13 02:23:40 -07004515 hs_hcon = hci_conn_hash_lookup_ba(hdev, AMP_LINK,
4516 &conn->hcon->dst);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004517 if (!hs_hcon) {
4518 hci_dev_put(hdev);
Johan Hedberg662d6522013-10-16 11:20:47 +03004519 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4520 chan->dcid);
4521 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004522 }
4523
4524 BT_DBG("mgr %p bredr_chan %p hs_hcon %p", mgr, chan, hs_hcon);
4525
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004526 mgr->bredr_chan = chan;
4527 chan->hs_hcon = hs_hcon;
Andrei Emeltchenkofd45bf42012-11-20 17:16:22 +02004528 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004529 conn->mtu = hdev->block_mtu;
4530 }
4531
4532 hci_dev_put(hdev);
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004533
4534 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004535
4536error:
4537 rsp.dcid = 0;
4538 rsp.scid = cpu_to_le16(scid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004539 rsp.result = cpu_to_le16(L2CAP_CR_BAD_AMP);
4540 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004541
4542 l2cap_send_cmd(conn, cmd->ident, L2CAP_CREATE_CHAN_RSP,
4543 sizeof(rsp), &rsp);
4544
Johan Hedbergdc280802013-09-16 13:05:13 +03004545 return 0;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004546}
4547
Mat Martineau8eb200b2012-10-23 15:24:17 -07004548static void l2cap_send_move_chan_req(struct l2cap_chan *chan, u8 dest_amp_id)
4549{
4550 struct l2cap_move_chan_req req;
4551 u8 ident;
4552
4553 BT_DBG("chan %p, dest_amp_id %d", chan, dest_amp_id);
4554
4555 ident = l2cap_get_ident(chan->conn);
4556 chan->ident = ident;
4557
4558 req.icid = cpu_to_le16(chan->scid);
4559 req.dest_amp_id = dest_amp_id;
4560
4561 l2cap_send_cmd(chan->conn, ident, L2CAP_MOVE_CHAN_REQ, sizeof(req),
4562 &req);
4563
4564 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4565}
4566
Mat Martineau1500109b2012-10-23 15:24:15 -07004567static void l2cap_send_move_chan_rsp(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004568{
4569 struct l2cap_move_chan_rsp rsp;
4570
Mat Martineau1500109b2012-10-23 15:24:15 -07004571 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004572
Mat Martineau1500109b2012-10-23 15:24:15 -07004573 rsp.icid = cpu_to_le16(chan->dcid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004574 rsp.result = cpu_to_le16(result);
4575
Mat Martineau1500109b2012-10-23 15:24:15 -07004576 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_RSP,
4577 sizeof(rsp), &rsp);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004578}
4579
Mat Martineau5b155ef2012-10-23 15:24:14 -07004580static void l2cap_send_move_chan_cfm(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004581{
4582 struct l2cap_move_chan_cfm cfm;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004583
Mat Martineau5b155ef2012-10-23 15:24:14 -07004584 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004585
Mat Martineau5b155ef2012-10-23 15:24:14 -07004586 chan->ident = l2cap_get_ident(chan->conn);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004587
Mat Martineau5b155ef2012-10-23 15:24:14 -07004588 cfm.icid = cpu_to_le16(chan->scid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004589 cfm.result = cpu_to_le16(result);
4590
Mat Martineau5b155ef2012-10-23 15:24:14 -07004591 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_CFM,
4592 sizeof(cfm), &cfm);
4593
4594 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4595}
4596
4597static void l2cap_send_move_chan_cfm_icid(struct l2cap_conn *conn, u16 icid)
4598{
4599 struct l2cap_move_chan_cfm cfm;
4600
4601 BT_DBG("conn %p, icid 0x%4.4x", conn, icid);
4602
4603 cfm.icid = cpu_to_le16(icid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004604 cfm.result = cpu_to_le16(L2CAP_MC_UNCONFIRMED);
Mat Martineau5b155ef2012-10-23 15:24:14 -07004605
4606 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_MOVE_CHAN_CFM,
4607 sizeof(cfm), &cfm);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004608}
4609
4610static void l2cap_send_move_chan_cfm_rsp(struct l2cap_conn *conn, u8 ident,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004611 u16 icid)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004612{
4613 struct l2cap_move_chan_cfm_rsp rsp;
4614
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004615 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004616
4617 rsp.icid = cpu_to_le16(icid);
4618 l2cap_send_cmd(conn, ident, L2CAP_MOVE_CHAN_CFM_RSP, sizeof(rsp), &rsp);
4619}
4620
Mat Martineau5f3847a2012-10-23 15:24:12 -07004621static void __release_logical_link(struct l2cap_chan *chan)
4622{
4623 chan->hs_hchan = NULL;
4624 chan->hs_hcon = NULL;
4625
4626 /* Placeholder - release the logical link */
4627}
4628
Mat Martineau1500109b2012-10-23 15:24:15 -07004629static void l2cap_logical_fail(struct l2cap_chan *chan)
4630{
4631 /* Logical link setup failed */
4632 if (chan->state != BT_CONNECTED) {
4633 /* Create channel failure, disconnect */
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004634 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineau1500109b2012-10-23 15:24:15 -07004635 return;
4636 }
4637
4638 switch (chan->move_role) {
4639 case L2CAP_MOVE_ROLE_RESPONDER:
4640 l2cap_move_done(chan);
4641 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_SUPP);
4642 break;
4643 case L2CAP_MOVE_ROLE_INITIATOR:
4644 if (chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_COMP ||
4645 chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_CFM) {
4646 /* Remote has only sent pending or
4647 * success responses, clean up
4648 */
4649 l2cap_move_done(chan);
4650 }
4651
4652 /* Other amp move states imply that the move
4653 * has already aborted
4654 */
4655 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
4656 break;
4657 }
4658}
4659
4660static void l2cap_logical_finish_create(struct l2cap_chan *chan,
4661 struct hci_chan *hchan)
4662{
4663 struct l2cap_conf_rsp rsp;
Mat Martineau1500109b2012-10-23 15:24:15 -07004664
Andrei Emeltchenko336178a2012-10-31 15:46:27 +02004665 chan->hs_hchan = hchan;
Mat Martineau1500109b2012-10-23 15:24:15 -07004666 chan->hs_hcon->l2cap_data = chan->conn;
4667
Andrei Emeltchenko35ba9562012-10-25 15:20:43 +03004668 l2cap_send_efs_conf_rsp(chan, &rsp, chan->ident, 0);
Mat Martineau1500109b2012-10-23 15:24:15 -07004669
4670 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Andrei Emeltchenkofe79c6f2012-10-25 15:20:42 +03004671 int err;
Mat Martineau1500109b2012-10-23 15:24:15 -07004672
4673 set_default_fcs(chan);
4674
4675 err = l2cap_ertm_init(chan);
4676 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004677 l2cap_send_disconn_req(chan, -err);
Mat Martineau1500109b2012-10-23 15:24:15 -07004678 else
4679 l2cap_chan_ready(chan);
4680 }
4681}
4682
4683static void l2cap_logical_finish_move(struct l2cap_chan *chan,
4684 struct hci_chan *hchan)
4685{
4686 chan->hs_hcon = hchan->conn;
4687 chan->hs_hcon->l2cap_data = chan->conn;
4688
4689 BT_DBG("move_state %d", chan->move_state);
4690
4691 switch (chan->move_state) {
4692 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
4693 /* Move confirm will be sent after a success
4694 * response is received
4695 */
4696 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4697 break;
4698 case L2CAP_MOVE_WAIT_LOGICAL_CFM:
4699 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4700 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4701 } else if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
4702 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
4703 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
4704 } else if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4705 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4706 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4707 }
4708 break;
4709 default:
4710 /* Move was not in expected state, free the channel */
4711 __release_logical_link(chan);
4712
4713 chan->move_state = L2CAP_MOVE_STABLE;
4714 }
4715}
4716
4717/* Call with chan locked */
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004718void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan,
4719 u8 status)
Mat Martineau5b155ef2012-10-23 15:24:14 -07004720{
Mat Martineau1500109b2012-10-23 15:24:15 -07004721 BT_DBG("chan %p, hchan %p, status %d", chan, hchan, status);
4722
4723 if (status) {
4724 l2cap_logical_fail(chan);
4725 __release_logical_link(chan);
4726 return;
4727 }
4728
4729 if (chan->state != BT_CONNECTED) {
4730 /* Ignore logical link if channel is on BR/EDR */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004731 if (chan->local_amp_id != AMP_ID_BREDR)
Mat Martineau1500109b2012-10-23 15:24:15 -07004732 l2cap_logical_finish_create(chan, hchan);
4733 } else {
4734 l2cap_logical_finish_move(chan, hchan);
4735 }
Mat Martineau5b155ef2012-10-23 15:24:14 -07004736}
4737
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004738void l2cap_move_start(struct l2cap_chan *chan)
4739{
4740 BT_DBG("chan %p", chan);
4741
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004742 if (chan->local_amp_id == AMP_ID_BREDR) {
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004743 if (chan->chan_policy != BT_CHANNEL_POLICY_AMP_PREFERRED)
4744 return;
4745 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4746 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4747 /* Placeholder - start physical link setup */
4748 } else {
4749 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4750 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4751 chan->move_id = 0;
4752 l2cap_move_setup(chan);
4753 l2cap_send_move_chan_req(chan, 0);
4754 }
4755}
4756
Mat Martineau8eb200b2012-10-23 15:24:17 -07004757static void l2cap_do_create(struct l2cap_chan *chan, int result,
4758 u8 local_amp_id, u8 remote_amp_id)
4759{
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004760 BT_DBG("chan %p state %s %u -> %u", chan, state_to_string(chan->state),
4761 local_amp_id, remote_amp_id);
4762
Andrei Emeltchenko12d6cc62012-11-14 17:39:31 +02004763 chan->fcs = L2CAP_FCS_NONE;
4764
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004765 /* Outgoing channel on AMP */
4766 if (chan->state == BT_CONNECT) {
4767 if (result == L2CAP_CR_SUCCESS) {
4768 chan->local_amp_id = local_amp_id;
4769 l2cap_send_create_chan_req(chan, remote_amp_id);
4770 } else {
4771 /* Revert to BR/EDR connect */
4772 l2cap_send_conn_req(chan);
4773 }
4774
4775 return;
4776 }
4777
4778 /* Incoming channel on AMP */
4779 if (__l2cap_no_conn_pending(chan)) {
Mat Martineau8eb200b2012-10-23 15:24:17 -07004780 struct l2cap_conn_rsp rsp;
4781 char buf[128];
4782 rsp.scid = cpu_to_le16(chan->dcid);
4783 rsp.dcid = cpu_to_le16(chan->scid);
4784
Mat Martineau8eb200b2012-10-23 15:24:17 -07004785 if (result == L2CAP_CR_SUCCESS) {
4786 /* Send successful response */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004787 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
4788 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004789 } else {
4790 /* Send negative response */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004791 rsp.result = cpu_to_le16(L2CAP_CR_NO_MEM);
4792 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004793 }
4794
4795 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_RSP,
4796 sizeof(rsp), &rsp);
4797
4798 if (result == L2CAP_CR_SUCCESS) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02004799 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004800 set_bit(CONF_REQ_SENT, &chan->conf_state);
4801 l2cap_send_cmd(chan->conn, l2cap_get_ident(chan->conn),
4802 L2CAP_CONF_REQ,
Ben Serie860d2c2017-09-09 23:15:59 +02004803 l2cap_build_conf_req(chan, buf, sizeof(buf)), buf);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004804 chan->num_conf_req++;
4805 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004806 }
4807}
4808
4809static void l2cap_do_move_initiate(struct l2cap_chan *chan, u8 local_amp_id,
4810 u8 remote_amp_id)
4811{
4812 l2cap_move_setup(chan);
4813 chan->move_id = local_amp_id;
4814 chan->move_state = L2CAP_MOVE_WAIT_RSP;
4815
4816 l2cap_send_move_chan_req(chan, remote_amp_id);
4817}
4818
4819static void l2cap_do_move_respond(struct l2cap_chan *chan, int result)
4820{
4821 struct hci_chan *hchan = NULL;
4822
4823 /* Placeholder - get hci_chan for logical link */
4824
4825 if (hchan) {
4826 if (hchan->state == BT_CONNECTED) {
4827 /* Logical link is ready to go */
4828 chan->hs_hcon = hchan->conn;
4829 chan->hs_hcon->l2cap_data = chan->conn;
4830 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4831 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4832
4833 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
4834 } else {
4835 /* Wait for logical link to be ready */
4836 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4837 }
4838 } else {
4839 /* Logical link not available */
4840 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_ALLOWED);
4841 }
4842}
4843
4844static void l2cap_do_move_cancel(struct l2cap_chan *chan, int result)
4845{
4846 if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4847 u8 rsp_result;
4848 if (result == -EINVAL)
4849 rsp_result = L2CAP_MR_BAD_ID;
4850 else
4851 rsp_result = L2CAP_MR_NOT_ALLOWED;
4852
4853 l2cap_send_move_chan_rsp(chan, rsp_result);
4854 }
4855
4856 chan->move_role = L2CAP_MOVE_ROLE_NONE;
4857 chan->move_state = L2CAP_MOVE_STABLE;
4858
4859 /* Restart data transmission */
4860 l2cap_ertm_send(chan);
4861}
4862
Andrei Emeltchenkoa514b172012-11-14 17:39:30 +02004863/* Invoke with locked chan */
4864void __l2cap_physical_cfm(struct l2cap_chan *chan, int result)
Mat Martineau8eb200b2012-10-23 15:24:17 -07004865{
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004866 u8 local_amp_id = chan->local_amp_id;
Andrei Emeltchenkofffadc02012-11-01 15:37:03 +02004867 u8 remote_amp_id = chan->remote_amp_id;
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004868
Mat Martineau8eb200b2012-10-23 15:24:17 -07004869 BT_DBG("chan %p, result %d, local_amp_id %d, remote_amp_id %d",
4870 chan, result, local_amp_id, remote_amp_id);
4871
Mat Martineau8eb200b2012-10-23 15:24:17 -07004872 if (chan->state == BT_DISCONN || chan->state == BT_CLOSED) {
4873 l2cap_chan_unlock(chan);
4874 return;
4875 }
4876
4877 if (chan->state != BT_CONNECTED) {
4878 l2cap_do_create(chan, result, local_amp_id, remote_amp_id);
4879 } else if (result != L2CAP_MR_SUCCESS) {
4880 l2cap_do_move_cancel(chan, result);
4881 } else {
4882 switch (chan->move_role) {
4883 case L2CAP_MOVE_ROLE_INITIATOR:
4884 l2cap_do_move_initiate(chan, local_amp_id,
4885 remote_amp_id);
4886 break;
4887 case L2CAP_MOVE_ROLE_RESPONDER:
4888 l2cap_do_move_respond(chan, result);
4889 break;
4890 default:
4891 l2cap_do_move_cancel(chan, result);
4892 break;
4893 }
4894 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004895}
4896
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004897static inline int l2cap_move_channel_req(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004898 struct l2cap_cmd_hdr *cmd,
4899 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004900{
4901 struct l2cap_move_chan_req *req = data;
Mat Martineau1500109b2012-10-23 15:24:15 -07004902 struct l2cap_move_chan_rsp rsp;
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004903 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004904 u16 icid = 0;
4905 u16 result = L2CAP_MR_NOT_ALLOWED;
4906
4907 if (cmd_len != sizeof(*req))
4908 return -EPROTO;
4909
4910 icid = le16_to_cpu(req->icid);
4911
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004912 BT_DBG("icid 0x%4.4x, dest_amp_id %d", icid, req->dest_amp_id);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004913
Johan Hedberg0bd49fc2014-12-02 10:09:26 +02004914 if (!(conn->local_fixed_chan & L2CAP_FC_A2MP))
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004915 return -EINVAL;
4916
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004917 chan = l2cap_get_chan_by_dcid(conn, icid);
4918 if (!chan) {
Mat Martineau1500109b2012-10-23 15:24:15 -07004919 rsp.icid = cpu_to_le16(icid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004920 rsp.result = cpu_to_le16(L2CAP_MR_NOT_ALLOWED);
Mat Martineau1500109b2012-10-23 15:24:15 -07004921 l2cap_send_cmd(conn, cmd->ident, L2CAP_MOVE_CHAN_RSP,
4922 sizeof(rsp), &rsp);
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004923 return 0;
4924 }
4925
Mat Martineau1500109b2012-10-23 15:24:15 -07004926 chan->ident = cmd->ident;
4927
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004928 if (chan->scid < L2CAP_CID_DYN_START ||
4929 chan->chan_policy == BT_CHANNEL_POLICY_BREDR_ONLY ||
4930 (chan->mode != L2CAP_MODE_ERTM &&
4931 chan->mode != L2CAP_MODE_STREAMING)) {
4932 result = L2CAP_MR_NOT_ALLOWED;
4933 goto send_move_response;
4934 }
4935
4936 if (chan->local_amp_id == req->dest_amp_id) {
4937 result = L2CAP_MR_SAME_ID;
4938 goto send_move_response;
4939 }
4940
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004941 if (req->dest_amp_id != AMP_ID_BREDR) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004942 struct hci_dev *hdev;
4943 hdev = hci_dev_get(req->dest_amp_id);
4944 if (!hdev || hdev->dev_type != HCI_AMP ||
4945 !test_bit(HCI_UP, &hdev->flags)) {
4946 if (hdev)
4947 hci_dev_put(hdev);
4948
4949 result = L2CAP_MR_BAD_ID;
4950 goto send_move_response;
4951 }
4952 hci_dev_put(hdev);
4953 }
4954
4955 /* Detect a move collision. Only send a collision response
4956 * if this side has "lost", otherwise proceed with the move.
4957 * The winner has the larger bd_addr.
4958 */
4959 if ((__chan_is_moving(chan) ||
4960 chan->move_role != L2CAP_MOVE_ROLE_NONE) &&
Marcel Holtmann6f59b902013-10-13 05:24:01 -07004961 bacmp(&conn->hcon->src, &conn->hcon->dst) > 0) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004962 result = L2CAP_MR_COLLISION;
4963 goto send_move_response;
4964 }
4965
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004966 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
4967 l2cap_move_setup(chan);
4968 chan->move_id = req->dest_amp_id;
4969 icid = chan->dcid;
4970
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004971 if (req->dest_amp_id == AMP_ID_BREDR) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004972 /* Moving to BR/EDR */
4973 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4974 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4975 result = L2CAP_MR_PEND;
4976 } else {
4977 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4978 result = L2CAP_MR_SUCCESS;
4979 }
4980 } else {
4981 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4982 /* Placeholder - uncomment when amp functions are available */
4983 /*amp_accept_physical(chan, req->dest_amp_id);*/
4984 result = L2CAP_MR_PEND;
4985 }
4986
4987send_move_response:
Mat Martineau1500109b2012-10-23 15:24:15 -07004988 l2cap_send_move_chan_rsp(chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004989
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004990 l2cap_chan_unlock(chan);
4991
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004992 return 0;
4993}
4994
Mat Martineau5b155ef2012-10-23 15:24:14 -07004995static void l2cap_move_continue(struct l2cap_conn *conn, u16 icid, u16 result)
4996{
4997 struct l2cap_chan *chan;
4998 struct hci_chan *hchan = NULL;
4999
5000 chan = l2cap_get_chan_by_scid(conn, icid);
5001 if (!chan) {
5002 l2cap_send_move_chan_cfm_icid(conn, icid);
5003 return;
5004 }
5005
5006 __clear_chan_timer(chan);
5007 if (result == L2CAP_MR_PEND)
5008 __set_chan_timer(chan, L2CAP_MOVE_ERTX_TIMEOUT);
5009
5010 switch (chan->move_state) {
5011 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
5012 /* Move confirm will be sent when logical link
5013 * is complete.
5014 */
5015 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
5016 break;
5017 case L2CAP_MOVE_WAIT_RSP_SUCCESS:
5018 if (result == L2CAP_MR_PEND) {
5019 break;
5020 } else if (test_bit(CONN_LOCAL_BUSY,
5021 &chan->conn_state)) {
5022 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
5023 } else {
5024 /* Logical link is up or moving to BR/EDR,
5025 * proceed with move
5026 */
5027 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
5028 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
5029 }
5030 break;
5031 case L2CAP_MOVE_WAIT_RSP:
5032 /* Moving to AMP */
5033 if (result == L2CAP_MR_SUCCESS) {
5034 /* Remote is ready, send confirm immediately
5035 * after logical link is ready
5036 */
5037 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
5038 } else {
5039 /* Both logical link and move success
5040 * are required to confirm
5041 */
5042 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_COMP;
5043 }
5044
5045 /* Placeholder - get hci_chan for logical link */
5046 if (!hchan) {
5047 /* Logical link not available */
5048 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5049 break;
5050 }
5051
5052 /* If the logical link is not yet connected, do not
5053 * send confirmation.
5054 */
5055 if (hchan->state != BT_CONNECTED)
5056 break;
5057
5058 /* Logical link is already ready to go */
5059
5060 chan->hs_hcon = hchan->conn;
5061 chan->hs_hcon->l2cap_data = chan->conn;
5062
5063 if (result == L2CAP_MR_SUCCESS) {
5064 /* Can confirm now */
5065 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
5066 } else {
5067 /* Now only need move success
5068 * to confirm
5069 */
5070 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
5071 }
5072
5073 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
5074 break;
5075 default:
5076 /* Any other amp move state means the move failed. */
5077 chan->move_id = chan->local_amp_id;
5078 l2cap_move_done(chan);
5079 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5080 }
5081
5082 l2cap_chan_unlock(chan);
5083}
5084
5085static void l2cap_move_fail(struct l2cap_conn *conn, u8 ident, u16 icid,
5086 u16 result)
5087{
5088 struct l2cap_chan *chan;
5089
5090 chan = l2cap_get_chan_by_ident(conn, ident);
5091 if (!chan) {
5092 /* Could not locate channel, icid is best guess */
5093 l2cap_send_move_chan_cfm_icid(conn, icid);
5094 return;
5095 }
5096
5097 __clear_chan_timer(chan);
5098
5099 if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
5100 if (result == L2CAP_MR_COLLISION) {
5101 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
5102 } else {
5103 /* Cleanup - cancel move */
5104 chan->move_id = chan->local_amp_id;
5105 l2cap_move_done(chan);
5106 }
5107 }
5108
5109 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5110
5111 l2cap_chan_unlock(chan);
5112}
5113
5114static int l2cap_move_channel_rsp(struct l2cap_conn *conn,
5115 struct l2cap_cmd_hdr *cmd,
5116 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005117{
5118 struct l2cap_move_chan_rsp *rsp = data;
5119 u16 icid, result;
5120
5121 if (cmd_len != sizeof(*rsp))
5122 return -EPROTO;
5123
5124 icid = le16_to_cpu(rsp->icid);
5125 result = le16_to_cpu(rsp->result);
5126
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005127 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005128
Mat Martineau5b155ef2012-10-23 15:24:14 -07005129 if (result == L2CAP_MR_SUCCESS || result == L2CAP_MR_PEND)
5130 l2cap_move_continue(conn, icid, result);
5131 else
5132 l2cap_move_fail(conn, cmd->ident, icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005133
5134 return 0;
5135}
5136
Mat Martineau5f3847a2012-10-23 15:24:12 -07005137static int l2cap_move_channel_confirm(struct l2cap_conn *conn,
5138 struct l2cap_cmd_hdr *cmd,
5139 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005140{
5141 struct l2cap_move_chan_cfm *cfm = data;
Mat Martineau5f3847a2012-10-23 15:24:12 -07005142 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005143 u16 icid, result;
5144
5145 if (cmd_len != sizeof(*cfm))
5146 return -EPROTO;
5147
5148 icid = le16_to_cpu(cfm->icid);
5149 result = le16_to_cpu(cfm->result);
5150
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005151 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005152
Mat Martineau5f3847a2012-10-23 15:24:12 -07005153 chan = l2cap_get_chan_by_dcid(conn, icid);
5154 if (!chan) {
5155 /* Spec requires a response even if the icid was not found */
5156 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5157 return 0;
5158 }
5159
5160 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM) {
5161 if (result == L2CAP_MC_CONFIRMED) {
5162 chan->local_amp_id = chan->move_id;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005163 if (chan->local_amp_id == AMP_ID_BREDR)
Mat Martineau5f3847a2012-10-23 15:24:12 -07005164 __release_logical_link(chan);
5165 } else {
5166 chan->move_id = chan->local_amp_id;
5167 }
5168
5169 l2cap_move_done(chan);
5170 }
5171
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005172 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5173
Mat Martineau5f3847a2012-10-23 15:24:12 -07005174 l2cap_chan_unlock(chan);
5175
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005176 return 0;
5177}
5178
5179static inline int l2cap_move_channel_confirm_rsp(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005180 struct l2cap_cmd_hdr *cmd,
5181 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005182{
5183 struct l2cap_move_chan_cfm_rsp *rsp = data;
Mat Martineau3fd71a02012-10-23 15:24:16 -07005184 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005185 u16 icid;
5186
5187 if (cmd_len != sizeof(*rsp))
5188 return -EPROTO;
5189
5190 icid = le16_to_cpu(rsp->icid);
5191
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005192 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005193
Mat Martineau3fd71a02012-10-23 15:24:16 -07005194 chan = l2cap_get_chan_by_scid(conn, icid);
5195 if (!chan)
5196 return 0;
5197
5198 __clear_chan_timer(chan);
5199
5200 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM_RSP) {
5201 chan->local_amp_id = chan->move_id;
5202
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005203 if (chan->local_amp_id == AMP_ID_BREDR && chan->hs_hchan)
Mat Martineau3fd71a02012-10-23 15:24:16 -07005204 __release_logical_link(chan);
5205
5206 l2cap_move_done(chan);
5207 }
5208
5209 l2cap_chan_unlock(chan);
5210
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005211 return 0;
5212}
5213
Claudio Takahaside731152011-02-11 19:28:55 -02005214static inline int l2cap_conn_param_update_req(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005215 struct l2cap_cmd_hdr *cmd,
Johan Hedberg203e6392013-05-15 10:07:15 +03005216 u16 cmd_len, u8 *data)
Claudio Takahaside731152011-02-11 19:28:55 -02005217{
5218 struct hci_conn *hcon = conn->hcon;
5219 struct l2cap_conn_param_update_req *req;
5220 struct l2cap_conn_param_update_rsp rsp;
Johan Hedberg203e6392013-05-15 10:07:15 +03005221 u16 min, max, latency, to_multiplier;
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005222 int err;
Claudio Takahaside731152011-02-11 19:28:55 -02005223
Johan Hedberg40bef302014-07-16 11:42:27 +03005224 if (hcon->role != HCI_ROLE_MASTER)
Claudio Takahaside731152011-02-11 19:28:55 -02005225 return -EINVAL;
5226
Claudio Takahaside731152011-02-11 19:28:55 -02005227 if (cmd_len != sizeof(struct l2cap_conn_param_update_req))
5228 return -EPROTO;
5229
5230 req = (struct l2cap_conn_param_update_req *) data;
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03005231 min = __le16_to_cpu(req->min);
5232 max = __le16_to_cpu(req->max);
Claudio Takahaside731152011-02-11 19:28:55 -02005233 latency = __le16_to_cpu(req->latency);
5234 to_multiplier = __le16_to_cpu(req->to_multiplier);
5235
5236 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 +01005237 min, max, latency, to_multiplier);
Claudio Takahaside731152011-02-11 19:28:55 -02005238
5239 memset(&rsp, 0, sizeof(rsp));
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005240
Andre Guedesd4905f22014-06-25 21:52:52 -03005241 err = hci_check_conn_params(min, max, latency, to_multiplier);
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005242 if (err)
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005243 rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_REJECTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005244 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005245 rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_ACCEPTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005246
5247 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONN_PARAM_UPDATE_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005248 sizeof(rsp), &rsp);
Claudio Takahaside731152011-02-11 19:28:55 -02005249
Andre Guedesffb5a8272014-07-01 18:10:11 -03005250 if (!err) {
Johan Hedbergf4869e22014-07-02 17:37:32 +03005251 u8 store_hint;
Andre Guedesffb5a8272014-07-01 18:10:11 -03005252
Johan Hedbergf4869e22014-07-02 17:37:32 +03005253 store_hint = hci_le_conn_update(hcon, min, max, latency,
5254 to_multiplier);
5255 mgmt_new_conn_param(hcon->hdev, &hcon->dst, hcon->dst_type,
5256 store_hint, min, max, latency,
5257 to_multiplier);
5258
Andre Guedesffb5a8272014-07-01 18:10:11 -03005259 }
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005260
Claudio Takahaside731152011-02-11 19:28:55 -02005261 return 0;
5262}
5263
Johan Hedbergf1496de2013-05-13 14:15:56 +03005264static int l2cap_le_connect_rsp(struct l2cap_conn *conn,
5265 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5266 u8 *data)
5267{
5268 struct l2cap_le_conn_rsp *rsp = (struct l2cap_le_conn_rsp *) data;
Johan Hedberg3e64b7b2014-11-13 10:55:19 +02005269 struct hci_conn *hcon = conn->hcon;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005270 u16 dcid, mtu, mps, credits, result;
5271 struct l2cap_chan *chan;
Johan Hedberg3e64b7b2014-11-13 10:55:19 +02005272 int err, sec_level;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005273
5274 if (cmd_len < sizeof(*rsp))
5275 return -EPROTO;
5276
5277 dcid = __le16_to_cpu(rsp->dcid);
5278 mtu = __le16_to_cpu(rsp->mtu);
5279 mps = __le16_to_cpu(rsp->mps);
5280 credits = __le16_to_cpu(rsp->credits);
5281 result = __le16_to_cpu(rsp->result);
5282
Johan Hedberg40624182015-11-02 14:39:17 +02005283 if (result == L2CAP_CR_SUCCESS && (mtu < 23 || mps < 23 ||
5284 dcid < L2CAP_CID_DYN_START ||
5285 dcid > L2CAP_CID_LE_DYN_END))
Johan Hedbergf1496de2013-05-13 14:15:56 +03005286 return -EPROTO;
5287
5288 BT_DBG("dcid 0x%4.4x mtu %u mps %u credits %u result 0x%2.2x",
5289 dcid, mtu, mps, credits, result);
5290
5291 mutex_lock(&conn->chan_lock);
5292
5293 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5294 if (!chan) {
5295 err = -EBADSLT;
5296 goto unlock;
5297 }
5298
5299 err = 0;
5300
5301 l2cap_chan_lock(chan);
5302
5303 switch (result) {
5304 case L2CAP_CR_SUCCESS:
Johan Hedberg40624182015-11-02 14:39:17 +02005305 if (__l2cap_get_chan_by_dcid(conn, dcid)) {
5306 err = -EBADSLT;
5307 break;
5308 }
5309
Johan Hedbergf1496de2013-05-13 14:15:56 +03005310 chan->ident = 0;
5311 chan->dcid = dcid;
5312 chan->omtu = mtu;
5313 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005314 chan->tx_credits = credits;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005315 l2cap_chan_ready(chan);
5316 break;
5317
Johan Hedberg3e64b7b2014-11-13 10:55:19 +02005318 case L2CAP_CR_AUTHENTICATION:
5319 case L2CAP_CR_ENCRYPTION:
5320 /* If we already have MITM protection we can't do
5321 * anything.
5322 */
5323 if (hcon->sec_level > BT_SECURITY_MEDIUM) {
5324 l2cap_chan_del(chan, ECONNREFUSED);
5325 break;
5326 }
5327
5328 sec_level = hcon->sec_level + 1;
5329 if (chan->sec_level < sec_level)
5330 chan->sec_level = sec_level;
5331
5332 /* We'll need to send a new Connect Request */
5333 clear_bit(FLAG_LE_CONN_REQ_SENT, &chan->flags);
5334
5335 smp_conn_security(hcon, chan->sec_level);
5336 break;
5337
Johan Hedbergf1496de2013-05-13 14:15:56 +03005338 default:
5339 l2cap_chan_del(chan, ECONNREFUSED);
5340 break;
5341 }
5342
5343 l2cap_chan_unlock(chan);
5344
5345unlock:
5346 mutex_unlock(&conn->chan_lock);
5347
5348 return err;
5349}
5350
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005351static inline int l2cap_bredr_sig_cmd(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005352 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5353 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005354{
5355 int err = 0;
5356
5357 switch (cmd->code) {
5358 case L2CAP_COMMAND_REJ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005359 l2cap_command_rej(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005360 break;
5361
5362 case L2CAP_CONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005363 err = l2cap_connect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005364 break;
5365
5366 case L2CAP_CONN_RSP:
Mat Martineauf5a25982012-10-11 17:48:21 +03005367 case L2CAP_CREATE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005368 l2cap_connect_create_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005369 break;
5370
5371 case L2CAP_CONF_REQ:
5372 err = l2cap_config_req(conn, cmd, cmd_len, data);
5373 break;
5374
5375 case L2CAP_CONF_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005376 l2cap_config_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005377 break;
5378
5379 case L2CAP_DISCONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005380 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005381 break;
5382
5383 case L2CAP_DISCONN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005384 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005385 break;
5386
5387 case L2CAP_ECHO_REQ:
5388 l2cap_send_cmd(conn, cmd->ident, L2CAP_ECHO_RSP, cmd_len, data);
5389 break;
5390
5391 case L2CAP_ECHO_RSP:
5392 break;
5393
5394 case L2CAP_INFO_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005395 err = l2cap_information_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005396 break;
5397
5398 case L2CAP_INFO_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005399 l2cap_information_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005400 break;
5401
Mat Martineauf94ff6f2011-11-02 16:18:32 -07005402 case L2CAP_CREATE_CHAN_REQ:
5403 err = l2cap_create_channel_req(conn, cmd, cmd_len, data);
5404 break;
5405
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005406 case L2CAP_MOVE_CHAN_REQ:
5407 err = l2cap_move_channel_req(conn, cmd, cmd_len, data);
5408 break;
5409
5410 case L2CAP_MOVE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005411 l2cap_move_channel_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005412 break;
5413
5414 case L2CAP_MOVE_CHAN_CFM:
5415 err = l2cap_move_channel_confirm(conn, cmd, cmd_len, data);
5416 break;
5417
5418 case L2CAP_MOVE_CHAN_CFM_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005419 l2cap_move_channel_confirm_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005420 break;
5421
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005422 default:
5423 BT_ERR("Unknown BR/EDR signaling command 0x%2.2x", cmd->code);
5424 err = -EINVAL;
5425 break;
5426 }
5427
5428 return err;
5429}
5430
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005431static int l2cap_le_connect_req(struct l2cap_conn *conn,
5432 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5433 u8 *data)
5434{
5435 struct l2cap_le_conn_req *req = (struct l2cap_le_conn_req *) data;
5436 struct l2cap_le_conn_rsp rsp;
5437 struct l2cap_chan *chan, *pchan;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005438 u16 dcid, scid, credits, mtu, mps;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005439 __le16 psm;
5440 u8 result;
5441
5442 if (cmd_len != sizeof(*req))
5443 return -EPROTO;
5444
5445 scid = __le16_to_cpu(req->scid);
5446 mtu = __le16_to_cpu(req->mtu);
5447 mps = __le16_to_cpu(req->mps);
5448 psm = req->psm;
5449 dcid = 0;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005450 credits = 0;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005451
5452 if (mtu < 23 || mps < 23)
5453 return -EPROTO;
5454
5455 BT_DBG("psm 0x%2.2x scid 0x%4.4x mtu %u mps %u", __le16_to_cpu(psm),
5456 scid, mtu, mps);
5457
5458 /* Check if we have socket listening on psm */
5459 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
5460 &conn->hcon->dst, LE_LINK);
5461 if (!pchan) {
5462 result = L2CAP_CR_BAD_PSM;
5463 chan = NULL;
5464 goto response;
5465 }
5466
5467 mutex_lock(&conn->chan_lock);
5468 l2cap_chan_lock(pchan);
5469
Johan Hedberg35dc6f82014-11-13 10:55:18 +02005470 if (!smp_sufficient_security(conn->hcon, pchan->sec_level,
5471 SMP_ALLOW_STK)) {
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005472 result = L2CAP_CR_AUTHENTICATION;
5473 chan = NULL;
5474 goto response_unlock;
5475 }
5476
Johan Hedberg8a7889c2015-11-02 14:39:15 +02005477 /* Check for valid dynamic CID range */
5478 if (scid < L2CAP_CID_DYN_START || scid > L2CAP_CID_LE_DYN_END) {
5479 result = L2CAP_CR_INVALID_SCID;
5480 chan = NULL;
5481 goto response_unlock;
5482 }
5483
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005484 /* Check if we already have channel with that dcid */
5485 if (__l2cap_get_chan_by_dcid(conn, scid)) {
Johan Hedberg8a7889c2015-11-02 14:39:15 +02005486 result = L2CAP_CR_SCID_IN_USE;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005487 chan = NULL;
5488 goto response_unlock;
5489 }
5490
5491 chan = pchan->ops->new_connection(pchan);
5492 if (!chan) {
5493 result = L2CAP_CR_NO_MEM;
5494 goto response_unlock;
5495 }
5496
5497 bacpy(&chan->src, &conn->hcon->src);
5498 bacpy(&chan->dst, &conn->hcon->dst);
Johan Hedberga250e042015-01-15 13:06:44 +02005499 chan->src_type = bdaddr_src_type(conn->hcon);
5500 chan->dst_type = bdaddr_dst_type(conn->hcon);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005501 chan->psm = psm;
5502 chan->dcid = scid;
5503 chan->omtu = mtu;
5504 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005505 chan->tx_credits = __le16_to_cpu(req->credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005506
5507 __l2cap_chan_add(conn, chan);
Luiz Augusto von Dentzfe149312018-09-04 13:39:20 +03005508
5509 l2cap_le_flowctl_init(chan);
5510
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005511 dcid = chan->scid;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005512 credits = chan->rx_credits;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005513
5514 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
5515
5516 chan->ident = cmd->ident;
5517
5518 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
5519 l2cap_state_change(chan, BT_CONNECT2);
Johan Hedberg434714d2014-09-01 09:45:03 +03005520 /* The following result value is actually not defined
5521 * for LE CoC but we use it to let the function know
5522 * that it should bail out after doing its cleanup
5523 * instead of sending a response.
5524 */
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005525 result = L2CAP_CR_PEND;
5526 chan->ops->defer(chan);
5527 } else {
5528 l2cap_chan_ready(chan);
5529 result = L2CAP_CR_SUCCESS;
5530 }
5531
5532response_unlock:
5533 l2cap_chan_unlock(pchan);
5534 mutex_unlock(&conn->chan_lock);
Johan Hedberga24cce12014-08-07 22:56:42 +03005535 l2cap_chan_put(pchan);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005536
5537 if (result == L2CAP_CR_PEND)
5538 return 0;
5539
5540response:
5541 if (chan) {
5542 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02005543 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005544 } else {
5545 rsp.mtu = 0;
5546 rsp.mps = 0;
5547 }
5548
5549 rsp.dcid = cpu_to_le16(dcid);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005550 rsp.credits = cpu_to_le16(credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005551 rsp.result = cpu_to_le16(result);
5552
5553 l2cap_send_cmd(conn, cmd->ident, L2CAP_LE_CONN_RSP, sizeof(rsp), &rsp);
5554
5555 return 0;
5556}
5557
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005558static inline int l2cap_le_credits(struct l2cap_conn *conn,
5559 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5560 u8 *data)
5561{
5562 struct l2cap_le_credits *pkt;
5563 struct l2cap_chan *chan;
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005564 u16 cid, credits, max_credits;
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005565
5566 if (cmd_len != sizeof(*pkt))
5567 return -EPROTO;
5568
5569 pkt = (struct l2cap_le_credits *) data;
5570 cid = __le16_to_cpu(pkt->cid);
5571 credits = __le16_to_cpu(pkt->credits);
5572
5573 BT_DBG("cid 0x%4.4x credits 0x%4.4x", cid, credits);
5574
5575 chan = l2cap_get_chan_by_dcid(conn, cid);
5576 if (!chan)
5577 return -EBADSLT;
5578
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005579 max_credits = LE_FLOWCTL_MAX_CREDITS - chan->tx_credits;
5580 if (credits > max_credits) {
5581 BT_ERR("LE credits overflow");
5582 l2cap_send_disconn_req(chan, ECONNRESET);
Martin Townsendee930532014-10-13 19:24:45 +01005583 l2cap_chan_unlock(chan);
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005584
5585 /* Return 0 so that we don't trigger an unnecessary
5586 * command reject packet.
5587 */
5588 return 0;
5589 }
5590
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005591 chan->tx_credits += credits;
5592
Luiz Augusto von Dentz8a505b72017-04-11 22:21:01 +03005593 /* Resume sending */
5594 l2cap_le_flowctl_send(chan);
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005595
5596 if (chan->tx_credits)
5597 chan->ops->resume(chan);
5598
5599 l2cap_chan_unlock(chan);
5600
5601 return 0;
5602}
5603
Johan Hedberg71fb4192013-12-10 10:52:48 +02005604static inline int l2cap_le_command_rej(struct l2cap_conn *conn,
5605 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5606 u8 *data)
5607{
5608 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
5609 struct l2cap_chan *chan;
5610
5611 if (cmd_len < sizeof(*rej))
5612 return -EPROTO;
5613
5614 mutex_lock(&conn->chan_lock);
5615
5616 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5617 if (!chan)
5618 goto done;
5619
5620 l2cap_chan_lock(chan);
5621 l2cap_chan_del(chan, ECONNREFUSED);
5622 l2cap_chan_unlock(chan);
5623
5624done:
5625 mutex_unlock(&conn->chan_lock);
5626 return 0;
5627}
5628
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005629static inline int l2cap_le_sig_cmd(struct l2cap_conn *conn,
Johan Hedberg203e6392013-05-15 10:07:15 +03005630 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5631 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005632{
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005633 int err = 0;
5634
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005635 switch (cmd->code) {
5636 case L2CAP_COMMAND_REJ:
Johan Hedberg71fb4192013-12-10 10:52:48 +02005637 l2cap_le_command_rej(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005638 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005639
5640 case L2CAP_CONN_PARAM_UPDATE_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005641 err = l2cap_conn_param_update_req(conn, cmd, cmd_len, data);
5642 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005643
5644 case L2CAP_CONN_PARAM_UPDATE_RSP:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005645 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005646
Johan Hedbergf1496de2013-05-13 14:15:56 +03005647 case L2CAP_LE_CONN_RSP:
5648 l2cap_le_connect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005649 break;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005650
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005651 case L2CAP_LE_CONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005652 err = l2cap_le_connect_req(conn, cmd, cmd_len, data);
5653 break;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005654
Johan Hedbergfad5fc82013-12-05 09:45:01 +02005655 case L2CAP_LE_CREDITS:
5656 err = l2cap_le_credits(conn, cmd, cmd_len, data);
5657 break;
5658
Johan Hedberg3defe012013-05-15 10:16:06 +03005659 case L2CAP_DISCONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005660 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
5661 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005662
5663 case L2CAP_DISCONN_RSP:
5664 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005665 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005666
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005667 default:
5668 BT_ERR("Unknown LE signaling command 0x%2.2x", cmd->code);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005669 err = -EINVAL;
5670 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005671 }
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005672
5673 return err;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005674}
5675
Johan Hedbergc5623552013-04-29 19:35:33 +03005676static inline void l2cap_le_sig_channel(struct l2cap_conn *conn,
5677 struct sk_buff *skb)
5678{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005679 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005680 struct l2cap_cmd_hdr *cmd;
5681 u16 len;
Johan Hedbergc5623552013-04-29 19:35:33 +03005682 int err;
5683
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005684 if (hcon->type != LE_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005685 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005686
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005687 if (skb->len < L2CAP_CMD_HDR_SIZE)
5688 goto drop;
Johan Hedbergc5623552013-04-29 19:35:33 +03005689
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005690 cmd = (void *) skb->data;
5691 skb_pull(skb, L2CAP_CMD_HDR_SIZE);
Johan Hedbergc5623552013-04-29 19:35:33 +03005692
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005693 len = le16_to_cpu(cmd->len);
Johan Hedbergc5623552013-04-29 19:35:33 +03005694
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005695 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd->code, len, cmd->ident);
Johan Hedbergc5623552013-04-29 19:35:33 +03005696
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005697 if (len != skb->len || !cmd->ident) {
5698 BT_DBG("corrupted command");
5699 goto drop;
5700 }
Johan Hedbergc5623552013-04-29 19:35:33 +03005701
Johan Hedberg203e6392013-05-15 10:07:15 +03005702 err = l2cap_le_sig_cmd(conn, cmd, len, skb->data);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005703 if (err) {
5704 struct l2cap_cmd_rej_unk rej;
Johan Hedbergc5623552013-04-29 19:35:33 +03005705
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005706 BT_ERR("Wrong link type (%d)", err);
Johan Hedbergc5623552013-04-29 19:35:33 +03005707
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005708 rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005709 l2cap_send_cmd(conn, cmd->ident, L2CAP_COMMAND_REJ,
5710 sizeof(rej), &rej);
Johan Hedbergc5623552013-04-29 19:35:33 +03005711 }
5712
Marcel Holtmann3b166292013-10-02 08:28:21 -07005713drop:
Johan Hedbergc5623552013-04-29 19:35:33 +03005714 kfree_skb(skb);
5715}
5716
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005717static inline void l2cap_sig_channel(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005718 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005719{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005720 struct hci_conn *hcon = conn->hcon;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005721 u8 *data = skb->data;
5722 int len = skb->len;
5723 struct l2cap_cmd_hdr cmd;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005724 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005725
5726 l2cap_raw_recv(conn, skb);
5727
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005728 if (hcon->type != ACL_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005729 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005730
Linus Torvalds1da177e2005-04-16 15:20:36 -07005731 while (len >= L2CAP_CMD_HDR_SIZE) {
Al Viro88219a02007-07-29 00:17:25 -07005732 u16 cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005733 memcpy(&cmd, data, L2CAP_CMD_HDR_SIZE);
5734 data += L2CAP_CMD_HDR_SIZE;
5735 len -= L2CAP_CMD_HDR_SIZE;
5736
Al Viro88219a02007-07-29 00:17:25 -07005737 cmd_len = le16_to_cpu(cmd.len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005738
Gustavo Padovan2d792812012-10-06 10:07:01 +01005739 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd.code, cmd_len,
5740 cmd.ident);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005741
Al Viro88219a02007-07-29 00:17:25 -07005742 if (cmd_len > len || !cmd.ident) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005743 BT_DBG("corrupted command");
5744 break;
5745 }
5746
Johan Hedbergc5623552013-04-29 19:35:33 +03005747 err = l2cap_bredr_sig_cmd(conn, &cmd, cmd_len, data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005748 if (err) {
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03005749 struct l2cap_cmd_rej_unk rej;
Gustavo F. Padovan2c6d1a22011-03-23 14:38:32 -03005750
5751 BT_ERR("Wrong link type (%d)", err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005752
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005753 rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Gustavo Padovan2d792812012-10-06 10:07:01 +01005754 l2cap_send_cmd(conn, cmd.ident, L2CAP_COMMAND_REJ,
5755 sizeof(rej), &rej);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005756 }
5757
Al Viro88219a02007-07-29 00:17:25 -07005758 data += cmd_len;
5759 len -= cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005760 }
5761
Marcel Holtmann3b166292013-10-02 08:28:21 -07005762drop:
Linus Torvalds1da177e2005-04-16 15:20:36 -07005763 kfree_skb(skb);
5764}
5765
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005766static int l2cap_check_fcs(struct l2cap_chan *chan, struct sk_buff *skb)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005767{
5768 u16 our_fcs, rcv_fcs;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03005769 int hdr_size;
5770
5771 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
5772 hdr_size = L2CAP_EXT_HDR_SIZE;
5773 else
5774 hdr_size = L2CAP_ENH_HDR_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005775
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005776 if (chan->fcs == L2CAP_FCS_CRC16) {
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005777 skb_trim(skb, skb->len - L2CAP_FCS_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005778 rcv_fcs = get_unaligned_le16(skb->data + skb->len);
5779 our_fcs = crc16(0, skb->data - hdr_size, skb->len + hdr_size);
5780
5781 if (our_fcs != rcv_fcs)
João Paulo Rechi Vita7a560e52010-06-22 13:56:27 -03005782 return -EBADMSG;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005783 }
5784 return 0;
5785}
5786
Mat Martineau6ea00482012-05-17 20:53:52 -07005787static void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan)
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005788{
Mat Martineaue31f7632012-05-17 20:53:41 -07005789 struct l2cap_ctrl control;
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005790
Mat Martineaue31f7632012-05-17 20:53:41 -07005791 BT_DBG("chan %p", chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005792
Mat Martineaue31f7632012-05-17 20:53:41 -07005793 memset(&control, 0, sizeof(control));
5794 control.sframe = 1;
5795 control.final = 1;
5796 control.reqseq = chan->buffer_seq;
5797 set_bit(CONN_SEND_FBIT, &chan->conn_state);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005798
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005799 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
Mat Martineaue31f7632012-05-17 20:53:41 -07005800 control.super = L2CAP_SUPER_RNR;
5801 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005802 }
5803
Mat Martineaue31f7632012-05-17 20:53:41 -07005804 if (test_and_clear_bit(CONN_REMOTE_BUSY, &chan->conn_state) &&
5805 chan->unacked_frames > 0)
5806 __set_retrans_timer(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005807
Mat Martineaue31f7632012-05-17 20:53:41 -07005808 /* Send pending iframes */
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03005809 l2cap_ertm_send(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005810
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005811 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
Mat Martineaue31f7632012-05-17 20:53:41 -07005812 test_bit(CONN_SEND_FBIT, &chan->conn_state)) {
5813 /* F-bit wasn't sent in an s-frame or i-frame yet, so
5814 * send it now.
5815 */
5816 control.super = L2CAP_SUPER_RR;
5817 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005818 }
5819}
5820
Gustavo Padovan2d792812012-10-06 10:07:01 +01005821static void append_skb_frag(struct sk_buff *skb, struct sk_buff *new_frag,
5822 struct sk_buff **last_frag)
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005823{
Mat Martineau84084a32011-07-22 14:54:00 -07005824 /* skb->len reflects data in skb as well as all fragments
5825 * skb->data_len reflects only data in fragments
5826 */
5827 if (!skb_has_frag_list(skb))
5828 skb_shinfo(skb)->frag_list = new_frag;
5829
5830 new_frag->next = NULL;
5831
5832 (*last_frag)->next = new_frag;
5833 *last_frag = new_frag;
5834
5835 skb->len += new_frag->len;
5836 skb->data_len += new_frag->len;
5837 skb->truesize += new_frag->truesize;
5838}
5839
Mat Martineau4b51dae92012-05-17 20:53:37 -07005840static int l2cap_reassemble_sdu(struct l2cap_chan *chan, struct sk_buff *skb,
5841 struct l2cap_ctrl *control)
Mat Martineau84084a32011-07-22 14:54:00 -07005842{
5843 int err = -EINVAL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005844
Mat Martineau4b51dae92012-05-17 20:53:37 -07005845 switch (control->sar) {
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005846 case L2CAP_SAR_UNSEGMENTED:
Mat Martineau84084a32011-07-22 14:54:00 -07005847 if (chan->sdu)
5848 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005849
Gustavo Padovan80b98022012-05-27 22:27:51 -03005850 err = chan->ops->recv(chan, skb);
Mat Martineau84084a32011-07-22 14:54:00 -07005851 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005852
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005853 case L2CAP_SAR_START:
Mat Martineau84084a32011-07-22 14:54:00 -07005854 if (chan->sdu)
5855 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005856
Daniel Borkmanndbb50882016-07-27 11:40:14 -07005857 if (!pskb_may_pull(skb, L2CAP_SDULEN_SIZE))
5858 break;
5859
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005860 chan->sdu_len = get_unaligned_le16(skb->data);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005861 skb_pull(skb, L2CAP_SDULEN_SIZE);
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005862
Mat Martineau84084a32011-07-22 14:54:00 -07005863 if (chan->sdu_len > chan->imtu) {
5864 err = -EMSGSIZE;
5865 break;
5866 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005867
Mat Martineau84084a32011-07-22 14:54:00 -07005868 if (skb->len >= chan->sdu_len)
5869 break;
5870
5871 chan->sdu = skb;
5872 chan->sdu_last_frag = skb;
5873
5874 skb = NULL;
5875 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005876 break;
5877
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005878 case L2CAP_SAR_CONTINUE:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005879 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005880 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005881
Mat Martineau84084a32011-07-22 14:54:00 -07005882 append_skb_frag(chan->sdu, skb,
5883 &chan->sdu_last_frag);
5884 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005885
Mat Martineau84084a32011-07-22 14:54:00 -07005886 if (chan->sdu->len >= chan->sdu_len)
5887 break;
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005888
Mat Martineau84084a32011-07-22 14:54:00 -07005889 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005890 break;
5891
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005892 case L2CAP_SAR_END:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005893 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005894 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005895
Mat Martineau84084a32011-07-22 14:54:00 -07005896 append_skb_frag(chan->sdu, skb,
5897 &chan->sdu_last_frag);
5898 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005899
Mat Martineau84084a32011-07-22 14:54:00 -07005900 if (chan->sdu->len != chan->sdu_len)
5901 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005902
Gustavo Padovan80b98022012-05-27 22:27:51 -03005903 err = chan->ops->recv(chan, chan->sdu);
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005904
Mat Martineau84084a32011-07-22 14:54:00 -07005905 if (!err) {
5906 /* Reassembly complete */
5907 chan->sdu = NULL;
5908 chan->sdu_last_frag = NULL;
5909 chan->sdu_len = 0;
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005910 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005911 break;
5912 }
5913
Mat Martineau84084a32011-07-22 14:54:00 -07005914 if (err) {
5915 kfree_skb(skb);
5916 kfree_skb(chan->sdu);
5917 chan->sdu = NULL;
5918 chan->sdu_last_frag = NULL;
5919 chan->sdu_len = 0;
5920 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005921
Mat Martineau84084a32011-07-22 14:54:00 -07005922 return err;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005923}
5924
Mat Martineau32b32732012-10-23 15:24:11 -07005925static int l2cap_resegment(struct l2cap_chan *chan)
5926{
5927 /* Placeholder */
5928 return 0;
5929}
5930
Mat Martineaue3281402011-07-07 09:39:02 -07005931void l2cap_chan_busy(struct l2cap_chan *chan, int busy)
Gustavo F. Padovan712132eb2010-06-21 19:39:50 -03005932{
Mat Martineau61aa4f52012-05-17 20:53:40 -07005933 u8 event;
5934
5935 if (chan->mode != L2CAP_MODE_ERTM)
5936 return;
5937
5938 event = busy ? L2CAP_EV_LOCAL_BUSY_DETECTED : L2CAP_EV_LOCAL_BUSY_CLEAR;
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03005939 l2cap_tx(chan, NULL, NULL, event);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005940}
5941
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005942static int l2cap_rx_queued_iframes(struct l2cap_chan *chan)
5943{
Mat Martineau63838722012-05-17 20:53:45 -07005944 int err = 0;
5945 /* Pass sequential frames to l2cap_reassemble_sdu()
5946 * until a gap is encountered.
5947 */
5948
5949 BT_DBG("chan %p", chan);
5950
5951 while (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
5952 struct sk_buff *skb;
5953 BT_DBG("Searching for skb with txseq %d (queue len %d)",
5954 chan->buffer_seq, skb_queue_len(&chan->srej_q));
5955
5956 skb = l2cap_ertm_seq_in_queue(&chan->srej_q, chan->buffer_seq);
5957
5958 if (!skb)
5959 break;
5960
5961 skb_unlink(skb, &chan->srej_q);
5962 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
Johan Hedberga4368ff2015-03-30 23:21:01 +03005963 err = l2cap_reassemble_sdu(chan, skb, &bt_cb(skb)->l2cap);
Mat Martineau63838722012-05-17 20:53:45 -07005964 if (err)
5965 break;
5966 }
5967
5968 if (skb_queue_empty(&chan->srej_q)) {
5969 chan->rx_state = L2CAP_RX_STATE_RECV;
5970 l2cap_send_ack(chan);
5971 }
5972
5973 return err;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005974}
5975
5976static void l2cap_handle_srej(struct l2cap_chan *chan,
5977 struct l2cap_ctrl *control)
5978{
Mat Martineauf80842a2012-05-17 20:53:46 -07005979 struct sk_buff *skb;
5980
5981 BT_DBG("chan %p, control %p", chan, control);
5982
5983 if (control->reqseq == chan->next_tx_seq) {
5984 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005985 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005986 return;
5987 }
5988
5989 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
5990
5991 if (skb == NULL) {
5992 BT_DBG("Seq %d not available for retransmission",
5993 control->reqseq);
5994 return;
5995 }
5996
Johan Hedberga4368ff2015-03-30 23:21:01 +03005997 if (chan->max_tx != 0 && bt_cb(skb)->l2cap.retries >= chan->max_tx) {
Mat Martineauf80842a2012-05-17 20:53:46 -07005998 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005999 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07006000 return;
6001 }
6002
6003 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6004
6005 if (control->poll) {
6006 l2cap_pass_to_tx(chan, control);
6007
6008 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6009 l2cap_retransmit(chan, control);
6010 l2cap_ertm_send(chan);
6011
6012 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
6013 set_bit(CONN_SREJ_ACT, &chan->conn_state);
6014 chan->srej_save_reqseq = control->reqseq;
6015 }
6016 } else {
6017 l2cap_pass_to_tx_fbit(chan, control);
6018
6019 if (control->final) {
6020 if (chan->srej_save_reqseq != control->reqseq ||
6021 !test_and_clear_bit(CONN_SREJ_ACT,
6022 &chan->conn_state))
6023 l2cap_retransmit(chan, control);
6024 } else {
6025 l2cap_retransmit(chan, control);
6026 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
6027 set_bit(CONN_SREJ_ACT, &chan->conn_state);
6028 chan->srej_save_reqseq = control->reqseq;
6029 }
6030 }
6031 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006032}
6033
6034static void l2cap_handle_rej(struct l2cap_chan *chan,
6035 struct l2cap_ctrl *control)
6036{
Mat Martineaufcd289d2012-05-17 20:53:47 -07006037 struct sk_buff *skb;
6038
6039 BT_DBG("chan %p, control %p", chan, control);
6040
6041 if (control->reqseq == chan->next_tx_seq) {
6042 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006043 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07006044 return;
6045 }
6046
6047 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
6048
6049 if (chan->max_tx && skb &&
Johan Hedberga4368ff2015-03-30 23:21:01 +03006050 bt_cb(skb)->l2cap.retries >= chan->max_tx) {
Mat Martineaufcd289d2012-05-17 20:53:47 -07006051 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006052 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07006053 return;
6054 }
6055
6056 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6057
6058 l2cap_pass_to_tx(chan, control);
6059
6060 if (control->final) {
6061 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state))
6062 l2cap_retransmit_all(chan, control);
6063 } else {
6064 l2cap_retransmit_all(chan, control);
6065 l2cap_ertm_send(chan);
6066 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F)
6067 set_bit(CONN_REJ_ACT, &chan->conn_state);
6068 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006069}
6070
Mat Martineau4b51dae92012-05-17 20:53:37 -07006071static u8 l2cap_classify_txseq(struct l2cap_chan *chan, u16 txseq)
6072{
6073 BT_DBG("chan %p, txseq %d", chan, txseq);
6074
6075 BT_DBG("last_acked_seq %d, expected_tx_seq %d", chan->last_acked_seq,
6076 chan->expected_tx_seq);
6077
6078 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
6079 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
Gustavo Padovan2d792812012-10-06 10:07:01 +01006080 chan->tx_win) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07006081 /* See notes below regarding "double poll" and
6082 * invalid packets.
6083 */
6084 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
6085 BT_DBG("Invalid/Ignore - after SREJ");
6086 return L2CAP_TXSEQ_INVALID_IGNORE;
6087 } else {
6088 BT_DBG("Invalid - in window after SREJ sent");
6089 return L2CAP_TXSEQ_INVALID;
6090 }
6091 }
6092
6093 if (chan->srej_list.head == txseq) {
6094 BT_DBG("Expected SREJ");
6095 return L2CAP_TXSEQ_EXPECTED_SREJ;
6096 }
6097
6098 if (l2cap_ertm_seq_in_queue(&chan->srej_q, txseq)) {
6099 BT_DBG("Duplicate SREJ - txseq already stored");
6100 return L2CAP_TXSEQ_DUPLICATE_SREJ;
6101 }
6102
6103 if (l2cap_seq_list_contains(&chan->srej_list, txseq)) {
6104 BT_DBG("Unexpected SREJ - not requested");
6105 return L2CAP_TXSEQ_UNEXPECTED_SREJ;
6106 }
6107 }
6108
6109 if (chan->expected_tx_seq == txseq) {
6110 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
6111 chan->tx_win) {
6112 BT_DBG("Invalid - txseq outside tx window");
6113 return L2CAP_TXSEQ_INVALID;
6114 } else {
6115 BT_DBG("Expected");
6116 return L2CAP_TXSEQ_EXPECTED;
6117 }
6118 }
6119
6120 if (__seq_offset(chan, txseq, chan->last_acked_seq) <
Gustavo Padovan2d792812012-10-06 10:07:01 +01006121 __seq_offset(chan, chan->expected_tx_seq, chan->last_acked_seq)) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07006122 BT_DBG("Duplicate - expected_tx_seq later than txseq");
6123 return L2CAP_TXSEQ_DUPLICATE;
6124 }
6125
6126 if (__seq_offset(chan, txseq, chan->last_acked_seq) >= chan->tx_win) {
6127 /* A source of invalid packets is a "double poll" condition,
6128 * where delays cause us to send multiple poll packets. If
6129 * the remote stack receives and processes both polls,
6130 * sequence numbers can wrap around in such a way that a
6131 * resent frame has a sequence number that looks like new data
6132 * with a sequence gap. This would trigger an erroneous SREJ
6133 * request.
6134 *
6135 * Fortunately, this is impossible with a tx window that's
6136 * less than half of the maximum sequence number, which allows
6137 * invalid frames to be safely ignored.
6138 *
6139 * With tx window sizes greater than half of the tx window
6140 * maximum, the frame is invalid and cannot be ignored. This
6141 * causes a disconnect.
6142 */
6143
6144 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
6145 BT_DBG("Invalid/Ignore - txseq outside tx window");
6146 return L2CAP_TXSEQ_INVALID_IGNORE;
6147 } else {
6148 BT_DBG("Invalid - txseq outside tx window");
6149 return L2CAP_TXSEQ_INVALID;
6150 }
6151 } else {
6152 BT_DBG("Unexpected - txseq indicates missing frames");
6153 return L2CAP_TXSEQ_UNEXPECTED;
6154 }
6155}
6156
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006157static int l2cap_rx_state_recv(struct l2cap_chan *chan,
6158 struct l2cap_ctrl *control,
6159 struct sk_buff *skb, u8 event)
6160{
6161 int err = 0;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006162 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006163
6164 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6165 event);
6166
6167 switch (event) {
6168 case L2CAP_EV_RECV_IFRAME:
6169 switch (l2cap_classify_txseq(chan, control->txseq)) {
6170 case L2CAP_TXSEQ_EXPECTED:
6171 l2cap_pass_to_tx(chan, control);
6172
6173 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6174 BT_DBG("Busy, discarding expected seq %d",
6175 control->txseq);
6176 break;
6177 }
6178
6179 chan->expected_tx_seq = __next_seq(chan,
6180 control->txseq);
6181
6182 chan->buffer_seq = chan->expected_tx_seq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006183 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006184
6185 err = l2cap_reassemble_sdu(chan, skb, control);
6186 if (err)
6187 break;
6188
6189 if (control->final) {
6190 if (!test_and_clear_bit(CONN_REJ_ACT,
6191 &chan->conn_state)) {
6192 control->final = 0;
6193 l2cap_retransmit_all(chan, control);
6194 l2cap_ertm_send(chan);
6195 }
6196 }
6197
6198 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
6199 l2cap_send_ack(chan);
6200 break;
6201 case L2CAP_TXSEQ_UNEXPECTED:
6202 l2cap_pass_to_tx(chan, control);
6203
6204 /* Can't issue SREJ frames in the local busy state.
6205 * Drop this frame, it will be seen as missing
6206 * when local busy is exited.
6207 */
6208 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6209 BT_DBG("Busy, discarding unexpected seq %d",
6210 control->txseq);
6211 break;
6212 }
6213
6214 /* There was a gap in the sequence, so an SREJ
6215 * must be sent for each missing frame. The
6216 * current frame is stored for later use.
6217 */
6218 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006219 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006220 BT_DBG("Queued %p (queue len %d)", skb,
6221 skb_queue_len(&chan->srej_q));
6222
6223 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
6224 l2cap_seq_list_clear(&chan->srej_list);
6225 l2cap_send_srej(chan, control->txseq);
6226
6227 chan->rx_state = L2CAP_RX_STATE_SREJ_SENT;
6228 break;
6229 case L2CAP_TXSEQ_DUPLICATE:
6230 l2cap_pass_to_tx(chan, control);
6231 break;
6232 case L2CAP_TXSEQ_INVALID_IGNORE:
6233 break;
6234 case L2CAP_TXSEQ_INVALID:
6235 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006236 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006237 break;
6238 }
6239 break;
6240 case L2CAP_EV_RECV_RR:
6241 l2cap_pass_to_tx(chan, control);
6242 if (control->final) {
6243 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6244
Mat Martineaue6a3ee62012-10-23 15:24:22 -07006245 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state) &&
6246 !__chan_is_moving(chan)) {
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006247 control->final = 0;
6248 l2cap_retransmit_all(chan, control);
6249 }
6250
6251 l2cap_ertm_send(chan);
6252 } else if (control->poll) {
6253 l2cap_send_i_or_rr_or_rnr(chan);
6254 } else {
6255 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6256 &chan->conn_state) &&
6257 chan->unacked_frames)
6258 __set_retrans_timer(chan);
6259
6260 l2cap_ertm_send(chan);
6261 }
6262 break;
6263 case L2CAP_EV_RECV_RNR:
6264 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6265 l2cap_pass_to_tx(chan, control);
6266 if (control && control->poll) {
6267 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6268 l2cap_send_rr_or_rnr(chan, 0);
6269 }
6270 __clear_retrans_timer(chan);
6271 l2cap_seq_list_clear(&chan->retrans_list);
6272 break;
6273 case L2CAP_EV_RECV_REJ:
6274 l2cap_handle_rej(chan, control);
6275 break;
6276 case L2CAP_EV_RECV_SREJ:
6277 l2cap_handle_srej(chan, control);
6278 break;
6279 default:
6280 break;
6281 }
6282
6283 if (skb && !skb_in_use) {
6284 BT_DBG("Freeing %p", skb);
6285 kfree_skb(skb);
6286 }
6287
6288 return err;
6289}
6290
6291static int l2cap_rx_state_srej_sent(struct l2cap_chan *chan,
6292 struct l2cap_ctrl *control,
6293 struct sk_buff *skb, u8 event)
6294{
6295 int err = 0;
6296 u16 txseq = control->txseq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006297 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006298
6299 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6300 event);
6301
6302 switch (event) {
6303 case L2CAP_EV_RECV_IFRAME:
6304 switch (l2cap_classify_txseq(chan, txseq)) {
6305 case L2CAP_TXSEQ_EXPECTED:
6306 /* Keep frame for reassembly later */
6307 l2cap_pass_to_tx(chan, control);
6308 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006309 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006310 BT_DBG("Queued %p (queue len %d)", skb,
6311 skb_queue_len(&chan->srej_q));
6312
6313 chan->expected_tx_seq = __next_seq(chan, txseq);
6314 break;
6315 case L2CAP_TXSEQ_EXPECTED_SREJ:
6316 l2cap_seq_list_pop(&chan->srej_list);
6317
6318 l2cap_pass_to_tx(chan, control);
6319 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006320 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006321 BT_DBG("Queued %p (queue len %d)", skb,
6322 skb_queue_len(&chan->srej_q));
6323
6324 err = l2cap_rx_queued_iframes(chan);
6325 if (err)
6326 break;
6327
6328 break;
6329 case L2CAP_TXSEQ_UNEXPECTED:
6330 /* Got a frame that can't be reassembled yet.
6331 * Save it for later, and send SREJs to cover
6332 * the missing frames.
6333 */
6334 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006335 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006336 BT_DBG("Queued %p (queue len %d)", skb,
6337 skb_queue_len(&chan->srej_q));
6338
6339 l2cap_pass_to_tx(chan, control);
6340 l2cap_send_srej(chan, control->txseq);
6341 break;
6342 case L2CAP_TXSEQ_UNEXPECTED_SREJ:
6343 /* This frame was requested with an SREJ, but
6344 * some expected retransmitted frames are
6345 * missing. Request retransmission of missing
6346 * SREJ'd frames.
6347 */
6348 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006349 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006350 BT_DBG("Queued %p (queue len %d)", skb,
6351 skb_queue_len(&chan->srej_q));
6352
6353 l2cap_pass_to_tx(chan, control);
6354 l2cap_send_srej_list(chan, control->txseq);
6355 break;
6356 case L2CAP_TXSEQ_DUPLICATE_SREJ:
6357 /* We've already queued this frame. Drop this copy. */
6358 l2cap_pass_to_tx(chan, control);
6359 break;
6360 case L2CAP_TXSEQ_DUPLICATE:
6361 /* Expecting a later sequence number, so this frame
6362 * was already received. Ignore it completely.
6363 */
6364 break;
6365 case L2CAP_TXSEQ_INVALID_IGNORE:
6366 break;
6367 case L2CAP_TXSEQ_INVALID:
6368 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006369 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006370 break;
6371 }
6372 break;
6373 case L2CAP_EV_RECV_RR:
6374 l2cap_pass_to_tx(chan, control);
6375 if (control->final) {
6376 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6377
6378 if (!test_and_clear_bit(CONN_REJ_ACT,
6379 &chan->conn_state)) {
6380 control->final = 0;
6381 l2cap_retransmit_all(chan, control);
6382 }
6383
6384 l2cap_ertm_send(chan);
6385 } else if (control->poll) {
6386 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6387 &chan->conn_state) &&
6388 chan->unacked_frames) {
6389 __set_retrans_timer(chan);
6390 }
6391
6392 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6393 l2cap_send_srej_tail(chan);
6394 } else {
6395 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6396 &chan->conn_state) &&
6397 chan->unacked_frames)
6398 __set_retrans_timer(chan);
6399
6400 l2cap_send_ack(chan);
6401 }
6402 break;
6403 case L2CAP_EV_RECV_RNR:
6404 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6405 l2cap_pass_to_tx(chan, control);
6406 if (control->poll) {
6407 l2cap_send_srej_tail(chan);
6408 } else {
6409 struct l2cap_ctrl rr_control;
6410 memset(&rr_control, 0, sizeof(rr_control));
6411 rr_control.sframe = 1;
6412 rr_control.super = L2CAP_SUPER_RR;
6413 rr_control.reqseq = chan->buffer_seq;
6414 l2cap_send_sframe(chan, &rr_control);
6415 }
6416
6417 break;
6418 case L2CAP_EV_RECV_REJ:
6419 l2cap_handle_rej(chan, control);
6420 break;
6421 case L2CAP_EV_RECV_SREJ:
6422 l2cap_handle_srej(chan, control);
6423 break;
6424 }
6425
6426 if (skb && !skb_in_use) {
6427 BT_DBG("Freeing %p", skb);
6428 kfree_skb(skb);
6429 }
6430
6431 return err;
6432}
6433
Mat Martineau32b32732012-10-23 15:24:11 -07006434static int l2cap_finish_move(struct l2cap_chan *chan)
6435{
6436 BT_DBG("chan %p", chan);
6437
6438 chan->rx_state = L2CAP_RX_STATE_RECV;
6439
6440 if (chan->hs_hcon)
6441 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6442 else
6443 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6444
6445 return l2cap_resegment(chan);
6446}
6447
6448static int l2cap_rx_state_wait_p(struct l2cap_chan *chan,
6449 struct l2cap_ctrl *control,
6450 struct sk_buff *skb, u8 event)
6451{
6452 int err;
6453
6454 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6455 event);
6456
6457 if (!control->poll)
6458 return -EPROTO;
6459
6460 l2cap_process_reqseq(chan, control->reqseq);
6461
6462 if (!skb_queue_empty(&chan->tx_q))
6463 chan->tx_send_head = skb_peek(&chan->tx_q);
6464 else
6465 chan->tx_send_head = NULL;
6466
6467 /* Rewind next_tx_seq to the point expected
6468 * by the receiver.
6469 */
6470 chan->next_tx_seq = control->reqseq;
6471 chan->unacked_frames = 0;
6472
6473 err = l2cap_finish_move(chan);
6474 if (err)
6475 return err;
6476
6477 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6478 l2cap_send_i_or_rr_or_rnr(chan);
6479
6480 if (event == L2CAP_EV_RECV_IFRAME)
6481 return -EPROTO;
6482
6483 return l2cap_rx_state_recv(chan, control, NULL, event);
6484}
6485
6486static int l2cap_rx_state_wait_f(struct l2cap_chan *chan,
6487 struct l2cap_ctrl *control,
6488 struct sk_buff *skb, u8 event)
6489{
6490 int err;
6491
6492 if (!control->final)
6493 return -EPROTO;
6494
6495 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6496
6497 chan->rx_state = L2CAP_RX_STATE_RECV;
6498 l2cap_process_reqseq(chan, control->reqseq);
6499
6500 if (!skb_queue_empty(&chan->tx_q))
6501 chan->tx_send_head = skb_peek(&chan->tx_q);
6502 else
6503 chan->tx_send_head = NULL;
6504
6505 /* Rewind next_tx_seq to the point expected
6506 * by the receiver.
6507 */
6508 chan->next_tx_seq = control->reqseq;
6509 chan->unacked_frames = 0;
6510
6511 if (chan->hs_hcon)
6512 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6513 else
6514 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6515
6516 err = l2cap_resegment(chan);
6517
6518 if (!err)
6519 err = l2cap_rx_state_recv(chan, control, skb, event);
6520
6521 return err;
6522}
6523
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006524static bool __valid_reqseq(struct l2cap_chan *chan, u16 reqseq)
6525{
6526 /* Make sure reqseq is for a packet that has been sent but not acked */
6527 u16 unacked;
6528
6529 unacked = __seq_offset(chan, chan->next_tx_seq, chan->expected_ack_seq);
6530 return __seq_offset(chan, chan->next_tx_seq, reqseq) <= unacked;
6531}
6532
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006533static int l2cap_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6534 struct sk_buff *skb, u8 event)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006535{
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006536 int err = 0;
6537
6538 BT_DBG("chan %p, control %p, skb %p, event %d, state %d", chan,
6539 control, skb, event, chan->rx_state);
6540
6541 if (__valid_reqseq(chan, control->reqseq)) {
6542 switch (chan->rx_state) {
6543 case L2CAP_RX_STATE_RECV:
6544 err = l2cap_rx_state_recv(chan, control, skb, event);
6545 break;
6546 case L2CAP_RX_STATE_SREJ_SENT:
6547 err = l2cap_rx_state_srej_sent(chan, control, skb,
6548 event);
6549 break;
Mat Martineau32b32732012-10-23 15:24:11 -07006550 case L2CAP_RX_STATE_WAIT_P:
6551 err = l2cap_rx_state_wait_p(chan, control, skb, event);
6552 break;
6553 case L2CAP_RX_STATE_WAIT_F:
6554 err = l2cap_rx_state_wait_f(chan, control, skb, event);
6555 break;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006556 default:
6557 /* shut it down */
6558 break;
6559 }
6560 } else {
6561 BT_DBG("Invalid reqseq %d (next_tx_seq %d, expected_ack_seq %d",
6562 control->reqseq, chan->next_tx_seq,
6563 chan->expected_ack_seq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006564 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006565 }
6566
6567 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006568}
6569
6570static int l2cap_stream_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6571 struct sk_buff *skb)
6572{
Mat Martineau4b51dae92012-05-17 20:53:37 -07006573 BT_DBG("chan %p, control %p, skb %p, state %d", chan, control, skb,
6574 chan->rx_state);
6575
6576 if (l2cap_classify_txseq(chan, control->txseq) ==
6577 L2CAP_TXSEQ_EXPECTED) {
6578 l2cap_pass_to_tx(chan, control);
6579
6580 BT_DBG("buffer_seq %d->%d", chan->buffer_seq,
6581 __next_seq(chan, chan->buffer_seq));
6582
6583 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
6584
6585 l2cap_reassemble_sdu(chan, skb, control);
6586 } else {
6587 if (chan->sdu) {
6588 kfree_skb(chan->sdu);
6589 chan->sdu = NULL;
6590 }
6591 chan->sdu_last_frag = NULL;
6592 chan->sdu_len = 0;
6593
6594 if (skb) {
6595 BT_DBG("Freeing %p", skb);
6596 kfree_skb(skb);
6597 }
6598 }
6599
6600 chan->last_acked_seq = control->txseq;
6601 chan->expected_tx_seq = __next_seq(chan, control->txseq);
6602
Prasanna Karthik9a544212015-11-19 12:05:35 +00006603 return 0;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006604}
6605
6606static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6607{
Johan Hedberga4368ff2015-03-30 23:21:01 +03006608 struct l2cap_ctrl *control = &bt_cb(skb)->l2cap;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006609 u16 len;
6610 u8 event;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006611
Mat Martineaub76bbd62012-04-11 10:48:43 -07006612 __unpack_control(chan, skb);
6613
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006614 len = skb->len;
6615
6616 /*
6617 * We can just drop the corrupted I-frame here.
6618 * Receiver will miss it and start proper recovery
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006619 * procedures and ask for retransmission.
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006620 */
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006621 if (l2cap_check_fcs(chan, skb))
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006622 goto drop;
6623
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006624 if (!control->sframe && control->sar == L2CAP_SAR_START)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006625 len -= L2CAP_SDULEN_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006626
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006627 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006628 len -= L2CAP_FCS_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006629
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006630 if (len > chan->mps) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006631 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006632 goto drop;
6633 }
6634
Daniel Borkmanndbb50882016-07-27 11:40:14 -07006635 if ((chan->mode == L2CAP_MODE_ERTM ||
6636 chan->mode == L2CAP_MODE_STREAMING) && sk_filter(chan->data, skb))
6637 goto drop;
6638
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006639 if (!control->sframe) {
6640 int err;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006641
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006642 BT_DBG("iframe sar %d, reqseq %d, final %d, txseq %d",
6643 control->sar, control->reqseq, control->final,
6644 control->txseq);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03006645
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006646 /* Validate F-bit - F=0 always valid, F=1 only
6647 * valid in TX WAIT_F
6648 */
6649 if (control->final && chan->tx_state != L2CAP_TX_STATE_WAIT_F)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006650 goto drop;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006651
6652 if (chan->mode != L2CAP_MODE_STREAMING) {
6653 event = L2CAP_EV_RECV_IFRAME;
6654 err = l2cap_rx(chan, control, skb, event);
6655 } else {
6656 err = l2cap_stream_rx(chan, control, skb);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006657 }
6658
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006659 if (err)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006660 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006661 } else {
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006662 const u8 rx_func_to_event[4] = {
6663 L2CAP_EV_RECV_RR, L2CAP_EV_RECV_REJ,
6664 L2CAP_EV_RECV_RNR, L2CAP_EV_RECV_SREJ
6665 };
6666
6667 /* Only I-frames are expected in streaming mode */
6668 if (chan->mode == L2CAP_MODE_STREAMING)
6669 goto drop;
6670
6671 BT_DBG("sframe reqseq %d, final %d, poll %d, super %d",
6672 control->reqseq, control->final, control->poll,
6673 control->super);
6674
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006675 if (len != 0) {
Andrei Emeltchenko1bb166e2012-11-20 17:16:21 +02006676 BT_ERR("Trailing bytes: %d in sframe", len);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006677 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006678 goto drop;
6679 }
6680
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006681 /* Validate F and P bits */
6682 if (control->final && (control->poll ||
6683 chan->tx_state != L2CAP_TX_STATE_WAIT_F))
6684 goto drop;
6685
6686 event = rx_func_to_event[control->super];
6687 if (l2cap_rx(chan, control, skb, event))
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006688 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006689 }
6690
6691 return 0;
6692
6693drop:
6694 kfree_skb(skb);
6695 return 0;
6696}
6697
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006698static void l2cap_chan_le_send_credits(struct l2cap_chan *chan)
6699{
6700 struct l2cap_conn *conn = chan->conn;
6701 struct l2cap_le_credits pkt;
6702 u16 return_credits;
6703
Luiz Augusto von Dentz96cd8ea2018-09-04 13:39:21 +03006704 return_credits = ((chan->imtu / chan->mps) + 1) - chan->rx_credits;
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006705
Luiz Augusto von Dentz96cd8ea2018-09-04 13:39:21 +03006706 if (!return_credits)
6707 return;
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006708
6709 BT_DBG("chan %p returning %u credits to sender", chan, return_credits);
6710
6711 chan->rx_credits += return_credits;
6712
6713 pkt.cid = cpu_to_le16(chan->scid);
6714 pkt.credits = cpu_to_le16(return_credits);
6715
6716 chan->ident = l2cap_get_ident(conn);
6717
6718 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CREDITS, sizeof(pkt), &pkt);
6719}
6720
Luiz Augusto von Dentz96cd8ea2018-09-04 13:39:21 +03006721static int l2cap_le_recv(struct l2cap_chan *chan, struct sk_buff *skb)
6722{
6723 int err;
6724
6725 BT_DBG("SDU reassemble complete: chan %p skb->len %u", chan, skb->len);
6726
6727 /* Wait recv to confirm reception before updating the credits */
6728 err = chan->ops->recv(chan, skb);
6729
6730 /* Update credits whenever an SDU is received */
6731 l2cap_chan_le_send_credits(chan);
6732
6733 return err;
6734}
6735
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006736static int l2cap_le_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6737{
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006738 int err;
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006739
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006740 if (!chan->rx_credits) {
6741 BT_ERR("No credits to receive LE L2CAP data");
Johan Hedbergdfd97742014-01-27 15:11:34 -08006742 l2cap_send_disconn_req(chan, ECONNRESET);
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006743 return -ENOBUFS;
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006744 }
6745
6746 if (chan->imtu < skb->len) {
6747 BT_ERR("Too big LE L2CAP PDU");
6748 return -ENOBUFS;
6749 }
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006750
6751 chan->rx_credits--;
6752 BT_DBG("rx_credits %u -> %u", chan->rx_credits + 1, chan->rx_credits);
6753
Luiz Augusto von Dentz96cd8ea2018-09-04 13:39:21 +03006754 /* Update if remote had run out of credits, this should only happens
6755 * if the remote is not using the entire MPS.
6756 */
6757 if (!chan->rx_credits)
6758 l2cap_chan_le_send_credits(chan);
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006759
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006760 err = 0;
6761
6762 if (!chan->sdu) {
6763 u16 sdu_len;
6764
6765 sdu_len = get_unaligned_le16(skb->data);
6766 skb_pull(skb, L2CAP_SDULEN_SIZE);
6767
6768 BT_DBG("Start of new SDU. sdu_len %u skb->len %u imtu %u",
6769 sdu_len, skb->len, chan->imtu);
6770
6771 if (sdu_len > chan->imtu) {
6772 BT_ERR("Too big LE L2CAP SDU length received");
6773 err = -EMSGSIZE;
6774 goto failed;
6775 }
6776
6777 if (skb->len > sdu_len) {
6778 BT_ERR("Too much LE L2CAP data received");
6779 err = -EINVAL;
6780 goto failed;
6781 }
6782
6783 if (skb->len == sdu_len)
Luiz Augusto von Dentz96cd8ea2018-09-04 13:39:21 +03006784 return l2cap_le_recv(chan, skb);
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006785
6786 chan->sdu = skb;
6787 chan->sdu_len = sdu_len;
6788 chan->sdu_last_frag = skb;
6789
Luiz Augusto von Dentza5c30212018-09-04 13:39:22 +03006790 /* Detect if remote is not able to use the selected MPS */
6791 if (skb->len + L2CAP_SDULEN_SIZE < chan->mps) {
6792 u16 mps_len = skb->len + L2CAP_SDULEN_SIZE;
6793
6794 /* Adjust the number of credits */
6795 BT_DBG("chan->mps %u -> %u", chan->mps, mps_len);
6796 chan->mps = mps_len;
6797 l2cap_chan_le_send_credits(chan);
6798 }
6799
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006800 return 0;
6801 }
6802
6803 BT_DBG("SDU fragment. chan->sdu->len %u skb->len %u chan->sdu_len %u",
6804 chan->sdu->len, skb->len, chan->sdu_len);
6805
6806 if (chan->sdu->len + skb->len > chan->sdu_len) {
6807 BT_ERR("Too much LE L2CAP data received");
6808 err = -EINVAL;
6809 goto failed;
6810 }
6811
6812 append_skb_frag(chan->sdu, skb, &chan->sdu_last_frag);
6813 skb = NULL;
6814
6815 if (chan->sdu->len == chan->sdu_len) {
Luiz Augusto von Dentz96cd8ea2018-09-04 13:39:21 +03006816 err = l2cap_le_recv(chan, chan->sdu);
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006817 if (!err) {
6818 chan->sdu = NULL;
6819 chan->sdu_last_frag = NULL;
6820 chan->sdu_len = 0;
6821 }
6822 }
6823
6824failed:
6825 if (err) {
6826 kfree_skb(skb);
6827 kfree_skb(chan->sdu);
6828 chan->sdu = NULL;
6829 chan->sdu_last_frag = NULL;
6830 chan->sdu_len = 0;
6831 }
6832
6833 /* We can't return an error here since we took care of the skb
6834 * freeing internally. An error return would cause the caller to
6835 * do a double-free of the skb.
6836 */
6837 return 0;
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006838}
6839
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006840static void l2cap_data_channel(struct l2cap_conn *conn, u16 cid,
6841 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006842{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006843 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006844
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03006845 chan = l2cap_get_chan_by_scid(conn, cid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006846 if (!chan) {
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006847 if (cid == L2CAP_CID_A2MP) {
6848 chan = a2mp_channel_create(conn, skb);
6849 if (!chan) {
6850 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006851 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006852 }
6853
6854 l2cap_chan_lock(chan);
6855 } else {
6856 BT_DBG("unknown cid 0x%4.4x", cid);
6857 /* Drop packet and return */
6858 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006859 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006860 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006861 }
6862
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03006863 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006864
Johan Hedberg315917e2015-02-16 11:42:11 +02006865 /* If we receive data on a fixed channel before the info req/rsp
6866 * procdure is done simply assume that the channel is supported
6867 * and mark it as ready.
6868 */
6869 if (chan->chan_type == L2CAP_CHAN_FIXED)
6870 l2cap_chan_ready(chan);
6871
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03006872 if (chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006873 goto drop;
6874
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006875 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03006876 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedbergfad5fc82013-12-05 09:45:01 +02006877 if (l2cap_le_data_rcv(chan, skb) < 0)
6878 goto drop;
6879
6880 goto done;
6881
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006882 case L2CAP_MODE_BASIC:
6883 /* If socket recv buffers overflows we drop data here
6884 * which is *bad* because L2CAP has to be reliable.
6885 * But we don't have any other choice. L2CAP doesn't
6886 * provide flow control mechanism. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07006887
Szymon Janc2c96e032014-02-18 20:48:34 +01006888 if (chan->imtu < skb->len) {
6889 BT_ERR("Dropping L2CAP data: receive buffer overflow");
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006890 goto drop;
Szymon Janc2c96e032014-02-18 20:48:34 +01006891 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006892
Gustavo Padovan80b98022012-05-27 22:27:51 -03006893 if (!chan->ops->recv(chan, skb))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006894 goto done;
6895 break;
6896
6897 case L2CAP_MODE_ERTM:
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006898 case L2CAP_MODE_STREAMING:
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006899 l2cap_data_rcv(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006900 goto done;
6901
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006902 default:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006903 BT_DBG("chan %p: bad mode 0x%2.2x", chan, chan->mode);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006904 break;
6905 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006906
6907drop:
6908 kfree_skb(skb);
6909
6910done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006911 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006912}
6913
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006914static void l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm,
6915 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006916{
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006917 struct hci_conn *hcon = conn->hcon;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006918 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006919
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006920 if (hcon->type != ACL_LINK)
Johan Hedberga24cce12014-08-07 22:56:42 +03006921 goto free_skb;
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006922
Johan Hedbergbf20fd42013-05-14 13:23:13 +03006923 chan = l2cap_global_chan_by_psm(0, psm, &hcon->src, &hcon->dst,
6924 ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006925 if (!chan)
Johan Hedberga24cce12014-08-07 22:56:42 +03006926 goto free_skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006927
Andrei Emeltchenko5b4ceda2012-02-24 16:35:32 +02006928 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006929
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03006930 if (chan->state != BT_BOUND && chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006931 goto drop;
6932
Vinicius Costa Gomese13e21d2011-06-17 22:46:27 -03006933 if (chan->imtu < skb->len)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006934 goto drop;
6935
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006936 /* Store remote BD_ADDR and PSM for msg_name */
Johan Hedberga4368ff2015-03-30 23:21:01 +03006937 bacpy(&bt_cb(skb)->l2cap.bdaddr, &hcon->dst);
6938 bt_cb(skb)->l2cap.psm = psm;
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006939
Johan Hedberga24cce12014-08-07 22:56:42 +03006940 if (!chan->ops->recv(chan, skb)) {
6941 l2cap_chan_put(chan);
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006942 return;
Johan Hedberga24cce12014-08-07 22:56:42 +03006943 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006944
6945drop:
Johan Hedberga24cce12014-08-07 22:56:42 +03006946 l2cap_chan_put(chan);
6947free_skb:
Linus Torvalds1da177e2005-04-16 15:20:36 -07006948 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006949}
6950
6951static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb)
6952{
6953 struct l2cap_hdr *lh = (void *) skb->data;
Johan Hedberg61a939c2014-01-17 20:45:11 +02006954 struct hci_conn *hcon = conn->hcon;
Al Viro8e036fc2007-07-29 00:16:36 -07006955 u16 cid, len;
6956 __le16 psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006957
Johan Hedberg61a939c2014-01-17 20:45:11 +02006958 if (hcon->state != BT_CONNECTED) {
6959 BT_DBG("queueing pending rx skb");
6960 skb_queue_tail(&conn->pending_rx, skb);
6961 return;
6962 }
6963
Linus Torvalds1da177e2005-04-16 15:20:36 -07006964 skb_pull(skb, L2CAP_HDR_SIZE);
6965 cid = __le16_to_cpu(lh->cid);
6966 len = __le16_to_cpu(lh->len);
6967
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006968 if (len != skb->len) {
6969 kfree_skb(skb);
6970 return;
6971 }
6972
Johan Hedberg9e1d7e12014-07-06 11:03:36 +03006973 /* Since we can't actively block incoming LE connections we must
6974 * at least ensure that we ignore incoming data from them.
6975 */
6976 if (hcon->type == LE_LINK &&
Johan Hedbergdcc36c12014-07-09 12:59:13 +03006977 hci_bdaddr_list_lookup(&hcon->hdev->blacklist, &hcon->dst,
Johan Hedberga250e042015-01-15 13:06:44 +02006978 bdaddr_dst_type(hcon))) {
Johan Hedberge4931502014-07-02 09:36:21 +03006979 kfree_skb(skb);
6980 return;
6981 }
6982
Linus Torvalds1da177e2005-04-16 15:20:36 -07006983 BT_DBG("len %d, cid 0x%4.4x", len, cid);
6984
6985 switch (cid) {
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006986 case L2CAP_CID_SIGNALING:
Linus Torvalds1da177e2005-04-16 15:20:36 -07006987 l2cap_sig_channel(conn, skb);
6988 break;
6989
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006990 case L2CAP_CID_CONN_LESS:
Andrei Emeltchenko097db762012-03-09 14:16:17 +02006991 psm = get_unaligned((__le16 *) skb->data);
Andrei Emeltchenko0181a702012-05-29 10:04:05 +03006992 skb_pull(skb, L2CAP_PSMLEN_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006993 l2cap_conless_channel(conn, psm, skb);
6994 break;
6995
Marcel Holtmanna2877622013-10-02 23:46:54 -07006996 case L2CAP_CID_LE_SIGNALING:
6997 l2cap_le_sig_channel(conn, skb);
6998 break;
6999
Linus Torvalds1da177e2005-04-16 15:20:36 -07007000 default:
7001 l2cap_data_channel(conn, cid, skb);
7002 break;
7003 }
7004}
7005
Johan Hedberg61a939c2014-01-17 20:45:11 +02007006static void process_pending_rx(struct work_struct *work)
7007{
7008 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
7009 pending_rx_work);
7010 struct sk_buff *skb;
7011
7012 BT_DBG("");
7013
7014 while ((skb = skb_dequeue(&conn->pending_rx)))
7015 l2cap_recv_frame(conn, skb);
7016}
7017
Johan Hedberg162b49e2014-01-17 20:45:10 +02007018static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon)
7019{
7020 struct l2cap_conn *conn = hcon->l2cap_data;
7021 struct hci_chan *hchan;
7022
7023 if (conn)
7024 return conn;
7025
7026 hchan = hci_chan_create(hcon);
7027 if (!hchan)
7028 return NULL;
7029
Johan Hedberg27f70f32014-07-21 10:50:06 +03007030 conn = kzalloc(sizeof(*conn), GFP_KERNEL);
Johan Hedberg162b49e2014-01-17 20:45:10 +02007031 if (!conn) {
7032 hci_chan_del(hchan);
7033 return NULL;
7034 }
7035
7036 kref_init(&conn->ref);
7037 hcon->l2cap_data = conn;
Johan Hedberg51bb84572014-08-15 21:06:57 +03007038 conn->hcon = hci_conn_get(hcon);
Johan Hedberg162b49e2014-01-17 20:45:10 +02007039 conn->hchan = hchan;
7040
7041 BT_DBG("hcon %p conn %p hchan %p", hcon, conn, hchan);
7042
7043 switch (hcon->type) {
7044 case LE_LINK:
7045 if (hcon->hdev->le_mtu) {
7046 conn->mtu = hcon->hdev->le_mtu;
7047 break;
7048 }
7049 /* fall through */
7050 default:
7051 conn->mtu = hcon->hdev->acl_mtu;
7052 break;
7053 }
7054
7055 conn->feat_mask = 0;
7056
Johan Hedberg0bd49fc2014-12-02 10:09:26 +02007057 conn->local_fixed_chan = L2CAP_FC_SIG_BREDR | L2CAP_FC_CONNLESS;
7058
7059 if (hcon->type == ACL_LINK &&
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07007060 hci_dev_test_flag(hcon->hdev, HCI_HS_ENABLED))
Johan Hedberg0bd49fc2014-12-02 10:09:26 +02007061 conn->local_fixed_chan |= L2CAP_FC_A2MP;
Johan Hedberg162b49e2014-01-17 20:45:10 +02007062
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07007063 if (hci_dev_test_flag(hcon->hdev, HCI_LE_ENABLED) &&
Marcel Holtmannf9be9e82014-12-06 00:35:45 +01007064 (bredr_sc_enabled(hcon->hdev) ||
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07007065 hci_dev_test_flag(hcon->hdev, HCI_FORCE_BREDR_SMP)))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03007066 conn->local_fixed_chan |= L2CAP_FC_SMP_BREDR;
7067
Marcel Holtmann5a54e7c2014-07-13 20:50:15 +02007068 mutex_init(&conn->ident_lock);
Johan Hedberg162b49e2014-01-17 20:45:10 +02007069 mutex_init(&conn->chan_lock);
7070
7071 INIT_LIST_HEAD(&conn->chan_l);
7072 INIT_LIST_HEAD(&conn->users);
7073
Johan Hedberg276d8072014-08-11 22:06:41 +03007074 INIT_DELAYED_WORK(&conn->info_timer, l2cap_info_timeout);
Johan Hedberg162b49e2014-01-17 20:45:10 +02007075
Johan Hedberg61a939c2014-01-17 20:45:11 +02007076 skb_queue_head_init(&conn->pending_rx);
7077 INIT_WORK(&conn->pending_rx_work, process_pending_rx);
Johan Hedbergf3d82d02014-09-05 22:19:50 +03007078 INIT_WORK(&conn->id_addr_update_work, l2cap_conn_update_id_addr);
Johan Hedberg61a939c2014-01-17 20:45:11 +02007079
Johan Hedberg162b49e2014-01-17 20:45:10 +02007080 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
7081
7082 return conn;
7083}
7084
7085static bool is_valid_psm(u16 psm, u8 dst_type) {
7086 if (!psm)
7087 return false;
7088
7089 if (bdaddr_type_is_le(dst_type))
7090 return (psm <= 0x00ff);
7091
7092 /* PSM must be odd and lsb of upper byte must be 0 */
7093 return ((psm & 0x0101) == 0x0001);
7094}
7095
7096int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
7097 bdaddr_t *dst, u8 dst_type)
7098{
7099 struct l2cap_conn *conn;
7100 struct hci_conn *hcon;
7101 struct hci_dev *hdev;
Johan Hedberg162b49e2014-01-17 20:45:10 +02007102 int err;
7103
7104 BT_DBG("%pMR -> %pMR (type %u) psm 0x%2.2x", &chan->src, dst,
7105 dst_type, __le16_to_cpu(psm));
7106
Johan Hedberg39385cb2016-11-12 17:03:07 +02007107 hdev = hci_get_route(dst, &chan->src, chan->src_type);
Johan Hedberg162b49e2014-01-17 20:45:10 +02007108 if (!hdev)
7109 return -EHOSTUNREACH;
7110
7111 hci_dev_lock(hdev);
7112
Johan Hedberg162b49e2014-01-17 20:45:10 +02007113 if (!is_valid_psm(__le16_to_cpu(psm), dst_type) && !cid &&
7114 chan->chan_type != L2CAP_CHAN_RAW) {
7115 err = -EINVAL;
7116 goto done;
7117 }
7118
Johan Hedberg21626e62014-01-24 10:35:41 +02007119 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED && !psm) {
7120 err = -EINVAL;
7121 goto done;
7122 }
7123
7124 if (chan->chan_type == L2CAP_CHAN_FIXED && !cid) {
Johan Hedberg162b49e2014-01-17 20:45:10 +02007125 err = -EINVAL;
7126 goto done;
7127 }
7128
7129 switch (chan->mode) {
7130 case L2CAP_MODE_BASIC:
7131 break;
7132 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedberg162b49e2014-01-17 20:45:10 +02007133 break;
7134 case L2CAP_MODE_ERTM:
7135 case L2CAP_MODE_STREAMING:
7136 if (!disable_ertm)
7137 break;
7138 /* fall through */
7139 default:
Johan Hedbergbeb19e42014-07-18 11:15:26 +03007140 err = -EOPNOTSUPP;
Johan Hedberg162b49e2014-01-17 20:45:10 +02007141 goto done;
7142 }
7143
7144 switch (chan->state) {
7145 case BT_CONNECT:
7146 case BT_CONNECT2:
7147 case BT_CONFIG:
7148 /* Already connecting */
7149 err = 0;
7150 goto done;
7151
7152 case BT_CONNECTED:
7153 /* Already connected */
7154 err = -EISCONN;
7155 goto done;
7156
7157 case BT_OPEN:
7158 case BT_BOUND:
7159 /* Can connect */
7160 break;
7161
7162 default:
7163 err = -EBADFD;
7164 goto done;
7165 }
7166
7167 /* Set destination address and psm */
7168 bacpy(&chan->dst, dst);
7169 chan->dst_type = dst_type;
7170
7171 chan->psm = psm;
7172 chan->dcid = cid;
7173
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007174 if (bdaddr_type_is_le(dst_type)) {
7175 /* Convert from L2CAP channel address type to HCI address type
7176 */
7177 if (dst_type == BDADDR_LE_PUBLIC)
7178 dst_type = ADDR_LE_DEV_PUBLIC;
7179 else
7180 dst_type = ADDR_LE_DEV_RANDOM;
7181
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07007182 if (hci_dev_test_flag(hdev, HCI_ADVERTISING))
Johan Hedberg0ad06aa2015-11-11 14:44:57 +02007183 hcon = hci_connect_le(hdev, dst, dst_type,
7184 chan->sec_level,
7185 HCI_LE_CONN_TIMEOUT,
Szymon Janc082f2302018-04-03 13:40:06 +02007186 HCI_ROLE_SLAVE, NULL);
Johan Hedberge804d252014-07-16 11:42:28 +03007187 else
Johan Hedberg0ad06aa2015-11-11 14:44:57 +02007188 hcon = hci_connect_le_scan(hdev, dst, dst_type,
7189 chan->sec_level,
7190 HCI_LE_CONN_TIMEOUT);
Johan Hedbergcdd62752014-07-07 15:02:28 +03007191
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007192 } else {
Johan Hedbergd93375a2014-07-07 15:02:27 +03007193 u8 auth_type = l2cap_get_auth_type(chan);
Andre Guedes04a6c582014-02-26 20:21:44 -03007194 hcon = hci_connect_acl(hdev, dst, chan->sec_level, auth_type);
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007195 }
Johan Hedberg162b49e2014-01-17 20:45:10 +02007196
7197 if (IS_ERR(hcon)) {
7198 err = PTR_ERR(hcon);
7199 goto done;
7200 }
7201
7202 conn = l2cap_conn_add(hcon);
7203 if (!conn) {
7204 hci_conn_drop(hcon);
7205 err = -ENOMEM;
7206 goto done;
7207 }
7208
Johan Hedberg02e246ae2014-10-02 10:16:22 +03007209 mutex_lock(&conn->chan_lock);
7210 l2cap_chan_lock(chan);
7211
Johan Hedberg162b49e2014-01-17 20:45:10 +02007212 if (cid && __l2cap_get_chan_by_dcid(conn, cid)) {
7213 hci_conn_drop(hcon);
7214 err = -EBUSY;
Johan Hedberg02e246ae2014-10-02 10:16:22 +03007215 goto chan_unlock;
Johan Hedberg162b49e2014-01-17 20:45:10 +02007216 }
7217
7218 /* Update source addr of the socket */
7219 bacpy(&chan->src, &hcon->src);
Johan Hedberga250e042015-01-15 13:06:44 +02007220 chan->src_type = bdaddr_src_type(hcon);
Johan Hedberg162b49e2014-01-17 20:45:10 +02007221
Johan Hedberg02e246ae2014-10-02 10:16:22 +03007222 __l2cap_chan_add(conn, chan);
Johan Hedberg162b49e2014-01-17 20:45:10 +02007223
7224 /* l2cap_chan_add takes its own ref so we can drop this one */
7225 hci_conn_drop(hcon);
7226
7227 l2cap_state_change(chan, BT_CONNECT);
7228 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
7229
Johan Hedberg61202e42014-01-28 15:16:48 -08007230 /* Release chan->sport so that it can be reused by other
7231 * sockets (as it's only used for listening sockets).
7232 */
7233 write_lock(&chan_list_lock);
7234 chan->sport = 0;
7235 write_unlock(&chan_list_lock);
7236
Johan Hedberg162b49e2014-01-17 20:45:10 +02007237 if (hcon->state == BT_CONNECTED) {
7238 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
7239 __clear_chan_timer(chan);
Johan Hedberge7cafc42014-07-17 15:35:38 +03007240 if (l2cap_chan_check_security(chan, true))
Johan Hedberg162b49e2014-01-17 20:45:10 +02007241 l2cap_state_change(chan, BT_CONNECTED);
7242 } else
7243 l2cap_do_start(chan);
7244 }
7245
7246 err = 0;
7247
Johan Hedberg02e246ae2014-10-02 10:16:22 +03007248chan_unlock:
Johan Hedberg162b49e2014-01-17 20:45:10 +02007249 l2cap_chan_unlock(chan);
Johan Hedberg02e246ae2014-10-02 10:16:22 +03007250 mutex_unlock(&conn->chan_lock);
7251done:
Johan Hedberg162b49e2014-01-17 20:45:10 +02007252 hci_dev_unlock(hdev);
7253 hci_dev_put(hdev);
7254 return err;
7255}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +03007256EXPORT_SYMBOL_GPL(l2cap_chan_connect);
Johan Hedberg162b49e2014-01-17 20:45:10 +02007257
Linus Torvalds1da177e2005-04-16 15:20:36 -07007258/* ---- L2CAP interface with lower layer (HCI) ---- */
7259
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007260int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007261{
7262 int exact = 0, lm1 = 0, lm2 = 0;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007263 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007264
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03007265 BT_DBG("hdev %s, bdaddr %pMR", hdev->name, bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007266
7267 /* Find listening sockets and check their link_mode */
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007268 read_lock(&chan_list_lock);
7269 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007270 if (c->state != BT_LISTEN)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007271 continue;
7272
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007273 if (!bacmp(&c->src, &hdev->bdaddr)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007274 lm1 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03007275 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007276 lm1 |= HCI_LM_MASTER;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007277 exact++;
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007278 } else if (!bacmp(&c->src, BDADDR_ANY)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007279 lm2 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03007280 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007281 lm2 |= HCI_LM_MASTER;
7282 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007283 }
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007284 read_unlock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007285
7286 return exact ? lm1 : lm2;
7287}
7288
Johan Hedberge760ec12014-08-07 22:56:47 +03007289/* Find the next fixed channel in BT_LISTEN state, continue iteration
7290 * from an existing channel in the list or from the beginning of the
7291 * global list (by passing NULL as first parameter).
7292 */
7293static struct l2cap_chan *l2cap_global_fixed_chan(struct l2cap_chan *c,
Johan Hedberg327a7192015-01-15 13:06:45 +02007294 struct hci_conn *hcon)
Johan Hedberge760ec12014-08-07 22:56:47 +03007295{
Johan Hedberg327a7192015-01-15 13:06:45 +02007296 u8 src_type = bdaddr_src_type(hcon);
7297
Johan Hedberge760ec12014-08-07 22:56:47 +03007298 read_lock(&chan_list_lock);
7299
7300 if (c)
7301 c = list_next_entry(c, global_l);
7302 else
7303 c = list_entry(chan_list.next, typeof(*c), global_l);
7304
7305 list_for_each_entry_from(c, &chan_list, global_l) {
7306 if (c->chan_type != L2CAP_CHAN_FIXED)
7307 continue;
7308 if (c->state != BT_LISTEN)
7309 continue;
Johan Hedberg327a7192015-01-15 13:06:45 +02007310 if (bacmp(&c->src, &hcon->src) && bacmp(&c->src, BDADDR_ANY))
Johan Hedberge760ec12014-08-07 22:56:47 +03007311 continue;
Johan Hedberg327a7192015-01-15 13:06:45 +02007312 if (src_type != c->src_type)
Johan Hedberg54a1b622014-08-07 22:56:48 +03007313 continue;
Johan Hedberge760ec12014-08-07 22:56:47 +03007314
7315 l2cap_chan_hold(c);
7316 read_unlock(&chan_list_lock);
7317 return c;
7318 }
7319
7320 read_unlock(&chan_list_lock);
7321
7322 return NULL;
7323}
7324
Johan Hedberg539c4962015-02-18 14:53:57 +02007325static void l2cap_connect_cfm(struct hci_conn *hcon, u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007326{
Johan Hedberge760ec12014-08-07 22:56:47 +03007327 struct hci_dev *hdev = hcon->hdev;
Marcel Holtmann01394182006-07-03 10:02:46 +02007328 struct l2cap_conn *conn;
Johan Hedberge760ec12014-08-07 22:56:47 +03007329 struct l2cap_chan *pchan;
7330 u8 dst_type;
Marcel Holtmann01394182006-07-03 10:02:46 +02007331
Johan Hedberg539c4962015-02-18 14:53:57 +02007332 if (hcon->type != ACL_LINK && hcon->type != LE_LINK)
7333 return;
7334
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03007335 BT_DBG("hcon %p bdaddr %pMR status %d", hcon, &hcon->dst, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007336
Johan Hedbergdc0f5082014-08-07 22:56:46 +03007337 if (status) {
Joe Perchese1750722011-06-29 18:18:29 -07007338 l2cap_conn_del(hcon, bt_to_errno(status));
Johan Hedbergdc0f5082014-08-07 22:56:46 +03007339 return;
Andrei Emeltchenkoba6fc312012-10-31 15:46:26 +02007340 }
Johan Hedbergdc0f5082014-08-07 22:56:46 +03007341
7342 conn = l2cap_conn_add(hcon);
7343 if (!conn)
7344 return;
7345
Johan Hedberga250e042015-01-15 13:06:44 +02007346 dst_type = bdaddr_dst_type(hcon);
Johan Hedberge760ec12014-08-07 22:56:47 +03007347
7348 /* If device is blocked, do not create channels for it */
7349 if (hci_bdaddr_list_lookup(&hdev->blacklist, &hcon->dst, dst_type))
7350 return;
7351
7352 /* Find fixed channels and notify them of the new connection. We
7353 * use multiple individual lookups, continuing each time where
7354 * we left off, because the list lock would prevent calling the
7355 * potentially sleeping l2cap_chan_lock() function.
7356 */
Johan Hedberg327a7192015-01-15 13:06:45 +02007357 pchan = l2cap_global_fixed_chan(NULL, hcon);
Johan Hedberge760ec12014-08-07 22:56:47 +03007358 while (pchan) {
7359 struct l2cap_chan *chan, *next;
7360
7361 /* Client fixed channels should override server ones */
7362 if (__l2cap_get_chan_by_dcid(conn, pchan->scid))
7363 goto next;
7364
7365 l2cap_chan_lock(pchan);
7366 chan = pchan->ops->new_connection(pchan);
7367 if (chan) {
7368 bacpy(&chan->src, &hcon->src);
7369 bacpy(&chan->dst, &hcon->dst);
Johan Hedberga250e042015-01-15 13:06:44 +02007370 chan->src_type = bdaddr_src_type(hcon);
Johan Hedberge760ec12014-08-07 22:56:47 +03007371 chan->dst_type = dst_type;
7372
7373 __l2cap_chan_add(conn, chan);
7374 }
7375
7376 l2cap_chan_unlock(pchan);
7377next:
Johan Hedberg327a7192015-01-15 13:06:45 +02007378 next = l2cap_global_fixed_chan(pchan, hcon);
Johan Hedberge760ec12014-08-07 22:56:47 +03007379 l2cap_chan_put(pchan);
7380 pchan = next;
7381 }
7382
Johan Hedbergdc0f5082014-08-07 22:56:46 +03007383 l2cap_conn_ready(conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007384}
7385
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007386int l2cap_disconn_ind(struct hci_conn *hcon)
Marcel Holtmann2950f212009-02-12 14:02:50 +01007387{
7388 struct l2cap_conn *conn = hcon->l2cap_data;
7389
7390 BT_DBG("hcon %p", hcon);
7391
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007392 if (!conn)
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02007393 return HCI_ERROR_REMOTE_USER_TERM;
Marcel Holtmann2950f212009-02-12 14:02:50 +01007394 return conn->disc_reason;
7395}
7396
Johan Hedberg3a6d5762015-02-18 14:53:58 +02007397static void l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007398{
Johan Hedberg3a6d5762015-02-18 14:53:58 +02007399 if (hcon->type != ACL_LINK && hcon->type != LE_LINK)
7400 return;
7401
Linus Torvalds1da177e2005-04-16 15:20:36 -07007402 BT_DBG("hcon %p reason %d", hcon, reason);
7403
Joe Perchese1750722011-06-29 18:18:29 -07007404 l2cap_conn_del(hcon, bt_to_errno(reason));
Linus Torvalds1da177e2005-04-16 15:20:36 -07007405}
7406
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007407static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt)
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007408{
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03007409 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED)
Marcel Holtmann255c7602009-02-04 21:07:19 +01007410 return;
7411
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007412 if (encrypt == 0x00) {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007413 if (chan->sec_level == BT_SECURITY_MEDIUM) {
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007414 __set_chan_timer(chan, L2CAP_ENC_TIMEOUT);
Marcel Holtmann7d513e92014-01-15 22:37:40 -08007415 } else if (chan->sec_level == BT_SECURITY_HIGH ||
7416 chan->sec_level == BT_SECURITY_FIPS)
Gustavo F. Padovan0f852722011-05-04 19:42:50 -03007417 l2cap_chan_close(chan, ECONNREFUSED);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007418 } else {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007419 if (chan->sec_level == BT_SECURITY_MEDIUM)
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -03007420 __clear_chan_timer(chan);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007421 }
7422}
7423
Johan Hedberg354fe802015-02-18 14:53:56 +02007424static void l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007425{
Marcel Holtmann40be4922008-07-14 20:13:50 +02007426 struct l2cap_conn *conn = hcon->l2cap_data;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03007427 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007428
Marcel Holtmann01394182006-07-03 10:02:46 +02007429 if (!conn)
Johan Hedberg354fe802015-02-18 14:53:56 +02007430 return;
Marcel Holtmann01394182006-07-03 10:02:46 +02007431
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03007432 BT_DBG("conn %p status 0x%2.2x encrypt %u", conn, status, encrypt);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007433
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007434 mutex_lock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007435
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007436 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007437 l2cap_chan_lock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007438
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03007439 BT_DBG("chan %p scid 0x%4.4x state %s", chan, chan->scid,
7440 state_to_string(chan->state));
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007441
Johan Hedberg2338a7e2014-01-24 10:35:40 +02007442 if (chan->scid == L2CAP_CID_A2MP) {
Andrei Emeltchenko78eb2f92012-07-19 17:03:47 +03007443 l2cap_chan_unlock(chan);
7444 continue;
7445 }
7446
Johan Hedberg191eb392014-08-07 22:56:45 +03007447 if (!status && encrypt)
7448 chan->sec_level = hcon->sec_level;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007449
Andrei Emeltchenko96eff462012-11-15 18:14:53 +02007450 if (!__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007451 l2cap_chan_unlock(chan);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01007452 continue;
7453 }
7454
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007455 if (!status && (chan->state == BT_CONNECTED ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01007456 chan->state == BT_CONFIG)) {
Marcel Holtmannd97c8992013-10-14 02:53:54 -07007457 chan->ops->resume(chan);
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007458 l2cap_check_encryption(chan, encrypt);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007459 l2cap_chan_unlock(chan);
Marcel Holtmann9719f8a2008-07-14 20:13:45 +02007460 continue;
7461 }
7462
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03007463 if (chan->state == BT_CONNECT) {
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007464 if (!status)
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03007465 l2cap_start_connection(chan);
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007466 else
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007467 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Johan Hedbergfa37c1a2014-11-13 10:55:17 +02007468 } else if (chan->state == BT_CONNECT2 &&
7469 chan->mode != L2CAP_MODE_LE_FLOWCTL) {
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007470 struct l2cap_conn_rsp rsp;
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007471 __u16 res, stat;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007472
7473 if (!status) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07007474 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007475 res = L2CAP_CR_PEND;
7476 stat = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08007477 chan->ops->defer(chan);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007478 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007479 l2cap_state_change(chan, BT_CONFIG);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007480 res = L2CAP_CR_SUCCESS;
7481 stat = L2CAP_CS_NO_INFO;
7482 }
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007483 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007484 l2cap_state_change(chan, BT_DISCONN);
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007485 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007486 res = L2CAP_CR_SEC_BLOCK;
7487 stat = L2CAP_CS_NO_INFO;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007488 }
7489
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03007490 rsp.scid = cpu_to_le16(chan->dcid);
7491 rsp.dcid = cpu_to_le16(chan->scid);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007492 rsp.result = cpu_to_le16(res);
7493 rsp.status = cpu_to_le16(stat);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03007494 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01007495 sizeof(rsp), &rsp);
Mat Martineau2d369352012-05-23 14:59:30 -07007496
7497 if (!test_bit(CONF_REQ_SENT, &chan->conf_state) &&
7498 res == L2CAP_CR_SUCCESS) {
7499 char buf[128];
7500 set_bit(CONF_REQ_SENT, &chan->conf_state);
7501 l2cap_send_cmd(conn, l2cap_get_ident(conn),
7502 L2CAP_CONF_REQ,
Ben Serie860d2c2017-09-09 23:15:59 +02007503 l2cap_build_conf_req(chan, buf, sizeof(buf)),
Mat Martineau2d369352012-05-23 14:59:30 -07007504 buf);
7505 chan->num_conf_req++;
7506 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007507 }
7508
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007509 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007510 }
7511
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007512 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007513}
7514
Arron Wang9b4c3332015-06-09 17:47:22 +08007515void l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007516{
7517 struct l2cap_conn *conn = hcon->l2cap_data;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007518 struct l2cap_hdr *hdr;
7519 int len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007520
Andrei Emeltchenko1d13a252012-10-15 11:58:41 +03007521 /* For AMP controller do not create l2cap conn */
Marcel Holtmannca8bee52016-07-05 14:30:14 +02007522 if (!conn && hcon->hdev->dev_type != HCI_PRIMARY)
Andrei Emeltchenko1d13a252012-10-15 11:58:41 +03007523 goto drop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007524
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007525 if (!conn)
Claudio Takahasibaf43252013-04-11 13:55:50 -03007526 conn = l2cap_conn_add(hcon);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007527
7528 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007529 goto drop;
7530
7531 BT_DBG("conn %p len %d flags 0x%x", conn, skb->len, flags);
7532
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007533 switch (flags) {
7534 case ACL_START:
7535 case ACL_START_NO_FLUSH:
7536 case ACL_COMPLETE:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007537 if (conn->rx_len) {
7538 BT_ERR("Unexpected start frame (len %d)", skb->len);
7539 kfree_skb(conn->rx_skb);
7540 conn->rx_skb = NULL;
7541 conn->rx_len = 0;
7542 l2cap_conn_unreliable(conn, ECOMM);
7543 }
7544
Andrei Emeltchenkoaae7fe22010-09-15 14:28:43 +03007545 /* Start fragment always begin with Basic L2CAP header */
7546 if (skb->len < L2CAP_HDR_SIZE) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07007547 BT_ERR("Frame is too short (len %d)", skb->len);
7548 l2cap_conn_unreliable(conn, ECOMM);
7549 goto drop;
7550 }
7551
7552 hdr = (struct l2cap_hdr *) skb->data;
7553 len = __le16_to_cpu(hdr->len) + L2CAP_HDR_SIZE;
7554
7555 if (len == skb->len) {
7556 /* Complete frame received */
7557 l2cap_recv_frame(conn, skb);
Arron Wang9b4c3332015-06-09 17:47:22 +08007558 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007559 }
7560
7561 BT_DBG("Start: total len %d, frag len %d", len, skb->len);
7562
7563 if (skb->len > len) {
7564 BT_ERR("Frame is too long (len %d, expected len %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007565 skb->len, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007566 l2cap_conn_unreliable(conn, ECOMM);
7567 goto drop;
7568 }
7569
7570 /* Allocate skb for the complete frame (with header) */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03007571 conn->rx_skb = bt_skb_alloc(len, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03007572 if (!conn->rx_skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007573 goto drop;
7574
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007575 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007576 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007577 conn->rx_len = len - skb->len;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007578 break;
7579
7580 case ACL_CONT:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007581 BT_DBG("Cont: frag len %d (expecting %d)", skb->len, conn->rx_len);
7582
7583 if (!conn->rx_len) {
7584 BT_ERR("Unexpected continuation frame (len %d)", skb->len);
7585 l2cap_conn_unreliable(conn, ECOMM);
7586 goto drop;
7587 }
7588
7589 if (skb->len > conn->rx_len) {
7590 BT_ERR("Fragment is too long (len %d, expected %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007591 skb->len, conn->rx_len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007592 kfree_skb(conn->rx_skb);
7593 conn->rx_skb = NULL;
7594 conn->rx_len = 0;
7595 l2cap_conn_unreliable(conn, ECOMM);
7596 goto drop;
7597 }
7598
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007599 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007600 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007601 conn->rx_len -= skb->len;
7602
7603 if (!conn->rx_len) {
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007604 /* Complete frame received. l2cap_recv_frame
7605 * takes ownership of the skb so set the global
7606 * rx_skb pointer to NULL first.
7607 */
7608 struct sk_buff *rx_skb = conn->rx_skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007609 conn->rx_skb = NULL;
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007610 l2cap_recv_frame(conn, rx_skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007611 }
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007612 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007613 }
7614
7615drop:
7616 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007617}
7618
Johan Hedberg354fe802015-02-18 14:53:56 +02007619static struct hci_cb l2cap_cb = {
7620 .name = "L2CAP",
Johan Hedberg539c4962015-02-18 14:53:57 +02007621 .connect_cfm = l2cap_connect_cfm,
Johan Hedberg3a6d5762015-02-18 14:53:58 +02007622 .disconn_cfm = l2cap_disconn_cfm,
Johan Hedberg354fe802015-02-18 14:53:56 +02007623 .security_cfm = l2cap_security_cfm,
7624};
7625
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007626static int l2cap_debugfs_show(struct seq_file *f, void *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007627{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007628 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007629
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007630 read_lock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007631
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007632 list_for_each_entry(c, &chan_list, global_l) {
Marcel Holtmanneeb5a062015-01-14 13:44:21 -08007633 seq_printf(f, "%pMR (%u) %pMR (%u) %d %d 0x%4.4x 0x%4.4x %d %d %d %d\n",
7634 &c->src, c->src_type, &c->dst, c->dst_type,
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03007635 c->state, __le16_to_cpu(c->psm),
7636 c->scid, c->dcid, c->imtu, c->omtu,
7637 c->sec_level, c->mode);
Andrei Emeltchenko61e1b4b2012-01-19 11:19:50 +02007638 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007639
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007640 read_unlock(&chan_list_lock);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007641
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007642 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007643}
7644
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007645static int l2cap_debugfs_open(struct inode *inode, struct file *file)
7646{
7647 return single_open(file, l2cap_debugfs_show, inode->i_private);
7648}
7649
7650static const struct file_operations l2cap_debugfs_fops = {
7651 .open = l2cap_debugfs_open,
7652 .read = seq_read,
7653 .llseek = seq_lseek,
7654 .release = single_release,
7655};
7656
7657static struct dentry *l2cap_debugfs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007658
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007659int __init l2cap_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007660{
7661 int err;
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007662
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007663 err = l2cap_init_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007664 if (err < 0)
7665 return err;
7666
Johan Hedberg354fe802015-02-18 14:53:56 +02007667 hci_register_cb(&l2cap_cb);
7668
Marcel Holtmann1120e4b2013-10-17 17:24:16 -07007669 if (IS_ERR_OR_NULL(bt_debugfs))
7670 return 0;
7671
7672 l2cap_debugfs = debugfs_create_file("l2cap", 0444, bt_debugfs,
7673 NULL, &l2cap_debugfs_fops);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007674
Linus Torvalds1da177e2005-04-16 15:20:36 -07007675 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007676}
7677
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007678void l2cap_exit(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007679{
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007680 debugfs_remove(l2cap_debugfs);
Johan Hedberg354fe802015-02-18 14:53:56 +02007681 hci_unregister_cb(&l2cap_cb);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007682 l2cap_cleanup_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007683}
7684
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03007685module_param(disable_ertm, bool, 0644);
7686MODULE_PARM_DESC(disable_ertm, "Disable enhanced retransmission mode");