xref: /OK3568_Linux_fs/kernel/net/bluetooth/l2cap_core.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun    BlueZ - Bluetooth protocol stack for Linux
3*4882a593Smuzhiyun    Copyright (C) 2000-2001 Qualcomm Incorporated
4*4882a593Smuzhiyun    Copyright (C) 2009-2010 Gustavo F. Padovan <gustavo@padovan.org>
5*4882a593Smuzhiyun    Copyright (C) 2010 Google Inc.
6*4882a593Smuzhiyun    Copyright (C) 2011 ProFUSION Embedded Systems
7*4882a593Smuzhiyun    Copyright (c) 2012 Code Aurora Forum.  All rights reserved.
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun    Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun    This program is free software; you can redistribute it and/or modify
12*4882a593Smuzhiyun    it under the terms of the GNU General Public License version 2 as
13*4882a593Smuzhiyun    published by the Free Software Foundation;
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16*4882a593Smuzhiyun    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*4882a593Smuzhiyun    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
18*4882a593Smuzhiyun    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
19*4882a593Smuzhiyun    CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
20*4882a593Smuzhiyun    WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
21*4882a593Smuzhiyun    ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
22*4882a593Smuzhiyun    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun    ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
25*4882a593Smuzhiyun    COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
26*4882a593Smuzhiyun    SOFTWARE IS DISCLAIMED.
27*4882a593Smuzhiyun */
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun /* Bluetooth L2CAP core. */
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun #include <linux/module.h>
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun #include <linux/debugfs.h>
34*4882a593Smuzhiyun #include <linux/crc16.h>
35*4882a593Smuzhiyun #include <linux/filter.h>
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun #include <net/bluetooth/bluetooth.h>
38*4882a593Smuzhiyun #include <net/bluetooth/hci_core.h>
39*4882a593Smuzhiyun #include <net/bluetooth/l2cap.h>
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun #include "smp.h"
42*4882a593Smuzhiyun #include "a2mp.h"
43*4882a593Smuzhiyun #include "amp.h"
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun #define LE_FLOWCTL_MAX_CREDITS 65535
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun bool disable_ertm;
48*4882a593Smuzhiyun bool enable_ecred;
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun static u32 l2cap_feat_mask = L2CAP_FEAT_FIXED_CHAN | L2CAP_FEAT_UCD;
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun static LIST_HEAD(chan_list);
53*4882a593Smuzhiyun static DEFINE_RWLOCK(chan_list_lock);
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn,
56*4882a593Smuzhiyun 				       u8 code, u8 ident, u16 dlen, void *data);
57*4882a593Smuzhiyun static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len,
58*4882a593Smuzhiyun 			   void *data);
59*4882a593Smuzhiyun static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data, size_t data_size);
60*4882a593Smuzhiyun static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err);
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
63*4882a593Smuzhiyun 		     struct sk_buff_head *skbs, u8 event);
64*4882a593Smuzhiyun static void l2cap_retrans_timeout(struct work_struct *work);
65*4882a593Smuzhiyun static void l2cap_monitor_timeout(struct work_struct *work);
66*4882a593Smuzhiyun static void l2cap_ack_timeout(struct work_struct *work);
67*4882a593Smuzhiyun 
bdaddr_type(u8 link_type,u8 bdaddr_type)68*4882a593Smuzhiyun static inline u8 bdaddr_type(u8 link_type, u8 bdaddr_type)
69*4882a593Smuzhiyun {
70*4882a593Smuzhiyun 	if (link_type == LE_LINK) {
71*4882a593Smuzhiyun 		if (bdaddr_type == ADDR_LE_DEV_PUBLIC)
72*4882a593Smuzhiyun 			return BDADDR_LE_PUBLIC;
73*4882a593Smuzhiyun 		else
74*4882a593Smuzhiyun 			return BDADDR_LE_RANDOM;
75*4882a593Smuzhiyun 	}
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun 	return BDADDR_BREDR;
78*4882a593Smuzhiyun }
79*4882a593Smuzhiyun 
bdaddr_src_type(struct hci_conn * hcon)80*4882a593Smuzhiyun static inline u8 bdaddr_src_type(struct hci_conn *hcon)
81*4882a593Smuzhiyun {
82*4882a593Smuzhiyun 	return bdaddr_type(hcon->type, hcon->src_type);
83*4882a593Smuzhiyun }
84*4882a593Smuzhiyun 
bdaddr_dst_type(struct hci_conn * hcon)85*4882a593Smuzhiyun static inline u8 bdaddr_dst_type(struct hci_conn *hcon)
86*4882a593Smuzhiyun {
87*4882a593Smuzhiyun 	return bdaddr_type(hcon->type, hcon->dst_type);
88*4882a593Smuzhiyun }
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun /* ---- L2CAP channels ---- */
91*4882a593Smuzhiyun 
__l2cap_get_chan_by_dcid(struct l2cap_conn * conn,u16 cid)92*4882a593Smuzhiyun static struct l2cap_chan *__l2cap_get_chan_by_dcid(struct l2cap_conn *conn,
93*4882a593Smuzhiyun 						   u16 cid)
94*4882a593Smuzhiyun {
95*4882a593Smuzhiyun 	struct l2cap_chan *c;
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun 	list_for_each_entry(c, &conn->chan_l, list) {
98*4882a593Smuzhiyun 		if (c->dcid == cid)
99*4882a593Smuzhiyun 			return c;
100*4882a593Smuzhiyun 	}
101*4882a593Smuzhiyun 	return NULL;
102*4882a593Smuzhiyun }
103*4882a593Smuzhiyun 
__l2cap_get_chan_by_scid(struct l2cap_conn * conn,u16 cid)104*4882a593Smuzhiyun static struct l2cap_chan *__l2cap_get_chan_by_scid(struct l2cap_conn *conn,
105*4882a593Smuzhiyun 						   u16 cid)
106*4882a593Smuzhiyun {
107*4882a593Smuzhiyun 	struct l2cap_chan *c;
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun 	list_for_each_entry(c, &conn->chan_l, list) {
110*4882a593Smuzhiyun 		if (c->scid == cid)
111*4882a593Smuzhiyun 			return c;
112*4882a593Smuzhiyun 	}
113*4882a593Smuzhiyun 	return NULL;
114*4882a593Smuzhiyun }
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun /* Find channel with given SCID.
117*4882a593Smuzhiyun  * Returns a reference locked channel.
118*4882a593Smuzhiyun  */
l2cap_get_chan_by_scid(struct l2cap_conn * conn,u16 cid)119*4882a593Smuzhiyun static struct l2cap_chan *l2cap_get_chan_by_scid(struct l2cap_conn *conn,
120*4882a593Smuzhiyun 						 u16 cid)
121*4882a593Smuzhiyun {
122*4882a593Smuzhiyun 	struct l2cap_chan *c;
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun 	mutex_lock(&conn->chan_lock);
125*4882a593Smuzhiyun 	c = __l2cap_get_chan_by_scid(conn, cid);
126*4882a593Smuzhiyun 	if (c) {
127*4882a593Smuzhiyun 		/* Only lock if chan reference is not 0 */
128*4882a593Smuzhiyun 		c = l2cap_chan_hold_unless_zero(c);
129*4882a593Smuzhiyun 		if (c)
130*4882a593Smuzhiyun 			l2cap_chan_lock(c);
131*4882a593Smuzhiyun 	}
132*4882a593Smuzhiyun 	mutex_unlock(&conn->chan_lock);
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun 	return c;
135*4882a593Smuzhiyun }
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun /* Find channel with given DCID.
138*4882a593Smuzhiyun  * Returns a reference locked channel.
139*4882a593Smuzhiyun  */
l2cap_get_chan_by_dcid(struct l2cap_conn * conn,u16 cid)140*4882a593Smuzhiyun static struct l2cap_chan *l2cap_get_chan_by_dcid(struct l2cap_conn *conn,
141*4882a593Smuzhiyun 						 u16 cid)
142*4882a593Smuzhiyun {
143*4882a593Smuzhiyun 	struct l2cap_chan *c;
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun 	mutex_lock(&conn->chan_lock);
146*4882a593Smuzhiyun 	c = __l2cap_get_chan_by_dcid(conn, cid);
147*4882a593Smuzhiyun 	if (c) {
148*4882a593Smuzhiyun 		/* Only lock if chan reference is not 0 */
149*4882a593Smuzhiyun 		c = l2cap_chan_hold_unless_zero(c);
150*4882a593Smuzhiyun 		if (c)
151*4882a593Smuzhiyun 			l2cap_chan_lock(c);
152*4882a593Smuzhiyun 	}
153*4882a593Smuzhiyun 	mutex_unlock(&conn->chan_lock);
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun 	return c;
156*4882a593Smuzhiyun }
157*4882a593Smuzhiyun 
__l2cap_get_chan_by_ident(struct l2cap_conn * conn,u8 ident)158*4882a593Smuzhiyun static struct l2cap_chan *__l2cap_get_chan_by_ident(struct l2cap_conn *conn,
159*4882a593Smuzhiyun 						    u8 ident)
160*4882a593Smuzhiyun {
161*4882a593Smuzhiyun 	struct l2cap_chan *c;
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun 	list_for_each_entry(c, &conn->chan_l, list) {
164*4882a593Smuzhiyun 		if (c->ident == ident)
165*4882a593Smuzhiyun 			return c;
166*4882a593Smuzhiyun 	}
167*4882a593Smuzhiyun 	return NULL;
168*4882a593Smuzhiyun }
169*4882a593Smuzhiyun 
l2cap_get_chan_by_ident(struct l2cap_conn * conn,u8 ident)170*4882a593Smuzhiyun static struct l2cap_chan *l2cap_get_chan_by_ident(struct l2cap_conn *conn,
171*4882a593Smuzhiyun 						  u8 ident)
172*4882a593Smuzhiyun {
173*4882a593Smuzhiyun 	struct l2cap_chan *c;
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun 	mutex_lock(&conn->chan_lock);
176*4882a593Smuzhiyun 	c = __l2cap_get_chan_by_ident(conn, ident);
177*4882a593Smuzhiyun 	if (c) {
178*4882a593Smuzhiyun 		/* Only lock if chan reference is not 0 */
179*4882a593Smuzhiyun 		c = l2cap_chan_hold_unless_zero(c);
180*4882a593Smuzhiyun 		if (c)
181*4882a593Smuzhiyun 			l2cap_chan_lock(c);
182*4882a593Smuzhiyun 	}
183*4882a593Smuzhiyun 	mutex_unlock(&conn->chan_lock);
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun 	return c;
186*4882a593Smuzhiyun }
187*4882a593Smuzhiyun 
__l2cap_global_chan_by_addr(__le16 psm,bdaddr_t * src,u8 src_type)188*4882a593Smuzhiyun static struct l2cap_chan *__l2cap_global_chan_by_addr(__le16 psm, bdaddr_t *src,
189*4882a593Smuzhiyun 						      u8 src_type)
190*4882a593Smuzhiyun {
191*4882a593Smuzhiyun 	struct l2cap_chan *c;
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun 	list_for_each_entry(c, &chan_list, global_l) {
194*4882a593Smuzhiyun 		if (src_type == BDADDR_BREDR && c->src_type != BDADDR_BREDR)
195*4882a593Smuzhiyun 			continue;
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun 		if (src_type != BDADDR_BREDR && c->src_type == BDADDR_BREDR)
198*4882a593Smuzhiyun 			continue;
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun 		if (c->sport == psm && !bacmp(&c->src, src))
201*4882a593Smuzhiyun 			return c;
202*4882a593Smuzhiyun 	}
203*4882a593Smuzhiyun 	return NULL;
204*4882a593Smuzhiyun }
205*4882a593Smuzhiyun 
l2cap_add_psm(struct l2cap_chan * chan,bdaddr_t * src,__le16 psm)206*4882a593Smuzhiyun int l2cap_add_psm(struct l2cap_chan *chan, bdaddr_t *src, __le16 psm)
207*4882a593Smuzhiyun {
208*4882a593Smuzhiyun 	int err;
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun 	write_lock(&chan_list_lock);
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun 	if (psm && __l2cap_global_chan_by_addr(psm, src, chan->src_type)) {
213*4882a593Smuzhiyun 		err = -EADDRINUSE;
214*4882a593Smuzhiyun 		goto done;
215*4882a593Smuzhiyun 	}
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun 	if (psm) {
218*4882a593Smuzhiyun 		chan->psm = psm;
219*4882a593Smuzhiyun 		chan->sport = psm;
220*4882a593Smuzhiyun 		err = 0;
221*4882a593Smuzhiyun 	} else {
222*4882a593Smuzhiyun 		u16 p, start, end, incr;
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun 		if (chan->src_type == BDADDR_BREDR) {
225*4882a593Smuzhiyun 			start = L2CAP_PSM_DYN_START;
226*4882a593Smuzhiyun 			end = L2CAP_PSM_AUTO_END;
227*4882a593Smuzhiyun 			incr = 2;
228*4882a593Smuzhiyun 		} else {
229*4882a593Smuzhiyun 			start = L2CAP_PSM_LE_DYN_START;
230*4882a593Smuzhiyun 			end = L2CAP_PSM_LE_DYN_END;
231*4882a593Smuzhiyun 			incr = 1;
232*4882a593Smuzhiyun 		}
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun 		err = -EINVAL;
235*4882a593Smuzhiyun 		for (p = start; p <= end; p += incr)
236*4882a593Smuzhiyun 			if (!__l2cap_global_chan_by_addr(cpu_to_le16(p), src,
237*4882a593Smuzhiyun 							 chan->src_type)) {
238*4882a593Smuzhiyun 				chan->psm   = cpu_to_le16(p);
239*4882a593Smuzhiyun 				chan->sport = cpu_to_le16(p);
240*4882a593Smuzhiyun 				err = 0;
241*4882a593Smuzhiyun 				break;
242*4882a593Smuzhiyun 			}
243*4882a593Smuzhiyun 	}
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun done:
246*4882a593Smuzhiyun 	write_unlock(&chan_list_lock);
247*4882a593Smuzhiyun 	return err;
248*4882a593Smuzhiyun }
249*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(l2cap_add_psm);
250*4882a593Smuzhiyun 
l2cap_add_scid(struct l2cap_chan * chan,__u16 scid)251*4882a593Smuzhiyun int l2cap_add_scid(struct l2cap_chan *chan,  __u16 scid)
252*4882a593Smuzhiyun {
253*4882a593Smuzhiyun 	write_lock(&chan_list_lock);
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun 	/* Override the defaults (which are for conn-oriented) */
256*4882a593Smuzhiyun 	chan->omtu = L2CAP_DEFAULT_MTU;
257*4882a593Smuzhiyun 	chan->chan_type = L2CAP_CHAN_FIXED;
258*4882a593Smuzhiyun 
259*4882a593Smuzhiyun 	chan->scid = scid;
260*4882a593Smuzhiyun 
261*4882a593Smuzhiyun 	write_unlock(&chan_list_lock);
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun 	return 0;
264*4882a593Smuzhiyun }
265*4882a593Smuzhiyun 
l2cap_alloc_cid(struct l2cap_conn * conn)266*4882a593Smuzhiyun static u16 l2cap_alloc_cid(struct l2cap_conn *conn)
267*4882a593Smuzhiyun {
268*4882a593Smuzhiyun 	u16 cid, dyn_end;
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun 	if (conn->hcon->type == LE_LINK)
271*4882a593Smuzhiyun 		dyn_end = L2CAP_CID_LE_DYN_END;
272*4882a593Smuzhiyun 	else
273*4882a593Smuzhiyun 		dyn_end = L2CAP_CID_DYN_END;
274*4882a593Smuzhiyun 
275*4882a593Smuzhiyun 	for (cid = L2CAP_CID_DYN_START; cid <= dyn_end; cid++) {
276*4882a593Smuzhiyun 		if (!__l2cap_get_chan_by_scid(conn, cid))
277*4882a593Smuzhiyun 			return cid;
278*4882a593Smuzhiyun 	}
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun 	return 0;
281*4882a593Smuzhiyun }
282*4882a593Smuzhiyun 
l2cap_state_change(struct l2cap_chan * chan,int state)283*4882a593Smuzhiyun static void l2cap_state_change(struct l2cap_chan *chan, int state)
284*4882a593Smuzhiyun {
285*4882a593Smuzhiyun 	BT_DBG("chan %p %s -> %s", chan, state_to_string(chan->state),
286*4882a593Smuzhiyun 	       state_to_string(state));
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun 	chan->state = state;
289*4882a593Smuzhiyun 	chan->ops->state_change(chan, state, 0);
290*4882a593Smuzhiyun }
291*4882a593Smuzhiyun 
l2cap_state_change_and_error(struct l2cap_chan * chan,int state,int err)292*4882a593Smuzhiyun static inline void l2cap_state_change_and_error(struct l2cap_chan *chan,
293*4882a593Smuzhiyun 						int state, int err)
294*4882a593Smuzhiyun {
295*4882a593Smuzhiyun 	chan->state = state;
296*4882a593Smuzhiyun 	chan->ops->state_change(chan, chan->state, err);
297*4882a593Smuzhiyun }
298*4882a593Smuzhiyun 
l2cap_chan_set_err(struct l2cap_chan * chan,int err)299*4882a593Smuzhiyun static inline void l2cap_chan_set_err(struct l2cap_chan *chan, int err)
300*4882a593Smuzhiyun {
301*4882a593Smuzhiyun 	chan->ops->state_change(chan, chan->state, err);
302*4882a593Smuzhiyun }
303*4882a593Smuzhiyun 
__set_retrans_timer(struct l2cap_chan * chan)304*4882a593Smuzhiyun static void __set_retrans_timer(struct l2cap_chan *chan)
305*4882a593Smuzhiyun {
306*4882a593Smuzhiyun 	if (!delayed_work_pending(&chan->monitor_timer) &&
307*4882a593Smuzhiyun 	    chan->retrans_timeout) {
308*4882a593Smuzhiyun 		l2cap_set_timer(chan, &chan->retrans_timer,
309*4882a593Smuzhiyun 				msecs_to_jiffies(chan->retrans_timeout));
310*4882a593Smuzhiyun 	}
311*4882a593Smuzhiyun }
312*4882a593Smuzhiyun 
__set_monitor_timer(struct l2cap_chan * chan)313*4882a593Smuzhiyun static void __set_monitor_timer(struct l2cap_chan *chan)
314*4882a593Smuzhiyun {
315*4882a593Smuzhiyun 	__clear_retrans_timer(chan);
316*4882a593Smuzhiyun 	if (chan->monitor_timeout) {
317*4882a593Smuzhiyun 		l2cap_set_timer(chan, &chan->monitor_timer,
318*4882a593Smuzhiyun 				msecs_to_jiffies(chan->monitor_timeout));
319*4882a593Smuzhiyun 	}
320*4882a593Smuzhiyun }
321*4882a593Smuzhiyun 
l2cap_ertm_seq_in_queue(struct sk_buff_head * head,u16 seq)322*4882a593Smuzhiyun static struct sk_buff *l2cap_ertm_seq_in_queue(struct sk_buff_head *head,
323*4882a593Smuzhiyun 					       u16 seq)
324*4882a593Smuzhiyun {
325*4882a593Smuzhiyun 	struct sk_buff *skb;
326*4882a593Smuzhiyun 
327*4882a593Smuzhiyun 	skb_queue_walk(head, skb) {
328*4882a593Smuzhiyun 		if (bt_cb(skb)->l2cap.txseq == seq)
329*4882a593Smuzhiyun 			return skb;
330*4882a593Smuzhiyun 	}
331*4882a593Smuzhiyun 
332*4882a593Smuzhiyun 	return NULL;
333*4882a593Smuzhiyun }
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun /* ---- L2CAP sequence number lists ---- */
336*4882a593Smuzhiyun 
337*4882a593Smuzhiyun /* For ERTM, ordered lists of sequence numbers must be tracked for
338*4882a593Smuzhiyun  * SREJ requests that are received and for frames that are to be
339*4882a593Smuzhiyun  * retransmitted. These seq_list functions implement a singly-linked
340*4882a593Smuzhiyun  * list in an array, where membership in the list can also be checked
341*4882a593Smuzhiyun  * in constant time. Items can also be added to the tail of the list
342*4882a593Smuzhiyun  * and removed from the head in constant time, without further memory
343*4882a593Smuzhiyun  * allocs or frees.
344*4882a593Smuzhiyun  */
345*4882a593Smuzhiyun 
l2cap_seq_list_init(struct l2cap_seq_list * seq_list,u16 size)346*4882a593Smuzhiyun static int l2cap_seq_list_init(struct l2cap_seq_list *seq_list, u16 size)
347*4882a593Smuzhiyun {
348*4882a593Smuzhiyun 	size_t alloc_size, i;
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun 	/* Allocated size is a power of 2 to map sequence numbers
351*4882a593Smuzhiyun 	 * (which may be up to 14 bits) in to a smaller array that is
352*4882a593Smuzhiyun 	 * sized for the negotiated ERTM transmit windows.
353*4882a593Smuzhiyun 	 */
354*4882a593Smuzhiyun 	alloc_size = roundup_pow_of_two(size);
355*4882a593Smuzhiyun 
356*4882a593Smuzhiyun 	seq_list->list = kmalloc_array(alloc_size, sizeof(u16), GFP_KERNEL);
357*4882a593Smuzhiyun 	if (!seq_list->list)
358*4882a593Smuzhiyun 		return -ENOMEM;
359*4882a593Smuzhiyun 
360*4882a593Smuzhiyun 	seq_list->mask = alloc_size - 1;
361*4882a593Smuzhiyun 	seq_list->head = L2CAP_SEQ_LIST_CLEAR;
362*4882a593Smuzhiyun 	seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
363*4882a593Smuzhiyun 	for (i = 0; i < alloc_size; i++)
364*4882a593Smuzhiyun 		seq_list->list[i] = L2CAP_SEQ_LIST_CLEAR;
365*4882a593Smuzhiyun 
366*4882a593Smuzhiyun 	return 0;
367*4882a593Smuzhiyun }
368*4882a593Smuzhiyun 
l2cap_seq_list_free(struct l2cap_seq_list * seq_list)369*4882a593Smuzhiyun static inline void l2cap_seq_list_free(struct l2cap_seq_list *seq_list)
370*4882a593Smuzhiyun {
371*4882a593Smuzhiyun 	kfree(seq_list->list);
372*4882a593Smuzhiyun }
373*4882a593Smuzhiyun 
l2cap_seq_list_contains(struct l2cap_seq_list * seq_list,u16 seq)374*4882a593Smuzhiyun static inline bool l2cap_seq_list_contains(struct l2cap_seq_list *seq_list,
375*4882a593Smuzhiyun 					   u16 seq)
376*4882a593Smuzhiyun {
377*4882a593Smuzhiyun 	/* Constant-time check for list membership */
378*4882a593Smuzhiyun 	return seq_list->list[seq & seq_list->mask] != L2CAP_SEQ_LIST_CLEAR;
379*4882a593Smuzhiyun }
380*4882a593Smuzhiyun 
l2cap_seq_list_pop(struct l2cap_seq_list * seq_list)381*4882a593Smuzhiyun static inline u16 l2cap_seq_list_pop(struct l2cap_seq_list *seq_list)
382*4882a593Smuzhiyun {
383*4882a593Smuzhiyun 	u16 seq = seq_list->head;
384*4882a593Smuzhiyun 	u16 mask = seq_list->mask;
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun 	seq_list->head = seq_list->list[seq & mask];
387*4882a593Smuzhiyun 	seq_list->list[seq & mask] = L2CAP_SEQ_LIST_CLEAR;
388*4882a593Smuzhiyun 
389*4882a593Smuzhiyun 	if (seq_list->head == L2CAP_SEQ_LIST_TAIL) {
390*4882a593Smuzhiyun 		seq_list->head = L2CAP_SEQ_LIST_CLEAR;
391*4882a593Smuzhiyun 		seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
392*4882a593Smuzhiyun 	}
393*4882a593Smuzhiyun 
394*4882a593Smuzhiyun 	return seq;
395*4882a593Smuzhiyun }
396*4882a593Smuzhiyun 
l2cap_seq_list_clear(struct l2cap_seq_list * seq_list)397*4882a593Smuzhiyun static void l2cap_seq_list_clear(struct l2cap_seq_list *seq_list)
398*4882a593Smuzhiyun {
399*4882a593Smuzhiyun 	u16 i;
400*4882a593Smuzhiyun 
401*4882a593Smuzhiyun 	if (seq_list->head == L2CAP_SEQ_LIST_CLEAR)
402*4882a593Smuzhiyun 		return;
403*4882a593Smuzhiyun 
404*4882a593Smuzhiyun 	for (i = 0; i <= seq_list->mask; i++)
405*4882a593Smuzhiyun 		seq_list->list[i] = L2CAP_SEQ_LIST_CLEAR;
406*4882a593Smuzhiyun 
407*4882a593Smuzhiyun 	seq_list->head = L2CAP_SEQ_LIST_CLEAR;
408*4882a593Smuzhiyun 	seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
409*4882a593Smuzhiyun }
410*4882a593Smuzhiyun 
l2cap_seq_list_append(struct l2cap_seq_list * seq_list,u16 seq)411*4882a593Smuzhiyun static void l2cap_seq_list_append(struct l2cap_seq_list *seq_list, u16 seq)
412*4882a593Smuzhiyun {
413*4882a593Smuzhiyun 	u16 mask = seq_list->mask;
414*4882a593Smuzhiyun 
415*4882a593Smuzhiyun 	/* All appends happen in constant time */
416*4882a593Smuzhiyun 
417*4882a593Smuzhiyun 	if (seq_list->list[seq & mask] != L2CAP_SEQ_LIST_CLEAR)
418*4882a593Smuzhiyun 		return;
419*4882a593Smuzhiyun 
420*4882a593Smuzhiyun 	if (seq_list->tail == L2CAP_SEQ_LIST_CLEAR)
421*4882a593Smuzhiyun 		seq_list->head = seq;
422*4882a593Smuzhiyun 	else
423*4882a593Smuzhiyun 		seq_list->list[seq_list->tail & mask] = seq;
424*4882a593Smuzhiyun 
425*4882a593Smuzhiyun 	seq_list->tail = seq;
426*4882a593Smuzhiyun 	seq_list->list[seq & mask] = L2CAP_SEQ_LIST_TAIL;
427*4882a593Smuzhiyun }
428*4882a593Smuzhiyun 
l2cap_chan_timeout(struct work_struct * work)429*4882a593Smuzhiyun static void l2cap_chan_timeout(struct work_struct *work)
430*4882a593Smuzhiyun {
431*4882a593Smuzhiyun 	struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
432*4882a593Smuzhiyun 					       chan_timer.work);
433*4882a593Smuzhiyun 	struct l2cap_conn *conn = chan->conn;
434*4882a593Smuzhiyun 	int reason;
435*4882a593Smuzhiyun 
436*4882a593Smuzhiyun 	BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
437*4882a593Smuzhiyun 
438*4882a593Smuzhiyun 	mutex_lock(&conn->chan_lock);
439*4882a593Smuzhiyun 	/* __set_chan_timer() calls l2cap_chan_hold(chan) while scheduling
440*4882a593Smuzhiyun 	 * this work. No need to call l2cap_chan_hold(chan) here again.
441*4882a593Smuzhiyun 	 */
442*4882a593Smuzhiyun 	l2cap_chan_lock(chan);
443*4882a593Smuzhiyun 
444*4882a593Smuzhiyun 	if (chan->state == BT_CONNECTED || chan->state == BT_CONFIG)
445*4882a593Smuzhiyun 		reason = ECONNREFUSED;
446*4882a593Smuzhiyun 	else if (chan->state == BT_CONNECT &&
447*4882a593Smuzhiyun 		 chan->sec_level != BT_SECURITY_SDP)
448*4882a593Smuzhiyun 		reason = ECONNREFUSED;
449*4882a593Smuzhiyun 	else
450*4882a593Smuzhiyun 		reason = ETIMEDOUT;
451*4882a593Smuzhiyun 
452*4882a593Smuzhiyun 	l2cap_chan_close(chan, reason);
453*4882a593Smuzhiyun 
454*4882a593Smuzhiyun 	chan->ops->close(chan);
455*4882a593Smuzhiyun 
456*4882a593Smuzhiyun 	l2cap_chan_unlock(chan);
457*4882a593Smuzhiyun 	l2cap_chan_put(chan);
458*4882a593Smuzhiyun 
459*4882a593Smuzhiyun 	mutex_unlock(&conn->chan_lock);
460*4882a593Smuzhiyun }
461*4882a593Smuzhiyun 
l2cap_chan_create(void)462*4882a593Smuzhiyun struct l2cap_chan *l2cap_chan_create(void)
463*4882a593Smuzhiyun {
464*4882a593Smuzhiyun 	struct l2cap_chan *chan;
465*4882a593Smuzhiyun 
466*4882a593Smuzhiyun 	chan = kzalloc(sizeof(*chan), GFP_ATOMIC);
467*4882a593Smuzhiyun 	if (!chan)
468*4882a593Smuzhiyun 		return NULL;
469*4882a593Smuzhiyun 
470*4882a593Smuzhiyun 	skb_queue_head_init(&chan->tx_q);
471*4882a593Smuzhiyun 	skb_queue_head_init(&chan->srej_q);
472*4882a593Smuzhiyun 	mutex_init(&chan->lock);
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun 	/* Set default lock nesting level */
475*4882a593Smuzhiyun 	atomic_set(&chan->nesting, L2CAP_NESTING_NORMAL);
476*4882a593Smuzhiyun 
477*4882a593Smuzhiyun 	write_lock(&chan_list_lock);
478*4882a593Smuzhiyun 	list_add(&chan->global_l, &chan_list);
479*4882a593Smuzhiyun 	write_unlock(&chan_list_lock);
480*4882a593Smuzhiyun 
481*4882a593Smuzhiyun 	INIT_DELAYED_WORK(&chan->chan_timer, l2cap_chan_timeout);
482*4882a593Smuzhiyun 	INIT_DELAYED_WORK(&chan->retrans_timer, l2cap_retrans_timeout);
483*4882a593Smuzhiyun 	INIT_DELAYED_WORK(&chan->monitor_timer, l2cap_monitor_timeout);
484*4882a593Smuzhiyun 	INIT_DELAYED_WORK(&chan->ack_timer, l2cap_ack_timeout);
485*4882a593Smuzhiyun 
486*4882a593Smuzhiyun 	chan->state = BT_OPEN;
487*4882a593Smuzhiyun 
488*4882a593Smuzhiyun 	kref_init(&chan->kref);
489*4882a593Smuzhiyun 
490*4882a593Smuzhiyun 	/* This flag is cleared in l2cap_chan_ready() */
491*4882a593Smuzhiyun 	set_bit(CONF_NOT_COMPLETE, &chan->conf_state);
492*4882a593Smuzhiyun 
493*4882a593Smuzhiyun 	BT_DBG("chan %p", chan);
494*4882a593Smuzhiyun 
495*4882a593Smuzhiyun 	return chan;
496*4882a593Smuzhiyun }
497*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(l2cap_chan_create);
498*4882a593Smuzhiyun 
l2cap_chan_destroy(struct kref * kref)499*4882a593Smuzhiyun static void l2cap_chan_destroy(struct kref *kref)
500*4882a593Smuzhiyun {
501*4882a593Smuzhiyun 	struct l2cap_chan *chan = container_of(kref, struct l2cap_chan, kref);
502*4882a593Smuzhiyun 
503*4882a593Smuzhiyun 	BT_DBG("chan %p", chan);
504*4882a593Smuzhiyun 
505*4882a593Smuzhiyun 	write_lock(&chan_list_lock);
506*4882a593Smuzhiyun 	list_del(&chan->global_l);
507*4882a593Smuzhiyun 	write_unlock(&chan_list_lock);
508*4882a593Smuzhiyun 
509*4882a593Smuzhiyun 	kfree(chan);
510*4882a593Smuzhiyun }
511*4882a593Smuzhiyun 
l2cap_chan_hold(struct l2cap_chan * c)512*4882a593Smuzhiyun void l2cap_chan_hold(struct l2cap_chan *c)
513*4882a593Smuzhiyun {
514*4882a593Smuzhiyun 	BT_DBG("chan %p orig refcnt %d", c, kref_read(&c->kref));
515*4882a593Smuzhiyun 
516*4882a593Smuzhiyun 	kref_get(&c->kref);
517*4882a593Smuzhiyun }
518*4882a593Smuzhiyun 
l2cap_chan_hold_unless_zero(struct l2cap_chan * c)519*4882a593Smuzhiyun struct l2cap_chan *l2cap_chan_hold_unless_zero(struct l2cap_chan *c)
520*4882a593Smuzhiyun {
521*4882a593Smuzhiyun 	BT_DBG("chan %p orig refcnt %u", c, kref_read(&c->kref));
522*4882a593Smuzhiyun 
523*4882a593Smuzhiyun 	if (!kref_get_unless_zero(&c->kref))
524*4882a593Smuzhiyun 		return NULL;
525*4882a593Smuzhiyun 
526*4882a593Smuzhiyun 	return c;
527*4882a593Smuzhiyun }
528*4882a593Smuzhiyun 
l2cap_chan_put(struct l2cap_chan * c)529*4882a593Smuzhiyun void l2cap_chan_put(struct l2cap_chan *c)
530*4882a593Smuzhiyun {
531*4882a593Smuzhiyun 	BT_DBG("chan %p orig refcnt %d", c, kref_read(&c->kref));
532*4882a593Smuzhiyun 
533*4882a593Smuzhiyun 	kref_put(&c->kref, l2cap_chan_destroy);
534*4882a593Smuzhiyun }
535*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(l2cap_chan_put);
536*4882a593Smuzhiyun 
l2cap_chan_set_defaults(struct l2cap_chan * chan)537*4882a593Smuzhiyun void l2cap_chan_set_defaults(struct l2cap_chan *chan)
538*4882a593Smuzhiyun {
539*4882a593Smuzhiyun 	chan->fcs  = L2CAP_FCS_CRC16;
540*4882a593Smuzhiyun 	chan->max_tx = L2CAP_DEFAULT_MAX_TX;
541*4882a593Smuzhiyun 	chan->tx_win = L2CAP_DEFAULT_TX_WINDOW;
542*4882a593Smuzhiyun 	chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
543*4882a593Smuzhiyun 	chan->remote_max_tx = chan->max_tx;
544*4882a593Smuzhiyun 	chan->remote_tx_win = chan->tx_win;
545*4882a593Smuzhiyun 	chan->ack_win = L2CAP_DEFAULT_TX_WINDOW;
546*4882a593Smuzhiyun 	chan->sec_level = BT_SECURITY_LOW;
547*4882a593Smuzhiyun 	chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
548*4882a593Smuzhiyun 	chan->retrans_timeout = L2CAP_DEFAULT_RETRANS_TO;
549*4882a593Smuzhiyun 	chan->monitor_timeout = L2CAP_DEFAULT_MONITOR_TO;
550*4882a593Smuzhiyun 
551*4882a593Smuzhiyun 	chan->conf_state = 0;
552*4882a593Smuzhiyun 	set_bit(CONF_NOT_COMPLETE, &chan->conf_state);
553*4882a593Smuzhiyun 
554*4882a593Smuzhiyun 	set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
555*4882a593Smuzhiyun }
556*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(l2cap_chan_set_defaults);
557*4882a593Smuzhiyun 
l2cap_le_flowctl_init(struct l2cap_chan * chan,u16 tx_credits)558*4882a593Smuzhiyun static void l2cap_le_flowctl_init(struct l2cap_chan *chan, u16 tx_credits)
559*4882a593Smuzhiyun {
560*4882a593Smuzhiyun 	chan->sdu = NULL;
561*4882a593Smuzhiyun 	chan->sdu_last_frag = NULL;
562*4882a593Smuzhiyun 	chan->sdu_len = 0;
563*4882a593Smuzhiyun 	chan->tx_credits = tx_credits;
564*4882a593Smuzhiyun 	/* Derive MPS from connection MTU to stop HCI fragmentation */
565*4882a593Smuzhiyun 	chan->mps = min_t(u16, chan->imtu, chan->conn->mtu - L2CAP_HDR_SIZE);
566*4882a593Smuzhiyun 	/* Give enough credits for a full packet */
567*4882a593Smuzhiyun 	chan->rx_credits = (chan->imtu / chan->mps) + 1;
568*4882a593Smuzhiyun 
569*4882a593Smuzhiyun 	skb_queue_head_init(&chan->tx_q);
570*4882a593Smuzhiyun }
571*4882a593Smuzhiyun 
l2cap_ecred_init(struct l2cap_chan * chan,u16 tx_credits)572*4882a593Smuzhiyun static void l2cap_ecred_init(struct l2cap_chan *chan, u16 tx_credits)
573*4882a593Smuzhiyun {
574*4882a593Smuzhiyun 	l2cap_le_flowctl_init(chan, tx_credits);
575*4882a593Smuzhiyun 
576*4882a593Smuzhiyun 	/* L2CAP implementations shall support a minimum MPS of 64 octets */
577*4882a593Smuzhiyun 	if (chan->mps < L2CAP_ECRED_MIN_MPS) {
578*4882a593Smuzhiyun 		chan->mps = L2CAP_ECRED_MIN_MPS;
579*4882a593Smuzhiyun 		chan->rx_credits = (chan->imtu / chan->mps) + 1;
580*4882a593Smuzhiyun 	}
581*4882a593Smuzhiyun }
582*4882a593Smuzhiyun 
__l2cap_chan_add(struct l2cap_conn * conn,struct l2cap_chan * chan)583*4882a593Smuzhiyun void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
584*4882a593Smuzhiyun {
585*4882a593Smuzhiyun 	BT_DBG("conn %p, psm 0x%2.2x, dcid 0x%4.4x", conn,
586*4882a593Smuzhiyun 	       __le16_to_cpu(chan->psm), chan->dcid);
587*4882a593Smuzhiyun 
588*4882a593Smuzhiyun 	conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
589*4882a593Smuzhiyun 
590*4882a593Smuzhiyun 	chan->conn = conn;
591*4882a593Smuzhiyun 
592*4882a593Smuzhiyun 	switch (chan->chan_type) {
593*4882a593Smuzhiyun 	case L2CAP_CHAN_CONN_ORIENTED:
594*4882a593Smuzhiyun 		/* Alloc CID for connection-oriented socket */
595*4882a593Smuzhiyun 		chan->scid = l2cap_alloc_cid(conn);
596*4882a593Smuzhiyun 		if (conn->hcon->type == ACL_LINK)
597*4882a593Smuzhiyun 			chan->omtu = L2CAP_DEFAULT_MTU;
598*4882a593Smuzhiyun 		break;
599*4882a593Smuzhiyun 
600*4882a593Smuzhiyun 	case L2CAP_CHAN_CONN_LESS:
601*4882a593Smuzhiyun 		/* Connectionless socket */
602*4882a593Smuzhiyun 		chan->scid = L2CAP_CID_CONN_LESS;
603*4882a593Smuzhiyun 		chan->dcid = L2CAP_CID_CONN_LESS;
604*4882a593Smuzhiyun 		chan->omtu = L2CAP_DEFAULT_MTU;
605*4882a593Smuzhiyun 		break;
606*4882a593Smuzhiyun 
607*4882a593Smuzhiyun 	case L2CAP_CHAN_FIXED:
608*4882a593Smuzhiyun 		/* Caller will set CID and CID specific MTU values */
609*4882a593Smuzhiyun 		break;
610*4882a593Smuzhiyun 
611*4882a593Smuzhiyun 	default:
612*4882a593Smuzhiyun 		/* Raw socket can send/recv signalling messages only */
613*4882a593Smuzhiyun 		chan->scid = L2CAP_CID_SIGNALING;
614*4882a593Smuzhiyun 		chan->dcid = L2CAP_CID_SIGNALING;
615*4882a593Smuzhiyun 		chan->omtu = L2CAP_DEFAULT_MTU;
616*4882a593Smuzhiyun 	}
617*4882a593Smuzhiyun 
618*4882a593Smuzhiyun 	chan->local_id		= L2CAP_BESTEFFORT_ID;
619*4882a593Smuzhiyun 	chan->local_stype	= L2CAP_SERV_BESTEFFORT;
620*4882a593Smuzhiyun 	chan->local_msdu	= L2CAP_DEFAULT_MAX_SDU_SIZE;
621*4882a593Smuzhiyun 	chan->local_sdu_itime	= L2CAP_DEFAULT_SDU_ITIME;
622*4882a593Smuzhiyun 	chan->local_acc_lat	= L2CAP_DEFAULT_ACC_LAT;
623*4882a593Smuzhiyun 	chan->local_flush_to	= L2CAP_EFS_DEFAULT_FLUSH_TO;
624*4882a593Smuzhiyun 
625*4882a593Smuzhiyun 	l2cap_chan_hold(chan);
626*4882a593Smuzhiyun 
627*4882a593Smuzhiyun 	/* Only keep a reference for fixed channels if they requested it */
628*4882a593Smuzhiyun 	if (chan->chan_type != L2CAP_CHAN_FIXED ||
629*4882a593Smuzhiyun 	    test_bit(FLAG_HOLD_HCI_CONN, &chan->flags))
630*4882a593Smuzhiyun 		hci_conn_hold(conn->hcon);
631*4882a593Smuzhiyun 
632*4882a593Smuzhiyun 	list_add(&chan->list, &conn->chan_l);
633*4882a593Smuzhiyun }
634*4882a593Smuzhiyun 
l2cap_chan_add(struct l2cap_conn * conn,struct l2cap_chan * chan)635*4882a593Smuzhiyun void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
636*4882a593Smuzhiyun {
637*4882a593Smuzhiyun 	mutex_lock(&conn->chan_lock);
638*4882a593Smuzhiyun 	__l2cap_chan_add(conn, chan);
639*4882a593Smuzhiyun 	mutex_unlock(&conn->chan_lock);
640*4882a593Smuzhiyun }
641*4882a593Smuzhiyun 
l2cap_chan_del(struct l2cap_chan * chan,int err)642*4882a593Smuzhiyun void l2cap_chan_del(struct l2cap_chan *chan, int err)
643*4882a593Smuzhiyun {
644*4882a593Smuzhiyun 	struct l2cap_conn *conn = chan->conn;
645*4882a593Smuzhiyun 
646*4882a593Smuzhiyun 	__clear_chan_timer(chan);
647*4882a593Smuzhiyun 
648*4882a593Smuzhiyun 	BT_DBG("chan %p, conn %p, err %d, state %s", chan, conn, err,
649*4882a593Smuzhiyun 	       state_to_string(chan->state));
650*4882a593Smuzhiyun 
651*4882a593Smuzhiyun 	chan->ops->teardown(chan, err);
652*4882a593Smuzhiyun 
653*4882a593Smuzhiyun 	if (conn) {
654*4882a593Smuzhiyun 		struct amp_mgr *mgr = conn->hcon->amp_mgr;
655*4882a593Smuzhiyun 		/* Delete from channel list */
656*4882a593Smuzhiyun 		list_del(&chan->list);
657*4882a593Smuzhiyun 
658*4882a593Smuzhiyun 		l2cap_chan_put(chan);
659*4882a593Smuzhiyun 
660*4882a593Smuzhiyun 		chan->conn = NULL;
661*4882a593Smuzhiyun 
662*4882a593Smuzhiyun 		/* Reference was only held for non-fixed channels or
663*4882a593Smuzhiyun 		 * fixed channels that explicitly requested it using the
664*4882a593Smuzhiyun 		 * FLAG_HOLD_HCI_CONN flag.
665*4882a593Smuzhiyun 		 */
666*4882a593Smuzhiyun 		if (chan->chan_type != L2CAP_CHAN_FIXED ||
667*4882a593Smuzhiyun 		    test_bit(FLAG_HOLD_HCI_CONN, &chan->flags))
668*4882a593Smuzhiyun 			hci_conn_drop(conn->hcon);
669*4882a593Smuzhiyun 
670*4882a593Smuzhiyun 		if (mgr && mgr->bredr_chan == chan)
671*4882a593Smuzhiyun 			mgr->bredr_chan = NULL;
672*4882a593Smuzhiyun 	}
673*4882a593Smuzhiyun 
674*4882a593Smuzhiyun 	if (chan->hs_hchan) {
675*4882a593Smuzhiyun 		struct hci_chan *hs_hchan = chan->hs_hchan;
676*4882a593Smuzhiyun 
677*4882a593Smuzhiyun 		BT_DBG("chan %p disconnect hs_hchan %p", chan, hs_hchan);
678*4882a593Smuzhiyun 		amp_disconnect_logical_link(hs_hchan);
679*4882a593Smuzhiyun 	}
680*4882a593Smuzhiyun 
681*4882a593Smuzhiyun 	if (test_bit(CONF_NOT_COMPLETE, &chan->conf_state))
682*4882a593Smuzhiyun 		return;
683*4882a593Smuzhiyun 
684*4882a593Smuzhiyun 	switch(chan->mode) {
685*4882a593Smuzhiyun 	case L2CAP_MODE_BASIC:
686*4882a593Smuzhiyun 		break;
687*4882a593Smuzhiyun 
688*4882a593Smuzhiyun 	case L2CAP_MODE_LE_FLOWCTL:
689*4882a593Smuzhiyun 	case L2CAP_MODE_EXT_FLOWCTL:
690*4882a593Smuzhiyun 		skb_queue_purge(&chan->tx_q);
691*4882a593Smuzhiyun 		break;
692*4882a593Smuzhiyun 
693*4882a593Smuzhiyun 	case L2CAP_MODE_ERTM:
694*4882a593Smuzhiyun 		__clear_retrans_timer(chan);
695*4882a593Smuzhiyun 		__clear_monitor_timer(chan);
696*4882a593Smuzhiyun 		__clear_ack_timer(chan);
697*4882a593Smuzhiyun 
698*4882a593Smuzhiyun 		skb_queue_purge(&chan->srej_q);
699*4882a593Smuzhiyun 
700*4882a593Smuzhiyun 		l2cap_seq_list_free(&chan->srej_list);
701*4882a593Smuzhiyun 		l2cap_seq_list_free(&chan->retrans_list);
702*4882a593Smuzhiyun 		fallthrough;
703*4882a593Smuzhiyun 
704*4882a593Smuzhiyun 	case L2CAP_MODE_STREAMING:
705*4882a593Smuzhiyun 		skb_queue_purge(&chan->tx_q);
706*4882a593Smuzhiyun 		break;
707*4882a593Smuzhiyun 	}
708*4882a593Smuzhiyun 
709*4882a593Smuzhiyun 	return;
710*4882a593Smuzhiyun }
711*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(l2cap_chan_del);
712*4882a593Smuzhiyun 
__l2cap_chan_list(struct l2cap_conn * conn,l2cap_chan_func_t func,void * data)713*4882a593Smuzhiyun static void __l2cap_chan_list(struct l2cap_conn *conn, l2cap_chan_func_t func,
714*4882a593Smuzhiyun 			      void *data)
715*4882a593Smuzhiyun {
716*4882a593Smuzhiyun 	struct l2cap_chan *chan;
717*4882a593Smuzhiyun 
718*4882a593Smuzhiyun 	list_for_each_entry(chan, &conn->chan_l, list) {
719*4882a593Smuzhiyun 		func(chan, data);
720*4882a593Smuzhiyun 	}
721*4882a593Smuzhiyun }
722*4882a593Smuzhiyun 
l2cap_chan_list(struct l2cap_conn * conn,l2cap_chan_func_t func,void * data)723*4882a593Smuzhiyun void l2cap_chan_list(struct l2cap_conn *conn, l2cap_chan_func_t func,
724*4882a593Smuzhiyun 		     void *data)
725*4882a593Smuzhiyun {
726*4882a593Smuzhiyun 	if (!conn)
727*4882a593Smuzhiyun 		return;
728*4882a593Smuzhiyun 
729*4882a593Smuzhiyun 	mutex_lock(&conn->chan_lock);
730*4882a593Smuzhiyun 	__l2cap_chan_list(conn, func, data);
731*4882a593Smuzhiyun 	mutex_unlock(&conn->chan_lock);
732*4882a593Smuzhiyun }
733*4882a593Smuzhiyun 
734*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(l2cap_chan_list);
735*4882a593Smuzhiyun 
l2cap_conn_update_id_addr(struct work_struct * work)736*4882a593Smuzhiyun static void l2cap_conn_update_id_addr(struct work_struct *work)
737*4882a593Smuzhiyun {
738*4882a593Smuzhiyun 	struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
739*4882a593Smuzhiyun 					       id_addr_update_work);
740*4882a593Smuzhiyun 	struct hci_conn *hcon = conn->hcon;
741*4882a593Smuzhiyun 	struct l2cap_chan *chan;
742*4882a593Smuzhiyun 
743*4882a593Smuzhiyun 	mutex_lock(&conn->chan_lock);
744*4882a593Smuzhiyun 
745*4882a593Smuzhiyun 	list_for_each_entry(chan, &conn->chan_l, list) {
746*4882a593Smuzhiyun 		l2cap_chan_lock(chan);
747*4882a593Smuzhiyun 		bacpy(&chan->dst, &hcon->dst);
748*4882a593Smuzhiyun 		chan->dst_type = bdaddr_dst_type(hcon);
749*4882a593Smuzhiyun 		l2cap_chan_unlock(chan);
750*4882a593Smuzhiyun 	}
751*4882a593Smuzhiyun 
752*4882a593Smuzhiyun 	mutex_unlock(&conn->chan_lock);
753*4882a593Smuzhiyun }
754*4882a593Smuzhiyun 
l2cap_chan_le_connect_reject(struct l2cap_chan * chan)755*4882a593Smuzhiyun static void l2cap_chan_le_connect_reject(struct l2cap_chan *chan)
756*4882a593Smuzhiyun {
757*4882a593Smuzhiyun 	struct l2cap_conn *conn = chan->conn;
758*4882a593Smuzhiyun 	struct l2cap_le_conn_rsp rsp;
759*4882a593Smuzhiyun 	u16 result;
760*4882a593Smuzhiyun 
761*4882a593Smuzhiyun 	if (test_bit(FLAG_DEFER_SETUP, &chan->flags))
762*4882a593Smuzhiyun 		result = L2CAP_CR_LE_AUTHORIZATION;
763*4882a593Smuzhiyun 	else
764*4882a593Smuzhiyun 		result = L2CAP_CR_LE_BAD_PSM;
765*4882a593Smuzhiyun 
766*4882a593Smuzhiyun 	l2cap_state_change(chan, BT_DISCONN);
767*4882a593Smuzhiyun 
768*4882a593Smuzhiyun 	rsp.dcid    = cpu_to_le16(chan->scid);
769*4882a593Smuzhiyun 	rsp.mtu     = cpu_to_le16(chan->imtu);
770*4882a593Smuzhiyun 	rsp.mps     = cpu_to_le16(chan->mps);
771*4882a593Smuzhiyun 	rsp.credits = cpu_to_le16(chan->rx_credits);
772*4882a593Smuzhiyun 	rsp.result  = cpu_to_le16(result);
773*4882a593Smuzhiyun 
774*4882a593Smuzhiyun 	l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp),
775*4882a593Smuzhiyun 		       &rsp);
776*4882a593Smuzhiyun }
777*4882a593Smuzhiyun 
l2cap_chan_ecred_connect_reject(struct l2cap_chan * chan)778*4882a593Smuzhiyun static void l2cap_chan_ecred_connect_reject(struct l2cap_chan *chan)
779*4882a593Smuzhiyun {
780*4882a593Smuzhiyun 	struct l2cap_conn *conn = chan->conn;
781*4882a593Smuzhiyun 	struct l2cap_ecred_conn_rsp rsp;
782*4882a593Smuzhiyun 	u16 result;
783*4882a593Smuzhiyun 
784*4882a593Smuzhiyun 	if (test_bit(FLAG_DEFER_SETUP, &chan->flags))
785*4882a593Smuzhiyun 		result = L2CAP_CR_LE_AUTHORIZATION;
786*4882a593Smuzhiyun 	else
787*4882a593Smuzhiyun 		result = L2CAP_CR_LE_BAD_PSM;
788*4882a593Smuzhiyun 
789*4882a593Smuzhiyun 	l2cap_state_change(chan, BT_DISCONN);
790*4882a593Smuzhiyun 
791*4882a593Smuzhiyun 	memset(&rsp, 0, sizeof(rsp));
792*4882a593Smuzhiyun 
793*4882a593Smuzhiyun 	rsp.result  = cpu_to_le16(result);
794*4882a593Smuzhiyun 
795*4882a593Smuzhiyun 	l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp),
796*4882a593Smuzhiyun 		       &rsp);
797*4882a593Smuzhiyun }
798*4882a593Smuzhiyun 
l2cap_chan_connect_reject(struct l2cap_chan * chan)799*4882a593Smuzhiyun static void l2cap_chan_connect_reject(struct l2cap_chan *chan)
800*4882a593Smuzhiyun {
801*4882a593Smuzhiyun 	struct l2cap_conn *conn = chan->conn;
802*4882a593Smuzhiyun 	struct l2cap_conn_rsp rsp;
803*4882a593Smuzhiyun 	u16 result;
804*4882a593Smuzhiyun 
805*4882a593Smuzhiyun 	if (test_bit(FLAG_DEFER_SETUP, &chan->flags))
806*4882a593Smuzhiyun 		result = L2CAP_CR_SEC_BLOCK;
807*4882a593Smuzhiyun 	else
808*4882a593Smuzhiyun 		result = L2CAP_CR_BAD_PSM;
809*4882a593Smuzhiyun 
810*4882a593Smuzhiyun 	l2cap_state_change(chan, BT_DISCONN);
811*4882a593Smuzhiyun 
812*4882a593Smuzhiyun 	rsp.scid   = cpu_to_le16(chan->dcid);
813*4882a593Smuzhiyun 	rsp.dcid   = cpu_to_le16(chan->scid);
814*4882a593Smuzhiyun 	rsp.result = cpu_to_le16(result);
815*4882a593Smuzhiyun 	rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
816*4882a593Smuzhiyun 
817*4882a593Smuzhiyun 	l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, sizeof(rsp), &rsp);
818*4882a593Smuzhiyun }
819*4882a593Smuzhiyun 
l2cap_chan_close(struct l2cap_chan * chan,int reason)820*4882a593Smuzhiyun void l2cap_chan_close(struct l2cap_chan *chan, int reason)
821*4882a593Smuzhiyun {
822*4882a593Smuzhiyun 	struct l2cap_conn *conn = chan->conn;
823*4882a593Smuzhiyun 
824*4882a593Smuzhiyun 	BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
825*4882a593Smuzhiyun 
826*4882a593Smuzhiyun 	switch (chan->state) {
827*4882a593Smuzhiyun 	case BT_LISTEN:
828*4882a593Smuzhiyun 		chan->ops->teardown(chan, 0);
829*4882a593Smuzhiyun 		break;
830*4882a593Smuzhiyun 
831*4882a593Smuzhiyun 	case BT_CONNECTED:
832*4882a593Smuzhiyun 	case BT_CONFIG:
833*4882a593Smuzhiyun 		if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED) {
834*4882a593Smuzhiyun 			__set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
835*4882a593Smuzhiyun 			l2cap_send_disconn_req(chan, reason);
836*4882a593Smuzhiyun 		} else
837*4882a593Smuzhiyun 			l2cap_chan_del(chan, reason);
838*4882a593Smuzhiyun 		break;
839*4882a593Smuzhiyun 
840*4882a593Smuzhiyun 	case BT_CONNECT2:
841*4882a593Smuzhiyun 		if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED) {
842*4882a593Smuzhiyun 			if (conn->hcon->type == ACL_LINK)
843*4882a593Smuzhiyun 				l2cap_chan_connect_reject(chan);
844*4882a593Smuzhiyun 			else if (conn->hcon->type == LE_LINK) {
845*4882a593Smuzhiyun 				switch (chan->mode) {
846*4882a593Smuzhiyun 				case L2CAP_MODE_LE_FLOWCTL:
847*4882a593Smuzhiyun 					l2cap_chan_le_connect_reject(chan);
848*4882a593Smuzhiyun 					break;
849*4882a593Smuzhiyun 				case L2CAP_MODE_EXT_FLOWCTL:
850*4882a593Smuzhiyun 					l2cap_chan_ecred_connect_reject(chan);
851*4882a593Smuzhiyun 					break;
852*4882a593Smuzhiyun 				}
853*4882a593Smuzhiyun 			}
854*4882a593Smuzhiyun 		}
855*4882a593Smuzhiyun 
856*4882a593Smuzhiyun 		l2cap_chan_del(chan, reason);
857*4882a593Smuzhiyun 		break;
858*4882a593Smuzhiyun 
859*4882a593Smuzhiyun 	case BT_CONNECT:
860*4882a593Smuzhiyun 	case BT_DISCONN:
861*4882a593Smuzhiyun 		l2cap_chan_del(chan, reason);
862*4882a593Smuzhiyun 		break;
863*4882a593Smuzhiyun 
864*4882a593Smuzhiyun 	default:
865*4882a593Smuzhiyun 		chan->ops->teardown(chan, 0);
866*4882a593Smuzhiyun 		break;
867*4882a593Smuzhiyun 	}
868*4882a593Smuzhiyun }
869*4882a593Smuzhiyun EXPORT_SYMBOL(l2cap_chan_close);
870*4882a593Smuzhiyun 
l2cap_get_auth_type(struct l2cap_chan * chan)871*4882a593Smuzhiyun static inline u8 l2cap_get_auth_type(struct l2cap_chan *chan)
872*4882a593Smuzhiyun {
873*4882a593Smuzhiyun 	switch (chan->chan_type) {
874*4882a593Smuzhiyun 	case L2CAP_CHAN_RAW:
875*4882a593Smuzhiyun 		switch (chan->sec_level) {
876*4882a593Smuzhiyun 		case BT_SECURITY_HIGH:
877*4882a593Smuzhiyun 		case BT_SECURITY_FIPS:
878*4882a593Smuzhiyun 			return HCI_AT_DEDICATED_BONDING_MITM;
879*4882a593Smuzhiyun 		case BT_SECURITY_MEDIUM:
880*4882a593Smuzhiyun 			return HCI_AT_DEDICATED_BONDING;
881*4882a593Smuzhiyun 		default:
882*4882a593Smuzhiyun 			return HCI_AT_NO_BONDING;
883*4882a593Smuzhiyun 		}
884*4882a593Smuzhiyun 		break;
885*4882a593Smuzhiyun 	case L2CAP_CHAN_CONN_LESS:
886*4882a593Smuzhiyun 		if (chan->psm == cpu_to_le16(L2CAP_PSM_3DSP)) {
887*4882a593Smuzhiyun 			if (chan->sec_level == BT_SECURITY_LOW)
888*4882a593Smuzhiyun 				chan->sec_level = BT_SECURITY_SDP;
889*4882a593Smuzhiyun 		}
890*4882a593Smuzhiyun 		if (chan->sec_level == BT_SECURITY_HIGH ||
891*4882a593Smuzhiyun 		    chan->sec_level == BT_SECURITY_FIPS)
892*4882a593Smuzhiyun 			return HCI_AT_NO_BONDING_MITM;
893*4882a593Smuzhiyun 		else
894*4882a593Smuzhiyun 			return HCI_AT_NO_BONDING;
895*4882a593Smuzhiyun 		break;
896*4882a593Smuzhiyun 	case L2CAP_CHAN_CONN_ORIENTED:
897*4882a593Smuzhiyun 		if (chan->psm == cpu_to_le16(L2CAP_PSM_SDP)) {
898*4882a593Smuzhiyun 			if (chan->sec_level == BT_SECURITY_LOW)
899*4882a593Smuzhiyun 				chan->sec_level = BT_SECURITY_SDP;
900*4882a593Smuzhiyun 
901*4882a593Smuzhiyun 			if (chan->sec_level == BT_SECURITY_HIGH ||
902*4882a593Smuzhiyun 			    chan->sec_level == BT_SECURITY_FIPS)
903*4882a593Smuzhiyun 				return HCI_AT_NO_BONDING_MITM;
904*4882a593Smuzhiyun 			else
905*4882a593Smuzhiyun 				return HCI_AT_NO_BONDING;
906*4882a593Smuzhiyun 		}
907*4882a593Smuzhiyun 		fallthrough;
908*4882a593Smuzhiyun 
909*4882a593Smuzhiyun 	default:
910*4882a593Smuzhiyun 		switch (chan->sec_level) {
911*4882a593Smuzhiyun 		case BT_SECURITY_HIGH:
912*4882a593Smuzhiyun 		case BT_SECURITY_FIPS:
913*4882a593Smuzhiyun 			return HCI_AT_GENERAL_BONDING_MITM;
914*4882a593Smuzhiyun 		case BT_SECURITY_MEDIUM:
915*4882a593Smuzhiyun 			return HCI_AT_GENERAL_BONDING;
916*4882a593Smuzhiyun 		default:
917*4882a593Smuzhiyun 			return HCI_AT_NO_BONDING;
918*4882a593Smuzhiyun 		}
919*4882a593Smuzhiyun 		break;
920*4882a593Smuzhiyun 	}
921*4882a593Smuzhiyun }
922*4882a593Smuzhiyun 
923*4882a593Smuzhiyun /* Service level security */
l2cap_chan_check_security(struct l2cap_chan * chan,bool initiator)924*4882a593Smuzhiyun int l2cap_chan_check_security(struct l2cap_chan *chan, bool initiator)
925*4882a593Smuzhiyun {
926*4882a593Smuzhiyun 	struct l2cap_conn *conn = chan->conn;
927*4882a593Smuzhiyun 	__u8 auth_type;
928*4882a593Smuzhiyun 
929*4882a593Smuzhiyun 	if (conn->hcon->type == LE_LINK)
930*4882a593Smuzhiyun 		return smp_conn_security(conn->hcon, chan->sec_level);
931*4882a593Smuzhiyun 
932*4882a593Smuzhiyun 	auth_type = l2cap_get_auth_type(chan);
933*4882a593Smuzhiyun 
934*4882a593Smuzhiyun 	return hci_conn_security(conn->hcon, chan->sec_level, auth_type,
935*4882a593Smuzhiyun 				 initiator);
936*4882a593Smuzhiyun }
937*4882a593Smuzhiyun 
l2cap_get_ident(struct l2cap_conn * conn)938*4882a593Smuzhiyun static u8 l2cap_get_ident(struct l2cap_conn *conn)
939*4882a593Smuzhiyun {
940*4882a593Smuzhiyun 	u8 id;
941*4882a593Smuzhiyun 
942*4882a593Smuzhiyun 	/* Get next available identificator.
943*4882a593Smuzhiyun 	 *    1 - 128 are used by kernel.
944*4882a593Smuzhiyun 	 *  129 - 199 are reserved.
945*4882a593Smuzhiyun 	 *  200 - 254 are used by utilities like l2ping, etc.
946*4882a593Smuzhiyun 	 */
947*4882a593Smuzhiyun 
948*4882a593Smuzhiyun 	mutex_lock(&conn->ident_lock);
949*4882a593Smuzhiyun 
950*4882a593Smuzhiyun 	if (++conn->tx_ident > 128)
951*4882a593Smuzhiyun 		conn->tx_ident = 1;
952*4882a593Smuzhiyun 
953*4882a593Smuzhiyun 	id = conn->tx_ident;
954*4882a593Smuzhiyun 
955*4882a593Smuzhiyun 	mutex_unlock(&conn->ident_lock);
956*4882a593Smuzhiyun 
957*4882a593Smuzhiyun 	return id;
958*4882a593Smuzhiyun }
959*4882a593Smuzhiyun 
l2cap_send_cmd(struct l2cap_conn * conn,u8 ident,u8 code,u16 len,void * data)960*4882a593Smuzhiyun static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len,
961*4882a593Smuzhiyun 			   void *data)
962*4882a593Smuzhiyun {
963*4882a593Smuzhiyun 	struct sk_buff *skb = l2cap_build_cmd(conn, code, ident, len, data);
964*4882a593Smuzhiyun 	u8 flags;
965*4882a593Smuzhiyun 
966*4882a593Smuzhiyun 	BT_DBG("code 0x%2.2x", code);
967*4882a593Smuzhiyun 
968*4882a593Smuzhiyun 	if (!skb)
969*4882a593Smuzhiyun 		return;
970*4882a593Smuzhiyun 
971*4882a593Smuzhiyun 	/* Use NO_FLUSH if supported or we have an LE link (which does
972*4882a593Smuzhiyun 	 * not support auto-flushing packets) */
973*4882a593Smuzhiyun 	if (lmp_no_flush_capable(conn->hcon->hdev) ||
974*4882a593Smuzhiyun 	    conn->hcon->type == LE_LINK)
975*4882a593Smuzhiyun 		flags = ACL_START_NO_FLUSH;
976*4882a593Smuzhiyun 	else
977*4882a593Smuzhiyun 		flags = ACL_START;
978*4882a593Smuzhiyun 
979*4882a593Smuzhiyun 	bt_cb(skb)->force_active = BT_POWER_FORCE_ACTIVE_ON;
980*4882a593Smuzhiyun 	skb->priority = HCI_PRIO_MAX;
981*4882a593Smuzhiyun 
982*4882a593Smuzhiyun 	hci_send_acl(conn->hchan, skb, flags);
983*4882a593Smuzhiyun }
984*4882a593Smuzhiyun 
__chan_is_moving(struct l2cap_chan * chan)985*4882a593Smuzhiyun static bool __chan_is_moving(struct l2cap_chan *chan)
986*4882a593Smuzhiyun {
987*4882a593Smuzhiyun 	return chan->move_state != L2CAP_MOVE_STABLE &&
988*4882a593Smuzhiyun 	       chan->move_state != L2CAP_MOVE_WAIT_PREPARE;
989*4882a593Smuzhiyun }
990*4882a593Smuzhiyun 
l2cap_do_send(struct l2cap_chan * chan,struct sk_buff * skb)991*4882a593Smuzhiyun static void l2cap_do_send(struct l2cap_chan *chan, struct sk_buff *skb)
992*4882a593Smuzhiyun {
993*4882a593Smuzhiyun 	struct hci_conn *hcon = chan->conn->hcon;
994*4882a593Smuzhiyun 	u16 flags;
995*4882a593Smuzhiyun 
996*4882a593Smuzhiyun 	BT_DBG("chan %p, skb %p len %d priority %u", chan, skb, skb->len,
997*4882a593Smuzhiyun 	       skb->priority);
998*4882a593Smuzhiyun 
999*4882a593Smuzhiyun 	if (chan->hs_hcon && !__chan_is_moving(chan)) {
1000*4882a593Smuzhiyun 		if (chan->hs_hchan)
1001*4882a593Smuzhiyun 			hci_send_acl(chan->hs_hchan, skb, ACL_COMPLETE);
1002*4882a593Smuzhiyun 		else
1003*4882a593Smuzhiyun 			kfree_skb(skb);
1004*4882a593Smuzhiyun 
1005*4882a593Smuzhiyun 		return;
1006*4882a593Smuzhiyun 	}
1007*4882a593Smuzhiyun 
1008*4882a593Smuzhiyun 	/* Use NO_FLUSH for LE links (where this is the only option) or
1009*4882a593Smuzhiyun 	 * if the BR/EDR link supports it and flushing has not been
1010*4882a593Smuzhiyun 	 * explicitly requested (through FLAG_FLUSHABLE).
1011*4882a593Smuzhiyun 	 */
1012*4882a593Smuzhiyun 	if (hcon->type == LE_LINK ||
1013*4882a593Smuzhiyun 	    (!test_bit(FLAG_FLUSHABLE, &chan->flags) &&
1014*4882a593Smuzhiyun 	     lmp_no_flush_capable(hcon->hdev)))
1015*4882a593Smuzhiyun 		flags = ACL_START_NO_FLUSH;
1016*4882a593Smuzhiyun 	else
1017*4882a593Smuzhiyun 		flags = ACL_START;
1018*4882a593Smuzhiyun 
1019*4882a593Smuzhiyun 	bt_cb(skb)->force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
1020*4882a593Smuzhiyun 	hci_send_acl(chan->conn->hchan, skb, flags);
1021*4882a593Smuzhiyun }
1022*4882a593Smuzhiyun 
__unpack_enhanced_control(u16 enh,struct l2cap_ctrl * control)1023*4882a593Smuzhiyun static void __unpack_enhanced_control(u16 enh, struct l2cap_ctrl *control)
1024*4882a593Smuzhiyun {
1025*4882a593Smuzhiyun 	control->reqseq = (enh & L2CAP_CTRL_REQSEQ) >> L2CAP_CTRL_REQSEQ_SHIFT;
1026*4882a593Smuzhiyun 	control->final = (enh & L2CAP_CTRL_FINAL) >> L2CAP_CTRL_FINAL_SHIFT;
1027*4882a593Smuzhiyun 
1028*4882a593Smuzhiyun 	if (enh & L2CAP_CTRL_FRAME_TYPE) {
1029*4882a593Smuzhiyun 		/* S-Frame */
1030*4882a593Smuzhiyun 		control->sframe = 1;
1031*4882a593Smuzhiyun 		control->poll = (enh & L2CAP_CTRL_POLL) >> L2CAP_CTRL_POLL_SHIFT;
1032*4882a593Smuzhiyun 		control->super = (enh & L2CAP_CTRL_SUPERVISE) >> L2CAP_CTRL_SUPER_SHIFT;
1033*4882a593Smuzhiyun 
1034*4882a593Smuzhiyun 		control->sar = 0;
1035*4882a593Smuzhiyun 		control->txseq = 0;
1036*4882a593Smuzhiyun 	} else {
1037*4882a593Smuzhiyun 		/* I-Frame */
1038*4882a593Smuzhiyun 		control->sframe = 0;
1039*4882a593Smuzhiyun 		control->sar = (enh & L2CAP_CTRL_SAR) >> L2CAP_CTRL_SAR_SHIFT;
1040*4882a593Smuzhiyun 		control->txseq = (enh & L2CAP_CTRL_TXSEQ) >> L2CAP_CTRL_TXSEQ_SHIFT;
1041*4882a593Smuzhiyun 
1042*4882a593Smuzhiyun 		control->poll = 0;
1043*4882a593Smuzhiyun 		control->super = 0;
1044*4882a593Smuzhiyun 	}
1045*4882a593Smuzhiyun }
1046*4882a593Smuzhiyun 
__unpack_extended_control(u32 ext,struct l2cap_ctrl * control)1047*4882a593Smuzhiyun static void __unpack_extended_control(u32 ext, struct l2cap_ctrl *control)
1048*4882a593Smuzhiyun {
1049*4882a593Smuzhiyun 	control->reqseq = (ext & L2CAP_EXT_CTRL_REQSEQ) >> L2CAP_EXT_CTRL_REQSEQ_SHIFT;
1050*4882a593Smuzhiyun 	control->final = (ext & L2CAP_EXT_CTRL_FINAL) >> L2CAP_EXT_CTRL_FINAL_SHIFT;
1051*4882a593Smuzhiyun 
1052*4882a593Smuzhiyun 	if (ext & L2CAP_EXT_CTRL_FRAME_TYPE) {
1053*4882a593Smuzhiyun 		/* S-Frame */
1054*4882a593Smuzhiyun 		control->sframe = 1;
1055*4882a593Smuzhiyun 		control->poll = (ext & L2CAP_EXT_CTRL_POLL) >> L2CAP_EXT_CTRL_POLL_SHIFT;
1056*4882a593Smuzhiyun 		control->super = (ext & L2CAP_EXT_CTRL_SUPERVISE) >> L2CAP_EXT_CTRL_SUPER_SHIFT;
1057*4882a593Smuzhiyun 
1058*4882a593Smuzhiyun 		control->sar = 0;
1059*4882a593Smuzhiyun 		control->txseq = 0;
1060*4882a593Smuzhiyun 	} else {
1061*4882a593Smuzhiyun 		/* I-Frame */
1062*4882a593Smuzhiyun 		control->sframe = 0;
1063*4882a593Smuzhiyun 		control->sar = (ext & L2CAP_EXT_CTRL_SAR) >> L2CAP_EXT_CTRL_SAR_SHIFT;
1064*4882a593Smuzhiyun 		control->txseq = (ext & L2CAP_EXT_CTRL_TXSEQ) >> L2CAP_EXT_CTRL_TXSEQ_SHIFT;
1065*4882a593Smuzhiyun 
1066*4882a593Smuzhiyun 		control->poll = 0;
1067*4882a593Smuzhiyun 		control->super = 0;
1068*4882a593Smuzhiyun 	}
1069*4882a593Smuzhiyun }
1070*4882a593Smuzhiyun 
__unpack_control(struct l2cap_chan * chan,struct sk_buff * skb)1071*4882a593Smuzhiyun static inline void __unpack_control(struct l2cap_chan *chan,
1072*4882a593Smuzhiyun 				    struct sk_buff *skb)
1073*4882a593Smuzhiyun {
1074*4882a593Smuzhiyun 	if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
1075*4882a593Smuzhiyun 		__unpack_extended_control(get_unaligned_le32(skb->data),
1076*4882a593Smuzhiyun 					  &bt_cb(skb)->l2cap);
1077*4882a593Smuzhiyun 		skb_pull(skb, L2CAP_EXT_CTRL_SIZE);
1078*4882a593Smuzhiyun 	} else {
1079*4882a593Smuzhiyun 		__unpack_enhanced_control(get_unaligned_le16(skb->data),
1080*4882a593Smuzhiyun 					  &bt_cb(skb)->l2cap);
1081*4882a593Smuzhiyun 		skb_pull(skb, L2CAP_ENH_CTRL_SIZE);
1082*4882a593Smuzhiyun 	}
1083*4882a593Smuzhiyun }
1084*4882a593Smuzhiyun 
__pack_extended_control(struct l2cap_ctrl * control)1085*4882a593Smuzhiyun static u32 __pack_extended_control(struct l2cap_ctrl *control)
1086*4882a593Smuzhiyun {
1087*4882a593Smuzhiyun 	u32 packed;
1088*4882a593Smuzhiyun 
1089*4882a593Smuzhiyun 	packed = control->reqseq << L2CAP_EXT_CTRL_REQSEQ_SHIFT;
1090*4882a593Smuzhiyun 	packed |= control->final << L2CAP_EXT_CTRL_FINAL_SHIFT;
1091*4882a593Smuzhiyun 
1092*4882a593Smuzhiyun 	if (control->sframe) {
1093*4882a593Smuzhiyun 		packed |= control->poll << L2CAP_EXT_CTRL_POLL_SHIFT;
1094*4882a593Smuzhiyun 		packed |= control->super << L2CAP_EXT_CTRL_SUPER_SHIFT;
1095*4882a593Smuzhiyun 		packed |= L2CAP_EXT_CTRL_FRAME_TYPE;
1096*4882a593Smuzhiyun 	} else {
1097*4882a593Smuzhiyun 		packed |= control->sar << L2CAP_EXT_CTRL_SAR_SHIFT;
1098*4882a593Smuzhiyun 		packed |= control->txseq << L2CAP_EXT_CTRL_TXSEQ_SHIFT;
1099*4882a593Smuzhiyun 	}
1100*4882a593Smuzhiyun 
1101*4882a593Smuzhiyun 	return packed;
1102*4882a593Smuzhiyun }
1103*4882a593Smuzhiyun 
__pack_enhanced_control(struct l2cap_ctrl * control)1104*4882a593Smuzhiyun static u16 __pack_enhanced_control(struct l2cap_ctrl *control)
1105*4882a593Smuzhiyun {
1106*4882a593Smuzhiyun 	u16 packed;
1107*4882a593Smuzhiyun 
1108*4882a593Smuzhiyun 	packed = control->reqseq << L2CAP_CTRL_REQSEQ_SHIFT;
1109*4882a593Smuzhiyun 	packed |= control->final << L2CAP_CTRL_FINAL_SHIFT;
1110*4882a593Smuzhiyun 
1111*4882a593Smuzhiyun 	if (control->sframe) {
1112*4882a593Smuzhiyun 		packed |= control->poll << L2CAP_CTRL_POLL_SHIFT;
1113*4882a593Smuzhiyun 		packed |= control->super << L2CAP_CTRL_SUPER_SHIFT;
1114*4882a593Smuzhiyun 		packed |= L2CAP_CTRL_FRAME_TYPE;
1115*4882a593Smuzhiyun 	} else {
1116*4882a593Smuzhiyun 		packed |= control->sar << L2CAP_CTRL_SAR_SHIFT;
1117*4882a593Smuzhiyun 		packed |= control->txseq << L2CAP_CTRL_TXSEQ_SHIFT;
1118*4882a593Smuzhiyun 	}
1119*4882a593Smuzhiyun 
1120*4882a593Smuzhiyun 	return packed;
1121*4882a593Smuzhiyun }
1122*4882a593Smuzhiyun 
__pack_control(struct l2cap_chan * chan,struct l2cap_ctrl * control,struct sk_buff * skb)1123*4882a593Smuzhiyun static inline void __pack_control(struct l2cap_chan *chan,
1124*4882a593Smuzhiyun 				  struct l2cap_ctrl *control,
1125*4882a593Smuzhiyun 				  struct sk_buff *skb)
1126*4882a593Smuzhiyun {
1127*4882a593Smuzhiyun 	if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
1128*4882a593Smuzhiyun 		put_unaligned_le32(__pack_extended_control(control),
1129*4882a593Smuzhiyun 				   skb->data + L2CAP_HDR_SIZE);
1130*4882a593Smuzhiyun 	} else {
1131*4882a593Smuzhiyun 		put_unaligned_le16(__pack_enhanced_control(control),
1132*4882a593Smuzhiyun 				   skb->data + L2CAP_HDR_SIZE);
1133*4882a593Smuzhiyun 	}
1134*4882a593Smuzhiyun }
1135*4882a593Smuzhiyun 
__ertm_hdr_size(struct l2cap_chan * chan)1136*4882a593Smuzhiyun static inline unsigned int __ertm_hdr_size(struct l2cap_chan *chan)
1137*4882a593Smuzhiyun {
1138*4882a593Smuzhiyun 	if (test_bit(FLAG_EXT_CTRL, &chan->flags))
1139*4882a593Smuzhiyun 		return L2CAP_EXT_HDR_SIZE;
1140*4882a593Smuzhiyun 	else
1141*4882a593Smuzhiyun 		return L2CAP_ENH_HDR_SIZE;
1142*4882a593Smuzhiyun }
1143*4882a593Smuzhiyun 
l2cap_create_sframe_pdu(struct l2cap_chan * chan,u32 control)1144*4882a593Smuzhiyun static struct sk_buff *l2cap_create_sframe_pdu(struct l2cap_chan *chan,
1145*4882a593Smuzhiyun 					       u32 control)
1146*4882a593Smuzhiyun {
1147*4882a593Smuzhiyun 	struct sk_buff *skb;
1148*4882a593Smuzhiyun 	struct l2cap_hdr *lh;
1149*4882a593Smuzhiyun 	int hlen = __ertm_hdr_size(chan);
1150*4882a593Smuzhiyun 
1151*4882a593Smuzhiyun 	if (chan->fcs == L2CAP_FCS_CRC16)
1152*4882a593Smuzhiyun 		hlen += L2CAP_FCS_SIZE;
1153*4882a593Smuzhiyun 
1154*4882a593Smuzhiyun 	skb = bt_skb_alloc(hlen, GFP_KERNEL);
1155*4882a593Smuzhiyun 
1156*4882a593Smuzhiyun 	if (!skb)
1157*4882a593Smuzhiyun 		return ERR_PTR(-ENOMEM);
1158*4882a593Smuzhiyun 
1159*4882a593Smuzhiyun 	lh = skb_put(skb, L2CAP_HDR_SIZE);
1160*4882a593Smuzhiyun 	lh->len = cpu_to_le16(hlen - L2CAP_HDR_SIZE);
1161*4882a593Smuzhiyun 	lh->cid = cpu_to_le16(chan->dcid);
1162*4882a593Smuzhiyun 
1163*4882a593Smuzhiyun 	if (test_bit(FLAG_EXT_CTRL, &chan->flags))
1164*4882a593Smuzhiyun 		put_unaligned_le32(control, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
1165*4882a593Smuzhiyun 	else
1166*4882a593Smuzhiyun 		put_unaligned_le16(control, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
1167*4882a593Smuzhiyun 
1168*4882a593Smuzhiyun 	if (chan->fcs == L2CAP_FCS_CRC16) {
1169*4882a593Smuzhiyun 		u16 fcs = crc16(0, (u8 *)skb->data, skb->len);
1170*4882a593Smuzhiyun 		put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
1171*4882a593Smuzhiyun 	}
1172*4882a593Smuzhiyun 
1173*4882a593Smuzhiyun 	skb->priority = HCI_PRIO_MAX;
1174*4882a593Smuzhiyun 	return skb;
1175*4882a593Smuzhiyun }
1176*4882a593Smuzhiyun 
l2cap_send_sframe(struct l2cap_chan * chan,struct l2cap_ctrl * control)1177*4882a593Smuzhiyun static void l2cap_send_sframe(struct l2cap_chan *chan,
1178*4882a593Smuzhiyun 			      struct l2cap_ctrl *control)
1179*4882a593Smuzhiyun {
1180*4882a593Smuzhiyun 	struct sk_buff *skb;
1181*4882a593Smuzhiyun 	u32 control_field;
1182*4882a593Smuzhiyun 
1183*4882a593Smuzhiyun 	BT_DBG("chan %p, control %p", chan, control);
1184*4882a593Smuzhiyun 
1185*4882a593Smuzhiyun 	if (!control->sframe)
1186*4882a593Smuzhiyun 		return;
1187*4882a593Smuzhiyun 
1188*4882a593Smuzhiyun 	if (__chan_is_moving(chan))
1189*4882a593Smuzhiyun 		return;
1190*4882a593Smuzhiyun 
1191*4882a593Smuzhiyun 	if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state) &&
1192*4882a593Smuzhiyun 	    !control->poll)
1193*4882a593Smuzhiyun 		control->final = 1;
1194*4882a593Smuzhiyun 
1195*4882a593Smuzhiyun 	if (control->super == L2CAP_SUPER_RR)
1196*4882a593Smuzhiyun 		clear_bit(CONN_RNR_SENT, &chan->conn_state);
1197*4882a593Smuzhiyun 	else if (control->super == L2CAP_SUPER_RNR)
1198*4882a593Smuzhiyun 		set_bit(CONN_RNR_SENT, &chan->conn_state);
1199*4882a593Smuzhiyun 
1200*4882a593Smuzhiyun 	if (control->super != L2CAP_SUPER_SREJ) {
1201*4882a593Smuzhiyun 		chan->last_acked_seq = control->reqseq;
1202*4882a593Smuzhiyun 		__clear_ack_timer(chan);
1203*4882a593Smuzhiyun 	}
1204*4882a593Smuzhiyun 
1205*4882a593Smuzhiyun 	BT_DBG("reqseq %d, final %d, poll %d, super %d", control->reqseq,
1206*4882a593Smuzhiyun 	       control->final, control->poll, control->super);
1207*4882a593Smuzhiyun 
1208*4882a593Smuzhiyun 	if (test_bit(FLAG_EXT_CTRL, &chan->flags))
1209*4882a593Smuzhiyun 		control_field = __pack_extended_control(control);
1210*4882a593Smuzhiyun 	else
1211*4882a593Smuzhiyun 		control_field = __pack_enhanced_control(control);
1212*4882a593Smuzhiyun 
1213*4882a593Smuzhiyun 	skb = l2cap_create_sframe_pdu(chan, control_field);
1214*4882a593Smuzhiyun 	if (!IS_ERR(skb))
1215*4882a593Smuzhiyun 		l2cap_do_send(chan, skb);
1216*4882a593Smuzhiyun }
1217*4882a593Smuzhiyun 
l2cap_send_rr_or_rnr(struct l2cap_chan * chan,bool poll)1218*4882a593Smuzhiyun static void l2cap_send_rr_or_rnr(struct l2cap_chan *chan, bool poll)
1219*4882a593Smuzhiyun {
1220*4882a593Smuzhiyun 	struct l2cap_ctrl control;
1221*4882a593Smuzhiyun 
1222*4882a593Smuzhiyun 	BT_DBG("chan %p, poll %d", chan, poll);
1223*4882a593Smuzhiyun 
1224*4882a593Smuzhiyun 	memset(&control, 0, sizeof(control));
1225*4882a593Smuzhiyun 	control.sframe = 1;
1226*4882a593Smuzhiyun 	control.poll = poll;
1227*4882a593Smuzhiyun 
1228*4882a593Smuzhiyun 	if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
1229*4882a593Smuzhiyun 		control.super = L2CAP_SUPER_RNR;
1230*4882a593Smuzhiyun 	else
1231*4882a593Smuzhiyun 		control.super = L2CAP_SUPER_RR;
1232*4882a593Smuzhiyun 
1233*4882a593Smuzhiyun 	control.reqseq = chan->buffer_seq;
1234*4882a593Smuzhiyun 	l2cap_send_sframe(chan, &control);
1235*4882a593Smuzhiyun }
1236*4882a593Smuzhiyun 
__l2cap_no_conn_pending(struct l2cap_chan * chan)1237*4882a593Smuzhiyun static inline int __l2cap_no_conn_pending(struct l2cap_chan *chan)
1238*4882a593Smuzhiyun {
1239*4882a593Smuzhiyun 	if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED)
1240*4882a593Smuzhiyun 		return true;
1241*4882a593Smuzhiyun 
1242*4882a593Smuzhiyun 	return !test_bit(CONF_CONNECT_PEND, &chan->conf_state);
1243*4882a593Smuzhiyun }
1244*4882a593Smuzhiyun 
__amp_capable(struct l2cap_chan * chan)1245*4882a593Smuzhiyun static bool __amp_capable(struct l2cap_chan *chan)
1246*4882a593Smuzhiyun {
1247*4882a593Smuzhiyun 	struct l2cap_conn *conn = chan->conn;
1248*4882a593Smuzhiyun 	struct hci_dev *hdev;
1249*4882a593Smuzhiyun 	bool amp_available = false;
1250*4882a593Smuzhiyun 
1251*4882a593Smuzhiyun 	if (!(conn->local_fixed_chan & L2CAP_FC_A2MP))
1252*4882a593Smuzhiyun 		return false;
1253*4882a593Smuzhiyun 
1254*4882a593Smuzhiyun 	if (!(conn->remote_fixed_chan & L2CAP_FC_A2MP))
1255*4882a593Smuzhiyun 		return false;
1256*4882a593Smuzhiyun 
1257*4882a593Smuzhiyun 	read_lock(&hci_dev_list_lock);
1258*4882a593Smuzhiyun 	list_for_each_entry(hdev, &hci_dev_list, list) {
1259*4882a593Smuzhiyun 		if (hdev->amp_type != AMP_TYPE_BREDR &&
1260*4882a593Smuzhiyun 		    test_bit(HCI_UP, &hdev->flags)) {
1261*4882a593Smuzhiyun 			amp_available = true;
1262*4882a593Smuzhiyun 			break;
1263*4882a593Smuzhiyun 		}
1264*4882a593Smuzhiyun 	}
1265*4882a593Smuzhiyun 	read_unlock(&hci_dev_list_lock);
1266*4882a593Smuzhiyun 
1267*4882a593Smuzhiyun 	if (chan->chan_policy == BT_CHANNEL_POLICY_AMP_PREFERRED)
1268*4882a593Smuzhiyun 		return amp_available;
1269*4882a593Smuzhiyun 
1270*4882a593Smuzhiyun 	return false;
1271*4882a593Smuzhiyun }
1272*4882a593Smuzhiyun 
l2cap_check_efs(struct l2cap_chan * chan)1273*4882a593Smuzhiyun static bool l2cap_check_efs(struct l2cap_chan *chan)
1274*4882a593Smuzhiyun {
1275*4882a593Smuzhiyun 	/* Check EFS parameters */
1276*4882a593Smuzhiyun 	return true;
1277*4882a593Smuzhiyun }
1278*4882a593Smuzhiyun 
l2cap_send_conn_req(struct l2cap_chan * chan)1279*4882a593Smuzhiyun void l2cap_send_conn_req(struct l2cap_chan *chan)
1280*4882a593Smuzhiyun {
1281*4882a593Smuzhiyun 	struct l2cap_conn *conn = chan->conn;
1282*4882a593Smuzhiyun 	struct l2cap_conn_req req;
1283*4882a593Smuzhiyun 
1284*4882a593Smuzhiyun 	req.scid = cpu_to_le16(chan->scid);
1285*4882a593Smuzhiyun 	req.psm  = chan->psm;
1286*4882a593Smuzhiyun 
1287*4882a593Smuzhiyun 	chan->ident = l2cap_get_ident(conn);
1288*4882a593Smuzhiyun 
1289*4882a593Smuzhiyun 	set_bit(CONF_CONNECT_PEND, &chan->conf_state);
1290*4882a593Smuzhiyun 
1291*4882a593Smuzhiyun 	l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_REQ, sizeof(req), &req);
1292*4882a593Smuzhiyun }
1293*4882a593Smuzhiyun 
l2cap_send_create_chan_req(struct l2cap_chan * chan,u8 amp_id)1294*4882a593Smuzhiyun static void l2cap_send_create_chan_req(struct l2cap_chan *chan, u8 amp_id)
1295*4882a593Smuzhiyun {
1296*4882a593Smuzhiyun 	struct l2cap_create_chan_req req;
1297*4882a593Smuzhiyun 	req.scid = cpu_to_le16(chan->scid);
1298*4882a593Smuzhiyun 	req.psm  = chan->psm;
1299*4882a593Smuzhiyun 	req.amp_id = amp_id;
1300*4882a593Smuzhiyun 
1301*4882a593Smuzhiyun 	chan->ident = l2cap_get_ident(chan->conn);
1302*4882a593Smuzhiyun 
1303*4882a593Smuzhiyun 	l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_REQ,
1304*4882a593Smuzhiyun 		       sizeof(req), &req);
1305*4882a593Smuzhiyun }
1306*4882a593Smuzhiyun 
l2cap_move_setup(struct l2cap_chan * chan)1307*4882a593Smuzhiyun static void l2cap_move_setup(struct l2cap_chan *chan)
1308*4882a593Smuzhiyun {
1309*4882a593Smuzhiyun 	struct sk_buff *skb;
1310*4882a593Smuzhiyun 
1311*4882a593Smuzhiyun 	BT_DBG("chan %p", chan);
1312*4882a593Smuzhiyun 
1313*4882a593Smuzhiyun 	if (chan->mode != L2CAP_MODE_ERTM)
1314*4882a593Smuzhiyun 		return;
1315*4882a593Smuzhiyun 
1316*4882a593Smuzhiyun 	__clear_retrans_timer(chan);
1317*4882a593Smuzhiyun 	__clear_monitor_timer(chan);
1318*4882a593Smuzhiyun 	__clear_ack_timer(chan);
1319*4882a593Smuzhiyun 
1320*4882a593Smuzhiyun 	chan->retry_count = 0;
1321*4882a593Smuzhiyun 	skb_queue_walk(&chan->tx_q, skb) {
1322*4882a593Smuzhiyun 		if (bt_cb(skb)->l2cap.retries)
1323*4882a593Smuzhiyun 			bt_cb(skb)->l2cap.retries = 1;
1324*4882a593Smuzhiyun 		else
1325*4882a593Smuzhiyun 			break;
1326*4882a593Smuzhiyun 	}
1327*4882a593Smuzhiyun 
1328*4882a593Smuzhiyun 	chan->expected_tx_seq = chan->buffer_seq;
1329*4882a593Smuzhiyun 
1330*4882a593Smuzhiyun 	clear_bit(CONN_REJ_ACT, &chan->conn_state);
1331*4882a593Smuzhiyun 	clear_bit(CONN_SREJ_ACT, &chan->conn_state);
1332*4882a593Smuzhiyun 	l2cap_seq_list_clear(&chan->retrans_list);
1333*4882a593Smuzhiyun 	l2cap_seq_list_clear(&chan->srej_list);
1334*4882a593Smuzhiyun 	skb_queue_purge(&chan->srej_q);
1335*4882a593Smuzhiyun 
1336*4882a593Smuzhiyun 	chan->tx_state = L2CAP_TX_STATE_XMIT;
1337*4882a593Smuzhiyun 	chan->rx_state = L2CAP_RX_STATE_MOVE;
1338*4882a593Smuzhiyun 
1339*4882a593Smuzhiyun 	set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
1340*4882a593Smuzhiyun }
1341*4882a593Smuzhiyun 
l2cap_move_done(struct l2cap_chan * chan)1342*4882a593Smuzhiyun static void l2cap_move_done(struct l2cap_chan *chan)
1343*4882a593Smuzhiyun {
1344*4882a593Smuzhiyun 	u8 move_role = chan->move_role;
1345*4882a593Smuzhiyun 	BT_DBG("chan %p", chan);
1346*4882a593Smuzhiyun 
1347*4882a593Smuzhiyun 	chan->move_state = L2CAP_MOVE_STABLE;
1348*4882a593Smuzhiyun 	chan->move_role = L2CAP_MOVE_ROLE_NONE;
1349*4882a593Smuzhiyun 
1350*4882a593Smuzhiyun 	if (chan->mode != L2CAP_MODE_ERTM)
1351*4882a593Smuzhiyun 		return;
1352*4882a593Smuzhiyun 
1353*4882a593Smuzhiyun 	switch (move_role) {
1354*4882a593Smuzhiyun 	case L2CAP_MOVE_ROLE_INITIATOR:
1355*4882a593Smuzhiyun 		l2cap_tx(chan, NULL, NULL, L2CAP_EV_EXPLICIT_POLL);
1356*4882a593Smuzhiyun 		chan->rx_state = L2CAP_RX_STATE_WAIT_F;
1357*4882a593Smuzhiyun 		break;
1358*4882a593Smuzhiyun 	case L2CAP_MOVE_ROLE_RESPONDER:
1359*4882a593Smuzhiyun 		chan->rx_state = L2CAP_RX_STATE_WAIT_P;
1360*4882a593Smuzhiyun 		break;
1361*4882a593Smuzhiyun 	}
1362*4882a593Smuzhiyun }
1363*4882a593Smuzhiyun 
l2cap_chan_ready(struct l2cap_chan * chan)1364*4882a593Smuzhiyun static void l2cap_chan_ready(struct l2cap_chan *chan)
1365*4882a593Smuzhiyun {
1366*4882a593Smuzhiyun 	/* The channel may have already been flagged as connected in
1367*4882a593Smuzhiyun 	 * case of receiving data before the L2CAP info req/rsp
1368*4882a593Smuzhiyun 	 * procedure is complete.
1369*4882a593Smuzhiyun 	 */
1370*4882a593Smuzhiyun 	if (chan->state == BT_CONNECTED)
1371*4882a593Smuzhiyun 		return;
1372*4882a593Smuzhiyun 
1373*4882a593Smuzhiyun 	/* This clears all conf flags, including CONF_NOT_COMPLETE */
1374*4882a593Smuzhiyun 	chan->conf_state = 0;
1375*4882a593Smuzhiyun 	__clear_chan_timer(chan);
1376*4882a593Smuzhiyun 
1377*4882a593Smuzhiyun 	switch (chan->mode) {
1378*4882a593Smuzhiyun 	case L2CAP_MODE_LE_FLOWCTL:
1379*4882a593Smuzhiyun 	case L2CAP_MODE_EXT_FLOWCTL:
1380*4882a593Smuzhiyun 		if (!chan->tx_credits)
1381*4882a593Smuzhiyun 			chan->ops->suspend(chan);
1382*4882a593Smuzhiyun 		break;
1383*4882a593Smuzhiyun 	}
1384*4882a593Smuzhiyun 
1385*4882a593Smuzhiyun 	chan->state = BT_CONNECTED;
1386*4882a593Smuzhiyun 
1387*4882a593Smuzhiyun 	chan->ops->ready(chan);
1388*4882a593Smuzhiyun }
1389*4882a593Smuzhiyun 
l2cap_le_connect(struct l2cap_chan * chan)1390*4882a593Smuzhiyun static void l2cap_le_connect(struct l2cap_chan *chan)
1391*4882a593Smuzhiyun {
1392*4882a593Smuzhiyun 	struct l2cap_conn *conn = chan->conn;
1393*4882a593Smuzhiyun 	struct l2cap_le_conn_req req;
1394*4882a593Smuzhiyun 
1395*4882a593Smuzhiyun 	if (test_and_set_bit(FLAG_LE_CONN_REQ_SENT, &chan->flags))
1396*4882a593Smuzhiyun 		return;
1397*4882a593Smuzhiyun 
1398*4882a593Smuzhiyun 	if (!chan->imtu)
1399*4882a593Smuzhiyun 		chan->imtu = chan->conn->mtu;
1400*4882a593Smuzhiyun 
1401*4882a593Smuzhiyun 	l2cap_le_flowctl_init(chan, 0);
1402*4882a593Smuzhiyun 
1403*4882a593Smuzhiyun 	req.psm     = chan->psm;
1404*4882a593Smuzhiyun 	req.scid    = cpu_to_le16(chan->scid);
1405*4882a593Smuzhiyun 	req.mtu     = cpu_to_le16(chan->imtu);
1406*4882a593Smuzhiyun 	req.mps     = cpu_to_le16(chan->mps);
1407*4882a593Smuzhiyun 	req.credits = cpu_to_le16(chan->rx_credits);
1408*4882a593Smuzhiyun 
1409*4882a593Smuzhiyun 	chan->ident = l2cap_get_ident(conn);
1410*4882a593Smuzhiyun 
1411*4882a593Smuzhiyun 	l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_REQ,
1412*4882a593Smuzhiyun 		       sizeof(req), &req);
1413*4882a593Smuzhiyun }
1414*4882a593Smuzhiyun 
1415*4882a593Smuzhiyun struct l2cap_ecred_conn_data {
1416*4882a593Smuzhiyun 	struct {
1417*4882a593Smuzhiyun 		struct l2cap_ecred_conn_req req;
1418*4882a593Smuzhiyun 		__le16 scid[5];
1419*4882a593Smuzhiyun 	} __packed pdu;
1420*4882a593Smuzhiyun 	struct l2cap_chan *chan;
1421*4882a593Smuzhiyun 	struct pid *pid;
1422*4882a593Smuzhiyun 	int count;
1423*4882a593Smuzhiyun };
1424*4882a593Smuzhiyun 
l2cap_ecred_defer_connect(struct l2cap_chan * chan,void * data)1425*4882a593Smuzhiyun static void l2cap_ecred_defer_connect(struct l2cap_chan *chan, void *data)
1426*4882a593Smuzhiyun {
1427*4882a593Smuzhiyun 	struct l2cap_ecred_conn_data *conn = data;
1428*4882a593Smuzhiyun 	struct pid *pid;
1429*4882a593Smuzhiyun 
1430*4882a593Smuzhiyun 	if (chan == conn->chan)
1431*4882a593Smuzhiyun 		return;
1432*4882a593Smuzhiyun 
1433*4882a593Smuzhiyun 	if (!test_and_clear_bit(FLAG_DEFER_SETUP, &chan->flags))
1434*4882a593Smuzhiyun 		return;
1435*4882a593Smuzhiyun 
1436*4882a593Smuzhiyun 	pid = chan->ops->get_peer_pid(chan);
1437*4882a593Smuzhiyun 
1438*4882a593Smuzhiyun 	/* Only add deferred channels with the same PID/PSM */
1439*4882a593Smuzhiyun 	if (conn->pid != pid || chan->psm != conn->chan->psm || chan->ident ||
1440*4882a593Smuzhiyun 	    chan->mode != L2CAP_MODE_EXT_FLOWCTL || chan->state != BT_CONNECT)
1441*4882a593Smuzhiyun 		return;
1442*4882a593Smuzhiyun 
1443*4882a593Smuzhiyun 	if (test_and_set_bit(FLAG_ECRED_CONN_REQ_SENT, &chan->flags))
1444*4882a593Smuzhiyun 		return;
1445*4882a593Smuzhiyun 
1446*4882a593Smuzhiyun 	l2cap_ecred_init(chan, 0);
1447*4882a593Smuzhiyun 
1448*4882a593Smuzhiyun 	/* Set the same ident so we can match on the rsp */
1449*4882a593Smuzhiyun 	chan->ident = conn->chan->ident;
1450*4882a593Smuzhiyun 
1451*4882a593Smuzhiyun 	/* Include all channels deferred */
1452*4882a593Smuzhiyun 	conn->pdu.scid[conn->count] = cpu_to_le16(chan->scid);
1453*4882a593Smuzhiyun 
1454*4882a593Smuzhiyun 	conn->count++;
1455*4882a593Smuzhiyun }
1456*4882a593Smuzhiyun 
l2cap_ecred_connect(struct l2cap_chan * chan)1457*4882a593Smuzhiyun static void l2cap_ecred_connect(struct l2cap_chan *chan)
1458*4882a593Smuzhiyun {
1459*4882a593Smuzhiyun 	struct l2cap_conn *conn = chan->conn;
1460*4882a593Smuzhiyun 	struct l2cap_ecred_conn_data data;
1461*4882a593Smuzhiyun 
1462*4882a593Smuzhiyun 	if (test_bit(FLAG_DEFER_SETUP, &chan->flags))
1463*4882a593Smuzhiyun 		return;
1464*4882a593Smuzhiyun 
1465*4882a593Smuzhiyun 	if (test_and_set_bit(FLAG_ECRED_CONN_REQ_SENT, &chan->flags))
1466*4882a593Smuzhiyun 		return;
1467*4882a593Smuzhiyun 
1468*4882a593Smuzhiyun 	l2cap_ecred_init(chan, 0);
1469*4882a593Smuzhiyun 
1470*4882a593Smuzhiyun 	memset(&data, 0, sizeof(data));
1471*4882a593Smuzhiyun 	data.pdu.req.psm     = chan->psm;
1472*4882a593Smuzhiyun 	data.pdu.req.mtu     = cpu_to_le16(chan->imtu);
1473*4882a593Smuzhiyun 	data.pdu.req.mps     = cpu_to_le16(chan->mps);
1474*4882a593Smuzhiyun 	data.pdu.req.credits = cpu_to_le16(chan->rx_credits);
1475*4882a593Smuzhiyun 	data.pdu.scid[0]     = cpu_to_le16(chan->scid);
1476*4882a593Smuzhiyun 
1477*4882a593Smuzhiyun 	chan->ident = l2cap_get_ident(conn);
1478*4882a593Smuzhiyun 	data.pid = chan->ops->get_peer_pid(chan);
1479*4882a593Smuzhiyun 
1480*4882a593Smuzhiyun 	data.count = 1;
1481*4882a593Smuzhiyun 	data.chan = chan;
1482*4882a593Smuzhiyun 	data.pid = chan->ops->get_peer_pid(chan);
1483*4882a593Smuzhiyun 
1484*4882a593Smuzhiyun 	__l2cap_chan_list(conn, l2cap_ecred_defer_connect, &data);
1485*4882a593Smuzhiyun 
1486*4882a593Smuzhiyun 	l2cap_send_cmd(conn, chan->ident, L2CAP_ECRED_CONN_REQ,
1487*4882a593Smuzhiyun 		       sizeof(data.pdu.req) + data.count * sizeof(__le16),
1488*4882a593Smuzhiyun 		       &data.pdu);
1489*4882a593Smuzhiyun }
1490*4882a593Smuzhiyun 
l2cap_le_start(struct l2cap_chan * chan)1491*4882a593Smuzhiyun static void l2cap_le_start(struct l2cap_chan *chan)
1492*4882a593Smuzhiyun {
1493*4882a593Smuzhiyun 	struct l2cap_conn *conn = chan->conn;
1494*4882a593Smuzhiyun 
1495*4882a593Smuzhiyun 	if (!smp_conn_security(conn->hcon, chan->sec_level))
1496*4882a593Smuzhiyun 		return;
1497*4882a593Smuzhiyun 
1498*4882a593Smuzhiyun 	if (!chan->psm) {
1499*4882a593Smuzhiyun 		l2cap_chan_ready(chan);
1500*4882a593Smuzhiyun 		return;
1501*4882a593Smuzhiyun 	}
1502*4882a593Smuzhiyun 
1503*4882a593Smuzhiyun 	if (chan->state == BT_CONNECT) {
1504*4882a593Smuzhiyun 		if (chan->mode == L2CAP_MODE_EXT_FLOWCTL)
1505*4882a593Smuzhiyun 			l2cap_ecred_connect(chan);
1506*4882a593Smuzhiyun 		else
1507*4882a593Smuzhiyun 			l2cap_le_connect(chan);
1508*4882a593Smuzhiyun 	}
1509*4882a593Smuzhiyun }
1510*4882a593Smuzhiyun 
l2cap_start_connection(struct l2cap_chan * chan)1511*4882a593Smuzhiyun static void l2cap_start_connection(struct l2cap_chan *chan)
1512*4882a593Smuzhiyun {
1513*4882a593Smuzhiyun 	if (__amp_capable(chan)) {
1514*4882a593Smuzhiyun 		BT_DBG("chan %p AMP capable: discover AMPs", chan);
1515*4882a593Smuzhiyun 		a2mp_discover_amp(chan);
1516*4882a593Smuzhiyun 	} else if (chan->conn->hcon->type == LE_LINK) {
1517*4882a593Smuzhiyun 		l2cap_le_start(chan);
1518*4882a593Smuzhiyun 	} else {
1519*4882a593Smuzhiyun 		l2cap_send_conn_req(chan);
1520*4882a593Smuzhiyun 	}
1521*4882a593Smuzhiyun }
1522*4882a593Smuzhiyun 
l2cap_request_info(struct l2cap_conn * conn)1523*4882a593Smuzhiyun static void l2cap_request_info(struct l2cap_conn *conn)
1524*4882a593Smuzhiyun {
1525*4882a593Smuzhiyun 	struct l2cap_info_req req;
1526*4882a593Smuzhiyun 
1527*4882a593Smuzhiyun 	if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT)
1528*4882a593Smuzhiyun 		return;
1529*4882a593Smuzhiyun 
1530*4882a593Smuzhiyun 	req.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
1531*4882a593Smuzhiyun 
1532*4882a593Smuzhiyun 	conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
1533*4882a593Smuzhiyun 	conn->info_ident = l2cap_get_ident(conn);
1534*4882a593Smuzhiyun 
1535*4882a593Smuzhiyun 	schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
1536*4882a593Smuzhiyun 
1537*4882a593Smuzhiyun 	l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
1538*4882a593Smuzhiyun 		       sizeof(req), &req);
1539*4882a593Smuzhiyun }
1540*4882a593Smuzhiyun 
l2cap_check_enc_key_size(struct hci_conn * hcon)1541*4882a593Smuzhiyun static bool l2cap_check_enc_key_size(struct hci_conn *hcon)
1542*4882a593Smuzhiyun {
1543*4882a593Smuzhiyun 	/* The minimum encryption key size needs to be enforced by the
1544*4882a593Smuzhiyun 	 * host stack before establishing any L2CAP connections. The
1545*4882a593Smuzhiyun 	 * specification in theory allows a minimum of 1, but to align
1546*4882a593Smuzhiyun 	 * BR/EDR and LE transports, a minimum of 7 is chosen.
1547*4882a593Smuzhiyun 	 *
1548*4882a593Smuzhiyun 	 * This check might also be called for unencrypted connections
1549*4882a593Smuzhiyun 	 * that have no key size requirements. Ensure that the link is
1550*4882a593Smuzhiyun 	 * actually encrypted before enforcing a key size.
1551*4882a593Smuzhiyun 	 */
1552*4882a593Smuzhiyun 	return (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags) ||
1553*4882a593Smuzhiyun 		hcon->enc_key_size >= hcon->hdev->min_enc_key_size);
1554*4882a593Smuzhiyun }
1555*4882a593Smuzhiyun 
l2cap_do_start(struct l2cap_chan * chan)1556*4882a593Smuzhiyun static void l2cap_do_start(struct l2cap_chan *chan)
1557*4882a593Smuzhiyun {
1558*4882a593Smuzhiyun 	struct l2cap_conn *conn = chan->conn;
1559*4882a593Smuzhiyun 
1560*4882a593Smuzhiyun 	if (conn->hcon->type == LE_LINK) {
1561*4882a593Smuzhiyun 		l2cap_le_start(chan);
1562*4882a593Smuzhiyun 		return;
1563*4882a593Smuzhiyun 	}
1564*4882a593Smuzhiyun 
1565*4882a593Smuzhiyun 	if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT)) {
1566*4882a593Smuzhiyun 		l2cap_request_info(conn);
1567*4882a593Smuzhiyun 		return;
1568*4882a593Smuzhiyun 	}
1569*4882a593Smuzhiyun 
1570*4882a593Smuzhiyun 	if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE))
1571*4882a593Smuzhiyun 		return;
1572*4882a593Smuzhiyun 
1573*4882a593Smuzhiyun 	if (!l2cap_chan_check_security(chan, true) ||
1574*4882a593Smuzhiyun 	    !__l2cap_no_conn_pending(chan))
1575*4882a593Smuzhiyun 		return;
1576*4882a593Smuzhiyun 
1577*4882a593Smuzhiyun 	if (l2cap_check_enc_key_size(conn->hcon))
1578*4882a593Smuzhiyun 		l2cap_start_connection(chan);
1579*4882a593Smuzhiyun 	else
1580*4882a593Smuzhiyun 		__set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
1581*4882a593Smuzhiyun }
1582*4882a593Smuzhiyun 
l2cap_mode_supported(__u8 mode,__u32 feat_mask)1583*4882a593Smuzhiyun static inline int l2cap_mode_supported(__u8 mode, __u32 feat_mask)
1584*4882a593Smuzhiyun {
1585*4882a593Smuzhiyun 	u32 local_feat_mask = l2cap_feat_mask;
1586*4882a593Smuzhiyun 	if (!disable_ertm)
1587*4882a593Smuzhiyun 		local_feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING;
1588*4882a593Smuzhiyun 
1589*4882a593Smuzhiyun 	switch (mode) {
1590*4882a593Smuzhiyun 	case L2CAP_MODE_ERTM:
1591*4882a593Smuzhiyun 		return L2CAP_FEAT_ERTM & feat_mask & local_feat_mask;
1592*4882a593Smuzhiyun 	case L2CAP_MODE_STREAMING:
1593*4882a593Smuzhiyun 		return L2CAP_FEAT_STREAMING & feat_mask & local_feat_mask;
1594*4882a593Smuzhiyun 	default:
1595*4882a593Smuzhiyun 		return 0x00;
1596*4882a593Smuzhiyun 	}
1597*4882a593Smuzhiyun }
1598*4882a593Smuzhiyun 
l2cap_send_disconn_req(struct l2cap_chan * chan,int err)1599*4882a593Smuzhiyun static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err)
1600*4882a593Smuzhiyun {
1601*4882a593Smuzhiyun 	struct l2cap_conn *conn = chan->conn;
1602*4882a593Smuzhiyun 	struct l2cap_disconn_req req;
1603*4882a593Smuzhiyun 
1604*4882a593Smuzhiyun 	if (!conn)
1605*4882a593Smuzhiyun 		return;
1606*4882a593Smuzhiyun 
1607*4882a593Smuzhiyun 	if (chan->mode == L2CAP_MODE_ERTM && chan->state == BT_CONNECTED) {
1608*4882a593Smuzhiyun 		__clear_retrans_timer(chan);
1609*4882a593Smuzhiyun 		__clear_monitor_timer(chan);
1610*4882a593Smuzhiyun 		__clear_ack_timer(chan);
1611*4882a593Smuzhiyun 	}
1612*4882a593Smuzhiyun 
1613*4882a593Smuzhiyun 	if (chan->scid == L2CAP_CID_A2MP) {
1614*4882a593Smuzhiyun 		l2cap_state_change(chan, BT_DISCONN);
1615*4882a593Smuzhiyun 		return;
1616*4882a593Smuzhiyun 	}
1617*4882a593Smuzhiyun 
1618*4882a593Smuzhiyun 	req.dcid = cpu_to_le16(chan->dcid);
1619*4882a593Smuzhiyun 	req.scid = cpu_to_le16(chan->scid);
1620*4882a593Smuzhiyun 	l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_DISCONN_REQ,
1621*4882a593Smuzhiyun 		       sizeof(req), &req);
1622*4882a593Smuzhiyun 
1623*4882a593Smuzhiyun 	l2cap_state_change_and_error(chan, BT_DISCONN, err);
1624*4882a593Smuzhiyun }
1625*4882a593Smuzhiyun 
1626*4882a593Smuzhiyun /* ---- L2CAP connections ---- */
l2cap_conn_start(struct l2cap_conn * conn)1627*4882a593Smuzhiyun static void l2cap_conn_start(struct l2cap_conn *conn)
1628*4882a593Smuzhiyun {
1629*4882a593Smuzhiyun 	struct l2cap_chan *chan, *tmp;
1630*4882a593Smuzhiyun 
1631*4882a593Smuzhiyun 	BT_DBG("conn %p", conn);
1632*4882a593Smuzhiyun 
1633*4882a593Smuzhiyun 	mutex_lock(&conn->chan_lock);
1634*4882a593Smuzhiyun 
1635*4882a593Smuzhiyun 	list_for_each_entry_safe(chan, tmp, &conn->chan_l, list) {
1636*4882a593Smuzhiyun 		l2cap_chan_lock(chan);
1637*4882a593Smuzhiyun 
1638*4882a593Smuzhiyun 		if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
1639*4882a593Smuzhiyun 			l2cap_chan_ready(chan);
1640*4882a593Smuzhiyun 			l2cap_chan_unlock(chan);
1641*4882a593Smuzhiyun 			continue;
1642*4882a593Smuzhiyun 		}
1643*4882a593Smuzhiyun 
1644*4882a593Smuzhiyun 		if (chan->state == BT_CONNECT) {
1645*4882a593Smuzhiyun 			if (!l2cap_chan_check_security(chan, true) ||
1646*4882a593Smuzhiyun 			    !__l2cap_no_conn_pending(chan)) {
1647*4882a593Smuzhiyun 				l2cap_chan_unlock(chan);
1648*4882a593Smuzhiyun 				continue;
1649*4882a593Smuzhiyun 			}
1650*4882a593Smuzhiyun 
1651*4882a593Smuzhiyun 			if (!l2cap_mode_supported(chan->mode, conn->feat_mask)
1652*4882a593Smuzhiyun 			    && test_bit(CONF_STATE2_DEVICE,
1653*4882a593Smuzhiyun 					&chan->conf_state)) {
1654*4882a593Smuzhiyun 				l2cap_chan_close(chan, ECONNRESET);
1655*4882a593Smuzhiyun 				l2cap_chan_unlock(chan);
1656*4882a593Smuzhiyun 				continue;
1657*4882a593Smuzhiyun 			}
1658*4882a593Smuzhiyun 
1659*4882a593Smuzhiyun 			if (l2cap_check_enc_key_size(conn->hcon))
1660*4882a593Smuzhiyun 				l2cap_start_connection(chan);
1661*4882a593Smuzhiyun 			else
1662*4882a593Smuzhiyun 				l2cap_chan_close(chan, ECONNREFUSED);
1663*4882a593Smuzhiyun 
1664*4882a593Smuzhiyun 		} else if (chan->state == BT_CONNECT2) {
1665*4882a593Smuzhiyun 			struct l2cap_conn_rsp rsp;
1666*4882a593Smuzhiyun 			char buf[128];
1667*4882a593Smuzhiyun 			rsp.scid = cpu_to_le16(chan->dcid);
1668*4882a593Smuzhiyun 			rsp.dcid = cpu_to_le16(chan->scid);
1669*4882a593Smuzhiyun 
1670*4882a593Smuzhiyun 			if (l2cap_chan_check_security(chan, false)) {
1671*4882a593Smuzhiyun 				if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
1672*4882a593Smuzhiyun 					rsp.result = cpu_to_le16(L2CAP_CR_PEND);
1673*4882a593Smuzhiyun 					rsp.status = cpu_to_le16(L2CAP_CS_AUTHOR_PEND);
1674*4882a593Smuzhiyun 					chan->ops->defer(chan);
1675*4882a593Smuzhiyun 
1676*4882a593Smuzhiyun 				} else {
1677*4882a593Smuzhiyun 					l2cap_state_change(chan, BT_CONFIG);
1678*4882a593Smuzhiyun 					rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
1679*4882a593Smuzhiyun 					rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
1680*4882a593Smuzhiyun 				}
1681*4882a593Smuzhiyun 			} else {
1682*4882a593Smuzhiyun 				rsp.result = cpu_to_le16(L2CAP_CR_PEND);
1683*4882a593Smuzhiyun 				rsp.status = cpu_to_le16(L2CAP_CS_AUTHEN_PEND);
1684*4882a593Smuzhiyun 			}
1685*4882a593Smuzhiyun 
1686*4882a593Smuzhiyun 			l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
1687*4882a593Smuzhiyun 				       sizeof(rsp), &rsp);
1688*4882a593Smuzhiyun 
1689*4882a593Smuzhiyun 			if (test_bit(CONF_REQ_SENT, &chan->conf_state) ||
1690*4882a593Smuzhiyun 			    rsp.result != L2CAP_CR_SUCCESS) {
1691*4882a593Smuzhiyun 				l2cap_chan_unlock(chan);
1692*4882a593Smuzhiyun 				continue;
1693*4882a593Smuzhiyun 			}
1694*4882a593Smuzhiyun 
1695*4882a593Smuzhiyun 			set_bit(CONF_REQ_SENT, &chan->conf_state);
1696*4882a593Smuzhiyun 			l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
1697*4882a593Smuzhiyun 				       l2cap_build_conf_req(chan, buf, sizeof(buf)), buf);
1698*4882a593Smuzhiyun 			chan->num_conf_req++;
1699*4882a593Smuzhiyun 		}
1700*4882a593Smuzhiyun 
1701*4882a593Smuzhiyun 		l2cap_chan_unlock(chan);
1702*4882a593Smuzhiyun 	}
1703*4882a593Smuzhiyun 
1704*4882a593Smuzhiyun 	mutex_unlock(&conn->chan_lock);
1705*4882a593Smuzhiyun }
1706*4882a593Smuzhiyun 
l2cap_le_conn_ready(struct l2cap_conn * conn)1707*4882a593Smuzhiyun static void l2cap_le_conn_ready(struct l2cap_conn *conn)
1708*4882a593Smuzhiyun {
1709*4882a593Smuzhiyun 	struct hci_conn *hcon = conn->hcon;
1710*4882a593Smuzhiyun 	struct hci_dev *hdev = hcon->hdev;
1711*4882a593Smuzhiyun 
1712*4882a593Smuzhiyun 	BT_DBG("%s conn %p", hdev->name, conn);
1713*4882a593Smuzhiyun 
1714*4882a593Smuzhiyun 	/* For outgoing pairing which doesn't necessarily have an
1715*4882a593Smuzhiyun 	 * associated socket (e.g. mgmt_pair_device).
1716*4882a593Smuzhiyun 	 */
1717*4882a593Smuzhiyun 	if (hcon->out)
1718*4882a593Smuzhiyun 		smp_conn_security(hcon, hcon->pending_sec_level);
1719*4882a593Smuzhiyun 
1720*4882a593Smuzhiyun 	/* For LE peripheral connections, make sure the connection interval
1721*4882a593Smuzhiyun 	 * is in the range of the minimum and maximum interval that has
1722*4882a593Smuzhiyun 	 * been configured for this connection. If not, then trigger
1723*4882a593Smuzhiyun 	 * the connection update procedure.
1724*4882a593Smuzhiyun 	 */
1725*4882a593Smuzhiyun 	if (hcon->role == HCI_ROLE_SLAVE &&
1726*4882a593Smuzhiyun 	    (hcon->le_conn_interval < hcon->le_conn_min_interval ||
1727*4882a593Smuzhiyun 	     hcon->le_conn_interval > hcon->le_conn_max_interval)) {
1728*4882a593Smuzhiyun 		struct l2cap_conn_param_update_req req;
1729*4882a593Smuzhiyun 
1730*4882a593Smuzhiyun 		req.min = cpu_to_le16(hcon->le_conn_min_interval);
1731*4882a593Smuzhiyun 		req.max = cpu_to_le16(hcon->le_conn_max_interval);
1732*4882a593Smuzhiyun 		req.latency = cpu_to_le16(hcon->le_conn_latency);
1733*4882a593Smuzhiyun 		req.to_multiplier = cpu_to_le16(hcon->le_supv_timeout);
1734*4882a593Smuzhiyun 
1735*4882a593Smuzhiyun 		l2cap_send_cmd(conn, l2cap_get_ident(conn),
1736*4882a593Smuzhiyun 			       L2CAP_CONN_PARAM_UPDATE_REQ, sizeof(req), &req);
1737*4882a593Smuzhiyun 	}
1738*4882a593Smuzhiyun }
1739*4882a593Smuzhiyun 
l2cap_conn_ready(struct l2cap_conn * conn)1740*4882a593Smuzhiyun static void l2cap_conn_ready(struct l2cap_conn *conn)
1741*4882a593Smuzhiyun {
1742*4882a593Smuzhiyun 	struct l2cap_chan *chan;
1743*4882a593Smuzhiyun 	struct hci_conn *hcon = conn->hcon;
1744*4882a593Smuzhiyun 
1745*4882a593Smuzhiyun 	BT_DBG("conn %p", conn);
1746*4882a593Smuzhiyun 
1747*4882a593Smuzhiyun 	if (hcon->type == ACL_LINK)
1748*4882a593Smuzhiyun 		l2cap_request_info(conn);
1749*4882a593Smuzhiyun 
1750*4882a593Smuzhiyun 	mutex_lock(&conn->chan_lock);
1751*4882a593Smuzhiyun 
1752*4882a593Smuzhiyun 	list_for_each_entry(chan, &conn->chan_l, list) {
1753*4882a593Smuzhiyun 
1754*4882a593Smuzhiyun 		l2cap_chan_lock(chan);
1755*4882a593Smuzhiyun 
1756*4882a593Smuzhiyun 		if (chan->scid == L2CAP_CID_A2MP) {
1757*4882a593Smuzhiyun 			l2cap_chan_unlock(chan);
1758*4882a593Smuzhiyun 			continue;
1759*4882a593Smuzhiyun 		}
1760*4882a593Smuzhiyun 
1761*4882a593Smuzhiyun 		if (hcon->type == LE_LINK) {
1762*4882a593Smuzhiyun 			l2cap_le_start(chan);
1763*4882a593Smuzhiyun 		} else if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
1764*4882a593Smuzhiyun 			if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)
1765*4882a593Smuzhiyun 				l2cap_chan_ready(chan);
1766*4882a593Smuzhiyun 		} else if (chan->state == BT_CONNECT) {
1767*4882a593Smuzhiyun 			l2cap_do_start(chan);
1768*4882a593Smuzhiyun 		}
1769*4882a593Smuzhiyun 
1770*4882a593Smuzhiyun 		l2cap_chan_unlock(chan);
1771*4882a593Smuzhiyun 	}
1772*4882a593Smuzhiyun 
1773*4882a593Smuzhiyun 	mutex_unlock(&conn->chan_lock);
1774*4882a593Smuzhiyun 
1775*4882a593Smuzhiyun 	if (hcon->type == LE_LINK)
1776*4882a593Smuzhiyun 		l2cap_le_conn_ready(conn);
1777*4882a593Smuzhiyun 
1778*4882a593Smuzhiyun 	queue_work(hcon->hdev->workqueue, &conn->pending_rx_work);
1779*4882a593Smuzhiyun }
1780*4882a593Smuzhiyun 
1781*4882a593Smuzhiyun /* Notify sockets that we cannot guaranty reliability anymore */
l2cap_conn_unreliable(struct l2cap_conn * conn,int err)1782*4882a593Smuzhiyun static void l2cap_conn_unreliable(struct l2cap_conn *conn, int err)
1783*4882a593Smuzhiyun {
1784*4882a593Smuzhiyun 	struct l2cap_chan *chan;
1785*4882a593Smuzhiyun 
1786*4882a593Smuzhiyun 	BT_DBG("conn %p", conn);
1787*4882a593Smuzhiyun 
1788*4882a593Smuzhiyun 	mutex_lock(&conn->chan_lock);
1789*4882a593Smuzhiyun 
1790*4882a593Smuzhiyun 	list_for_each_entry(chan, &conn->chan_l, list) {
1791*4882a593Smuzhiyun 		if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
1792*4882a593Smuzhiyun 			l2cap_chan_set_err(chan, err);
1793*4882a593Smuzhiyun 	}
1794*4882a593Smuzhiyun 
1795*4882a593Smuzhiyun 	mutex_unlock(&conn->chan_lock);
1796*4882a593Smuzhiyun }
1797*4882a593Smuzhiyun 
l2cap_info_timeout(struct work_struct * work)1798*4882a593Smuzhiyun static void l2cap_info_timeout(struct work_struct *work)
1799*4882a593Smuzhiyun {
1800*4882a593Smuzhiyun 	struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
1801*4882a593Smuzhiyun 					       info_timer.work);
1802*4882a593Smuzhiyun 
1803*4882a593Smuzhiyun 	conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
1804*4882a593Smuzhiyun 	conn->info_ident = 0;
1805*4882a593Smuzhiyun 
1806*4882a593Smuzhiyun 	l2cap_conn_start(conn);
1807*4882a593Smuzhiyun }
1808*4882a593Smuzhiyun 
1809*4882a593Smuzhiyun /*
1810*4882a593Smuzhiyun  * l2cap_user
1811*4882a593Smuzhiyun  * External modules can register l2cap_user objects on l2cap_conn. The ->probe
1812*4882a593Smuzhiyun  * callback is called during registration. The ->remove callback is called
1813*4882a593Smuzhiyun  * during unregistration.
1814*4882a593Smuzhiyun  * An l2cap_user object can either be explicitly unregistered or when the
1815*4882a593Smuzhiyun  * underlying l2cap_conn object is deleted. This guarantees that l2cap->hcon,
1816*4882a593Smuzhiyun  * l2cap->hchan, .. are valid as long as the remove callback hasn't been called.
1817*4882a593Smuzhiyun  * External modules must own a reference to the l2cap_conn object if they intend
1818*4882a593Smuzhiyun  * to call l2cap_unregister_user(). The l2cap_conn object might get destroyed at
1819*4882a593Smuzhiyun  * any time if they don't.
1820*4882a593Smuzhiyun  */
1821*4882a593Smuzhiyun 
l2cap_register_user(struct l2cap_conn * conn,struct l2cap_user * user)1822*4882a593Smuzhiyun int l2cap_register_user(struct l2cap_conn *conn, struct l2cap_user *user)
1823*4882a593Smuzhiyun {
1824*4882a593Smuzhiyun 	struct hci_dev *hdev = conn->hcon->hdev;
1825*4882a593Smuzhiyun 	int ret;
1826*4882a593Smuzhiyun 
1827*4882a593Smuzhiyun 	/* We need to check whether l2cap_conn is registered. If it is not, we
1828*4882a593Smuzhiyun 	 * must not register the l2cap_user. l2cap_conn_del() is unregisters
1829*4882a593Smuzhiyun 	 * l2cap_conn objects, but doesn't provide its own locking. Instead, it
1830*4882a593Smuzhiyun 	 * relies on the parent hci_conn object to be locked. This itself relies
1831*4882a593Smuzhiyun 	 * on the hci_dev object to be locked. So we must lock the hci device
1832*4882a593Smuzhiyun 	 * here, too. */
1833*4882a593Smuzhiyun 
1834*4882a593Smuzhiyun 	hci_dev_lock(hdev);
1835*4882a593Smuzhiyun 
1836*4882a593Smuzhiyun 	if (!list_empty(&user->list)) {
1837*4882a593Smuzhiyun 		ret = -EINVAL;
1838*4882a593Smuzhiyun 		goto out_unlock;
1839*4882a593Smuzhiyun 	}
1840*4882a593Smuzhiyun 
1841*4882a593Smuzhiyun 	/* conn->hchan is NULL after l2cap_conn_del() was called */
1842*4882a593Smuzhiyun 	if (!conn->hchan) {
1843*4882a593Smuzhiyun 		ret = -ENODEV;
1844*4882a593Smuzhiyun 		goto out_unlock;
1845*4882a593Smuzhiyun 	}
1846*4882a593Smuzhiyun 
1847*4882a593Smuzhiyun 	ret = user->probe(conn, user);
1848*4882a593Smuzhiyun 	if (ret)
1849*4882a593Smuzhiyun 		goto out_unlock;
1850*4882a593Smuzhiyun 
1851*4882a593Smuzhiyun 	list_add(&user->list, &conn->users);
1852*4882a593Smuzhiyun 	ret = 0;
1853*4882a593Smuzhiyun 
1854*4882a593Smuzhiyun out_unlock:
1855*4882a593Smuzhiyun 	hci_dev_unlock(hdev);
1856*4882a593Smuzhiyun 	return ret;
1857*4882a593Smuzhiyun }
1858*4882a593Smuzhiyun EXPORT_SYMBOL(l2cap_register_user);
1859*4882a593Smuzhiyun 
l2cap_unregister_user(struct l2cap_conn * conn,struct l2cap_user * user)1860*4882a593Smuzhiyun void l2cap_unregister_user(struct l2cap_conn *conn, struct l2cap_user *user)
1861*4882a593Smuzhiyun {
1862*4882a593Smuzhiyun 	struct hci_dev *hdev = conn->hcon->hdev;
1863*4882a593Smuzhiyun 
1864*4882a593Smuzhiyun 	hci_dev_lock(hdev);
1865*4882a593Smuzhiyun 
1866*4882a593Smuzhiyun 	if (list_empty(&user->list))
1867*4882a593Smuzhiyun 		goto out_unlock;
1868*4882a593Smuzhiyun 
1869*4882a593Smuzhiyun 	list_del_init(&user->list);
1870*4882a593Smuzhiyun 	user->remove(conn, user);
1871*4882a593Smuzhiyun 
1872*4882a593Smuzhiyun out_unlock:
1873*4882a593Smuzhiyun 	hci_dev_unlock(hdev);
1874*4882a593Smuzhiyun }
1875*4882a593Smuzhiyun EXPORT_SYMBOL(l2cap_unregister_user);
1876*4882a593Smuzhiyun 
l2cap_unregister_all_users(struct l2cap_conn * conn)1877*4882a593Smuzhiyun static void l2cap_unregister_all_users(struct l2cap_conn *conn)
1878*4882a593Smuzhiyun {
1879*4882a593Smuzhiyun 	struct l2cap_user *user;
1880*4882a593Smuzhiyun 
1881*4882a593Smuzhiyun 	while (!list_empty(&conn->users)) {
1882*4882a593Smuzhiyun 		user = list_first_entry(&conn->users, struct l2cap_user, list);
1883*4882a593Smuzhiyun 		list_del_init(&user->list);
1884*4882a593Smuzhiyun 		user->remove(conn, user);
1885*4882a593Smuzhiyun 	}
1886*4882a593Smuzhiyun }
1887*4882a593Smuzhiyun 
l2cap_conn_del(struct hci_conn * hcon,int err)1888*4882a593Smuzhiyun static void l2cap_conn_del(struct hci_conn *hcon, int err)
1889*4882a593Smuzhiyun {
1890*4882a593Smuzhiyun 	struct l2cap_conn *conn = hcon->l2cap_data;
1891*4882a593Smuzhiyun 	struct l2cap_chan *chan, *l;
1892*4882a593Smuzhiyun 
1893*4882a593Smuzhiyun 	if (!conn)
1894*4882a593Smuzhiyun 		return;
1895*4882a593Smuzhiyun 
1896*4882a593Smuzhiyun 	BT_DBG("hcon %p conn %p, err %d", hcon, conn, err);
1897*4882a593Smuzhiyun 
1898*4882a593Smuzhiyun 	kfree_skb(conn->rx_skb);
1899*4882a593Smuzhiyun 
1900*4882a593Smuzhiyun 	skb_queue_purge(&conn->pending_rx);
1901*4882a593Smuzhiyun 
1902*4882a593Smuzhiyun 	/* We can not call flush_work(&conn->pending_rx_work) here since we
1903*4882a593Smuzhiyun 	 * might block if we are running on a worker from the same workqueue
1904*4882a593Smuzhiyun 	 * pending_rx_work is waiting on.
1905*4882a593Smuzhiyun 	 */
1906*4882a593Smuzhiyun 	if (work_pending(&conn->pending_rx_work))
1907*4882a593Smuzhiyun 		cancel_work_sync(&conn->pending_rx_work);
1908*4882a593Smuzhiyun 
1909*4882a593Smuzhiyun 	if (work_pending(&conn->id_addr_update_work))
1910*4882a593Smuzhiyun 		cancel_work_sync(&conn->id_addr_update_work);
1911*4882a593Smuzhiyun 
1912*4882a593Smuzhiyun 	l2cap_unregister_all_users(conn);
1913*4882a593Smuzhiyun 
1914*4882a593Smuzhiyun 	/* Force the connection to be immediately dropped */
1915*4882a593Smuzhiyun 	hcon->disc_timeout = 0;
1916*4882a593Smuzhiyun 
1917*4882a593Smuzhiyun 	mutex_lock(&conn->chan_lock);
1918*4882a593Smuzhiyun 
1919*4882a593Smuzhiyun 	/* Kill channels */
1920*4882a593Smuzhiyun 	list_for_each_entry_safe(chan, l, &conn->chan_l, list) {
1921*4882a593Smuzhiyun 		l2cap_chan_hold(chan);
1922*4882a593Smuzhiyun 		l2cap_chan_lock(chan);
1923*4882a593Smuzhiyun 
1924*4882a593Smuzhiyun 		l2cap_chan_del(chan, err);
1925*4882a593Smuzhiyun 
1926*4882a593Smuzhiyun 		chan->ops->close(chan);
1927*4882a593Smuzhiyun 
1928*4882a593Smuzhiyun 		l2cap_chan_unlock(chan);
1929*4882a593Smuzhiyun 		l2cap_chan_put(chan);
1930*4882a593Smuzhiyun 	}
1931*4882a593Smuzhiyun 
1932*4882a593Smuzhiyun 	mutex_unlock(&conn->chan_lock);
1933*4882a593Smuzhiyun 
1934*4882a593Smuzhiyun 	hci_chan_del(conn->hchan);
1935*4882a593Smuzhiyun 
1936*4882a593Smuzhiyun 	if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT)
1937*4882a593Smuzhiyun 		cancel_delayed_work_sync(&conn->info_timer);
1938*4882a593Smuzhiyun 
1939*4882a593Smuzhiyun 	hcon->l2cap_data = NULL;
1940*4882a593Smuzhiyun 	conn->hchan = NULL;
1941*4882a593Smuzhiyun 	l2cap_conn_put(conn);
1942*4882a593Smuzhiyun }
1943*4882a593Smuzhiyun 
l2cap_conn_free(struct kref * ref)1944*4882a593Smuzhiyun static void l2cap_conn_free(struct kref *ref)
1945*4882a593Smuzhiyun {
1946*4882a593Smuzhiyun 	struct l2cap_conn *conn = container_of(ref, struct l2cap_conn, ref);
1947*4882a593Smuzhiyun 
1948*4882a593Smuzhiyun 	hci_conn_put(conn->hcon);
1949*4882a593Smuzhiyun 	kfree(conn);
1950*4882a593Smuzhiyun }
1951*4882a593Smuzhiyun 
l2cap_conn_get(struct l2cap_conn * conn)1952*4882a593Smuzhiyun struct l2cap_conn *l2cap_conn_get(struct l2cap_conn *conn)
1953*4882a593Smuzhiyun {
1954*4882a593Smuzhiyun 	kref_get(&conn->ref);
1955*4882a593Smuzhiyun 	return conn;
1956*4882a593Smuzhiyun }
1957*4882a593Smuzhiyun EXPORT_SYMBOL(l2cap_conn_get);
1958*4882a593Smuzhiyun 
l2cap_conn_put(struct l2cap_conn * conn)1959*4882a593Smuzhiyun void l2cap_conn_put(struct l2cap_conn *conn)
1960*4882a593Smuzhiyun {
1961*4882a593Smuzhiyun 	kref_put(&conn->ref, l2cap_conn_free);
1962*4882a593Smuzhiyun }
1963*4882a593Smuzhiyun EXPORT_SYMBOL(l2cap_conn_put);
1964*4882a593Smuzhiyun 
1965*4882a593Smuzhiyun /* ---- Socket interface ---- */
1966*4882a593Smuzhiyun 
1967*4882a593Smuzhiyun /* Find socket with psm and source / destination bdaddr.
1968*4882a593Smuzhiyun  * Returns closest match.
1969*4882a593Smuzhiyun  */
l2cap_global_chan_by_psm(int state,__le16 psm,bdaddr_t * src,bdaddr_t * dst,u8 link_type)1970*4882a593Smuzhiyun static struct l2cap_chan *l2cap_global_chan_by_psm(int state, __le16 psm,
1971*4882a593Smuzhiyun 						   bdaddr_t *src,
1972*4882a593Smuzhiyun 						   bdaddr_t *dst,
1973*4882a593Smuzhiyun 						   u8 link_type)
1974*4882a593Smuzhiyun {
1975*4882a593Smuzhiyun 	struct l2cap_chan *c, *tmp, *c1 = NULL;
1976*4882a593Smuzhiyun 
1977*4882a593Smuzhiyun 	read_lock(&chan_list_lock);
1978*4882a593Smuzhiyun 
1979*4882a593Smuzhiyun 	list_for_each_entry_safe(c, tmp, &chan_list, global_l) {
1980*4882a593Smuzhiyun 		if (state && c->state != state)
1981*4882a593Smuzhiyun 			continue;
1982*4882a593Smuzhiyun 
1983*4882a593Smuzhiyun 		if (link_type == ACL_LINK && c->src_type != BDADDR_BREDR)
1984*4882a593Smuzhiyun 			continue;
1985*4882a593Smuzhiyun 
1986*4882a593Smuzhiyun 		if (link_type == LE_LINK && c->src_type == BDADDR_BREDR)
1987*4882a593Smuzhiyun 			continue;
1988*4882a593Smuzhiyun 
1989*4882a593Smuzhiyun 		if (c->chan_type != L2CAP_CHAN_FIXED && c->psm == psm) {
1990*4882a593Smuzhiyun 			int src_match, dst_match;
1991*4882a593Smuzhiyun 			int src_any, dst_any;
1992*4882a593Smuzhiyun 
1993*4882a593Smuzhiyun 			/* Exact match. */
1994*4882a593Smuzhiyun 			src_match = !bacmp(&c->src, src);
1995*4882a593Smuzhiyun 			dst_match = !bacmp(&c->dst, dst);
1996*4882a593Smuzhiyun 			if (src_match && dst_match) {
1997*4882a593Smuzhiyun 				if (!l2cap_chan_hold_unless_zero(c))
1998*4882a593Smuzhiyun 					continue;
1999*4882a593Smuzhiyun 
2000*4882a593Smuzhiyun 				read_unlock(&chan_list_lock);
2001*4882a593Smuzhiyun 				return c;
2002*4882a593Smuzhiyun 			}
2003*4882a593Smuzhiyun 
2004*4882a593Smuzhiyun 			/* Closest match */
2005*4882a593Smuzhiyun 			src_any = !bacmp(&c->src, BDADDR_ANY);
2006*4882a593Smuzhiyun 			dst_any = !bacmp(&c->dst, BDADDR_ANY);
2007*4882a593Smuzhiyun 			if ((src_match && dst_any) || (src_any && dst_match) ||
2008*4882a593Smuzhiyun 			    (src_any && dst_any))
2009*4882a593Smuzhiyun 				c1 = c;
2010*4882a593Smuzhiyun 		}
2011*4882a593Smuzhiyun 	}
2012*4882a593Smuzhiyun 
2013*4882a593Smuzhiyun 	if (c1)
2014*4882a593Smuzhiyun 		c1 = l2cap_chan_hold_unless_zero(c1);
2015*4882a593Smuzhiyun 
2016*4882a593Smuzhiyun 	read_unlock(&chan_list_lock);
2017*4882a593Smuzhiyun 
2018*4882a593Smuzhiyun 	return c1;
2019*4882a593Smuzhiyun }
2020*4882a593Smuzhiyun 
l2cap_monitor_timeout(struct work_struct * work)2021*4882a593Smuzhiyun static void l2cap_monitor_timeout(struct work_struct *work)
2022*4882a593Smuzhiyun {
2023*4882a593Smuzhiyun 	struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
2024*4882a593Smuzhiyun 					       monitor_timer.work);
2025*4882a593Smuzhiyun 
2026*4882a593Smuzhiyun 	BT_DBG("chan %p", chan);
2027*4882a593Smuzhiyun 
2028*4882a593Smuzhiyun 	l2cap_chan_lock(chan);
2029*4882a593Smuzhiyun 
2030*4882a593Smuzhiyun 	if (!chan->conn) {
2031*4882a593Smuzhiyun 		l2cap_chan_unlock(chan);
2032*4882a593Smuzhiyun 		l2cap_chan_put(chan);
2033*4882a593Smuzhiyun 		return;
2034*4882a593Smuzhiyun 	}
2035*4882a593Smuzhiyun 
2036*4882a593Smuzhiyun 	l2cap_tx(chan, NULL, NULL, L2CAP_EV_MONITOR_TO);
2037*4882a593Smuzhiyun 
2038*4882a593Smuzhiyun 	l2cap_chan_unlock(chan);
2039*4882a593Smuzhiyun 	l2cap_chan_put(chan);
2040*4882a593Smuzhiyun }
2041*4882a593Smuzhiyun 
l2cap_retrans_timeout(struct work_struct * work)2042*4882a593Smuzhiyun static void l2cap_retrans_timeout(struct work_struct *work)
2043*4882a593Smuzhiyun {
2044*4882a593Smuzhiyun 	struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
2045*4882a593Smuzhiyun 					       retrans_timer.work);
2046*4882a593Smuzhiyun 
2047*4882a593Smuzhiyun 	BT_DBG("chan %p", chan);
2048*4882a593Smuzhiyun 
2049*4882a593Smuzhiyun 	l2cap_chan_lock(chan);
2050*4882a593Smuzhiyun 
2051*4882a593Smuzhiyun 	if (!chan->conn) {
2052*4882a593Smuzhiyun 		l2cap_chan_unlock(chan);
2053*4882a593Smuzhiyun 		l2cap_chan_put(chan);
2054*4882a593Smuzhiyun 		return;
2055*4882a593Smuzhiyun 	}
2056*4882a593Smuzhiyun 
2057*4882a593Smuzhiyun 	l2cap_tx(chan, NULL, NULL, L2CAP_EV_RETRANS_TO);
2058*4882a593Smuzhiyun 	l2cap_chan_unlock(chan);
2059*4882a593Smuzhiyun 	l2cap_chan_put(chan);
2060*4882a593Smuzhiyun }
2061*4882a593Smuzhiyun 
l2cap_streaming_send(struct l2cap_chan * chan,struct sk_buff_head * skbs)2062*4882a593Smuzhiyun static void l2cap_streaming_send(struct l2cap_chan *chan,
2063*4882a593Smuzhiyun 				 struct sk_buff_head *skbs)
2064*4882a593Smuzhiyun {
2065*4882a593Smuzhiyun 	struct sk_buff *skb;
2066*4882a593Smuzhiyun 	struct l2cap_ctrl *control;
2067*4882a593Smuzhiyun 
2068*4882a593Smuzhiyun 	BT_DBG("chan %p, skbs %p", chan, skbs);
2069*4882a593Smuzhiyun 
2070*4882a593Smuzhiyun 	if (__chan_is_moving(chan))
2071*4882a593Smuzhiyun 		return;
2072*4882a593Smuzhiyun 
2073*4882a593Smuzhiyun 	skb_queue_splice_tail_init(skbs, &chan->tx_q);
2074*4882a593Smuzhiyun 
2075*4882a593Smuzhiyun 	while (!skb_queue_empty(&chan->tx_q)) {
2076*4882a593Smuzhiyun 
2077*4882a593Smuzhiyun 		skb = skb_dequeue(&chan->tx_q);
2078*4882a593Smuzhiyun 
2079*4882a593Smuzhiyun 		bt_cb(skb)->l2cap.retries = 1;
2080*4882a593Smuzhiyun 		control = &bt_cb(skb)->l2cap;
2081*4882a593Smuzhiyun 
2082*4882a593Smuzhiyun 		control->reqseq = 0;
2083*4882a593Smuzhiyun 		control->txseq = chan->next_tx_seq;
2084*4882a593Smuzhiyun 
2085*4882a593Smuzhiyun 		__pack_control(chan, control, skb);
2086*4882a593Smuzhiyun 
2087*4882a593Smuzhiyun 		if (chan->fcs == L2CAP_FCS_CRC16) {
2088*4882a593Smuzhiyun 			u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
2089*4882a593Smuzhiyun 			put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
2090*4882a593Smuzhiyun 		}
2091*4882a593Smuzhiyun 
2092*4882a593Smuzhiyun 		l2cap_do_send(chan, skb);
2093*4882a593Smuzhiyun 
2094*4882a593Smuzhiyun 		BT_DBG("Sent txseq %u", control->txseq);
2095*4882a593Smuzhiyun 
2096*4882a593Smuzhiyun 		chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
2097*4882a593Smuzhiyun 		chan->frames_sent++;
2098*4882a593Smuzhiyun 	}
2099*4882a593Smuzhiyun }
2100*4882a593Smuzhiyun 
l2cap_ertm_send(struct l2cap_chan * chan)2101*4882a593Smuzhiyun static int l2cap_ertm_send(struct l2cap_chan *chan)
2102*4882a593Smuzhiyun {
2103*4882a593Smuzhiyun 	struct sk_buff *skb, *tx_skb;
2104*4882a593Smuzhiyun 	struct l2cap_ctrl *control;
2105*4882a593Smuzhiyun 	int sent = 0;
2106*4882a593Smuzhiyun 
2107*4882a593Smuzhiyun 	BT_DBG("chan %p", chan);
2108*4882a593Smuzhiyun 
2109*4882a593Smuzhiyun 	if (chan->state != BT_CONNECTED)
2110*4882a593Smuzhiyun 		return -ENOTCONN;
2111*4882a593Smuzhiyun 
2112*4882a593Smuzhiyun 	if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
2113*4882a593Smuzhiyun 		return 0;
2114*4882a593Smuzhiyun 
2115*4882a593Smuzhiyun 	if (__chan_is_moving(chan))
2116*4882a593Smuzhiyun 		return 0;
2117*4882a593Smuzhiyun 
2118*4882a593Smuzhiyun 	while (chan->tx_send_head &&
2119*4882a593Smuzhiyun 	       chan->unacked_frames < chan->remote_tx_win &&
2120*4882a593Smuzhiyun 	       chan->tx_state == L2CAP_TX_STATE_XMIT) {
2121*4882a593Smuzhiyun 
2122*4882a593Smuzhiyun 		skb = chan->tx_send_head;
2123*4882a593Smuzhiyun 
2124*4882a593Smuzhiyun 		bt_cb(skb)->l2cap.retries = 1;
2125*4882a593Smuzhiyun 		control = &bt_cb(skb)->l2cap;
2126*4882a593Smuzhiyun 
2127*4882a593Smuzhiyun 		if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
2128*4882a593Smuzhiyun 			control->final = 1;
2129*4882a593Smuzhiyun 
2130*4882a593Smuzhiyun 		control->reqseq = chan->buffer_seq;
2131*4882a593Smuzhiyun 		chan->last_acked_seq = chan->buffer_seq;
2132*4882a593Smuzhiyun 		control->txseq = chan->next_tx_seq;
2133*4882a593Smuzhiyun 
2134*4882a593Smuzhiyun 		__pack_control(chan, control, skb);
2135*4882a593Smuzhiyun 
2136*4882a593Smuzhiyun 		if (chan->fcs == L2CAP_FCS_CRC16) {
2137*4882a593Smuzhiyun 			u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
2138*4882a593Smuzhiyun 			put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
2139*4882a593Smuzhiyun 		}
2140*4882a593Smuzhiyun 
2141*4882a593Smuzhiyun 		/* Clone after data has been modified. Data is assumed to be
2142*4882a593Smuzhiyun 		   read-only (for locking purposes) on cloned sk_buffs.
2143*4882a593Smuzhiyun 		 */
2144*4882a593Smuzhiyun 		tx_skb = skb_clone(skb, GFP_KERNEL);
2145*4882a593Smuzhiyun 
2146*4882a593Smuzhiyun 		if (!tx_skb)
2147*4882a593Smuzhiyun 			break;
2148*4882a593Smuzhiyun 
2149*4882a593Smuzhiyun 		__set_retrans_timer(chan);
2150*4882a593Smuzhiyun 
2151*4882a593Smuzhiyun 		chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
2152*4882a593Smuzhiyun 		chan->unacked_frames++;
2153*4882a593Smuzhiyun 		chan->frames_sent++;
2154*4882a593Smuzhiyun 		sent++;
2155*4882a593Smuzhiyun 
2156*4882a593Smuzhiyun 		if (skb_queue_is_last(&chan->tx_q, skb))
2157*4882a593Smuzhiyun 			chan->tx_send_head = NULL;
2158*4882a593Smuzhiyun 		else
2159*4882a593Smuzhiyun 			chan->tx_send_head = skb_queue_next(&chan->tx_q, skb);
2160*4882a593Smuzhiyun 
2161*4882a593Smuzhiyun 		l2cap_do_send(chan, tx_skb);
2162*4882a593Smuzhiyun 		BT_DBG("Sent txseq %u", control->txseq);
2163*4882a593Smuzhiyun 	}
2164*4882a593Smuzhiyun 
2165*4882a593Smuzhiyun 	BT_DBG("Sent %d, %u unacked, %u in ERTM queue", sent,
2166*4882a593Smuzhiyun 	       chan->unacked_frames, skb_queue_len(&chan->tx_q));
2167*4882a593Smuzhiyun 
2168*4882a593Smuzhiyun 	return sent;
2169*4882a593Smuzhiyun }
2170*4882a593Smuzhiyun 
l2cap_ertm_resend(struct l2cap_chan * chan)2171*4882a593Smuzhiyun static void l2cap_ertm_resend(struct l2cap_chan *chan)
2172*4882a593Smuzhiyun {
2173*4882a593Smuzhiyun 	struct l2cap_ctrl control;
2174*4882a593Smuzhiyun 	struct sk_buff *skb;
2175*4882a593Smuzhiyun 	struct sk_buff *tx_skb;
2176*4882a593Smuzhiyun 	u16 seq;
2177*4882a593Smuzhiyun 
2178*4882a593Smuzhiyun 	BT_DBG("chan %p", chan);
2179*4882a593Smuzhiyun 
2180*4882a593Smuzhiyun 	if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
2181*4882a593Smuzhiyun 		return;
2182*4882a593Smuzhiyun 
2183*4882a593Smuzhiyun 	if (__chan_is_moving(chan))
2184*4882a593Smuzhiyun 		return;
2185*4882a593Smuzhiyun 
2186*4882a593Smuzhiyun 	while (chan->retrans_list.head != L2CAP_SEQ_LIST_CLEAR) {
2187*4882a593Smuzhiyun 		seq = l2cap_seq_list_pop(&chan->retrans_list);
2188*4882a593Smuzhiyun 
2189*4882a593Smuzhiyun 		skb = l2cap_ertm_seq_in_queue(&chan->tx_q, seq);
2190*4882a593Smuzhiyun 		if (!skb) {
2191*4882a593Smuzhiyun 			BT_DBG("Error: Can't retransmit seq %d, frame missing",
2192*4882a593Smuzhiyun 			       seq);
2193*4882a593Smuzhiyun 			continue;
2194*4882a593Smuzhiyun 		}
2195*4882a593Smuzhiyun 
2196*4882a593Smuzhiyun 		bt_cb(skb)->l2cap.retries++;
2197*4882a593Smuzhiyun 		control = bt_cb(skb)->l2cap;
2198*4882a593Smuzhiyun 
2199*4882a593Smuzhiyun 		if (chan->max_tx != 0 &&
2200*4882a593Smuzhiyun 		    bt_cb(skb)->l2cap.retries > chan->max_tx) {
2201*4882a593Smuzhiyun 			BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
2202*4882a593Smuzhiyun 			l2cap_send_disconn_req(chan, ECONNRESET);
2203*4882a593Smuzhiyun 			l2cap_seq_list_clear(&chan->retrans_list);
2204*4882a593Smuzhiyun 			break;
2205*4882a593Smuzhiyun 		}
2206*4882a593Smuzhiyun 
2207*4882a593Smuzhiyun 		control.reqseq = chan->buffer_seq;
2208*4882a593Smuzhiyun 		if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
2209*4882a593Smuzhiyun 			control.final = 1;
2210*4882a593Smuzhiyun 		else
2211*4882a593Smuzhiyun 			control.final = 0;
2212*4882a593Smuzhiyun 
2213*4882a593Smuzhiyun 		if (skb_cloned(skb)) {
2214*4882a593Smuzhiyun 			/* Cloned sk_buffs are read-only, so we need a
2215*4882a593Smuzhiyun 			 * writeable copy
2216*4882a593Smuzhiyun 			 */
2217*4882a593Smuzhiyun 			tx_skb = skb_copy(skb, GFP_KERNEL);
2218*4882a593Smuzhiyun 		} else {
2219*4882a593Smuzhiyun 			tx_skb = skb_clone(skb, GFP_KERNEL);
2220*4882a593Smuzhiyun 		}
2221*4882a593Smuzhiyun 
2222*4882a593Smuzhiyun 		if (!tx_skb) {
2223*4882a593Smuzhiyun 			l2cap_seq_list_clear(&chan->retrans_list);
2224*4882a593Smuzhiyun 			break;
2225*4882a593Smuzhiyun 		}
2226*4882a593Smuzhiyun 
2227*4882a593Smuzhiyun 		/* Update skb contents */
2228*4882a593Smuzhiyun 		if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
2229*4882a593Smuzhiyun 			put_unaligned_le32(__pack_extended_control(&control),
2230*4882a593Smuzhiyun 					   tx_skb->data + L2CAP_HDR_SIZE);
2231*4882a593Smuzhiyun 		} else {
2232*4882a593Smuzhiyun 			put_unaligned_le16(__pack_enhanced_control(&control),
2233*4882a593Smuzhiyun 					   tx_skb->data + L2CAP_HDR_SIZE);
2234*4882a593Smuzhiyun 		}
2235*4882a593Smuzhiyun 
2236*4882a593Smuzhiyun 		/* Update FCS */
2237*4882a593Smuzhiyun 		if (chan->fcs == L2CAP_FCS_CRC16) {
2238*4882a593Smuzhiyun 			u16 fcs = crc16(0, (u8 *) tx_skb->data,
2239*4882a593Smuzhiyun 					tx_skb->len - L2CAP_FCS_SIZE);
2240*4882a593Smuzhiyun 			put_unaligned_le16(fcs, skb_tail_pointer(tx_skb) -
2241*4882a593Smuzhiyun 						L2CAP_FCS_SIZE);
2242*4882a593Smuzhiyun 		}
2243*4882a593Smuzhiyun 
2244*4882a593Smuzhiyun 		l2cap_do_send(chan, tx_skb);
2245*4882a593Smuzhiyun 
2246*4882a593Smuzhiyun 		BT_DBG("Resent txseq %d", control.txseq);
2247*4882a593Smuzhiyun 
2248*4882a593Smuzhiyun 		chan->last_acked_seq = chan->buffer_seq;
2249*4882a593Smuzhiyun 	}
2250*4882a593Smuzhiyun }
2251*4882a593Smuzhiyun 
l2cap_retransmit(struct l2cap_chan * chan,struct l2cap_ctrl * control)2252*4882a593Smuzhiyun static void l2cap_retransmit(struct l2cap_chan *chan,
2253*4882a593Smuzhiyun 			     struct l2cap_ctrl *control)
2254*4882a593Smuzhiyun {
2255*4882a593Smuzhiyun 	BT_DBG("chan %p, control %p", chan, control);
2256*4882a593Smuzhiyun 
2257*4882a593Smuzhiyun 	l2cap_seq_list_append(&chan->retrans_list, control->reqseq);
2258*4882a593Smuzhiyun 	l2cap_ertm_resend(chan);
2259*4882a593Smuzhiyun }
2260*4882a593Smuzhiyun 
l2cap_retransmit_all(struct l2cap_chan * chan,struct l2cap_ctrl * control)2261*4882a593Smuzhiyun static void l2cap_retransmit_all(struct l2cap_chan *chan,
2262*4882a593Smuzhiyun 				 struct l2cap_ctrl *control)
2263*4882a593Smuzhiyun {
2264*4882a593Smuzhiyun 	struct sk_buff *skb;
2265*4882a593Smuzhiyun 
2266*4882a593Smuzhiyun 	BT_DBG("chan %p, control %p", chan, control);
2267*4882a593Smuzhiyun 
2268*4882a593Smuzhiyun 	if (control->poll)
2269*4882a593Smuzhiyun 		set_bit(CONN_SEND_FBIT, &chan->conn_state);
2270*4882a593Smuzhiyun 
2271*4882a593Smuzhiyun 	l2cap_seq_list_clear(&chan->retrans_list);
2272*4882a593Smuzhiyun 
2273*4882a593Smuzhiyun 	if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
2274*4882a593Smuzhiyun 		return;
2275*4882a593Smuzhiyun 
2276*4882a593Smuzhiyun 	if (chan->unacked_frames) {
2277*4882a593Smuzhiyun 		skb_queue_walk(&chan->tx_q, skb) {
2278*4882a593Smuzhiyun 			if (bt_cb(skb)->l2cap.txseq == control->reqseq ||
2279*4882a593Smuzhiyun 			    skb == chan->tx_send_head)
2280*4882a593Smuzhiyun 				break;
2281*4882a593Smuzhiyun 		}
2282*4882a593Smuzhiyun 
2283*4882a593Smuzhiyun 		skb_queue_walk_from(&chan->tx_q, skb) {
2284*4882a593Smuzhiyun 			if (skb == chan->tx_send_head)
2285*4882a593Smuzhiyun 				break;
2286*4882a593Smuzhiyun 
2287*4882a593Smuzhiyun 			l2cap_seq_list_append(&chan->retrans_list,
2288*4882a593Smuzhiyun 					      bt_cb(skb)->l2cap.txseq);
2289*4882a593Smuzhiyun 		}
2290*4882a593Smuzhiyun 
2291*4882a593Smuzhiyun 		l2cap_ertm_resend(chan);
2292*4882a593Smuzhiyun 	}
2293*4882a593Smuzhiyun }
2294*4882a593Smuzhiyun 
l2cap_send_ack(struct l2cap_chan * chan)2295*4882a593Smuzhiyun static void l2cap_send_ack(struct l2cap_chan *chan)
2296*4882a593Smuzhiyun {
2297*4882a593Smuzhiyun 	struct l2cap_ctrl control;
2298*4882a593Smuzhiyun 	u16 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
2299*4882a593Smuzhiyun 					 chan->last_acked_seq);
2300*4882a593Smuzhiyun 	int threshold;
2301*4882a593Smuzhiyun 
2302*4882a593Smuzhiyun 	BT_DBG("chan %p last_acked_seq %d buffer_seq %d",
2303*4882a593Smuzhiyun 	       chan, chan->last_acked_seq, chan->buffer_seq);
2304*4882a593Smuzhiyun 
2305*4882a593Smuzhiyun 	memset(&control, 0, sizeof(control));
2306*4882a593Smuzhiyun 	control.sframe = 1;
2307*4882a593Smuzhiyun 
2308*4882a593Smuzhiyun 	if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
2309*4882a593Smuzhiyun 	    chan->rx_state == L2CAP_RX_STATE_RECV) {
2310*4882a593Smuzhiyun 		__clear_ack_timer(chan);
2311*4882a593Smuzhiyun 		control.super = L2CAP_SUPER_RNR;
2312*4882a593Smuzhiyun 		control.reqseq = chan->buffer_seq;
2313*4882a593Smuzhiyun 		l2cap_send_sframe(chan, &control);
2314*4882a593Smuzhiyun 	} else {
2315*4882a593Smuzhiyun 		if (!test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) {
2316*4882a593Smuzhiyun 			l2cap_ertm_send(chan);
2317*4882a593Smuzhiyun 			/* If any i-frames were sent, they included an ack */
2318*4882a593Smuzhiyun 			if (chan->buffer_seq == chan->last_acked_seq)
2319*4882a593Smuzhiyun 				frames_to_ack = 0;
2320*4882a593Smuzhiyun 		}
2321*4882a593Smuzhiyun 
2322*4882a593Smuzhiyun 		/* Ack now if the window is 3/4ths full.
2323*4882a593Smuzhiyun 		 * Calculate without mul or div
2324*4882a593Smuzhiyun 		 */
2325*4882a593Smuzhiyun 		threshold = chan->ack_win;
2326*4882a593Smuzhiyun 		threshold += threshold << 1;
2327*4882a593Smuzhiyun 		threshold >>= 2;
2328*4882a593Smuzhiyun 
2329*4882a593Smuzhiyun 		BT_DBG("frames_to_ack %u, threshold %d", frames_to_ack,
2330*4882a593Smuzhiyun 		       threshold);
2331*4882a593Smuzhiyun 
2332*4882a593Smuzhiyun 		if (frames_to_ack >= threshold) {
2333*4882a593Smuzhiyun 			__clear_ack_timer(chan);
2334*4882a593Smuzhiyun 			control.super = L2CAP_SUPER_RR;
2335*4882a593Smuzhiyun 			control.reqseq = chan->buffer_seq;
2336*4882a593Smuzhiyun 			l2cap_send_sframe(chan, &control);
2337*4882a593Smuzhiyun 			frames_to_ack = 0;
2338*4882a593Smuzhiyun 		}
2339*4882a593Smuzhiyun 
2340*4882a593Smuzhiyun 		if (frames_to_ack)
2341*4882a593Smuzhiyun 			__set_ack_timer(chan);
2342*4882a593Smuzhiyun 	}
2343*4882a593Smuzhiyun }
2344*4882a593Smuzhiyun 
l2cap_skbuff_fromiovec(struct l2cap_chan * chan,struct msghdr * msg,int len,int count,struct sk_buff * skb)2345*4882a593Smuzhiyun static inline int l2cap_skbuff_fromiovec(struct l2cap_chan *chan,
2346*4882a593Smuzhiyun 					 struct msghdr *msg, int len,
2347*4882a593Smuzhiyun 					 int count, struct sk_buff *skb)
2348*4882a593Smuzhiyun {
2349*4882a593Smuzhiyun 	struct l2cap_conn *conn = chan->conn;
2350*4882a593Smuzhiyun 	struct sk_buff **frag;
2351*4882a593Smuzhiyun 	int sent = 0;
2352*4882a593Smuzhiyun 
2353*4882a593Smuzhiyun 	if (!copy_from_iter_full(skb_put(skb, count), count, &msg->msg_iter))
2354*4882a593Smuzhiyun 		return -EFAULT;
2355*4882a593Smuzhiyun 
2356*4882a593Smuzhiyun 	sent += count;
2357*4882a593Smuzhiyun 	len  -= count;
2358*4882a593Smuzhiyun 
2359*4882a593Smuzhiyun 	/* Continuation fragments (no L2CAP header) */
2360*4882a593Smuzhiyun 	frag = &skb_shinfo(skb)->frag_list;
2361*4882a593Smuzhiyun 	while (len) {
2362*4882a593Smuzhiyun 		struct sk_buff *tmp;
2363*4882a593Smuzhiyun 
2364*4882a593Smuzhiyun 		count = min_t(unsigned int, conn->mtu, len);
2365*4882a593Smuzhiyun 
2366*4882a593Smuzhiyun 		tmp = chan->ops->alloc_skb(chan, 0, count,
2367*4882a593Smuzhiyun 					   msg->msg_flags & MSG_DONTWAIT);
2368*4882a593Smuzhiyun 		if (IS_ERR(tmp))
2369*4882a593Smuzhiyun 			return PTR_ERR(tmp);
2370*4882a593Smuzhiyun 
2371*4882a593Smuzhiyun 		*frag = tmp;
2372*4882a593Smuzhiyun 
2373*4882a593Smuzhiyun 		if (!copy_from_iter_full(skb_put(*frag, count), count,
2374*4882a593Smuzhiyun 				   &msg->msg_iter))
2375*4882a593Smuzhiyun 			return -EFAULT;
2376*4882a593Smuzhiyun 
2377*4882a593Smuzhiyun 		sent += count;
2378*4882a593Smuzhiyun 		len  -= count;
2379*4882a593Smuzhiyun 
2380*4882a593Smuzhiyun 		skb->len += (*frag)->len;
2381*4882a593Smuzhiyun 		skb->data_len += (*frag)->len;
2382*4882a593Smuzhiyun 
2383*4882a593Smuzhiyun 		frag = &(*frag)->next;
2384*4882a593Smuzhiyun 	}
2385*4882a593Smuzhiyun 
2386*4882a593Smuzhiyun 	return sent;
2387*4882a593Smuzhiyun }
2388*4882a593Smuzhiyun 
l2cap_create_connless_pdu(struct l2cap_chan * chan,struct msghdr * msg,size_t len)2389*4882a593Smuzhiyun static struct sk_buff *l2cap_create_connless_pdu(struct l2cap_chan *chan,
2390*4882a593Smuzhiyun 						 struct msghdr *msg, size_t len)
2391*4882a593Smuzhiyun {
2392*4882a593Smuzhiyun 	struct l2cap_conn *conn = chan->conn;
2393*4882a593Smuzhiyun 	struct sk_buff *skb;
2394*4882a593Smuzhiyun 	int err, count, hlen = L2CAP_HDR_SIZE + L2CAP_PSMLEN_SIZE;
2395*4882a593Smuzhiyun 	struct l2cap_hdr *lh;
2396*4882a593Smuzhiyun 
2397*4882a593Smuzhiyun 	BT_DBG("chan %p psm 0x%2.2x len %zu", chan,
2398*4882a593Smuzhiyun 	       __le16_to_cpu(chan->psm), len);
2399*4882a593Smuzhiyun 
2400*4882a593Smuzhiyun 	count = min_t(unsigned int, (conn->mtu - hlen), len);
2401*4882a593Smuzhiyun 
2402*4882a593Smuzhiyun 	skb = chan->ops->alloc_skb(chan, hlen, count,
2403*4882a593Smuzhiyun 				   msg->msg_flags & MSG_DONTWAIT);
2404*4882a593Smuzhiyun 	if (IS_ERR(skb))
2405*4882a593Smuzhiyun 		return skb;
2406*4882a593Smuzhiyun 
2407*4882a593Smuzhiyun 	/* Create L2CAP header */
2408*4882a593Smuzhiyun 	lh = skb_put(skb, L2CAP_HDR_SIZE);
2409*4882a593Smuzhiyun 	lh->cid = cpu_to_le16(chan->dcid);
2410*4882a593Smuzhiyun 	lh->len = cpu_to_le16(len + L2CAP_PSMLEN_SIZE);
2411*4882a593Smuzhiyun 	put_unaligned(chan->psm, (__le16 *) skb_put(skb, L2CAP_PSMLEN_SIZE));
2412*4882a593Smuzhiyun 
2413*4882a593Smuzhiyun 	err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
2414*4882a593Smuzhiyun 	if (unlikely(err < 0)) {
2415*4882a593Smuzhiyun 		kfree_skb(skb);
2416*4882a593Smuzhiyun 		return ERR_PTR(err);
2417*4882a593Smuzhiyun 	}
2418*4882a593Smuzhiyun 	return skb;
2419*4882a593Smuzhiyun }
2420*4882a593Smuzhiyun 
l2cap_create_basic_pdu(struct l2cap_chan * chan,struct msghdr * msg,size_t len)2421*4882a593Smuzhiyun static struct sk_buff *l2cap_create_basic_pdu(struct l2cap_chan *chan,
2422*4882a593Smuzhiyun 					      struct msghdr *msg, size_t len)
2423*4882a593Smuzhiyun {
2424*4882a593Smuzhiyun 	struct l2cap_conn *conn = chan->conn;
2425*4882a593Smuzhiyun 	struct sk_buff *skb;
2426*4882a593Smuzhiyun 	int err, count;
2427*4882a593Smuzhiyun 	struct l2cap_hdr *lh;
2428*4882a593Smuzhiyun 
2429*4882a593Smuzhiyun 	BT_DBG("chan %p len %zu", chan, len);
2430*4882a593Smuzhiyun 
2431*4882a593Smuzhiyun 	count = min_t(unsigned int, (conn->mtu - L2CAP_HDR_SIZE), len);
2432*4882a593Smuzhiyun 
2433*4882a593Smuzhiyun 	skb = chan->ops->alloc_skb(chan, L2CAP_HDR_SIZE, count,
2434*4882a593Smuzhiyun 				   msg->msg_flags & MSG_DONTWAIT);
2435*4882a593Smuzhiyun 	if (IS_ERR(skb))
2436*4882a593Smuzhiyun 		return skb;
2437*4882a593Smuzhiyun 
2438*4882a593Smuzhiyun 	/* Create L2CAP header */
2439*4882a593Smuzhiyun 	lh = skb_put(skb, L2CAP_HDR_SIZE);
2440*4882a593Smuzhiyun 	lh->cid = cpu_to_le16(chan->dcid);
2441*4882a593Smuzhiyun 	lh->len = cpu_to_le16(len);
2442*4882a593Smuzhiyun 
2443*4882a593Smuzhiyun 	err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
2444*4882a593Smuzhiyun 	if (unlikely(err < 0)) {
2445*4882a593Smuzhiyun 		kfree_skb(skb);
2446*4882a593Smuzhiyun 		return ERR_PTR(err);
2447*4882a593Smuzhiyun 	}
2448*4882a593Smuzhiyun 	return skb;
2449*4882a593Smuzhiyun }
2450*4882a593Smuzhiyun 
l2cap_create_iframe_pdu(struct l2cap_chan * chan,struct msghdr * msg,size_t len,u16 sdulen)2451*4882a593Smuzhiyun static struct sk_buff *l2cap_create_iframe_pdu(struct l2cap_chan *chan,
2452*4882a593Smuzhiyun 					       struct msghdr *msg, size_t len,
2453*4882a593Smuzhiyun 					       u16 sdulen)
2454*4882a593Smuzhiyun {
2455*4882a593Smuzhiyun 	struct l2cap_conn *conn = chan->conn;
2456*4882a593Smuzhiyun 	struct sk_buff *skb;
2457*4882a593Smuzhiyun 	int err, count, hlen;
2458*4882a593Smuzhiyun 	struct l2cap_hdr *lh;
2459*4882a593Smuzhiyun 
2460*4882a593Smuzhiyun 	BT_DBG("chan %p len %zu", chan, len);
2461*4882a593Smuzhiyun 
2462*4882a593Smuzhiyun 	if (!conn)
2463*4882a593Smuzhiyun 		return ERR_PTR(-ENOTCONN);
2464*4882a593Smuzhiyun 
2465*4882a593Smuzhiyun 	hlen = __ertm_hdr_size(chan);
2466*4882a593Smuzhiyun 
2467*4882a593Smuzhiyun 	if (sdulen)
2468*4882a593Smuzhiyun 		hlen += L2CAP_SDULEN_SIZE;
2469*4882a593Smuzhiyun 
2470*4882a593Smuzhiyun 	if (chan->fcs == L2CAP_FCS_CRC16)
2471*4882a593Smuzhiyun 		hlen += L2CAP_FCS_SIZE;
2472*4882a593Smuzhiyun 
2473*4882a593Smuzhiyun 	count = min_t(unsigned int, (conn->mtu - hlen), len);
2474*4882a593Smuzhiyun 
2475*4882a593Smuzhiyun 	skb = chan->ops->alloc_skb(chan, hlen, count,
2476*4882a593Smuzhiyun 				   msg->msg_flags & MSG_DONTWAIT);
2477*4882a593Smuzhiyun 	if (IS_ERR(skb))
2478*4882a593Smuzhiyun 		return skb;
2479*4882a593Smuzhiyun 
2480*4882a593Smuzhiyun 	/* Create L2CAP header */
2481*4882a593Smuzhiyun 	lh = skb_put(skb, L2CAP_HDR_SIZE);
2482*4882a593Smuzhiyun 	lh->cid = cpu_to_le16(chan->dcid);
2483*4882a593Smuzhiyun 	lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
2484*4882a593Smuzhiyun 
2485*4882a593Smuzhiyun 	/* Control header is populated later */
2486*4882a593Smuzhiyun 	if (test_bit(FLAG_EXT_CTRL, &chan->flags))
2487*4882a593Smuzhiyun 		put_unaligned_le32(0, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
2488*4882a593Smuzhiyun 	else
2489*4882a593Smuzhiyun 		put_unaligned_le16(0, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
2490*4882a593Smuzhiyun 
2491*4882a593Smuzhiyun 	if (sdulen)
2492*4882a593Smuzhiyun 		put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
2493*4882a593Smuzhiyun 
2494*4882a593Smuzhiyun 	err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
2495*4882a593Smuzhiyun 	if (unlikely(err < 0)) {
2496*4882a593Smuzhiyun 		kfree_skb(skb);
2497*4882a593Smuzhiyun 		return ERR_PTR(err);
2498*4882a593Smuzhiyun 	}
2499*4882a593Smuzhiyun 
2500*4882a593Smuzhiyun 	bt_cb(skb)->l2cap.fcs = chan->fcs;
2501*4882a593Smuzhiyun 	bt_cb(skb)->l2cap.retries = 0;
2502*4882a593Smuzhiyun 	return skb;
2503*4882a593Smuzhiyun }
2504*4882a593Smuzhiyun 
l2cap_segment_sdu(struct l2cap_chan * chan,struct sk_buff_head * seg_queue,struct msghdr * msg,size_t len)2505*4882a593Smuzhiyun static int l2cap_segment_sdu(struct l2cap_chan *chan,
2506*4882a593Smuzhiyun 			     struct sk_buff_head *seg_queue,
2507*4882a593Smuzhiyun 			     struct msghdr *msg, size_t len)
2508*4882a593Smuzhiyun {
2509*4882a593Smuzhiyun 	struct sk_buff *skb;
2510*4882a593Smuzhiyun 	u16 sdu_len;
2511*4882a593Smuzhiyun 	size_t pdu_len;
2512*4882a593Smuzhiyun 	u8 sar;
2513*4882a593Smuzhiyun 
2514*4882a593Smuzhiyun 	BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
2515*4882a593Smuzhiyun 
2516*4882a593Smuzhiyun 	/* It is critical that ERTM PDUs fit in a single HCI fragment,
2517*4882a593Smuzhiyun 	 * so fragmented skbs are not used.  The HCI layer's handling
2518*4882a593Smuzhiyun 	 * of fragmented skbs is not compatible with ERTM's queueing.
2519*4882a593Smuzhiyun 	 */
2520*4882a593Smuzhiyun 
2521*4882a593Smuzhiyun 	/* PDU size is derived from the HCI MTU */
2522*4882a593Smuzhiyun 	pdu_len = chan->conn->mtu;
2523*4882a593Smuzhiyun 
2524*4882a593Smuzhiyun 	/* Constrain PDU size for BR/EDR connections */
2525*4882a593Smuzhiyun 	if (!chan->hs_hcon)
2526*4882a593Smuzhiyun 		pdu_len = min_t(size_t, pdu_len, L2CAP_BREDR_MAX_PAYLOAD);
2527*4882a593Smuzhiyun 
2528*4882a593Smuzhiyun 	/* Adjust for largest possible L2CAP overhead. */
2529*4882a593Smuzhiyun 	if (chan->fcs)
2530*4882a593Smuzhiyun 		pdu_len -= L2CAP_FCS_SIZE;
2531*4882a593Smuzhiyun 
2532*4882a593Smuzhiyun 	pdu_len -= __ertm_hdr_size(chan);
2533*4882a593Smuzhiyun 
2534*4882a593Smuzhiyun 	/* Remote device may have requested smaller PDUs */
2535*4882a593Smuzhiyun 	pdu_len = min_t(size_t, pdu_len, chan->remote_mps);
2536*4882a593Smuzhiyun 
2537*4882a593Smuzhiyun 	if (len <= pdu_len) {
2538*4882a593Smuzhiyun 		sar = L2CAP_SAR_UNSEGMENTED;
2539*4882a593Smuzhiyun 		sdu_len = 0;
2540*4882a593Smuzhiyun 		pdu_len = len;
2541*4882a593Smuzhiyun 	} else {
2542*4882a593Smuzhiyun 		sar = L2CAP_SAR_START;
2543*4882a593Smuzhiyun 		sdu_len = len;
2544*4882a593Smuzhiyun 	}
2545*4882a593Smuzhiyun 
2546*4882a593Smuzhiyun 	while (len > 0) {
2547*4882a593Smuzhiyun 		skb = l2cap_create_iframe_pdu(chan, msg, pdu_len, sdu_len);
2548*4882a593Smuzhiyun 
2549*4882a593Smuzhiyun 		if (IS_ERR(skb)) {
2550*4882a593Smuzhiyun 			__skb_queue_purge(seg_queue);
2551*4882a593Smuzhiyun 			return PTR_ERR(skb);
2552*4882a593Smuzhiyun 		}
2553*4882a593Smuzhiyun 
2554*4882a593Smuzhiyun 		bt_cb(skb)->l2cap.sar = sar;
2555*4882a593Smuzhiyun 		__skb_queue_tail(seg_queue, skb);
2556*4882a593Smuzhiyun 
2557*4882a593Smuzhiyun 		len -= pdu_len;
2558*4882a593Smuzhiyun 		if (sdu_len)
2559*4882a593Smuzhiyun 			sdu_len = 0;
2560*4882a593Smuzhiyun 
2561*4882a593Smuzhiyun 		if (len <= pdu_len) {
2562*4882a593Smuzhiyun 			sar = L2CAP_SAR_END;
2563*4882a593Smuzhiyun 			pdu_len = len;
2564*4882a593Smuzhiyun 		} else {
2565*4882a593Smuzhiyun 			sar = L2CAP_SAR_CONTINUE;
2566*4882a593Smuzhiyun 		}
2567*4882a593Smuzhiyun 	}
2568*4882a593Smuzhiyun 
2569*4882a593Smuzhiyun 	return 0;
2570*4882a593Smuzhiyun }
2571*4882a593Smuzhiyun 
l2cap_create_le_flowctl_pdu(struct l2cap_chan * chan,struct msghdr * msg,size_t len,u16 sdulen)2572*4882a593Smuzhiyun static struct sk_buff *l2cap_create_le_flowctl_pdu(struct l2cap_chan *chan,
2573*4882a593Smuzhiyun 						   struct msghdr *msg,
2574*4882a593Smuzhiyun 						   size_t len, u16 sdulen)
2575*4882a593Smuzhiyun {
2576*4882a593Smuzhiyun 	struct l2cap_conn *conn = chan->conn;
2577*4882a593Smuzhiyun 	struct sk_buff *skb;
2578*4882a593Smuzhiyun 	int err, count, hlen;
2579*4882a593Smuzhiyun 	struct l2cap_hdr *lh;
2580*4882a593Smuzhiyun 
2581*4882a593Smuzhiyun 	BT_DBG("chan %p len %zu", chan, len);
2582*4882a593Smuzhiyun 
2583*4882a593Smuzhiyun 	if (!conn)
2584*4882a593Smuzhiyun 		return ERR_PTR(-ENOTCONN);
2585*4882a593Smuzhiyun 
2586*4882a593Smuzhiyun 	hlen = L2CAP_HDR_SIZE;
2587*4882a593Smuzhiyun 
2588*4882a593Smuzhiyun 	if (sdulen)
2589*4882a593Smuzhiyun 		hlen += L2CAP_SDULEN_SIZE;
2590*4882a593Smuzhiyun 
2591*4882a593Smuzhiyun 	count = min_t(unsigned int, (conn->mtu - hlen), len);
2592*4882a593Smuzhiyun 
2593*4882a593Smuzhiyun 	skb = chan->ops->alloc_skb(chan, hlen, count,
2594*4882a593Smuzhiyun 				   msg->msg_flags & MSG_DONTWAIT);
2595*4882a593Smuzhiyun 	if (IS_ERR(skb))
2596*4882a593Smuzhiyun 		return skb;
2597*4882a593Smuzhiyun 
2598*4882a593Smuzhiyun 	/* Create L2CAP header */
2599*4882a593Smuzhiyun 	lh = skb_put(skb, L2CAP_HDR_SIZE);
2600*4882a593Smuzhiyun 	lh->cid = cpu_to_le16(chan->dcid);
2601*4882a593Smuzhiyun 	lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
2602*4882a593Smuzhiyun 
2603*4882a593Smuzhiyun 	if (sdulen)
2604*4882a593Smuzhiyun 		put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
2605*4882a593Smuzhiyun 
2606*4882a593Smuzhiyun 	err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
2607*4882a593Smuzhiyun 	if (unlikely(err < 0)) {
2608*4882a593Smuzhiyun 		kfree_skb(skb);
2609*4882a593Smuzhiyun 		return ERR_PTR(err);
2610*4882a593Smuzhiyun 	}
2611*4882a593Smuzhiyun 
2612*4882a593Smuzhiyun 	return skb;
2613*4882a593Smuzhiyun }
2614*4882a593Smuzhiyun 
l2cap_segment_le_sdu(struct l2cap_chan * chan,struct sk_buff_head * seg_queue,struct msghdr * msg,size_t len)2615*4882a593Smuzhiyun static int l2cap_segment_le_sdu(struct l2cap_chan *chan,
2616*4882a593Smuzhiyun 				struct sk_buff_head *seg_queue,
2617*4882a593Smuzhiyun 				struct msghdr *msg, size_t len)
2618*4882a593Smuzhiyun {
2619*4882a593Smuzhiyun 	struct sk_buff *skb;
2620*4882a593Smuzhiyun 	size_t pdu_len;
2621*4882a593Smuzhiyun 	u16 sdu_len;
2622*4882a593Smuzhiyun 
2623*4882a593Smuzhiyun 	BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
2624*4882a593Smuzhiyun 
2625*4882a593Smuzhiyun 	sdu_len = len;
2626*4882a593Smuzhiyun 	pdu_len = chan->remote_mps - L2CAP_SDULEN_SIZE;
2627*4882a593Smuzhiyun 
2628*4882a593Smuzhiyun 	while (len > 0) {
2629*4882a593Smuzhiyun 		if (len <= pdu_len)
2630*4882a593Smuzhiyun 			pdu_len = len;
2631*4882a593Smuzhiyun 
2632*4882a593Smuzhiyun 		skb = l2cap_create_le_flowctl_pdu(chan, msg, pdu_len, sdu_len);
2633*4882a593Smuzhiyun 		if (IS_ERR(skb)) {
2634*4882a593Smuzhiyun 			__skb_queue_purge(seg_queue);
2635*4882a593Smuzhiyun 			return PTR_ERR(skb);
2636*4882a593Smuzhiyun 		}
2637*4882a593Smuzhiyun 
2638*4882a593Smuzhiyun 		__skb_queue_tail(seg_queue, skb);
2639*4882a593Smuzhiyun 
2640*4882a593Smuzhiyun 		len -= pdu_len;
2641*4882a593Smuzhiyun 
2642*4882a593Smuzhiyun 		if (sdu_len) {
2643*4882a593Smuzhiyun 			sdu_len = 0;
2644*4882a593Smuzhiyun 			pdu_len += L2CAP_SDULEN_SIZE;
2645*4882a593Smuzhiyun 		}
2646*4882a593Smuzhiyun 	}
2647*4882a593Smuzhiyun 
2648*4882a593Smuzhiyun 	return 0;
2649*4882a593Smuzhiyun }
2650*4882a593Smuzhiyun 
l2cap_le_flowctl_send(struct l2cap_chan * chan)2651*4882a593Smuzhiyun static void l2cap_le_flowctl_send(struct l2cap_chan *chan)
2652*4882a593Smuzhiyun {
2653*4882a593Smuzhiyun 	int sent = 0;
2654*4882a593Smuzhiyun 
2655*4882a593Smuzhiyun 	BT_DBG("chan %p", chan);
2656*4882a593Smuzhiyun 
2657*4882a593Smuzhiyun 	while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
2658*4882a593Smuzhiyun 		l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
2659*4882a593Smuzhiyun 		chan->tx_credits--;
2660*4882a593Smuzhiyun 		sent++;
2661*4882a593Smuzhiyun 	}
2662*4882a593Smuzhiyun 
2663*4882a593Smuzhiyun 	BT_DBG("Sent %d credits %u queued %u", sent, chan->tx_credits,
2664*4882a593Smuzhiyun 	       skb_queue_len(&chan->tx_q));
2665*4882a593Smuzhiyun }
2666*4882a593Smuzhiyun 
l2cap_chan_send(struct l2cap_chan * chan,struct msghdr * msg,size_t len)2667*4882a593Smuzhiyun int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len)
2668*4882a593Smuzhiyun {
2669*4882a593Smuzhiyun 	struct sk_buff *skb;
2670*4882a593Smuzhiyun 	int err;
2671*4882a593Smuzhiyun 	struct sk_buff_head seg_queue;
2672*4882a593Smuzhiyun 
2673*4882a593Smuzhiyun 	if (!chan->conn)
2674*4882a593Smuzhiyun 		return -ENOTCONN;
2675*4882a593Smuzhiyun 
2676*4882a593Smuzhiyun 	/* Connectionless channel */
2677*4882a593Smuzhiyun 	if (chan->chan_type == L2CAP_CHAN_CONN_LESS) {
2678*4882a593Smuzhiyun 		skb = l2cap_create_connless_pdu(chan, msg, len);
2679*4882a593Smuzhiyun 		if (IS_ERR(skb))
2680*4882a593Smuzhiyun 			return PTR_ERR(skb);
2681*4882a593Smuzhiyun 
2682*4882a593Smuzhiyun 		/* Channel lock is released before requesting new skb and then
2683*4882a593Smuzhiyun 		 * reacquired thus we need to recheck channel state.
2684*4882a593Smuzhiyun 		 */
2685*4882a593Smuzhiyun 		if (chan->state != BT_CONNECTED) {
2686*4882a593Smuzhiyun 			kfree_skb(skb);
2687*4882a593Smuzhiyun 			return -ENOTCONN;
2688*4882a593Smuzhiyun 		}
2689*4882a593Smuzhiyun 
2690*4882a593Smuzhiyun 		l2cap_do_send(chan, skb);
2691*4882a593Smuzhiyun 		return len;
2692*4882a593Smuzhiyun 	}
2693*4882a593Smuzhiyun 
2694*4882a593Smuzhiyun 	switch (chan->mode) {
2695*4882a593Smuzhiyun 	case L2CAP_MODE_LE_FLOWCTL:
2696*4882a593Smuzhiyun 	case L2CAP_MODE_EXT_FLOWCTL:
2697*4882a593Smuzhiyun 		/* Check outgoing MTU */
2698*4882a593Smuzhiyun 		if (len > chan->omtu)
2699*4882a593Smuzhiyun 			return -EMSGSIZE;
2700*4882a593Smuzhiyun 
2701*4882a593Smuzhiyun 		__skb_queue_head_init(&seg_queue);
2702*4882a593Smuzhiyun 
2703*4882a593Smuzhiyun 		err = l2cap_segment_le_sdu(chan, &seg_queue, msg, len);
2704*4882a593Smuzhiyun 
2705*4882a593Smuzhiyun 		if (chan->state != BT_CONNECTED) {
2706*4882a593Smuzhiyun 			__skb_queue_purge(&seg_queue);
2707*4882a593Smuzhiyun 			err = -ENOTCONN;
2708*4882a593Smuzhiyun 		}
2709*4882a593Smuzhiyun 
2710*4882a593Smuzhiyun 		if (err)
2711*4882a593Smuzhiyun 			return err;
2712*4882a593Smuzhiyun 
2713*4882a593Smuzhiyun 		skb_queue_splice_tail_init(&seg_queue, &chan->tx_q);
2714*4882a593Smuzhiyun 
2715*4882a593Smuzhiyun 		l2cap_le_flowctl_send(chan);
2716*4882a593Smuzhiyun 
2717*4882a593Smuzhiyun 		if (!chan->tx_credits)
2718*4882a593Smuzhiyun 			chan->ops->suspend(chan);
2719*4882a593Smuzhiyun 
2720*4882a593Smuzhiyun 		err = len;
2721*4882a593Smuzhiyun 
2722*4882a593Smuzhiyun 		break;
2723*4882a593Smuzhiyun 
2724*4882a593Smuzhiyun 	case L2CAP_MODE_BASIC:
2725*4882a593Smuzhiyun 		/* Check outgoing MTU */
2726*4882a593Smuzhiyun 		if (len > chan->omtu)
2727*4882a593Smuzhiyun 			return -EMSGSIZE;
2728*4882a593Smuzhiyun 
2729*4882a593Smuzhiyun 		/* Create a basic PDU */
2730*4882a593Smuzhiyun 		skb = l2cap_create_basic_pdu(chan, msg, len);
2731*4882a593Smuzhiyun 		if (IS_ERR(skb))
2732*4882a593Smuzhiyun 			return PTR_ERR(skb);
2733*4882a593Smuzhiyun 
2734*4882a593Smuzhiyun 		/* Channel lock is released before requesting new skb and then
2735*4882a593Smuzhiyun 		 * reacquired thus we need to recheck channel state.
2736*4882a593Smuzhiyun 		 */
2737*4882a593Smuzhiyun 		if (chan->state != BT_CONNECTED) {
2738*4882a593Smuzhiyun 			kfree_skb(skb);
2739*4882a593Smuzhiyun 			return -ENOTCONN;
2740*4882a593Smuzhiyun 		}
2741*4882a593Smuzhiyun 
2742*4882a593Smuzhiyun 		l2cap_do_send(chan, skb);
2743*4882a593Smuzhiyun 		err = len;
2744*4882a593Smuzhiyun 		break;
2745*4882a593Smuzhiyun 
2746*4882a593Smuzhiyun 	case L2CAP_MODE_ERTM:
2747*4882a593Smuzhiyun 	case L2CAP_MODE_STREAMING:
2748*4882a593Smuzhiyun 		/* Check outgoing MTU */
2749*4882a593Smuzhiyun 		if (len > chan->omtu) {
2750*4882a593Smuzhiyun 			err = -EMSGSIZE;
2751*4882a593Smuzhiyun 			break;
2752*4882a593Smuzhiyun 		}
2753*4882a593Smuzhiyun 
2754*4882a593Smuzhiyun 		__skb_queue_head_init(&seg_queue);
2755*4882a593Smuzhiyun 
2756*4882a593Smuzhiyun 		/* Do segmentation before calling in to the state machine,
2757*4882a593Smuzhiyun 		 * since it's possible to block while waiting for memory
2758*4882a593Smuzhiyun 		 * allocation.
2759*4882a593Smuzhiyun 		 */
2760*4882a593Smuzhiyun 		err = l2cap_segment_sdu(chan, &seg_queue, msg, len);
2761*4882a593Smuzhiyun 
2762*4882a593Smuzhiyun 		/* The channel could have been closed while segmenting,
2763*4882a593Smuzhiyun 		 * check that it is still connected.
2764*4882a593Smuzhiyun 		 */
2765*4882a593Smuzhiyun 		if (chan->state != BT_CONNECTED) {
2766*4882a593Smuzhiyun 			__skb_queue_purge(&seg_queue);
2767*4882a593Smuzhiyun 			err = -ENOTCONN;
2768*4882a593Smuzhiyun 		}
2769*4882a593Smuzhiyun 
2770*4882a593Smuzhiyun 		if (err)
2771*4882a593Smuzhiyun 			break;
2772*4882a593Smuzhiyun 
2773*4882a593Smuzhiyun 		if (chan->mode == L2CAP_MODE_ERTM)
2774*4882a593Smuzhiyun 			l2cap_tx(chan, NULL, &seg_queue, L2CAP_EV_DATA_REQUEST);
2775*4882a593Smuzhiyun 		else
2776*4882a593Smuzhiyun 			l2cap_streaming_send(chan, &seg_queue);
2777*4882a593Smuzhiyun 
2778*4882a593Smuzhiyun 		err = len;
2779*4882a593Smuzhiyun 
2780*4882a593Smuzhiyun 		/* If the skbs were not queued for sending, they'll still be in
2781*4882a593Smuzhiyun 		 * seg_queue and need to be purged.
2782*4882a593Smuzhiyun 		 */
2783*4882a593Smuzhiyun 		__skb_queue_purge(&seg_queue);
2784*4882a593Smuzhiyun 		break;
2785*4882a593Smuzhiyun 
2786*4882a593Smuzhiyun 	default:
2787*4882a593Smuzhiyun 		BT_DBG("bad state %1.1x", chan->mode);
2788*4882a593Smuzhiyun 		err = -EBADFD;
2789*4882a593Smuzhiyun 	}
2790*4882a593Smuzhiyun 
2791*4882a593Smuzhiyun 	return err;
2792*4882a593Smuzhiyun }
2793*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(l2cap_chan_send);
2794*4882a593Smuzhiyun 
l2cap_send_srej(struct l2cap_chan * chan,u16 txseq)2795*4882a593Smuzhiyun static void l2cap_send_srej(struct l2cap_chan *chan, u16 txseq)
2796*4882a593Smuzhiyun {
2797*4882a593Smuzhiyun 	struct l2cap_ctrl control;
2798*4882a593Smuzhiyun 	u16 seq;
2799*4882a593Smuzhiyun 
2800*4882a593Smuzhiyun 	BT_DBG("chan %p, txseq %u", chan, txseq);
2801*4882a593Smuzhiyun 
2802*4882a593Smuzhiyun 	memset(&control, 0, sizeof(control));
2803*4882a593Smuzhiyun 	control.sframe = 1;
2804*4882a593Smuzhiyun 	control.super = L2CAP_SUPER_SREJ;
2805*4882a593Smuzhiyun 
2806*4882a593Smuzhiyun 	for (seq = chan->expected_tx_seq; seq != txseq;
2807*4882a593Smuzhiyun 	     seq = __next_seq(chan, seq)) {
2808*4882a593Smuzhiyun 		if (!l2cap_ertm_seq_in_queue(&chan->srej_q, seq)) {
2809*4882a593Smuzhiyun 			control.reqseq = seq;
2810*4882a593Smuzhiyun 			l2cap_send_sframe(chan, &control);
2811*4882a593Smuzhiyun 			l2cap_seq_list_append(&chan->srej_list, seq);
2812*4882a593Smuzhiyun 		}
2813*4882a593Smuzhiyun 	}
2814*4882a593Smuzhiyun 
2815*4882a593Smuzhiyun 	chan->expected_tx_seq = __next_seq(chan, txseq);
2816*4882a593Smuzhiyun }
2817*4882a593Smuzhiyun 
l2cap_send_srej_tail(struct l2cap_chan * chan)2818*4882a593Smuzhiyun static void l2cap_send_srej_tail(struct l2cap_chan *chan)
2819*4882a593Smuzhiyun {
2820*4882a593Smuzhiyun 	struct l2cap_ctrl control;
2821*4882a593Smuzhiyun 
2822*4882a593Smuzhiyun 	BT_DBG("chan %p", chan);
2823*4882a593Smuzhiyun 
2824*4882a593Smuzhiyun 	if (chan->srej_list.tail == L2CAP_SEQ_LIST_CLEAR)
2825*4882a593Smuzhiyun 		return;
2826*4882a593Smuzhiyun 
2827*4882a593Smuzhiyun 	memset(&control, 0, sizeof(control));
2828*4882a593Smuzhiyun 	control.sframe = 1;
2829*4882a593Smuzhiyun 	control.super = L2CAP_SUPER_SREJ;
2830*4882a593Smuzhiyun 	control.reqseq = chan->srej_list.tail;
2831*4882a593Smuzhiyun 	l2cap_send_sframe(chan, &control);
2832*4882a593Smuzhiyun }
2833*4882a593Smuzhiyun 
l2cap_send_srej_list(struct l2cap_chan * chan,u16 txseq)2834*4882a593Smuzhiyun static void l2cap_send_srej_list(struct l2cap_chan *chan, u16 txseq)
2835*4882a593Smuzhiyun {
2836*4882a593Smuzhiyun 	struct l2cap_ctrl control;
2837*4882a593Smuzhiyun 	u16 initial_head;
2838*4882a593Smuzhiyun 	u16 seq;
2839*4882a593Smuzhiyun 
2840*4882a593Smuzhiyun 	BT_DBG("chan %p, txseq %u", chan, txseq);
2841*4882a593Smuzhiyun 
2842*4882a593Smuzhiyun 	memset(&control, 0, sizeof(control));
2843*4882a593Smuzhiyun 	control.sframe = 1;
2844*4882a593Smuzhiyun 	control.super = L2CAP_SUPER_SREJ;
2845*4882a593Smuzhiyun 
2846*4882a593Smuzhiyun 	/* Capture initial list head to allow only one pass through the list. */
2847*4882a593Smuzhiyun 	initial_head = chan->srej_list.head;
2848*4882a593Smuzhiyun 
2849*4882a593Smuzhiyun 	do {
2850*4882a593Smuzhiyun 		seq = l2cap_seq_list_pop(&chan->srej_list);
2851*4882a593Smuzhiyun 		if (seq == txseq || seq == L2CAP_SEQ_LIST_CLEAR)
2852*4882a593Smuzhiyun 			break;
2853*4882a593Smuzhiyun 
2854*4882a593Smuzhiyun 		control.reqseq = seq;
2855*4882a593Smuzhiyun 		l2cap_send_sframe(chan, &control);
2856*4882a593Smuzhiyun 		l2cap_seq_list_append(&chan->srej_list, seq);
2857*4882a593Smuzhiyun 	} while (chan->srej_list.head != initial_head);
2858*4882a593Smuzhiyun }
2859*4882a593Smuzhiyun 
l2cap_process_reqseq(struct l2cap_chan * chan,u16 reqseq)2860*4882a593Smuzhiyun static void l2cap_process_reqseq(struct l2cap_chan *chan, u16 reqseq)
2861*4882a593Smuzhiyun {
2862*4882a593Smuzhiyun 	struct sk_buff *acked_skb;
2863*4882a593Smuzhiyun 	u16 ackseq;
2864*4882a593Smuzhiyun 
2865*4882a593Smuzhiyun 	BT_DBG("chan %p, reqseq %u", chan, reqseq);
2866*4882a593Smuzhiyun 
2867*4882a593Smuzhiyun 	if (chan->unacked_frames == 0 || reqseq == chan->expected_ack_seq)
2868*4882a593Smuzhiyun 		return;
2869*4882a593Smuzhiyun 
2870*4882a593Smuzhiyun 	BT_DBG("expected_ack_seq %u, unacked_frames %u",
2871*4882a593Smuzhiyun 	       chan->expected_ack_seq, chan->unacked_frames);
2872*4882a593Smuzhiyun 
2873*4882a593Smuzhiyun 	for (ackseq = chan->expected_ack_seq; ackseq != reqseq;
2874*4882a593Smuzhiyun 	     ackseq = __next_seq(chan, ackseq)) {
2875*4882a593Smuzhiyun 
2876*4882a593Smuzhiyun 		acked_skb = l2cap_ertm_seq_in_queue(&chan->tx_q, ackseq);
2877*4882a593Smuzhiyun 		if (acked_skb) {
2878*4882a593Smuzhiyun 			skb_unlink(acked_skb, &chan->tx_q);
2879*4882a593Smuzhiyun 			kfree_skb(acked_skb);
2880*4882a593Smuzhiyun 			chan->unacked_frames--;
2881*4882a593Smuzhiyun 		}
2882*4882a593Smuzhiyun 	}
2883*4882a593Smuzhiyun 
2884*4882a593Smuzhiyun 	chan->expected_ack_seq = reqseq;
2885*4882a593Smuzhiyun 
2886*4882a593Smuzhiyun 	if (chan->unacked_frames == 0)
2887*4882a593Smuzhiyun 		__clear_retrans_timer(chan);
2888*4882a593Smuzhiyun 
2889*4882a593Smuzhiyun 	BT_DBG("unacked_frames %u", chan->unacked_frames);
2890*4882a593Smuzhiyun }
2891*4882a593Smuzhiyun 
l2cap_abort_rx_srej_sent(struct l2cap_chan * chan)2892*4882a593Smuzhiyun static void l2cap_abort_rx_srej_sent(struct l2cap_chan *chan)
2893*4882a593Smuzhiyun {
2894*4882a593Smuzhiyun 	BT_DBG("chan %p", chan);
2895*4882a593Smuzhiyun 
2896*4882a593Smuzhiyun 	chan->expected_tx_seq = chan->buffer_seq;
2897*4882a593Smuzhiyun 	l2cap_seq_list_clear(&chan->srej_list);
2898*4882a593Smuzhiyun 	skb_queue_purge(&chan->srej_q);
2899*4882a593Smuzhiyun 	chan->rx_state = L2CAP_RX_STATE_RECV;
2900*4882a593Smuzhiyun }
2901*4882a593Smuzhiyun 
l2cap_tx_state_xmit(struct l2cap_chan * chan,struct l2cap_ctrl * control,struct sk_buff_head * skbs,u8 event)2902*4882a593Smuzhiyun static void l2cap_tx_state_xmit(struct l2cap_chan *chan,
2903*4882a593Smuzhiyun 				struct l2cap_ctrl *control,
2904*4882a593Smuzhiyun 				struct sk_buff_head *skbs, u8 event)
2905*4882a593Smuzhiyun {
2906*4882a593Smuzhiyun 	BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2907*4882a593Smuzhiyun 	       event);
2908*4882a593Smuzhiyun 
2909*4882a593Smuzhiyun 	switch (event) {
2910*4882a593Smuzhiyun 	case L2CAP_EV_DATA_REQUEST:
2911*4882a593Smuzhiyun 		if (chan->tx_send_head == NULL)
2912*4882a593Smuzhiyun 			chan->tx_send_head = skb_peek(skbs);
2913*4882a593Smuzhiyun 
2914*4882a593Smuzhiyun 		skb_queue_splice_tail_init(skbs, &chan->tx_q);
2915*4882a593Smuzhiyun 		l2cap_ertm_send(chan);
2916*4882a593Smuzhiyun 		break;
2917*4882a593Smuzhiyun 	case L2CAP_EV_LOCAL_BUSY_DETECTED:
2918*4882a593Smuzhiyun 		BT_DBG("Enter LOCAL_BUSY");
2919*4882a593Smuzhiyun 		set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2920*4882a593Smuzhiyun 
2921*4882a593Smuzhiyun 		if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2922*4882a593Smuzhiyun 			/* The SREJ_SENT state must be aborted if we are to
2923*4882a593Smuzhiyun 			 * enter the LOCAL_BUSY state.
2924*4882a593Smuzhiyun 			 */
2925*4882a593Smuzhiyun 			l2cap_abort_rx_srej_sent(chan);
2926*4882a593Smuzhiyun 		}
2927*4882a593Smuzhiyun 
2928*4882a593Smuzhiyun 		l2cap_send_ack(chan);
2929*4882a593Smuzhiyun 
2930*4882a593Smuzhiyun 		break;
2931*4882a593Smuzhiyun 	case L2CAP_EV_LOCAL_BUSY_CLEAR:
2932*4882a593Smuzhiyun 		BT_DBG("Exit LOCAL_BUSY");
2933*4882a593Smuzhiyun 		clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2934*4882a593Smuzhiyun 
2935*4882a593Smuzhiyun 		if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2936*4882a593Smuzhiyun 			struct l2cap_ctrl local_control;
2937*4882a593Smuzhiyun 
2938*4882a593Smuzhiyun 			memset(&local_control, 0, sizeof(local_control));
2939*4882a593Smuzhiyun 			local_control.sframe = 1;
2940*4882a593Smuzhiyun 			local_control.super = L2CAP_SUPER_RR;
2941*4882a593Smuzhiyun 			local_control.poll = 1;
2942*4882a593Smuzhiyun 			local_control.reqseq = chan->buffer_seq;
2943*4882a593Smuzhiyun 			l2cap_send_sframe(chan, &local_control);
2944*4882a593Smuzhiyun 
2945*4882a593Smuzhiyun 			chan->retry_count = 1;
2946*4882a593Smuzhiyun 			__set_monitor_timer(chan);
2947*4882a593Smuzhiyun 			chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2948*4882a593Smuzhiyun 		}
2949*4882a593Smuzhiyun 		break;
2950*4882a593Smuzhiyun 	case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2951*4882a593Smuzhiyun 		l2cap_process_reqseq(chan, control->reqseq);
2952*4882a593Smuzhiyun 		break;
2953*4882a593Smuzhiyun 	case L2CAP_EV_EXPLICIT_POLL:
2954*4882a593Smuzhiyun 		l2cap_send_rr_or_rnr(chan, 1);
2955*4882a593Smuzhiyun 		chan->retry_count = 1;
2956*4882a593Smuzhiyun 		__set_monitor_timer(chan);
2957*4882a593Smuzhiyun 		__clear_ack_timer(chan);
2958*4882a593Smuzhiyun 		chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2959*4882a593Smuzhiyun 		break;
2960*4882a593Smuzhiyun 	case L2CAP_EV_RETRANS_TO:
2961*4882a593Smuzhiyun 		l2cap_send_rr_or_rnr(chan, 1);
2962*4882a593Smuzhiyun 		chan->retry_count = 1;
2963*4882a593Smuzhiyun 		__set_monitor_timer(chan);
2964*4882a593Smuzhiyun 		chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2965*4882a593Smuzhiyun 		break;
2966*4882a593Smuzhiyun 	case L2CAP_EV_RECV_FBIT:
2967*4882a593Smuzhiyun 		/* Nothing to process */
2968*4882a593Smuzhiyun 		break;
2969*4882a593Smuzhiyun 	default:
2970*4882a593Smuzhiyun 		break;
2971*4882a593Smuzhiyun 	}
2972*4882a593Smuzhiyun }
2973*4882a593Smuzhiyun 
l2cap_tx_state_wait_f(struct l2cap_chan * chan,struct l2cap_ctrl * control,struct sk_buff_head * skbs,u8 event)2974*4882a593Smuzhiyun static void l2cap_tx_state_wait_f(struct l2cap_chan *chan,
2975*4882a593Smuzhiyun 				  struct l2cap_ctrl *control,
2976*4882a593Smuzhiyun 				  struct sk_buff_head *skbs, u8 event)
2977*4882a593Smuzhiyun {
2978*4882a593Smuzhiyun 	BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2979*4882a593Smuzhiyun 	       event);
2980*4882a593Smuzhiyun 
2981*4882a593Smuzhiyun 	switch (event) {
2982*4882a593Smuzhiyun 	case L2CAP_EV_DATA_REQUEST:
2983*4882a593Smuzhiyun 		if (chan->tx_send_head == NULL)
2984*4882a593Smuzhiyun 			chan->tx_send_head = skb_peek(skbs);
2985*4882a593Smuzhiyun 		/* Queue data, but don't send. */
2986*4882a593Smuzhiyun 		skb_queue_splice_tail_init(skbs, &chan->tx_q);
2987*4882a593Smuzhiyun 		break;
2988*4882a593Smuzhiyun 	case L2CAP_EV_LOCAL_BUSY_DETECTED:
2989*4882a593Smuzhiyun 		BT_DBG("Enter LOCAL_BUSY");
2990*4882a593Smuzhiyun 		set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2991*4882a593Smuzhiyun 
2992*4882a593Smuzhiyun 		if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2993*4882a593Smuzhiyun 			/* The SREJ_SENT state must be aborted if we are to
2994*4882a593Smuzhiyun 			 * enter the LOCAL_BUSY state.
2995*4882a593Smuzhiyun 			 */
2996*4882a593Smuzhiyun 			l2cap_abort_rx_srej_sent(chan);
2997*4882a593Smuzhiyun 		}
2998*4882a593Smuzhiyun 
2999*4882a593Smuzhiyun 		l2cap_send_ack(chan);
3000*4882a593Smuzhiyun 
3001*4882a593Smuzhiyun 		break;
3002*4882a593Smuzhiyun 	case L2CAP_EV_LOCAL_BUSY_CLEAR:
3003*4882a593Smuzhiyun 		BT_DBG("Exit LOCAL_BUSY");
3004*4882a593Smuzhiyun 		clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
3005*4882a593Smuzhiyun 
3006*4882a593Smuzhiyun 		if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
3007*4882a593Smuzhiyun 			struct l2cap_ctrl local_control;
3008*4882a593Smuzhiyun 			memset(&local_control, 0, sizeof(local_control));
3009*4882a593Smuzhiyun 			local_control.sframe = 1;
3010*4882a593Smuzhiyun 			local_control.super = L2CAP_SUPER_RR;
3011*4882a593Smuzhiyun 			local_control.poll = 1;
3012*4882a593Smuzhiyun 			local_control.reqseq = chan->buffer_seq;
3013*4882a593Smuzhiyun 			l2cap_send_sframe(chan, &local_control);
3014*4882a593Smuzhiyun 
3015*4882a593Smuzhiyun 			chan->retry_count = 1;
3016*4882a593Smuzhiyun 			__set_monitor_timer(chan);
3017*4882a593Smuzhiyun 			chan->tx_state = L2CAP_TX_STATE_WAIT_F;
3018*4882a593Smuzhiyun 		}
3019*4882a593Smuzhiyun 		break;
3020*4882a593Smuzhiyun 	case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
3021*4882a593Smuzhiyun 		l2cap_process_reqseq(chan, control->reqseq);
3022*4882a593Smuzhiyun 		fallthrough;
3023*4882a593Smuzhiyun 
3024*4882a593Smuzhiyun 	case L2CAP_EV_RECV_FBIT:
3025*4882a593Smuzhiyun 		if (control && control->final) {
3026*4882a593Smuzhiyun 			__clear_monitor_timer(chan);
3027*4882a593Smuzhiyun 			if (chan->unacked_frames > 0)
3028*4882a593Smuzhiyun 				__set_retrans_timer(chan);
3029*4882a593Smuzhiyun 			chan->retry_count = 0;
3030*4882a593Smuzhiyun 			chan->tx_state = L2CAP_TX_STATE_XMIT;
3031*4882a593Smuzhiyun 			BT_DBG("recv fbit tx_state 0x2.2%x", chan->tx_state);
3032*4882a593Smuzhiyun 		}
3033*4882a593Smuzhiyun 		break;
3034*4882a593Smuzhiyun 	case L2CAP_EV_EXPLICIT_POLL:
3035*4882a593Smuzhiyun 		/* Ignore */
3036*4882a593Smuzhiyun 		break;
3037*4882a593Smuzhiyun 	case L2CAP_EV_MONITOR_TO:
3038*4882a593Smuzhiyun 		if (chan->max_tx == 0 || chan->retry_count < chan->max_tx) {
3039*4882a593Smuzhiyun 			l2cap_send_rr_or_rnr(chan, 1);
3040*4882a593Smuzhiyun 			__set_monitor_timer(chan);
3041*4882a593Smuzhiyun 			chan->retry_count++;
3042*4882a593Smuzhiyun 		} else {
3043*4882a593Smuzhiyun 			l2cap_send_disconn_req(chan, ECONNABORTED);
3044*4882a593Smuzhiyun 		}
3045*4882a593Smuzhiyun 		break;
3046*4882a593Smuzhiyun 	default:
3047*4882a593Smuzhiyun 		break;
3048*4882a593Smuzhiyun 	}
3049*4882a593Smuzhiyun }
3050*4882a593Smuzhiyun 
l2cap_tx(struct l2cap_chan * chan,struct l2cap_ctrl * control,struct sk_buff_head * skbs,u8 event)3051*4882a593Smuzhiyun static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
3052*4882a593Smuzhiyun 		     struct sk_buff_head *skbs, u8 event)
3053*4882a593Smuzhiyun {
3054*4882a593Smuzhiyun 	BT_DBG("chan %p, control %p, skbs %p, event %d, state %d",
3055*4882a593Smuzhiyun 	       chan, control, skbs, event, chan->tx_state);
3056*4882a593Smuzhiyun 
3057*4882a593Smuzhiyun 	switch (chan->tx_state) {
3058*4882a593Smuzhiyun 	case L2CAP_TX_STATE_XMIT:
3059*4882a593Smuzhiyun 		l2cap_tx_state_xmit(chan, control, skbs, event);
3060*4882a593Smuzhiyun 		break;
3061*4882a593Smuzhiyun 	case L2CAP_TX_STATE_WAIT_F:
3062*4882a593Smuzhiyun 		l2cap_tx_state_wait_f(chan, control, skbs, event);
3063*4882a593Smuzhiyun 		break;
3064*4882a593Smuzhiyun 	default:
3065*4882a593Smuzhiyun 		/* Ignore event */
3066*4882a593Smuzhiyun 		break;
3067*4882a593Smuzhiyun 	}
3068*4882a593Smuzhiyun }
3069*4882a593Smuzhiyun 
l2cap_pass_to_tx(struct l2cap_chan * chan,struct l2cap_ctrl * control)3070*4882a593Smuzhiyun static void l2cap_pass_to_tx(struct l2cap_chan *chan,
3071*4882a593Smuzhiyun 			     struct l2cap_ctrl *control)
3072*4882a593Smuzhiyun {
3073*4882a593Smuzhiyun 	BT_DBG("chan %p, control %p", chan, control);
3074*4882a593Smuzhiyun 	l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_REQSEQ_AND_FBIT);
3075*4882a593Smuzhiyun }
3076*4882a593Smuzhiyun 
l2cap_pass_to_tx_fbit(struct l2cap_chan * chan,struct l2cap_ctrl * control)3077*4882a593Smuzhiyun static void l2cap_pass_to_tx_fbit(struct l2cap_chan *chan,
3078*4882a593Smuzhiyun 				  struct l2cap_ctrl *control)
3079*4882a593Smuzhiyun {
3080*4882a593Smuzhiyun 	BT_DBG("chan %p, control %p", chan, control);
3081*4882a593Smuzhiyun 	l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_FBIT);
3082*4882a593Smuzhiyun }
3083*4882a593Smuzhiyun 
3084*4882a593Smuzhiyun /* Copy frame to all raw sockets on that connection */
l2cap_raw_recv(struct l2cap_conn * conn,struct sk_buff * skb)3085*4882a593Smuzhiyun static void l2cap_raw_recv(struct l2cap_conn *conn, struct sk_buff *skb)
3086*4882a593Smuzhiyun {
3087*4882a593Smuzhiyun 	struct sk_buff *nskb;
3088*4882a593Smuzhiyun 	struct l2cap_chan *chan;
3089*4882a593Smuzhiyun 
3090*4882a593Smuzhiyun 	BT_DBG("conn %p", conn);
3091*4882a593Smuzhiyun 
3092*4882a593Smuzhiyun 	mutex_lock(&conn->chan_lock);
3093*4882a593Smuzhiyun 
3094*4882a593Smuzhiyun 	list_for_each_entry(chan, &conn->chan_l, list) {
3095*4882a593Smuzhiyun 		if (chan->chan_type != L2CAP_CHAN_RAW)
3096*4882a593Smuzhiyun 			continue;
3097*4882a593Smuzhiyun 
3098*4882a593Smuzhiyun 		/* Don't send frame to the channel it came from */
3099*4882a593Smuzhiyun 		if (bt_cb(skb)->l2cap.chan == chan)
3100*4882a593Smuzhiyun 			continue;
3101*4882a593Smuzhiyun 
3102*4882a593Smuzhiyun 		nskb = skb_clone(skb, GFP_KERNEL);
3103*4882a593Smuzhiyun 		if (!nskb)
3104*4882a593Smuzhiyun 			continue;
3105*4882a593Smuzhiyun 		if (chan->ops->recv(chan, nskb))
3106*4882a593Smuzhiyun 			kfree_skb(nskb);
3107*4882a593Smuzhiyun 	}
3108*4882a593Smuzhiyun 
3109*4882a593Smuzhiyun 	mutex_unlock(&conn->chan_lock);
3110*4882a593Smuzhiyun }
3111*4882a593Smuzhiyun 
3112*4882a593Smuzhiyun /* ---- L2CAP signalling commands ---- */
l2cap_build_cmd(struct l2cap_conn * conn,u8 code,u8 ident,u16 dlen,void * data)3113*4882a593Smuzhiyun static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn, u8 code,
3114*4882a593Smuzhiyun 				       u8 ident, u16 dlen, void *data)
3115*4882a593Smuzhiyun {
3116*4882a593Smuzhiyun 	struct sk_buff *skb, **frag;
3117*4882a593Smuzhiyun 	struct l2cap_cmd_hdr *cmd;
3118*4882a593Smuzhiyun 	struct l2cap_hdr *lh;
3119*4882a593Smuzhiyun 	int len, count;
3120*4882a593Smuzhiyun 
3121*4882a593Smuzhiyun 	BT_DBG("conn %p, code 0x%2.2x, ident 0x%2.2x, len %u",
3122*4882a593Smuzhiyun 	       conn, code, ident, dlen);
3123*4882a593Smuzhiyun 
3124*4882a593Smuzhiyun 	if (conn->mtu < L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE)
3125*4882a593Smuzhiyun 		return NULL;
3126*4882a593Smuzhiyun 
3127*4882a593Smuzhiyun 	len = L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE + dlen;
3128*4882a593Smuzhiyun 	count = min_t(unsigned int, conn->mtu, len);
3129*4882a593Smuzhiyun 
3130*4882a593Smuzhiyun 	skb = bt_skb_alloc(count, GFP_KERNEL);
3131*4882a593Smuzhiyun 	if (!skb)
3132*4882a593Smuzhiyun 		return NULL;
3133*4882a593Smuzhiyun 
3134*4882a593Smuzhiyun 	lh = skb_put(skb, L2CAP_HDR_SIZE);
3135*4882a593Smuzhiyun 	lh->len = cpu_to_le16(L2CAP_CMD_HDR_SIZE + dlen);
3136*4882a593Smuzhiyun 
3137*4882a593Smuzhiyun 	if (conn->hcon->type == LE_LINK)
3138*4882a593Smuzhiyun 		lh->cid = cpu_to_le16(L2CAP_CID_LE_SIGNALING);
3139*4882a593Smuzhiyun 	else
3140*4882a593Smuzhiyun 		lh->cid = cpu_to_le16(L2CAP_CID_SIGNALING);
3141*4882a593Smuzhiyun 
3142*4882a593Smuzhiyun 	cmd = skb_put(skb, L2CAP_CMD_HDR_SIZE);
3143*4882a593Smuzhiyun 	cmd->code  = code;
3144*4882a593Smuzhiyun 	cmd->ident = ident;
3145*4882a593Smuzhiyun 	cmd->len   = cpu_to_le16(dlen);
3146*4882a593Smuzhiyun 
3147*4882a593Smuzhiyun 	if (dlen) {
3148*4882a593Smuzhiyun 		count -= L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE;
3149*4882a593Smuzhiyun 		skb_put_data(skb, data, count);
3150*4882a593Smuzhiyun 		data += count;
3151*4882a593Smuzhiyun 	}
3152*4882a593Smuzhiyun 
3153*4882a593Smuzhiyun 	len -= skb->len;
3154*4882a593Smuzhiyun 
3155*4882a593Smuzhiyun 	/* Continuation fragments (no L2CAP header) */
3156*4882a593Smuzhiyun 	frag = &skb_shinfo(skb)->frag_list;
3157*4882a593Smuzhiyun 	while (len) {
3158*4882a593Smuzhiyun 		count = min_t(unsigned int, conn->mtu, len);
3159*4882a593Smuzhiyun 
3160*4882a593Smuzhiyun 		*frag = bt_skb_alloc(count, GFP_KERNEL);
3161*4882a593Smuzhiyun 		if (!*frag)
3162*4882a593Smuzhiyun 			goto fail;
3163*4882a593Smuzhiyun 
3164*4882a593Smuzhiyun 		skb_put_data(*frag, data, count);
3165*4882a593Smuzhiyun 
3166*4882a593Smuzhiyun 		len  -= count;
3167*4882a593Smuzhiyun 		data += count;
3168*4882a593Smuzhiyun 
3169*4882a593Smuzhiyun 		frag = &(*frag)->next;
3170*4882a593Smuzhiyun 	}
3171*4882a593Smuzhiyun 
3172*4882a593Smuzhiyun 	return skb;
3173*4882a593Smuzhiyun 
3174*4882a593Smuzhiyun fail:
3175*4882a593Smuzhiyun 	kfree_skb(skb);
3176*4882a593Smuzhiyun 	return NULL;
3177*4882a593Smuzhiyun }
3178*4882a593Smuzhiyun 
l2cap_get_conf_opt(void ** ptr,int * type,int * olen,unsigned long * val)3179*4882a593Smuzhiyun static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen,
3180*4882a593Smuzhiyun 				     unsigned long *val)
3181*4882a593Smuzhiyun {
3182*4882a593Smuzhiyun 	struct l2cap_conf_opt *opt = *ptr;
3183*4882a593Smuzhiyun 	int len;
3184*4882a593Smuzhiyun 
3185*4882a593Smuzhiyun 	len = L2CAP_CONF_OPT_SIZE + opt->len;
3186*4882a593Smuzhiyun 	*ptr += len;
3187*4882a593Smuzhiyun 
3188*4882a593Smuzhiyun 	*type = opt->type;
3189*4882a593Smuzhiyun 	*olen = opt->len;
3190*4882a593Smuzhiyun 
3191*4882a593Smuzhiyun 	switch (opt->len) {
3192*4882a593Smuzhiyun 	case 1:
3193*4882a593Smuzhiyun 		*val = *((u8 *) opt->val);
3194*4882a593Smuzhiyun 		break;
3195*4882a593Smuzhiyun 
3196*4882a593Smuzhiyun 	case 2:
3197*4882a593Smuzhiyun 		*val = get_unaligned_le16(opt->val);
3198*4882a593Smuzhiyun 		break;
3199*4882a593Smuzhiyun 
3200*4882a593Smuzhiyun 	case 4:
3201*4882a593Smuzhiyun 		*val = get_unaligned_le32(opt->val);
3202*4882a593Smuzhiyun 		break;
3203*4882a593Smuzhiyun 
3204*4882a593Smuzhiyun 	default:
3205*4882a593Smuzhiyun 		*val = (unsigned long) opt->val;
3206*4882a593Smuzhiyun 		break;
3207*4882a593Smuzhiyun 	}
3208*4882a593Smuzhiyun 
3209*4882a593Smuzhiyun 	BT_DBG("type 0x%2.2x len %u val 0x%lx", *type, opt->len, *val);
3210*4882a593Smuzhiyun 	return len;
3211*4882a593Smuzhiyun }
3212*4882a593Smuzhiyun 
l2cap_add_conf_opt(void ** ptr,u8 type,u8 len,unsigned long val,size_t size)3213*4882a593Smuzhiyun static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val, size_t size)
3214*4882a593Smuzhiyun {
3215*4882a593Smuzhiyun 	struct l2cap_conf_opt *opt = *ptr;
3216*4882a593Smuzhiyun 
3217*4882a593Smuzhiyun 	BT_DBG("type 0x%2.2x len %u val 0x%lx", type, len, val);
3218*4882a593Smuzhiyun 
3219*4882a593Smuzhiyun 	if (size < L2CAP_CONF_OPT_SIZE + len)
3220*4882a593Smuzhiyun 		return;
3221*4882a593Smuzhiyun 
3222*4882a593Smuzhiyun 	opt->type = type;
3223*4882a593Smuzhiyun 	opt->len  = len;
3224*4882a593Smuzhiyun 
3225*4882a593Smuzhiyun 	switch (len) {
3226*4882a593Smuzhiyun 	case 1:
3227*4882a593Smuzhiyun 		*((u8 *) opt->val)  = val;
3228*4882a593Smuzhiyun 		break;
3229*4882a593Smuzhiyun 
3230*4882a593Smuzhiyun 	case 2:
3231*4882a593Smuzhiyun 		put_unaligned_le16(val, opt->val);
3232*4882a593Smuzhiyun 		break;
3233*4882a593Smuzhiyun 
3234*4882a593Smuzhiyun 	case 4:
3235*4882a593Smuzhiyun 		put_unaligned_le32(val, opt->val);
3236*4882a593Smuzhiyun 		break;
3237*4882a593Smuzhiyun 
3238*4882a593Smuzhiyun 	default:
3239*4882a593Smuzhiyun 		memcpy(opt->val, (void *) val, len);
3240*4882a593Smuzhiyun 		break;
3241*4882a593Smuzhiyun 	}
3242*4882a593Smuzhiyun 
3243*4882a593Smuzhiyun 	*ptr += L2CAP_CONF_OPT_SIZE + len;
3244*4882a593Smuzhiyun }
3245*4882a593Smuzhiyun 
l2cap_add_opt_efs(void ** ptr,struct l2cap_chan * chan,size_t size)3246*4882a593Smuzhiyun static void l2cap_add_opt_efs(void **ptr, struct l2cap_chan *chan, size_t size)
3247*4882a593Smuzhiyun {
3248*4882a593Smuzhiyun 	struct l2cap_conf_efs efs;
3249*4882a593Smuzhiyun 
3250*4882a593Smuzhiyun 	switch (chan->mode) {
3251*4882a593Smuzhiyun 	case L2CAP_MODE_ERTM:
3252*4882a593Smuzhiyun 		efs.id		= chan->local_id;
3253*4882a593Smuzhiyun 		efs.stype	= chan->local_stype;
3254*4882a593Smuzhiyun 		efs.msdu	= cpu_to_le16(chan->local_msdu);
3255*4882a593Smuzhiyun 		efs.sdu_itime	= cpu_to_le32(chan->local_sdu_itime);
3256*4882a593Smuzhiyun 		efs.acc_lat	= cpu_to_le32(L2CAP_DEFAULT_ACC_LAT);
3257*4882a593Smuzhiyun 		efs.flush_to	= cpu_to_le32(L2CAP_EFS_DEFAULT_FLUSH_TO);
3258*4882a593Smuzhiyun 		break;
3259*4882a593Smuzhiyun 
3260*4882a593Smuzhiyun 	case L2CAP_MODE_STREAMING:
3261*4882a593Smuzhiyun 		efs.id		= 1;
3262*4882a593Smuzhiyun 		efs.stype	= L2CAP_SERV_BESTEFFORT;
3263*4882a593Smuzhiyun 		efs.msdu	= cpu_to_le16(chan->local_msdu);
3264*4882a593Smuzhiyun 		efs.sdu_itime	= cpu_to_le32(chan->local_sdu_itime);
3265*4882a593Smuzhiyun 		efs.acc_lat	= 0;
3266*4882a593Smuzhiyun 		efs.flush_to	= 0;
3267*4882a593Smuzhiyun 		break;
3268*4882a593Smuzhiyun 
3269*4882a593Smuzhiyun 	default:
3270*4882a593Smuzhiyun 		return;
3271*4882a593Smuzhiyun 	}
3272*4882a593Smuzhiyun 
3273*4882a593Smuzhiyun 	l2cap_add_conf_opt(ptr, L2CAP_CONF_EFS, sizeof(efs),
3274*4882a593Smuzhiyun 			   (unsigned long) &efs, size);
3275*4882a593Smuzhiyun }
3276*4882a593Smuzhiyun 
l2cap_ack_timeout(struct work_struct * work)3277*4882a593Smuzhiyun static void l2cap_ack_timeout(struct work_struct *work)
3278*4882a593Smuzhiyun {
3279*4882a593Smuzhiyun 	struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
3280*4882a593Smuzhiyun 					       ack_timer.work);
3281*4882a593Smuzhiyun 	u16 frames_to_ack;
3282*4882a593Smuzhiyun 
3283*4882a593Smuzhiyun 	BT_DBG("chan %p", chan);
3284*4882a593Smuzhiyun 
3285*4882a593Smuzhiyun 	l2cap_chan_lock(chan);
3286*4882a593Smuzhiyun 
3287*4882a593Smuzhiyun 	frames_to_ack = __seq_offset(chan, chan->buffer_seq,
3288*4882a593Smuzhiyun 				     chan->last_acked_seq);
3289*4882a593Smuzhiyun 
3290*4882a593Smuzhiyun 	if (frames_to_ack)
3291*4882a593Smuzhiyun 		l2cap_send_rr_or_rnr(chan, 0);
3292*4882a593Smuzhiyun 
3293*4882a593Smuzhiyun 	l2cap_chan_unlock(chan);
3294*4882a593Smuzhiyun 	l2cap_chan_put(chan);
3295*4882a593Smuzhiyun }
3296*4882a593Smuzhiyun 
l2cap_ertm_init(struct l2cap_chan * chan)3297*4882a593Smuzhiyun int l2cap_ertm_init(struct l2cap_chan *chan)
3298*4882a593Smuzhiyun {
3299*4882a593Smuzhiyun 	int err;
3300*4882a593Smuzhiyun 
3301*4882a593Smuzhiyun 	chan->next_tx_seq = 0;
3302*4882a593Smuzhiyun 	chan->expected_tx_seq = 0;
3303*4882a593Smuzhiyun 	chan->expected_ack_seq = 0;
3304*4882a593Smuzhiyun 	chan->unacked_frames = 0;
3305*4882a593Smuzhiyun 	chan->buffer_seq = 0;
3306*4882a593Smuzhiyun 	chan->frames_sent = 0;
3307*4882a593Smuzhiyun 	chan->last_acked_seq = 0;
3308*4882a593Smuzhiyun 	chan->sdu = NULL;
3309*4882a593Smuzhiyun 	chan->sdu_last_frag = NULL;
3310*4882a593Smuzhiyun 	chan->sdu_len = 0;
3311*4882a593Smuzhiyun 
3312*4882a593Smuzhiyun 	skb_queue_head_init(&chan->tx_q);
3313*4882a593Smuzhiyun 
3314*4882a593Smuzhiyun 	chan->local_amp_id = AMP_ID_BREDR;
3315*4882a593Smuzhiyun 	chan->move_id = AMP_ID_BREDR;
3316*4882a593Smuzhiyun 	chan->move_state = L2CAP_MOVE_STABLE;
3317*4882a593Smuzhiyun 	chan->move_role = L2CAP_MOVE_ROLE_NONE;
3318*4882a593Smuzhiyun 
3319*4882a593Smuzhiyun 	if (chan->mode != L2CAP_MODE_ERTM)
3320*4882a593Smuzhiyun 		return 0;
3321*4882a593Smuzhiyun 
3322*4882a593Smuzhiyun 	chan->rx_state = L2CAP_RX_STATE_RECV;
3323*4882a593Smuzhiyun 	chan->tx_state = L2CAP_TX_STATE_XMIT;
3324*4882a593Smuzhiyun 
3325*4882a593Smuzhiyun 	skb_queue_head_init(&chan->srej_q);
3326*4882a593Smuzhiyun 
3327*4882a593Smuzhiyun 	err = l2cap_seq_list_init(&chan->srej_list, chan->tx_win);
3328*4882a593Smuzhiyun 	if (err < 0)
3329*4882a593Smuzhiyun 		return err;
3330*4882a593Smuzhiyun 
3331*4882a593Smuzhiyun 	err = l2cap_seq_list_init(&chan->retrans_list, chan->remote_tx_win);
3332*4882a593Smuzhiyun 	if (err < 0)
3333*4882a593Smuzhiyun 		l2cap_seq_list_free(&chan->srej_list);
3334*4882a593Smuzhiyun 
3335*4882a593Smuzhiyun 	return err;
3336*4882a593Smuzhiyun }
3337*4882a593Smuzhiyun 
l2cap_select_mode(__u8 mode,__u16 remote_feat_mask)3338*4882a593Smuzhiyun static inline __u8 l2cap_select_mode(__u8 mode, __u16 remote_feat_mask)
3339*4882a593Smuzhiyun {
3340*4882a593Smuzhiyun 	switch (mode) {
3341*4882a593Smuzhiyun 	case L2CAP_MODE_STREAMING:
3342*4882a593Smuzhiyun 	case L2CAP_MODE_ERTM:
3343*4882a593Smuzhiyun 		if (l2cap_mode_supported(mode, remote_feat_mask))
3344*4882a593Smuzhiyun 			return mode;
3345*4882a593Smuzhiyun 		fallthrough;
3346*4882a593Smuzhiyun 	default:
3347*4882a593Smuzhiyun 		return L2CAP_MODE_BASIC;
3348*4882a593Smuzhiyun 	}
3349*4882a593Smuzhiyun }
3350*4882a593Smuzhiyun 
__l2cap_ews_supported(struct l2cap_conn * conn)3351*4882a593Smuzhiyun static inline bool __l2cap_ews_supported(struct l2cap_conn *conn)
3352*4882a593Smuzhiyun {
3353*4882a593Smuzhiyun 	return ((conn->local_fixed_chan & L2CAP_FC_A2MP) &&
3354*4882a593Smuzhiyun 		(conn->feat_mask & L2CAP_FEAT_EXT_WINDOW));
3355*4882a593Smuzhiyun }
3356*4882a593Smuzhiyun 
__l2cap_efs_supported(struct l2cap_conn * conn)3357*4882a593Smuzhiyun static inline bool __l2cap_efs_supported(struct l2cap_conn *conn)
3358*4882a593Smuzhiyun {
3359*4882a593Smuzhiyun 	return ((conn->local_fixed_chan & L2CAP_FC_A2MP) &&
3360*4882a593Smuzhiyun 		(conn->feat_mask & L2CAP_FEAT_EXT_FLOW));
3361*4882a593Smuzhiyun }
3362*4882a593Smuzhiyun 
__l2cap_set_ertm_timeouts(struct l2cap_chan * chan,struct l2cap_conf_rfc * rfc)3363*4882a593Smuzhiyun static void __l2cap_set_ertm_timeouts(struct l2cap_chan *chan,
3364*4882a593Smuzhiyun 				      struct l2cap_conf_rfc *rfc)
3365*4882a593Smuzhiyun {
3366*4882a593Smuzhiyun 	if (chan->local_amp_id != AMP_ID_BREDR && chan->hs_hcon) {
3367*4882a593Smuzhiyun 		u64 ertm_to = chan->hs_hcon->hdev->amp_be_flush_to;
3368*4882a593Smuzhiyun 
3369*4882a593Smuzhiyun 		/* Class 1 devices have must have ERTM timeouts
3370*4882a593Smuzhiyun 		 * exceeding the Link Supervision Timeout.  The
3371*4882a593Smuzhiyun 		 * default Link Supervision Timeout for AMP
3372*4882a593Smuzhiyun 		 * controllers is 10 seconds.
3373*4882a593Smuzhiyun 		 *
3374*4882a593Smuzhiyun 		 * Class 1 devices use 0xffffffff for their
3375*4882a593Smuzhiyun 		 * best-effort flush timeout, so the clamping logic
3376*4882a593Smuzhiyun 		 * will result in a timeout that meets the above
3377*4882a593Smuzhiyun 		 * requirement.  ERTM timeouts are 16-bit values, so
3378*4882a593Smuzhiyun 		 * the maximum timeout is 65.535 seconds.
3379*4882a593Smuzhiyun 		 */
3380*4882a593Smuzhiyun 
3381*4882a593Smuzhiyun 		/* Convert timeout to milliseconds and round */
3382*4882a593Smuzhiyun 		ertm_to = DIV_ROUND_UP_ULL(ertm_to, 1000);
3383*4882a593Smuzhiyun 
3384*4882a593Smuzhiyun 		/* This is the recommended formula for class 2 devices
3385*4882a593Smuzhiyun 		 * that start ERTM timers when packets are sent to the
3386*4882a593Smuzhiyun 		 * controller.
3387*4882a593Smuzhiyun 		 */
3388*4882a593Smuzhiyun 		ertm_to = 3 * ertm_to + 500;
3389*4882a593Smuzhiyun 
3390*4882a593Smuzhiyun 		if (ertm_to > 0xffff)
3391*4882a593Smuzhiyun 			ertm_to = 0xffff;
3392*4882a593Smuzhiyun 
3393*4882a593Smuzhiyun 		rfc->retrans_timeout = cpu_to_le16((u16) ertm_to);
3394*4882a593Smuzhiyun 		rfc->monitor_timeout = rfc->retrans_timeout;
3395*4882a593Smuzhiyun 	} else {
3396*4882a593Smuzhiyun 		rfc->retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO);
3397*4882a593Smuzhiyun 		rfc->monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO);
3398*4882a593Smuzhiyun 	}
3399*4882a593Smuzhiyun }
3400*4882a593Smuzhiyun 
l2cap_txwin_setup(struct l2cap_chan * chan)3401*4882a593Smuzhiyun static inline void l2cap_txwin_setup(struct l2cap_chan *chan)
3402*4882a593Smuzhiyun {
3403*4882a593Smuzhiyun 	if (chan->tx_win > L2CAP_DEFAULT_TX_WINDOW &&
3404*4882a593Smuzhiyun 	    __l2cap_ews_supported(chan->conn)) {
3405*4882a593Smuzhiyun 		/* use extended control field */
3406*4882a593Smuzhiyun 		set_bit(FLAG_EXT_CTRL, &chan->flags);
3407*4882a593Smuzhiyun 		chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
3408*4882a593Smuzhiyun 	} else {
3409*4882a593Smuzhiyun 		chan->tx_win = min_t(u16, chan->tx_win,
3410*4882a593Smuzhiyun 				     L2CAP_DEFAULT_TX_WINDOW);
3411*4882a593Smuzhiyun 		chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
3412*4882a593Smuzhiyun 	}
3413*4882a593Smuzhiyun 	chan->ack_win = chan->tx_win;
3414*4882a593Smuzhiyun }
3415*4882a593Smuzhiyun 
l2cap_mtu_auto(struct l2cap_chan * chan)3416*4882a593Smuzhiyun static void l2cap_mtu_auto(struct l2cap_chan *chan)
3417*4882a593Smuzhiyun {
3418*4882a593Smuzhiyun 	struct hci_conn *conn = chan->conn->hcon;
3419*4882a593Smuzhiyun 
3420*4882a593Smuzhiyun 	chan->imtu = L2CAP_DEFAULT_MIN_MTU;
3421*4882a593Smuzhiyun 
3422*4882a593Smuzhiyun 	/* The 2-DH1 packet has between 2 and 56 information bytes
3423*4882a593Smuzhiyun 	 * (including the 2-byte payload header)
3424*4882a593Smuzhiyun 	 */
3425*4882a593Smuzhiyun 	if (!(conn->pkt_type & HCI_2DH1))
3426*4882a593Smuzhiyun 		chan->imtu = 54;
3427*4882a593Smuzhiyun 
3428*4882a593Smuzhiyun 	/* The 3-DH1 packet has between 2 and 85 information bytes
3429*4882a593Smuzhiyun 	 * (including the 2-byte payload header)
3430*4882a593Smuzhiyun 	 */
3431*4882a593Smuzhiyun 	if (!(conn->pkt_type & HCI_3DH1))
3432*4882a593Smuzhiyun 		chan->imtu = 83;
3433*4882a593Smuzhiyun 
3434*4882a593Smuzhiyun 	/* The 2-DH3 packet has between 2 and 369 information bytes
3435*4882a593Smuzhiyun 	 * (including the 2-byte payload header)
3436*4882a593Smuzhiyun 	 */
3437*4882a593Smuzhiyun 	if (!(conn->pkt_type & HCI_2DH3))
3438*4882a593Smuzhiyun 		chan->imtu = 367;
3439*4882a593Smuzhiyun 
3440*4882a593Smuzhiyun 	/* The 3-DH3 packet has between 2 and 554 information bytes
3441*4882a593Smuzhiyun 	 * (including the 2-byte payload header)
3442*4882a593Smuzhiyun 	 */
3443*4882a593Smuzhiyun 	if (!(conn->pkt_type & HCI_3DH3))
3444*4882a593Smuzhiyun 		chan->imtu = 552;
3445*4882a593Smuzhiyun 
3446*4882a593Smuzhiyun 	/* The 2-DH5 packet has between 2 and 681 information bytes
3447*4882a593Smuzhiyun 	 * (including the 2-byte payload header)
3448*4882a593Smuzhiyun 	 */
3449*4882a593Smuzhiyun 	if (!(conn->pkt_type & HCI_2DH5))
3450*4882a593Smuzhiyun 		chan->imtu = 679;
3451*4882a593Smuzhiyun 
3452*4882a593Smuzhiyun 	/* The 3-DH5 packet has between 2 and 1023 information bytes
3453*4882a593Smuzhiyun 	 * (including the 2-byte payload header)
3454*4882a593Smuzhiyun 	 */
3455*4882a593Smuzhiyun 	if (!(conn->pkt_type & HCI_3DH5))
3456*4882a593Smuzhiyun 		chan->imtu = 1021;
3457*4882a593Smuzhiyun }
3458*4882a593Smuzhiyun 
l2cap_build_conf_req(struct l2cap_chan * chan,void * data,size_t data_size)3459*4882a593Smuzhiyun static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data, size_t data_size)
3460*4882a593Smuzhiyun {
3461*4882a593Smuzhiyun 	struct l2cap_conf_req *req = data;
3462*4882a593Smuzhiyun 	struct l2cap_conf_rfc rfc = { .mode = chan->mode };
3463*4882a593Smuzhiyun 	void *ptr = req->data;
3464*4882a593Smuzhiyun 	void *endptr = data + data_size;
3465*4882a593Smuzhiyun 	u16 size;
3466*4882a593Smuzhiyun 
3467*4882a593Smuzhiyun 	BT_DBG("chan %p", chan);
3468*4882a593Smuzhiyun 
3469*4882a593Smuzhiyun 	if (chan->num_conf_req || chan->num_conf_rsp)
3470*4882a593Smuzhiyun 		goto done;
3471*4882a593Smuzhiyun 
3472*4882a593Smuzhiyun 	switch (chan->mode) {
3473*4882a593Smuzhiyun 	case L2CAP_MODE_STREAMING:
3474*4882a593Smuzhiyun 	case L2CAP_MODE_ERTM:
3475*4882a593Smuzhiyun 		if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state))
3476*4882a593Smuzhiyun 			break;
3477*4882a593Smuzhiyun 
3478*4882a593Smuzhiyun 		if (__l2cap_efs_supported(chan->conn))
3479*4882a593Smuzhiyun 			set_bit(FLAG_EFS_ENABLE, &chan->flags);
3480*4882a593Smuzhiyun 
3481*4882a593Smuzhiyun 		fallthrough;
3482*4882a593Smuzhiyun 	default:
3483*4882a593Smuzhiyun 		chan->mode = l2cap_select_mode(rfc.mode, chan->conn->feat_mask);
3484*4882a593Smuzhiyun 		break;
3485*4882a593Smuzhiyun 	}
3486*4882a593Smuzhiyun 
3487*4882a593Smuzhiyun done:
3488*4882a593Smuzhiyun 	if (chan->imtu != L2CAP_DEFAULT_MTU) {
3489*4882a593Smuzhiyun 		if (!chan->imtu)
3490*4882a593Smuzhiyun 			l2cap_mtu_auto(chan);
3491*4882a593Smuzhiyun 		l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu,
3492*4882a593Smuzhiyun 				   endptr - ptr);
3493*4882a593Smuzhiyun 	}
3494*4882a593Smuzhiyun 
3495*4882a593Smuzhiyun 	switch (chan->mode) {
3496*4882a593Smuzhiyun 	case L2CAP_MODE_BASIC:
3497*4882a593Smuzhiyun 		if (disable_ertm)
3498*4882a593Smuzhiyun 			break;
3499*4882a593Smuzhiyun 
3500*4882a593Smuzhiyun 		if (!(chan->conn->feat_mask & L2CAP_FEAT_ERTM) &&
3501*4882a593Smuzhiyun 		    !(chan->conn->feat_mask & L2CAP_FEAT_STREAMING))
3502*4882a593Smuzhiyun 			break;
3503*4882a593Smuzhiyun 
3504*4882a593Smuzhiyun 		rfc.mode            = L2CAP_MODE_BASIC;
3505*4882a593Smuzhiyun 		rfc.txwin_size      = 0;
3506*4882a593Smuzhiyun 		rfc.max_transmit    = 0;
3507*4882a593Smuzhiyun 		rfc.retrans_timeout = 0;
3508*4882a593Smuzhiyun 		rfc.monitor_timeout = 0;
3509*4882a593Smuzhiyun 		rfc.max_pdu_size    = 0;
3510*4882a593Smuzhiyun 
3511*4882a593Smuzhiyun 		l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3512*4882a593Smuzhiyun 				   (unsigned long) &rfc, endptr - ptr);
3513*4882a593Smuzhiyun 		break;
3514*4882a593Smuzhiyun 
3515*4882a593Smuzhiyun 	case L2CAP_MODE_ERTM:
3516*4882a593Smuzhiyun 		rfc.mode            = L2CAP_MODE_ERTM;
3517*4882a593Smuzhiyun 		rfc.max_transmit    = chan->max_tx;
3518*4882a593Smuzhiyun 
3519*4882a593Smuzhiyun 		__l2cap_set_ertm_timeouts(chan, &rfc);
3520*4882a593Smuzhiyun 
3521*4882a593Smuzhiyun 		size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
3522*4882a593Smuzhiyun 			     L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3523*4882a593Smuzhiyun 			     L2CAP_FCS_SIZE);
3524*4882a593Smuzhiyun 		rfc.max_pdu_size = cpu_to_le16(size);
3525*4882a593Smuzhiyun 
3526*4882a593Smuzhiyun 		l2cap_txwin_setup(chan);
3527*4882a593Smuzhiyun 
3528*4882a593Smuzhiyun 		rfc.txwin_size = min_t(u16, chan->tx_win,
3529*4882a593Smuzhiyun 				       L2CAP_DEFAULT_TX_WINDOW);
3530*4882a593Smuzhiyun 
3531*4882a593Smuzhiyun 		l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3532*4882a593Smuzhiyun 				   (unsigned long) &rfc, endptr - ptr);
3533*4882a593Smuzhiyun 
3534*4882a593Smuzhiyun 		if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3535*4882a593Smuzhiyun 			l2cap_add_opt_efs(&ptr, chan, endptr - ptr);
3536*4882a593Smuzhiyun 
3537*4882a593Smuzhiyun 		if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3538*4882a593Smuzhiyun 			l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
3539*4882a593Smuzhiyun 					   chan->tx_win, endptr - ptr);
3540*4882a593Smuzhiyun 
3541*4882a593Smuzhiyun 		if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3542*4882a593Smuzhiyun 			if (chan->fcs == L2CAP_FCS_NONE ||
3543*4882a593Smuzhiyun 			    test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
3544*4882a593Smuzhiyun 				chan->fcs = L2CAP_FCS_NONE;
3545*4882a593Smuzhiyun 				l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3546*4882a593Smuzhiyun 						   chan->fcs, endptr - ptr);
3547*4882a593Smuzhiyun 			}
3548*4882a593Smuzhiyun 		break;
3549*4882a593Smuzhiyun 
3550*4882a593Smuzhiyun 	case L2CAP_MODE_STREAMING:
3551*4882a593Smuzhiyun 		l2cap_txwin_setup(chan);
3552*4882a593Smuzhiyun 		rfc.mode            = L2CAP_MODE_STREAMING;
3553*4882a593Smuzhiyun 		rfc.txwin_size      = 0;
3554*4882a593Smuzhiyun 		rfc.max_transmit    = 0;
3555*4882a593Smuzhiyun 		rfc.retrans_timeout = 0;
3556*4882a593Smuzhiyun 		rfc.monitor_timeout = 0;
3557*4882a593Smuzhiyun 
3558*4882a593Smuzhiyun 		size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
3559*4882a593Smuzhiyun 			     L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3560*4882a593Smuzhiyun 			     L2CAP_FCS_SIZE);
3561*4882a593Smuzhiyun 		rfc.max_pdu_size = cpu_to_le16(size);
3562*4882a593Smuzhiyun 
3563*4882a593Smuzhiyun 		l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3564*4882a593Smuzhiyun 				   (unsigned long) &rfc, endptr - ptr);
3565*4882a593Smuzhiyun 
3566*4882a593Smuzhiyun 		if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3567*4882a593Smuzhiyun 			l2cap_add_opt_efs(&ptr, chan, endptr - ptr);
3568*4882a593Smuzhiyun 
3569*4882a593Smuzhiyun 		if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3570*4882a593Smuzhiyun 			if (chan->fcs == L2CAP_FCS_NONE ||
3571*4882a593Smuzhiyun 			    test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
3572*4882a593Smuzhiyun 				chan->fcs = L2CAP_FCS_NONE;
3573*4882a593Smuzhiyun 				l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3574*4882a593Smuzhiyun 						   chan->fcs, endptr - ptr);
3575*4882a593Smuzhiyun 			}
3576*4882a593Smuzhiyun 		break;
3577*4882a593Smuzhiyun 	}
3578*4882a593Smuzhiyun 
3579*4882a593Smuzhiyun 	req->dcid  = cpu_to_le16(chan->dcid);
3580*4882a593Smuzhiyun 	req->flags = cpu_to_le16(0);
3581*4882a593Smuzhiyun 
3582*4882a593Smuzhiyun 	return ptr - data;
3583*4882a593Smuzhiyun }
3584*4882a593Smuzhiyun 
l2cap_parse_conf_req(struct l2cap_chan * chan,void * data,size_t data_size)3585*4882a593Smuzhiyun static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data, size_t data_size)
3586*4882a593Smuzhiyun {
3587*4882a593Smuzhiyun 	struct l2cap_conf_rsp *rsp = data;
3588*4882a593Smuzhiyun 	void *ptr = rsp->data;
3589*4882a593Smuzhiyun 	void *endptr = data + data_size;
3590*4882a593Smuzhiyun 	void *req = chan->conf_req;
3591*4882a593Smuzhiyun 	int len = chan->conf_len;
3592*4882a593Smuzhiyun 	int type, hint, olen;
3593*4882a593Smuzhiyun 	unsigned long val;
3594*4882a593Smuzhiyun 	struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
3595*4882a593Smuzhiyun 	struct l2cap_conf_efs efs;
3596*4882a593Smuzhiyun 	u8 remote_efs = 0;
3597*4882a593Smuzhiyun 	u16 mtu = L2CAP_DEFAULT_MTU;
3598*4882a593Smuzhiyun 	u16 result = L2CAP_CONF_SUCCESS;
3599*4882a593Smuzhiyun 	u16 size;
3600*4882a593Smuzhiyun 
3601*4882a593Smuzhiyun 	BT_DBG("chan %p", chan);
3602*4882a593Smuzhiyun 
3603*4882a593Smuzhiyun 	while (len >= L2CAP_CONF_OPT_SIZE) {
3604*4882a593Smuzhiyun 		len -= l2cap_get_conf_opt(&req, &type, &olen, &val);
3605*4882a593Smuzhiyun 		if (len < 0)
3606*4882a593Smuzhiyun 			break;
3607*4882a593Smuzhiyun 
3608*4882a593Smuzhiyun 		hint  = type & L2CAP_CONF_HINT;
3609*4882a593Smuzhiyun 		type &= L2CAP_CONF_MASK;
3610*4882a593Smuzhiyun 
3611*4882a593Smuzhiyun 		switch (type) {
3612*4882a593Smuzhiyun 		case L2CAP_CONF_MTU:
3613*4882a593Smuzhiyun 			if (olen != 2)
3614*4882a593Smuzhiyun 				break;
3615*4882a593Smuzhiyun 			mtu = val;
3616*4882a593Smuzhiyun 			break;
3617*4882a593Smuzhiyun 
3618*4882a593Smuzhiyun 		case L2CAP_CONF_FLUSH_TO:
3619*4882a593Smuzhiyun 			if (olen != 2)
3620*4882a593Smuzhiyun 				break;
3621*4882a593Smuzhiyun 			chan->flush_to = val;
3622*4882a593Smuzhiyun 			break;
3623*4882a593Smuzhiyun 
3624*4882a593Smuzhiyun 		case L2CAP_CONF_QOS:
3625*4882a593Smuzhiyun 			break;
3626*4882a593Smuzhiyun 
3627*4882a593Smuzhiyun 		case L2CAP_CONF_RFC:
3628*4882a593Smuzhiyun 			if (olen != sizeof(rfc))
3629*4882a593Smuzhiyun 				break;
3630*4882a593Smuzhiyun 			memcpy(&rfc, (void *) val, olen);
3631*4882a593Smuzhiyun 			break;
3632*4882a593Smuzhiyun 
3633*4882a593Smuzhiyun 		case L2CAP_CONF_FCS:
3634*4882a593Smuzhiyun 			if (olen != 1)
3635*4882a593Smuzhiyun 				break;
3636*4882a593Smuzhiyun 			if (val == L2CAP_FCS_NONE)
3637*4882a593Smuzhiyun 				set_bit(CONF_RECV_NO_FCS, &chan->conf_state);
3638*4882a593Smuzhiyun 			break;
3639*4882a593Smuzhiyun 
3640*4882a593Smuzhiyun 		case L2CAP_CONF_EFS:
3641*4882a593Smuzhiyun 			if (olen != sizeof(efs))
3642*4882a593Smuzhiyun 				break;
3643*4882a593Smuzhiyun 			remote_efs = 1;
3644*4882a593Smuzhiyun 			memcpy(&efs, (void *) val, olen);
3645*4882a593Smuzhiyun 			break;
3646*4882a593Smuzhiyun 
3647*4882a593Smuzhiyun 		case L2CAP_CONF_EWS:
3648*4882a593Smuzhiyun 			if (olen != 2)
3649*4882a593Smuzhiyun 				break;
3650*4882a593Smuzhiyun 			if (!(chan->conn->local_fixed_chan & L2CAP_FC_A2MP))
3651*4882a593Smuzhiyun 				return -ECONNREFUSED;
3652*4882a593Smuzhiyun 			set_bit(FLAG_EXT_CTRL, &chan->flags);
3653*4882a593Smuzhiyun 			set_bit(CONF_EWS_RECV, &chan->conf_state);
3654*4882a593Smuzhiyun 			chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
3655*4882a593Smuzhiyun 			chan->remote_tx_win = val;
3656*4882a593Smuzhiyun 			break;
3657*4882a593Smuzhiyun 
3658*4882a593Smuzhiyun 		default:
3659*4882a593Smuzhiyun 			if (hint)
3660*4882a593Smuzhiyun 				break;
3661*4882a593Smuzhiyun 			result = L2CAP_CONF_UNKNOWN;
3662*4882a593Smuzhiyun 			*((u8 *) ptr++) = type;
3663*4882a593Smuzhiyun 			break;
3664*4882a593Smuzhiyun 		}
3665*4882a593Smuzhiyun 	}
3666*4882a593Smuzhiyun 
3667*4882a593Smuzhiyun 	if (chan->num_conf_rsp || chan->num_conf_req > 1)
3668*4882a593Smuzhiyun 		goto done;
3669*4882a593Smuzhiyun 
3670*4882a593Smuzhiyun 	switch (chan->mode) {
3671*4882a593Smuzhiyun 	case L2CAP_MODE_STREAMING:
3672*4882a593Smuzhiyun 	case L2CAP_MODE_ERTM:
3673*4882a593Smuzhiyun 		if (!test_bit(CONF_STATE2_DEVICE, &chan->conf_state)) {
3674*4882a593Smuzhiyun 			chan->mode = l2cap_select_mode(rfc.mode,
3675*4882a593Smuzhiyun 						       chan->conn->feat_mask);
3676*4882a593Smuzhiyun 			break;
3677*4882a593Smuzhiyun 		}
3678*4882a593Smuzhiyun 
3679*4882a593Smuzhiyun 		if (remote_efs) {
3680*4882a593Smuzhiyun 			if (__l2cap_efs_supported(chan->conn))
3681*4882a593Smuzhiyun 				set_bit(FLAG_EFS_ENABLE, &chan->flags);
3682*4882a593Smuzhiyun 			else
3683*4882a593Smuzhiyun 				return -ECONNREFUSED;
3684*4882a593Smuzhiyun 		}
3685*4882a593Smuzhiyun 
3686*4882a593Smuzhiyun 		if (chan->mode != rfc.mode)
3687*4882a593Smuzhiyun 			return -ECONNREFUSED;
3688*4882a593Smuzhiyun 
3689*4882a593Smuzhiyun 		break;
3690*4882a593Smuzhiyun 	}
3691*4882a593Smuzhiyun 
3692*4882a593Smuzhiyun done:
3693*4882a593Smuzhiyun 	if (chan->mode != rfc.mode) {
3694*4882a593Smuzhiyun 		result = L2CAP_CONF_UNACCEPT;
3695*4882a593Smuzhiyun 		rfc.mode = chan->mode;
3696*4882a593Smuzhiyun 
3697*4882a593Smuzhiyun 		if (chan->num_conf_rsp == 1)
3698*4882a593Smuzhiyun 			return -ECONNREFUSED;
3699*4882a593Smuzhiyun 
3700*4882a593Smuzhiyun 		l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3701*4882a593Smuzhiyun 				   (unsigned long) &rfc, endptr - ptr);
3702*4882a593Smuzhiyun 	}
3703*4882a593Smuzhiyun 
3704*4882a593Smuzhiyun 	if (result == L2CAP_CONF_SUCCESS) {
3705*4882a593Smuzhiyun 		/* Configure output options and let the other side know
3706*4882a593Smuzhiyun 		 * which ones we don't like. */
3707*4882a593Smuzhiyun 
3708*4882a593Smuzhiyun 		if (mtu < L2CAP_DEFAULT_MIN_MTU)
3709*4882a593Smuzhiyun 			result = L2CAP_CONF_UNACCEPT;
3710*4882a593Smuzhiyun 		else {
3711*4882a593Smuzhiyun 			chan->omtu = mtu;
3712*4882a593Smuzhiyun 			set_bit(CONF_MTU_DONE, &chan->conf_state);
3713*4882a593Smuzhiyun 		}
3714*4882a593Smuzhiyun 		l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->omtu, endptr - ptr);
3715*4882a593Smuzhiyun 
3716*4882a593Smuzhiyun 		if (remote_efs) {
3717*4882a593Smuzhiyun 			if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
3718*4882a593Smuzhiyun 			    efs.stype != L2CAP_SERV_NOTRAFIC &&
3719*4882a593Smuzhiyun 			    efs.stype != chan->local_stype) {
3720*4882a593Smuzhiyun 
3721*4882a593Smuzhiyun 				result = L2CAP_CONF_UNACCEPT;
3722*4882a593Smuzhiyun 
3723*4882a593Smuzhiyun 				if (chan->num_conf_req >= 1)
3724*4882a593Smuzhiyun 					return -ECONNREFUSED;
3725*4882a593Smuzhiyun 
3726*4882a593Smuzhiyun 				l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
3727*4882a593Smuzhiyun 						   sizeof(efs),
3728*4882a593Smuzhiyun 						   (unsigned long) &efs, endptr - ptr);
3729*4882a593Smuzhiyun 			} else {
3730*4882a593Smuzhiyun 				/* Send PENDING Conf Rsp */
3731*4882a593Smuzhiyun 				result = L2CAP_CONF_PENDING;
3732*4882a593Smuzhiyun 				set_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
3733*4882a593Smuzhiyun 			}
3734*4882a593Smuzhiyun 		}
3735*4882a593Smuzhiyun 
3736*4882a593Smuzhiyun 		switch (rfc.mode) {
3737*4882a593Smuzhiyun 		case L2CAP_MODE_BASIC:
3738*4882a593Smuzhiyun 			chan->fcs = L2CAP_FCS_NONE;
3739*4882a593Smuzhiyun 			set_bit(CONF_MODE_DONE, &chan->conf_state);
3740*4882a593Smuzhiyun 			break;
3741*4882a593Smuzhiyun 
3742*4882a593Smuzhiyun 		case L2CAP_MODE_ERTM:
3743*4882a593Smuzhiyun 			if (!test_bit(CONF_EWS_RECV, &chan->conf_state))
3744*4882a593Smuzhiyun 				chan->remote_tx_win = rfc.txwin_size;
3745*4882a593Smuzhiyun 			else
3746*4882a593Smuzhiyun 				rfc.txwin_size = L2CAP_DEFAULT_TX_WINDOW;
3747*4882a593Smuzhiyun 
3748*4882a593Smuzhiyun 			chan->remote_max_tx = rfc.max_transmit;
3749*4882a593Smuzhiyun 
3750*4882a593Smuzhiyun 			size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
3751*4882a593Smuzhiyun 				     chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3752*4882a593Smuzhiyun 				     L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
3753*4882a593Smuzhiyun 			rfc.max_pdu_size = cpu_to_le16(size);
3754*4882a593Smuzhiyun 			chan->remote_mps = size;
3755*4882a593Smuzhiyun 
3756*4882a593Smuzhiyun 			__l2cap_set_ertm_timeouts(chan, &rfc);
3757*4882a593Smuzhiyun 
3758*4882a593Smuzhiyun 			set_bit(CONF_MODE_DONE, &chan->conf_state);
3759*4882a593Smuzhiyun 
3760*4882a593Smuzhiyun 			l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
3761*4882a593Smuzhiyun 					   sizeof(rfc), (unsigned long) &rfc, endptr - ptr);
3762*4882a593Smuzhiyun 
3763*4882a593Smuzhiyun 			if (remote_efs &&
3764*4882a593Smuzhiyun 			    test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3765*4882a593Smuzhiyun 				chan->remote_id = efs.id;
3766*4882a593Smuzhiyun 				chan->remote_stype = efs.stype;
3767*4882a593Smuzhiyun 				chan->remote_msdu = le16_to_cpu(efs.msdu);
3768*4882a593Smuzhiyun 				chan->remote_flush_to =
3769*4882a593Smuzhiyun 					le32_to_cpu(efs.flush_to);
3770*4882a593Smuzhiyun 				chan->remote_acc_lat =
3771*4882a593Smuzhiyun 					le32_to_cpu(efs.acc_lat);
3772*4882a593Smuzhiyun 				chan->remote_sdu_itime =
3773*4882a593Smuzhiyun 					le32_to_cpu(efs.sdu_itime);
3774*4882a593Smuzhiyun 				l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
3775*4882a593Smuzhiyun 						   sizeof(efs),
3776*4882a593Smuzhiyun 						   (unsigned long) &efs, endptr - ptr);
3777*4882a593Smuzhiyun 			}
3778*4882a593Smuzhiyun 			break;
3779*4882a593Smuzhiyun 
3780*4882a593Smuzhiyun 		case L2CAP_MODE_STREAMING:
3781*4882a593Smuzhiyun 			size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
3782*4882a593Smuzhiyun 				     chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3783*4882a593Smuzhiyun 				     L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
3784*4882a593Smuzhiyun 			rfc.max_pdu_size = cpu_to_le16(size);
3785*4882a593Smuzhiyun 			chan->remote_mps = size;
3786*4882a593Smuzhiyun 
3787*4882a593Smuzhiyun 			set_bit(CONF_MODE_DONE, &chan->conf_state);
3788*4882a593Smuzhiyun 
3789*4882a593Smuzhiyun 			l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3790*4882a593Smuzhiyun 					   (unsigned long) &rfc, endptr - ptr);
3791*4882a593Smuzhiyun 
3792*4882a593Smuzhiyun 			break;
3793*4882a593Smuzhiyun 
3794*4882a593Smuzhiyun 		default:
3795*4882a593Smuzhiyun 			result = L2CAP_CONF_UNACCEPT;
3796*4882a593Smuzhiyun 
3797*4882a593Smuzhiyun 			memset(&rfc, 0, sizeof(rfc));
3798*4882a593Smuzhiyun 			rfc.mode = chan->mode;
3799*4882a593Smuzhiyun 		}
3800*4882a593Smuzhiyun 
3801*4882a593Smuzhiyun 		if (result == L2CAP_CONF_SUCCESS)
3802*4882a593Smuzhiyun 			set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
3803*4882a593Smuzhiyun 	}
3804*4882a593Smuzhiyun 	rsp->scid   = cpu_to_le16(chan->dcid);
3805*4882a593Smuzhiyun 	rsp->result = cpu_to_le16(result);
3806*4882a593Smuzhiyun 	rsp->flags  = cpu_to_le16(0);
3807*4882a593Smuzhiyun 
3808*4882a593Smuzhiyun 	return ptr - data;
3809*4882a593Smuzhiyun }
3810*4882a593Smuzhiyun 
l2cap_parse_conf_rsp(struct l2cap_chan * chan,void * rsp,int len,void * data,size_t size,u16 * result)3811*4882a593Smuzhiyun static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len,
3812*4882a593Smuzhiyun 				void *data, size_t size, u16 *result)
3813*4882a593Smuzhiyun {
3814*4882a593Smuzhiyun 	struct l2cap_conf_req *req = data;
3815*4882a593Smuzhiyun 	void *ptr = req->data;
3816*4882a593Smuzhiyun 	void *endptr = data + size;
3817*4882a593Smuzhiyun 	int type, olen;
3818*4882a593Smuzhiyun 	unsigned long val;
3819*4882a593Smuzhiyun 	struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
3820*4882a593Smuzhiyun 	struct l2cap_conf_efs efs;
3821*4882a593Smuzhiyun 
3822*4882a593Smuzhiyun 	BT_DBG("chan %p, rsp %p, len %d, req %p", chan, rsp, len, data);
3823*4882a593Smuzhiyun 
3824*4882a593Smuzhiyun 	while (len >= L2CAP_CONF_OPT_SIZE) {
3825*4882a593Smuzhiyun 		len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3826*4882a593Smuzhiyun 		if (len < 0)
3827*4882a593Smuzhiyun 			break;
3828*4882a593Smuzhiyun 
3829*4882a593Smuzhiyun 		switch (type) {
3830*4882a593Smuzhiyun 		case L2CAP_CONF_MTU:
3831*4882a593Smuzhiyun 			if (olen != 2)
3832*4882a593Smuzhiyun 				break;
3833*4882a593Smuzhiyun 			if (val < L2CAP_DEFAULT_MIN_MTU) {
3834*4882a593Smuzhiyun 				*result = L2CAP_CONF_UNACCEPT;
3835*4882a593Smuzhiyun 				chan->imtu = L2CAP_DEFAULT_MIN_MTU;
3836*4882a593Smuzhiyun 			} else
3837*4882a593Smuzhiyun 				chan->imtu = val;
3838*4882a593Smuzhiyun 			l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu,
3839*4882a593Smuzhiyun 					   endptr - ptr);
3840*4882a593Smuzhiyun 			break;
3841*4882a593Smuzhiyun 
3842*4882a593Smuzhiyun 		case L2CAP_CONF_FLUSH_TO:
3843*4882a593Smuzhiyun 			if (olen != 2)
3844*4882a593Smuzhiyun 				break;
3845*4882a593Smuzhiyun 			chan->flush_to = val;
3846*4882a593Smuzhiyun 			l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO, 2,
3847*4882a593Smuzhiyun 					   chan->flush_to, endptr - ptr);
3848*4882a593Smuzhiyun 			break;
3849*4882a593Smuzhiyun 
3850*4882a593Smuzhiyun 		case L2CAP_CONF_RFC:
3851*4882a593Smuzhiyun 			if (olen != sizeof(rfc))
3852*4882a593Smuzhiyun 				break;
3853*4882a593Smuzhiyun 			memcpy(&rfc, (void *)val, olen);
3854*4882a593Smuzhiyun 			if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state) &&
3855*4882a593Smuzhiyun 			    rfc.mode != chan->mode)
3856*4882a593Smuzhiyun 				return -ECONNREFUSED;
3857*4882a593Smuzhiyun 			chan->fcs = 0;
3858*4882a593Smuzhiyun 			l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3859*4882a593Smuzhiyun 					   (unsigned long) &rfc, endptr - ptr);
3860*4882a593Smuzhiyun 			break;
3861*4882a593Smuzhiyun 
3862*4882a593Smuzhiyun 		case L2CAP_CONF_EWS:
3863*4882a593Smuzhiyun 			if (olen != 2)
3864*4882a593Smuzhiyun 				break;
3865*4882a593Smuzhiyun 			chan->ack_win = min_t(u16, val, chan->ack_win);
3866*4882a593Smuzhiyun 			l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
3867*4882a593Smuzhiyun 					   chan->tx_win, endptr - ptr);
3868*4882a593Smuzhiyun 			break;
3869*4882a593Smuzhiyun 
3870*4882a593Smuzhiyun 		case L2CAP_CONF_EFS:
3871*4882a593Smuzhiyun 			if (olen != sizeof(efs))
3872*4882a593Smuzhiyun 				break;
3873*4882a593Smuzhiyun 			memcpy(&efs, (void *)val, olen);
3874*4882a593Smuzhiyun 			if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
3875*4882a593Smuzhiyun 			    efs.stype != L2CAP_SERV_NOTRAFIC &&
3876*4882a593Smuzhiyun 			    efs.stype != chan->local_stype)
3877*4882a593Smuzhiyun 				return -ECONNREFUSED;
3878*4882a593Smuzhiyun 			l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS, sizeof(efs),
3879*4882a593Smuzhiyun 					   (unsigned long) &efs, endptr - ptr);
3880*4882a593Smuzhiyun 			break;
3881*4882a593Smuzhiyun 
3882*4882a593Smuzhiyun 		case L2CAP_CONF_FCS:
3883*4882a593Smuzhiyun 			if (olen != 1)
3884*4882a593Smuzhiyun 				break;
3885*4882a593Smuzhiyun 			if (*result == L2CAP_CONF_PENDING)
3886*4882a593Smuzhiyun 				if (val == L2CAP_FCS_NONE)
3887*4882a593Smuzhiyun 					set_bit(CONF_RECV_NO_FCS,
3888*4882a593Smuzhiyun 						&chan->conf_state);
3889*4882a593Smuzhiyun 			break;
3890*4882a593Smuzhiyun 		}
3891*4882a593Smuzhiyun 	}
3892*4882a593Smuzhiyun 
3893*4882a593Smuzhiyun 	if (chan->mode == L2CAP_MODE_BASIC && chan->mode != rfc.mode)
3894*4882a593Smuzhiyun 		return -ECONNREFUSED;
3895*4882a593Smuzhiyun 
3896*4882a593Smuzhiyun 	chan->mode = rfc.mode;
3897*4882a593Smuzhiyun 
3898*4882a593Smuzhiyun 	if (*result == L2CAP_CONF_SUCCESS || *result == L2CAP_CONF_PENDING) {
3899*4882a593Smuzhiyun 		switch (rfc.mode) {
3900*4882a593Smuzhiyun 		case L2CAP_MODE_ERTM:
3901*4882a593Smuzhiyun 			chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3902*4882a593Smuzhiyun 			chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
3903*4882a593Smuzhiyun 			chan->mps    = le16_to_cpu(rfc.max_pdu_size);
3904*4882a593Smuzhiyun 			if (!test_bit(FLAG_EXT_CTRL, &chan->flags))
3905*4882a593Smuzhiyun 				chan->ack_win = min_t(u16, chan->ack_win,
3906*4882a593Smuzhiyun 						      rfc.txwin_size);
3907*4882a593Smuzhiyun 
3908*4882a593Smuzhiyun 			if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3909*4882a593Smuzhiyun 				chan->local_msdu = le16_to_cpu(efs.msdu);
3910*4882a593Smuzhiyun 				chan->local_sdu_itime =
3911*4882a593Smuzhiyun 					le32_to_cpu(efs.sdu_itime);
3912*4882a593Smuzhiyun 				chan->local_acc_lat = le32_to_cpu(efs.acc_lat);
3913*4882a593Smuzhiyun 				chan->local_flush_to =
3914*4882a593Smuzhiyun 					le32_to_cpu(efs.flush_to);
3915*4882a593Smuzhiyun 			}
3916*4882a593Smuzhiyun 			break;
3917*4882a593Smuzhiyun 
3918*4882a593Smuzhiyun 		case L2CAP_MODE_STREAMING:
3919*4882a593Smuzhiyun 			chan->mps    = le16_to_cpu(rfc.max_pdu_size);
3920*4882a593Smuzhiyun 		}
3921*4882a593Smuzhiyun 	}
3922*4882a593Smuzhiyun 
3923*4882a593Smuzhiyun 	req->dcid   = cpu_to_le16(chan->dcid);
3924*4882a593Smuzhiyun 	req->flags  = cpu_to_le16(0);
3925*4882a593Smuzhiyun 
3926*4882a593Smuzhiyun 	return ptr - data;
3927*4882a593Smuzhiyun }
3928*4882a593Smuzhiyun 
l2cap_build_conf_rsp(struct l2cap_chan * chan,void * data,u16 result,u16 flags)3929*4882a593Smuzhiyun static int l2cap_build_conf_rsp(struct l2cap_chan *chan, void *data,
3930*4882a593Smuzhiyun 				u16 result, u16 flags)
3931*4882a593Smuzhiyun {
3932*4882a593Smuzhiyun 	struct l2cap_conf_rsp *rsp = data;
3933*4882a593Smuzhiyun 	void *ptr = rsp->data;
3934*4882a593Smuzhiyun 
3935*4882a593Smuzhiyun 	BT_DBG("chan %p", chan);
3936*4882a593Smuzhiyun 
3937*4882a593Smuzhiyun 	rsp->scid   = cpu_to_le16(chan->dcid);
3938*4882a593Smuzhiyun 	rsp->result = cpu_to_le16(result);
3939*4882a593Smuzhiyun 	rsp->flags  = cpu_to_le16(flags);
3940*4882a593Smuzhiyun 
3941*4882a593Smuzhiyun 	return ptr - data;
3942*4882a593Smuzhiyun }
3943*4882a593Smuzhiyun 
__l2cap_le_connect_rsp_defer(struct l2cap_chan * chan)3944*4882a593Smuzhiyun void __l2cap_le_connect_rsp_defer(struct l2cap_chan *chan)
3945*4882a593Smuzhiyun {
3946*4882a593Smuzhiyun 	struct l2cap_le_conn_rsp rsp;
3947*4882a593Smuzhiyun 	struct l2cap_conn *conn = chan->conn;
3948*4882a593Smuzhiyun 
3949*4882a593Smuzhiyun 	BT_DBG("chan %p", chan);
3950*4882a593Smuzhiyun 
3951*4882a593Smuzhiyun 	rsp.dcid    = cpu_to_le16(chan->scid);
3952*4882a593Smuzhiyun 	rsp.mtu     = cpu_to_le16(chan->imtu);
3953*4882a593Smuzhiyun 	rsp.mps     = cpu_to_le16(chan->mps);
3954*4882a593Smuzhiyun 	rsp.credits = cpu_to_le16(chan->rx_credits);
3955*4882a593Smuzhiyun 	rsp.result  = cpu_to_le16(L2CAP_CR_LE_SUCCESS);
3956*4882a593Smuzhiyun 
3957*4882a593Smuzhiyun 	l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp),
3958*4882a593Smuzhiyun 		       &rsp);
3959*4882a593Smuzhiyun }
3960*4882a593Smuzhiyun 
__l2cap_ecred_conn_rsp_defer(struct l2cap_chan * chan)3961*4882a593Smuzhiyun void __l2cap_ecred_conn_rsp_defer(struct l2cap_chan *chan)
3962*4882a593Smuzhiyun {
3963*4882a593Smuzhiyun 	struct {
3964*4882a593Smuzhiyun 		struct l2cap_ecred_conn_rsp rsp;
3965*4882a593Smuzhiyun 		__le16 dcid[5];
3966*4882a593Smuzhiyun 	} __packed pdu;
3967*4882a593Smuzhiyun 	struct l2cap_conn *conn = chan->conn;
3968*4882a593Smuzhiyun 	u16 ident = chan->ident;
3969*4882a593Smuzhiyun 	int i = 0;
3970*4882a593Smuzhiyun 
3971*4882a593Smuzhiyun 	if (!ident)
3972*4882a593Smuzhiyun 		return;
3973*4882a593Smuzhiyun 
3974*4882a593Smuzhiyun 	BT_DBG("chan %p ident %d", chan, ident);
3975*4882a593Smuzhiyun 
3976*4882a593Smuzhiyun 	pdu.rsp.mtu     = cpu_to_le16(chan->imtu);
3977*4882a593Smuzhiyun 	pdu.rsp.mps     = cpu_to_le16(chan->mps);
3978*4882a593Smuzhiyun 	pdu.rsp.credits = cpu_to_le16(chan->rx_credits);
3979*4882a593Smuzhiyun 	pdu.rsp.result  = cpu_to_le16(L2CAP_CR_LE_SUCCESS);
3980*4882a593Smuzhiyun 
3981*4882a593Smuzhiyun 	mutex_lock(&conn->chan_lock);
3982*4882a593Smuzhiyun 
3983*4882a593Smuzhiyun 	list_for_each_entry(chan, &conn->chan_l, list) {
3984*4882a593Smuzhiyun 		if (chan->ident != ident)
3985*4882a593Smuzhiyun 			continue;
3986*4882a593Smuzhiyun 
3987*4882a593Smuzhiyun 		/* Reset ident so only one response is sent */
3988*4882a593Smuzhiyun 		chan->ident = 0;
3989*4882a593Smuzhiyun 
3990*4882a593Smuzhiyun 		/* Include all channels pending with the same ident */
3991*4882a593Smuzhiyun 		pdu.dcid[i++] = cpu_to_le16(chan->scid);
3992*4882a593Smuzhiyun 	}
3993*4882a593Smuzhiyun 
3994*4882a593Smuzhiyun 	mutex_unlock(&conn->chan_lock);
3995*4882a593Smuzhiyun 
3996*4882a593Smuzhiyun 	l2cap_send_cmd(conn, ident, L2CAP_ECRED_CONN_RSP,
3997*4882a593Smuzhiyun 			sizeof(pdu.rsp) + i * sizeof(__le16), &pdu);
3998*4882a593Smuzhiyun }
3999*4882a593Smuzhiyun 
__l2cap_connect_rsp_defer(struct l2cap_chan * chan)4000*4882a593Smuzhiyun void __l2cap_connect_rsp_defer(struct l2cap_chan *chan)
4001*4882a593Smuzhiyun {
4002*4882a593Smuzhiyun 	struct l2cap_conn_rsp rsp;
4003*4882a593Smuzhiyun 	struct l2cap_conn *conn = chan->conn;
4004*4882a593Smuzhiyun 	u8 buf[128];
4005*4882a593Smuzhiyun 	u8 rsp_code;
4006*4882a593Smuzhiyun 
4007*4882a593Smuzhiyun 	rsp.scid   = cpu_to_le16(chan->dcid);
4008*4882a593Smuzhiyun 	rsp.dcid   = cpu_to_le16(chan->scid);
4009*4882a593Smuzhiyun 	rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
4010*4882a593Smuzhiyun 	rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
4011*4882a593Smuzhiyun 
4012*4882a593Smuzhiyun 	if (chan->hs_hcon)
4013*4882a593Smuzhiyun 		rsp_code = L2CAP_CREATE_CHAN_RSP;
4014*4882a593Smuzhiyun 	else
4015*4882a593Smuzhiyun 		rsp_code = L2CAP_CONN_RSP;
4016*4882a593Smuzhiyun 
4017*4882a593Smuzhiyun 	BT_DBG("chan %p rsp_code %u", chan, rsp_code);
4018*4882a593Smuzhiyun 
4019*4882a593Smuzhiyun 	l2cap_send_cmd(conn, chan->ident, rsp_code, sizeof(rsp), &rsp);
4020*4882a593Smuzhiyun 
4021*4882a593Smuzhiyun 	if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
4022*4882a593Smuzhiyun 		return;
4023*4882a593Smuzhiyun 
4024*4882a593Smuzhiyun 	l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
4025*4882a593Smuzhiyun 		       l2cap_build_conf_req(chan, buf, sizeof(buf)), buf);
4026*4882a593Smuzhiyun 	chan->num_conf_req++;
4027*4882a593Smuzhiyun }
4028*4882a593Smuzhiyun 
l2cap_conf_rfc_get(struct l2cap_chan * chan,void * rsp,int len)4029*4882a593Smuzhiyun static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len)
4030*4882a593Smuzhiyun {
4031*4882a593Smuzhiyun 	int type, olen;
4032*4882a593Smuzhiyun 	unsigned long val;
4033*4882a593Smuzhiyun 	/* Use sane default values in case a misbehaving remote device
4034*4882a593Smuzhiyun 	 * did not send an RFC or extended window size option.
4035*4882a593Smuzhiyun 	 */
4036*4882a593Smuzhiyun 	u16 txwin_ext = chan->ack_win;
4037*4882a593Smuzhiyun 	struct l2cap_conf_rfc rfc = {
4038*4882a593Smuzhiyun 		.mode = chan->mode,
4039*4882a593Smuzhiyun 		.retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO),
4040*4882a593Smuzhiyun 		.monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO),
4041*4882a593Smuzhiyun 		.max_pdu_size = cpu_to_le16(chan->imtu),
4042*4882a593Smuzhiyun 		.txwin_size = min_t(u16, chan->ack_win, L2CAP_DEFAULT_TX_WINDOW),
4043*4882a593Smuzhiyun 	};
4044*4882a593Smuzhiyun 
4045*4882a593Smuzhiyun 	BT_DBG("chan %p, rsp %p, len %d", chan, rsp, len);
4046*4882a593Smuzhiyun 
4047*4882a593Smuzhiyun 	if ((chan->mode != L2CAP_MODE_ERTM) && (chan->mode != L2CAP_MODE_STREAMING))
4048*4882a593Smuzhiyun 		return;
4049*4882a593Smuzhiyun 
4050*4882a593Smuzhiyun 	while (len >= L2CAP_CONF_OPT_SIZE) {
4051*4882a593Smuzhiyun 		len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
4052*4882a593Smuzhiyun 		if (len < 0)
4053*4882a593Smuzhiyun 			break;
4054*4882a593Smuzhiyun 
4055*4882a593Smuzhiyun 		switch (type) {
4056*4882a593Smuzhiyun 		case L2CAP_CONF_RFC:
4057*4882a593Smuzhiyun 			if (olen != sizeof(rfc))
4058*4882a593Smuzhiyun 				break;
4059*4882a593Smuzhiyun 			memcpy(&rfc, (void *)val, olen);
4060*4882a593Smuzhiyun 			break;
4061*4882a593Smuzhiyun 		case L2CAP_CONF_EWS:
4062*4882a593Smuzhiyun 			if (olen != 2)
4063*4882a593Smuzhiyun 				break;
4064*4882a593Smuzhiyun 			txwin_ext = val;
4065*4882a593Smuzhiyun 			break;
4066*4882a593Smuzhiyun 		}
4067*4882a593Smuzhiyun 	}
4068*4882a593Smuzhiyun 
4069*4882a593Smuzhiyun 	switch (rfc.mode) {
4070*4882a593Smuzhiyun 	case L2CAP_MODE_ERTM:
4071*4882a593Smuzhiyun 		chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
4072*4882a593Smuzhiyun 		chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
4073*4882a593Smuzhiyun 		chan->mps = le16_to_cpu(rfc.max_pdu_size);
4074*4882a593Smuzhiyun 		if (test_bit(FLAG_EXT_CTRL, &chan->flags))
4075*4882a593Smuzhiyun 			chan->ack_win = min_t(u16, chan->ack_win, txwin_ext);
4076*4882a593Smuzhiyun 		else
4077*4882a593Smuzhiyun 			chan->ack_win = min_t(u16, chan->ack_win,
4078*4882a593Smuzhiyun 					      rfc.txwin_size);
4079*4882a593Smuzhiyun 		break;
4080*4882a593Smuzhiyun 	case L2CAP_MODE_STREAMING:
4081*4882a593Smuzhiyun 		chan->mps    = le16_to_cpu(rfc.max_pdu_size);
4082*4882a593Smuzhiyun 	}
4083*4882a593Smuzhiyun }
4084*4882a593Smuzhiyun 
l2cap_command_rej(struct l2cap_conn * conn,struct l2cap_cmd_hdr * cmd,u16 cmd_len,u8 * data)4085*4882a593Smuzhiyun static inline int l2cap_command_rej(struct l2cap_conn *conn,
4086*4882a593Smuzhiyun 				    struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4087*4882a593Smuzhiyun 				    u8 *data)
4088*4882a593Smuzhiyun {
4089*4882a593Smuzhiyun 	struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
4090*4882a593Smuzhiyun 
4091*4882a593Smuzhiyun 	if (cmd_len < sizeof(*rej))
4092*4882a593Smuzhiyun 		return -EPROTO;
4093*4882a593Smuzhiyun 
4094*4882a593Smuzhiyun 	if (rej->reason != L2CAP_REJ_NOT_UNDERSTOOD)
4095*4882a593Smuzhiyun 		return 0;
4096*4882a593Smuzhiyun 
4097*4882a593Smuzhiyun 	if ((conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) &&
4098*4882a593Smuzhiyun 	    cmd->ident == conn->info_ident) {
4099*4882a593Smuzhiyun 		cancel_delayed_work(&conn->info_timer);
4100*4882a593Smuzhiyun 
4101*4882a593Smuzhiyun 		conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4102*4882a593Smuzhiyun 		conn->info_ident = 0;
4103*4882a593Smuzhiyun 
4104*4882a593Smuzhiyun 		l2cap_conn_start(conn);
4105*4882a593Smuzhiyun 	}
4106*4882a593Smuzhiyun 
4107*4882a593Smuzhiyun 	return 0;
4108*4882a593Smuzhiyun }
4109*4882a593Smuzhiyun 
l2cap_connect(struct l2cap_conn * conn,struct l2cap_cmd_hdr * cmd,u8 * data,u8 rsp_code,u8 amp_id)4110*4882a593Smuzhiyun static struct l2cap_chan *l2cap_connect(struct l2cap_conn *conn,
4111*4882a593Smuzhiyun 					struct l2cap_cmd_hdr *cmd,
4112*4882a593Smuzhiyun 					u8 *data, u8 rsp_code, u8 amp_id)
4113*4882a593Smuzhiyun {
4114*4882a593Smuzhiyun 	struct l2cap_conn_req *req = (struct l2cap_conn_req *) data;
4115*4882a593Smuzhiyun 	struct l2cap_conn_rsp rsp;
4116*4882a593Smuzhiyun 	struct l2cap_chan *chan = NULL, *pchan;
4117*4882a593Smuzhiyun 	int result, status = L2CAP_CS_NO_INFO;
4118*4882a593Smuzhiyun 
4119*4882a593Smuzhiyun 	u16 dcid = 0, scid = __le16_to_cpu(req->scid);
4120*4882a593Smuzhiyun 	__le16 psm = req->psm;
4121*4882a593Smuzhiyun 
4122*4882a593Smuzhiyun 	BT_DBG("psm 0x%2.2x scid 0x%4.4x", __le16_to_cpu(psm), scid);
4123*4882a593Smuzhiyun 
4124*4882a593Smuzhiyun 	/* Check if we have socket listening on psm */
4125*4882a593Smuzhiyun 	pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
4126*4882a593Smuzhiyun 					 &conn->hcon->dst, ACL_LINK);
4127*4882a593Smuzhiyun 	if (!pchan) {
4128*4882a593Smuzhiyun 		result = L2CAP_CR_BAD_PSM;
4129*4882a593Smuzhiyun 		goto sendresp;
4130*4882a593Smuzhiyun 	}
4131*4882a593Smuzhiyun 
4132*4882a593Smuzhiyun 	mutex_lock(&conn->chan_lock);
4133*4882a593Smuzhiyun 	l2cap_chan_lock(pchan);
4134*4882a593Smuzhiyun 
4135*4882a593Smuzhiyun 	/* Check if the ACL is secure enough (if not SDP) */
4136*4882a593Smuzhiyun 	if (psm != cpu_to_le16(L2CAP_PSM_SDP) &&
4137*4882a593Smuzhiyun 	    !hci_conn_check_link_mode(conn->hcon)) {
4138*4882a593Smuzhiyun 		conn->disc_reason = HCI_ERROR_AUTH_FAILURE;
4139*4882a593Smuzhiyun 		result = L2CAP_CR_SEC_BLOCK;
4140*4882a593Smuzhiyun 		goto response;
4141*4882a593Smuzhiyun 	}
4142*4882a593Smuzhiyun 
4143*4882a593Smuzhiyun 	result = L2CAP_CR_NO_MEM;
4144*4882a593Smuzhiyun 
4145*4882a593Smuzhiyun 	/* Check for valid dynamic CID range (as per Erratum 3253) */
4146*4882a593Smuzhiyun 	if (scid < L2CAP_CID_DYN_START || scid > L2CAP_CID_DYN_END) {
4147*4882a593Smuzhiyun 		result = L2CAP_CR_INVALID_SCID;
4148*4882a593Smuzhiyun 		goto response;
4149*4882a593Smuzhiyun 	}
4150*4882a593Smuzhiyun 
4151*4882a593Smuzhiyun 	/* Check if we already have channel with that dcid */
4152*4882a593Smuzhiyun 	if (__l2cap_get_chan_by_dcid(conn, scid)) {
4153*4882a593Smuzhiyun 		result = L2CAP_CR_SCID_IN_USE;
4154*4882a593Smuzhiyun 		goto response;
4155*4882a593Smuzhiyun 	}
4156*4882a593Smuzhiyun 
4157*4882a593Smuzhiyun 	chan = pchan->ops->new_connection(pchan);
4158*4882a593Smuzhiyun 	if (!chan)
4159*4882a593Smuzhiyun 		goto response;
4160*4882a593Smuzhiyun 
4161*4882a593Smuzhiyun 	/* For certain devices (ex: HID mouse), support for authentication,
4162*4882a593Smuzhiyun 	 * pairing and bonding is optional. For such devices, inorder to avoid
4163*4882a593Smuzhiyun 	 * the ACL alive for too long after L2CAP disconnection, reset the ACL
4164*4882a593Smuzhiyun 	 * disc_timeout back to HCI_DISCONN_TIMEOUT during L2CAP connect.
4165*4882a593Smuzhiyun 	 */
4166*4882a593Smuzhiyun 	conn->hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
4167*4882a593Smuzhiyun 
4168*4882a593Smuzhiyun 	bacpy(&chan->src, &conn->hcon->src);
4169*4882a593Smuzhiyun 	bacpy(&chan->dst, &conn->hcon->dst);
4170*4882a593Smuzhiyun 	chan->src_type = bdaddr_src_type(conn->hcon);
4171*4882a593Smuzhiyun 	chan->dst_type = bdaddr_dst_type(conn->hcon);
4172*4882a593Smuzhiyun 	chan->psm  = psm;
4173*4882a593Smuzhiyun 	chan->dcid = scid;
4174*4882a593Smuzhiyun 	chan->local_amp_id = amp_id;
4175*4882a593Smuzhiyun 
4176*4882a593Smuzhiyun 	__l2cap_chan_add(conn, chan);
4177*4882a593Smuzhiyun 
4178*4882a593Smuzhiyun 	dcid = chan->scid;
4179*4882a593Smuzhiyun 
4180*4882a593Smuzhiyun 	__set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
4181*4882a593Smuzhiyun 
4182*4882a593Smuzhiyun 	chan->ident = cmd->ident;
4183*4882a593Smuzhiyun 
4184*4882a593Smuzhiyun 	if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) {
4185*4882a593Smuzhiyun 		if (l2cap_chan_check_security(chan, false)) {
4186*4882a593Smuzhiyun 			if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
4187*4882a593Smuzhiyun 				l2cap_state_change(chan, BT_CONNECT2);
4188*4882a593Smuzhiyun 				result = L2CAP_CR_PEND;
4189*4882a593Smuzhiyun 				status = L2CAP_CS_AUTHOR_PEND;
4190*4882a593Smuzhiyun 				chan->ops->defer(chan);
4191*4882a593Smuzhiyun 			} else {
4192*4882a593Smuzhiyun 				/* Force pending result for AMP controllers.
4193*4882a593Smuzhiyun 				 * The connection will succeed after the
4194*4882a593Smuzhiyun 				 * physical link is up.
4195*4882a593Smuzhiyun 				 */
4196*4882a593Smuzhiyun 				if (amp_id == AMP_ID_BREDR) {
4197*4882a593Smuzhiyun 					l2cap_state_change(chan, BT_CONFIG);
4198*4882a593Smuzhiyun 					result = L2CAP_CR_SUCCESS;
4199*4882a593Smuzhiyun 				} else {
4200*4882a593Smuzhiyun 					l2cap_state_change(chan, BT_CONNECT2);
4201*4882a593Smuzhiyun 					result = L2CAP_CR_PEND;
4202*4882a593Smuzhiyun 				}
4203*4882a593Smuzhiyun 				status = L2CAP_CS_NO_INFO;
4204*4882a593Smuzhiyun 			}
4205*4882a593Smuzhiyun 		} else {
4206*4882a593Smuzhiyun 			l2cap_state_change(chan, BT_CONNECT2);
4207*4882a593Smuzhiyun 			result = L2CAP_CR_PEND;
4208*4882a593Smuzhiyun 			status = L2CAP_CS_AUTHEN_PEND;
4209*4882a593Smuzhiyun 		}
4210*4882a593Smuzhiyun 	} else {
4211*4882a593Smuzhiyun 		l2cap_state_change(chan, BT_CONNECT2);
4212*4882a593Smuzhiyun 		result = L2CAP_CR_PEND;
4213*4882a593Smuzhiyun 		status = L2CAP_CS_NO_INFO;
4214*4882a593Smuzhiyun 	}
4215*4882a593Smuzhiyun 
4216*4882a593Smuzhiyun response:
4217*4882a593Smuzhiyun 	l2cap_chan_unlock(pchan);
4218*4882a593Smuzhiyun 	mutex_unlock(&conn->chan_lock);
4219*4882a593Smuzhiyun 	l2cap_chan_put(pchan);
4220*4882a593Smuzhiyun 
4221*4882a593Smuzhiyun sendresp:
4222*4882a593Smuzhiyun 	rsp.scid   = cpu_to_le16(scid);
4223*4882a593Smuzhiyun 	rsp.dcid   = cpu_to_le16(dcid);
4224*4882a593Smuzhiyun 	rsp.result = cpu_to_le16(result);
4225*4882a593Smuzhiyun 	rsp.status = cpu_to_le16(status);
4226*4882a593Smuzhiyun 	l2cap_send_cmd(conn, cmd->ident, rsp_code, sizeof(rsp), &rsp);
4227*4882a593Smuzhiyun 
4228*4882a593Smuzhiyun 	if (result == L2CAP_CR_PEND && status == L2CAP_CS_NO_INFO) {
4229*4882a593Smuzhiyun 		struct l2cap_info_req info;
4230*4882a593Smuzhiyun 		info.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
4231*4882a593Smuzhiyun 
4232*4882a593Smuzhiyun 		conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
4233*4882a593Smuzhiyun 		conn->info_ident = l2cap_get_ident(conn);
4234*4882a593Smuzhiyun 
4235*4882a593Smuzhiyun 		schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
4236*4882a593Smuzhiyun 
4237*4882a593Smuzhiyun 		l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
4238*4882a593Smuzhiyun 			       sizeof(info), &info);
4239*4882a593Smuzhiyun 	}
4240*4882a593Smuzhiyun 
4241*4882a593Smuzhiyun 	if (chan && !test_bit(CONF_REQ_SENT, &chan->conf_state) &&
4242*4882a593Smuzhiyun 	    result == L2CAP_CR_SUCCESS) {
4243*4882a593Smuzhiyun 		u8 buf[128];
4244*4882a593Smuzhiyun 		set_bit(CONF_REQ_SENT, &chan->conf_state);
4245*4882a593Smuzhiyun 		l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
4246*4882a593Smuzhiyun 			       l2cap_build_conf_req(chan, buf, sizeof(buf)), buf);
4247*4882a593Smuzhiyun 		chan->num_conf_req++;
4248*4882a593Smuzhiyun 	}
4249*4882a593Smuzhiyun 
4250*4882a593Smuzhiyun 	return chan;
4251*4882a593Smuzhiyun }
4252*4882a593Smuzhiyun 
l2cap_connect_req(struct l2cap_conn * conn,struct l2cap_cmd_hdr * cmd,u16 cmd_len,u8 * data)4253*4882a593Smuzhiyun static int l2cap_connect_req(struct l2cap_conn *conn,
4254*4882a593Smuzhiyun 			     struct l2cap_cmd_hdr *cmd, u16 cmd_len, u8 *data)
4255*4882a593Smuzhiyun {
4256*4882a593Smuzhiyun 	struct hci_dev *hdev = conn->hcon->hdev;
4257*4882a593Smuzhiyun 	struct hci_conn *hcon = conn->hcon;
4258*4882a593Smuzhiyun 
4259*4882a593Smuzhiyun 	if (cmd_len < sizeof(struct l2cap_conn_req))
4260*4882a593Smuzhiyun 		return -EPROTO;
4261*4882a593Smuzhiyun 
4262*4882a593Smuzhiyun 	hci_dev_lock(hdev);
4263*4882a593Smuzhiyun 	if (hci_dev_test_flag(hdev, HCI_MGMT) &&
4264*4882a593Smuzhiyun 	    !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &hcon->flags))
4265*4882a593Smuzhiyun 		mgmt_device_connected(hdev, hcon, 0, NULL, 0);
4266*4882a593Smuzhiyun 	hci_dev_unlock(hdev);
4267*4882a593Smuzhiyun 
4268*4882a593Smuzhiyun 	l2cap_connect(conn, cmd, data, L2CAP_CONN_RSP, 0);
4269*4882a593Smuzhiyun 	return 0;
4270*4882a593Smuzhiyun }
4271*4882a593Smuzhiyun 
l2cap_connect_create_rsp(struct l2cap_conn * conn,struct l2cap_cmd_hdr * cmd,u16 cmd_len,u8 * data)4272*4882a593Smuzhiyun static int l2cap_connect_create_rsp(struct l2cap_conn *conn,
4273*4882a593Smuzhiyun 				    struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4274*4882a593Smuzhiyun 				    u8 *data)
4275*4882a593Smuzhiyun {
4276*4882a593Smuzhiyun 	struct l2cap_conn_rsp *rsp = (struct l2cap_conn_rsp *) data;
4277*4882a593Smuzhiyun 	u16 scid, dcid, result, status;
4278*4882a593Smuzhiyun 	struct l2cap_chan *chan;
4279*4882a593Smuzhiyun 	u8 req[128];
4280*4882a593Smuzhiyun 	int err;
4281*4882a593Smuzhiyun 
4282*4882a593Smuzhiyun 	if (cmd_len < sizeof(*rsp))
4283*4882a593Smuzhiyun 		return -EPROTO;
4284*4882a593Smuzhiyun 
4285*4882a593Smuzhiyun 	scid   = __le16_to_cpu(rsp->scid);
4286*4882a593Smuzhiyun 	dcid   = __le16_to_cpu(rsp->dcid);
4287*4882a593Smuzhiyun 	result = __le16_to_cpu(rsp->result);
4288*4882a593Smuzhiyun 	status = __le16_to_cpu(rsp->status);
4289*4882a593Smuzhiyun 
4290*4882a593Smuzhiyun 	BT_DBG("dcid 0x%4.4x scid 0x%4.4x result 0x%2.2x status 0x%2.2x",
4291*4882a593Smuzhiyun 	       dcid, scid, result, status);
4292*4882a593Smuzhiyun 
4293*4882a593Smuzhiyun 	mutex_lock(&conn->chan_lock);
4294*4882a593Smuzhiyun 
4295*4882a593Smuzhiyun 	if (scid) {
4296*4882a593Smuzhiyun 		chan = __l2cap_get_chan_by_scid(conn, scid);
4297*4882a593Smuzhiyun 		if (!chan) {
4298*4882a593Smuzhiyun 			err = -EBADSLT;
4299*4882a593Smuzhiyun 			goto unlock;
4300*4882a593Smuzhiyun 		}
4301*4882a593Smuzhiyun 	} else {
4302*4882a593Smuzhiyun 		chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
4303*4882a593Smuzhiyun 		if (!chan) {
4304*4882a593Smuzhiyun 			err = -EBADSLT;
4305*4882a593Smuzhiyun 			goto unlock;
4306*4882a593Smuzhiyun 		}
4307*4882a593Smuzhiyun 	}
4308*4882a593Smuzhiyun 
4309*4882a593Smuzhiyun 	chan = l2cap_chan_hold_unless_zero(chan);
4310*4882a593Smuzhiyun 	if (!chan) {
4311*4882a593Smuzhiyun 		err = -EBADSLT;
4312*4882a593Smuzhiyun 		goto unlock;
4313*4882a593Smuzhiyun 	}
4314*4882a593Smuzhiyun 
4315*4882a593Smuzhiyun 	err = 0;
4316*4882a593Smuzhiyun 
4317*4882a593Smuzhiyun 	l2cap_chan_lock(chan);
4318*4882a593Smuzhiyun 
4319*4882a593Smuzhiyun 	switch (result) {
4320*4882a593Smuzhiyun 	case L2CAP_CR_SUCCESS:
4321*4882a593Smuzhiyun 		l2cap_state_change(chan, BT_CONFIG);
4322*4882a593Smuzhiyun 		chan->ident = 0;
4323*4882a593Smuzhiyun 		chan->dcid = dcid;
4324*4882a593Smuzhiyun 		clear_bit(CONF_CONNECT_PEND, &chan->conf_state);
4325*4882a593Smuzhiyun 
4326*4882a593Smuzhiyun 		if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
4327*4882a593Smuzhiyun 			break;
4328*4882a593Smuzhiyun 
4329*4882a593Smuzhiyun 		l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
4330*4882a593Smuzhiyun 			       l2cap_build_conf_req(chan, req, sizeof(req)), req);
4331*4882a593Smuzhiyun 		chan->num_conf_req++;
4332*4882a593Smuzhiyun 		break;
4333*4882a593Smuzhiyun 
4334*4882a593Smuzhiyun 	case L2CAP_CR_PEND:
4335*4882a593Smuzhiyun 		set_bit(CONF_CONNECT_PEND, &chan->conf_state);
4336*4882a593Smuzhiyun 		break;
4337*4882a593Smuzhiyun 
4338*4882a593Smuzhiyun 	default:
4339*4882a593Smuzhiyun 		l2cap_chan_del(chan, ECONNREFUSED);
4340*4882a593Smuzhiyun 		break;
4341*4882a593Smuzhiyun 	}
4342*4882a593Smuzhiyun 
4343*4882a593Smuzhiyun 	l2cap_chan_unlock(chan);
4344*4882a593Smuzhiyun 	l2cap_chan_put(chan);
4345*4882a593Smuzhiyun 
4346*4882a593Smuzhiyun unlock:
4347*4882a593Smuzhiyun 	mutex_unlock(&conn->chan_lock);
4348*4882a593Smuzhiyun 
4349*4882a593Smuzhiyun 	return err;
4350*4882a593Smuzhiyun }
4351*4882a593Smuzhiyun 
set_default_fcs(struct l2cap_chan * chan)4352*4882a593Smuzhiyun static inline void set_default_fcs(struct l2cap_chan *chan)
4353*4882a593Smuzhiyun {
4354*4882a593Smuzhiyun 	/* FCS is enabled only in ERTM or streaming mode, if one or both
4355*4882a593Smuzhiyun 	 * sides request it.
4356*4882a593Smuzhiyun 	 */
4357*4882a593Smuzhiyun 	if (chan->mode != L2CAP_MODE_ERTM && chan->mode != L2CAP_MODE_STREAMING)
4358*4882a593Smuzhiyun 		chan->fcs = L2CAP_FCS_NONE;
4359*4882a593Smuzhiyun 	else if (!test_bit(CONF_RECV_NO_FCS, &chan->conf_state))
4360*4882a593Smuzhiyun 		chan->fcs = L2CAP_FCS_CRC16;
4361*4882a593Smuzhiyun }
4362*4882a593Smuzhiyun 
l2cap_send_efs_conf_rsp(struct l2cap_chan * chan,void * data,u8 ident,u16 flags)4363*4882a593Smuzhiyun static void l2cap_send_efs_conf_rsp(struct l2cap_chan *chan, void *data,
4364*4882a593Smuzhiyun 				    u8 ident, u16 flags)
4365*4882a593Smuzhiyun {
4366*4882a593Smuzhiyun 	struct l2cap_conn *conn = chan->conn;
4367*4882a593Smuzhiyun 
4368*4882a593Smuzhiyun 	BT_DBG("conn %p chan %p ident %d flags 0x%4.4x", conn, chan, ident,
4369*4882a593Smuzhiyun 	       flags);
4370*4882a593Smuzhiyun 
4371*4882a593Smuzhiyun 	clear_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
4372*4882a593Smuzhiyun 	set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
4373*4882a593Smuzhiyun 
4374*4882a593Smuzhiyun 	l2cap_send_cmd(conn, ident, L2CAP_CONF_RSP,
4375*4882a593Smuzhiyun 		       l2cap_build_conf_rsp(chan, data,
4376*4882a593Smuzhiyun 					    L2CAP_CONF_SUCCESS, flags), data);
4377*4882a593Smuzhiyun }
4378*4882a593Smuzhiyun 
cmd_reject_invalid_cid(struct l2cap_conn * conn,u8 ident,u16 scid,u16 dcid)4379*4882a593Smuzhiyun static void cmd_reject_invalid_cid(struct l2cap_conn *conn, u8 ident,
4380*4882a593Smuzhiyun 				   u16 scid, u16 dcid)
4381*4882a593Smuzhiyun {
4382*4882a593Smuzhiyun 	struct l2cap_cmd_rej_cid rej;
4383*4882a593Smuzhiyun 
4384*4882a593Smuzhiyun 	rej.reason = cpu_to_le16(L2CAP_REJ_INVALID_CID);
4385*4882a593Smuzhiyun 	rej.scid = __cpu_to_le16(scid);
4386*4882a593Smuzhiyun 	rej.dcid = __cpu_to_le16(dcid);
4387*4882a593Smuzhiyun 
4388*4882a593Smuzhiyun 	l2cap_send_cmd(conn, ident, L2CAP_COMMAND_REJ, sizeof(rej), &rej);
4389*4882a593Smuzhiyun }
4390*4882a593Smuzhiyun 
l2cap_config_req(struct l2cap_conn * conn,struct l2cap_cmd_hdr * cmd,u16 cmd_len,u8 * data)4391*4882a593Smuzhiyun static inline int l2cap_config_req(struct l2cap_conn *conn,
4392*4882a593Smuzhiyun 				   struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4393*4882a593Smuzhiyun 				   u8 *data)
4394*4882a593Smuzhiyun {
4395*4882a593Smuzhiyun 	struct l2cap_conf_req *req = (struct l2cap_conf_req *) data;
4396*4882a593Smuzhiyun 	u16 dcid, flags;
4397*4882a593Smuzhiyun 	u8 rsp[64];
4398*4882a593Smuzhiyun 	struct l2cap_chan *chan;
4399*4882a593Smuzhiyun 	int len, err = 0;
4400*4882a593Smuzhiyun 
4401*4882a593Smuzhiyun 	if (cmd_len < sizeof(*req))
4402*4882a593Smuzhiyun 		return -EPROTO;
4403*4882a593Smuzhiyun 
4404*4882a593Smuzhiyun 	dcid  = __le16_to_cpu(req->dcid);
4405*4882a593Smuzhiyun 	flags = __le16_to_cpu(req->flags);
4406*4882a593Smuzhiyun 
4407*4882a593Smuzhiyun 	BT_DBG("dcid 0x%4.4x flags 0x%2.2x", dcid, flags);
4408*4882a593Smuzhiyun 
4409*4882a593Smuzhiyun 	chan = l2cap_get_chan_by_scid(conn, dcid);
4410*4882a593Smuzhiyun 	if (!chan) {
4411*4882a593Smuzhiyun 		cmd_reject_invalid_cid(conn, cmd->ident, dcid, 0);
4412*4882a593Smuzhiyun 		return 0;
4413*4882a593Smuzhiyun 	}
4414*4882a593Smuzhiyun 
4415*4882a593Smuzhiyun 	if (chan->state != BT_CONFIG && chan->state != BT_CONNECT2 &&
4416*4882a593Smuzhiyun 	    chan->state != BT_CONNECTED) {
4417*4882a593Smuzhiyun 		cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4418*4882a593Smuzhiyun 				       chan->dcid);
4419*4882a593Smuzhiyun 		goto unlock;
4420*4882a593Smuzhiyun 	}
4421*4882a593Smuzhiyun 
4422*4882a593Smuzhiyun 	/* Reject if config buffer is too small. */
4423*4882a593Smuzhiyun 	len = cmd_len - sizeof(*req);
4424*4882a593Smuzhiyun 	if (chan->conf_len + len > sizeof(chan->conf_req)) {
4425*4882a593Smuzhiyun 		l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
4426*4882a593Smuzhiyun 			       l2cap_build_conf_rsp(chan, rsp,
4427*4882a593Smuzhiyun 			       L2CAP_CONF_REJECT, flags), rsp);
4428*4882a593Smuzhiyun 		goto unlock;
4429*4882a593Smuzhiyun 	}
4430*4882a593Smuzhiyun 
4431*4882a593Smuzhiyun 	/* Store config. */
4432*4882a593Smuzhiyun 	memcpy(chan->conf_req + chan->conf_len, req->data, len);
4433*4882a593Smuzhiyun 	chan->conf_len += len;
4434*4882a593Smuzhiyun 
4435*4882a593Smuzhiyun 	if (flags & L2CAP_CONF_FLAG_CONTINUATION) {
4436*4882a593Smuzhiyun 		/* Incomplete config. Send empty response. */
4437*4882a593Smuzhiyun 		l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
4438*4882a593Smuzhiyun 			       l2cap_build_conf_rsp(chan, rsp,
4439*4882a593Smuzhiyun 			       L2CAP_CONF_SUCCESS, flags), rsp);
4440*4882a593Smuzhiyun 		goto unlock;
4441*4882a593Smuzhiyun 	}
4442*4882a593Smuzhiyun 
4443*4882a593Smuzhiyun 	/* Complete config. */
4444*4882a593Smuzhiyun 	len = l2cap_parse_conf_req(chan, rsp, sizeof(rsp));
4445*4882a593Smuzhiyun 	if (len < 0) {
4446*4882a593Smuzhiyun 		l2cap_send_disconn_req(chan, ECONNRESET);
4447*4882a593Smuzhiyun 		goto unlock;
4448*4882a593Smuzhiyun 	}
4449*4882a593Smuzhiyun 
4450*4882a593Smuzhiyun 	chan->ident = cmd->ident;
4451*4882a593Smuzhiyun 	l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp);
4452*4882a593Smuzhiyun 	if (chan->num_conf_rsp < L2CAP_CONF_MAX_CONF_RSP)
4453*4882a593Smuzhiyun 		chan->num_conf_rsp++;
4454*4882a593Smuzhiyun 
4455*4882a593Smuzhiyun 	/* Reset config buffer. */
4456*4882a593Smuzhiyun 	chan->conf_len = 0;
4457*4882a593Smuzhiyun 
4458*4882a593Smuzhiyun 	if (!test_bit(CONF_OUTPUT_DONE, &chan->conf_state))
4459*4882a593Smuzhiyun 		goto unlock;
4460*4882a593Smuzhiyun 
4461*4882a593Smuzhiyun 	if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
4462*4882a593Smuzhiyun 		set_default_fcs(chan);
4463*4882a593Smuzhiyun 
4464*4882a593Smuzhiyun 		if (chan->mode == L2CAP_MODE_ERTM ||
4465*4882a593Smuzhiyun 		    chan->mode == L2CAP_MODE_STREAMING)
4466*4882a593Smuzhiyun 			err = l2cap_ertm_init(chan);
4467*4882a593Smuzhiyun 
4468*4882a593Smuzhiyun 		if (err < 0)
4469*4882a593Smuzhiyun 			l2cap_send_disconn_req(chan, -err);
4470*4882a593Smuzhiyun 		else
4471*4882a593Smuzhiyun 			l2cap_chan_ready(chan);
4472*4882a593Smuzhiyun 
4473*4882a593Smuzhiyun 		goto unlock;
4474*4882a593Smuzhiyun 	}
4475*4882a593Smuzhiyun 
4476*4882a593Smuzhiyun 	if (!test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) {
4477*4882a593Smuzhiyun 		u8 buf[64];
4478*4882a593Smuzhiyun 		l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
4479*4882a593Smuzhiyun 			       l2cap_build_conf_req(chan, buf, sizeof(buf)), buf);
4480*4882a593Smuzhiyun 		chan->num_conf_req++;
4481*4882a593Smuzhiyun 	}
4482*4882a593Smuzhiyun 
4483*4882a593Smuzhiyun 	/* Got Conf Rsp PENDING from remote side and assume we sent
4484*4882a593Smuzhiyun 	   Conf Rsp PENDING in the code above */
4485*4882a593Smuzhiyun 	if (test_bit(CONF_REM_CONF_PEND, &chan->conf_state) &&
4486*4882a593Smuzhiyun 	    test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
4487*4882a593Smuzhiyun 
4488*4882a593Smuzhiyun 		/* check compatibility */
4489*4882a593Smuzhiyun 
4490*4882a593Smuzhiyun 		/* Send rsp for BR/EDR channel */
4491*4882a593Smuzhiyun 		if (!chan->hs_hcon)
4492*4882a593Smuzhiyun 			l2cap_send_efs_conf_rsp(chan, rsp, cmd->ident, flags);
4493*4882a593Smuzhiyun 		else
4494*4882a593Smuzhiyun 			chan->ident = cmd->ident;
4495*4882a593Smuzhiyun 	}
4496*4882a593Smuzhiyun 
4497*4882a593Smuzhiyun unlock:
4498*4882a593Smuzhiyun 	l2cap_chan_unlock(chan);
4499*4882a593Smuzhiyun 	l2cap_chan_put(chan);
4500*4882a593Smuzhiyun 	return err;
4501*4882a593Smuzhiyun }
4502*4882a593Smuzhiyun 
l2cap_config_rsp(struct l2cap_conn * conn,struct l2cap_cmd_hdr * cmd,u16 cmd_len,u8 * data)4503*4882a593Smuzhiyun static inline int l2cap_config_rsp(struct l2cap_conn *conn,
4504*4882a593Smuzhiyun 				   struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4505*4882a593Smuzhiyun 				   u8 *data)
4506*4882a593Smuzhiyun {
4507*4882a593Smuzhiyun 	struct l2cap_conf_rsp *rsp = (struct l2cap_conf_rsp *)data;
4508*4882a593Smuzhiyun 	u16 scid, flags, result;
4509*4882a593Smuzhiyun 	struct l2cap_chan *chan;
4510*4882a593Smuzhiyun 	int len = cmd_len - sizeof(*rsp);
4511*4882a593Smuzhiyun 	int err = 0;
4512*4882a593Smuzhiyun 
4513*4882a593Smuzhiyun 	if (cmd_len < sizeof(*rsp))
4514*4882a593Smuzhiyun 		return -EPROTO;
4515*4882a593Smuzhiyun 
4516*4882a593Smuzhiyun 	scid   = __le16_to_cpu(rsp->scid);
4517*4882a593Smuzhiyun 	flags  = __le16_to_cpu(rsp->flags);
4518*4882a593Smuzhiyun 	result = __le16_to_cpu(rsp->result);
4519*4882a593Smuzhiyun 
4520*4882a593Smuzhiyun 	BT_DBG("scid 0x%4.4x flags 0x%2.2x result 0x%2.2x len %d", scid, flags,
4521*4882a593Smuzhiyun 	       result, len);
4522*4882a593Smuzhiyun 
4523*4882a593Smuzhiyun 	chan = l2cap_get_chan_by_scid(conn, scid);
4524*4882a593Smuzhiyun 	if (!chan)
4525*4882a593Smuzhiyun 		return 0;
4526*4882a593Smuzhiyun 
4527*4882a593Smuzhiyun 	switch (result) {
4528*4882a593Smuzhiyun 	case L2CAP_CONF_SUCCESS:
4529*4882a593Smuzhiyun 		l2cap_conf_rfc_get(chan, rsp->data, len);
4530*4882a593Smuzhiyun 		clear_bit(CONF_REM_CONF_PEND, &chan->conf_state);
4531*4882a593Smuzhiyun 		break;
4532*4882a593Smuzhiyun 
4533*4882a593Smuzhiyun 	case L2CAP_CONF_PENDING:
4534*4882a593Smuzhiyun 		set_bit(CONF_REM_CONF_PEND, &chan->conf_state);
4535*4882a593Smuzhiyun 
4536*4882a593Smuzhiyun 		if (test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
4537*4882a593Smuzhiyun 			char buf[64];
4538*4882a593Smuzhiyun 
4539*4882a593Smuzhiyun 			len = l2cap_parse_conf_rsp(chan, rsp->data, len,
4540*4882a593Smuzhiyun 						   buf, sizeof(buf), &result);
4541*4882a593Smuzhiyun 			if (len < 0) {
4542*4882a593Smuzhiyun 				l2cap_send_disconn_req(chan, ECONNRESET);
4543*4882a593Smuzhiyun 				goto done;
4544*4882a593Smuzhiyun 			}
4545*4882a593Smuzhiyun 
4546*4882a593Smuzhiyun 			if (!chan->hs_hcon) {
4547*4882a593Smuzhiyun 				l2cap_send_efs_conf_rsp(chan, buf, cmd->ident,
4548*4882a593Smuzhiyun 							0);
4549*4882a593Smuzhiyun 			} else {
4550*4882a593Smuzhiyun 				if (l2cap_check_efs(chan)) {
4551*4882a593Smuzhiyun 					amp_create_logical_link(chan);
4552*4882a593Smuzhiyun 					chan->ident = cmd->ident;
4553*4882a593Smuzhiyun 				}
4554*4882a593Smuzhiyun 			}
4555*4882a593Smuzhiyun 		}
4556*4882a593Smuzhiyun 		goto done;
4557*4882a593Smuzhiyun 
4558*4882a593Smuzhiyun 	case L2CAP_CONF_UNACCEPT:
4559*4882a593Smuzhiyun 		if (chan->num_conf_rsp <= L2CAP_CONF_MAX_CONF_RSP) {
4560*4882a593Smuzhiyun 			char req[64];
4561*4882a593Smuzhiyun 
4562*4882a593Smuzhiyun 			if (len > sizeof(req) - sizeof(struct l2cap_conf_req)) {
4563*4882a593Smuzhiyun 				l2cap_send_disconn_req(chan, ECONNRESET);
4564*4882a593Smuzhiyun 				goto done;
4565*4882a593Smuzhiyun 			}
4566*4882a593Smuzhiyun 
4567*4882a593Smuzhiyun 			/* throw out any old stored conf requests */
4568*4882a593Smuzhiyun 			result = L2CAP_CONF_SUCCESS;
4569*4882a593Smuzhiyun 			len = l2cap_parse_conf_rsp(chan, rsp->data, len,
4570*4882a593Smuzhiyun 						   req, sizeof(req), &result);
4571*4882a593Smuzhiyun 			if (len < 0) {
4572*4882a593Smuzhiyun 				l2cap_send_disconn_req(chan, ECONNRESET);
4573*4882a593Smuzhiyun 				goto done;
4574*4882a593Smuzhiyun 			}
4575*4882a593Smuzhiyun 
4576*4882a593Smuzhiyun 			l2cap_send_cmd(conn, l2cap_get_ident(conn),
4577*4882a593Smuzhiyun 				       L2CAP_CONF_REQ, len, req);
4578*4882a593Smuzhiyun 			chan->num_conf_req++;
4579*4882a593Smuzhiyun 			if (result != L2CAP_CONF_SUCCESS)
4580*4882a593Smuzhiyun 				goto done;
4581*4882a593Smuzhiyun 			break;
4582*4882a593Smuzhiyun 		}
4583*4882a593Smuzhiyun 		fallthrough;
4584*4882a593Smuzhiyun 
4585*4882a593Smuzhiyun 	default:
4586*4882a593Smuzhiyun 		l2cap_chan_set_err(chan, ECONNRESET);
4587*4882a593Smuzhiyun 
4588*4882a593Smuzhiyun 		__set_chan_timer(chan, L2CAP_DISC_REJ_TIMEOUT);
4589*4882a593Smuzhiyun 		l2cap_send_disconn_req(chan, ECONNRESET);
4590*4882a593Smuzhiyun 		goto done;
4591*4882a593Smuzhiyun 	}
4592*4882a593Smuzhiyun 
4593*4882a593Smuzhiyun 	if (flags & L2CAP_CONF_FLAG_CONTINUATION)
4594*4882a593Smuzhiyun 		goto done;
4595*4882a593Smuzhiyun 
4596*4882a593Smuzhiyun 	set_bit(CONF_INPUT_DONE, &chan->conf_state);
4597*4882a593Smuzhiyun 
4598*4882a593Smuzhiyun 	if (test_bit(CONF_OUTPUT_DONE, &chan->conf_state)) {
4599*4882a593Smuzhiyun 		set_default_fcs(chan);
4600*4882a593Smuzhiyun 
4601*4882a593Smuzhiyun 		if (chan->mode == L2CAP_MODE_ERTM ||
4602*4882a593Smuzhiyun 		    chan->mode == L2CAP_MODE_STREAMING)
4603*4882a593Smuzhiyun 			err = l2cap_ertm_init(chan);
4604*4882a593Smuzhiyun 
4605*4882a593Smuzhiyun 		if (err < 0)
4606*4882a593Smuzhiyun 			l2cap_send_disconn_req(chan, -err);
4607*4882a593Smuzhiyun 		else
4608*4882a593Smuzhiyun 			l2cap_chan_ready(chan);
4609*4882a593Smuzhiyun 	}
4610*4882a593Smuzhiyun 
4611*4882a593Smuzhiyun done:
4612*4882a593Smuzhiyun 	l2cap_chan_unlock(chan);
4613*4882a593Smuzhiyun 	l2cap_chan_put(chan);
4614*4882a593Smuzhiyun 	return err;
4615*4882a593Smuzhiyun }
4616*4882a593Smuzhiyun 
l2cap_disconnect_req(struct l2cap_conn * conn,struct l2cap_cmd_hdr * cmd,u16 cmd_len,u8 * data)4617*4882a593Smuzhiyun static inline int l2cap_disconnect_req(struct l2cap_conn *conn,
4618*4882a593Smuzhiyun 				       struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4619*4882a593Smuzhiyun 				       u8 *data)
4620*4882a593Smuzhiyun {
4621*4882a593Smuzhiyun 	struct l2cap_disconn_req *req = (struct l2cap_disconn_req *) data;
4622*4882a593Smuzhiyun 	struct l2cap_disconn_rsp rsp;
4623*4882a593Smuzhiyun 	u16 dcid, scid;
4624*4882a593Smuzhiyun 	struct l2cap_chan *chan;
4625*4882a593Smuzhiyun 
4626*4882a593Smuzhiyun 	if (cmd_len != sizeof(*req))
4627*4882a593Smuzhiyun 		return -EPROTO;
4628*4882a593Smuzhiyun 
4629*4882a593Smuzhiyun 	scid = __le16_to_cpu(req->scid);
4630*4882a593Smuzhiyun 	dcid = __le16_to_cpu(req->dcid);
4631*4882a593Smuzhiyun 
4632*4882a593Smuzhiyun 	BT_DBG("scid 0x%4.4x dcid 0x%4.4x", scid, dcid);
4633*4882a593Smuzhiyun 
4634*4882a593Smuzhiyun 	mutex_lock(&conn->chan_lock);
4635*4882a593Smuzhiyun 
4636*4882a593Smuzhiyun 	chan = __l2cap_get_chan_by_scid(conn, dcid);
4637*4882a593Smuzhiyun 	if (!chan) {
4638*4882a593Smuzhiyun 		mutex_unlock(&conn->chan_lock);
4639*4882a593Smuzhiyun 		cmd_reject_invalid_cid(conn, cmd->ident, dcid, scid);
4640*4882a593Smuzhiyun 		return 0;
4641*4882a593Smuzhiyun 	}
4642*4882a593Smuzhiyun 
4643*4882a593Smuzhiyun 	l2cap_chan_hold(chan);
4644*4882a593Smuzhiyun 	l2cap_chan_lock(chan);
4645*4882a593Smuzhiyun 
4646*4882a593Smuzhiyun 	rsp.dcid = cpu_to_le16(chan->scid);
4647*4882a593Smuzhiyun 	rsp.scid = cpu_to_le16(chan->dcid);
4648*4882a593Smuzhiyun 	l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp);
4649*4882a593Smuzhiyun 
4650*4882a593Smuzhiyun 	chan->ops->set_shutdown(chan);
4651*4882a593Smuzhiyun 
4652*4882a593Smuzhiyun 	l2cap_chan_del(chan, ECONNRESET);
4653*4882a593Smuzhiyun 
4654*4882a593Smuzhiyun 	chan->ops->close(chan);
4655*4882a593Smuzhiyun 
4656*4882a593Smuzhiyun 	l2cap_chan_unlock(chan);
4657*4882a593Smuzhiyun 	l2cap_chan_put(chan);
4658*4882a593Smuzhiyun 
4659*4882a593Smuzhiyun 	mutex_unlock(&conn->chan_lock);
4660*4882a593Smuzhiyun 
4661*4882a593Smuzhiyun 	return 0;
4662*4882a593Smuzhiyun }
4663*4882a593Smuzhiyun 
l2cap_disconnect_rsp(struct l2cap_conn * conn,struct l2cap_cmd_hdr * cmd,u16 cmd_len,u8 * data)4664*4882a593Smuzhiyun static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn,
4665*4882a593Smuzhiyun 				       struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4666*4882a593Smuzhiyun 				       u8 *data)
4667*4882a593Smuzhiyun {
4668*4882a593Smuzhiyun 	struct l2cap_disconn_rsp *rsp = (struct l2cap_disconn_rsp *) data;
4669*4882a593Smuzhiyun 	u16 dcid, scid;
4670*4882a593Smuzhiyun 	struct l2cap_chan *chan;
4671*4882a593Smuzhiyun 
4672*4882a593Smuzhiyun 	if (cmd_len != sizeof(*rsp))
4673*4882a593Smuzhiyun 		return -EPROTO;
4674*4882a593Smuzhiyun 
4675*4882a593Smuzhiyun 	scid = __le16_to_cpu(rsp->scid);
4676*4882a593Smuzhiyun 	dcid = __le16_to_cpu(rsp->dcid);
4677*4882a593Smuzhiyun 
4678*4882a593Smuzhiyun 	BT_DBG("dcid 0x%4.4x scid 0x%4.4x", dcid, scid);
4679*4882a593Smuzhiyun 
4680*4882a593Smuzhiyun 	mutex_lock(&conn->chan_lock);
4681*4882a593Smuzhiyun 
4682*4882a593Smuzhiyun 	chan = __l2cap_get_chan_by_scid(conn, scid);
4683*4882a593Smuzhiyun 	if (!chan) {
4684*4882a593Smuzhiyun 		mutex_unlock(&conn->chan_lock);
4685*4882a593Smuzhiyun 		return 0;
4686*4882a593Smuzhiyun 	}
4687*4882a593Smuzhiyun 
4688*4882a593Smuzhiyun 	l2cap_chan_hold(chan);
4689*4882a593Smuzhiyun 	l2cap_chan_lock(chan);
4690*4882a593Smuzhiyun 
4691*4882a593Smuzhiyun 	if (chan->state != BT_DISCONN) {
4692*4882a593Smuzhiyun 		l2cap_chan_unlock(chan);
4693*4882a593Smuzhiyun 		l2cap_chan_put(chan);
4694*4882a593Smuzhiyun 		mutex_unlock(&conn->chan_lock);
4695*4882a593Smuzhiyun 		return 0;
4696*4882a593Smuzhiyun 	}
4697*4882a593Smuzhiyun 
4698*4882a593Smuzhiyun 	l2cap_chan_del(chan, 0);
4699*4882a593Smuzhiyun 
4700*4882a593Smuzhiyun 	chan->ops->close(chan);
4701*4882a593Smuzhiyun 
4702*4882a593Smuzhiyun 	l2cap_chan_unlock(chan);
4703*4882a593Smuzhiyun 	l2cap_chan_put(chan);
4704*4882a593Smuzhiyun 
4705*4882a593Smuzhiyun 	mutex_unlock(&conn->chan_lock);
4706*4882a593Smuzhiyun 
4707*4882a593Smuzhiyun 	return 0;
4708*4882a593Smuzhiyun }
4709*4882a593Smuzhiyun 
l2cap_information_req(struct l2cap_conn * conn,struct l2cap_cmd_hdr * cmd,u16 cmd_len,u8 * data)4710*4882a593Smuzhiyun static inline int l2cap_information_req(struct l2cap_conn *conn,
4711*4882a593Smuzhiyun 					struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4712*4882a593Smuzhiyun 					u8 *data)
4713*4882a593Smuzhiyun {
4714*4882a593Smuzhiyun 	struct l2cap_info_req *req = (struct l2cap_info_req *) data;
4715*4882a593Smuzhiyun 	u16 type;
4716*4882a593Smuzhiyun 
4717*4882a593Smuzhiyun 	if (cmd_len != sizeof(*req))
4718*4882a593Smuzhiyun 		return -EPROTO;
4719*4882a593Smuzhiyun 
4720*4882a593Smuzhiyun 	type = __le16_to_cpu(req->type);
4721*4882a593Smuzhiyun 
4722*4882a593Smuzhiyun 	BT_DBG("type 0x%4.4x", type);
4723*4882a593Smuzhiyun 
4724*4882a593Smuzhiyun 	if (type == L2CAP_IT_FEAT_MASK) {
4725*4882a593Smuzhiyun 		u8 buf[8];
4726*4882a593Smuzhiyun 		u32 feat_mask = l2cap_feat_mask;
4727*4882a593Smuzhiyun 		struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
4728*4882a593Smuzhiyun 		rsp->type   = cpu_to_le16(L2CAP_IT_FEAT_MASK);
4729*4882a593Smuzhiyun 		rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
4730*4882a593Smuzhiyun 		if (!disable_ertm)
4731*4882a593Smuzhiyun 			feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING
4732*4882a593Smuzhiyun 				| L2CAP_FEAT_FCS;
4733*4882a593Smuzhiyun 		if (conn->local_fixed_chan & L2CAP_FC_A2MP)
4734*4882a593Smuzhiyun 			feat_mask |= L2CAP_FEAT_EXT_FLOW
4735*4882a593Smuzhiyun 				| L2CAP_FEAT_EXT_WINDOW;
4736*4882a593Smuzhiyun 
4737*4882a593Smuzhiyun 		put_unaligned_le32(feat_mask, rsp->data);
4738*4882a593Smuzhiyun 		l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4739*4882a593Smuzhiyun 			       buf);
4740*4882a593Smuzhiyun 	} else if (type == L2CAP_IT_FIXED_CHAN) {
4741*4882a593Smuzhiyun 		u8 buf[12];
4742*4882a593Smuzhiyun 		struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
4743*4882a593Smuzhiyun 
4744*4882a593Smuzhiyun 		rsp->type   = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
4745*4882a593Smuzhiyun 		rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
4746*4882a593Smuzhiyun 		rsp->data[0] = conn->local_fixed_chan;
4747*4882a593Smuzhiyun 		memset(rsp->data + 1, 0, 7);
4748*4882a593Smuzhiyun 		l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4749*4882a593Smuzhiyun 			       buf);
4750*4882a593Smuzhiyun 	} else {
4751*4882a593Smuzhiyun 		struct l2cap_info_rsp rsp;
4752*4882a593Smuzhiyun 		rsp.type   = cpu_to_le16(type);
4753*4882a593Smuzhiyun 		rsp.result = cpu_to_le16(L2CAP_IR_NOTSUPP);
4754*4882a593Smuzhiyun 		l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(rsp),
4755*4882a593Smuzhiyun 			       &rsp);
4756*4882a593Smuzhiyun 	}
4757*4882a593Smuzhiyun 
4758*4882a593Smuzhiyun 	return 0;
4759*4882a593Smuzhiyun }
4760*4882a593Smuzhiyun 
l2cap_information_rsp(struct l2cap_conn * conn,struct l2cap_cmd_hdr * cmd,u16 cmd_len,u8 * data)4761*4882a593Smuzhiyun static inline int l2cap_information_rsp(struct l2cap_conn *conn,
4762*4882a593Smuzhiyun 					struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4763*4882a593Smuzhiyun 					u8 *data)
4764*4882a593Smuzhiyun {
4765*4882a593Smuzhiyun 	struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) data;
4766*4882a593Smuzhiyun 	u16 type, result;
4767*4882a593Smuzhiyun 
4768*4882a593Smuzhiyun 	if (cmd_len < sizeof(*rsp))
4769*4882a593Smuzhiyun 		return -EPROTO;
4770*4882a593Smuzhiyun 
4771*4882a593Smuzhiyun 	type   = __le16_to_cpu(rsp->type);
4772*4882a593Smuzhiyun 	result = __le16_to_cpu(rsp->result);
4773*4882a593Smuzhiyun 
4774*4882a593Smuzhiyun 	BT_DBG("type 0x%4.4x result 0x%2.2x", type, result);
4775*4882a593Smuzhiyun 
4776*4882a593Smuzhiyun 	/* L2CAP Info req/rsp are unbound to channels, add extra checks */
4777*4882a593Smuzhiyun 	if (cmd->ident != conn->info_ident ||
4778*4882a593Smuzhiyun 	    conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)
4779*4882a593Smuzhiyun 		return 0;
4780*4882a593Smuzhiyun 
4781*4882a593Smuzhiyun 	cancel_delayed_work(&conn->info_timer);
4782*4882a593Smuzhiyun 
4783*4882a593Smuzhiyun 	if (result != L2CAP_IR_SUCCESS) {
4784*4882a593Smuzhiyun 		conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4785*4882a593Smuzhiyun 		conn->info_ident = 0;
4786*4882a593Smuzhiyun 
4787*4882a593Smuzhiyun 		l2cap_conn_start(conn);
4788*4882a593Smuzhiyun 
4789*4882a593Smuzhiyun 		return 0;
4790*4882a593Smuzhiyun 	}
4791*4882a593Smuzhiyun 
4792*4882a593Smuzhiyun 	switch (type) {
4793*4882a593Smuzhiyun 	case L2CAP_IT_FEAT_MASK:
4794*4882a593Smuzhiyun 		conn->feat_mask = get_unaligned_le32(rsp->data);
4795*4882a593Smuzhiyun 
4796*4882a593Smuzhiyun 		if (conn->feat_mask & L2CAP_FEAT_FIXED_CHAN) {
4797*4882a593Smuzhiyun 			struct l2cap_info_req req;
4798*4882a593Smuzhiyun 			req.type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
4799*4882a593Smuzhiyun 
4800*4882a593Smuzhiyun 			conn->info_ident = l2cap_get_ident(conn);
4801*4882a593Smuzhiyun 
4802*4882a593Smuzhiyun 			l2cap_send_cmd(conn, conn->info_ident,
4803*4882a593Smuzhiyun 				       L2CAP_INFO_REQ, sizeof(req), &req);
4804*4882a593Smuzhiyun 		} else {
4805*4882a593Smuzhiyun 			conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4806*4882a593Smuzhiyun 			conn->info_ident = 0;
4807*4882a593Smuzhiyun 
4808*4882a593Smuzhiyun 			l2cap_conn_start(conn);
4809*4882a593Smuzhiyun 		}
4810*4882a593Smuzhiyun 		break;
4811*4882a593Smuzhiyun 
4812*4882a593Smuzhiyun 	case L2CAP_IT_FIXED_CHAN:
4813*4882a593Smuzhiyun 		conn->remote_fixed_chan = rsp->data[0];
4814*4882a593Smuzhiyun 		conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4815*4882a593Smuzhiyun 		conn->info_ident = 0;
4816*4882a593Smuzhiyun 
4817*4882a593Smuzhiyun 		l2cap_conn_start(conn);
4818*4882a593Smuzhiyun 		break;
4819*4882a593Smuzhiyun 	}
4820*4882a593Smuzhiyun 
4821*4882a593Smuzhiyun 	return 0;
4822*4882a593Smuzhiyun }
4823*4882a593Smuzhiyun 
l2cap_create_channel_req(struct l2cap_conn * conn,struct l2cap_cmd_hdr * cmd,u16 cmd_len,void * data)4824*4882a593Smuzhiyun static int l2cap_create_channel_req(struct l2cap_conn *conn,
4825*4882a593Smuzhiyun 				    struct l2cap_cmd_hdr *cmd,
4826*4882a593Smuzhiyun 				    u16 cmd_len, void *data)
4827*4882a593Smuzhiyun {
4828*4882a593Smuzhiyun 	struct l2cap_create_chan_req *req = data;
4829*4882a593Smuzhiyun 	struct l2cap_create_chan_rsp rsp;
4830*4882a593Smuzhiyun 	struct l2cap_chan *chan;
4831*4882a593Smuzhiyun 	struct hci_dev *hdev;
4832*4882a593Smuzhiyun 	u16 psm, scid;
4833*4882a593Smuzhiyun 
4834*4882a593Smuzhiyun 	if (cmd_len != sizeof(*req))
4835*4882a593Smuzhiyun 		return -EPROTO;
4836*4882a593Smuzhiyun 
4837*4882a593Smuzhiyun 	if (!(conn->local_fixed_chan & L2CAP_FC_A2MP))
4838*4882a593Smuzhiyun 		return -EINVAL;
4839*4882a593Smuzhiyun 
4840*4882a593Smuzhiyun 	psm = le16_to_cpu(req->psm);
4841*4882a593Smuzhiyun 	scid = le16_to_cpu(req->scid);
4842*4882a593Smuzhiyun 
4843*4882a593Smuzhiyun 	BT_DBG("psm 0x%2.2x, scid 0x%4.4x, amp_id %d", psm, scid, req->amp_id);
4844*4882a593Smuzhiyun 
4845*4882a593Smuzhiyun 	/* For controller id 0 make BR/EDR connection */
4846*4882a593Smuzhiyun 	if (req->amp_id == AMP_ID_BREDR) {
4847*4882a593Smuzhiyun 		l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4848*4882a593Smuzhiyun 			      req->amp_id);
4849*4882a593Smuzhiyun 		return 0;
4850*4882a593Smuzhiyun 	}
4851*4882a593Smuzhiyun 
4852*4882a593Smuzhiyun 	/* Validate AMP controller id */
4853*4882a593Smuzhiyun 	hdev = hci_dev_get(req->amp_id);
4854*4882a593Smuzhiyun 	if (!hdev)
4855*4882a593Smuzhiyun 		goto error;
4856*4882a593Smuzhiyun 
4857*4882a593Smuzhiyun 	if (hdev->dev_type != HCI_AMP || !test_bit(HCI_UP, &hdev->flags)) {
4858*4882a593Smuzhiyun 		hci_dev_put(hdev);
4859*4882a593Smuzhiyun 		goto error;
4860*4882a593Smuzhiyun 	}
4861*4882a593Smuzhiyun 
4862*4882a593Smuzhiyun 	chan = l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4863*4882a593Smuzhiyun 			     req->amp_id);
4864*4882a593Smuzhiyun 	if (chan) {
4865*4882a593Smuzhiyun 		struct amp_mgr *mgr = conn->hcon->amp_mgr;
4866*4882a593Smuzhiyun 		struct hci_conn *hs_hcon;
4867*4882a593Smuzhiyun 
4868*4882a593Smuzhiyun 		hs_hcon = hci_conn_hash_lookup_ba(hdev, AMP_LINK,
4869*4882a593Smuzhiyun 						  &conn->hcon->dst);
4870*4882a593Smuzhiyun 		if (!hs_hcon) {
4871*4882a593Smuzhiyun 			hci_dev_put(hdev);
4872*4882a593Smuzhiyun 			cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4873*4882a593Smuzhiyun 					       chan->dcid);
4874*4882a593Smuzhiyun 			return 0;
4875*4882a593Smuzhiyun 		}
4876*4882a593Smuzhiyun 
4877*4882a593Smuzhiyun 		BT_DBG("mgr %p bredr_chan %p hs_hcon %p", mgr, chan, hs_hcon);
4878*4882a593Smuzhiyun 
4879*4882a593Smuzhiyun 		mgr->bredr_chan = chan;
4880*4882a593Smuzhiyun 		chan->hs_hcon = hs_hcon;
4881*4882a593Smuzhiyun 		chan->fcs = L2CAP_FCS_NONE;
4882*4882a593Smuzhiyun 		conn->mtu = hdev->block_mtu;
4883*4882a593Smuzhiyun 	}
4884*4882a593Smuzhiyun 
4885*4882a593Smuzhiyun 	hci_dev_put(hdev);
4886*4882a593Smuzhiyun 
4887*4882a593Smuzhiyun 	return 0;
4888*4882a593Smuzhiyun 
4889*4882a593Smuzhiyun error:
4890*4882a593Smuzhiyun 	rsp.dcid = 0;
4891*4882a593Smuzhiyun 	rsp.scid = cpu_to_le16(scid);
4892*4882a593Smuzhiyun 	rsp.result = cpu_to_le16(L2CAP_CR_BAD_AMP);
4893*4882a593Smuzhiyun 	rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
4894*4882a593Smuzhiyun 
4895*4882a593Smuzhiyun 	l2cap_send_cmd(conn, cmd->ident, L2CAP_CREATE_CHAN_RSP,
4896*4882a593Smuzhiyun 		       sizeof(rsp), &rsp);
4897*4882a593Smuzhiyun 
4898*4882a593Smuzhiyun 	return 0;
4899*4882a593Smuzhiyun }
4900*4882a593Smuzhiyun 
l2cap_send_move_chan_req(struct l2cap_chan * chan,u8 dest_amp_id)4901*4882a593Smuzhiyun static void l2cap_send_move_chan_req(struct l2cap_chan *chan, u8 dest_amp_id)
4902*4882a593Smuzhiyun {
4903*4882a593Smuzhiyun 	struct l2cap_move_chan_req req;
4904*4882a593Smuzhiyun 	u8 ident;
4905*4882a593Smuzhiyun 
4906*4882a593Smuzhiyun 	BT_DBG("chan %p, dest_amp_id %d", chan, dest_amp_id);
4907*4882a593Smuzhiyun 
4908*4882a593Smuzhiyun 	ident = l2cap_get_ident(chan->conn);
4909*4882a593Smuzhiyun 	chan->ident = ident;
4910*4882a593Smuzhiyun 
4911*4882a593Smuzhiyun 	req.icid = cpu_to_le16(chan->scid);
4912*4882a593Smuzhiyun 	req.dest_amp_id = dest_amp_id;
4913*4882a593Smuzhiyun 
4914*4882a593Smuzhiyun 	l2cap_send_cmd(chan->conn, ident, L2CAP_MOVE_CHAN_REQ, sizeof(req),
4915*4882a593Smuzhiyun 		       &req);
4916*4882a593Smuzhiyun 
4917*4882a593Smuzhiyun 	__set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4918*4882a593Smuzhiyun }
4919*4882a593Smuzhiyun 
l2cap_send_move_chan_rsp(struct l2cap_chan * chan,u16 result)4920*4882a593Smuzhiyun static void l2cap_send_move_chan_rsp(struct l2cap_chan *chan, u16 result)
4921*4882a593Smuzhiyun {
4922*4882a593Smuzhiyun 	struct l2cap_move_chan_rsp rsp;
4923*4882a593Smuzhiyun 
4924*4882a593Smuzhiyun 	BT_DBG("chan %p, result 0x%4.4x", chan, result);
4925*4882a593Smuzhiyun 
4926*4882a593Smuzhiyun 	rsp.icid = cpu_to_le16(chan->dcid);
4927*4882a593Smuzhiyun 	rsp.result = cpu_to_le16(result);
4928*4882a593Smuzhiyun 
4929*4882a593Smuzhiyun 	l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_RSP,
4930*4882a593Smuzhiyun 		       sizeof(rsp), &rsp);
4931*4882a593Smuzhiyun }
4932*4882a593Smuzhiyun 
l2cap_send_move_chan_cfm(struct l2cap_chan * chan,u16 result)4933*4882a593Smuzhiyun static void l2cap_send_move_chan_cfm(struct l2cap_chan *chan, u16 result)
4934*4882a593Smuzhiyun {
4935*4882a593Smuzhiyun 	struct l2cap_move_chan_cfm cfm;
4936*4882a593Smuzhiyun 
4937*4882a593Smuzhiyun 	BT_DBG("chan %p, result 0x%4.4x", chan, result);
4938*4882a593Smuzhiyun 
4939*4882a593Smuzhiyun 	chan->ident = l2cap_get_ident(chan->conn);
4940*4882a593Smuzhiyun 
4941*4882a593Smuzhiyun 	cfm.icid = cpu_to_le16(chan->scid);
4942*4882a593Smuzhiyun 	cfm.result = cpu_to_le16(result);
4943*4882a593Smuzhiyun 
4944*4882a593Smuzhiyun 	l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_CFM,
4945*4882a593Smuzhiyun 		       sizeof(cfm), &cfm);
4946*4882a593Smuzhiyun 
4947*4882a593Smuzhiyun 	__set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4948*4882a593Smuzhiyun }
4949*4882a593Smuzhiyun 
l2cap_send_move_chan_cfm_icid(struct l2cap_conn * conn,u16 icid)4950*4882a593Smuzhiyun static void l2cap_send_move_chan_cfm_icid(struct l2cap_conn *conn, u16 icid)
4951*4882a593Smuzhiyun {
4952*4882a593Smuzhiyun 	struct l2cap_move_chan_cfm cfm;
4953*4882a593Smuzhiyun 
4954*4882a593Smuzhiyun 	BT_DBG("conn %p, icid 0x%4.4x", conn, icid);
4955*4882a593Smuzhiyun 
4956*4882a593Smuzhiyun 	cfm.icid = cpu_to_le16(icid);
4957*4882a593Smuzhiyun 	cfm.result = cpu_to_le16(L2CAP_MC_UNCONFIRMED);
4958*4882a593Smuzhiyun 
4959*4882a593Smuzhiyun 	l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_MOVE_CHAN_CFM,
4960*4882a593Smuzhiyun 		       sizeof(cfm), &cfm);
4961*4882a593Smuzhiyun }
4962*4882a593Smuzhiyun 
l2cap_send_move_chan_cfm_rsp(struct l2cap_conn * conn,u8 ident,u16 icid)4963*4882a593Smuzhiyun static void l2cap_send_move_chan_cfm_rsp(struct l2cap_conn *conn, u8 ident,
4964*4882a593Smuzhiyun 					 u16 icid)
4965*4882a593Smuzhiyun {
4966*4882a593Smuzhiyun 	struct l2cap_move_chan_cfm_rsp rsp;
4967*4882a593Smuzhiyun 
4968*4882a593Smuzhiyun 	BT_DBG("icid 0x%4.4x", icid);
4969*4882a593Smuzhiyun 
4970*4882a593Smuzhiyun 	rsp.icid = cpu_to_le16(icid);
4971*4882a593Smuzhiyun 	l2cap_send_cmd(conn, ident, L2CAP_MOVE_CHAN_CFM_RSP, sizeof(rsp), &rsp);
4972*4882a593Smuzhiyun }
4973*4882a593Smuzhiyun 
__release_logical_link(struct l2cap_chan * chan)4974*4882a593Smuzhiyun static void __release_logical_link(struct l2cap_chan *chan)
4975*4882a593Smuzhiyun {
4976*4882a593Smuzhiyun 	chan->hs_hchan = NULL;
4977*4882a593Smuzhiyun 	chan->hs_hcon = NULL;
4978*4882a593Smuzhiyun 
4979*4882a593Smuzhiyun 	/* Placeholder - release the logical link */
4980*4882a593Smuzhiyun }
4981*4882a593Smuzhiyun 
l2cap_logical_fail(struct l2cap_chan * chan)4982*4882a593Smuzhiyun static void l2cap_logical_fail(struct l2cap_chan *chan)
4983*4882a593Smuzhiyun {
4984*4882a593Smuzhiyun 	/* Logical link setup failed */
4985*4882a593Smuzhiyun 	if (chan->state != BT_CONNECTED) {
4986*4882a593Smuzhiyun 		/* Create channel failure, disconnect */
4987*4882a593Smuzhiyun 		l2cap_send_disconn_req(chan, ECONNRESET);
4988*4882a593Smuzhiyun 		return;
4989*4882a593Smuzhiyun 	}
4990*4882a593Smuzhiyun 
4991*4882a593Smuzhiyun 	switch (chan->move_role) {
4992*4882a593Smuzhiyun 	case L2CAP_MOVE_ROLE_RESPONDER:
4993*4882a593Smuzhiyun 		l2cap_move_done(chan);
4994*4882a593Smuzhiyun 		l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_SUPP);
4995*4882a593Smuzhiyun 		break;
4996*4882a593Smuzhiyun 	case L2CAP_MOVE_ROLE_INITIATOR:
4997*4882a593Smuzhiyun 		if (chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_COMP ||
4998*4882a593Smuzhiyun 		    chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_CFM) {
4999*4882a593Smuzhiyun 			/* Remote has only sent pending or
5000*4882a593Smuzhiyun 			 * success responses, clean up
5001*4882a593Smuzhiyun 			 */
5002*4882a593Smuzhiyun 			l2cap_move_done(chan);
5003*4882a593Smuzhiyun 		}
5004*4882a593Smuzhiyun 
5005*4882a593Smuzhiyun 		/* Other amp move states imply that the move
5006*4882a593Smuzhiyun 		 * has already aborted
5007*4882a593Smuzhiyun 		 */
5008*4882a593Smuzhiyun 		l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5009*4882a593Smuzhiyun 		break;
5010*4882a593Smuzhiyun 	}
5011*4882a593Smuzhiyun }
5012*4882a593Smuzhiyun 
l2cap_logical_finish_create(struct l2cap_chan * chan,struct hci_chan * hchan)5013*4882a593Smuzhiyun static void l2cap_logical_finish_create(struct l2cap_chan *chan,
5014*4882a593Smuzhiyun 					struct hci_chan *hchan)
5015*4882a593Smuzhiyun {
5016*4882a593Smuzhiyun 	struct l2cap_conf_rsp rsp;
5017*4882a593Smuzhiyun 
5018*4882a593Smuzhiyun 	chan->hs_hchan = hchan;
5019*4882a593Smuzhiyun 	chan->hs_hcon->l2cap_data = chan->conn;
5020*4882a593Smuzhiyun 
5021*4882a593Smuzhiyun 	l2cap_send_efs_conf_rsp(chan, &rsp, chan->ident, 0);
5022*4882a593Smuzhiyun 
5023*4882a593Smuzhiyun 	if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
5024*4882a593Smuzhiyun 		int err;
5025*4882a593Smuzhiyun 
5026*4882a593Smuzhiyun 		set_default_fcs(chan);
5027*4882a593Smuzhiyun 
5028*4882a593Smuzhiyun 		err = l2cap_ertm_init(chan);
5029*4882a593Smuzhiyun 		if (err < 0)
5030*4882a593Smuzhiyun 			l2cap_send_disconn_req(chan, -err);
5031*4882a593Smuzhiyun 		else
5032*4882a593Smuzhiyun 			l2cap_chan_ready(chan);
5033*4882a593Smuzhiyun 	}
5034*4882a593Smuzhiyun }
5035*4882a593Smuzhiyun 
l2cap_logical_finish_move(struct l2cap_chan * chan,struct hci_chan * hchan)5036*4882a593Smuzhiyun static void l2cap_logical_finish_move(struct l2cap_chan *chan,
5037*4882a593Smuzhiyun 				      struct hci_chan *hchan)
5038*4882a593Smuzhiyun {
5039*4882a593Smuzhiyun 	chan->hs_hcon = hchan->conn;
5040*4882a593Smuzhiyun 	chan->hs_hcon->l2cap_data = chan->conn;
5041*4882a593Smuzhiyun 
5042*4882a593Smuzhiyun 	BT_DBG("move_state %d", chan->move_state);
5043*4882a593Smuzhiyun 
5044*4882a593Smuzhiyun 	switch (chan->move_state) {
5045*4882a593Smuzhiyun 	case L2CAP_MOVE_WAIT_LOGICAL_COMP:
5046*4882a593Smuzhiyun 		/* Move confirm will be sent after a success
5047*4882a593Smuzhiyun 		 * response is received
5048*4882a593Smuzhiyun 		 */
5049*4882a593Smuzhiyun 		chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
5050*4882a593Smuzhiyun 		break;
5051*4882a593Smuzhiyun 	case L2CAP_MOVE_WAIT_LOGICAL_CFM:
5052*4882a593Smuzhiyun 		if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
5053*4882a593Smuzhiyun 			chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
5054*4882a593Smuzhiyun 		} else if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
5055*4882a593Smuzhiyun 			chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
5056*4882a593Smuzhiyun 			l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
5057*4882a593Smuzhiyun 		} else if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
5058*4882a593Smuzhiyun 			chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
5059*4882a593Smuzhiyun 			l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
5060*4882a593Smuzhiyun 		}
5061*4882a593Smuzhiyun 		break;
5062*4882a593Smuzhiyun 	default:
5063*4882a593Smuzhiyun 		/* Move was not in expected state, free the channel */
5064*4882a593Smuzhiyun 		__release_logical_link(chan);
5065*4882a593Smuzhiyun 
5066*4882a593Smuzhiyun 		chan->move_state = L2CAP_MOVE_STABLE;
5067*4882a593Smuzhiyun 	}
5068*4882a593Smuzhiyun }
5069*4882a593Smuzhiyun 
5070*4882a593Smuzhiyun /* Call with chan locked */
l2cap_logical_cfm(struct l2cap_chan * chan,struct hci_chan * hchan,u8 status)5071*4882a593Smuzhiyun void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan,
5072*4882a593Smuzhiyun 		       u8 status)
5073*4882a593Smuzhiyun {
5074*4882a593Smuzhiyun 	BT_DBG("chan %p, hchan %p, status %d", chan, hchan, status);
5075*4882a593Smuzhiyun 
5076*4882a593Smuzhiyun 	if (status) {
5077*4882a593Smuzhiyun 		l2cap_logical_fail(chan);
5078*4882a593Smuzhiyun 		__release_logical_link(chan);
5079*4882a593Smuzhiyun 		return;
5080*4882a593Smuzhiyun 	}
5081*4882a593Smuzhiyun 
5082*4882a593Smuzhiyun 	if (chan->state != BT_CONNECTED) {
5083*4882a593Smuzhiyun 		/* Ignore logical link if channel is on BR/EDR */
5084*4882a593Smuzhiyun 		if (chan->local_amp_id != AMP_ID_BREDR)
5085*4882a593Smuzhiyun 			l2cap_logical_finish_create(chan, hchan);
5086*4882a593Smuzhiyun 	} else {
5087*4882a593Smuzhiyun 		l2cap_logical_finish_move(chan, hchan);
5088*4882a593Smuzhiyun 	}
5089*4882a593Smuzhiyun }
5090*4882a593Smuzhiyun 
l2cap_move_start(struct l2cap_chan * chan)5091*4882a593Smuzhiyun void l2cap_move_start(struct l2cap_chan *chan)
5092*4882a593Smuzhiyun {
5093*4882a593Smuzhiyun 	BT_DBG("chan %p", chan);
5094*4882a593Smuzhiyun 
5095*4882a593Smuzhiyun 	if (chan->local_amp_id == AMP_ID_BREDR) {
5096*4882a593Smuzhiyun 		if (chan->chan_policy != BT_CHANNEL_POLICY_AMP_PREFERRED)
5097*4882a593Smuzhiyun 			return;
5098*4882a593Smuzhiyun 		chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
5099*4882a593Smuzhiyun 		chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
5100*4882a593Smuzhiyun 		/* Placeholder - start physical link setup */
5101*4882a593Smuzhiyun 	} else {
5102*4882a593Smuzhiyun 		chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
5103*4882a593Smuzhiyun 		chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
5104*4882a593Smuzhiyun 		chan->move_id = 0;
5105*4882a593Smuzhiyun 		l2cap_move_setup(chan);
5106*4882a593Smuzhiyun 		l2cap_send_move_chan_req(chan, 0);
5107*4882a593Smuzhiyun 	}
5108*4882a593Smuzhiyun }
5109*4882a593Smuzhiyun 
l2cap_do_create(struct l2cap_chan * chan,int result,u8 local_amp_id,u8 remote_amp_id)5110*4882a593Smuzhiyun static void l2cap_do_create(struct l2cap_chan *chan, int result,
5111*4882a593Smuzhiyun 			    u8 local_amp_id, u8 remote_amp_id)
5112*4882a593Smuzhiyun {
5113*4882a593Smuzhiyun 	BT_DBG("chan %p state %s %u -> %u", chan, state_to_string(chan->state),
5114*4882a593Smuzhiyun 	       local_amp_id, remote_amp_id);
5115*4882a593Smuzhiyun 
5116*4882a593Smuzhiyun 	chan->fcs = L2CAP_FCS_NONE;
5117*4882a593Smuzhiyun 
5118*4882a593Smuzhiyun 	/* Outgoing channel on AMP */
5119*4882a593Smuzhiyun 	if (chan->state == BT_CONNECT) {
5120*4882a593Smuzhiyun 		if (result == L2CAP_CR_SUCCESS) {
5121*4882a593Smuzhiyun 			chan->local_amp_id = local_amp_id;
5122*4882a593Smuzhiyun 			l2cap_send_create_chan_req(chan, remote_amp_id);
5123*4882a593Smuzhiyun 		} else {
5124*4882a593Smuzhiyun 			/* Revert to BR/EDR connect */
5125*4882a593Smuzhiyun 			l2cap_send_conn_req(chan);
5126*4882a593Smuzhiyun 		}
5127*4882a593Smuzhiyun 
5128*4882a593Smuzhiyun 		return;
5129*4882a593Smuzhiyun 	}
5130*4882a593Smuzhiyun 
5131*4882a593Smuzhiyun 	/* Incoming channel on AMP */
5132*4882a593Smuzhiyun 	if (__l2cap_no_conn_pending(chan)) {
5133*4882a593Smuzhiyun 		struct l2cap_conn_rsp rsp;
5134*4882a593Smuzhiyun 		char buf[128];
5135*4882a593Smuzhiyun 		rsp.scid = cpu_to_le16(chan->dcid);
5136*4882a593Smuzhiyun 		rsp.dcid = cpu_to_le16(chan->scid);
5137*4882a593Smuzhiyun 
5138*4882a593Smuzhiyun 		if (result == L2CAP_CR_SUCCESS) {
5139*4882a593Smuzhiyun 			/* Send successful response */
5140*4882a593Smuzhiyun 			rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
5141*4882a593Smuzhiyun 			rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
5142*4882a593Smuzhiyun 		} else {
5143*4882a593Smuzhiyun 			/* Send negative response */
5144*4882a593Smuzhiyun 			rsp.result = cpu_to_le16(L2CAP_CR_NO_MEM);
5145*4882a593Smuzhiyun 			rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
5146*4882a593Smuzhiyun 		}
5147*4882a593Smuzhiyun 
5148*4882a593Smuzhiyun 		l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_RSP,
5149*4882a593Smuzhiyun 			       sizeof(rsp), &rsp);
5150*4882a593Smuzhiyun 
5151*4882a593Smuzhiyun 		if (result == L2CAP_CR_SUCCESS) {
5152*4882a593Smuzhiyun 			l2cap_state_change(chan, BT_CONFIG);
5153*4882a593Smuzhiyun 			set_bit(CONF_REQ_SENT, &chan->conf_state);
5154*4882a593Smuzhiyun 			l2cap_send_cmd(chan->conn, l2cap_get_ident(chan->conn),
5155*4882a593Smuzhiyun 				       L2CAP_CONF_REQ,
5156*4882a593Smuzhiyun 				       l2cap_build_conf_req(chan, buf, sizeof(buf)), buf);
5157*4882a593Smuzhiyun 			chan->num_conf_req++;
5158*4882a593Smuzhiyun 		}
5159*4882a593Smuzhiyun 	}
5160*4882a593Smuzhiyun }
5161*4882a593Smuzhiyun 
l2cap_do_move_initiate(struct l2cap_chan * chan,u8 local_amp_id,u8 remote_amp_id)5162*4882a593Smuzhiyun static void l2cap_do_move_initiate(struct l2cap_chan *chan, u8 local_amp_id,
5163*4882a593Smuzhiyun 				   u8 remote_amp_id)
5164*4882a593Smuzhiyun {
5165*4882a593Smuzhiyun 	l2cap_move_setup(chan);
5166*4882a593Smuzhiyun 	chan->move_id = local_amp_id;
5167*4882a593Smuzhiyun 	chan->move_state = L2CAP_MOVE_WAIT_RSP;
5168*4882a593Smuzhiyun 
5169*4882a593Smuzhiyun 	l2cap_send_move_chan_req(chan, remote_amp_id);
5170*4882a593Smuzhiyun }
5171*4882a593Smuzhiyun 
l2cap_do_move_respond(struct l2cap_chan * chan,int result)5172*4882a593Smuzhiyun static void l2cap_do_move_respond(struct l2cap_chan *chan, int result)
5173*4882a593Smuzhiyun {
5174*4882a593Smuzhiyun 	struct hci_chan *hchan = NULL;
5175*4882a593Smuzhiyun 
5176*4882a593Smuzhiyun 	/* Placeholder - get hci_chan for logical link */
5177*4882a593Smuzhiyun 
5178*4882a593Smuzhiyun 	if (hchan) {
5179*4882a593Smuzhiyun 		if (hchan->state == BT_CONNECTED) {
5180*4882a593Smuzhiyun 			/* Logical link is ready to go */
5181*4882a593Smuzhiyun 			chan->hs_hcon = hchan->conn;
5182*4882a593Smuzhiyun 			chan->hs_hcon->l2cap_data = chan->conn;
5183*4882a593Smuzhiyun 			chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
5184*4882a593Smuzhiyun 			l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
5185*4882a593Smuzhiyun 
5186*4882a593Smuzhiyun 			l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
5187*4882a593Smuzhiyun 		} else {
5188*4882a593Smuzhiyun 			/* Wait for logical link to be ready */
5189*4882a593Smuzhiyun 			chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
5190*4882a593Smuzhiyun 		}
5191*4882a593Smuzhiyun 	} else {
5192*4882a593Smuzhiyun 		/* Logical link not available */
5193*4882a593Smuzhiyun 		l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_ALLOWED);
5194*4882a593Smuzhiyun 	}
5195*4882a593Smuzhiyun }
5196*4882a593Smuzhiyun 
l2cap_do_move_cancel(struct l2cap_chan * chan,int result)5197*4882a593Smuzhiyun static void l2cap_do_move_cancel(struct l2cap_chan *chan, int result)
5198*4882a593Smuzhiyun {
5199*4882a593Smuzhiyun 	if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
5200*4882a593Smuzhiyun 		u8 rsp_result;
5201*4882a593Smuzhiyun 		if (result == -EINVAL)
5202*4882a593Smuzhiyun 			rsp_result = L2CAP_MR_BAD_ID;
5203*4882a593Smuzhiyun 		else
5204*4882a593Smuzhiyun 			rsp_result = L2CAP_MR_NOT_ALLOWED;
5205*4882a593Smuzhiyun 
5206*4882a593Smuzhiyun 		l2cap_send_move_chan_rsp(chan, rsp_result);
5207*4882a593Smuzhiyun 	}
5208*4882a593Smuzhiyun 
5209*4882a593Smuzhiyun 	chan->move_role = L2CAP_MOVE_ROLE_NONE;
5210*4882a593Smuzhiyun 	chan->move_state = L2CAP_MOVE_STABLE;
5211*4882a593Smuzhiyun 
5212*4882a593Smuzhiyun 	/* Restart data transmission */
5213*4882a593Smuzhiyun 	l2cap_ertm_send(chan);
5214*4882a593Smuzhiyun }
5215*4882a593Smuzhiyun 
5216*4882a593Smuzhiyun /* Invoke with locked chan */
__l2cap_physical_cfm(struct l2cap_chan * chan,int result)5217*4882a593Smuzhiyun void __l2cap_physical_cfm(struct l2cap_chan *chan, int result)
5218*4882a593Smuzhiyun {
5219*4882a593Smuzhiyun 	u8 local_amp_id = chan->local_amp_id;
5220*4882a593Smuzhiyun 	u8 remote_amp_id = chan->remote_amp_id;
5221*4882a593Smuzhiyun 
5222*4882a593Smuzhiyun 	BT_DBG("chan %p, result %d, local_amp_id %d, remote_amp_id %d",
5223*4882a593Smuzhiyun 	       chan, result, local_amp_id, remote_amp_id);
5224*4882a593Smuzhiyun 
5225*4882a593Smuzhiyun 	if (chan->state == BT_DISCONN || chan->state == BT_CLOSED)
5226*4882a593Smuzhiyun 		return;
5227*4882a593Smuzhiyun 
5228*4882a593Smuzhiyun 	if (chan->state != BT_CONNECTED) {
5229*4882a593Smuzhiyun 		l2cap_do_create(chan, result, local_amp_id, remote_amp_id);
5230*4882a593Smuzhiyun 	} else if (result != L2CAP_MR_SUCCESS) {
5231*4882a593Smuzhiyun 		l2cap_do_move_cancel(chan, result);
5232*4882a593Smuzhiyun 	} else {
5233*4882a593Smuzhiyun 		switch (chan->move_role) {
5234*4882a593Smuzhiyun 		case L2CAP_MOVE_ROLE_INITIATOR:
5235*4882a593Smuzhiyun 			l2cap_do_move_initiate(chan, local_amp_id,
5236*4882a593Smuzhiyun 					       remote_amp_id);
5237*4882a593Smuzhiyun 			break;
5238*4882a593Smuzhiyun 		case L2CAP_MOVE_ROLE_RESPONDER:
5239*4882a593Smuzhiyun 			l2cap_do_move_respond(chan, result);
5240*4882a593Smuzhiyun 			break;
5241*4882a593Smuzhiyun 		default:
5242*4882a593Smuzhiyun 			l2cap_do_move_cancel(chan, result);
5243*4882a593Smuzhiyun 			break;
5244*4882a593Smuzhiyun 		}
5245*4882a593Smuzhiyun 	}
5246*4882a593Smuzhiyun }
5247*4882a593Smuzhiyun 
l2cap_move_channel_req(struct l2cap_conn * conn,struct l2cap_cmd_hdr * cmd,u16 cmd_len,void * data)5248*4882a593Smuzhiyun static inline int l2cap_move_channel_req(struct l2cap_conn *conn,
5249*4882a593Smuzhiyun 					 struct l2cap_cmd_hdr *cmd,
5250*4882a593Smuzhiyun 					 u16 cmd_len, void *data)
5251*4882a593Smuzhiyun {
5252*4882a593Smuzhiyun 	struct l2cap_move_chan_req *req = data;
5253*4882a593Smuzhiyun 	struct l2cap_move_chan_rsp rsp;
5254*4882a593Smuzhiyun 	struct l2cap_chan *chan;
5255*4882a593Smuzhiyun 	u16 icid = 0;
5256*4882a593Smuzhiyun 	u16 result = L2CAP_MR_NOT_ALLOWED;
5257*4882a593Smuzhiyun 
5258*4882a593Smuzhiyun 	if (cmd_len != sizeof(*req))
5259*4882a593Smuzhiyun 		return -EPROTO;
5260*4882a593Smuzhiyun 
5261*4882a593Smuzhiyun 	icid = le16_to_cpu(req->icid);
5262*4882a593Smuzhiyun 
5263*4882a593Smuzhiyun 	BT_DBG("icid 0x%4.4x, dest_amp_id %d", icid, req->dest_amp_id);
5264*4882a593Smuzhiyun 
5265*4882a593Smuzhiyun 	if (!(conn->local_fixed_chan & L2CAP_FC_A2MP))
5266*4882a593Smuzhiyun 		return -EINVAL;
5267*4882a593Smuzhiyun 
5268*4882a593Smuzhiyun 	chan = l2cap_get_chan_by_dcid(conn, icid);
5269*4882a593Smuzhiyun 	if (!chan) {
5270*4882a593Smuzhiyun 		rsp.icid = cpu_to_le16(icid);
5271*4882a593Smuzhiyun 		rsp.result = cpu_to_le16(L2CAP_MR_NOT_ALLOWED);
5272*4882a593Smuzhiyun 		l2cap_send_cmd(conn, cmd->ident, L2CAP_MOVE_CHAN_RSP,
5273*4882a593Smuzhiyun 			       sizeof(rsp), &rsp);
5274*4882a593Smuzhiyun 		return 0;
5275*4882a593Smuzhiyun 	}
5276*4882a593Smuzhiyun 
5277*4882a593Smuzhiyun 	chan->ident = cmd->ident;
5278*4882a593Smuzhiyun 
5279*4882a593Smuzhiyun 	if (chan->scid < L2CAP_CID_DYN_START ||
5280*4882a593Smuzhiyun 	    chan->chan_policy == BT_CHANNEL_POLICY_BREDR_ONLY ||
5281*4882a593Smuzhiyun 	    (chan->mode != L2CAP_MODE_ERTM &&
5282*4882a593Smuzhiyun 	     chan->mode != L2CAP_MODE_STREAMING)) {
5283*4882a593Smuzhiyun 		result = L2CAP_MR_NOT_ALLOWED;
5284*4882a593Smuzhiyun 		goto send_move_response;
5285*4882a593Smuzhiyun 	}
5286*4882a593Smuzhiyun 
5287*4882a593Smuzhiyun 	if (chan->local_amp_id == req->dest_amp_id) {
5288*4882a593Smuzhiyun 		result = L2CAP_MR_SAME_ID;
5289*4882a593Smuzhiyun 		goto send_move_response;
5290*4882a593Smuzhiyun 	}
5291*4882a593Smuzhiyun 
5292*4882a593Smuzhiyun 	if (req->dest_amp_id != AMP_ID_BREDR) {
5293*4882a593Smuzhiyun 		struct hci_dev *hdev;
5294*4882a593Smuzhiyun 		hdev = hci_dev_get(req->dest_amp_id);
5295*4882a593Smuzhiyun 		if (!hdev || hdev->dev_type != HCI_AMP ||
5296*4882a593Smuzhiyun 		    !test_bit(HCI_UP, &hdev->flags)) {
5297*4882a593Smuzhiyun 			if (hdev)
5298*4882a593Smuzhiyun 				hci_dev_put(hdev);
5299*4882a593Smuzhiyun 
5300*4882a593Smuzhiyun 			result = L2CAP_MR_BAD_ID;
5301*4882a593Smuzhiyun 			goto send_move_response;
5302*4882a593Smuzhiyun 		}
5303*4882a593Smuzhiyun 		hci_dev_put(hdev);
5304*4882a593Smuzhiyun 	}
5305*4882a593Smuzhiyun 
5306*4882a593Smuzhiyun 	/* Detect a move collision.  Only send a collision response
5307*4882a593Smuzhiyun 	 * if this side has "lost", otherwise proceed with the move.
5308*4882a593Smuzhiyun 	 * The winner has the larger bd_addr.
5309*4882a593Smuzhiyun 	 */
5310*4882a593Smuzhiyun 	if ((__chan_is_moving(chan) ||
5311*4882a593Smuzhiyun 	     chan->move_role != L2CAP_MOVE_ROLE_NONE) &&
5312*4882a593Smuzhiyun 	    bacmp(&conn->hcon->src, &conn->hcon->dst) > 0) {
5313*4882a593Smuzhiyun 		result = L2CAP_MR_COLLISION;
5314*4882a593Smuzhiyun 		goto send_move_response;
5315*4882a593Smuzhiyun 	}
5316*4882a593Smuzhiyun 
5317*4882a593Smuzhiyun 	chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
5318*4882a593Smuzhiyun 	l2cap_move_setup(chan);
5319*4882a593Smuzhiyun 	chan->move_id = req->dest_amp_id;
5320*4882a593Smuzhiyun 
5321*4882a593Smuzhiyun 	if (req->dest_amp_id == AMP_ID_BREDR) {
5322*4882a593Smuzhiyun 		/* Moving to BR/EDR */
5323*4882a593Smuzhiyun 		if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
5324*4882a593Smuzhiyun 			chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
5325*4882a593Smuzhiyun 			result = L2CAP_MR_PEND;
5326*4882a593Smuzhiyun 		} else {
5327*4882a593Smuzhiyun 			chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
5328*4882a593Smuzhiyun 			result = L2CAP_MR_SUCCESS;
5329*4882a593Smuzhiyun 		}
5330*4882a593Smuzhiyun 	} else {
5331*4882a593Smuzhiyun 		chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
5332*4882a593Smuzhiyun 		/* Placeholder - uncomment when amp functions are available */
5333*4882a593Smuzhiyun 		/*amp_accept_physical(chan, req->dest_amp_id);*/
5334*4882a593Smuzhiyun 		result = L2CAP_MR_PEND;
5335*4882a593Smuzhiyun 	}
5336*4882a593Smuzhiyun 
5337*4882a593Smuzhiyun send_move_response:
5338*4882a593Smuzhiyun 	l2cap_send_move_chan_rsp(chan, result);
5339*4882a593Smuzhiyun 
5340*4882a593Smuzhiyun 	l2cap_chan_unlock(chan);
5341*4882a593Smuzhiyun 	l2cap_chan_put(chan);
5342*4882a593Smuzhiyun 
5343*4882a593Smuzhiyun 	return 0;
5344*4882a593Smuzhiyun }
5345*4882a593Smuzhiyun 
l2cap_move_continue(struct l2cap_conn * conn,u16 icid,u16 result)5346*4882a593Smuzhiyun static void l2cap_move_continue(struct l2cap_conn *conn, u16 icid, u16 result)
5347*4882a593Smuzhiyun {
5348*4882a593Smuzhiyun 	struct l2cap_chan *chan;
5349*4882a593Smuzhiyun 	struct hci_chan *hchan = NULL;
5350*4882a593Smuzhiyun 
5351*4882a593Smuzhiyun 	chan = l2cap_get_chan_by_scid(conn, icid);
5352*4882a593Smuzhiyun 	if (!chan) {
5353*4882a593Smuzhiyun 		l2cap_send_move_chan_cfm_icid(conn, icid);
5354*4882a593Smuzhiyun 		return;
5355*4882a593Smuzhiyun 	}
5356*4882a593Smuzhiyun 
5357*4882a593Smuzhiyun 	__clear_chan_timer(chan);
5358*4882a593Smuzhiyun 	if (result == L2CAP_MR_PEND)
5359*4882a593Smuzhiyun 		__set_chan_timer(chan, L2CAP_MOVE_ERTX_TIMEOUT);
5360*4882a593Smuzhiyun 
5361*4882a593Smuzhiyun 	switch (chan->move_state) {
5362*4882a593Smuzhiyun 	case L2CAP_MOVE_WAIT_LOGICAL_COMP:
5363*4882a593Smuzhiyun 		/* Move confirm will be sent when logical link
5364*4882a593Smuzhiyun 		 * is complete.
5365*4882a593Smuzhiyun 		 */
5366*4882a593Smuzhiyun 		chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
5367*4882a593Smuzhiyun 		break;
5368*4882a593Smuzhiyun 	case L2CAP_MOVE_WAIT_RSP_SUCCESS:
5369*4882a593Smuzhiyun 		if (result == L2CAP_MR_PEND) {
5370*4882a593Smuzhiyun 			break;
5371*4882a593Smuzhiyun 		} else if (test_bit(CONN_LOCAL_BUSY,
5372*4882a593Smuzhiyun 				    &chan->conn_state)) {
5373*4882a593Smuzhiyun 			chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
5374*4882a593Smuzhiyun 		} else {
5375*4882a593Smuzhiyun 			/* Logical link is up or moving to BR/EDR,
5376*4882a593Smuzhiyun 			 * proceed with move
5377*4882a593Smuzhiyun 			 */
5378*4882a593Smuzhiyun 			chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
5379*4882a593Smuzhiyun 			l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
5380*4882a593Smuzhiyun 		}
5381*4882a593Smuzhiyun 		break;
5382*4882a593Smuzhiyun 	case L2CAP_MOVE_WAIT_RSP:
5383*4882a593Smuzhiyun 		/* Moving to AMP */
5384*4882a593Smuzhiyun 		if (result == L2CAP_MR_SUCCESS) {
5385*4882a593Smuzhiyun 			/* Remote is ready, send confirm immediately
5386*4882a593Smuzhiyun 			 * after logical link is ready
5387*4882a593Smuzhiyun 			 */
5388*4882a593Smuzhiyun 			chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
5389*4882a593Smuzhiyun 		} else {
5390*4882a593Smuzhiyun 			/* Both logical link and move success
5391*4882a593Smuzhiyun 			 * are required to confirm
5392*4882a593Smuzhiyun 			 */
5393*4882a593Smuzhiyun 			chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_COMP;
5394*4882a593Smuzhiyun 		}
5395*4882a593Smuzhiyun 
5396*4882a593Smuzhiyun 		/* Placeholder - get hci_chan for logical link */
5397*4882a593Smuzhiyun 		if (!hchan) {
5398*4882a593Smuzhiyun 			/* Logical link not available */
5399*4882a593Smuzhiyun 			l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5400*4882a593Smuzhiyun 			break;
5401*4882a593Smuzhiyun 		}
5402*4882a593Smuzhiyun 
5403*4882a593Smuzhiyun 		/* If the logical link is not yet connected, do not
5404*4882a593Smuzhiyun 		 * send confirmation.
5405*4882a593Smuzhiyun 		 */
5406*4882a593Smuzhiyun 		if (hchan->state != BT_CONNECTED)
5407*4882a593Smuzhiyun 			break;
5408*4882a593Smuzhiyun 
5409*4882a593Smuzhiyun 		/* Logical link is already ready to go */
5410*4882a593Smuzhiyun 
5411*4882a593Smuzhiyun 		chan->hs_hcon = hchan->conn;
5412*4882a593Smuzhiyun 		chan->hs_hcon->l2cap_data = chan->conn;
5413*4882a593Smuzhiyun 
5414*4882a593Smuzhiyun 		if (result == L2CAP_MR_SUCCESS) {
5415*4882a593Smuzhiyun 			/* Can confirm now */
5416*4882a593Smuzhiyun 			l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
5417*4882a593Smuzhiyun 		} else {
5418*4882a593Smuzhiyun 			/* Now only need move success
5419*4882a593Smuzhiyun 			 * to confirm
5420*4882a593Smuzhiyun 			 */
5421*4882a593Smuzhiyun 			chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
5422*4882a593Smuzhiyun 		}
5423*4882a593Smuzhiyun 
5424*4882a593Smuzhiyun 		l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
5425*4882a593Smuzhiyun 		break;
5426*4882a593Smuzhiyun 	default:
5427*4882a593Smuzhiyun 		/* Any other amp move state means the move failed. */
5428*4882a593Smuzhiyun 		chan->move_id = chan->local_amp_id;
5429*4882a593Smuzhiyun 		l2cap_move_done(chan);
5430*4882a593Smuzhiyun 		l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5431*4882a593Smuzhiyun 	}
5432*4882a593Smuzhiyun 
5433*4882a593Smuzhiyun 	l2cap_chan_unlock(chan);
5434*4882a593Smuzhiyun 	l2cap_chan_put(chan);
5435*4882a593Smuzhiyun }
5436*4882a593Smuzhiyun 
l2cap_move_fail(struct l2cap_conn * conn,u8 ident,u16 icid,u16 result)5437*4882a593Smuzhiyun static void l2cap_move_fail(struct l2cap_conn *conn, u8 ident, u16 icid,
5438*4882a593Smuzhiyun 			    u16 result)
5439*4882a593Smuzhiyun {
5440*4882a593Smuzhiyun 	struct l2cap_chan *chan;
5441*4882a593Smuzhiyun 
5442*4882a593Smuzhiyun 	chan = l2cap_get_chan_by_ident(conn, ident);
5443*4882a593Smuzhiyun 	if (!chan) {
5444*4882a593Smuzhiyun 		/* Could not locate channel, icid is best guess */
5445*4882a593Smuzhiyun 		l2cap_send_move_chan_cfm_icid(conn, icid);
5446*4882a593Smuzhiyun 		return;
5447*4882a593Smuzhiyun 	}
5448*4882a593Smuzhiyun 
5449*4882a593Smuzhiyun 	__clear_chan_timer(chan);
5450*4882a593Smuzhiyun 
5451*4882a593Smuzhiyun 	if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
5452*4882a593Smuzhiyun 		if (result == L2CAP_MR_COLLISION) {
5453*4882a593Smuzhiyun 			chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
5454*4882a593Smuzhiyun 		} else {
5455*4882a593Smuzhiyun 			/* Cleanup - cancel move */
5456*4882a593Smuzhiyun 			chan->move_id = chan->local_amp_id;
5457*4882a593Smuzhiyun 			l2cap_move_done(chan);
5458*4882a593Smuzhiyun 		}
5459*4882a593Smuzhiyun 	}
5460*4882a593Smuzhiyun 
5461*4882a593Smuzhiyun 	l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5462*4882a593Smuzhiyun 
5463*4882a593Smuzhiyun 	l2cap_chan_unlock(chan);
5464*4882a593Smuzhiyun 	l2cap_chan_put(chan);
5465*4882a593Smuzhiyun }
5466*4882a593Smuzhiyun 
l2cap_move_channel_rsp(struct l2cap_conn * conn,struct l2cap_cmd_hdr * cmd,u16 cmd_len,void * data)5467*4882a593Smuzhiyun static int l2cap_move_channel_rsp(struct l2cap_conn *conn,
5468*4882a593Smuzhiyun 				  struct l2cap_cmd_hdr *cmd,
5469*4882a593Smuzhiyun 				  u16 cmd_len, void *data)
5470*4882a593Smuzhiyun {
5471*4882a593Smuzhiyun 	struct l2cap_move_chan_rsp *rsp = data;
5472*4882a593Smuzhiyun 	u16 icid, result;
5473*4882a593Smuzhiyun 
5474*4882a593Smuzhiyun 	if (cmd_len != sizeof(*rsp))
5475*4882a593Smuzhiyun 		return -EPROTO;
5476*4882a593Smuzhiyun 
5477*4882a593Smuzhiyun 	icid = le16_to_cpu(rsp->icid);
5478*4882a593Smuzhiyun 	result = le16_to_cpu(rsp->result);
5479*4882a593Smuzhiyun 
5480*4882a593Smuzhiyun 	BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
5481*4882a593Smuzhiyun 
5482*4882a593Smuzhiyun 	if (result == L2CAP_MR_SUCCESS || result == L2CAP_MR_PEND)
5483*4882a593Smuzhiyun 		l2cap_move_continue(conn, icid, result);
5484*4882a593Smuzhiyun 	else
5485*4882a593Smuzhiyun 		l2cap_move_fail(conn, cmd->ident, icid, result);
5486*4882a593Smuzhiyun 
5487*4882a593Smuzhiyun 	return 0;
5488*4882a593Smuzhiyun }
5489*4882a593Smuzhiyun 
l2cap_move_channel_confirm(struct l2cap_conn * conn,struct l2cap_cmd_hdr * cmd,u16 cmd_len,void * data)5490*4882a593Smuzhiyun static int l2cap_move_channel_confirm(struct l2cap_conn *conn,
5491*4882a593Smuzhiyun 				      struct l2cap_cmd_hdr *cmd,
5492*4882a593Smuzhiyun 				      u16 cmd_len, void *data)
5493*4882a593Smuzhiyun {
5494*4882a593Smuzhiyun 	struct l2cap_move_chan_cfm *cfm = data;
5495*4882a593Smuzhiyun 	struct l2cap_chan *chan;
5496*4882a593Smuzhiyun 	u16 icid, result;
5497*4882a593Smuzhiyun 
5498*4882a593Smuzhiyun 	if (cmd_len != sizeof(*cfm))
5499*4882a593Smuzhiyun 		return -EPROTO;
5500*4882a593Smuzhiyun 
5501*4882a593Smuzhiyun 	icid = le16_to_cpu(cfm->icid);
5502*4882a593Smuzhiyun 	result = le16_to_cpu(cfm->result);
5503*4882a593Smuzhiyun 
5504*4882a593Smuzhiyun 	BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
5505*4882a593Smuzhiyun 
5506*4882a593Smuzhiyun 	chan = l2cap_get_chan_by_dcid(conn, icid);
5507*4882a593Smuzhiyun 	if (!chan) {
5508*4882a593Smuzhiyun 		/* Spec requires a response even if the icid was not found */
5509*4882a593Smuzhiyun 		l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5510*4882a593Smuzhiyun 		return 0;
5511*4882a593Smuzhiyun 	}
5512*4882a593Smuzhiyun 
5513*4882a593Smuzhiyun 	if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM) {
5514*4882a593Smuzhiyun 		if (result == L2CAP_MC_CONFIRMED) {
5515*4882a593Smuzhiyun 			chan->local_amp_id = chan->move_id;
5516*4882a593Smuzhiyun 			if (chan->local_amp_id == AMP_ID_BREDR)
5517*4882a593Smuzhiyun 				__release_logical_link(chan);
5518*4882a593Smuzhiyun 		} else {
5519*4882a593Smuzhiyun 			chan->move_id = chan->local_amp_id;
5520*4882a593Smuzhiyun 		}
5521*4882a593Smuzhiyun 
5522*4882a593Smuzhiyun 		l2cap_move_done(chan);
5523*4882a593Smuzhiyun 	}
5524*4882a593Smuzhiyun 
5525*4882a593Smuzhiyun 	l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5526*4882a593Smuzhiyun 
5527*4882a593Smuzhiyun 	l2cap_chan_unlock(chan);
5528*4882a593Smuzhiyun 	l2cap_chan_put(chan);
5529*4882a593Smuzhiyun 
5530*4882a593Smuzhiyun 	return 0;
5531*4882a593Smuzhiyun }
5532*4882a593Smuzhiyun 
l2cap_move_channel_confirm_rsp(struct l2cap_conn * conn,struct l2cap_cmd_hdr * cmd,u16 cmd_len,void * data)5533*4882a593Smuzhiyun static inline int l2cap_move_channel_confirm_rsp(struct l2cap_conn *conn,
5534*4882a593Smuzhiyun 						 struct l2cap_cmd_hdr *cmd,
5535*4882a593Smuzhiyun 						 u16 cmd_len, void *data)
5536*4882a593Smuzhiyun {
5537*4882a593Smuzhiyun 	struct l2cap_move_chan_cfm_rsp *rsp = data;
5538*4882a593Smuzhiyun 	struct l2cap_chan *chan;
5539*4882a593Smuzhiyun 	u16 icid;
5540*4882a593Smuzhiyun 
5541*4882a593Smuzhiyun 	if (cmd_len != sizeof(*rsp))
5542*4882a593Smuzhiyun 		return -EPROTO;
5543*4882a593Smuzhiyun 
5544*4882a593Smuzhiyun 	icid = le16_to_cpu(rsp->icid);
5545*4882a593Smuzhiyun 
5546*4882a593Smuzhiyun 	BT_DBG("icid 0x%4.4x", icid);
5547*4882a593Smuzhiyun 
5548*4882a593Smuzhiyun 	chan = l2cap_get_chan_by_scid(conn, icid);
5549*4882a593Smuzhiyun 	if (!chan)
5550*4882a593Smuzhiyun 		return 0;
5551*4882a593Smuzhiyun 
5552*4882a593Smuzhiyun 	__clear_chan_timer(chan);
5553*4882a593Smuzhiyun 
5554*4882a593Smuzhiyun 	if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM_RSP) {
5555*4882a593Smuzhiyun 		chan->local_amp_id = chan->move_id;
5556*4882a593Smuzhiyun 
5557*4882a593Smuzhiyun 		if (chan->local_amp_id == AMP_ID_BREDR && chan->hs_hchan)
5558*4882a593Smuzhiyun 			__release_logical_link(chan);
5559*4882a593Smuzhiyun 
5560*4882a593Smuzhiyun 		l2cap_move_done(chan);
5561*4882a593Smuzhiyun 	}
5562*4882a593Smuzhiyun 
5563*4882a593Smuzhiyun 	l2cap_chan_unlock(chan);
5564*4882a593Smuzhiyun 	l2cap_chan_put(chan);
5565*4882a593Smuzhiyun 
5566*4882a593Smuzhiyun 	return 0;
5567*4882a593Smuzhiyun }
5568*4882a593Smuzhiyun 
l2cap_conn_param_update_req(struct l2cap_conn * conn,struct l2cap_cmd_hdr * cmd,u16 cmd_len,u8 * data)5569*4882a593Smuzhiyun static inline int l2cap_conn_param_update_req(struct l2cap_conn *conn,
5570*4882a593Smuzhiyun 					      struct l2cap_cmd_hdr *cmd,
5571*4882a593Smuzhiyun 					      u16 cmd_len, u8 *data)
5572*4882a593Smuzhiyun {
5573*4882a593Smuzhiyun 	struct hci_conn *hcon = conn->hcon;
5574*4882a593Smuzhiyun 	struct l2cap_conn_param_update_req *req;
5575*4882a593Smuzhiyun 	struct l2cap_conn_param_update_rsp rsp;
5576*4882a593Smuzhiyun 	u16 min, max, latency, to_multiplier;
5577*4882a593Smuzhiyun 	int err;
5578*4882a593Smuzhiyun 
5579*4882a593Smuzhiyun 	if (hcon->role != HCI_ROLE_MASTER)
5580*4882a593Smuzhiyun 		return -EINVAL;
5581*4882a593Smuzhiyun 
5582*4882a593Smuzhiyun 	if (cmd_len != sizeof(struct l2cap_conn_param_update_req))
5583*4882a593Smuzhiyun 		return -EPROTO;
5584*4882a593Smuzhiyun 
5585*4882a593Smuzhiyun 	req = (struct l2cap_conn_param_update_req *) data;
5586*4882a593Smuzhiyun 	min		= __le16_to_cpu(req->min);
5587*4882a593Smuzhiyun 	max		= __le16_to_cpu(req->max);
5588*4882a593Smuzhiyun 	latency		= __le16_to_cpu(req->latency);
5589*4882a593Smuzhiyun 	to_multiplier	= __le16_to_cpu(req->to_multiplier);
5590*4882a593Smuzhiyun 
5591*4882a593Smuzhiyun 	BT_DBG("min 0x%4.4x max 0x%4.4x latency: 0x%4.4x Timeout: 0x%4.4x",
5592*4882a593Smuzhiyun 	       min, max, latency, to_multiplier);
5593*4882a593Smuzhiyun 
5594*4882a593Smuzhiyun 	memset(&rsp, 0, sizeof(rsp));
5595*4882a593Smuzhiyun 
5596*4882a593Smuzhiyun 	err = hci_check_conn_params(min, max, latency, to_multiplier);
5597*4882a593Smuzhiyun 	if (err)
5598*4882a593Smuzhiyun 		rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_REJECTED);
5599*4882a593Smuzhiyun 	else
5600*4882a593Smuzhiyun 		rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_ACCEPTED);
5601*4882a593Smuzhiyun 
5602*4882a593Smuzhiyun 	l2cap_send_cmd(conn, cmd->ident, L2CAP_CONN_PARAM_UPDATE_RSP,
5603*4882a593Smuzhiyun 		       sizeof(rsp), &rsp);
5604*4882a593Smuzhiyun 
5605*4882a593Smuzhiyun 	if (!err) {
5606*4882a593Smuzhiyun 		u8 store_hint;
5607*4882a593Smuzhiyun 
5608*4882a593Smuzhiyun 		store_hint = hci_le_conn_update(hcon, min, max, latency,
5609*4882a593Smuzhiyun 						to_multiplier);
5610*4882a593Smuzhiyun 		mgmt_new_conn_param(hcon->hdev, &hcon->dst, hcon->dst_type,
5611*4882a593Smuzhiyun 				    store_hint, min, max, latency,
5612*4882a593Smuzhiyun 				    to_multiplier);
5613*4882a593Smuzhiyun 
5614*4882a593Smuzhiyun 	}
5615*4882a593Smuzhiyun 
5616*4882a593Smuzhiyun 	return 0;
5617*4882a593Smuzhiyun }
5618*4882a593Smuzhiyun 
l2cap_le_connect_rsp(struct l2cap_conn * conn,struct l2cap_cmd_hdr * cmd,u16 cmd_len,u8 * data)5619*4882a593Smuzhiyun static int l2cap_le_connect_rsp(struct l2cap_conn *conn,
5620*4882a593Smuzhiyun 				struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5621*4882a593Smuzhiyun 				u8 *data)
5622*4882a593Smuzhiyun {
5623*4882a593Smuzhiyun 	struct l2cap_le_conn_rsp *rsp = (struct l2cap_le_conn_rsp *) data;
5624*4882a593Smuzhiyun 	struct hci_conn *hcon = conn->hcon;
5625*4882a593Smuzhiyun 	u16 dcid, mtu, mps, credits, result;
5626*4882a593Smuzhiyun 	struct l2cap_chan *chan;
5627*4882a593Smuzhiyun 	int err, sec_level;
5628*4882a593Smuzhiyun 
5629*4882a593Smuzhiyun 	if (cmd_len < sizeof(*rsp))
5630*4882a593Smuzhiyun 		return -EPROTO;
5631*4882a593Smuzhiyun 
5632*4882a593Smuzhiyun 	dcid    = __le16_to_cpu(rsp->dcid);
5633*4882a593Smuzhiyun 	mtu     = __le16_to_cpu(rsp->mtu);
5634*4882a593Smuzhiyun 	mps     = __le16_to_cpu(rsp->mps);
5635*4882a593Smuzhiyun 	credits = __le16_to_cpu(rsp->credits);
5636*4882a593Smuzhiyun 	result  = __le16_to_cpu(rsp->result);
5637*4882a593Smuzhiyun 
5638*4882a593Smuzhiyun 	if (result == L2CAP_CR_LE_SUCCESS && (mtu < 23 || mps < 23 ||
5639*4882a593Smuzhiyun 					   dcid < L2CAP_CID_DYN_START ||
5640*4882a593Smuzhiyun 					   dcid > L2CAP_CID_LE_DYN_END))
5641*4882a593Smuzhiyun 		return -EPROTO;
5642*4882a593Smuzhiyun 
5643*4882a593Smuzhiyun 	BT_DBG("dcid 0x%4.4x mtu %u mps %u credits %u result 0x%2.2x",
5644*4882a593Smuzhiyun 	       dcid, mtu, mps, credits, result);
5645*4882a593Smuzhiyun 
5646*4882a593Smuzhiyun 	mutex_lock(&conn->chan_lock);
5647*4882a593Smuzhiyun 
5648*4882a593Smuzhiyun 	chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5649*4882a593Smuzhiyun 	if (!chan) {
5650*4882a593Smuzhiyun 		err = -EBADSLT;
5651*4882a593Smuzhiyun 		goto unlock;
5652*4882a593Smuzhiyun 	}
5653*4882a593Smuzhiyun 
5654*4882a593Smuzhiyun 	err = 0;
5655*4882a593Smuzhiyun 
5656*4882a593Smuzhiyun 	l2cap_chan_lock(chan);
5657*4882a593Smuzhiyun 
5658*4882a593Smuzhiyun 	switch (result) {
5659*4882a593Smuzhiyun 	case L2CAP_CR_LE_SUCCESS:
5660*4882a593Smuzhiyun 		if (__l2cap_get_chan_by_dcid(conn, dcid)) {
5661*4882a593Smuzhiyun 			err = -EBADSLT;
5662*4882a593Smuzhiyun 			break;
5663*4882a593Smuzhiyun 		}
5664*4882a593Smuzhiyun 
5665*4882a593Smuzhiyun 		chan->ident = 0;
5666*4882a593Smuzhiyun 		chan->dcid = dcid;
5667*4882a593Smuzhiyun 		chan->omtu = mtu;
5668*4882a593Smuzhiyun 		chan->remote_mps = mps;
5669*4882a593Smuzhiyun 		chan->tx_credits = credits;
5670*4882a593Smuzhiyun 		l2cap_chan_ready(chan);
5671*4882a593Smuzhiyun 		break;
5672*4882a593Smuzhiyun 
5673*4882a593Smuzhiyun 	case L2CAP_CR_LE_AUTHENTICATION:
5674*4882a593Smuzhiyun 	case L2CAP_CR_LE_ENCRYPTION:
5675*4882a593Smuzhiyun 		/* If we already have MITM protection we can't do
5676*4882a593Smuzhiyun 		 * anything.
5677*4882a593Smuzhiyun 		 */
5678*4882a593Smuzhiyun 		if (hcon->sec_level > BT_SECURITY_MEDIUM) {
5679*4882a593Smuzhiyun 			l2cap_chan_del(chan, ECONNREFUSED);
5680*4882a593Smuzhiyun 			break;
5681*4882a593Smuzhiyun 		}
5682*4882a593Smuzhiyun 
5683*4882a593Smuzhiyun 		sec_level = hcon->sec_level + 1;
5684*4882a593Smuzhiyun 		if (chan->sec_level < sec_level)
5685*4882a593Smuzhiyun 			chan->sec_level = sec_level;
5686*4882a593Smuzhiyun 
5687*4882a593Smuzhiyun 		/* We'll need to send a new Connect Request */
5688*4882a593Smuzhiyun 		clear_bit(FLAG_LE_CONN_REQ_SENT, &chan->flags);
5689*4882a593Smuzhiyun 
5690*4882a593Smuzhiyun 		smp_conn_security(hcon, chan->sec_level);
5691*4882a593Smuzhiyun 		break;
5692*4882a593Smuzhiyun 
5693*4882a593Smuzhiyun 	default:
5694*4882a593Smuzhiyun 		l2cap_chan_del(chan, ECONNREFUSED);
5695*4882a593Smuzhiyun 		break;
5696*4882a593Smuzhiyun 	}
5697*4882a593Smuzhiyun 
5698*4882a593Smuzhiyun 	l2cap_chan_unlock(chan);
5699*4882a593Smuzhiyun 
5700*4882a593Smuzhiyun unlock:
5701*4882a593Smuzhiyun 	mutex_unlock(&conn->chan_lock);
5702*4882a593Smuzhiyun 
5703*4882a593Smuzhiyun 	return err;
5704*4882a593Smuzhiyun }
5705*4882a593Smuzhiyun 
l2cap_bredr_sig_cmd(struct l2cap_conn * conn,struct l2cap_cmd_hdr * cmd,u16 cmd_len,u8 * data)5706*4882a593Smuzhiyun static inline int l2cap_bredr_sig_cmd(struct l2cap_conn *conn,
5707*4882a593Smuzhiyun 				      struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5708*4882a593Smuzhiyun 				      u8 *data)
5709*4882a593Smuzhiyun {
5710*4882a593Smuzhiyun 	int err = 0;
5711*4882a593Smuzhiyun 
5712*4882a593Smuzhiyun 	switch (cmd->code) {
5713*4882a593Smuzhiyun 	case L2CAP_COMMAND_REJ:
5714*4882a593Smuzhiyun 		l2cap_command_rej(conn, cmd, cmd_len, data);
5715*4882a593Smuzhiyun 		break;
5716*4882a593Smuzhiyun 
5717*4882a593Smuzhiyun 	case L2CAP_CONN_REQ:
5718*4882a593Smuzhiyun 		err = l2cap_connect_req(conn, cmd, cmd_len, data);
5719*4882a593Smuzhiyun 		break;
5720*4882a593Smuzhiyun 
5721*4882a593Smuzhiyun 	case L2CAP_CONN_RSP:
5722*4882a593Smuzhiyun 	case L2CAP_CREATE_CHAN_RSP:
5723*4882a593Smuzhiyun 		l2cap_connect_create_rsp(conn, cmd, cmd_len, data);
5724*4882a593Smuzhiyun 		break;
5725*4882a593Smuzhiyun 
5726*4882a593Smuzhiyun 	case L2CAP_CONF_REQ:
5727*4882a593Smuzhiyun 		err = l2cap_config_req(conn, cmd, cmd_len, data);
5728*4882a593Smuzhiyun 		break;
5729*4882a593Smuzhiyun 
5730*4882a593Smuzhiyun 	case L2CAP_CONF_RSP:
5731*4882a593Smuzhiyun 		l2cap_config_rsp(conn, cmd, cmd_len, data);
5732*4882a593Smuzhiyun 		break;
5733*4882a593Smuzhiyun 
5734*4882a593Smuzhiyun 	case L2CAP_DISCONN_REQ:
5735*4882a593Smuzhiyun 		err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
5736*4882a593Smuzhiyun 		break;
5737*4882a593Smuzhiyun 
5738*4882a593Smuzhiyun 	case L2CAP_DISCONN_RSP:
5739*4882a593Smuzhiyun 		l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
5740*4882a593Smuzhiyun 		break;
5741*4882a593Smuzhiyun 
5742*4882a593Smuzhiyun 	case L2CAP_ECHO_REQ:
5743*4882a593Smuzhiyun 		l2cap_send_cmd(conn, cmd->ident, L2CAP_ECHO_RSP, cmd_len, data);
5744*4882a593Smuzhiyun 		break;
5745*4882a593Smuzhiyun 
5746*4882a593Smuzhiyun 	case L2CAP_ECHO_RSP:
5747*4882a593Smuzhiyun 		break;
5748*4882a593Smuzhiyun 
5749*4882a593Smuzhiyun 	case L2CAP_INFO_REQ:
5750*4882a593Smuzhiyun 		err = l2cap_information_req(conn, cmd, cmd_len, data);
5751*4882a593Smuzhiyun 		break;
5752*4882a593Smuzhiyun 
5753*4882a593Smuzhiyun 	case L2CAP_INFO_RSP:
5754*4882a593Smuzhiyun 		l2cap_information_rsp(conn, cmd, cmd_len, data);
5755*4882a593Smuzhiyun 		break;
5756*4882a593Smuzhiyun 
5757*4882a593Smuzhiyun 	case L2CAP_CREATE_CHAN_REQ:
5758*4882a593Smuzhiyun 		err = l2cap_create_channel_req(conn, cmd, cmd_len, data);
5759*4882a593Smuzhiyun 		break;
5760*4882a593Smuzhiyun 
5761*4882a593Smuzhiyun 	case L2CAP_MOVE_CHAN_REQ:
5762*4882a593Smuzhiyun 		err = l2cap_move_channel_req(conn, cmd, cmd_len, data);
5763*4882a593Smuzhiyun 		break;
5764*4882a593Smuzhiyun 
5765*4882a593Smuzhiyun 	case L2CAP_MOVE_CHAN_RSP:
5766*4882a593Smuzhiyun 		l2cap_move_channel_rsp(conn, cmd, cmd_len, data);
5767*4882a593Smuzhiyun 		break;
5768*4882a593Smuzhiyun 
5769*4882a593Smuzhiyun 	case L2CAP_MOVE_CHAN_CFM:
5770*4882a593Smuzhiyun 		err = l2cap_move_channel_confirm(conn, cmd, cmd_len, data);
5771*4882a593Smuzhiyun 		break;
5772*4882a593Smuzhiyun 
5773*4882a593Smuzhiyun 	case L2CAP_MOVE_CHAN_CFM_RSP:
5774*4882a593Smuzhiyun 		l2cap_move_channel_confirm_rsp(conn, cmd, cmd_len, data);
5775*4882a593Smuzhiyun 		break;
5776*4882a593Smuzhiyun 
5777*4882a593Smuzhiyun 	default:
5778*4882a593Smuzhiyun 		BT_ERR("Unknown BR/EDR signaling command 0x%2.2x", cmd->code);
5779*4882a593Smuzhiyun 		err = -EINVAL;
5780*4882a593Smuzhiyun 		break;
5781*4882a593Smuzhiyun 	}
5782*4882a593Smuzhiyun 
5783*4882a593Smuzhiyun 	return err;
5784*4882a593Smuzhiyun }
5785*4882a593Smuzhiyun 
l2cap_le_connect_req(struct l2cap_conn * conn,struct l2cap_cmd_hdr * cmd,u16 cmd_len,u8 * data)5786*4882a593Smuzhiyun static int l2cap_le_connect_req(struct l2cap_conn *conn,
5787*4882a593Smuzhiyun 				struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5788*4882a593Smuzhiyun 				u8 *data)
5789*4882a593Smuzhiyun {
5790*4882a593Smuzhiyun 	struct l2cap_le_conn_req *req = (struct l2cap_le_conn_req *) data;
5791*4882a593Smuzhiyun 	struct l2cap_le_conn_rsp rsp;
5792*4882a593Smuzhiyun 	struct l2cap_chan *chan, *pchan;
5793*4882a593Smuzhiyun 	u16 dcid, scid, credits, mtu, mps;
5794*4882a593Smuzhiyun 	__le16 psm;
5795*4882a593Smuzhiyun 	u8 result;
5796*4882a593Smuzhiyun 
5797*4882a593Smuzhiyun 	if (cmd_len != sizeof(*req))
5798*4882a593Smuzhiyun 		return -EPROTO;
5799*4882a593Smuzhiyun 
5800*4882a593Smuzhiyun 	scid = __le16_to_cpu(req->scid);
5801*4882a593Smuzhiyun 	mtu  = __le16_to_cpu(req->mtu);
5802*4882a593Smuzhiyun 	mps  = __le16_to_cpu(req->mps);
5803*4882a593Smuzhiyun 	psm  = req->psm;
5804*4882a593Smuzhiyun 	dcid = 0;
5805*4882a593Smuzhiyun 	credits = 0;
5806*4882a593Smuzhiyun 
5807*4882a593Smuzhiyun 	if (mtu < 23 || mps < 23)
5808*4882a593Smuzhiyun 		return -EPROTO;
5809*4882a593Smuzhiyun 
5810*4882a593Smuzhiyun 	BT_DBG("psm 0x%2.2x scid 0x%4.4x mtu %u mps %u", __le16_to_cpu(psm),
5811*4882a593Smuzhiyun 	       scid, mtu, mps);
5812*4882a593Smuzhiyun 
5813*4882a593Smuzhiyun 	/* BLUETOOTH CORE SPECIFICATION Version 5.3 | Vol 3, Part A
5814*4882a593Smuzhiyun 	 * page 1059:
5815*4882a593Smuzhiyun 	 *
5816*4882a593Smuzhiyun 	 * Valid range: 0x0001-0x00ff
5817*4882a593Smuzhiyun 	 *
5818*4882a593Smuzhiyun 	 * Table 4.15: L2CAP_LE_CREDIT_BASED_CONNECTION_REQ SPSM ranges
5819*4882a593Smuzhiyun 	 */
5820*4882a593Smuzhiyun 	if (!psm || __le16_to_cpu(psm) > L2CAP_PSM_LE_DYN_END) {
5821*4882a593Smuzhiyun 		result = L2CAP_CR_LE_BAD_PSM;
5822*4882a593Smuzhiyun 		chan = NULL;
5823*4882a593Smuzhiyun 		goto response;
5824*4882a593Smuzhiyun 	}
5825*4882a593Smuzhiyun 
5826*4882a593Smuzhiyun 	/* Check if we have socket listening on psm */
5827*4882a593Smuzhiyun 	pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
5828*4882a593Smuzhiyun 					 &conn->hcon->dst, LE_LINK);
5829*4882a593Smuzhiyun 	if (!pchan) {
5830*4882a593Smuzhiyun 		result = L2CAP_CR_LE_BAD_PSM;
5831*4882a593Smuzhiyun 		chan = NULL;
5832*4882a593Smuzhiyun 		goto response;
5833*4882a593Smuzhiyun 	}
5834*4882a593Smuzhiyun 
5835*4882a593Smuzhiyun 	mutex_lock(&conn->chan_lock);
5836*4882a593Smuzhiyun 	l2cap_chan_lock(pchan);
5837*4882a593Smuzhiyun 
5838*4882a593Smuzhiyun 	if (!smp_sufficient_security(conn->hcon, pchan->sec_level,
5839*4882a593Smuzhiyun 				     SMP_ALLOW_STK)) {
5840*4882a593Smuzhiyun 		result = L2CAP_CR_LE_AUTHENTICATION;
5841*4882a593Smuzhiyun 		chan = NULL;
5842*4882a593Smuzhiyun 		goto response_unlock;
5843*4882a593Smuzhiyun 	}
5844*4882a593Smuzhiyun 
5845*4882a593Smuzhiyun 	/* Check for valid dynamic CID range */
5846*4882a593Smuzhiyun 	if (scid < L2CAP_CID_DYN_START || scid > L2CAP_CID_LE_DYN_END) {
5847*4882a593Smuzhiyun 		result = L2CAP_CR_LE_INVALID_SCID;
5848*4882a593Smuzhiyun 		chan = NULL;
5849*4882a593Smuzhiyun 		goto response_unlock;
5850*4882a593Smuzhiyun 	}
5851*4882a593Smuzhiyun 
5852*4882a593Smuzhiyun 	/* Check if we already have channel with that dcid */
5853*4882a593Smuzhiyun 	if (__l2cap_get_chan_by_dcid(conn, scid)) {
5854*4882a593Smuzhiyun 		result = L2CAP_CR_LE_SCID_IN_USE;
5855*4882a593Smuzhiyun 		chan = NULL;
5856*4882a593Smuzhiyun 		goto response_unlock;
5857*4882a593Smuzhiyun 	}
5858*4882a593Smuzhiyun 
5859*4882a593Smuzhiyun 	chan = pchan->ops->new_connection(pchan);
5860*4882a593Smuzhiyun 	if (!chan) {
5861*4882a593Smuzhiyun 		result = L2CAP_CR_LE_NO_MEM;
5862*4882a593Smuzhiyun 		goto response_unlock;
5863*4882a593Smuzhiyun 	}
5864*4882a593Smuzhiyun 
5865*4882a593Smuzhiyun 	bacpy(&chan->src, &conn->hcon->src);
5866*4882a593Smuzhiyun 	bacpy(&chan->dst, &conn->hcon->dst);
5867*4882a593Smuzhiyun 	chan->src_type = bdaddr_src_type(conn->hcon);
5868*4882a593Smuzhiyun 	chan->dst_type = bdaddr_dst_type(conn->hcon);
5869*4882a593Smuzhiyun 	chan->psm  = psm;
5870*4882a593Smuzhiyun 	chan->dcid = scid;
5871*4882a593Smuzhiyun 	chan->omtu = mtu;
5872*4882a593Smuzhiyun 	chan->remote_mps = mps;
5873*4882a593Smuzhiyun 
5874*4882a593Smuzhiyun 	__l2cap_chan_add(conn, chan);
5875*4882a593Smuzhiyun 
5876*4882a593Smuzhiyun 	l2cap_le_flowctl_init(chan, __le16_to_cpu(req->credits));
5877*4882a593Smuzhiyun 
5878*4882a593Smuzhiyun 	dcid = chan->scid;
5879*4882a593Smuzhiyun 	credits = chan->rx_credits;
5880*4882a593Smuzhiyun 
5881*4882a593Smuzhiyun 	__set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
5882*4882a593Smuzhiyun 
5883*4882a593Smuzhiyun 	chan->ident = cmd->ident;
5884*4882a593Smuzhiyun 
5885*4882a593Smuzhiyun 	if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
5886*4882a593Smuzhiyun 		l2cap_state_change(chan, BT_CONNECT2);
5887*4882a593Smuzhiyun 		/* The following result value is actually not defined
5888*4882a593Smuzhiyun 		 * for LE CoC but we use it to let the function know
5889*4882a593Smuzhiyun 		 * that it should bail out after doing its cleanup
5890*4882a593Smuzhiyun 		 * instead of sending a response.
5891*4882a593Smuzhiyun 		 */
5892*4882a593Smuzhiyun 		result = L2CAP_CR_PEND;
5893*4882a593Smuzhiyun 		chan->ops->defer(chan);
5894*4882a593Smuzhiyun 	} else {
5895*4882a593Smuzhiyun 		l2cap_chan_ready(chan);
5896*4882a593Smuzhiyun 		result = L2CAP_CR_LE_SUCCESS;
5897*4882a593Smuzhiyun 	}
5898*4882a593Smuzhiyun 
5899*4882a593Smuzhiyun response_unlock:
5900*4882a593Smuzhiyun 	l2cap_chan_unlock(pchan);
5901*4882a593Smuzhiyun 	mutex_unlock(&conn->chan_lock);
5902*4882a593Smuzhiyun 	l2cap_chan_put(pchan);
5903*4882a593Smuzhiyun 
5904*4882a593Smuzhiyun 	if (result == L2CAP_CR_PEND)
5905*4882a593Smuzhiyun 		return 0;
5906*4882a593Smuzhiyun 
5907*4882a593Smuzhiyun response:
5908*4882a593Smuzhiyun 	if (chan) {
5909*4882a593Smuzhiyun 		rsp.mtu = cpu_to_le16(chan->imtu);
5910*4882a593Smuzhiyun 		rsp.mps = cpu_to_le16(chan->mps);
5911*4882a593Smuzhiyun 	} else {
5912*4882a593Smuzhiyun 		rsp.mtu = 0;
5913*4882a593Smuzhiyun 		rsp.mps = 0;
5914*4882a593Smuzhiyun 	}
5915*4882a593Smuzhiyun 
5916*4882a593Smuzhiyun 	rsp.dcid    = cpu_to_le16(dcid);
5917*4882a593Smuzhiyun 	rsp.credits = cpu_to_le16(credits);
5918*4882a593Smuzhiyun 	rsp.result  = cpu_to_le16(result);
5919*4882a593Smuzhiyun 
5920*4882a593Smuzhiyun 	l2cap_send_cmd(conn, cmd->ident, L2CAP_LE_CONN_RSP, sizeof(rsp), &rsp);
5921*4882a593Smuzhiyun 
5922*4882a593Smuzhiyun 	return 0;
5923*4882a593Smuzhiyun }
5924*4882a593Smuzhiyun 
l2cap_le_credits(struct l2cap_conn * conn,struct l2cap_cmd_hdr * cmd,u16 cmd_len,u8 * data)5925*4882a593Smuzhiyun static inline int l2cap_le_credits(struct l2cap_conn *conn,
5926*4882a593Smuzhiyun 				   struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5927*4882a593Smuzhiyun 				   u8 *data)
5928*4882a593Smuzhiyun {
5929*4882a593Smuzhiyun 	struct l2cap_le_credits *pkt;
5930*4882a593Smuzhiyun 	struct l2cap_chan *chan;
5931*4882a593Smuzhiyun 	u16 cid, credits, max_credits;
5932*4882a593Smuzhiyun 
5933*4882a593Smuzhiyun 	if (cmd_len != sizeof(*pkt))
5934*4882a593Smuzhiyun 		return -EPROTO;
5935*4882a593Smuzhiyun 
5936*4882a593Smuzhiyun 	pkt = (struct l2cap_le_credits *) data;
5937*4882a593Smuzhiyun 	cid	= __le16_to_cpu(pkt->cid);
5938*4882a593Smuzhiyun 	credits	= __le16_to_cpu(pkt->credits);
5939*4882a593Smuzhiyun 
5940*4882a593Smuzhiyun 	BT_DBG("cid 0x%4.4x credits 0x%4.4x", cid, credits);
5941*4882a593Smuzhiyun 
5942*4882a593Smuzhiyun 	chan = l2cap_get_chan_by_dcid(conn, cid);
5943*4882a593Smuzhiyun 	if (!chan)
5944*4882a593Smuzhiyun 		return -EBADSLT;
5945*4882a593Smuzhiyun 
5946*4882a593Smuzhiyun 	max_credits = LE_FLOWCTL_MAX_CREDITS - chan->tx_credits;
5947*4882a593Smuzhiyun 	if (credits > max_credits) {
5948*4882a593Smuzhiyun 		BT_ERR("LE credits overflow");
5949*4882a593Smuzhiyun 		l2cap_send_disconn_req(chan, ECONNRESET);
5950*4882a593Smuzhiyun 
5951*4882a593Smuzhiyun 		/* Return 0 so that we don't trigger an unnecessary
5952*4882a593Smuzhiyun 		 * command reject packet.
5953*4882a593Smuzhiyun 		 */
5954*4882a593Smuzhiyun 		goto unlock;
5955*4882a593Smuzhiyun 	}
5956*4882a593Smuzhiyun 
5957*4882a593Smuzhiyun 	chan->tx_credits += credits;
5958*4882a593Smuzhiyun 
5959*4882a593Smuzhiyun 	/* Resume sending */
5960*4882a593Smuzhiyun 	l2cap_le_flowctl_send(chan);
5961*4882a593Smuzhiyun 
5962*4882a593Smuzhiyun 	if (chan->tx_credits)
5963*4882a593Smuzhiyun 		chan->ops->resume(chan);
5964*4882a593Smuzhiyun 
5965*4882a593Smuzhiyun unlock:
5966*4882a593Smuzhiyun 	l2cap_chan_unlock(chan);
5967*4882a593Smuzhiyun 	l2cap_chan_put(chan);
5968*4882a593Smuzhiyun 
5969*4882a593Smuzhiyun 	return 0;
5970*4882a593Smuzhiyun }
5971*4882a593Smuzhiyun 
l2cap_ecred_conn_req(struct l2cap_conn * conn,struct l2cap_cmd_hdr * cmd,u16 cmd_len,u8 * data)5972*4882a593Smuzhiyun static inline int l2cap_ecred_conn_req(struct l2cap_conn *conn,
5973*4882a593Smuzhiyun 				       struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5974*4882a593Smuzhiyun 				       u8 *data)
5975*4882a593Smuzhiyun {
5976*4882a593Smuzhiyun 	struct l2cap_ecred_conn_req *req = (void *) data;
5977*4882a593Smuzhiyun 	struct {
5978*4882a593Smuzhiyun 		struct l2cap_ecred_conn_rsp rsp;
5979*4882a593Smuzhiyun 		__le16 dcid[5];
5980*4882a593Smuzhiyun 	} __packed pdu;
5981*4882a593Smuzhiyun 	struct l2cap_chan *chan, *pchan;
5982*4882a593Smuzhiyun 	u16 mtu, mps;
5983*4882a593Smuzhiyun 	__le16 psm;
5984*4882a593Smuzhiyun 	u8 result, len = 0;
5985*4882a593Smuzhiyun 	int i, num_scid;
5986*4882a593Smuzhiyun 	bool defer = false;
5987*4882a593Smuzhiyun 
5988*4882a593Smuzhiyun 	if (!enable_ecred)
5989*4882a593Smuzhiyun 		return -EINVAL;
5990*4882a593Smuzhiyun 
5991*4882a593Smuzhiyun 	if (cmd_len < sizeof(*req) || (cmd_len - sizeof(*req)) % sizeof(u16)) {
5992*4882a593Smuzhiyun 		result = L2CAP_CR_LE_INVALID_PARAMS;
5993*4882a593Smuzhiyun 		goto response;
5994*4882a593Smuzhiyun 	}
5995*4882a593Smuzhiyun 
5996*4882a593Smuzhiyun 	mtu  = __le16_to_cpu(req->mtu);
5997*4882a593Smuzhiyun 	mps  = __le16_to_cpu(req->mps);
5998*4882a593Smuzhiyun 
5999*4882a593Smuzhiyun 	if (mtu < L2CAP_ECRED_MIN_MTU || mps < L2CAP_ECRED_MIN_MPS) {
6000*4882a593Smuzhiyun 		result = L2CAP_CR_LE_UNACCEPT_PARAMS;
6001*4882a593Smuzhiyun 		goto response;
6002*4882a593Smuzhiyun 	}
6003*4882a593Smuzhiyun 
6004*4882a593Smuzhiyun 	psm  = req->psm;
6005*4882a593Smuzhiyun 
6006*4882a593Smuzhiyun 	/* BLUETOOTH CORE SPECIFICATION Version 5.3 | Vol 3, Part A
6007*4882a593Smuzhiyun 	 * page 1059:
6008*4882a593Smuzhiyun 	 *
6009*4882a593Smuzhiyun 	 * Valid range: 0x0001-0x00ff
6010*4882a593Smuzhiyun 	 *
6011*4882a593Smuzhiyun 	 * Table 4.15: L2CAP_LE_CREDIT_BASED_CONNECTION_REQ SPSM ranges
6012*4882a593Smuzhiyun 	 */
6013*4882a593Smuzhiyun 	if (!psm || __le16_to_cpu(psm) > L2CAP_PSM_LE_DYN_END) {
6014*4882a593Smuzhiyun 		result = L2CAP_CR_LE_BAD_PSM;
6015*4882a593Smuzhiyun 		goto response;
6016*4882a593Smuzhiyun 	}
6017*4882a593Smuzhiyun 
6018*4882a593Smuzhiyun 	BT_DBG("psm 0x%2.2x mtu %u mps %u", __le16_to_cpu(psm), mtu, mps);
6019*4882a593Smuzhiyun 
6020*4882a593Smuzhiyun 	memset(&pdu, 0, sizeof(pdu));
6021*4882a593Smuzhiyun 
6022*4882a593Smuzhiyun 	/* Check if we have socket listening on psm */
6023*4882a593Smuzhiyun 	pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
6024*4882a593Smuzhiyun 					 &conn->hcon->dst, LE_LINK);
6025*4882a593Smuzhiyun 	if (!pchan) {
6026*4882a593Smuzhiyun 		result = L2CAP_CR_LE_BAD_PSM;
6027*4882a593Smuzhiyun 		goto response;
6028*4882a593Smuzhiyun 	}
6029*4882a593Smuzhiyun 
6030*4882a593Smuzhiyun 	mutex_lock(&conn->chan_lock);
6031*4882a593Smuzhiyun 	l2cap_chan_lock(pchan);
6032*4882a593Smuzhiyun 
6033*4882a593Smuzhiyun 	if (!smp_sufficient_security(conn->hcon, pchan->sec_level,
6034*4882a593Smuzhiyun 				     SMP_ALLOW_STK)) {
6035*4882a593Smuzhiyun 		result = L2CAP_CR_LE_AUTHENTICATION;
6036*4882a593Smuzhiyun 		goto unlock;
6037*4882a593Smuzhiyun 	}
6038*4882a593Smuzhiyun 
6039*4882a593Smuzhiyun 	result = L2CAP_CR_LE_SUCCESS;
6040*4882a593Smuzhiyun 	cmd_len -= sizeof(*req);
6041*4882a593Smuzhiyun 	num_scid = cmd_len / sizeof(u16);
6042*4882a593Smuzhiyun 
6043*4882a593Smuzhiyun 	for (i = 0; i < num_scid; i++) {
6044*4882a593Smuzhiyun 		u16 scid = __le16_to_cpu(req->scid[i]);
6045*4882a593Smuzhiyun 
6046*4882a593Smuzhiyun 		BT_DBG("scid[%d] 0x%4.4x", i, scid);
6047*4882a593Smuzhiyun 
6048*4882a593Smuzhiyun 		pdu.dcid[i] = 0x0000;
6049*4882a593Smuzhiyun 		len += sizeof(*pdu.dcid);
6050*4882a593Smuzhiyun 
6051*4882a593Smuzhiyun 		/* Check for valid dynamic CID range */
6052*4882a593Smuzhiyun 		if (scid < L2CAP_CID_DYN_START || scid > L2CAP_CID_LE_DYN_END) {
6053*4882a593Smuzhiyun 			result = L2CAP_CR_LE_INVALID_SCID;
6054*4882a593Smuzhiyun 			continue;
6055*4882a593Smuzhiyun 		}
6056*4882a593Smuzhiyun 
6057*4882a593Smuzhiyun 		/* Check if we already have channel with that dcid */
6058*4882a593Smuzhiyun 		if (__l2cap_get_chan_by_dcid(conn, scid)) {
6059*4882a593Smuzhiyun 			result = L2CAP_CR_LE_SCID_IN_USE;
6060*4882a593Smuzhiyun 			continue;
6061*4882a593Smuzhiyun 		}
6062*4882a593Smuzhiyun 
6063*4882a593Smuzhiyun 		chan = pchan->ops->new_connection(pchan);
6064*4882a593Smuzhiyun 		if (!chan) {
6065*4882a593Smuzhiyun 			result = L2CAP_CR_LE_NO_MEM;
6066*4882a593Smuzhiyun 			continue;
6067*4882a593Smuzhiyun 		}
6068*4882a593Smuzhiyun 
6069*4882a593Smuzhiyun 		bacpy(&chan->src, &conn->hcon->src);
6070*4882a593Smuzhiyun 		bacpy(&chan->dst, &conn->hcon->dst);
6071*4882a593Smuzhiyun 		chan->src_type = bdaddr_src_type(conn->hcon);
6072*4882a593Smuzhiyun 		chan->dst_type = bdaddr_dst_type(conn->hcon);
6073*4882a593Smuzhiyun 		chan->psm  = psm;
6074*4882a593Smuzhiyun 		chan->dcid = scid;
6075*4882a593Smuzhiyun 		chan->omtu = mtu;
6076*4882a593Smuzhiyun 		chan->remote_mps = mps;
6077*4882a593Smuzhiyun 
6078*4882a593Smuzhiyun 		__l2cap_chan_add(conn, chan);
6079*4882a593Smuzhiyun 
6080*4882a593Smuzhiyun 		l2cap_ecred_init(chan, __le16_to_cpu(req->credits));
6081*4882a593Smuzhiyun 
6082*4882a593Smuzhiyun 		/* Init response */
6083*4882a593Smuzhiyun 		if (!pdu.rsp.credits) {
6084*4882a593Smuzhiyun 			pdu.rsp.mtu = cpu_to_le16(chan->imtu);
6085*4882a593Smuzhiyun 			pdu.rsp.mps = cpu_to_le16(chan->mps);
6086*4882a593Smuzhiyun 			pdu.rsp.credits = cpu_to_le16(chan->rx_credits);
6087*4882a593Smuzhiyun 		}
6088*4882a593Smuzhiyun 
6089*4882a593Smuzhiyun 		pdu.dcid[i] = cpu_to_le16(chan->scid);
6090*4882a593Smuzhiyun 
6091*4882a593Smuzhiyun 		__set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
6092*4882a593Smuzhiyun 
6093*4882a593Smuzhiyun 		chan->ident = cmd->ident;
6094*4882a593Smuzhiyun 
6095*4882a593Smuzhiyun 		if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
6096*4882a593Smuzhiyun 			l2cap_state_change(chan, BT_CONNECT2);
6097*4882a593Smuzhiyun 			defer = true;
6098*4882a593Smuzhiyun 			chan->ops->defer(chan);
6099*4882a593Smuzhiyun 		} else {
6100*4882a593Smuzhiyun 			l2cap_chan_ready(chan);
6101*4882a593Smuzhiyun 		}
6102*4882a593Smuzhiyun 	}
6103*4882a593Smuzhiyun 
6104*4882a593Smuzhiyun unlock:
6105*4882a593Smuzhiyun 	l2cap_chan_unlock(pchan);
6106*4882a593Smuzhiyun 	mutex_unlock(&conn->chan_lock);
6107*4882a593Smuzhiyun 	l2cap_chan_put(pchan);
6108*4882a593Smuzhiyun 
6109*4882a593Smuzhiyun response:
6110*4882a593Smuzhiyun 	pdu.rsp.result = cpu_to_le16(result);
6111*4882a593Smuzhiyun 
6112*4882a593Smuzhiyun 	if (defer)
6113*4882a593Smuzhiyun 		return 0;
6114*4882a593Smuzhiyun 
6115*4882a593Smuzhiyun 	l2cap_send_cmd(conn, cmd->ident, L2CAP_ECRED_CONN_RSP,
6116*4882a593Smuzhiyun 		       sizeof(pdu.rsp) + len, &pdu);
6117*4882a593Smuzhiyun 
6118*4882a593Smuzhiyun 	return 0;
6119*4882a593Smuzhiyun }
6120*4882a593Smuzhiyun 
l2cap_ecred_conn_rsp(struct l2cap_conn * conn,struct l2cap_cmd_hdr * cmd,u16 cmd_len,u8 * data)6121*4882a593Smuzhiyun static inline int l2cap_ecred_conn_rsp(struct l2cap_conn *conn,
6122*4882a593Smuzhiyun 				       struct l2cap_cmd_hdr *cmd, u16 cmd_len,
6123*4882a593Smuzhiyun 				       u8 *data)
6124*4882a593Smuzhiyun {
6125*4882a593Smuzhiyun 	struct l2cap_ecred_conn_rsp *rsp = (void *) data;
6126*4882a593Smuzhiyun 	struct hci_conn *hcon = conn->hcon;
6127*4882a593Smuzhiyun 	u16 mtu, mps, credits, result;
6128*4882a593Smuzhiyun 	struct l2cap_chan *chan, *tmp;
6129*4882a593Smuzhiyun 	int err = 0, sec_level;
6130*4882a593Smuzhiyun 	int i = 0;
6131*4882a593Smuzhiyun 
6132*4882a593Smuzhiyun 	if (cmd_len < sizeof(*rsp))
6133*4882a593Smuzhiyun 		return -EPROTO;
6134*4882a593Smuzhiyun 
6135*4882a593Smuzhiyun 	mtu     = __le16_to_cpu(rsp->mtu);
6136*4882a593Smuzhiyun 	mps     = __le16_to_cpu(rsp->mps);
6137*4882a593Smuzhiyun 	credits = __le16_to_cpu(rsp->credits);
6138*4882a593Smuzhiyun 	result  = __le16_to_cpu(rsp->result);
6139*4882a593Smuzhiyun 
6140*4882a593Smuzhiyun 	BT_DBG("mtu %u mps %u credits %u result 0x%4.4x", mtu, mps, credits,
6141*4882a593Smuzhiyun 	       result);
6142*4882a593Smuzhiyun 
6143*4882a593Smuzhiyun 	mutex_lock(&conn->chan_lock);
6144*4882a593Smuzhiyun 
6145*4882a593Smuzhiyun 	cmd_len -= sizeof(*rsp);
6146*4882a593Smuzhiyun 
6147*4882a593Smuzhiyun 	list_for_each_entry_safe(chan, tmp, &conn->chan_l, list) {
6148*4882a593Smuzhiyun 		u16 dcid;
6149*4882a593Smuzhiyun 
6150*4882a593Smuzhiyun 		if (chan->ident != cmd->ident ||
6151*4882a593Smuzhiyun 		    chan->mode != L2CAP_MODE_EXT_FLOWCTL ||
6152*4882a593Smuzhiyun 		    chan->state == BT_CONNECTED)
6153*4882a593Smuzhiyun 			continue;
6154*4882a593Smuzhiyun 
6155*4882a593Smuzhiyun 		l2cap_chan_lock(chan);
6156*4882a593Smuzhiyun 
6157*4882a593Smuzhiyun 		/* Check that there is a dcid for each pending channel */
6158*4882a593Smuzhiyun 		if (cmd_len < sizeof(dcid)) {
6159*4882a593Smuzhiyun 			l2cap_chan_del(chan, ECONNREFUSED);
6160*4882a593Smuzhiyun 			l2cap_chan_unlock(chan);
6161*4882a593Smuzhiyun 			continue;
6162*4882a593Smuzhiyun 		}
6163*4882a593Smuzhiyun 
6164*4882a593Smuzhiyun 		dcid = __le16_to_cpu(rsp->dcid[i++]);
6165*4882a593Smuzhiyun 		cmd_len -= sizeof(u16);
6166*4882a593Smuzhiyun 
6167*4882a593Smuzhiyun 		BT_DBG("dcid[%d] 0x%4.4x", i, dcid);
6168*4882a593Smuzhiyun 
6169*4882a593Smuzhiyun 		/* Check if dcid is already in use */
6170*4882a593Smuzhiyun 		if (dcid && __l2cap_get_chan_by_dcid(conn, dcid)) {
6171*4882a593Smuzhiyun 			/* If a device receives a
6172*4882a593Smuzhiyun 			 * L2CAP_CREDIT_BASED_CONNECTION_RSP packet with an
6173*4882a593Smuzhiyun 			 * already-assigned Destination CID, then both the
6174*4882a593Smuzhiyun 			 * original channel and the new channel shall be
6175*4882a593Smuzhiyun 			 * immediately discarded and not used.
6176*4882a593Smuzhiyun 			 */
6177*4882a593Smuzhiyun 			l2cap_chan_del(chan, ECONNREFUSED);
6178*4882a593Smuzhiyun 			l2cap_chan_unlock(chan);
6179*4882a593Smuzhiyun 			chan = __l2cap_get_chan_by_dcid(conn, dcid);
6180*4882a593Smuzhiyun 			l2cap_chan_lock(chan);
6181*4882a593Smuzhiyun 			l2cap_chan_del(chan, ECONNRESET);
6182*4882a593Smuzhiyun 			l2cap_chan_unlock(chan);
6183*4882a593Smuzhiyun 			continue;
6184*4882a593Smuzhiyun 		}
6185*4882a593Smuzhiyun 
6186*4882a593Smuzhiyun 		switch (result) {
6187*4882a593Smuzhiyun 		case L2CAP_CR_LE_AUTHENTICATION:
6188*4882a593Smuzhiyun 		case L2CAP_CR_LE_ENCRYPTION:
6189*4882a593Smuzhiyun 			/* If we already have MITM protection we can't do
6190*4882a593Smuzhiyun 			 * anything.
6191*4882a593Smuzhiyun 			 */
6192*4882a593Smuzhiyun 			if (hcon->sec_level > BT_SECURITY_MEDIUM) {
6193*4882a593Smuzhiyun 				l2cap_chan_del(chan, ECONNREFUSED);
6194*4882a593Smuzhiyun 				break;
6195*4882a593Smuzhiyun 			}
6196*4882a593Smuzhiyun 
6197*4882a593Smuzhiyun 			sec_level = hcon->sec_level + 1;
6198*4882a593Smuzhiyun 			if (chan->sec_level < sec_level)
6199*4882a593Smuzhiyun 				chan->sec_level = sec_level;
6200*4882a593Smuzhiyun 
6201*4882a593Smuzhiyun 			/* We'll need to send a new Connect Request */
6202*4882a593Smuzhiyun 			clear_bit(FLAG_ECRED_CONN_REQ_SENT, &chan->flags);
6203*4882a593Smuzhiyun 
6204*4882a593Smuzhiyun 			smp_conn_security(hcon, chan->sec_level);
6205*4882a593Smuzhiyun 			break;
6206*4882a593Smuzhiyun 
6207*4882a593Smuzhiyun 		case L2CAP_CR_LE_BAD_PSM:
6208*4882a593Smuzhiyun 			l2cap_chan_del(chan, ECONNREFUSED);
6209*4882a593Smuzhiyun 			break;
6210*4882a593Smuzhiyun 
6211*4882a593Smuzhiyun 		default:
6212*4882a593Smuzhiyun 			/* If dcid was not set it means channels was refused */
6213*4882a593Smuzhiyun 			if (!dcid) {
6214*4882a593Smuzhiyun 				l2cap_chan_del(chan, ECONNREFUSED);
6215*4882a593Smuzhiyun 				break;
6216*4882a593Smuzhiyun 			}
6217*4882a593Smuzhiyun 
6218*4882a593Smuzhiyun 			chan->ident = 0;
6219*4882a593Smuzhiyun 			chan->dcid = dcid;
6220*4882a593Smuzhiyun 			chan->omtu = mtu;
6221*4882a593Smuzhiyun 			chan->remote_mps = mps;
6222*4882a593Smuzhiyun 			chan->tx_credits = credits;
6223*4882a593Smuzhiyun 			l2cap_chan_ready(chan);
6224*4882a593Smuzhiyun 			break;
6225*4882a593Smuzhiyun 		}
6226*4882a593Smuzhiyun 
6227*4882a593Smuzhiyun 		l2cap_chan_unlock(chan);
6228*4882a593Smuzhiyun 	}
6229*4882a593Smuzhiyun 
6230*4882a593Smuzhiyun 	mutex_unlock(&conn->chan_lock);
6231*4882a593Smuzhiyun 
6232*4882a593Smuzhiyun 	return err;
6233*4882a593Smuzhiyun }
6234*4882a593Smuzhiyun 
l2cap_ecred_reconf_req(struct l2cap_conn * conn,struct l2cap_cmd_hdr * cmd,u16 cmd_len,u8 * data)6235*4882a593Smuzhiyun static inline int l2cap_ecred_reconf_req(struct l2cap_conn *conn,
6236*4882a593Smuzhiyun 					 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
6237*4882a593Smuzhiyun 					 u8 *data)
6238*4882a593Smuzhiyun {
6239*4882a593Smuzhiyun 	struct l2cap_ecred_reconf_req *req = (void *) data;
6240*4882a593Smuzhiyun 	struct l2cap_ecred_reconf_rsp rsp;
6241*4882a593Smuzhiyun 	u16 mtu, mps, result;
6242*4882a593Smuzhiyun 	struct l2cap_chan *chan;
6243*4882a593Smuzhiyun 	int i, num_scid;
6244*4882a593Smuzhiyun 
6245*4882a593Smuzhiyun 	if (!enable_ecred)
6246*4882a593Smuzhiyun 		return -EINVAL;
6247*4882a593Smuzhiyun 
6248*4882a593Smuzhiyun 	if (cmd_len < sizeof(*req) || cmd_len - sizeof(*req) % sizeof(u16)) {
6249*4882a593Smuzhiyun 		result = L2CAP_CR_LE_INVALID_PARAMS;
6250*4882a593Smuzhiyun 		goto respond;
6251*4882a593Smuzhiyun 	}
6252*4882a593Smuzhiyun 
6253*4882a593Smuzhiyun 	mtu = __le16_to_cpu(req->mtu);
6254*4882a593Smuzhiyun 	mps = __le16_to_cpu(req->mps);
6255*4882a593Smuzhiyun 
6256*4882a593Smuzhiyun 	BT_DBG("mtu %u mps %u", mtu, mps);
6257*4882a593Smuzhiyun 
6258*4882a593Smuzhiyun 	if (mtu < L2CAP_ECRED_MIN_MTU) {
6259*4882a593Smuzhiyun 		result = L2CAP_RECONF_INVALID_MTU;
6260*4882a593Smuzhiyun 		goto respond;
6261*4882a593Smuzhiyun 	}
6262*4882a593Smuzhiyun 
6263*4882a593Smuzhiyun 	if (mps < L2CAP_ECRED_MIN_MPS) {
6264*4882a593Smuzhiyun 		result = L2CAP_RECONF_INVALID_MPS;
6265*4882a593Smuzhiyun 		goto respond;
6266*4882a593Smuzhiyun 	}
6267*4882a593Smuzhiyun 
6268*4882a593Smuzhiyun 	cmd_len -= sizeof(*req);
6269*4882a593Smuzhiyun 	num_scid = cmd_len / sizeof(u16);
6270*4882a593Smuzhiyun 	result = L2CAP_RECONF_SUCCESS;
6271*4882a593Smuzhiyun 
6272*4882a593Smuzhiyun 	for (i = 0; i < num_scid; i++) {
6273*4882a593Smuzhiyun 		u16 scid;
6274*4882a593Smuzhiyun 
6275*4882a593Smuzhiyun 		scid = __le16_to_cpu(req->scid[i]);
6276*4882a593Smuzhiyun 		if (!scid)
6277*4882a593Smuzhiyun 			return -EPROTO;
6278*4882a593Smuzhiyun 
6279*4882a593Smuzhiyun 		chan = __l2cap_get_chan_by_dcid(conn, scid);
6280*4882a593Smuzhiyun 		if (!chan)
6281*4882a593Smuzhiyun 			continue;
6282*4882a593Smuzhiyun 
6283*4882a593Smuzhiyun 		/* If the MTU value is decreased for any of the included
6284*4882a593Smuzhiyun 		 * channels, then the receiver shall disconnect all
6285*4882a593Smuzhiyun 		 * included channels.
6286*4882a593Smuzhiyun 		 */
6287*4882a593Smuzhiyun 		if (chan->omtu > mtu) {
6288*4882a593Smuzhiyun 			BT_ERR("chan %p decreased MTU %u -> %u", chan,
6289*4882a593Smuzhiyun 			       chan->omtu, mtu);
6290*4882a593Smuzhiyun 			result = L2CAP_RECONF_INVALID_MTU;
6291*4882a593Smuzhiyun 		}
6292*4882a593Smuzhiyun 
6293*4882a593Smuzhiyun 		chan->omtu = mtu;
6294*4882a593Smuzhiyun 		chan->remote_mps = mps;
6295*4882a593Smuzhiyun 	}
6296*4882a593Smuzhiyun 
6297*4882a593Smuzhiyun respond:
6298*4882a593Smuzhiyun 	rsp.result = cpu_to_le16(result);
6299*4882a593Smuzhiyun 
6300*4882a593Smuzhiyun 	l2cap_send_cmd(conn, cmd->ident, L2CAP_ECRED_RECONF_RSP, sizeof(rsp),
6301*4882a593Smuzhiyun 		       &rsp);
6302*4882a593Smuzhiyun 
6303*4882a593Smuzhiyun 	return 0;
6304*4882a593Smuzhiyun }
6305*4882a593Smuzhiyun 
l2cap_ecred_reconf_rsp(struct l2cap_conn * conn,struct l2cap_cmd_hdr * cmd,u16 cmd_len,u8 * data)6306*4882a593Smuzhiyun static inline int l2cap_ecred_reconf_rsp(struct l2cap_conn *conn,
6307*4882a593Smuzhiyun 					 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
6308*4882a593Smuzhiyun 					 u8 *data)
6309*4882a593Smuzhiyun {
6310*4882a593Smuzhiyun 	struct l2cap_chan *chan, *tmp;
6311*4882a593Smuzhiyun 	struct l2cap_ecred_conn_rsp *rsp = (void *) data;
6312*4882a593Smuzhiyun 	u16 result;
6313*4882a593Smuzhiyun 
6314*4882a593Smuzhiyun 	if (cmd_len < sizeof(*rsp))
6315*4882a593Smuzhiyun 		return -EPROTO;
6316*4882a593Smuzhiyun 
6317*4882a593Smuzhiyun 	result = __le16_to_cpu(rsp->result);
6318*4882a593Smuzhiyun 
6319*4882a593Smuzhiyun 	BT_DBG("result 0x%4.4x", rsp->result);
6320*4882a593Smuzhiyun 
6321*4882a593Smuzhiyun 	if (!result)
6322*4882a593Smuzhiyun 		return 0;
6323*4882a593Smuzhiyun 
6324*4882a593Smuzhiyun 	list_for_each_entry_safe(chan, tmp, &conn->chan_l, list) {
6325*4882a593Smuzhiyun 		if (chan->ident != cmd->ident)
6326*4882a593Smuzhiyun 			continue;
6327*4882a593Smuzhiyun 
6328*4882a593Smuzhiyun 		l2cap_chan_del(chan, ECONNRESET);
6329*4882a593Smuzhiyun 	}
6330*4882a593Smuzhiyun 
6331*4882a593Smuzhiyun 	return 0;
6332*4882a593Smuzhiyun }
6333*4882a593Smuzhiyun 
l2cap_le_command_rej(struct l2cap_conn * conn,struct l2cap_cmd_hdr * cmd,u16 cmd_len,u8 * data)6334*4882a593Smuzhiyun static inline int l2cap_le_command_rej(struct l2cap_conn *conn,
6335*4882a593Smuzhiyun 				       struct l2cap_cmd_hdr *cmd, u16 cmd_len,
6336*4882a593Smuzhiyun 				       u8 *data)
6337*4882a593Smuzhiyun {
6338*4882a593Smuzhiyun 	struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
6339*4882a593Smuzhiyun 	struct l2cap_chan *chan;
6340*4882a593Smuzhiyun 
6341*4882a593Smuzhiyun 	if (cmd_len < sizeof(*rej))
6342*4882a593Smuzhiyun 		return -EPROTO;
6343*4882a593Smuzhiyun 
6344*4882a593Smuzhiyun 	mutex_lock(&conn->chan_lock);
6345*4882a593Smuzhiyun 
6346*4882a593Smuzhiyun 	chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
6347*4882a593Smuzhiyun 	if (!chan)
6348*4882a593Smuzhiyun 		goto done;
6349*4882a593Smuzhiyun 
6350*4882a593Smuzhiyun 	l2cap_chan_lock(chan);
6351*4882a593Smuzhiyun 	l2cap_chan_del(chan, ECONNREFUSED);
6352*4882a593Smuzhiyun 	l2cap_chan_unlock(chan);
6353*4882a593Smuzhiyun 
6354*4882a593Smuzhiyun done:
6355*4882a593Smuzhiyun 	mutex_unlock(&conn->chan_lock);
6356*4882a593Smuzhiyun 	return 0;
6357*4882a593Smuzhiyun }
6358*4882a593Smuzhiyun 
l2cap_le_sig_cmd(struct l2cap_conn * conn,struct l2cap_cmd_hdr * cmd,u16 cmd_len,u8 * data)6359*4882a593Smuzhiyun static inline int l2cap_le_sig_cmd(struct l2cap_conn *conn,
6360*4882a593Smuzhiyun 				   struct l2cap_cmd_hdr *cmd, u16 cmd_len,
6361*4882a593Smuzhiyun 				   u8 *data)
6362*4882a593Smuzhiyun {
6363*4882a593Smuzhiyun 	int err = 0;
6364*4882a593Smuzhiyun 
6365*4882a593Smuzhiyun 	switch (cmd->code) {
6366*4882a593Smuzhiyun 	case L2CAP_COMMAND_REJ:
6367*4882a593Smuzhiyun 		l2cap_le_command_rej(conn, cmd, cmd_len, data);
6368*4882a593Smuzhiyun 		break;
6369*4882a593Smuzhiyun 
6370*4882a593Smuzhiyun 	case L2CAP_CONN_PARAM_UPDATE_REQ:
6371*4882a593Smuzhiyun 		err = l2cap_conn_param_update_req(conn, cmd, cmd_len, data);
6372*4882a593Smuzhiyun 		break;
6373*4882a593Smuzhiyun 
6374*4882a593Smuzhiyun 	case L2CAP_CONN_PARAM_UPDATE_RSP:
6375*4882a593Smuzhiyun 		break;
6376*4882a593Smuzhiyun 
6377*4882a593Smuzhiyun 	case L2CAP_LE_CONN_RSP:
6378*4882a593Smuzhiyun 		l2cap_le_connect_rsp(conn, cmd, cmd_len, data);
6379*4882a593Smuzhiyun 		break;
6380*4882a593Smuzhiyun 
6381*4882a593Smuzhiyun 	case L2CAP_LE_CONN_REQ:
6382*4882a593Smuzhiyun 		err = l2cap_le_connect_req(conn, cmd, cmd_len, data);
6383*4882a593Smuzhiyun 		break;
6384*4882a593Smuzhiyun 
6385*4882a593Smuzhiyun 	case L2CAP_LE_CREDITS:
6386*4882a593Smuzhiyun 		err = l2cap_le_credits(conn, cmd, cmd_len, data);
6387*4882a593Smuzhiyun 		break;
6388*4882a593Smuzhiyun 
6389*4882a593Smuzhiyun 	case L2CAP_ECRED_CONN_REQ:
6390*4882a593Smuzhiyun 		err = l2cap_ecred_conn_req(conn, cmd, cmd_len, data);
6391*4882a593Smuzhiyun 		break;
6392*4882a593Smuzhiyun 
6393*4882a593Smuzhiyun 	case L2CAP_ECRED_CONN_RSP:
6394*4882a593Smuzhiyun 		err = l2cap_ecred_conn_rsp(conn, cmd, cmd_len, data);
6395*4882a593Smuzhiyun 		break;
6396*4882a593Smuzhiyun 
6397*4882a593Smuzhiyun 	case L2CAP_ECRED_RECONF_REQ:
6398*4882a593Smuzhiyun 		err = l2cap_ecred_reconf_req(conn, cmd, cmd_len, data);
6399*4882a593Smuzhiyun 		break;
6400*4882a593Smuzhiyun 
6401*4882a593Smuzhiyun 	case L2CAP_ECRED_RECONF_RSP:
6402*4882a593Smuzhiyun 		err = l2cap_ecred_reconf_rsp(conn, cmd, cmd_len, data);
6403*4882a593Smuzhiyun 		break;
6404*4882a593Smuzhiyun 
6405*4882a593Smuzhiyun 	case L2CAP_DISCONN_REQ:
6406*4882a593Smuzhiyun 		err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
6407*4882a593Smuzhiyun 		break;
6408*4882a593Smuzhiyun 
6409*4882a593Smuzhiyun 	case L2CAP_DISCONN_RSP:
6410*4882a593Smuzhiyun 		l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
6411*4882a593Smuzhiyun 		break;
6412*4882a593Smuzhiyun 
6413*4882a593Smuzhiyun 	default:
6414*4882a593Smuzhiyun 		BT_ERR("Unknown LE signaling command 0x%2.2x", cmd->code);
6415*4882a593Smuzhiyun 		err = -EINVAL;
6416*4882a593Smuzhiyun 		break;
6417*4882a593Smuzhiyun 	}
6418*4882a593Smuzhiyun 
6419*4882a593Smuzhiyun 	return err;
6420*4882a593Smuzhiyun }
6421*4882a593Smuzhiyun 
l2cap_le_sig_channel(struct l2cap_conn * conn,struct sk_buff * skb)6422*4882a593Smuzhiyun static inline void l2cap_le_sig_channel(struct l2cap_conn *conn,
6423*4882a593Smuzhiyun 					struct sk_buff *skb)
6424*4882a593Smuzhiyun {
6425*4882a593Smuzhiyun 	struct hci_conn *hcon = conn->hcon;
6426*4882a593Smuzhiyun 	struct l2cap_cmd_hdr *cmd;
6427*4882a593Smuzhiyun 	u16 len;
6428*4882a593Smuzhiyun 	int err;
6429*4882a593Smuzhiyun 
6430*4882a593Smuzhiyun 	if (hcon->type != LE_LINK)
6431*4882a593Smuzhiyun 		goto drop;
6432*4882a593Smuzhiyun 
6433*4882a593Smuzhiyun 	if (skb->len < L2CAP_CMD_HDR_SIZE)
6434*4882a593Smuzhiyun 		goto drop;
6435*4882a593Smuzhiyun 
6436*4882a593Smuzhiyun 	cmd = (void *) skb->data;
6437*4882a593Smuzhiyun 	skb_pull(skb, L2CAP_CMD_HDR_SIZE);
6438*4882a593Smuzhiyun 
6439*4882a593Smuzhiyun 	len = le16_to_cpu(cmd->len);
6440*4882a593Smuzhiyun 
6441*4882a593Smuzhiyun 	BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd->code, len, cmd->ident);
6442*4882a593Smuzhiyun 
6443*4882a593Smuzhiyun 	if (len != skb->len || !cmd->ident) {
6444*4882a593Smuzhiyun 		BT_DBG("corrupted command");
6445*4882a593Smuzhiyun 		goto drop;
6446*4882a593Smuzhiyun 	}
6447*4882a593Smuzhiyun 
6448*4882a593Smuzhiyun 	err = l2cap_le_sig_cmd(conn, cmd, len, skb->data);
6449*4882a593Smuzhiyun 	if (err) {
6450*4882a593Smuzhiyun 		struct l2cap_cmd_rej_unk rej;
6451*4882a593Smuzhiyun 
6452*4882a593Smuzhiyun 		BT_ERR("Wrong link type (%d)", err);
6453*4882a593Smuzhiyun 
6454*4882a593Smuzhiyun 		rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
6455*4882a593Smuzhiyun 		l2cap_send_cmd(conn, cmd->ident, L2CAP_COMMAND_REJ,
6456*4882a593Smuzhiyun 			       sizeof(rej), &rej);
6457*4882a593Smuzhiyun 	}
6458*4882a593Smuzhiyun 
6459*4882a593Smuzhiyun drop:
6460*4882a593Smuzhiyun 	kfree_skb(skb);
6461*4882a593Smuzhiyun }
6462*4882a593Smuzhiyun 
l2cap_sig_channel(struct l2cap_conn * conn,struct sk_buff * skb)6463*4882a593Smuzhiyun static inline void l2cap_sig_channel(struct l2cap_conn *conn,
6464*4882a593Smuzhiyun 				     struct sk_buff *skb)
6465*4882a593Smuzhiyun {
6466*4882a593Smuzhiyun 	struct hci_conn *hcon = conn->hcon;
6467*4882a593Smuzhiyun 	struct l2cap_cmd_hdr *cmd;
6468*4882a593Smuzhiyun 	int err;
6469*4882a593Smuzhiyun 
6470*4882a593Smuzhiyun 	l2cap_raw_recv(conn, skb);
6471*4882a593Smuzhiyun 
6472*4882a593Smuzhiyun 	if (hcon->type != ACL_LINK)
6473*4882a593Smuzhiyun 		goto drop;
6474*4882a593Smuzhiyun 
6475*4882a593Smuzhiyun 	while (skb->len >= L2CAP_CMD_HDR_SIZE) {
6476*4882a593Smuzhiyun 		u16 len;
6477*4882a593Smuzhiyun 
6478*4882a593Smuzhiyun 		cmd = (void *) skb->data;
6479*4882a593Smuzhiyun 		skb_pull(skb, L2CAP_CMD_HDR_SIZE);
6480*4882a593Smuzhiyun 
6481*4882a593Smuzhiyun 		len = le16_to_cpu(cmd->len);
6482*4882a593Smuzhiyun 
6483*4882a593Smuzhiyun 		BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd->code, len,
6484*4882a593Smuzhiyun 		       cmd->ident);
6485*4882a593Smuzhiyun 
6486*4882a593Smuzhiyun 		if (len > skb->len || !cmd->ident) {
6487*4882a593Smuzhiyun 			BT_DBG("corrupted command");
6488*4882a593Smuzhiyun 			break;
6489*4882a593Smuzhiyun 		}
6490*4882a593Smuzhiyun 
6491*4882a593Smuzhiyun 		err = l2cap_bredr_sig_cmd(conn, cmd, len, skb->data);
6492*4882a593Smuzhiyun 		if (err) {
6493*4882a593Smuzhiyun 			struct l2cap_cmd_rej_unk rej;
6494*4882a593Smuzhiyun 
6495*4882a593Smuzhiyun 			BT_ERR("Wrong link type (%d)", err);
6496*4882a593Smuzhiyun 
6497*4882a593Smuzhiyun 			rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
6498*4882a593Smuzhiyun 			l2cap_send_cmd(conn, cmd->ident, L2CAP_COMMAND_REJ,
6499*4882a593Smuzhiyun 				       sizeof(rej), &rej);
6500*4882a593Smuzhiyun 		}
6501*4882a593Smuzhiyun 
6502*4882a593Smuzhiyun 		skb_pull(skb, len);
6503*4882a593Smuzhiyun 	}
6504*4882a593Smuzhiyun 
6505*4882a593Smuzhiyun drop:
6506*4882a593Smuzhiyun 	kfree_skb(skb);
6507*4882a593Smuzhiyun }
6508*4882a593Smuzhiyun 
l2cap_check_fcs(struct l2cap_chan * chan,struct sk_buff * skb)6509*4882a593Smuzhiyun static int l2cap_check_fcs(struct l2cap_chan *chan,  struct sk_buff *skb)
6510*4882a593Smuzhiyun {
6511*4882a593Smuzhiyun 	u16 our_fcs, rcv_fcs;
6512*4882a593Smuzhiyun 	int hdr_size;
6513*4882a593Smuzhiyun 
6514*4882a593Smuzhiyun 	if (test_bit(FLAG_EXT_CTRL, &chan->flags))
6515*4882a593Smuzhiyun 		hdr_size = L2CAP_EXT_HDR_SIZE;
6516*4882a593Smuzhiyun 	else
6517*4882a593Smuzhiyun 		hdr_size = L2CAP_ENH_HDR_SIZE;
6518*4882a593Smuzhiyun 
6519*4882a593Smuzhiyun 	if (chan->fcs == L2CAP_FCS_CRC16) {
6520*4882a593Smuzhiyun 		skb_trim(skb, skb->len - L2CAP_FCS_SIZE);
6521*4882a593Smuzhiyun 		rcv_fcs = get_unaligned_le16(skb->data + skb->len);
6522*4882a593Smuzhiyun 		our_fcs = crc16(0, skb->data - hdr_size, skb->len + hdr_size);
6523*4882a593Smuzhiyun 
6524*4882a593Smuzhiyun 		if (our_fcs != rcv_fcs)
6525*4882a593Smuzhiyun 			return -EBADMSG;
6526*4882a593Smuzhiyun 	}
6527*4882a593Smuzhiyun 	return 0;
6528*4882a593Smuzhiyun }
6529*4882a593Smuzhiyun 
l2cap_send_i_or_rr_or_rnr(struct l2cap_chan * chan)6530*4882a593Smuzhiyun static void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan)
6531*4882a593Smuzhiyun {
6532*4882a593Smuzhiyun 	struct l2cap_ctrl control;
6533*4882a593Smuzhiyun 
6534*4882a593Smuzhiyun 	BT_DBG("chan %p", chan);
6535*4882a593Smuzhiyun 
6536*4882a593Smuzhiyun 	memset(&control, 0, sizeof(control));
6537*4882a593Smuzhiyun 	control.sframe = 1;
6538*4882a593Smuzhiyun 	control.final = 1;
6539*4882a593Smuzhiyun 	control.reqseq = chan->buffer_seq;
6540*4882a593Smuzhiyun 	set_bit(CONN_SEND_FBIT, &chan->conn_state);
6541*4882a593Smuzhiyun 
6542*4882a593Smuzhiyun 	if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6543*4882a593Smuzhiyun 		control.super = L2CAP_SUPER_RNR;
6544*4882a593Smuzhiyun 		l2cap_send_sframe(chan, &control);
6545*4882a593Smuzhiyun 	}
6546*4882a593Smuzhiyun 
6547*4882a593Smuzhiyun 	if (test_and_clear_bit(CONN_REMOTE_BUSY, &chan->conn_state) &&
6548*4882a593Smuzhiyun 	    chan->unacked_frames > 0)
6549*4882a593Smuzhiyun 		__set_retrans_timer(chan);
6550*4882a593Smuzhiyun 
6551*4882a593Smuzhiyun 	/* Send pending iframes */
6552*4882a593Smuzhiyun 	l2cap_ertm_send(chan);
6553*4882a593Smuzhiyun 
6554*4882a593Smuzhiyun 	if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
6555*4882a593Smuzhiyun 	    test_bit(CONN_SEND_FBIT, &chan->conn_state)) {
6556*4882a593Smuzhiyun 		/* F-bit wasn't sent in an s-frame or i-frame yet, so
6557*4882a593Smuzhiyun 		 * send it now.
6558*4882a593Smuzhiyun 		 */
6559*4882a593Smuzhiyun 		control.super = L2CAP_SUPER_RR;
6560*4882a593Smuzhiyun 		l2cap_send_sframe(chan, &control);
6561*4882a593Smuzhiyun 	}
6562*4882a593Smuzhiyun }
6563*4882a593Smuzhiyun 
append_skb_frag(struct sk_buff * skb,struct sk_buff * new_frag,struct sk_buff ** last_frag)6564*4882a593Smuzhiyun static void append_skb_frag(struct sk_buff *skb, struct sk_buff *new_frag,
6565*4882a593Smuzhiyun 			    struct sk_buff **last_frag)
6566*4882a593Smuzhiyun {
6567*4882a593Smuzhiyun 	/* skb->len reflects data in skb as well as all fragments
6568*4882a593Smuzhiyun 	 * skb->data_len reflects only data in fragments
6569*4882a593Smuzhiyun 	 */
6570*4882a593Smuzhiyun 	if (!skb_has_frag_list(skb))
6571*4882a593Smuzhiyun 		skb_shinfo(skb)->frag_list = new_frag;
6572*4882a593Smuzhiyun 
6573*4882a593Smuzhiyun 	new_frag->next = NULL;
6574*4882a593Smuzhiyun 
6575*4882a593Smuzhiyun 	(*last_frag)->next = new_frag;
6576*4882a593Smuzhiyun 	*last_frag = new_frag;
6577*4882a593Smuzhiyun 
6578*4882a593Smuzhiyun 	skb->len += new_frag->len;
6579*4882a593Smuzhiyun 	skb->data_len += new_frag->len;
6580*4882a593Smuzhiyun 	skb->truesize += new_frag->truesize;
6581*4882a593Smuzhiyun }
6582*4882a593Smuzhiyun 
l2cap_reassemble_sdu(struct l2cap_chan * chan,struct sk_buff * skb,struct l2cap_ctrl * control)6583*4882a593Smuzhiyun static int l2cap_reassemble_sdu(struct l2cap_chan *chan, struct sk_buff *skb,
6584*4882a593Smuzhiyun 				struct l2cap_ctrl *control)
6585*4882a593Smuzhiyun {
6586*4882a593Smuzhiyun 	int err = -EINVAL;
6587*4882a593Smuzhiyun 
6588*4882a593Smuzhiyun 	switch (control->sar) {
6589*4882a593Smuzhiyun 	case L2CAP_SAR_UNSEGMENTED:
6590*4882a593Smuzhiyun 		if (chan->sdu)
6591*4882a593Smuzhiyun 			break;
6592*4882a593Smuzhiyun 
6593*4882a593Smuzhiyun 		err = chan->ops->recv(chan, skb);
6594*4882a593Smuzhiyun 		break;
6595*4882a593Smuzhiyun 
6596*4882a593Smuzhiyun 	case L2CAP_SAR_START:
6597*4882a593Smuzhiyun 		if (chan->sdu)
6598*4882a593Smuzhiyun 			break;
6599*4882a593Smuzhiyun 
6600*4882a593Smuzhiyun 		if (!pskb_may_pull(skb, L2CAP_SDULEN_SIZE))
6601*4882a593Smuzhiyun 			break;
6602*4882a593Smuzhiyun 
6603*4882a593Smuzhiyun 		chan->sdu_len = get_unaligned_le16(skb->data);
6604*4882a593Smuzhiyun 		skb_pull(skb, L2CAP_SDULEN_SIZE);
6605*4882a593Smuzhiyun 
6606*4882a593Smuzhiyun 		if (chan->sdu_len > chan->imtu) {
6607*4882a593Smuzhiyun 			err = -EMSGSIZE;
6608*4882a593Smuzhiyun 			break;
6609*4882a593Smuzhiyun 		}
6610*4882a593Smuzhiyun 
6611*4882a593Smuzhiyun 		if (skb->len >= chan->sdu_len)
6612*4882a593Smuzhiyun 			break;
6613*4882a593Smuzhiyun 
6614*4882a593Smuzhiyun 		chan->sdu = skb;
6615*4882a593Smuzhiyun 		chan->sdu_last_frag = skb;
6616*4882a593Smuzhiyun 
6617*4882a593Smuzhiyun 		skb = NULL;
6618*4882a593Smuzhiyun 		err = 0;
6619*4882a593Smuzhiyun 		break;
6620*4882a593Smuzhiyun 
6621*4882a593Smuzhiyun 	case L2CAP_SAR_CONTINUE:
6622*4882a593Smuzhiyun 		if (!chan->sdu)
6623*4882a593Smuzhiyun 			break;
6624*4882a593Smuzhiyun 
6625*4882a593Smuzhiyun 		append_skb_frag(chan->sdu, skb,
6626*4882a593Smuzhiyun 				&chan->sdu_last_frag);
6627*4882a593Smuzhiyun 		skb = NULL;
6628*4882a593Smuzhiyun 
6629*4882a593Smuzhiyun 		if (chan->sdu->len >= chan->sdu_len)
6630*4882a593Smuzhiyun 			break;
6631*4882a593Smuzhiyun 
6632*4882a593Smuzhiyun 		err = 0;
6633*4882a593Smuzhiyun 		break;
6634*4882a593Smuzhiyun 
6635*4882a593Smuzhiyun 	case L2CAP_SAR_END:
6636*4882a593Smuzhiyun 		if (!chan->sdu)
6637*4882a593Smuzhiyun 			break;
6638*4882a593Smuzhiyun 
6639*4882a593Smuzhiyun 		append_skb_frag(chan->sdu, skb,
6640*4882a593Smuzhiyun 				&chan->sdu_last_frag);
6641*4882a593Smuzhiyun 		skb = NULL;
6642*4882a593Smuzhiyun 
6643*4882a593Smuzhiyun 		if (chan->sdu->len != chan->sdu_len)
6644*4882a593Smuzhiyun 			break;
6645*4882a593Smuzhiyun 
6646*4882a593Smuzhiyun 		err = chan->ops->recv(chan, chan->sdu);
6647*4882a593Smuzhiyun 
6648*4882a593Smuzhiyun 		if (!err) {
6649*4882a593Smuzhiyun 			/* Reassembly complete */
6650*4882a593Smuzhiyun 			chan->sdu = NULL;
6651*4882a593Smuzhiyun 			chan->sdu_last_frag = NULL;
6652*4882a593Smuzhiyun 			chan->sdu_len = 0;
6653*4882a593Smuzhiyun 		}
6654*4882a593Smuzhiyun 		break;
6655*4882a593Smuzhiyun 	}
6656*4882a593Smuzhiyun 
6657*4882a593Smuzhiyun 	if (err) {
6658*4882a593Smuzhiyun 		kfree_skb(skb);
6659*4882a593Smuzhiyun 		kfree_skb(chan->sdu);
6660*4882a593Smuzhiyun 		chan->sdu = NULL;
6661*4882a593Smuzhiyun 		chan->sdu_last_frag = NULL;
6662*4882a593Smuzhiyun 		chan->sdu_len = 0;
6663*4882a593Smuzhiyun 	}
6664*4882a593Smuzhiyun 
6665*4882a593Smuzhiyun 	return err;
6666*4882a593Smuzhiyun }
6667*4882a593Smuzhiyun 
l2cap_resegment(struct l2cap_chan * chan)6668*4882a593Smuzhiyun static int l2cap_resegment(struct l2cap_chan *chan)
6669*4882a593Smuzhiyun {
6670*4882a593Smuzhiyun 	/* Placeholder */
6671*4882a593Smuzhiyun 	return 0;
6672*4882a593Smuzhiyun }
6673*4882a593Smuzhiyun 
l2cap_chan_busy(struct l2cap_chan * chan,int busy)6674*4882a593Smuzhiyun void l2cap_chan_busy(struct l2cap_chan *chan, int busy)
6675*4882a593Smuzhiyun {
6676*4882a593Smuzhiyun 	u8 event;
6677*4882a593Smuzhiyun 
6678*4882a593Smuzhiyun 	if (chan->mode != L2CAP_MODE_ERTM)
6679*4882a593Smuzhiyun 		return;
6680*4882a593Smuzhiyun 
6681*4882a593Smuzhiyun 	event = busy ? L2CAP_EV_LOCAL_BUSY_DETECTED : L2CAP_EV_LOCAL_BUSY_CLEAR;
6682*4882a593Smuzhiyun 	l2cap_tx(chan, NULL, NULL, event);
6683*4882a593Smuzhiyun }
6684*4882a593Smuzhiyun 
l2cap_rx_queued_iframes(struct l2cap_chan * chan)6685*4882a593Smuzhiyun static int l2cap_rx_queued_iframes(struct l2cap_chan *chan)
6686*4882a593Smuzhiyun {
6687*4882a593Smuzhiyun 	int err = 0;
6688*4882a593Smuzhiyun 	/* Pass sequential frames to l2cap_reassemble_sdu()
6689*4882a593Smuzhiyun 	 * until a gap is encountered.
6690*4882a593Smuzhiyun 	 */
6691*4882a593Smuzhiyun 
6692*4882a593Smuzhiyun 	BT_DBG("chan %p", chan);
6693*4882a593Smuzhiyun 
6694*4882a593Smuzhiyun 	while (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6695*4882a593Smuzhiyun 		struct sk_buff *skb;
6696*4882a593Smuzhiyun 		BT_DBG("Searching for skb with txseq %d (queue len %d)",
6697*4882a593Smuzhiyun 		       chan->buffer_seq, skb_queue_len(&chan->srej_q));
6698*4882a593Smuzhiyun 
6699*4882a593Smuzhiyun 		skb = l2cap_ertm_seq_in_queue(&chan->srej_q, chan->buffer_seq);
6700*4882a593Smuzhiyun 
6701*4882a593Smuzhiyun 		if (!skb)
6702*4882a593Smuzhiyun 			break;
6703*4882a593Smuzhiyun 
6704*4882a593Smuzhiyun 		skb_unlink(skb, &chan->srej_q);
6705*4882a593Smuzhiyun 		chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
6706*4882a593Smuzhiyun 		err = l2cap_reassemble_sdu(chan, skb, &bt_cb(skb)->l2cap);
6707*4882a593Smuzhiyun 		if (err)
6708*4882a593Smuzhiyun 			break;
6709*4882a593Smuzhiyun 	}
6710*4882a593Smuzhiyun 
6711*4882a593Smuzhiyun 	if (skb_queue_empty(&chan->srej_q)) {
6712*4882a593Smuzhiyun 		chan->rx_state = L2CAP_RX_STATE_RECV;
6713*4882a593Smuzhiyun 		l2cap_send_ack(chan);
6714*4882a593Smuzhiyun 	}
6715*4882a593Smuzhiyun 
6716*4882a593Smuzhiyun 	return err;
6717*4882a593Smuzhiyun }
6718*4882a593Smuzhiyun 
l2cap_handle_srej(struct l2cap_chan * chan,struct l2cap_ctrl * control)6719*4882a593Smuzhiyun static void l2cap_handle_srej(struct l2cap_chan *chan,
6720*4882a593Smuzhiyun 			      struct l2cap_ctrl *control)
6721*4882a593Smuzhiyun {
6722*4882a593Smuzhiyun 	struct sk_buff *skb;
6723*4882a593Smuzhiyun 
6724*4882a593Smuzhiyun 	BT_DBG("chan %p, control %p", chan, control);
6725*4882a593Smuzhiyun 
6726*4882a593Smuzhiyun 	if (control->reqseq == chan->next_tx_seq) {
6727*4882a593Smuzhiyun 		BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
6728*4882a593Smuzhiyun 		l2cap_send_disconn_req(chan, ECONNRESET);
6729*4882a593Smuzhiyun 		return;
6730*4882a593Smuzhiyun 	}
6731*4882a593Smuzhiyun 
6732*4882a593Smuzhiyun 	skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
6733*4882a593Smuzhiyun 
6734*4882a593Smuzhiyun 	if (skb == NULL) {
6735*4882a593Smuzhiyun 		BT_DBG("Seq %d not available for retransmission",
6736*4882a593Smuzhiyun 		       control->reqseq);
6737*4882a593Smuzhiyun 		return;
6738*4882a593Smuzhiyun 	}
6739*4882a593Smuzhiyun 
6740*4882a593Smuzhiyun 	if (chan->max_tx != 0 && bt_cb(skb)->l2cap.retries >= chan->max_tx) {
6741*4882a593Smuzhiyun 		BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
6742*4882a593Smuzhiyun 		l2cap_send_disconn_req(chan, ECONNRESET);
6743*4882a593Smuzhiyun 		return;
6744*4882a593Smuzhiyun 	}
6745*4882a593Smuzhiyun 
6746*4882a593Smuzhiyun 	clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6747*4882a593Smuzhiyun 
6748*4882a593Smuzhiyun 	if (control->poll) {
6749*4882a593Smuzhiyun 		l2cap_pass_to_tx(chan, control);
6750*4882a593Smuzhiyun 
6751*4882a593Smuzhiyun 		set_bit(CONN_SEND_FBIT, &chan->conn_state);
6752*4882a593Smuzhiyun 		l2cap_retransmit(chan, control);
6753*4882a593Smuzhiyun 		l2cap_ertm_send(chan);
6754*4882a593Smuzhiyun 
6755*4882a593Smuzhiyun 		if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
6756*4882a593Smuzhiyun 			set_bit(CONN_SREJ_ACT, &chan->conn_state);
6757*4882a593Smuzhiyun 			chan->srej_save_reqseq = control->reqseq;
6758*4882a593Smuzhiyun 		}
6759*4882a593Smuzhiyun 	} else {
6760*4882a593Smuzhiyun 		l2cap_pass_to_tx_fbit(chan, control);
6761*4882a593Smuzhiyun 
6762*4882a593Smuzhiyun 		if (control->final) {
6763*4882a593Smuzhiyun 			if (chan->srej_save_reqseq != control->reqseq ||
6764*4882a593Smuzhiyun 			    !test_and_clear_bit(CONN_SREJ_ACT,
6765*4882a593Smuzhiyun 						&chan->conn_state))
6766*4882a593Smuzhiyun 				l2cap_retransmit(chan, control);
6767*4882a593Smuzhiyun 		} else {
6768*4882a593Smuzhiyun 			l2cap_retransmit(chan, control);
6769*4882a593Smuzhiyun 			if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
6770*4882a593Smuzhiyun 				set_bit(CONN_SREJ_ACT, &chan->conn_state);
6771*4882a593Smuzhiyun 				chan->srej_save_reqseq = control->reqseq;
6772*4882a593Smuzhiyun 			}
6773*4882a593Smuzhiyun 		}
6774*4882a593Smuzhiyun 	}
6775*4882a593Smuzhiyun }
6776*4882a593Smuzhiyun 
l2cap_handle_rej(struct l2cap_chan * chan,struct l2cap_ctrl * control)6777*4882a593Smuzhiyun static void l2cap_handle_rej(struct l2cap_chan *chan,
6778*4882a593Smuzhiyun 			     struct l2cap_ctrl *control)
6779*4882a593Smuzhiyun {
6780*4882a593Smuzhiyun 	struct sk_buff *skb;
6781*4882a593Smuzhiyun 
6782*4882a593Smuzhiyun 	BT_DBG("chan %p, control %p", chan, control);
6783*4882a593Smuzhiyun 
6784*4882a593Smuzhiyun 	if (control->reqseq == chan->next_tx_seq) {
6785*4882a593Smuzhiyun 		BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
6786*4882a593Smuzhiyun 		l2cap_send_disconn_req(chan, ECONNRESET);
6787*4882a593Smuzhiyun 		return;
6788*4882a593Smuzhiyun 	}
6789*4882a593Smuzhiyun 
6790*4882a593Smuzhiyun 	skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
6791*4882a593Smuzhiyun 
6792*4882a593Smuzhiyun 	if (chan->max_tx && skb &&
6793*4882a593Smuzhiyun 	    bt_cb(skb)->l2cap.retries >= chan->max_tx) {
6794*4882a593Smuzhiyun 		BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
6795*4882a593Smuzhiyun 		l2cap_send_disconn_req(chan, ECONNRESET);
6796*4882a593Smuzhiyun 		return;
6797*4882a593Smuzhiyun 	}
6798*4882a593Smuzhiyun 
6799*4882a593Smuzhiyun 	clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6800*4882a593Smuzhiyun 
6801*4882a593Smuzhiyun 	l2cap_pass_to_tx(chan, control);
6802*4882a593Smuzhiyun 
6803*4882a593Smuzhiyun 	if (control->final) {
6804*4882a593Smuzhiyun 		if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state))
6805*4882a593Smuzhiyun 			l2cap_retransmit_all(chan, control);
6806*4882a593Smuzhiyun 	} else {
6807*4882a593Smuzhiyun 		l2cap_retransmit_all(chan, control);
6808*4882a593Smuzhiyun 		l2cap_ertm_send(chan);
6809*4882a593Smuzhiyun 		if (chan->tx_state == L2CAP_TX_STATE_WAIT_F)
6810*4882a593Smuzhiyun 			set_bit(CONN_REJ_ACT, &chan->conn_state);
6811*4882a593Smuzhiyun 	}
6812*4882a593Smuzhiyun }
6813*4882a593Smuzhiyun 
l2cap_classify_txseq(struct l2cap_chan * chan,u16 txseq)6814*4882a593Smuzhiyun static u8 l2cap_classify_txseq(struct l2cap_chan *chan, u16 txseq)
6815*4882a593Smuzhiyun {
6816*4882a593Smuzhiyun 	BT_DBG("chan %p, txseq %d", chan, txseq);
6817*4882a593Smuzhiyun 
6818*4882a593Smuzhiyun 	BT_DBG("last_acked_seq %d, expected_tx_seq %d", chan->last_acked_seq,
6819*4882a593Smuzhiyun 	       chan->expected_tx_seq);
6820*4882a593Smuzhiyun 
6821*4882a593Smuzhiyun 	if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
6822*4882a593Smuzhiyun 		if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
6823*4882a593Smuzhiyun 		    chan->tx_win) {
6824*4882a593Smuzhiyun 			/* See notes below regarding "double poll" and
6825*4882a593Smuzhiyun 			 * invalid packets.
6826*4882a593Smuzhiyun 			 */
6827*4882a593Smuzhiyun 			if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
6828*4882a593Smuzhiyun 				BT_DBG("Invalid/Ignore - after SREJ");
6829*4882a593Smuzhiyun 				return L2CAP_TXSEQ_INVALID_IGNORE;
6830*4882a593Smuzhiyun 			} else {
6831*4882a593Smuzhiyun 				BT_DBG("Invalid - in window after SREJ sent");
6832*4882a593Smuzhiyun 				return L2CAP_TXSEQ_INVALID;
6833*4882a593Smuzhiyun 			}
6834*4882a593Smuzhiyun 		}
6835*4882a593Smuzhiyun 
6836*4882a593Smuzhiyun 		if (chan->srej_list.head == txseq) {
6837*4882a593Smuzhiyun 			BT_DBG("Expected SREJ");
6838*4882a593Smuzhiyun 			return L2CAP_TXSEQ_EXPECTED_SREJ;
6839*4882a593Smuzhiyun 		}
6840*4882a593Smuzhiyun 
6841*4882a593Smuzhiyun 		if (l2cap_ertm_seq_in_queue(&chan->srej_q, txseq)) {
6842*4882a593Smuzhiyun 			BT_DBG("Duplicate SREJ - txseq already stored");
6843*4882a593Smuzhiyun 			return L2CAP_TXSEQ_DUPLICATE_SREJ;
6844*4882a593Smuzhiyun 		}
6845*4882a593Smuzhiyun 
6846*4882a593Smuzhiyun 		if (l2cap_seq_list_contains(&chan->srej_list, txseq)) {
6847*4882a593Smuzhiyun 			BT_DBG("Unexpected SREJ - not requested");
6848*4882a593Smuzhiyun 			return L2CAP_TXSEQ_UNEXPECTED_SREJ;
6849*4882a593Smuzhiyun 		}
6850*4882a593Smuzhiyun 	}
6851*4882a593Smuzhiyun 
6852*4882a593Smuzhiyun 	if (chan->expected_tx_seq == txseq) {
6853*4882a593Smuzhiyun 		if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
6854*4882a593Smuzhiyun 		    chan->tx_win) {
6855*4882a593Smuzhiyun 			BT_DBG("Invalid - txseq outside tx window");
6856*4882a593Smuzhiyun 			return L2CAP_TXSEQ_INVALID;
6857*4882a593Smuzhiyun 		} else {
6858*4882a593Smuzhiyun 			BT_DBG("Expected");
6859*4882a593Smuzhiyun 			return L2CAP_TXSEQ_EXPECTED;
6860*4882a593Smuzhiyun 		}
6861*4882a593Smuzhiyun 	}
6862*4882a593Smuzhiyun 
6863*4882a593Smuzhiyun 	if (__seq_offset(chan, txseq, chan->last_acked_seq) <
6864*4882a593Smuzhiyun 	    __seq_offset(chan, chan->expected_tx_seq, chan->last_acked_seq)) {
6865*4882a593Smuzhiyun 		BT_DBG("Duplicate - expected_tx_seq later than txseq");
6866*4882a593Smuzhiyun 		return L2CAP_TXSEQ_DUPLICATE;
6867*4882a593Smuzhiyun 	}
6868*4882a593Smuzhiyun 
6869*4882a593Smuzhiyun 	if (__seq_offset(chan, txseq, chan->last_acked_seq) >= chan->tx_win) {
6870*4882a593Smuzhiyun 		/* A source of invalid packets is a "double poll" condition,
6871*4882a593Smuzhiyun 		 * where delays cause us to send multiple poll packets.  If
6872*4882a593Smuzhiyun 		 * the remote stack receives and processes both polls,
6873*4882a593Smuzhiyun 		 * sequence numbers can wrap around in such a way that a
6874*4882a593Smuzhiyun 		 * resent frame has a sequence number that looks like new data
6875*4882a593Smuzhiyun 		 * with a sequence gap.  This would trigger an erroneous SREJ
6876*4882a593Smuzhiyun 		 * request.
6877*4882a593Smuzhiyun 		 *
6878*4882a593Smuzhiyun 		 * Fortunately, this is impossible with a tx window that's
6879*4882a593Smuzhiyun 		 * less than half of the maximum sequence number, which allows
6880*4882a593Smuzhiyun 		 * invalid frames to be safely ignored.
6881*4882a593Smuzhiyun 		 *
6882*4882a593Smuzhiyun 		 * With tx window sizes greater than half of the tx window
6883*4882a593Smuzhiyun 		 * maximum, the frame is invalid and cannot be ignored.  This
6884*4882a593Smuzhiyun 		 * causes a disconnect.
6885*4882a593Smuzhiyun 		 */
6886*4882a593Smuzhiyun 
6887*4882a593Smuzhiyun 		if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
6888*4882a593Smuzhiyun 			BT_DBG("Invalid/Ignore - txseq outside tx window");
6889*4882a593Smuzhiyun 			return L2CAP_TXSEQ_INVALID_IGNORE;
6890*4882a593Smuzhiyun 		} else {
6891*4882a593Smuzhiyun 			BT_DBG("Invalid - txseq outside tx window");
6892*4882a593Smuzhiyun 			return L2CAP_TXSEQ_INVALID;
6893*4882a593Smuzhiyun 		}
6894*4882a593Smuzhiyun 	} else {
6895*4882a593Smuzhiyun 		BT_DBG("Unexpected - txseq indicates missing frames");
6896*4882a593Smuzhiyun 		return L2CAP_TXSEQ_UNEXPECTED;
6897*4882a593Smuzhiyun 	}
6898*4882a593Smuzhiyun }
6899*4882a593Smuzhiyun 
l2cap_rx_state_recv(struct l2cap_chan * chan,struct l2cap_ctrl * control,struct sk_buff * skb,u8 event)6900*4882a593Smuzhiyun static int l2cap_rx_state_recv(struct l2cap_chan *chan,
6901*4882a593Smuzhiyun 			       struct l2cap_ctrl *control,
6902*4882a593Smuzhiyun 			       struct sk_buff *skb, u8 event)
6903*4882a593Smuzhiyun {
6904*4882a593Smuzhiyun 	struct l2cap_ctrl local_control;
6905*4882a593Smuzhiyun 	int err = 0;
6906*4882a593Smuzhiyun 	bool skb_in_use = false;
6907*4882a593Smuzhiyun 
6908*4882a593Smuzhiyun 	BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6909*4882a593Smuzhiyun 	       event);
6910*4882a593Smuzhiyun 
6911*4882a593Smuzhiyun 	switch (event) {
6912*4882a593Smuzhiyun 	case L2CAP_EV_RECV_IFRAME:
6913*4882a593Smuzhiyun 		switch (l2cap_classify_txseq(chan, control->txseq)) {
6914*4882a593Smuzhiyun 		case L2CAP_TXSEQ_EXPECTED:
6915*4882a593Smuzhiyun 			l2cap_pass_to_tx(chan, control);
6916*4882a593Smuzhiyun 
6917*4882a593Smuzhiyun 			if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6918*4882a593Smuzhiyun 				BT_DBG("Busy, discarding expected seq %d",
6919*4882a593Smuzhiyun 				       control->txseq);
6920*4882a593Smuzhiyun 				break;
6921*4882a593Smuzhiyun 			}
6922*4882a593Smuzhiyun 
6923*4882a593Smuzhiyun 			chan->expected_tx_seq = __next_seq(chan,
6924*4882a593Smuzhiyun 							   control->txseq);
6925*4882a593Smuzhiyun 
6926*4882a593Smuzhiyun 			chan->buffer_seq = chan->expected_tx_seq;
6927*4882a593Smuzhiyun 			skb_in_use = true;
6928*4882a593Smuzhiyun 
6929*4882a593Smuzhiyun 			/* l2cap_reassemble_sdu may free skb, hence invalidate
6930*4882a593Smuzhiyun 			 * control, so make a copy in advance to use it after
6931*4882a593Smuzhiyun 			 * l2cap_reassemble_sdu returns and to avoid the race
6932*4882a593Smuzhiyun 			 * condition, for example:
6933*4882a593Smuzhiyun 			 *
6934*4882a593Smuzhiyun 			 * The current thread calls:
6935*4882a593Smuzhiyun 			 *   l2cap_reassemble_sdu
6936*4882a593Smuzhiyun 			 *     chan->ops->recv == l2cap_sock_recv_cb
6937*4882a593Smuzhiyun 			 *       __sock_queue_rcv_skb
6938*4882a593Smuzhiyun 			 * Another thread calls:
6939*4882a593Smuzhiyun 			 *   bt_sock_recvmsg
6940*4882a593Smuzhiyun 			 *     skb_recv_datagram
6941*4882a593Smuzhiyun 			 *     skb_free_datagram
6942*4882a593Smuzhiyun 			 * Then the current thread tries to access control, but
6943*4882a593Smuzhiyun 			 * it was freed by skb_free_datagram.
6944*4882a593Smuzhiyun 			 */
6945*4882a593Smuzhiyun 			local_control = *control;
6946*4882a593Smuzhiyun 			err = l2cap_reassemble_sdu(chan, skb, control);
6947*4882a593Smuzhiyun 			if (err)
6948*4882a593Smuzhiyun 				break;
6949*4882a593Smuzhiyun 
6950*4882a593Smuzhiyun 			if (local_control.final) {
6951*4882a593Smuzhiyun 				if (!test_and_clear_bit(CONN_REJ_ACT,
6952*4882a593Smuzhiyun 							&chan->conn_state)) {
6953*4882a593Smuzhiyun 					local_control.final = 0;
6954*4882a593Smuzhiyun 					l2cap_retransmit_all(chan, &local_control);
6955*4882a593Smuzhiyun 					l2cap_ertm_send(chan);
6956*4882a593Smuzhiyun 				}
6957*4882a593Smuzhiyun 			}
6958*4882a593Smuzhiyun 
6959*4882a593Smuzhiyun 			if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
6960*4882a593Smuzhiyun 				l2cap_send_ack(chan);
6961*4882a593Smuzhiyun 			break;
6962*4882a593Smuzhiyun 		case L2CAP_TXSEQ_UNEXPECTED:
6963*4882a593Smuzhiyun 			l2cap_pass_to_tx(chan, control);
6964*4882a593Smuzhiyun 
6965*4882a593Smuzhiyun 			/* Can't issue SREJ frames in the local busy state.
6966*4882a593Smuzhiyun 			 * Drop this frame, it will be seen as missing
6967*4882a593Smuzhiyun 			 * when local busy is exited.
6968*4882a593Smuzhiyun 			 */
6969*4882a593Smuzhiyun 			if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6970*4882a593Smuzhiyun 				BT_DBG("Busy, discarding unexpected seq %d",
6971*4882a593Smuzhiyun 				       control->txseq);
6972*4882a593Smuzhiyun 				break;
6973*4882a593Smuzhiyun 			}
6974*4882a593Smuzhiyun 
6975*4882a593Smuzhiyun 			/* There was a gap in the sequence, so an SREJ
6976*4882a593Smuzhiyun 			 * must be sent for each missing frame.  The
6977*4882a593Smuzhiyun 			 * current frame is stored for later use.
6978*4882a593Smuzhiyun 			 */
6979*4882a593Smuzhiyun 			skb_queue_tail(&chan->srej_q, skb);
6980*4882a593Smuzhiyun 			skb_in_use = true;
6981*4882a593Smuzhiyun 			BT_DBG("Queued %p (queue len %d)", skb,
6982*4882a593Smuzhiyun 			       skb_queue_len(&chan->srej_q));
6983*4882a593Smuzhiyun 
6984*4882a593Smuzhiyun 			clear_bit(CONN_SREJ_ACT, &chan->conn_state);
6985*4882a593Smuzhiyun 			l2cap_seq_list_clear(&chan->srej_list);
6986*4882a593Smuzhiyun 			l2cap_send_srej(chan, control->txseq);
6987*4882a593Smuzhiyun 
6988*4882a593Smuzhiyun 			chan->rx_state = L2CAP_RX_STATE_SREJ_SENT;
6989*4882a593Smuzhiyun 			break;
6990*4882a593Smuzhiyun 		case L2CAP_TXSEQ_DUPLICATE:
6991*4882a593Smuzhiyun 			l2cap_pass_to_tx(chan, control);
6992*4882a593Smuzhiyun 			break;
6993*4882a593Smuzhiyun 		case L2CAP_TXSEQ_INVALID_IGNORE:
6994*4882a593Smuzhiyun 			break;
6995*4882a593Smuzhiyun 		case L2CAP_TXSEQ_INVALID:
6996*4882a593Smuzhiyun 		default:
6997*4882a593Smuzhiyun 			l2cap_send_disconn_req(chan, ECONNRESET);
6998*4882a593Smuzhiyun 			break;
6999*4882a593Smuzhiyun 		}
7000*4882a593Smuzhiyun 		break;
7001*4882a593Smuzhiyun 	case L2CAP_EV_RECV_RR:
7002*4882a593Smuzhiyun 		l2cap_pass_to_tx(chan, control);
7003*4882a593Smuzhiyun 		if (control->final) {
7004*4882a593Smuzhiyun 			clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
7005*4882a593Smuzhiyun 
7006*4882a593Smuzhiyun 			if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state) &&
7007*4882a593Smuzhiyun 			    !__chan_is_moving(chan)) {
7008*4882a593Smuzhiyun 				control->final = 0;
7009*4882a593Smuzhiyun 				l2cap_retransmit_all(chan, control);
7010*4882a593Smuzhiyun 			}
7011*4882a593Smuzhiyun 
7012*4882a593Smuzhiyun 			l2cap_ertm_send(chan);
7013*4882a593Smuzhiyun 		} else if (control->poll) {
7014*4882a593Smuzhiyun 			l2cap_send_i_or_rr_or_rnr(chan);
7015*4882a593Smuzhiyun 		} else {
7016*4882a593Smuzhiyun 			if (test_and_clear_bit(CONN_REMOTE_BUSY,
7017*4882a593Smuzhiyun 					       &chan->conn_state) &&
7018*4882a593Smuzhiyun 			    chan->unacked_frames)
7019*4882a593Smuzhiyun 				__set_retrans_timer(chan);
7020*4882a593Smuzhiyun 
7021*4882a593Smuzhiyun 			l2cap_ertm_send(chan);
7022*4882a593Smuzhiyun 		}
7023*4882a593Smuzhiyun 		break;
7024*4882a593Smuzhiyun 	case L2CAP_EV_RECV_RNR:
7025*4882a593Smuzhiyun 		set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
7026*4882a593Smuzhiyun 		l2cap_pass_to_tx(chan, control);
7027*4882a593Smuzhiyun 		if (control && control->poll) {
7028*4882a593Smuzhiyun 			set_bit(CONN_SEND_FBIT, &chan->conn_state);
7029*4882a593Smuzhiyun 			l2cap_send_rr_or_rnr(chan, 0);
7030*4882a593Smuzhiyun 		}
7031*4882a593Smuzhiyun 		__clear_retrans_timer(chan);
7032*4882a593Smuzhiyun 		l2cap_seq_list_clear(&chan->retrans_list);
7033*4882a593Smuzhiyun 		break;
7034*4882a593Smuzhiyun 	case L2CAP_EV_RECV_REJ:
7035*4882a593Smuzhiyun 		l2cap_handle_rej(chan, control);
7036*4882a593Smuzhiyun 		break;
7037*4882a593Smuzhiyun 	case L2CAP_EV_RECV_SREJ:
7038*4882a593Smuzhiyun 		l2cap_handle_srej(chan, control);
7039*4882a593Smuzhiyun 		break;
7040*4882a593Smuzhiyun 	default:
7041*4882a593Smuzhiyun 		break;
7042*4882a593Smuzhiyun 	}
7043*4882a593Smuzhiyun 
7044*4882a593Smuzhiyun 	if (skb && !skb_in_use) {
7045*4882a593Smuzhiyun 		BT_DBG("Freeing %p", skb);
7046*4882a593Smuzhiyun 		kfree_skb(skb);
7047*4882a593Smuzhiyun 	}
7048*4882a593Smuzhiyun 
7049*4882a593Smuzhiyun 	return err;
7050*4882a593Smuzhiyun }
7051*4882a593Smuzhiyun 
l2cap_rx_state_srej_sent(struct l2cap_chan * chan,struct l2cap_ctrl * control,struct sk_buff * skb,u8 event)7052*4882a593Smuzhiyun static int l2cap_rx_state_srej_sent(struct l2cap_chan *chan,
7053*4882a593Smuzhiyun 				    struct l2cap_ctrl *control,
7054*4882a593Smuzhiyun 				    struct sk_buff *skb, u8 event)
7055*4882a593Smuzhiyun {
7056*4882a593Smuzhiyun 	int err = 0;
7057*4882a593Smuzhiyun 	u16 txseq = control->txseq;
7058*4882a593Smuzhiyun 	bool skb_in_use = false;
7059*4882a593Smuzhiyun 
7060*4882a593Smuzhiyun 	BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
7061*4882a593Smuzhiyun 	       event);
7062*4882a593Smuzhiyun 
7063*4882a593Smuzhiyun 	switch (event) {
7064*4882a593Smuzhiyun 	case L2CAP_EV_RECV_IFRAME:
7065*4882a593Smuzhiyun 		switch (l2cap_classify_txseq(chan, txseq)) {
7066*4882a593Smuzhiyun 		case L2CAP_TXSEQ_EXPECTED:
7067*4882a593Smuzhiyun 			/* Keep frame for reassembly later */
7068*4882a593Smuzhiyun 			l2cap_pass_to_tx(chan, control);
7069*4882a593Smuzhiyun 			skb_queue_tail(&chan->srej_q, skb);
7070*4882a593Smuzhiyun 			skb_in_use = true;
7071*4882a593Smuzhiyun 			BT_DBG("Queued %p (queue len %d)", skb,
7072*4882a593Smuzhiyun 			       skb_queue_len(&chan->srej_q));
7073*4882a593Smuzhiyun 
7074*4882a593Smuzhiyun 			chan->expected_tx_seq = __next_seq(chan, txseq);
7075*4882a593Smuzhiyun 			break;
7076*4882a593Smuzhiyun 		case L2CAP_TXSEQ_EXPECTED_SREJ:
7077*4882a593Smuzhiyun 			l2cap_seq_list_pop(&chan->srej_list);
7078*4882a593Smuzhiyun 
7079*4882a593Smuzhiyun 			l2cap_pass_to_tx(chan, control);
7080*4882a593Smuzhiyun 			skb_queue_tail(&chan->srej_q, skb);
7081*4882a593Smuzhiyun 			skb_in_use = true;
7082*4882a593Smuzhiyun 			BT_DBG("Queued %p (queue len %d)", skb,
7083*4882a593Smuzhiyun 			       skb_queue_len(&chan->srej_q));
7084*4882a593Smuzhiyun 
7085*4882a593Smuzhiyun 			err = l2cap_rx_queued_iframes(chan);
7086*4882a593Smuzhiyun 			if (err)
7087*4882a593Smuzhiyun 				break;
7088*4882a593Smuzhiyun 
7089*4882a593Smuzhiyun 			break;
7090*4882a593Smuzhiyun 		case L2CAP_TXSEQ_UNEXPECTED:
7091*4882a593Smuzhiyun 			/* Got a frame that can't be reassembled yet.
7092*4882a593Smuzhiyun 			 * Save it for later, and send SREJs to cover
7093*4882a593Smuzhiyun 			 * the missing frames.
7094*4882a593Smuzhiyun 			 */
7095*4882a593Smuzhiyun 			skb_queue_tail(&chan->srej_q, skb);
7096*4882a593Smuzhiyun 			skb_in_use = true;
7097*4882a593Smuzhiyun 			BT_DBG("Queued %p (queue len %d)", skb,
7098*4882a593Smuzhiyun 			       skb_queue_len(&chan->srej_q));
7099*4882a593Smuzhiyun 
7100*4882a593Smuzhiyun 			l2cap_pass_to_tx(chan, control);
7101*4882a593Smuzhiyun 			l2cap_send_srej(chan, control->txseq);
7102*4882a593Smuzhiyun 			break;
7103*4882a593Smuzhiyun 		case L2CAP_TXSEQ_UNEXPECTED_SREJ:
7104*4882a593Smuzhiyun 			/* This frame was requested with an SREJ, but
7105*4882a593Smuzhiyun 			 * some expected retransmitted frames are
7106*4882a593Smuzhiyun 			 * missing.  Request retransmission of missing
7107*4882a593Smuzhiyun 			 * SREJ'd frames.
7108*4882a593Smuzhiyun 			 */
7109*4882a593Smuzhiyun 			skb_queue_tail(&chan->srej_q, skb);
7110*4882a593Smuzhiyun 			skb_in_use = true;
7111*4882a593Smuzhiyun 			BT_DBG("Queued %p (queue len %d)", skb,
7112*4882a593Smuzhiyun 			       skb_queue_len(&chan->srej_q));
7113*4882a593Smuzhiyun 
7114*4882a593Smuzhiyun 			l2cap_pass_to_tx(chan, control);
7115*4882a593Smuzhiyun 			l2cap_send_srej_list(chan, control->txseq);
7116*4882a593Smuzhiyun 			break;
7117*4882a593Smuzhiyun 		case L2CAP_TXSEQ_DUPLICATE_SREJ:
7118*4882a593Smuzhiyun 			/* We've already queued this frame.  Drop this copy. */
7119*4882a593Smuzhiyun 			l2cap_pass_to_tx(chan, control);
7120*4882a593Smuzhiyun 			break;
7121*4882a593Smuzhiyun 		case L2CAP_TXSEQ_DUPLICATE:
7122*4882a593Smuzhiyun 			/* Expecting a later sequence number, so this frame
7123*4882a593Smuzhiyun 			 * was already received.  Ignore it completely.
7124*4882a593Smuzhiyun 			 */
7125*4882a593Smuzhiyun 			break;
7126*4882a593Smuzhiyun 		case L2CAP_TXSEQ_INVALID_IGNORE:
7127*4882a593Smuzhiyun 			break;
7128*4882a593Smuzhiyun 		case L2CAP_TXSEQ_INVALID:
7129*4882a593Smuzhiyun 		default:
7130*4882a593Smuzhiyun 			l2cap_send_disconn_req(chan, ECONNRESET);
7131*4882a593Smuzhiyun 			break;
7132*4882a593Smuzhiyun 		}
7133*4882a593Smuzhiyun 		break;
7134*4882a593Smuzhiyun 	case L2CAP_EV_RECV_RR:
7135*4882a593Smuzhiyun 		l2cap_pass_to_tx(chan, control);
7136*4882a593Smuzhiyun 		if (control->final) {
7137*4882a593Smuzhiyun 			clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
7138*4882a593Smuzhiyun 
7139*4882a593Smuzhiyun 			if (!test_and_clear_bit(CONN_REJ_ACT,
7140*4882a593Smuzhiyun 						&chan->conn_state)) {
7141*4882a593Smuzhiyun 				control->final = 0;
7142*4882a593Smuzhiyun 				l2cap_retransmit_all(chan, control);
7143*4882a593Smuzhiyun 			}
7144*4882a593Smuzhiyun 
7145*4882a593Smuzhiyun 			l2cap_ertm_send(chan);
7146*4882a593Smuzhiyun 		} else if (control->poll) {
7147*4882a593Smuzhiyun 			if (test_and_clear_bit(CONN_REMOTE_BUSY,
7148*4882a593Smuzhiyun 					       &chan->conn_state) &&
7149*4882a593Smuzhiyun 			    chan->unacked_frames) {
7150*4882a593Smuzhiyun 				__set_retrans_timer(chan);
7151*4882a593Smuzhiyun 			}
7152*4882a593Smuzhiyun 
7153*4882a593Smuzhiyun 			set_bit(CONN_SEND_FBIT, &chan->conn_state);
7154*4882a593Smuzhiyun 			l2cap_send_srej_tail(chan);
7155*4882a593Smuzhiyun 		} else {
7156*4882a593Smuzhiyun 			if (test_and_clear_bit(CONN_REMOTE_BUSY,
7157*4882a593Smuzhiyun 					       &chan->conn_state) &&
7158*4882a593Smuzhiyun 			    chan->unacked_frames)
7159*4882a593Smuzhiyun 				__set_retrans_timer(chan);
7160*4882a593Smuzhiyun 
7161*4882a593Smuzhiyun 			l2cap_send_ack(chan);
7162*4882a593Smuzhiyun 		}
7163*4882a593Smuzhiyun 		break;
7164*4882a593Smuzhiyun 	case L2CAP_EV_RECV_RNR:
7165*4882a593Smuzhiyun 		set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
7166*4882a593Smuzhiyun 		l2cap_pass_to_tx(chan, control);
7167*4882a593Smuzhiyun 		if (control->poll) {
7168*4882a593Smuzhiyun 			l2cap_send_srej_tail(chan);
7169*4882a593Smuzhiyun 		} else {
7170*4882a593Smuzhiyun 			struct l2cap_ctrl rr_control;
7171*4882a593Smuzhiyun 			memset(&rr_control, 0, sizeof(rr_control));
7172*4882a593Smuzhiyun 			rr_control.sframe = 1;
7173*4882a593Smuzhiyun 			rr_control.super = L2CAP_SUPER_RR;
7174*4882a593Smuzhiyun 			rr_control.reqseq = chan->buffer_seq;
7175*4882a593Smuzhiyun 			l2cap_send_sframe(chan, &rr_control);
7176*4882a593Smuzhiyun 		}
7177*4882a593Smuzhiyun 
7178*4882a593Smuzhiyun 		break;
7179*4882a593Smuzhiyun 	case L2CAP_EV_RECV_REJ:
7180*4882a593Smuzhiyun 		l2cap_handle_rej(chan, control);
7181*4882a593Smuzhiyun 		break;
7182*4882a593Smuzhiyun 	case L2CAP_EV_RECV_SREJ:
7183*4882a593Smuzhiyun 		l2cap_handle_srej(chan, control);
7184*4882a593Smuzhiyun 		break;
7185*4882a593Smuzhiyun 	}
7186*4882a593Smuzhiyun 
7187*4882a593Smuzhiyun 	if (skb && !skb_in_use) {
7188*4882a593Smuzhiyun 		BT_DBG("Freeing %p", skb);
7189*4882a593Smuzhiyun 		kfree_skb(skb);
7190*4882a593Smuzhiyun 	}
7191*4882a593Smuzhiyun 
7192*4882a593Smuzhiyun 	return err;
7193*4882a593Smuzhiyun }
7194*4882a593Smuzhiyun 
l2cap_finish_move(struct l2cap_chan * chan)7195*4882a593Smuzhiyun static int l2cap_finish_move(struct l2cap_chan *chan)
7196*4882a593Smuzhiyun {
7197*4882a593Smuzhiyun 	BT_DBG("chan %p", chan);
7198*4882a593Smuzhiyun 
7199*4882a593Smuzhiyun 	chan->rx_state = L2CAP_RX_STATE_RECV;
7200*4882a593Smuzhiyun 
7201*4882a593Smuzhiyun 	if (chan->hs_hcon)
7202*4882a593Smuzhiyun 		chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
7203*4882a593Smuzhiyun 	else
7204*4882a593Smuzhiyun 		chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
7205*4882a593Smuzhiyun 
7206*4882a593Smuzhiyun 	return l2cap_resegment(chan);
7207*4882a593Smuzhiyun }
7208*4882a593Smuzhiyun 
l2cap_rx_state_wait_p(struct l2cap_chan * chan,struct l2cap_ctrl * control,struct sk_buff * skb,u8 event)7209*4882a593Smuzhiyun static int l2cap_rx_state_wait_p(struct l2cap_chan *chan,
7210*4882a593Smuzhiyun 				 struct l2cap_ctrl *control,
7211*4882a593Smuzhiyun 				 struct sk_buff *skb, u8 event)
7212*4882a593Smuzhiyun {
7213*4882a593Smuzhiyun 	int err;
7214*4882a593Smuzhiyun 
7215*4882a593Smuzhiyun 	BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
7216*4882a593Smuzhiyun 	       event);
7217*4882a593Smuzhiyun 
7218*4882a593Smuzhiyun 	if (!control->poll)
7219*4882a593Smuzhiyun 		return -EPROTO;
7220*4882a593Smuzhiyun 
7221*4882a593Smuzhiyun 	l2cap_process_reqseq(chan, control->reqseq);
7222*4882a593Smuzhiyun 
7223*4882a593Smuzhiyun 	if (!skb_queue_empty(&chan->tx_q))
7224*4882a593Smuzhiyun 		chan->tx_send_head = skb_peek(&chan->tx_q);
7225*4882a593Smuzhiyun 	else
7226*4882a593Smuzhiyun 		chan->tx_send_head = NULL;
7227*4882a593Smuzhiyun 
7228*4882a593Smuzhiyun 	/* Rewind next_tx_seq to the point expected
7229*4882a593Smuzhiyun 	 * by the receiver.
7230*4882a593Smuzhiyun 	 */
7231*4882a593Smuzhiyun 	chan->next_tx_seq = control->reqseq;
7232*4882a593Smuzhiyun 	chan->unacked_frames = 0;
7233*4882a593Smuzhiyun 
7234*4882a593Smuzhiyun 	err = l2cap_finish_move(chan);
7235*4882a593Smuzhiyun 	if (err)
7236*4882a593Smuzhiyun 		return err;
7237*4882a593Smuzhiyun 
7238*4882a593Smuzhiyun 	set_bit(CONN_SEND_FBIT, &chan->conn_state);
7239*4882a593Smuzhiyun 	l2cap_send_i_or_rr_or_rnr(chan);
7240*4882a593Smuzhiyun 
7241*4882a593Smuzhiyun 	if (event == L2CAP_EV_RECV_IFRAME)
7242*4882a593Smuzhiyun 		return -EPROTO;
7243*4882a593Smuzhiyun 
7244*4882a593Smuzhiyun 	return l2cap_rx_state_recv(chan, control, NULL, event);
7245*4882a593Smuzhiyun }
7246*4882a593Smuzhiyun 
l2cap_rx_state_wait_f(struct l2cap_chan * chan,struct l2cap_ctrl * control,struct sk_buff * skb,u8 event)7247*4882a593Smuzhiyun static int l2cap_rx_state_wait_f(struct l2cap_chan *chan,
7248*4882a593Smuzhiyun 				 struct l2cap_ctrl *control,
7249*4882a593Smuzhiyun 				 struct sk_buff *skb, u8 event)
7250*4882a593Smuzhiyun {
7251*4882a593Smuzhiyun 	int err;
7252*4882a593Smuzhiyun 
7253*4882a593Smuzhiyun 	if (!control->final)
7254*4882a593Smuzhiyun 		return -EPROTO;
7255*4882a593Smuzhiyun 
7256*4882a593Smuzhiyun 	clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
7257*4882a593Smuzhiyun 
7258*4882a593Smuzhiyun 	chan->rx_state = L2CAP_RX_STATE_RECV;
7259*4882a593Smuzhiyun 	l2cap_process_reqseq(chan, control->reqseq);
7260*4882a593Smuzhiyun 
7261*4882a593Smuzhiyun 	if (!skb_queue_empty(&chan->tx_q))
7262*4882a593Smuzhiyun 		chan->tx_send_head = skb_peek(&chan->tx_q);
7263*4882a593Smuzhiyun 	else
7264*4882a593Smuzhiyun 		chan->tx_send_head = NULL;
7265*4882a593Smuzhiyun 
7266*4882a593Smuzhiyun 	/* Rewind next_tx_seq to the point expected
7267*4882a593Smuzhiyun 	 * by the receiver.
7268*4882a593Smuzhiyun 	 */
7269*4882a593Smuzhiyun 	chan->next_tx_seq = control->reqseq;
7270*4882a593Smuzhiyun 	chan->unacked_frames = 0;
7271*4882a593Smuzhiyun 
7272*4882a593Smuzhiyun 	if (chan->hs_hcon)
7273*4882a593Smuzhiyun 		chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
7274*4882a593Smuzhiyun 	else
7275*4882a593Smuzhiyun 		chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
7276*4882a593Smuzhiyun 
7277*4882a593Smuzhiyun 	err = l2cap_resegment(chan);
7278*4882a593Smuzhiyun 
7279*4882a593Smuzhiyun 	if (!err)
7280*4882a593Smuzhiyun 		err = l2cap_rx_state_recv(chan, control, skb, event);
7281*4882a593Smuzhiyun 
7282*4882a593Smuzhiyun 	return err;
7283*4882a593Smuzhiyun }
7284*4882a593Smuzhiyun 
__valid_reqseq(struct l2cap_chan * chan,u16 reqseq)7285*4882a593Smuzhiyun static bool __valid_reqseq(struct l2cap_chan *chan, u16 reqseq)
7286*4882a593Smuzhiyun {
7287*4882a593Smuzhiyun 	/* Make sure reqseq is for a packet that has been sent but not acked */
7288*4882a593Smuzhiyun 	u16 unacked;
7289*4882a593Smuzhiyun 
7290*4882a593Smuzhiyun 	unacked = __seq_offset(chan, chan->next_tx_seq, chan->expected_ack_seq);
7291*4882a593Smuzhiyun 	return __seq_offset(chan, chan->next_tx_seq, reqseq) <= unacked;
7292*4882a593Smuzhiyun }
7293*4882a593Smuzhiyun 
l2cap_rx(struct l2cap_chan * chan,struct l2cap_ctrl * control,struct sk_buff * skb,u8 event)7294*4882a593Smuzhiyun static int l2cap_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
7295*4882a593Smuzhiyun 		    struct sk_buff *skb, u8 event)
7296*4882a593Smuzhiyun {
7297*4882a593Smuzhiyun 	int err = 0;
7298*4882a593Smuzhiyun 
7299*4882a593Smuzhiyun 	BT_DBG("chan %p, control %p, skb %p, event %d, state %d", chan,
7300*4882a593Smuzhiyun 	       control, skb, event, chan->rx_state);
7301*4882a593Smuzhiyun 
7302*4882a593Smuzhiyun 	if (__valid_reqseq(chan, control->reqseq)) {
7303*4882a593Smuzhiyun 		switch (chan->rx_state) {
7304*4882a593Smuzhiyun 		case L2CAP_RX_STATE_RECV:
7305*4882a593Smuzhiyun 			err = l2cap_rx_state_recv(chan, control, skb, event);
7306*4882a593Smuzhiyun 			break;
7307*4882a593Smuzhiyun 		case L2CAP_RX_STATE_SREJ_SENT:
7308*4882a593Smuzhiyun 			err = l2cap_rx_state_srej_sent(chan, control, skb,
7309*4882a593Smuzhiyun 						       event);
7310*4882a593Smuzhiyun 			break;
7311*4882a593Smuzhiyun 		case L2CAP_RX_STATE_WAIT_P:
7312*4882a593Smuzhiyun 			err = l2cap_rx_state_wait_p(chan, control, skb, event);
7313*4882a593Smuzhiyun 			break;
7314*4882a593Smuzhiyun 		case L2CAP_RX_STATE_WAIT_F:
7315*4882a593Smuzhiyun 			err = l2cap_rx_state_wait_f(chan, control, skb, event);
7316*4882a593Smuzhiyun 			break;
7317*4882a593Smuzhiyun 		default:
7318*4882a593Smuzhiyun 			/* shut it down */
7319*4882a593Smuzhiyun 			break;
7320*4882a593Smuzhiyun 		}
7321*4882a593Smuzhiyun 	} else {
7322*4882a593Smuzhiyun 		BT_DBG("Invalid reqseq %d (next_tx_seq %d, expected_ack_seq %d",
7323*4882a593Smuzhiyun 		       control->reqseq, chan->next_tx_seq,
7324*4882a593Smuzhiyun 		       chan->expected_ack_seq);
7325*4882a593Smuzhiyun 		l2cap_send_disconn_req(chan, ECONNRESET);
7326*4882a593Smuzhiyun 	}
7327*4882a593Smuzhiyun 
7328*4882a593Smuzhiyun 	return err;
7329*4882a593Smuzhiyun }
7330*4882a593Smuzhiyun 
l2cap_stream_rx(struct l2cap_chan * chan,struct l2cap_ctrl * control,struct sk_buff * skb)7331*4882a593Smuzhiyun static int l2cap_stream_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
7332*4882a593Smuzhiyun 			   struct sk_buff *skb)
7333*4882a593Smuzhiyun {
7334*4882a593Smuzhiyun 	/* l2cap_reassemble_sdu may free skb, hence invalidate control, so store
7335*4882a593Smuzhiyun 	 * the txseq field in advance to use it after l2cap_reassemble_sdu
7336*4882a593Smuzhiyun 	 * returns and to avoid the race condition, for example:
7337*4882a593Smuzhiyun 	 *
7338*4882a593Smuzhiyun 	 * The current thread calls:
7339*4882a593Smuzhiyun 	 *   l2cap_reassemble_sdu
7340*4882a593Smuzhiyun 	 *     chan->ops->recv == l2cap_sock_recv_cb
7341*4882a593Smuzhiyun 	 *       __sock_queue_rcv_skb
7342*4882a593Smuzhiyun 	 * Another thread calls:
7343*4882a593Smuzhiyun 	 *   bt_sock_recvmsg
7344*4882a593Smuzhiyun 	 *     skb_recv_datagram
7345*4882a593Smuzhiyun 	 *     skb_free_datagram
7346*4882a593Smuzhiyun 	 * Then the current thread tries to access control, but it was freed by
7347*4882a593Smuzhiyun 	 * skb_free_datagram.
7348*4882a593Smuzhiyun 	 */
7349*4882a593Smuzhiyun 	u16 txseq = control->txseq;
7350*4882a593Smuzhiyun 
7351*4882a593Smuzhiyun 	BT_DBG("chan %p, control %p, skb %p, state %d", chan, control, skb,
7352*4882a593Smuzhiyun 	       chan->rx_state);
7353*4882a593Smuzhiyun 
7354*4882a593Smuzhiyun 	if (l2cap_classify_txseq(chan, txseq) == L2CAP_TXSEQ_EXPECTED) {
7355*4882a593Smuzhiyun 		l2cap_pass_to_tx(chan, control);
7356*4882a593Smuzhiyun 
7357*4882a593Smuzhiyun 		BT_DBG("buffer_seq %d->%d", chan->buffer_seq,
7358*4882a593Smuzhiyun 		       __next_seq(chan, chan->buffer_seq));
7359*4882a593Smuzhiyun 
7360*4882a593Smuzhiyun 		chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
7361*4882a593Smuzhiyun 
7362*4882a593Smuzhiyun 		l2cap_reassemble_sdu(chan, skb, control);
7363*4882a593Smuzhiyun 	} else {
7364*4882a593Smuzhiyun 		if (chan->sdu) {
7365*4882a593Smuzhiyun 			kfree_skb(chan->sdu);
7366*4882a593Smuzhiyun 			chan->sdu = NULL;
7367*4882a593Smuzhiyun 		}
7368*4882a593Smuzhiyun 		chan->sdu_last_frag = NULL;
7369*4882a593Smuzhiyun 		chan->sdu_len = 0;
7370*4882a593Smuzhiyun 
7371*4882a593Smuzhiyun 		if (skb) {
7372*4882a593Smuzhiyun 			BT_DBG("Freeing %p", skb);
7373*4882a593Smuzhiyun 			kfree_skb(skb);
7374*4882a593Smuzhiyun 		}
7375*4882a593Smuzhiyun 	}
7376*4882a593Smuzhiyun 
7377*4882a593Smuzhiyun 	chan->last_acked_seq = txseq;
7378*4882a593Smuzhiyun 	chan->expected_tx_seq = __next_seq(chan, txseq);
7379*4882a593Smuzhiyun 
7380*4882a593Smuzhiyun 	return 0;
7381*4882a593Smuzhiyun }
7382*4882a593Smuzhiyun 
l2cap_data_rcv(struct l2cap_chan * chan,struct sk_buff * skb)7383*4882a593Smuzhiyun static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
7384*4882a593Smuzhiyun {
7385*4882a593Smuzhiyun 	struct l2cap_ctrl *control = &bt_cb(skb)->l2cap;
7386*4882a593Smuzhiyun 	u16 len;
7387*4882a593Smuzhiyun 	u8 event;
7388*4882a593Smuzhiyun 
7389*4882a593Smuzhiyun 	__unpack_control(chan, skb);
7390*4882a593Smuzhiyun 
7391*4882a593Smuzhiyun 	len = skb->len;
7392*4882a593Smuzhiyun 
7393*4882a593Smuzhiyun 	/*
7394*4882a593Smuzhiyun 	 * We can just drop the corrupted I-frame here.
7395*4882a593Smuzhiyun 	 * Receiver will miss it and start proper recovery
7396*4882a593Smuzhiyun 	 * procedures and ask for retransmission.
7397*4882a593Smuzhiyun 	 */
7398*4882a593Smuzhiyun 	if (l2cap_check_fcs(chan, skb))
7399*4882a593Smuzhiyun 		goto drop;
7400*4882a593Smuzhiyun 
7401*4882a593Smuzhiyun 	if (!control->sframe && control->sar == L2CAP_SAR_START)
7402*4882a593Smuzhiyun 		len -= L2CAP_SDULEN_SIZE;
7403*4882a593Smuzhiyun 
7404*4882a593Smuzhiyun 	if (chan->fcs == L2CAP_FCS_CRC16)
7405*4882a593Smuzhiyun 		len -= L2CAP_FCS_SIZE;
7406*4882a593Smuzhiyun 
7407*4882a593Smuzhiyun 	if (len > chan->mps) {
7408*4882a593Smuzhiyun 		l2cap_send_disconn_req(chan, ECONNRESET);
7409*4882a593Smuzhiyun 		goto drop;
7410*4882a593Smuzhiyun 	}
7411*4882a593Smuzhiyun 
7412*4882a593Smuzhiyun 	if (chan->ops->filter) {
7413*4882a593Smuzhiyun 		if (chan->ops->filter(chan, skb))
7414*4882a593Smuzhiyun 			goto drop;
7415*4882a593Smuzhiyun 	}
7416*4882a593Smuzhiyun 
7417*4882a593Smuzhiyun 	if (!control->sframe) {
7418*4882a593Smuzhiyun 		int err;
7419*4882a593Smuzhiyun 
7420*4882a593Smuzhiyun 		BT_DBG("iframe sar %d, reqseq %d, final %d, txseq %d",
7421*4882a593Smuzhiyun 		       control->sar, control->reqseq, control->final,
7422*4882a593Smuzhiyun 		       control->txseq);
7423*4882a593Smuzhiyun 
7424*4882a593Smuzhiyun 		/* Validate F-bit - F=0 always valid, F=1 only
7425*4882a593Smuzhiyun 		 * valid in TX WAIT_F
7426*4882a593Smuzhiyun 		 */
7427*4882a593Smuzhiyun 		if (control->final && chan->tx_state != L2CAP_TX_STATE_WAIT_F)
7428*4882a593Smuzhiyun 			goto drop;
7429*4882a593Smuzhiyun 
7430*4882a593Smuzhiyun 		if (chan->mode != L2CAP_MODE_STREAMING) {
7431*4882a593Smuzhiyun 			event = L2CAP_EV_RECV_IFRAME;
7432*4882a593Smuzhiyun 			err = l2cap_rx(chan, control, skb, event);
7433*4882a593Smuzhiyun 		} else {
7434*4882a593Smuzhiyun 			err = l2cap_stream_rx(chan, control, skb);
7435*4882a593Smuzhiyun 		}
7436*4882a593Smuzhiyun 
7437*4882a593Smuzhiyun 		if (err)
7438*4882a593Smuzhiyun 			l2cap_send_disconn_req(chan, ECONNRESET);
7439*4882a593Smuzhiyun 	} else {
7440*4882a593Smuzhiyun 		const u8 rx_func_to_event[4] = {
7441*4882a593Smuzhiyun 			L2CAP_EV_RECV_RR, L2CAP_EV_RECV_REJ,
7442*4882a593Smuzhiyun 			L2CAP_EV_RECV_RNR, L2CAP_EV_RECV_SREJ
7443*4882a593Smuzhiyun 		};
7444*4882a593Smuzhiyun 
7445*4882a593Smuzhiyun 		/* Only I-frames are expected in streaming mode */
7446*4882a593Smuzhiyun 		if (chan->mode == L2CAP_MODE_STREAMING)
7447*4882a593Smuzhiyun 			goto drop;
7448*4882a593Smuzhiyun 
7449*4882a593Smuzhiyun 		BT_DBG("sframe reqseq %d, final %d, poll %d, super %d",
7450*4882a593Smuzhiyun 		       control->reqseq, control->final, control->poll,
7451*4882a593Smuzhiyun 		       control->super);
7452*4882a593Smuzhiyun 
7453*4882a593Smuzhiyun 		if (len != 0) {
7454*4882a593Smuzhiyun 			BT_ERR("Trailing bytes: %d in sframe", len);
7455*4882a593Smuzhiyun 			l2cap_send_disconn_req(chan, ECONNRESET);
7456*4882a593Smuzhiyun 			goto drop;
7457*4882a593Smuzhiyun 		}
7458*4882a593Smuzhiyun 
7459*4882a593Smuzhiyun 		/* Validate F and P bits */
7460*4882a593Smuzhiyun 		if (control->final && (control->poll ||
7461*4882a593Smuzhiyun 				       chan->tx_state != L2CAP_TX_STATE_WAIT_F))
7462*4882a593Smuzhiyun 			goto drop;
7463*4882a593Smuzhiyun 
7464*4882a593Smuzhiyun 		event = rx_func_to_event[control->super];
7465*4882a593Smuzhiyun 		if (l2cap_rx(chan, control, skb, event))
7466*4882a593Smuzhiyun 			l2cap_send_disconn_req(chan, ECONNRESET);
7467*4882a593Smuzhiyun 	}
7468*4882a593Smuzhiyun 
7469*4882a593Smuzhiyun 	return 0;
7470*4882a593Smuzhiyun 
7471*4882a593Smuzhiyun drop:
7472*4882a593Smuzhiyun 	kfree_skb(skb);
7473*4882a593Smuzhiyun 	return 0;
7474*4882a593Smuzhiyun }
7475*4882a593Smuzhiyun 
l2cap_chan_le_send_credits(struct l2cap_chan * chan)7476*4882a593Smuzhiyun static void l2cap_chan_le_send_credits(struct l2cap_chan *chan)
7477*4882a593Smuzhiyun {
7478*4882a593Smuzhiyun 	struct l2cap_conn *conn = chan->conn;
7479*4882a593Smuzhiyun 	struct l2cap_le_credits pkt;
7480*4882a593Smuzhiyun 	u16 return_credits;
7481*4882a593Smuzhiyun 
7482*4882a593Smuzhiyun 	return_credits = (chan->imtu / chan->mps) + 1;
7483*4882a593Smuzhiyun 
7484*4882a593Smuzhiyun 	if (chan->rx_credits >= return_credits)
7485*4882a593Smuzhiyun 		return;
7486*4882a593Smuzhiyun 
7487*4882a593Smuzhiyun 	return_credits -= chan->rx_credits;
7488*4882a593Smuzhiyun 
7489*4882a593Smuzhiyun 	BT_DBG("chan %p returning %u credits to sender", chan, return_credits);
7490*4882a593Smuzhiyun 
7491*4882a593Smuzhiyun 	chan->rx_credits += return_credits;
7492*4882a593Smuzhiyun 
7493*4882a593Smuzhiyun 	pkt.cid     = cpu_to_le16(chan->scid);
7494*4882a593Smuzhiyun 	pkt.credits = cpu_to_le16(return_credits);
7495*4882a593Smuzhiyun 
7496*4882a593Smuzhiyun 	chan->ident = l2cap_get_ident(conn);
7497*4882a593Smuzhiyun 
7498*4882a593Smuzhiyun 	l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CREDITS, sizeof(pkt), &pkt);
7499*4882a593Smuzhiyun }
7500*4882a593Smuzhiyun 
l2cap_ecred_recv(struct l2cap_chan * chan,struct sk_buff * skb)7501*4882a593Smuzhiyun static int l2cap_ecred_recv(struct l2cap_chan *chan, struct sk_buff *skb)
7502*4882a593Smuzhiyun {
7503*4882a593Smuzhiyun 	int err;
7504*4882a593Smuzhiyun 
7505*4882a593Smuzhiyun 	BT_DBG("SDU reassemble complete: chan %p skb->len %u", chan, skb->len);
7506*4882a593Smuzhiyun 
7507*4882a593Smuzhiyun 	/* Wait recv to confirm reception before updating the credits */
7508*4882a593Smuzhiyun 	err = chan->ops->recv(chan, skb);
7509*4882a593Smuzhiyun 
7510*4882a593Smuzhiyun 	/* Update credits whenever an SDU is received */
7511*4882a593Smuzhiyun 	l2cap_chan_le_send_credits(chan);
7512*4882a593Smuzhiyun 
7513*4882a593Smuzhiyun 	return err;
7514*4882a593Smuzhiyun }
7515*4882a593Smuzhiyun 
l2cap_ecred_data_rcv(struct l2cap_chan * chan,struct sk_buff * skb)7516*4882a593Smuzhiyun static int l2cap_ecred_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
7517*4882a593Smuzhiyun {
7518*4882a593Smuzhiyun 	int err;
7519*4882a593Smuzhiyun 
7520*4882a593Smuzhiyun 	if (!chan->rx_credits) {
7521*4882a593Smuzhiyun 		BT_ERR("No credits to receive LE L2CAP data");
7522*4882a593Smuzhiyun 		l2cap_send_disconn_req(chan, ECONNRESET);
7523*4882a593Smuzhiyun 		return -ENOBUFS;
7524*4882a593Smuzhiyun 	}
7525*4882a593Smuzhiyun 
7526*4882a593Smuzhiyun 	if (chan->imtu < skb->len) {
7527*4882a593Smuzhiyun 		BT_ERR("Too big LE L2CAP PDU");
7528*4882a593Smuzhiyun 		return -ENOBUFS;
7529*4882a593Smuzhiyun 	}
7530*4882a593Smuzhiyun 
7531*4882a593Smuzhiyun 	chan->rx_credits--;
7532*4882a593Smuzhiyun 	BT_DBG("rx_credits %u -> %u", chan->rx_credits + 1, chan->rx_credits);
7533*4882a593Smuzhiyun 
7534*4882a593Smuzhiyun 	/* Update if remote had run out of credits, this should only happens
7535*4882a593Smuzhiyun 	 * if the remote is not using the entire MPS.
7536*4882a593Smuzhiyun 	 */
7537*4882a593Smuzhiyun 	if (!chan->rx_credits)
7538*4882a593Smuzhiyun 		l2cap_chan_le_send_credits(chan);
7539*4882a593Smuzhiyun 
7540*4882a593Smuzhiyun 	err = 0;
7541*4882a593Smuzhiyun 
7542*4882a593Smuzhiyun 	if (!chan->sdu) {
7543*4882a593Smuzhiyun 		u16 sdu_len;
7544*4882a593Smuzhiyun 
7545*4882a593Smuzhiyun 		sdu_len = get_unaligned_le16(skb->data);
7546*4882a593Smuzhiyun 		skb_pull(skb, L2CAP_SDULEN_SIZE);
7547*4882a593Smuzhiyun 
7548*4882a593Smuzhiyun 		BT_DBG("Start of new SDU. sdu_len %u skb->len %u imtu %u",
7549*4882a593Smuzhiyun 		       sdu_len, skb->len, chan->imtu);
7550*4882a593Smuzhiyun 
7551*4882a593Smuzhiyun 		if (sdu_len > chan->imtu) {
7552*4882a593Smuzhiyun 			BT_ERR("Too big LE L2CAP SDU length received");
7553*4882a593Smuzhiyun 			err = -EMSGSIZE;
7554*4882a593Smuzhiyun 			goto failed;
7555*4882a593Smuzhiyun 		}
7556*4882a593Smuzhiyun 
7557*4882a593Smuzhiyun 		if (skb->len > sdu_len) {
7558*4882a593Smuzhiyun 			BT_ERR("Too much LE L2CAP data received");
7559*4882a593Smuzhiyun 			err = -EINVAL;
7560*4882a593Smuzhiyun 			goto failed;
7561*4882a593Smuzhiyun 		}
7562*4882a593Smuzhiyun 
7563*4882a593Smuzhiyun 		if (skb->len == sdu_len)
7564*4882a593Smuzhiyun 			return l2cap_ecred_recv(chan, skb);
7565*4882a593Smuzhiyun 
7566*4882a593Smuzhiyun 		chan->sdu = skb;
7567*4882a593Smuzhiyun 		chan->sdu_len = sdu_len;
7568*4882a593Smuzhiyun 		chan->sdu_last_frag = skb;
7569*4882a593Smuzhiyun 
7570*4882a593Smuzhiyun 		/* Detect if remote is not able to use the selected MPS */
7571*4882a593Smuzhiyun 		if (skb->len + L2CAP_SDULEN_SIZE < chan->mps) {
7572*4882a593Smuzhiyun 			u16 mps_len = skb->len + L2CAP_SDULEN_SIZE;
7573*4882a593Smuzhiyun 
7574*4882a593Smuzhiyun 			/* Adjust the number of credits */
7575*4882a593Smuzhiyun 			BT_DBG("chan->mps %u -> %u", chan->mps, mps_len);
7576*4882a593Smuzhiyun 			chan->mps = mps_len;
7577*4882a593Smuzhiyun 			l2cap_chan_le_send_credits(chan);
7578*4882a593Smuzhiyun 		}
7579*4882a593Smuzhiyun 
7580*4882a593Smuzhiyun 		return 0;
7581*4882a593Smuzhiyun 	}
7582*4882a593Smuzhiyun 
7583*4882a593Smuzhiyun 	BT_DBG("SDU fragment. chan->sdu->len %u skb->len %u chan->sdu_len %u",
7584*4882a593Smuzhiyun 	       chan->sdu->len, skb->len, chan->sdu_len);
7585*4882a593Smuzhiyun 
7586*4882a593Smuzhiyun 	if (chan->sdu->len + skb->len > chan->sdu_len) {
7587*4882a593Smuzhiyun 		BT_ERR("Too much LE L2CAP data received");
7588*4882a593Smuzhiyun 		err = -EINVAL;
7589*4882a593Smuzhiyun 		goto failed;
7590*4882a593Smuzhiyun 	}
7591*4882a593Smuzhiyun 
7592*4882a593Smuzhiyun 	append_skb_frag(chan->sdu, skb, &chan->sdu_last_frag);
7593*4882a593Smuzhiyun 	skb = NULL;
7594*4882a593Smuzhiyun 
7595*4882a593Smuzhiyun 	if (chan->sdu->len == chan->sdu_len) {
7596*4882a593Smuzhiyun 		err = l2cap_ecred_recv(chan, chan->sdu);
7597*4882a593Smuzhiyun 		if (!err) {
7598*4882a593Smuzhiyun 			chan->sdu = NULL;
7599*4882a593Smuzhiyun 			chan->sdu_last_frag = NULL;
7600*4882a593Smuzhiyun 			chan->sdu_len = 0;
7601*4882a593Smuzhiyun 		}
7602*4882a593Smuzhiyun 	}
7603*4882a593Smuzhiyun 
7604*4882a593Smuzhiyun failed:
7605*4882a593Smuzhiyun 	if (err) {
7606*4882a593Smuzhiyun 		kfree_skb(skb);
7607*4882a593Smuzhiyun 		kfree_skb(chan->sdu);
7608*4882a593Smuzhiyun 		chan->sdu = NULL;
7609*4882a593Smuzhiyun 		chan->sdu_last_frag = NULL;
7610*4882a593Smuzhiyun 		chan->sdu_len = 0;
7611*4882a593Smuzhiyun 	}
7612*4882a593Smuzhiyun 
7613*4882a593Smuzhiyun 	/* We can't return an error here since we took care of the skb
7614*4882a593Smuzhiyun 	 * freeing internally. An error return would cause the caller to
7615*4882a593Smuzhiyun 	 * do a double-free of the skb.
7616*4882a593Smuzhiyun 	 */
7617*4882a593Smuzhiyun 	return 0;
7618*4882a593Smuzhiyun }
7619*4882a593Smuzhiyun 
l2cap_data_channel(struct l2cap_conn * conn,u16 cid,struct sk_buff * skb)7620*4882a593Smuzhiyun static void l2cap_data_channel(struct l2cap_conn *conn, u16 cid,
7621*4882a593Smuzhiyun 			       struct sk_buff *skb)
7622*4882a593Smuzhiyun {
7623*4882a593Smuzhiyun 	struct l2cap_chan *chan;
7624*4882a593Smuzhiyun 
7625*4882a593Smuzhiyun 	chan = l2cap_get_chan_by_scid(conn, cid);
7626*4882a593Smuzhiyun 	if (!chan) {
7627*4882a593Smuzhiyun 		if (cid == L2CAP_CID_A2MP) {
7628*4882a593Smuzhiyun 			chan = a2mp_channel_create(conn, skb);
7629*4882a593Smuzhiyun 			if (!chan) {
7630*4882a593Smuzhiyun 				kfree_skb(skb);
7631*4882a593Smuzhiyun 				return;
7632*4882a593Smuzhiyun 			}
7633*4882a593Smuzhiyun 
7634*4882a593Smuzhiyun 			l2cap_chan_hold(chan);
7635*4882a593Smuzhiyun 			l2cap_chan_lock(chan);
7636*4882a593Smuzhiyun 		} else {
7637*4882a593Smuzhiyun 			BT_DBG("unknown cid 0x%4.4x", cid);
7638*4882a593Smuzhiyun 			/* Drop packet and return */
7639*4882a593Smuzhiyun 			kfree_skb(skb);
7640*4882a593Smuzhiyun 			return;
7641*4882a593Smuzhiyun 		}
7642*4882a593Smuzhiyun 	}
7643*4882a593Smuzhiyun 
7644*4882a593Smuzhiyun 	BT_DBG("chan %p, len %d", chan, skb->len);
7645*4882a593Smuzhiyun 
7646*4882a593Smuzhiyun 	/* If we receive data on a fixed channel before the info req/rsp
7647*4882a593Smuzhiyun 	 * procedure is done simply assume that the channel is supported
7648*4882a593Smuzhiyun 	 * and mark it as ready.
7649*4882a593Smuzhiyun 	 */
7650*4882a593Smuzhiyun 	if (chan->chan_type == L2CAP_CHAN_FIXED)
7651*4882a593Smuzhiyun 		l2cap_chan_ready(chan);
7652*4882a593Smuzhiyun 
7653*4882a593Smuzhiyun 	if (chan->state != BT_CONNECTED)
7654*4882a593Smuzhiyun 		goto drop;
7655*4882a593Smuzhiyun 
7656*4882a593Smuzhiyun 	switch (chan->mode) {
7657*4882a593Smuzhiyun 	case L2CAP_MODE_LE_FLOWCTL:
7658*4882a593Smuzhiyun 	case L2CAP_MODE_EXT_FLOWCTL:
7659*4882a593Smuzhiyun 		if (l2cap_ecred_data_rcv(chan, skb) < 0)
7660*4882a593Smuzhiyun 			goto drop;
7661*4882a593Smuzhiyun 
7662*4882a593Smuzhiyun 		goto done;
7663*4882a593Smuzhiyun 
7664*4882a593Smuzhiyun 	case L2CAP_MODE_BASIC:
7665*4882a593Smuzhiyun 		/* If socket recv buffers overflows we drop data here
7666*4882a593Smuzhiyun 		 * which is *bad* because L2CAP has to be reliable.
7667*4882a593Smuzhiyun 		 * But we don't have any other choice. L2CAP doesn't
7668*4882a593Smuzhiyun 		 * provide flow control mechanism. */
7669*4882a593Smuzhiyun 
7670*4882a593Smuzhiyun 		if (chan->imtu < skb->len) {
7671*4882a593Smuzhiyun 			BT_ERR("Dropping L2CAP data: receive buffer overflow");
7672*4882a593Smuzhiyun 			goto drop;
7673*4882a593Smuzhiyun 		}
7674*4882a593Smuzhiyun 
7675*4882a593Smuzhiyun 		if (!chan->ops->recv(chan, skb))
7676*4882a593Smuzhiyun 			goto done;
7677*4882a593Smuzhiyun 		break;
7678*4882a593Smuzhiyun 
7679*4882a593Smuzhiyun 	case L2CAP_MODE_ERTM:
7680*4882a593Smuzhiyun 	case L2CAP_MODE_STREAMING:
7681*4882a593Smuzhiyun 		l2cap_data_rcv(chan, skb);
7682*4882a593Smuzhiyun 		goto done;
7683*4882a593Smuzhiyun 
7684*4882a593Smuzhiyun 	default:
7685*4882a593Smuzhiyun 		BT_DBG("chan %p: bad mode 0x%2.2x", chan, chan->mode);
7686*4882a593Smuzhiyun 		break;
7687*4882a593Smuzhiyun 	}
7688*4882a593Smuzhiyun 
7689*4882a593Smuzhiyun drop:
7690*4882a593Smuzhiyun 	kfree_skb(skb);
7691*4882a593Smuzhiyun 
7692*4882a593Smuzhiyun done:
7693*4882a593Smuzhiyun 	l2cap_chan_unlock(chan);
7694*4882a593Smuzhiyun 	l2cap_chan_put(chan);
7695*4882a593Smuzhiyun }
7696*4882a593Smuzhiyun 
l2cap_conless_channel(struct l2cap_conn * conn,__le16 psm,struct sk_buff * skb)7697*4882a593Smuzhiyun static void l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm,
7698*4882a593Smuzhiyun 				  struct sk_buff *skb)
7699*4882a593Smuzhiyun {
7700*4882a593Smuzhiyun 	struct hci_conn *hcon = conn->hcon;
7701*4882a593Smuzhiyun 	struct l2cap_chan *chan;
7702*4882a593Smuzhiyun 
7703*4882a593Smuzhiyun 	if (hcon->type != ACL_LINK)
7704*4882a593Smuzhiyun 		goto free_skb;
7705*4882a593Smuzhiyun 
7706*4882a593Smuzhiyun 	chan = l2cap_global_chan_by_psm(0, psm, &hcon->src, &hcon->dst,
7707*4882a593Smuzhiyun 					ACL_LINK);
7708*4882a593Smuzhiyun 	if (!chan)
7709*4882a593Smuzhiyun 		goto free_skb;
7710*4882a593Smuzhiyun 
7711*4882a593Smuzhiyun 	BT_DBG("chan %p, len %d", chan, skb->len);
7712*4882a593Smuzhiyun 
7713*4882a593Smuzhiyun 	if (chan->state != BT_BOUND && chan->state != BT_CONNECTED)
7714*4882a593Smuzhiyun 		goto drop;
7715*4882a593Smuzhiyun 
7716*4882a593Smuzhiyun 	if (chan->imtu < skb->len)
7717*4882a593Smuzhiyun 		goto drop;
7718*4882a593Smuzhiyun 
7719*4882a593Smuzhiyun 	/* Store remote BD_ADDR and PSM for msg_name */
7720*4882a593Smuzhiyun 	bacpy(&bt_cb(skb)->l2cap.bdaddr, &hcon->dst);
7721*4882a593Smuzhiyun 	bt_cb(skb)->l2cap.psm = psm;
7722*4882a593Smuzhiyun 
7723*4882a593Smuzhiyun 	if (!chan->ops->recv(chan, skb)) {
7724*4882a593Smuzhiyun 		l2cap_chan_put(chan);
7725*4882a593Smuzhiyun 		return;
7726*4882a593Smuzhiyun 	}
7727*4882a593Smuzhiyun 
7728*4882a593Smuzhiyun drop:
7729*4882a593Smuzhiyun 	l2cap_chan_put(chan);
7730*4882a593Smuzhiyun free_skb:
7731*4882a593Smuzhiyun 	kfree_skb(skb);
7732*4882a593Smuzhiyun }
7733*4882a593Smuzhiyun 
l2cap_recv_frame(struct l2cap_conn * conn,struct sk_buff * skb)7734*4882a593Smuzhiyun static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb)
7735*4882a593Smuzhiyun {
7736*4882a593Smuzhiyun 	struct l2cap_hdr *lh = (void *) skb->data;
7737*4882a593Smuzhiyun 	struct hci_conn *hcon = conn->hcon;
7738*4882a593Smuzhiyun 	u16 cid, len;
7739*4882a593Smuzhiyun 	__le16 psm;
7740*4882a593Smuzhiyun 
7741*4882a593Smuzhiyun 	if (hcon->state != BT_CONNECTED) {
7742*4882a593Smuzhiyun 		BT_DBG("queueing pending rx skb");
7743*4882a593Smuzhiyun 		skb_queue_tail(&conn->pending_rx, skb);
7744*4882a593Smuzhiyun 		return;
7745*4882a593Smuzhiyun 	}
7746*4882a593Smuzhiyun 
7747*4882a593Smuzhiyun 	skb_pull(skb, L2CAP_HDR_SIZE);
7748*4882a593Smuzhiyun 	cid = __le16_to_cpu(lh->cid);
7749*4882a593Smuzhiyun 	len = __le16_to_cpu(lh->len);
7750*4882a593Smuzhiyun 
7751*4882a593Smuzhiyun 	if (len != skb->len) {
7752*4882a593Smuzhiyun 		kfree_skb(skb);
7753*4882a593Smuzhiyun 		return;
7754*4882a593Smuzhiyun 	}
7755*4882a593Smuzhiyun 
7756*4882a593Smuzhiyun 	/* Since we can't actively block incoming LE connections we must
7757*4882a593Smuzhiyun 	 * at least ensure that we ignore incoming data from them.
7758*4882a593Smuzhiyun 	 */
7759*4882a593Smuzhiyun 	if (hcon->type == LE_LINK &&
7760*4882a593Smuzhiyun 	    hci_bdaddr_list_lookup(&hcon->hdev->blacklist, &hcon->dst,
7761*4882a593Smuzhiyun 				   bdaddr_dst_type(hcon))) {
7762*4882a593Smuzhiyun 		kfree_skb(skb);
7763*4882a593Smuzhiyun 		return;
7764*4882a593Smuzhiyun 	}
7765*4882a593Smuzhiyun 
7766*4882a593Smuzhiyun 	BT_DBG("len %d, cid 0x%4.4x", len, cid);
7767*4882a593Smuzhiyun 
7768*4882a593Smuzhiyun 	switch (cid) {
7769*4882a593Smuzhiyun 	case L2CAP_CID_SIGNALING:
7770*4882a593Smuzhiyun 		l2cap_sig_channel(conn, skb);
7771*4882a593Smuzhiyun 		break;
7772*4882a593Smuzhiyun 
7773*4882a593Smuzhiyun 	case L2CAP_CID_CONN_LESS:
7774*4882a593Smuzhiyun 		psm = get_unaligned((__le16 *) skb->data);
7775*4882a593Smuzhiyun 		skb_pull(skb, L2CAP_PSMLEN_SIZE);
7776*4882a593Smuzhiyun 		l2cap_conless_channel(conn, psm, skb);
7777*4882a593Smuzhiyun 		break;
7778*4882a593Smuzhiyun 
7779*4882a593Smuzhiyun 	case L2CAP_CID_LE_SIGNALING:
7780*4882a593Smuzhiyun 		l2cap_le_sig_channel(conn, skb);
7781*4882a593Smuzhiyun 		break;
7782*4882a593Smuzhiyun 
7783*4882a593Smuzhiyun 	default:
7784*4882a593Smuzhiyun 		l2cap_data_channel(conn, cid, skb);
7785*4882a593Smuzhiyun 		break;
7786*4882a593Smuzhiyun 	}
7787*4882a593Smuzhiyun }
7788*4882a593Smuzhiyun 
process_pending_rx(struct work_struct * work)7789*4882a593Smuzhiyun static void process_pending_rx(struct work_struct *work)
7790*4882a593Smuzhiyun {
7791*4882a593Smuzhiyun 	struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
7792*4882a593Smuzhiyun 					       pending_rx_work);
7793*4882a593Smuzhiyun 	struct sk_buff *skb;
7794*4882a593Smuzhiyun 
7795*4882a593Smuzhiyun 	BT_DBG("");
7796*4882a593Smuzhiyun 
7797*4882a593Smuzhiyun 	while ((skb = skb_dequeue(&conn->pending_rx)))
7798*4882a593Smuzhiyun 		l2cap_recv_frame(conn, skb);
7799*4882a593Smuzhiyun }
7800*4882a593Smuzhiyun 
l2cap_conn_add(struct hci_conn * hcon)7801*4882a593Smuzhiyun static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon)
7802*4882a593Smuzhiyun {
7803*4882a593Smuzhiyun 	struct l2cap_conn *conn = hcon->l2cap_data;
7804*4882a593Smuzhiyun 	struct hci_chan *hchan;
7805*4882a593Smuzhiyun 
7806*4882a593Smuzhiyun 	if (conn)
7807*4882a593Smuzhiyun 		return conn;
7808*4882a593Smuzhiyun 
7809*4882a593Smuzhiyun 	hchan = hci_chan_create(hcon);
7810*4882a593Smuzhiyun 	if (!hchan)
7811*4882a593Smuzhiyun 		return NULL;
7812*4882a593Smuzhiyun 
7813*4882a593Smuzhiyun 	conn = kzalloc(sizeof(*conn), GFP_KERNEL);
7814*4882a593Smuzhiyun 	if (!conn) {
7815*4882a593Smuzhiyun 		hci_chan_del(hchan);
7816*4882a593Smuzhiyun 		return NULL;
7817*4882a593Smuzhiyun 	}
7818*4882a593Smuzhiyun 
7819*4882a593Smuzhiyun 	kref_init(&conn->ref);
7820*4882a593Smuzhiyun 	hcon->l2cap_data = conn;
7821*4882a593Smuzhiyun 	conn->hcon = hci_conn_get(hcon);
7822*4882a593Smuzhiyun 	conn->hchan = hchan;
7823*4882a593Smuzhiyun 
7824*4882a593Smuzhiyun 	BT_DBG("hcon %p conn %p hchan %p", hcon, conn, hchan);
7825*4882a593Smuzhiyun 
7826*4882a593Smuzhiyun 	switch (hcon->type) {
7827*4882a593Smuzhiyun 	case LE_LINK:
7828*4882a593Smuzhiyun 		if (hcon->hdev->le_mtu) {
7829*4882a593Smuzhiyun 			conn->mtu = hcon->hdev->le_mtu;
7830*4882a593Smuzhiyun 			break;
7831*4882a593Smuzhiyun 		}
7832*4882a593Smuzhiyun 		fallthrough;
7833*4882a593Smuzhiyun 	default:
7834*4882a593Smuzhiyun 		conn->mtu = hcon->hdev->acl_mtu;
7835*4882a593Smuzhiyun 		break;
7836*4882a593Smuzhiyun 	}
7837*4882a593Smuzhiyun 
7838*4882a593Smuzhiyun 	conn->feat_mask = 0;
7839*4882a593Smuzhiyun 
7840*4882a593Smuzhiyun 	conn->local_fixed_chan = L2CAP_FC_SIG_BREDR | L2CAP_FC_CONNLESS;
7841*4882a593Smuzhiyun 
7842*4882a593Smuzhiyun 	if (hcon->type == ACL_LINK &&
7843*4882a593Smuzhiyun 	    hci_dev_test_flag(hcon->hdev, HCI_HS_ENABLED))
7844*4882a593Smuzhiyun 		conn->local_fixed_chan |= L2CAP_FC_A2MP;
7845*4882a593Smuzhiyun 
7846*4882a593Smuzhiyun 	if (hci_dev_test_flag(hcon->hdev, HCI_LE_ENABLED) &&
7847*4882a593Smuzhiyun 	    (bredr_sc_enabled(hcon->hdev) ||
7848*4882a593Smuzhiyun 	     hci_dev_test_flag(hcon->hdev, HCI_FORCE_BREDR_SMP)))
7849*4882a593Smuzhiyun 		conn->local_fixed_chan |= L2CAP_FC_SMP_BREDR;
7850*4882a593Smuzhiyun 
7851*4882a593Smuzhiyun 	mutex_init(&conn->ident_lock);
7852*4882a593Smuzhiyun 	mutex_init(&conn->chan_lock);
7853*4882a593Smuzhiyun 
7854*4882a593Smuzhiyun 	INIT_LIST_HEAD(&conn->chan_l);
7855*4882a593Smuzhiyun 	INIT_LIST_HEAD(&conn->users);
7856*4882a593Smuzhiyun 
7857*4882a593Smuzhiyun 	INIT_DELAYED_WORK(&conn->info_timer, l2cap_info_timeout);
7858*4882a593Smuzhiyun 
7859*4882a593Smuzhiyun 	skb_queue_head_init(&conn->pending_rx);
7860*4882a593Smuzhiyun 	INIT_WORK(&conn->pending_rx_work, process_pending_rx);
7861*4882a593Smuzhiyun 	INIT_WORK(&conn->id_addr_update_work, l2cap_conn_update_id_addr);
7862*4882a593Smuzhiyun 
7863*4882a593Smuzhiyun 	conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
7864*4882a593Smuzhiyun 
7865*4882a593Smuzhiyun 	return conn;
7866*4882a593Smuzhiyun }
7867*4882a593Smuzhiyun 
is_valid_psm(u16 psm,u8 dst_type)7868*4882a593Smuzhiyun static bool is_valid_psm(u16 psm, u8 dst_type) {
7869*4882a593Smuzhiyun 	if (!psm)
7870*4882a593Smuzhiyun 		return false;
7871*4882a593Smuzhiyun 
7872*4882a593Smuzhiyun 	if (bdaddr_type_is_le(dst_type))
7873*4882a593Smuzhiyun 		return (psm <= 0x00ff);
7874*4882a593Smuzhiyun 
7875*4882a593Smuzhiyun 	/* PSM must be odd and lsb of upper byte must be 0 */
7876*4882a593Smuzhiyun 	return ((psm & 0x0101) == 0x0001);
7877*4882a593Smuzhiyun }
7878*4882a593Smuzhiyun 
7879*4882a593Smuzhiyun struct l2cap_chan_data {
7880*4882a593Smuzhiyun 	struct l2cap_chan *chan;
7881*4882a593Smuzhiyun 	struct pid *pid;
7882*4882a593Smuzhiyun 	int count;
7883*4882a593Smuzhiyun };
7884*4882a593Smuzhiyun 
l2cap_chan_by_pid(struct l2cap_chan * chan,void * data)7885*4882a593Smuzhiyun static void l2cap_chan_by_pid(struct l2cap_chan *chan, void *data)
7886*4882a593Smuzhiyun {
7887*4882a593Smuzhiyun 	struct l2cap_chan_data *d = data;
7888*4882a593Smuzhiyun 	struct pid *pid;
7889*4882a593Smuzhiyun 
7890*4882a593Smuzhiyun 	if (chan == d->chan)
7891*4882a593Smuzhiyun 		return;
7892*4882a593Smuzhiyun 
7893*4882a593Smuzhiyun 	if (!test_bit(FLAG_DEFER_SETUP, &chan->flags))
7894*4882a593Smuzhiyun 		return;
7895*4882a593Smuzhiyun 
7896*4882a593Smuzhiyun 	pid = chan->ops->get_peer_pid(chan);
7897*4882a593Smuzhiyun 
7898*4882a593Smuzhiyun 	/* Only count deferred channels with the same PID/PSM */
7899*4882a593Smuzhiyun 	if (d->pid != pid || chan->psm != d->chan->psm || chan->ident ||
7900*4882a593Smuzhiyun 	    chan->mode != L2CAP_MODE_EXT_FLOWCTL || chan->state != BT_CONNECT)
7901*4882a593Smuzhiyun 		return;
7902*4882a593Smuzhiyun 
7903*4882a593Smuzhiyun 	d->count++;
7904*4882a593Smuzhiyun }
7905*4882a593Smuzhiyun 
l2cap_chan_connect(struct l2cap_chan * chan,__le16 psm,u16 cid,bdaddr_t * dst,u8 dst_type)7906*4882a593Smuzhiyun int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
7907*4882a593Smuzhiyun 		       bdaddr_t *dst, u8 dst_type)
7908*4882a593Smuzhiyun {
7909*4882a593Smuzhiyun 	struct l2cap_conn *conn;
7910*4882a593Smuzhiyun 	struct hci_conn *hcon;
7911*4882a593Smuzhiyun 	struct hci_dev *hdev;
7912*4882a593Smuzhiyun 	int err;
7913*4882a593Smuzhiyun 
7914*4882a593Smuzhiyun 	BT_DBG("%pMR -> %pMR (type %u) psm 0x%4.4x mode 0x%2.2x", &chan->src,
7915*4882a593Smuzhiyun 	       dst, dst_type, __le16_to_cpu(psm), chan->mode);
7916*4882a593Smuzhiyun 
7917*4882a593Smuzhiyun 	hdev = hci_get_route(dst, &chan->src, chan->src_type);
7918*4882a593Smuzhiyun 	if (!hdev)
7919*4882a593Smuzhiyun 		return -EHOSTUNREACH;
7920*4882a593Smuzhiyun 
7921*4882a593Smuzhiyun 	hci_dev_lock(hdev);
7922*4882a593Smuzhiyun 
7923*4882a593Smuzhiyun 	if (!is_valid_psm(__le16_to_cpu(psm), dst_type) && !cid &&
7924*4882a593Smuzhiyun 	    chan->chan_type != L2CAP_CHAN_RAW) {
7925*4882a593Smuzhiyun 		err = -EINVAL;
7926*4882a593Smuzhiyun 		goto done;
7927*4882a593Smuzhiyun 	}
7928*4882a593Smuzhiyun 
7929*4882a593Smuzhiyun 	if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED && !psm) {
7930*4882a593Smuzhiyun 		err = -EINVAL;
7931*4882a593Smuzhiyun 		goto done;
7932*4882a593Smuzhiyun 	}
7933*4882a593Smuzhiyun 
7934*4882a593Smuzhiyun 	if (chan->chan_type == L2CAP_CHAN_FIXED && !cid) {
7935*4882a593Smuzhiyun 		err = -EINVAL;
7936*4882a593Smuzhiyun 		goto done;
7937*4882a593Smuzhiyun 	}
7938*4882a593Smuzhiyun 
7939*4882a593Smuzhiyun 	switch (chan->mode) {
7940*4882a593Smuzhiyun 	case L2CAP_MODE_BASIC:
7941*4882a593Smuzhiyun 		break;
7942*4882a593Smuzhiyun 	case L2CAP_MODE_LE_FLOWCTL:
7943*4882a593Smuzhiyun 		break;
7944*4882a593Smuzhiyun 	case L2CAP_MODE_EXT_FLOWCTL:
7945*4882a593Smuzhiyun 		if (!enable_ecred) {
7946*4882a593Smuzhiyun 			err = -EOPNOTSUPP;
7947*4882a593Smuzhiyun 			goto done;
7948*4882a593Smuzhiyun 		}
7949*4882a593Smuzhiyun 		break;
7950*4882a593Smuzhiyun 	case L2CAP_MODE_ERTM:
7951*4882a593Smuzhiyun 	case L2CAP_MODE_STREAMING:
7952*4882a593Smuzhiyun 		if (!disable_ertm)
7953*4882a593Smuzhiyun 			break;
7954*4882a593Smuzhiyun 		fallthrough;
7955*4882a593Smuzhiyun 	default:
7956*4882a593Smuzhiyun 		err = -EOPNOTSUPP;
7957*4882a593Smuzhiyun 		goto done;
7958*4882a593Smuzhiyun 	}
7959*4882a593Smuzhiyun 
7960*4882a593Smuzhiyun 	switch (chan->state) {
7961*4882a593Smuzhiyun 	case BT_CONNECT:
7962*4882a593Smuzhiyun 	case BT_CONNECT2:
7963*4882a593Smuzhiyun 	case BT_CONFIG:
7964*4882a593Smuzhiyun 		/* Already connecting */
7965*4882a593Smuzhiyun 		err = 0;
7966*4882a593Smuzhiyun 		goto done;
7967*4882a593Smuzhiyun 
7968*4882a593Smuzhiyun 	case BT_CONNECTED:
7969*4882a593Smuzhiyun 		/* Already connected */
7970*4882a593Smuzhiyun 		err = -EISCONN;
7971*4882a593Smuzhiyun 		goto done;
7972*4882a593Smuzhiyun 
7973*4882a593Smuzhiyun 	case BT_OPEN:
7974*4882a593Smuzhiyun 	case BT_BOUND:
7975*4882a593Smuzhiyun 		/* Can connect */
7976*4882a593Smuzhiyun 		break;
7977*4882a593Smuzhiyun 
7978*4882a593Smuzhiyun 	default:
7979*4882a593Smuzhiyun 		err = -EBADFD;
7980*4882a593Smuzhiyun 		goto done;
7981*4882a593Smuzhiyun 	}
7982*4882a593Smuzhiyun 
7983*4882a593Smuzhiyun 	/* Set destination address and psm */
7984*4882a593Smuzhiyun 	bacpy(&chan->dst, dst);
7985*4882a593Smuzhiyun 	chan->dst_type = dst_type;
7986*4882a593Smuzhiyun 
7987*4882a593Smuzhiyun 	chan->psm = psm;
7988*4882a593Smuzhiyun 	chan->dcid = cid;
7989*4882a593Smuzhiyun 
7990*4882a593Smuzhiyun 	if (bdaddr_type_is_le(dst_type)) {
7991*4882a593Smuzhiyun 		/* Convert from L2CAP channel address type to HCI address type
7992*4882a593Smuzhiyun 		 */
7993*4882a593Smuzhiyun 		if (dst_type == BDADDR_LE_PUBLIC)
7994*4882a593Smuzhiyun 			dst_type = ADDR_LE_DEV_PUBLIC;
7995*4882a593Smuzhiyun 		else
7996*4882a593Smuzhiyun 			dst_type = ADDR_LE_DEV_RANDOM;
7997*4882a593Smuzhiyun 
7998*4882a593Smuzhiyun 		if (hci_dev_test_flag(hdev, HCI_ADVERTISING))
7999*4882a593Smuzhiyun 			hcon = hci_connect_le(hdev, dst, dst_type,
8000*4882a593Smuzhiyun 					      chan->sec_level,
8001*4882a593Smuzhiyun 					      HCI_LE_CONN_TIMEOUT,
8002*4882a593Smuzhiyun 					      HCI_ROLE_SLAVE, NULL);
8003*4882a593Smuzhiyun 		else
8004*4882a593Smuzhiyun 			hcon = hci_connect_le_scan(hdev, dst, dst_type,
8005*4882a593Smuzhiyun 						   chan->sec_level,
8006*4882a593Smuzhiyun 						   HCI_LE_CONN_TIMEOUT,
8007*4882a593Smuzhiyun 						   CONN_REASON_L2CAP_CHAN);
8008*4882a593Smuzhiyun 
8009*4882a593Smuzhiyun 	} else {
8010*4882a593Smuzhiyun 		u8 auth_type = l2cap_get_auth_type(chan);
8011*4882a593Smuzhiyun 		hcon = hci_connect_acl(hdev, dst, chan->sec_level, auth_type,
8012*4882a593Smuzhiyun 				       CONN_REASON_L2CAP_CHAN);
8013*4882a593Smuzhiyun 	}
8014*4882a593Smuzhiyun 
8015*4882a593Smuzhiyun 	if (IS_ERR(hcon)) {
8016*4882a593Smuzhiyun 		err = PTR_ERR(hcon);
8017*4882a593Smuzhiyun 		goto done;
8018*4882a593Smuzhiyun 	}
8019*4882a593Smuzhiyun 
8020*4882a593Smuzhiyun 	conn = l2cap_conn_add(hcon);
8021*4882a593Smuzhiyun 	if (!conn) {
8022*4882a593Smuzhiyun 		hci_conn_drop(hcon);
8023*4882a593Smuzhiyun 		err = -ENOMEM;
8024*4882a593Smuzhiyun 		goto done;
8025*4882a593Smuzhiyun 	}
8026*4882a593Smuzhiyun 
8027*4882a593Smuzhiyun 	if (chan->mode == L2CAP_MODE_EXT_FLOWCTL) {
8028*4882a593Smuzhiyun 		struct l2cap_chan_data data;
8029*4882a593Smuzhiyun 
8030*4882a593Smuzhiyun 		data.chan = chan;
8031*4882a593Smuzhiyun 		data.pid = chan->ops->get_peer_pid(chan);
8032*4882a593Smuzhiyun 		data.count = 1;
8033*4882a593Smuzhiyun 
8034*4882a593Smuzhiyun 		l2cap_chan_list(conn, l2cap_chan_by_pid, &data);
8035*4882a593Smuzhiyun 
8036*4882a593Smuzhiyun 		/* Check if there isn't too many channels being connected */
8037*4882a593Smuzhiyun 		if (data.count > L2CAP_ECRED_CONN_SCID_MAX) {
8038*4882a593Smuzhiyun 			hci_conn_drop(hcon);
8039*4882a593Smuzhiyun 			err = -EPROTO;
8040*4882a593Smuzhiyun 			goto done;
8041*4882a593Smuzhiyun 		}
8042*4882a593Smuzhiyun 	}
8043*4882a593Smuzhiyun 
8044*4882a593Smuzhiyun 	mutex_lock(&conn->chan_lock);
8045*4882a593Smuzhiyun 	l2cap_chan_lock(chan);
8046*4882a593Smuzhiyun 
8047*4882a593Smuzhiyun 	if (cid && __l2cap_get_chan_by_dcid(conn, cid)) {
8048*4882a593Smuzhiyun 		hci_conn_drop(hcon);
8049*4882a593Smuzhiyun 		err = -EBUSY;
8050*4882a593Smuzhiyun 		goto chan_unlock;
8051*4882a593Smuzhiyun 	}
8052*4882a593Smuzhiyun 
8053*4882a593Smuzhiyun 	/* Update source addr of the socket */
8054*4882a593Smuzhiyun 	bacpy(&chan->src, &hcon->src);
8055*4882a593Smuzhiyun 	chan->src_type = bdaddr_src_type(hcon);
8056*4882a593Smuzhiyun 
8057*4882a593Smuzhiyun 	__l2cap_chan_add(conn, chan);
8058*4882a593Smuzhiyun 
8059*4882a593Smuzhiyun 	/* l2cap_chan_add takes its own ref so we can drop this one */
8060*4882a593Smuzhiyun 	hci_conn_drop(hcon);
8061*4882a593Smuzhiyun 
8062*4882a593Smuzhiyun 	l2cap_state_change(chan, BT_CONNECT);
8063*4882a593Smuzhiyun 	__set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
8064*4882a593Smuzhiyun 
8065*4882a593Smuzhiyun 	/* Release chan->sport so that it can be reused by other
8066*4882a593Smuzhiyun 	 * sockets (as it's only used for listening sockets).
8067*4882a593Smuzhiyun 	 */
8068*4882a593Smuzhiyun 	write_lock(&chan_list_lock);
8069*4882a593Smuzhiyun 	chan->sport = 0;
8070*4882a593Smuzhiyun 	write_unlock(&chan_list_lock);
8071*4882a593Smuzhiyun 
8072*4882a593Smuzhiyun 	if (hcon->state == BT_CONNECTED) {
8073*4882a593Smuzhiyun 		if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
8074*4882a593Smuzhiyun 			__clear_chan_timer(chan);
8075*4882a593Smuzhiyun 			if (l2cap_chan_check_security(chan, true))
8076*4882a593Smuzhiyun 				l2cap_state_change(chan, BT_CONNECTED);
8077*4882a593Smuzhiyun 		} else
8078*4882a593Smuzhiyun 			l2cap_do_start(chan);
8079*4882a593Smuzhiyun 	}
8080*4882a593Smuzhiyun 
8081*4882a593Smuzhiyun 	err = 0;
8082*4882a593Smuzhiyun 
8083*4882a593Smuzhiyun chan_unlock:
8084*4882a593Smuzhiyun 	l2cap_chan_unlock(chan);
8085*4882a593Smuzhiyun 	mutex_unlock(&conn->chan_lock);
8086*4882a593Smuzhiyun done:
8087*4882a593Smuzhiyun 	hci_dev_unlock(hdev);
8088*4882a593Smuzhiyun 	hci_dev_put(hdev);
8089*4882a593Smuzhiyun 	return err;
8090*4882a593Smuzhiyun }
8091*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(l2cap_chan_connect);
8092*4882a593Smuzhiyun 
l2cap_ecred_reconfigure(struct l2cap_chan * chan)8093*4882a593Smuzhiyun static void l2cap_ecred_reconfigure(struct l2cap_chan *chan)
8094*4882a593Smuzhiyun {
8095*4882a593Smuzhiyun 	struct l2cap_conn *conn = chan->conn;
8096*4882a593Smuzhiyun 	struct {
8097*4882a593Smuzhiyun 		struct l2cap_ecred_reconf_req req;
8098*4882a593Smuzhiyun 		__le16 scid;
8099*4882a593Smuzhiyun 	} pdu;
8100*4882a593Smuzhiyun 
8101*4882a593Smuzhiyun 	pdu.req.mtu = cpu_to_le16(chan->imtu);
8102*4882a593Smuzhiyun 	pdu.req.mps = cpu_to_le16(chan->mps);
8103*4882a593Smuzhiyun 	pdu.scid    = cpu_to_le16(chan->scid);
8104*4882a593Smuzhiyun 
8105*4882a593Smuzhiyun 	chan->ident = l2cap_get_ident(conn);
8106*4882a593Smuzhiyun 
8107*4882a593Smuzhiyun 	l2cap_send_cmd(conn, chan->ident, L2CAP_ECRED_RECONF_REQ,
8108*4882a593Smuzhiyun 		       sizeof(pdu), &pdu);
8109*4882a593Smuzhiyun }
8110*4882a593Smuzhiyun 
l2cap_chan_reconfigure(struct l2cap_chan * chan,__u16 mtu)8111*4882a593Smuzhiyun int l2cap_chan_reconfigure(struct l2cap_chan *chan, __u16 mtu)
8112*4882a593Smuzhiyun {
8113*4882a593Smuzhiyun 	if (chan->imtu > mtu)
8114*4882a593Smuzhiyun 		return -EINVAL;
8115*4882a593Smuzhiyun 
8116*4882a593Smuzhiyun 	BT_DBG("chan %p mtu 0x%4.4x", chan, mtu);
8117*4882a593Smuzhiyun 
8118*4882a593Smuzhiyun 	chan->imtu = mtu;
8119*4882a593Smuzhiyun 
8120*4882a593Smuzhiyun 	l2cap_ecred_reconfigure(chan);
8121*4882a593Smuzhiyun 
8122*4882a593Smuzhiyun 	return 0;
8123*4882a593Smuzhiyun }
8124*4882a593Smuzhiyun 
8125*4882a593Smuzhiyun /* ---- L2CAP interface with lower layer (HCI) ---- */
8126*4882a593Smuzhiyun 
l2cap_connect_ind(struct hci_dev * hdev,bdaddr_t * bdaddr)8127*4882a593Smuzhiyun int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr)
8128*4882a593Smuzhiyun {
8129*4882a593Smuzhiyun 	int exact = 0, lm1 = 0, lm2 = 0;
8130*4882a593Smuzhiyun 	struct l2cap_chan *c;
8131*4882a593Smuzhiyun 
8132*4882a593Smuzhiyun 	BT_DBG("hdev %s, bdaddr %pMR", hdev->name, bdaddr);
8133*4882a593Smuzhiyun 
8134*4882a593Smuzhiyun 	/* Find listening sockets and check their link_mode */
8135*4882a593Smuzhiyun 	read_lock(&chan_list_lock);
8136*4882a593Smuzhiyun 	list_for_each_entry(c, &chan_list, global_l) {
8137*4882a593Smuzhiyun 		if (c->state != BT_LISTEN)
8138*4882a593Smuzhiyun 			continue;
8139*4882a593Smuzhiyun 
8140*4882a593Smuzhiyun 		if (!bacmp(&c->src, &hdev->bdaddr)) {
8141*4882a593Smuzhiyun 			lm1 |= HCI_LM_ACCEPT;
8142*4882a593Smuzhiyun 			if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
8143*4882a593Smuzhiyun 				lm1 |= HCI_LM_MASTER;
8144*4882a593Smuzhiyun 			exact++;
8145*4882a593Smuzhiyun 		} else if (!bacmp(&c->src, BDADDR_ANY)) {
8146*4882a593Smuzhiyun 			lm2 |= HCI_LM_ACCEPT;
8147*4882a593Smuzhiyun 			if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
8148*4882a593Smuzhiyun 				lm2 |= HCI_LM_MASTER;
8149*4882a593Smuzhiyun 		}
8150*4882a593Smuzhiyun 	}
8151*4882a593Smuzhiyun 	read_unlock(&chan_list_lock);
8152*4882a593Smuzhiyun 
8153*4882a593Smuzhiyun 	return exact ? lm1 : lm2;
8154*4882a593Smuzhiyun }
8155*4882a593Smuzhiyun 
8156*4882a593Smuzhiyun /* Find the next fixed channel in BT_LISTEN state, continue iteration
8157*4882a593Smuzhiyun  * from an existing channel in the list or from the beginning of the
8158*4882a593Smuzhiyun  * global list (by passing NULL as first parameter).
8159*4882a593Smuzhiyun  */
l2cap_global_fixed_chan(struct l2cap_chan * c,struct hci_conn * hcon)8160*4882a593Smuzhiyun static struct l2cap_chan *l2cap_global_fixed_chan(struct l2cap_chan *c,
8161*4882a593Smuzhiyun 						  struct hci_conn *hcon)
8162*4882a593Smuzhiyun {
8163*4882a593Smuzhiyun 	u8 src_type = bdaddr_src_type(hcon);
8164*4882a593Smuzhiyun 
8165*4882a593Smuzhiyun 	read_lock(&chan_list_lock);
8166*4882a593Smuzhiyun 
8167*4882a593Smuzhiyun 	if (c)
8168*4882a593Smuzhiyun 		c = list_next_entry(c, global_l);
8169*4882a593Smuzhiyun 	else
8170*4882a593Smuzhiyun 		c = list_entry(chan_list.next, typeof(*c), global_l);
8171*4882a593Smuzhiyun 
8172*4882a593Smuzhiyun 	list_for_each_entry_from(c, &chan_list, global_l) {
8173*4882a593Smuzhiyun 		if (c->chan_type != L2CAP_CHAN_FIXED)
8174*4882a593Smuzhiyun 			continue;
8175*4882a593Smuzhiyun 		if (c->state != BT_LISTEN)
8176*4882a593Smuzhiyun 			continue;
8177*4882a593Smuzhiyun 		if (bacmp(&c->src, &hcon->src) && bacmp(&c->src, BDADDR_ANY))
8178*4882a593Smuzhiyun 			continue;
8179*4882a593Smuzhiyun 		if (src_type != c->src_type)
8180*4882a593Smuzhiyun 			continue;
8181*4882a593Smuzhiyun 
8182*4882a593Smuzhiyun 		c = l2cap_chan_hold_unless_zero(c);
8183*4882a593Smuzhiyun 		read_unlock(&chan_list_lock);
8184*4882a593Smuzhiyun 		return c;
8185*4882a593Smuzhiyun 	}
8186*4882a593Smuzhiyun 
8187*4882a593Smuzhiyun 	read_unlock(&chan_list_lock);
8188*4882a593Smuzhiyun 
8189*4882a593Smuzhiyun 	return NULL;
8190*4882a593Smuzhiyun }
8191*4882a593Smuzhiyun 
l2cap_connect_cfm(struct hci_conn * hcon,u8 status)8192*4882a593Smuzhiyun static void l2cap_connect_cfm(struct hci_conn *hcon, u8 status)
8193*4882a593Smuzhiyun {
8194*4882a593Smuzhiyun 	struct hci_dev *hdev = hcon->hdev;
8195*4882a593Smuzhiyun 	struct l2cap_conn *conn;
8196*4882a593Smuzhiyun 	struct l2cap_chan *pchan;
8197*4882a593Smuzhiyun 	u8 dst_type;
8198*4882a593Smuzhiyun 
8199*4882a593Smuzhiyun 	if (hcon->type != ACL_LINK && hcon->type != LE_LINK)
8200*4882a593Smuzhiyun 		return;
8201*4882a593Smuzhiyun 
8202*4882a593Smuzhiyun 	BT_DBG("hcon %p bdaddr %pMR status %d", hcon, &hcon->dst, status);
8203*4882a593Smuzhiyun 
8204*4882a593Smuzhiyun 	if (status) {
8205*4882a593Smuzhiyun 		l2cap_conn_del(hcon, bt_to_errno(status));
8206*4882a593Smuzhiyun 		return;
8207*4882a593Smuzhiyun 	}
8208*4882a593Smuzhiyun 
8209*4882a593Smuzhiyun 	conn = l2cap_conn_add(hcon);
8210*4882a593Smuzhiyun 	if (!conn)
8211*4882a593Smuzhiyun 		return;
8212*4882a593Smuzhiyun 
8213*4882a593Smuzhiyun 	dst_type = bdaddr_dst_type(hcon);
8214*4882a593Smuzhiyun 
8215*4882a593Smuzhiyun 	/* If device is blocked, do not create channels for it */
8216*4882a593Smuzhiyun 	if (hci_bdaddr_list_lookup(&hdev->blacklist, &hcon->dst, dst_type))
8217*4882a593Smuzhiyun 		return;
8218*4882a593Smuzhiyun 
8219*4882a593Smuzhiyun 	/* Find fixed channels and notify them of the new connection. We
8220*4882a593Smuzhiyun 	 * use multiple individual lookups, continuing each time where
8221*4882a593Smuzhiyun 	 * we left off, because the list lock would prevent calling the
8222*4882a593Smuzhiyun 	 * potentially sleeping l2cap_chan_lock() function.
8223*4882a593Smuzhiyun 	 */
8224*4882a593Smuzhiyun 	pchan = l2cap_global_fixed_chan(NULL, hcon);
8225*4882a593Smuzhiyun 	while (pchan) {
8226*4882a593Smuzhiyun 		struct l2cap_chan *chan, *next;
8227*4882a593Smuzhiyun 
8228*4882a593Smuzhiyun 		/* Client fixed channels should override server ones */
8229*4882a593Smuzhiyun 		if (__l2cap_get_chan_by_dcid(conn, pchan->scid))
8230*4882a593Smuzhiyun 			goto next;
8231*4882a593Smuzhiyun 
8232*4882a593Smuzhiyun 		l2cap_chan_lock(pchan);
8233*4882a593Smuzhiyun 		chan = pchan->ops->new_connection(pchan);
8234*4882a593Smuzhiyun 		if (chan) {
8235*4882a593Smuzhiyun 			bacpy(&chan->src, &hcon->src);
8236*4882a593Smuzhiyun 			bacpy(&chan->dst, &hcon->dst);
8237*4882a593Smuzhiyun 			chan->src_type = bdaddr_src_type(hcon);
8238*4882a593Smuzhiyun 			chan->dst_type = dst_type;
8239*4882a593Smuzhiyun 
8240*4882a593Smuzhiyun 			__l2cap_chan_add(conn, chan);
8241*4882a593Smuzhiyun 		}
8242*4882a593Smuzhiyun 
8243*4882a593Smuzhiyun 		l2cap_chan_unlock(pchan);
8244*4882a593Smuzhiyun next:
8245*4882a593Smuzhiyun 		next = l2cap_global_fixed_chan(pchan, hcon);
8246*4882a593Smuzhiyun 		l2cap_chan_put(pchan);
8247*4882a593Smuzhiyun 		pchan = next;
8248*4882a593Smuzhiyun 	}
8249*4882a593Smuzhiyun 
8250*4882a593Smuzhiyun 	l2cap_conn_ready(conn);
8251*4882a593Smuzhiyun }
8252*4882a593Smuzhiyun 
l2cap_disconn_ind(struct hci_conn * hcon)8253*4882a593Smuzhiyun int l2cap_disconn_ind(struct hci_conn *hcon)
8254*4882a593Smuzhiyun {
8255*4882a593Smuzhiyun 	struct l2cap_conn *conn = hcon->l2cap_data;
8256*4882a593Smuzhiyun 
8257*4882a593Smuzhiyun 	BT_DBG("hcon %p", hcon);
8258*4882a593Smuzhiyun 
8259*4882a593Smuzhiyun 	if (!conn)
8260*4882a593Smuzhiyun 		return HCI_ERROR_REMOTE_USER_TERM;
8261*4882a593Smuzhiyun 	return conn->disc_reason;
8262*4882a593Smuzhiyun }
8263*4882a593Smuzhiyun 
l2cap_disconn_cfm(struct hci_conn * hcon,u8 reason)8264*4882a593Smuzhiyun static void l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason)
8265*4882a593Smuzhiyun {
8266*4882a593Smuzhiyun 	if (hcon->type != ACL_LINK && hcon->type != LE_LINK)
8267*4882a593Smuzhiyun 		return;
8268*4882a593Smuzhiyun 
8269*4882a593Smuzhiyun 	BT_DBG("hcon %p reason %d", hcon, reason);
8270*4882a593Smuzhiyun 
8271*4882a593Smuzhiyun 	l2cap_conn_del(hcon, bt_to_errno(reason));
8272*4882a593Smuzhiyun }
8273*4882a593Smuzhiyun 
l2cap_check_encryption(struct l2cap_chan * chan,u8 encrypt)8274*4882a593Smuzhiyun static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt)
8275*4882a593Smuzhiyun {
8276*4882a593Smuzhiyun 	if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED)
8277*4882a593Smuzhiyun 		return;
8278*4882a593Smuzhiyun 
8279*4882a593Smuzhiyun 	if (encrypt == 0x00) {
8280*4882a593Smuzhiyun 		if (chan->sec_level == BT_SECURITY_MEDIUM) {
8281*4882a593Smuzhiyun 			__set_chan_timer(chan, L2CAP_ENC_TIMEOUT);
8282*4882a593Smuzhiyun 		} else if (chan->sec_level == BT_SECURITY_HIGH ||
8283*4882a593Smuzhiyun 			   chan->sec_level == BT_SECURITY_FIPS)
8284*4882a593Smuzhiyun 			l2cap_chan_close(chan, ECONNREFUSED);
8285*4882a593Smuzhiyun 	} else {
8286*4882a593Smuzhiyun 		if (chan->sec_level == BT_SECURITY_MEDIUM)
8287*4882a593Smuzhiyun 			__clear_chan_timer(chan);
8288*4882a593Smuzhiyun 	}
8289*4882a593Smuzhiyun }
8290*4882a593Smuzhiyun 
l2cap_security_cfm(struct hci_conn * hcon,u8 status,u8 encrypt)8291*4882a593Smuzhiyun static void l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
8292*4882a593Smuzhiyun {
8293*4882a593Smuzhiyun 	struct l2cap_conn *conn = hcon->l2cap_data;
8294*4882a593Smuzhiyun 	struct l2cap_chan *chan;
8295*4882a593Smuzhiyun 
8296*4882a593Smuzhiyun 	if (!conn)
8297*4882a593Smuzhiyun 		return;
8298*4882a593Smuzhiyun 
8299*4882a593Smuzhiyun 	BT_DBG("conn %p status 0x%2.2x encrypt %u", conn, status, encrypt);
8300*4882a593Smuzhiyun 
8301*4882a593Smuzhiyun 	mutex_lock(&conn->chan_lock);
8302*4882a593Smuzhiyun 
8303*4882a593Smuzhiyun 	list_for_each_entry(chan, &conn->chan_l, list) {
8304*4882a593Smuzhiyun 		l2cap_chan_lock(chan);
8305*4882a593Smuzhiyun 
8306*4882a593Smuzhiyun 		BT_DBG("chan %p scid 0x%4.4x state %s", chan, chan->scid,
8307*4882a593Smuzhiyun 		       state_to_string(chan->state));
8308*4882a593Smuzhiyun 
8309*4882a593Smuzhiyun 		if (chan->scid == L2CAP_CID_A2MP) {
8310*4882a593Smuzhiyun 			l2cap_chan_unlock(chan);
8311*4882a593Smuzhiyun 			continue;
8312*4882a593Smuzhiyun 		}
8313*4882a593Smuzhiyun 
8314*4882a593Smuzhiyun 		if (!status && encrypt)
8315*4882a593Smuzhiyun 			chan->sec_level = hcon->sec_level;
8316*4882a593Smuzhiyun 
8317*4882a593Smuzhiyun 		if (!__l2cap_no_conn_pending(chan)) {
8318*4882a593Smuzhiyun 			l2cap_chan_unlock(chan);
8319*4882a593Smuzhiyun 			continue;
8320*4882a593Smuzhiyun 		}
8321*4882a593Smuzhiyun 
8322*4882a593Smuzhiyun 		if (!status && (chan->state == BT_CONNECTED ||
8323*4882a593Smuzhiyun 				chan->state == BT_CONFIG)) {
8324*4882a593Smuzhiyun 			chan->ops->resume(chan);
8325*4882a593Smuzhiyun 			l2cap_check_encryption(chan, encrypt);
8326*4882a593Smuzhiyun 			l2cap_chan_unlock(chan);
8327*4882a593Smuzhiyun 			continue;
8328*4882a593Smuzhiyun 		}
8329*4882a593Smuzhiyun 
8330*4882a593Smuzhiyun 		if (chan->state == BT_CONNECT) {
8331*4882a593Smuzhiyun 			if (!status && l2cap_check_enc_key_size(hcon))
8332*4882a593Smuzhiyun 				l2cap_start_connection(chan);
8333*4882a593Smuzhiyun 			else
8334*4882a593Smuzhiyun 				__set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
8335*4882a593Smuzhiyun 		} else if (chan->state == BT_CONNECT2 &&
8336*4882a593Smuzhiyun 			   !(chan->mode == L2CAP_MODE_EXT_FLOWCTL ||
8337*4882a593Smuzhiyun 			     chan->mode == L2CAP_MODE_LE_FLOWCTL)) {
8338*4882a593Smuzhiyun 			struct l2cap_conn_rsp rsp;
8339*4882a593Smuzhiyun 			__u16 res, stat;
8340*4882a593Smuzhiyun 
8341*4882a593Smuzhiyun 			if (!status && l2cap_check_enc_key_size(hcon)) {
8342*4882a593Smuzhiyun 				if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
8343*4882a593Smuzhiyun 					res = L2CAP_CR_PEND;
8344*4882a593Smuzhiyun 					stat = L2CAP_CS_AUTHOR_PEND;
8345*4882a593Smuzhiyun 					chan->ops->defer(chan);
8346*4882a593Smuzhiyun 				} else {
8347*4882a593Smuzhiyun 					l2cap_state_change(chan, BT_CONFIG);
8348*4882a593Smuzhiyun 					res = L2CAP_CR_SUCCESS;
8349*4882a593Smuzhiyun 					stat = L2CAP_CS_NO_INFO;
8350*4882a593Smuzhiyun 				}
8351*4882a593Smuzhiyun 			} else {
8352*4882a593Smuzhiyun 				l2cap_state_change(chan, BT_DISCONN);
8353*4882a593Smuzhiyun 				__set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
8354*4882a593Smuzhiyun 				res = L2CAP_CR_SEC_BLOCK;
8355*4882a593Smuzhiyun 				stat = L2CAP_CS_NO_INFO;
8356*4882a593Smuzhiyun 			}
8357*4882a593Smuzhiyun 
8358*4882a593Smuzhiyun 			rsp.scid   = cpu_to_le16(chan->dcid);
8359*4882a593Smuzhiyun 			rsp.dcid   = cpu_to_le16(chan->scid);
8360*4882a593Smuzhiyun 			rsp.result = cpu_to_le16(res);
8361*4882a593Smuzhiyun 			rsp.status = cpu_to_le16(stat);
8362*4882a593Smuzhiyun 			l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
8363*4882a593Smuzhiyun 				       sizeof(rsp), &rsp);
8364*4882a593Smuzhiyun 
8365*4882a593Smuzhiyun 			if (!test_bit(CONF_REQ_SENT, &chan->conf_state) &&
8366*4882a593Smuzhiyun 			    res == L2CAP_CR_SUCCESS) {
8367*4882a593Smuzhiyun 				char buf[128];
8368*4882a593Smuzhiyun 				set_bit(CONF_REQ_SENT, &chan->conf_state);
8369*4882a593Smuzhiyun 				l2cap_send_cmd(conn, l2cap_get_ident(conn),
8370*4882a593Smuzhiyun 					       L2CAP_CONF_REQ,
8371*4882a593Smuzhiyun 					       l2cap_build_conf_req(chan, buf, sizeof(buf)),
8372*4882a593Smuzhiyun 					       buf);
8373*4882a593Smuzhiyun 				chan->num_conf_req++;
8374*4882a593Smuzhiyun 			}
8375*4882a593Smuzhiyun 		}
8376*4882a593Smuzhiyun 
8377*4882a593Smuzhiyun 		l2cap_chan_unlock(chan);
8378*4882a593Smuzhiyun 	}
8379*4882a593Smuzhiyun 
8380*4882a593Smuzhiyun 	mutex_unlock(&conn->chan_lock);
8381*4882a593Smuzhiyun }
8382*4882a593Smuzhiyun 
l2cap_recv_acldata(struct hci_conn * hcon,struct sk_buff * skb,u16 flags)8383*4882a593Smuzhiyun void l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)
8384*4882a593Smuzhiyun {
8385*4882a593Smuzhiyun 	struct l2cap_conn *conn = hcon->l2cap_data;
8386*4882a593Smuzhiyun 	struct l2cap_hdr *hdr;
8387*4882a593Smuzhiyun 	int len;
8388*4882a593Smuzhiyun 
8389*4882a593Smuzhiyun 	/* For AMP controller do not create l2cap conn */
8390*4882a593Smuzhiyun 	if (!conn && hcon->hdev->dev_type != HCI_PRIMARY)
8391*4882a593Smuzhiyun 		goto drop;
8392*4882a593Smuzhiyun 
8393*4882a593Smuzhiyun 	if (!conn)
8394*4882a593Smuzhiyun 		conn = l2cap_conn_add(hcon);
8395*4882a593Smuzhiyun 
8396*4882a593Smuzhiyun 	if (!conn)
8397*4882a593Smuzhiyun 		goto drop;
8398*4882a593Smuzhiyun 
8399*4882a593Smuzhiyun 	BT_DBG("conn %p len %d flags 0x%x", conn, skb->len, flags);
8400*4882a593Smuzhiyun 
8401*4882a593Smuzhiyun 	switch (flags) {
8402*4882a593Smuzhiyun 	case ACL_START:
8403*4882a593Smuzhiyun 	case ACL_START_NO_FLUSH:
8404*4882a593Smuzhiyun 	case ACL_COMPLETE:
8405*4882a593Smuzhiyun 		if (conn->rx_len) {
8406*4882a593Smuzhiyun 			BT_ERR("Unexpected start frame (len %d)", skb->len);
8407*4882a593Smuzhiyun 			kfree_skb(conn->rx_skb);
8408*4882a593Smuzhiyun 			conn->rx_skb = NULL;
8409*4882a593Smuzhiyun 			conn->rx_len = 0;
8410*4882a593Smuzhiyun 			l2cap_conn_unreliable(conn, ECOMM);
8411*4882a593Smuzhiyun 		}
8412*4882a593Smuzhiyun 
8413*4882a593Smuzhiyun 		/* Start fragment always begin with Basic L2CAP header */
8414*4882a593Smuzhiyun 		if (skb->len < L2CAP_HDR_SIZE) {
8415*4882a593Smuzhiyun 			BT_ERR("Frame is too short (len %d)", skb->len);
8416*4882a593Smuzhiyun 			l2cap_conn_unreliable(conn, ECOMM);
8417*4882a593Smuzhiyun 			goto drop;
8418*4882a593Smuzhiyun 		}
8419*4882a593Smuzhiyun 
8420*4882a593Smuzhiyun 		hdr = (struct l2cap_hdr *) skb->data;
8421*4882a593Smuzhiyun 		len = __le16_to_cpu(hdr->len) + L2CAP_HDR_SIZE;
8422*4882a593Smuzhiyun 
8423*4882a593Smuzhiyun 		if (len == skb->len) {
8424*4882a593Smuzhiyun 			/* Complete frame received */
8425*4882a593Smuzhiyun 			l2cap_recv_frame(conn, skb);
8426*4882a593Smuzhiyun 			return;
8427*4882a593Smuzhiyun 		}
8428*4882a593Smuzhiyun 
8429*4882a593Smuzhiyun 		BT_DBG("Start: total len %d, frag len %d", len, skb->len);
8430*4882a593Smuzhiyun 
8431*4882a593Smuzhiyun 		if (skb->len > len) {
8432*4882a593Smuzhiyun 			BT_ERR("Frame is too long (len %d, expected len %d)",
8433*4882a593Smuzhiyun 			       skb->len, len);
8434*4882a593Smuzhiyun 			l2cap_conn_unreliable(conn, ECOMM);
8435*4882a593Smuzhiyun 			goto drop;
8436*4882a593Smuzhiyun 		}
8437*4882a593Smuzhiyun 
8438*4882a593Smuzhiyun 		/* Allocate skb for the complete frame (with header) */
8439*4882a593Smuzhiyun 		conn->rx_skb = bt_skb_alloc(len, GFP_KERNEL);
8440*4882a593Smuzhiyun 		if (!conn->rx_skb)
8441*4882a593Smuzhiyun 			goto drop;
8442*4882a593Smuzhiyun 
8443*4882a593Smuzhiyun 		skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
8444*4882a593Smuzhiyun 					  skb->len);
8445*4882a593Smuzhiyun 		conn->rx_len = len - skb->len;
8446*4882a593Smuzhiyun 		break;
8447*4882a593Smuzhiyun 
8448*4882a593Smuzhiyun 	case ACL_CONT:
8449*4882a593Smuzhiyun 		BT_DBG("Cont: frag len %d (expecting %d)", skb->len, conn->rx_len);
8450*4882a593Smuzhiyun 
8451*4882a593Smuzhiyun 		if (!conn->rx_len) {
8452*4882a593Smuzhiyun 			BT_ERR("Unexpected continuation frame (len %d)", skb->len);
8453*4882a593Smuzhiyun 			l2cap_conn_unreliable(conn, ECOMM);
8454*4882a593Smuzhiyun 			goto drop;
8455*4882a593Smuzhiyun 		}
8456*4882a593Smuzhiyun 
8457*4882a593Smuzhiyun 		if (skb->len > conn->rx_len) {
8458*4882a593Smuzhiyun 			BT_ERR("Fragment is too long (len %d, expected %d)",
8459*4882a593Smuzhiyun 			       skb->len, conn->rx_len);
8460*4882a593Smuzhiyun 			kfree_skb(conn->rx_skb);
8461*4882a593Smuzhiyun 			conn->rx_skb = NULL;
8462*4882a593Smuzhiyun 			conn->rx_len = 0;
8463*4882a593Smuzhiyun 			l2cap_conn_unreliable(conn, ECOMM);
8464*4882a593Smuzhiyun 			goto drop;
8465*4882a593Smuzhiyun 		}
8466*4882a593Smuzhiyun 
8467*4882a593Smuzhiyun 		skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
8468*4882a593Smuzhiyun 					  skb->len);
8469*4882a593Smuzhiyun 		conn->rx_len -= skb->len;
8470*4882a593Smuzhiyun 
8471*4882a593Smuzhiyun 		if (!conn->rx_len) {
8472*4882a593Smuzhiyun 			/* Complete frame received. l2cap_recv_frame
8473*4882a593Smuzhiyun 			 * takes ownership of the skb so set the global
8474*4882a593Smuzhiyun 			 * rx_skb pointer to NULL first.
8475*4882a593Smuzhiyun 			 */
8476*4882a593Smuzhiyun 			struct sk_buff *rx_skb = conn->rx_skb;
8477*4882a593Smuzhiyun 			conn->rx_skb = NULL;
8478*4882a593Smuzhiyun 			l2cap_recv_frame(conn, rx_skb);
8479*4882a593Smuzhiyun 		}
8480*4882a593Smuzhiyun 		break;
8481*4882a593Smuzhiyun 	}
8482*4882a593Smuzhiyun 
8483*4882a593Smuzhiyun drop:
8484*4882a593Smuzhiyun 	kfree_skb(skb);
8485*4882a593Smuzhiyun }
8486*4882a593Smuzhiyun 
8487*4882a593Smuzhiyun static struct hci_cb l2cap_cb = {
8488*4882a593Smuzhiyun 	.name		= "L2CAP",
8489*4882a593Smuzhiyun 	.connect_cfm	= l2cap_connect_cfm,
8490*4882a593Smuzhiyun 	.disconn_cfm	= l2cap_disconn_cfm,
8491*4882a593Smuzhiyun 	.security_cfm	= l2cap_security_cfm,
8492*4882a593Smuzhiyun };
8493*4882a593Smuzhiyun 
l2cap_debugfs_show(struct seq_file * f,void * p)8494*4882a593Smuzhiyun static int l2cap_debugfs_show(struct seq_file *f, void *p)
8495*4882a593Smuzhiyun {
8496*4882a593Smuzhiyun 	struct l2cap_chan *c;
8497*4882a593Smuzhiyun 
8498*4882a593Smuzhiyun 	read_lock(&chan_list_lock);
8499*4882a593Smuzhiyun 
8500*4882a593Smuzhiyun 	list_for_each_entry(c, &chan_list, global_l) {
8501*4882a593Smuzhiyun 		seq_printf(f, "%pMR (%u) %pMR (%u) %d %d 0x%4.4x 0x%4.4x %d %d %d %d\n",
8502*4882a593Smuzhiyun 			   &c->src, c->src_type, &c->dst, c->dst_type,
8503*4882a593Smuzhiyun 			   c->state, __le16_to_cpu(c->psm),
8504*4882a593Smuzhiyun 			   c->scid, c->dcid, c->imtu, c->omtu,
8505*4882a593Smuzhiyun 			   c->sec_level, c->mode);
8506*4882a593Smuzhiyun 	}
8507*4882a593Smuzhiyun 
8508*4882a593Smuzhiyun 	read_unlock(&chan_list_lock);
8509*4882a593Smuzhiyun 
8510*4882a593Smuzhiyun 	return 0;
8511*4882a593Smuzhiyun }
8512*4882a593Smuzhiyun 
8513*4882a593Smuzhiyun DEFINE_SHOW_ATTRIBUTE(l2cap_debugfs);
8514*4882a593Smuzhiyun 
8515*4882a593Smuzhiyun static struct dentry *l2cap_debugfs;
8516*4882a593Smuzhiyun 
l2cap_init(void)8517*4882a593Smuzhiyun int __init l2cap_init(void)
8518*4882a593Smuzhiyun {
8519*4882a593Smuzhiyun 	int err;
8520*4882a593Smuzhiyun 
8521*4882a593Smuzhiyun 	err = l2cap_init_sockets();
8522*4882a593Smuzhiyun 	if (err < 0)
8523*4882a593Smuzhiyun 		return err;
8524*4882a593Smuzhiyun 
8525*4882a593Smuzhiyun 	hci_register_cb(&l2cap_cb);
8526*4882a593Smuzhiyun 
8527*4882a593Smuzhiyun 	if (IS_ERR_OR_NULL(bt_debugfs))
8528*4882a593Smuzhiyun 		return 0;
8529*4882a593Smuzhiyun 
8530*4882a593Smuzhiyun 	l2cap_debugfs = debugfs_create_file("l2cap", 0444, bt_debugfs,
8531*4882a593Smuzhiyun 					    NULL, &l2cap_debugfs_fops);
8532*4882a593Smuzhiyun 
8533*4882a593Smuzhiyun 	return 0;
8534*4882a593Smuzhiyun }
8535*4882a593Smuzhiyun 
l2cap_exit(void)8536*4882a593Smuzhiyun void l2cap_exit(void)
8537*4882a593Smuzhiyun {
8538*4882a593Smuzhiyun 	debugfs_remove(l2cap_debugfs);
8539*4882a593Smuzhiyun 	hci_unregister_cb(&l2cap_cb);
8540*4882a593Smuzhiyun 	l2cap_cleanup_sockets();
8541*4882a593Smuzhiyun }
8542*4882a593Smuzhiyun 
8543*4882a593Smuzhiyun module_param(disable_ertm, bool, 0644);
8544*4882a593Smuzhiyun MODULE_PARM_DESC(disable_ertm, "Disable enhanced retransmission mode");
8545*4882a593Smuzhiyun 
8546*4882a593Smuzhiyun module_param(enable_ecred, bool, 0644);
8547*4882a593Smuzhiyun MODULE_PARM_DESC(enable_ecred, "Enable enhanced credit flow control mode");
8548