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