blob: a78d1dd2f57be05863be5204a5d8b5bd9b416d15 [file] [log] [blame]
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 BlueZ - Bluetooth protocol stack for Linux
Ron Shaffer2d0a0342010-05-28 11:53:46 -04003 Copyright (c) 2000-2001, 2010, Code Aurora Forum. All rights reserved.
Linus Torvalds1da177e2005-04-16 15:20:36 -07004
5 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License version 2 as
9 published by the Free Software Foundation;
10
11 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
12 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
14 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090015 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
16 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
Linus Torvalds1da177e2005-04-16 15:20:36 -070018 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090020 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
Linus Torvalds1da177e2005-04-16 15:20:36 -070022 SOFTWARE IS DISCLAIMED.
23*/
24
25/* Bluetooth HCI event handling. */
26
Linus Torvalds1da177e2005-04-16 15:20:36 -070027#include <asm/unaligned.h>
28
29#include <net/bluetooth/bluetooth.h>
30#include <net/bluetooth/hci_core.h>
Mikel Astizf0d6a0e2012-08-09 09:52:30 +020031#include <net/bluetooth/mgmt.h>
Marcel Holtmann7ef9fbf2013-10-10 14:54:14 -070032
Johan Hedberg0857dd32014-12-19 13:40:20 +020033#include "hci_request.h"
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +010034#include "hci_debugfs.h"
Marcel Holtmann70247282013-10-10 14:54:15 -070035#include "a2mp.h"
Marcel Holtmann7ef9fbf2013-10-10 14:54:14 -070036#include "amp.h"
Johan Hedberg2ceba532014-06-16 19:25:16 +030037#include "smp.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070038
Marcel Holtmannaa5b0342015-01-27 16:04:33 -080039#define ZERO_KEY "\x00\x00\x00\x00\x00\x00\x00\x00" \
40 "\x00\x00\x00\x00\x00\x00\x00\x00"
41
Linus Torvalds1da177e2005-04-16 15:20:36 -070042/* Handle HCI Event packets */
43
Marcel Holtmanna9de9242007-10-20 13:33:56 +020044static void hci_cc_inquiry_cancel(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -070045{
Marcel Holtmanna9de9242007-10-20 13:33:56 +020046 __u8 status = *((__u8 *) skb->data);
Linus Torvalds1da177e2005-04-16 15:20:36 -070047
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030048 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -070049
Andre Guedes82f47852013-04-30 15:29:34 -030050 if (status)
Marcel Holtmanna9de9242007-10-20 13:33:56 +020051 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -070052
Andre Guedes89352e72011-11-04 14:16:53 -030053 clear_bit(HCI_INQUIRY, &hdev->flags);
Peter Zijlstra4e857c52014-03-17 18:06:10 +010054 smp_mb__after_atomic(); /* wake_up_bit advises about this barrier */
Andre Guedes3e13fa12013-03-27 20:04:56 -030055 wake_up_bit(&hdev->flags, HCI_INQUIRY);
Andre Guedes89352e72011-11-04 14:16:53 -030056
Johan Hedberg50143a42014-06-10 14:05:57 +030057 hci_dev_lock(hdev);
Jakub Pawlowski168b8a22015-10-16 10:07:49 +030058 /* Set discovery state to stopped if we're not doing LE active
59 * scanning.
60 */
61 if (!hci_dev_test_flag(hdev, HCI_LE_SCAN) ||
62 hdev->le_scan_type != LE_SCAN_ACTIVE)
63 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Johan Hedberg50143a42014-06-10 14:05:57 +030064 hci_dev_unlock(hdev);
65
Marcel Holtmanna9de9242007-10-20 13:33:56 +020066 hci_conn_check_pending(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -070067}
68
Andre Guedes4d934832012-03-21 00:03:35 -030069static void hci_cc_periodic_inq(struct hci_dev *hdev, struct sk_buff *skb)
70{
71 __u8 status = *((__u8 *) skb->data);
72
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030073 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedesae854a72012-03-21 00:03:36 -030074
75 if (status)
76 return;
77
Marcel Holtmanna1536da2015-03-13 02:11:01 -070078 hci_dev_set_flag(hdev, HCI_PERIODIC_INQ);
Andre Guedes4d934832012-03-21 00:03:35 -030079}
80
Marcel Holtmanna9de9242007-10-20 13:33:56 +020081static void hci_cc_exit_periodic_inq(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -070082{
Marcel Holtmanna9de9242007-10-20 13:33:56 +020083 __u8 status = *((__u8 *) skb->data);
84
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030085 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +020086
87 if (status)
88 return;
89
Marcel Holtmanna358dc12015-03-13 02:11:02 -070090 hci_dev_clear_flag(hdev, HCI_PERIODIC_INQ);
Andre Guedesae854a72012-03-21 00:03:36 -030091
Marcel Holtmanna9de9242007-10-20 13:33:56 +020092 hci_conn_check_pending(hdev);
93}
94
Gustavo Padovan807deac2012-05-17 00:36:24 -030095static void hci_cc_remote_name_req_cancel(struct hci_dev *hdev,
96 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +020097{
98 BT_DBG("%s", hdev->name);
99}
100
101static void hci_cc_role_discovery(struct hci_dev *hdev, struct sk_buff *skb)
102{
103 struct hci_rp_role_discovery *rp = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700104 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700105
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300106 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700107
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200108 if (rp->status)
109 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700110
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200111 hci_dev_lock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700112
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200113 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
Johan Hedberg40bef302014-07-16 11:42:27 +0300114 if (conn)
115 conn->role = rp->role;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200116
117 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700118}
119
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200120static void hci_cc_read_link_policy(struct hci_dev *hdev, struct sk_buff *skb)
121{
122 struct hci_rp_read_link_policy *rp = (void *) skb->data;
123 struct hci_conn *conn;
124
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300125 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200126
127 if (rp->status)
128 return;
129
130 hci_dev_lock(hdev);
131
132 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
133 if (conn)
134 conn->link_policy = __le16_to_cpu(rp->policy);
135
136 hci_dev_unlock(hdev);
137}
138
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200139static void hci_cc_write_link_policy(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700140{
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200141 struct hci_rp_write_link_policy *rp = (void *) skb->data;
142 struct hci_conn *conn;
143 void *sent;
144
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300145 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200146
147 if (rp->status)
148 return;
149
150 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LINK_POLICY);
151 if (!sent)
152 return;
153
154 hci_dev_lock(hdev);
155
156 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200157 if (conn)
Harvey Harrison83985312008-05-02 16:25:46 -0700158 conn->link_policy = get_unaligned_le16(sent + 2);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200159
160 hci_dev_unlock(hdev);
161}
162
Gustavo Padovan807deac2012-05-17 00:36:24 -0300163static void hci_cc_read_def_link_policy(struct hci_dev *hdev,
164 struct sk_buff *skb)
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200165{
166 struct hci_rp_read_def_link_policy *rp = (void *) skb->data;
167
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300168 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200169
170 if (rp->status)
171 return;
172
173 hdev->link_policy = __le16_to_cpu(rp->policy);
174}
175
Gustavo Padovan807deac2012-05-17 00:36:24 -0300176static void hci_cc_write_def_link_policy(struct hci_dev *hdev,
177 struct sk_buff *skb)
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200178{
179 __u8 status = *((__u8 *) skb->data);
180 void *sent;
181
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300182 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200183
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200184 if (status)
185 return;
186
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200187 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_DEF_LINK_POLICY);
188 if (!sent)
189 return;
190
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200191 hdev->link_policy = get_unaligned_le16(sent);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200192}
193
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200194static void hci_cc_reset(struct hci_dev *hdev, struct sk_buff *skb)
195{
196 __u8 status = *((__u8 *) skb->data);
197
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300198 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200199
Gustavo F. Padovan10572132011-03-16 15:36:29 -0300200 clear_bit(HCI_RESET, &hdev->flags);
201
Marcel Holtmann8761f9d2014-11-02 02:45:58 +0100202 if (status)
203 return;
204
Johan Hedberga297e972012-02-21 17:55:47 +0200205 /* Reset all non-persistent flags */
Marcel Holtmanneacb44d2015-03-13 09:04:17 -0700206 hci_dev_clear_volatile_flags(hdev);
Andre Guedes69775ff2012-02-23 16:50:05 +0200207
Johan Hedberg39c5d972015-01-28 19:56:01 +0200208 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
209
Johan Hedbergbbaf4442012-11-08 01:22:59 +0100210 hdev->inq_tx_power = HCI_TX_POWER_INVALID;
211 hdev->adv_tx_power = HCI_TX_POWER_INVALID;
Johan Hedberg3f0f5242012-11-08 01:23:00 +0100212
213 memset(hdev->adv_data, 0, sizeof(hdev->adv_data));
214 hdev->adv_data_len = 0;
Marcel Holtmannf8e808b2013-10-16 00:16:47 -0700215
216 memset(hdev->scan_rsp_data, 0, sizeof(hdev->scan_rsp_data));
217 hdev->scan_rsp_data_len = 0;
Marcel Holtmann06f5b772013-10-19 07:09:11 -0700218
Marcel Holtmann533553f2014-03-21 12:18:10 -0700219 hdev->le_scan_type = LE_SCAN_PASSIVE;
220
Marcel Holtmann06f5b772013-10-19 07:09:11 -0700221 hdev->ssp_debug_mode = 0;
Marcel Holtmanna4d55042014-10-29 23:37:53 +0100222
223 hci_bdaddr_list_clear(&hdev->le_white_list);
Ankit Navikcfdb0c22018-06-29 12:12:50 +0530224 hci_bdaddr_list_clear(&hdev->le_resolv_list);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200225}
226
Marcel Holtmannc2f0f972015-01-12 09:21:25 -0800227static void hci_cc_read_stored_link_key(struct hci_dev *hdev,
228 struct sk_buff *skb)
229{
230 struct hci_rp_read_stored_link_key *rp = (void *)skb->data;
231 struct hci_cp_read_stored_link_key *sent;
232
233 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
234
235 sent = hci_sent_cmd_data(hdev, HCI_OP_READ_STORED_LINK_KEY);
236 if (!sent)
237 return;
238
239 if (!rp->status && sent->read_all == 0x01) {
240 hdev->stored_max_keys = rp->max_keys;
241 hdev->stored_num_keys = rp->num_keys;
242 }
243}
244
Marcel Holtmanna93661202015-01-12 09:21:28 -0800245static void hci_cc_delete_stored_link_key(struct hci_dev *hdev,
246 struct sk_buff *skb)
247{
248 struct hci_rp_delete_stored_link_key *rp = (void *)skb->data;
249
250 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
251
252 if (rp->status)
253 return;
254
255 if (rp->num_keys <= hdev->stored_num_keys)
256 hdev->stored_num_keys -= rp->num_keys;
257 else
258 hdev->stored_num_keys = 0;
259}
260
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200261static void hci_cc_write_local_name(struct hci_dev *hdev, struct sk_buff *skb)
262{
263 __u8 status = *((__u8 *) skb->data);
264 void *sent;
265
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300266 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200267
268 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LOCAL_NAME);
269 if (!sent)
270 return;
271
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200272 hci_dev_lock(hdev);
273
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700274 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedbergf51d5b22012-02-22 18:17:32 +0200275 mgmt_set_local_name_complete(hdev, sent, status);
Johan Hedberg28cc7bd2012-02-22 21:06:55 +0200276 else if (!status)
277 memcpy(hdev->dev_name, sent, HCI_MAX_NAME_LENGTH);
Johan Hedbergf51d5b22012-02-22 18:17:32 +0200278
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200279 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200280}
281
282static void hci_cc_read_local_name(struct hci_dev *hdev, struct sk_buff *skb)
283{
284 struct hci_rp_read_local_name *rp = (void *) skb->data;
285
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300286 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200287
288 if (rp->status)
289 return;
290
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700291 if (hci_dev_test_flag(hdev, HCI_SETUP) ||
292 hci_dev_test_flag(hdev, HCI_CONFIG))
Johan Hedbergdb99b5f2012-02-22 20:14:22 +0200293 memcpy(hdev->dev_name, rp->name, HCI_MAX_NAME_LENGTH);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200294}
295
296static void hci_cc_write_auth_enable(struct hci_dev *hdev, struct sk_buff *skb)
297{
298 __u8 status = *((__u8 *) skb->data);
299 void *sent;
300
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300301 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200302
303 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_AUTH_ENABLE);
304 if (!sent)
305 return;
306
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530307 hci_dev_lock(hdev);
308
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200309 if (!status) {
310 __u8 param = *((__u8 *) sent);
311
312 if (param == AUTH_ENABLED)
313 set_bit(HCI_AUTH, &hdev->flags);
314 else
315 clear_bit(HCI_AUTH, &hdev->flags);
316 }
317
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700318 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg33ef95e2012-02-16 23:56:27 +0200319 mgmt_auth_enable_complete(hdev, status);
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530320
321 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200322}
323
324static void hci_cc_write_encrypt_mode(struct hci_dev *hdev, struct sk_buff *skb)
325{
326 __u8 status = *((__u8 *) skb->data);
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200327 __u8 param;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200328 void *sent;
329
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300330 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200331
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200332 if (status)
333 return;
334
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200335 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_ENCRYPT_MODE);
336 if (!sent)
337 return;
338
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200339 param = *((__u8 *) sent);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200340
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200341 if (param)
342 set_bit(HCI_ENCRYPT, &hdev->flags);
343 else
344 clear_bit(HCI_ENCRYPT, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200345}
346
347static void hci_cc_write_scan_enable(struct hci_dev *hdev, struct sk_buff *skb)
348{
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200349 __u8 status = *((__u8 *) skb->data);
350 __u8 param;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200351 void *sent;
352
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300353 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200354
355 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SCAN_ENABLE);
356 if (!sent)
357 return;
358
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200359 param = *((__u8 *) sent);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200360
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200361 hci_dev_lock(hdev);
362
Mikel Astizfa1bd912012-08-09 09:52:29 +0200363 if (status) {
Johan Hedberg2d7cee52011-11-07 22:16:03 +0200364 hdev->discov_timeout = 0;
365 goto done;
366 }
367
Johan Hedbergbc6d2d02014-07-10 12:09:08 +0300368 if (param & SCAN_INQUIRY)
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200369 set_bit(HCI_ISCAN, &hdev->flags);
Johan Hedbergbc6d2d02014-07-10 12:09:08 +0300370 else
371 clear_bit(HCI_ISCAN, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200372
Johan Hedberg031547d2014-07-10 12:09:06 +0300373 if (param & SCAN_PAGE)
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200374 set_bit(HCI_PSCAN, &hdev->flags);
Johan Hedbergbc6d2d02014-07-10 12:09:08 +0300375 else
Johan Hedberg204e3992014-07-28 15:45:31 +0300376 clear_bit(HCI_PSCAN, &hdev->flags);
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200377
378done:
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200379 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200380}
381
382static void hci_cc_read_class_of_dev(struct hci_dev *hdev, struct sk_buff *skb)
383{
384 struct hci_rp_read_class_of_dev *rp = (void *) skb->data;
385
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300386 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200387
388 if (rp->status)
389 return;
390
391 memcpy(hdev->dev_class, rp->dev_class, 3);
392
393 BT_DBG("%s class 0x%.2x%.2x%.2x", hdev->name,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300394 hdev->dev_class[2], hdev->dev_class[1], hdev->dev_class[0]);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200395}
396
397static void hci_cc_write_class_of_dev(struct hci_dev *hdev, struct sk_buff *skb)
398{
399 __u8 status = *((__u8 *) skb->data);
400 void *sent;
401
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300402 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200403
404 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_CLASS_OF_DEV);
405 if (!sent)
406 return;
407
Marcel Holtmann7f9a9032012-02-22 18:38:01 +0100408 hci_dev_lock(hdev);
409
410 if (status == 0)
411 memcpy(hdev->dev_class, sent, 3);
412
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700413 if (hci_dev_test_flag(hdev, HCI_MGMT))
Marcel Holtmann7f9a9032012-02-22 18:38:01 +0100414 mgmt_set_class_of_dev_complete(hdev, sent, status);
415
416 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200417}
418
419static void hci_cc_read_voice_setting(struct hci_dev *hdev, struct sk_buff *skb)
420{
421 struct hci_rp_read_voice_setting *rp = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700422 __u16 setting;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200423
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300424 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200425
426 if (rp->status)
427 return;
428
429 setting = __le16_to_cpu(rp->voice_setting);
430
Marcel Holtmannf383f272008-07-14 20:13:47 +0200431 if (hdev->voice_setting == setting)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200432 return;
433
434 hdev->voice_setting = setting;
435
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300436 BT_DBG("%s voice setting 0x%4.4x", hdev->name, setting);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200437
Gustavo F. Padovan3c547112011-12-14 22:58:44 -0200438 if (hdev->notify)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200439 hdev->notify(hdev, HCI_NOTIFY_VOICE_SETTING);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200440}
441
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300442static void hci_cc_write_voice_setting(struct hci_dev *hdev,
443 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200444{
445 __u8 status = *((__u8 *) skb->data);
Marcel Holtmannf383f272008-07-14 20:13:47 +0200446 __u16 setting;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700447 void *sent;
448
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300449 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700450
Marcel Holtmannf383f272008-07-14 20:13:47 +0200451 if (status)
452 return;
453
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200454 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_VOICE_SETTING);
455 if (!sent)
456 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700457
Marcel Holtmannf383f272008-07-14 20:13:47 +0200458 setting = get_unaligned_le16(sent);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700459
Marcel Holtmannf383f272008-07-14 20:13:47 +0200460 if (hdev->voice_setting == setting)
461 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700462
Marcel Holtmannf383f272008-07-14 20:13:47 +0200463 hdev->voice_setting = setting;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700464
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300465 BT_DBG("%s voice setting 0x%4.4x", hdev->name, setting);
Marcel Holtmannf383f272008-07-14 20:13:47 +0200466
Gustavo F. Padovan3c547112011-12-14 22:58:44 -0200467 if (hdev->notify)
Marcel Holtmannf383f272008-07-14 20:13:47 +0200468 hdev->notify(hdev, HCI_NOTIFY_VOICE_SETTING);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700469}
470
Marcel Holtmannb4cb9fb2013-10-14 13:56:16 -0700471static void hci_cc_read_num_supported_iac(struct hci_dev *hdev,
472 struct sk_buff *skb)
473{
474 struct hci_rp_read_num_supported_iac *rp = (void *) skb->data;
475
476 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
477
478 if (rp->status)
479 return;
480
481 hdev->num_iac = rp->num_iac;
482
483 BT_DBG("%s num iac %d", hdev->name, hdev->num_iac);
484}
485
Marcel Holtmann333140b2008-07-14 20:13:48 +0200486static void hci_cc_write_ssp_mode(struct hci_dev *hdev, struct sk_buff *skb)
487{
488 __u8 status = *((__u8 *) skb->data);
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300489 struct hci_cp_write_ssp_mode *sent;
Marcel Holtmann333140b2008-07-14 20:13:48 +0200490
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300491 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann333140b2008-07-14 20:13:48 +0200492
Marcel Holtmann333140b2008-07-14 20:13:48 +0200493 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SSP_MODE);
494 if (!sent)
495 return;
496
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530497 hci_dev_lock(hdev);
498
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300499 if (!status) {
500 if (sent->mode)
Johan Hedbergcad718e2013-04-17 15:00:51 +0300501 hdev->features[1][0] |= LMP_HOST_SSP;
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300502 else
Johan Hedbergcad718e2013-04-17 15:00:51 +0300503 hdev->features[1][0] &= ~LMP_HOST_SSP;
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300504 }
505
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700506 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300507 mgmt_ssp_enable_complete(hdev, sent->mode, status);
Johan Hedbergc0ecddc2012-02-22 12:38:31 +0200508 else if (!status) {
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300509 if (sent->mode)
Marcel Holtmanna1536da2015-03-13 02:11:01 -0700510 hci_dev_set_flag(hdev, HCI_SSP_ENABLED);
Johan Hedbergc0ecddc2012-02-22 12:38:31 +0200511 else
Marcel Holtmanna358dc12015-03-13 02:11:02 -0700512 hci_dev_clear_flag(hdev, HCI_SSP_ENABLED);
Johan Hedbergc0ecddc2012-02-22 12:38:31 +0200513 }
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530514
515 hci_dev_unlock(hdev);
Marcel Holtmann333140b2008-07-14 20:13:48 +0200516}
517
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800518static void hci_cc_write_sc_support(struct hci_dev *hdev, struct sk_buff *skb)
519{
520 u8 status = *((u8 *) skb->data);
521 struct hci_cp_write_sc_support *sent;
522
523 BT_DBG("%s status 0x%2.2x", hdev->name, status);
524
525 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SC_SUPPORT);
526 if (!sent)
527 return;
528
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530529 hci_dev_lock(hdev);
530
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800531 if (!status) {
532 if (sent->support)
533 hdev->features[1][0] |= LMP_HOST_SC;
534 else
535 hdev->features[1][0] &= ~LMP_HOST_SC;
536 }
537
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700538 if (!hci_dev_test_flag(hdev, HCI_MGMT) && !status) {
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800539 if (sent->support)
Marcel Holtmanna1536da2015-03-13 02:11:01 -0700540 hci_dev_set_flag(hdev, HCI_SC_ENABLED);
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800541 else
Marcel Holtmanna358dc12015-03-13 02:11:02 -0700542 hci_dev_clear_flag(hdev, HCI_SC_ENABLED);
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800543 }
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530544
545 hci_dev_unlock(hdev);
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800546}
547
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200548static void hci_cc_read_local_version(struct hci_dev *hdev, struct sk_buff *skb)
549{
550 struct hci_rp_read_local_version *rp = (void *) skb->data;
551
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300552 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200553
554 if (rp->status)
Johan Hedberg42c6b122013-03-05 20:37:49 +0200555 return;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200556
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700557 if (hci_dev_test_flag(hdev, HCI_SETUP) ||
558 hci_dev_test_flag(hdev, HCI_CONFIG)) {
Marcel Holtmann0d5551f2013-10-18 12:04:50 -0700559 hdev->hci_ver = rp->hci_ver;
560 hdev->hci_rev = __le16_to_cpu(rp->hci_rev);
561 hdev->lmp_ver = rp->lmp_ver;
562 hdev->manufacturer = __le16_to_cpu(rp->manufacturer);
563 hdev->lmp_subver = __le16_to_cpu(rp->lmp_subver);
564 }
Johan Hedbergd5859e22011-01-25 01:19:58 +0200565}
566
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300567static void hci_cc_read_local_commands(struct hci_dev *hdev,
568 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200569{
570 struct hci_rp_read_local_commands *rp = (void *) skb->data;
571
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300572 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200573
Marcel Holtmann6a070e62013-10-31 04:54:33 -0700574 if (rp->status)
575 return;
576
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700577 if (hci_dev_test_flag(hdev, HCI_SETUP) ||
578 hci_dev_test_flag(hdev, HCI_CONFIG))
Johan Hedberg2177bab2013-03-05 20:37:43 +0200579 memcpy(hdev->commands, rp->commands, sizeof(hdev->commands));
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200580}
581
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300582static void hci_cc_read_local_features(struct hci_dev *hdev,
583 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200584{
585 struct hci_rp_read_local_features *rp = (void *) skb->data;
586
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300587 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200588
589 if (rp->status)
590 return;
591
592 memcpy(hdev->features, rp->features, 8);
593
594 /* Adjust default settings according to features
595 * supported by device. */
596
Johan Hedbergcad718e2013-04-17 15:00:51 +0300597 if (hdev->features[0][0] & LMP_3SLOT)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200598 hdev->pkt_type |= (HCI_DM3 | HCI_DH3);
599
Johan Hedbergcad718e2013-04-17 15:00:51 +0300600 if (hdev->features[0][0] & LMP_5SLOT)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200601 hdev->pkt_type |= (HCI_DM5 | HCI_DH5);
602
Johan Hedbergcad718e2013-04-17 15:00:51 +0300603 if (hdev->features[0][1] & LMP_HV2) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200604 hdev->pkt_type |= (HCI_HV2);
605 hdev->esco_type |= (ESCO_HV2);
606 }
607
Johan Hedbergcad718e2013-04-17 15:00:51 +0300608 if (hdev->features[0][1] & LMP_HV3) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200609 hdev->pkt_type |= (HCI_HV3);
610 hdev->esco_type |= (ESCO_HV3);
611 }
612
Andre Guedes45db810f2012-07-24 15:03:49 -0300613 if (lmp_esco_capable(hdev))
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200614 hdev->esco_type |= (ESCO_EV3);
615
Johan Hedbergcad718e2013-04-17 15:00:51 +0300616 if (hdev->features[0][4] & LMP_EV4)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200617 hdev->esco_type |= (ESCO_EV4);
618
Johan Hedbergcad718e2013-04-17 15:00:51 +0300619 if (hdev->features[0][4] & LMP_EV5)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200620 hdev->esco_type |= (ESCO_EV5);
621
Johan Hedbergcad718e2013-04-17 15:00:51 +0300622 if (hdev->features[0][5] & LMP_EDR_ESCO_2M)
Marcel Holtmannefc76882009-02-06 09:13:37 +0100623 hdev->esco_type |= (ESCO_2EV3);
624
Johan Hedbergcad718e2013-04-17 15:00:51 +0300625 if (hdev->features[0][5] & LMP_EDR_ESCO_3M)
Marcel Holtmannefc76882009-02-06 09:13:37 +0100626 hdev->esco_type |= (ESCO_3EV3);
627
Johan Hedbergcad718e2013-04-17 15:00:51 +0300628 if (hdev->features[0][5] & LMP_EDR_3S_ESCO)
Marcel Holtmannefc76882009-02-06 09:13:37 +0100629 hdev->esco_type |= (ESCO_2EV5 | ESCO_3EV5);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200630}
631
Andre Guedes971e3a42011-06-30 19:20:52 -0300632static void hci_cc_read_local_ext_features(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300633 struct sk_buff *skb)
Andre Guedes971e3a42011-06-30 19:20:52 -0300634{
635 struct hci_rp_read_local_ext_features *rp = (void *) skb->data;
636
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300637 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andre Guedes971e3a42011-06-30 19:20:52 -0300638
639 if (rp->status)
Johan Hedberg42c6b122013-03-05 20:37:49 +0200640 return;
Andre Guedes971e3a42011-06-30 19:20:52 -0300641
Marcel Holtmann57af75a2013-10-18 12:04:47 -0700642 if (hdev->max_page < rp->max_page)
643 hdev->max_page = rp->max_page;
Johan Hedbergd2c5d772013-04-17 15:00:52 +0300644
Johan Hedbergcad718e2013-04-17 15:00:51 +0300645 if (rp->page < HCI_MAX_PAGES)
646 memcpy(hdev->features[rp->page], rp->features, 8);
Andre Guedes971e3a42011-06-30 19:20:52 -0300647}
648
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200649static void hci_cc_read_flow_control_mode(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300650 struct sk_buff *skb)
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200651{
652 struct hci_rp_read_flow_control_mode *rp = (void *) skb->data;
653
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300654 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200655
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200656 if (rp->status)
657 return;
658
659 hdev->flow_ctl_mode = rp->mode;
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200660}
661
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200662static void hci_cc_read_buffer_size(struct hci_dev *hdev, struct sk_buff *skb)
663{
664 struct hci_rp_read_buffer_size *rp = (void *) skb->data;
665
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300666 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200667
668 if (rp->status)
669 return;
670
671 hdev->acl_mtu = __le16_to_cpu(rp->acl_mtu);
672 hdev->sco_mtu = rp->sco_mtu;
673 hdev->acl_pkts = __le16_to_cpu(rp->acl_max_pkt);
674 hdev->sco_pkts = __le16_to_cpu(rp->sco_max_pkt);
675
676 if (test_bit(HCI_QUIRK_FIXUP_BUFFER_SIZE, &hdev->quirks)) {
677 hdev->sco_mtu = 64;
678 hdev->sco_pkts = 8;
679 }
680
681 hdev->acl_cnt = hdev->acl_pkts;
682 hdev->sco_cnt = hdev->sco_pkts;
683
Gustavo Padovan807deac2012-05-17 00:36:24 -0300684 BT_DBG("%s acl mtu %d:%d sco mtu %d:%d", hdev->name, hdev->acl_mtu,
685 hdev->acl_pkts, hdev->sco_mtu, hdev->sco_pkts);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200686}
687
688static void hci_cc_read_bd_addr(struct hci_dev *hdev, struct sk_buff *skb)
689{
690 struct hci_rp_read_bd_addr *rp = (void *) skb->data;
691
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300692 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200693
Marcel Holtmanne30d3f52014-07-05 10:48:03 +0200694 if (rp->status)
695 return;
696
697 if (test_bit(HCI_INIT, &hdev->flags))
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200698 bacpy(&hdev->bdaddr, &rp->bdaddr);
Marcel Holtmanne30d3f52014-07-05 10:48:03 +0200699
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700700 if (hci_dev_test_flag(hdev, HCI_SETUP))
Marcel Holtmanne30d3f52014-07-05 10:48:03 +0200701 bacpy(&hdev->setup_addr, &rp->bdaddr);
Johan Hedberg23bb5762010-12-21 23:01:27 +0200702}
703
Johan Hedbergf332ec62013-03-15 17:07:11 -0500704static void hci_cc_read_page_scan_activity(struct hci_dev *hdev,
705 struct sk_buff *skb)
706{
707 struct hci_rp_read_page_scan_activity *rp = (void *) skb->data;
708
709 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
710
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200711 if (rp->status)
712 return;
713
714 if (test_bit(HCI_INIT, &hdev->flags)) {
Johan Hedbergf332ec62013-03-15 17:07:11 -0500715 hdev->page_scan_interval = __le16_to_cpu(rp->interval);
716 hdev->page_scan_window = __le16_to_cpu(rp->window);
717 }
718}
719
Johan Hedberg4a3ee762013-03-15 17:07:12 -0500720static void hci_cc_write_page_scan_activity(struct hci_dev *hdev,
721 struct sk_buff *skb)
722{
723 u8 status = *((u8 *) skb->data);
724 struct hci_cp_write_page_scan_activity *sent;
725
726 BT_DBG("%s status 0x%2.2x", hdev->name, status);
727
728 if (status)
729 return;
730
731 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY);
732 if (!sent)
733 return;
734
735 hdev->page_scan_interval = __le16_to_cpu(sent->interval);
736 hdev->page_scan_window = __le16_to_cpu(sent->window);
737}
738
Johan Hedbergf332ec62013-03-15 17:07:11 -0500739static void hci_cc_read_page_scan_type(struct hci_dev *hdev,
740 struct sk_buff *skb)
741{
742 struct hci_rp_read_page_scan_type *rp = (void *) skb->data;
743
744 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
745
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200746 if (rp->status)
747 return;
748
749 if (test_bit(HCI_INIT, &hdev->flags))
Johan Hedbergf332ec62013-03-15 17:07:11 -0500750 hdev->page_scan_type = rp->type;
751}
752
Johan Hedberg4a3ee762013-03-15 17:07:12 -0500753static void hci_cc_write_page_scan_type(struct hci_dev *hdev,
754 struct sk_buff *skb)
755{
756 u8 status = *((u8 *) skb->data);
757 u8 *type;
758
759 BT_DBG("%s status 0x%2.2x", hdev->name, status);
760
761 if (status)
762 return;
763
764 type = hci_sent_cmd_data(hdev, HCI_OP_WRITE_PAGE_SCAN_TYPE);
765 if (type)
766 hdev->page_scan_type = *type;
767}
768
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200769static void hci_cc_read_data_block_size(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300770 struct sk_buff *skb)
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200771{
772 struct hci_rp_read_data_block_size *rp = (void *) skb->data;
773
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300774 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200775
776 if (rp->status)
777 return;
778
779 hdev->block_mtu = __le16_to_cpu(rp->max_acl_len);
780 hdev->block_len = __le16_to_cpu(rp->block_len);
781 hdev->num_blocks = __le16_to_cpu(rp->num_blocks);
782
783 hdev->block_cnt = hdev->num_blocks;
784
785 BT_DBG("%s blk mtu %d cnt %d len %d", hdev->name, hdev->block_mtu,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300786 hdev->block_cnt, hdev->block_len);
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200787}
788
Johan Hedberg33f35722014-06-28 17:54:06 +0300789static void hci_cc_read_clock(struct hci_dev *hdev, struct sk_buff *skb)
790{
791 struct hci_rp_read_clock *rp = (void *) skb->data;
792 struct hci_cp_read_clock *cp;
793 struct hci_conn *conn;
794
795 BT_DBG("%s", hdev->name);
796
797 if (skb->len < sizeof(*rp))
798 return;
799
800 if (rp->status)
801 return;
802
803 hci_dev_lock(hdev);
804
805 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_CLOCK);
806 if (!cp)
807 goto unlock;
808
809 if (cp->which == 0x00) {
810 hdev->clock = le32_to_cpu(rp->clock);
811 goto unlock;
812 }
813
814 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
815 if (conn) {
816 conn->clock = le32_to_cpu(rp->clock);
817 conn->clock_accuracy = le16_to_cpu(rp->accuracy);
818 }
819
820unlock:
821 hci_dev_unlock(hdev);
822}
823
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300824static void hci_cc_read_local_amp_info(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300825 struct sk_buff *skb)
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300826{
827 struct hci_rp_read_local_amp_info *rp = (void *) skb->data;
828
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300829 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300830
831 if (rp->status)
Arron Wang83927882015-07-24 17:10:16 +0800832 return;
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300833
834 hdev->amp_status = rp->amp_status;
835 hdev->amp_total_bw = __le32_to_cpu(rp->total_bw);
836 hdev->amp_max_bw = __le32_to_cpu(rp->max_bw);
837 hdev->amp_min_latency = __le32_to_cpu(rp->min_latency);
838 hdev->amp_max_pdu = __le32_to_cpu(rp->max_pdu);
839 hdev->amp_type = rp->amp_type;
840 hdev->amp_pal_cap = __le16_to_cpu(rp->pal_cap);
841 hdev->amp_assoc_size = __le16_to_cpu(rp->max_assoc_size);
842 hdev->amp_be_flush_to = __le32_to_cpu(rp->be_flush_to);
843 hdev->amp_max_flush_to = __le32_to_cpu(rp->max_flush_to);
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300844}
845
Johan Hedbergd5859e22011-01-25 01:19:58 +0200846static void hci_cc_read_inq_rsp_tx_power(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300847 struct sk_buff *skb)
Johan Hedbergd5859e22011-01-25 01:19:58 +0200848{
Marcel Holtmann91c4e9b2012-03-11 19:27:21 -0700849 struct hci_rp_read_inq_rsp_tx_power *rp = (void *) skb->data;
Johan Hedbergd5859e22011-01-25 01:19:58 +0200850
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300851 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedbergd5859e22011-01-25 01:19:58 +0200852
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200853 if (rp->status)
854 return;
855
856 hdev->inq_tx_power = rp->tx_power;
Johan Hedbergd5859e22011-01-25 01:19:58 +0200857}
858
Johan Hedberg980e1a52011-01-22 06:10:07 +0200859static void hci_cc_pin_code_reply(struct hci_dev *hdev, struct sk_buff *skb)
860{
861 struct hci_rp_pin_code_reply *rp = (void *) skb->data;
862 struct hci_cp_pin_code_reply *cp;
863 struct hci_conn *conn;
864
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300865 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200866
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200867 hci_dev_lock(hdev);
868
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700869 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg744cf192011-11-08 20:40:14 +0200870 mgmt_pin_code_reply_complete(hdev, &rp->bdaddr, rp->status);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200871
Mikel Astizfa1bd912012-08-09 09:52:29 +0200872 if (rp->status)
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200873 goto unlock;
Johan Hedberg980e1a52011-01-22 06:10:07 +0200874
875 cp = hci_sent_cmd_data(hdev, HCI_OP_PIN_CODE_REPLY);
876 if (!cp)
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200877 goto unlock;
Johan Hedberg980e1a52011-01-22 06:10:07 +0200878
879 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
880 if (conn)
881 conn->pin_length = cp->pin_len;
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200882
883unlock:
884 hci_dev_unlock(hdev);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200885}
886
887static void hci_cc_pin_code_neg_reply(struct hci_dev *hdev, struct sk_buff *skb)
888{
889 struct hci_rp_pin_code_neg_reply *rp = (void *) skb->data;
890
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300891 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200892
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200893 hci_dev_lock(hdev);
894
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700895 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg744cf192011-11-08 20:40:14 +0200896 mgmt_pin_code_neg_reply_complete(hdev, &rp->bdaddr,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300897 rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200898
899 hci_dev_unlock(hdev);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200900}
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200901
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300902static void hci_cc_le_read_buffer_size(struct hci_dev *hdev,
903 struct sk_buff *skb)
904{
905 struct hci_rp_le_read_buffer_size *rp = (void *) skb->data;
906
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300907 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300908
909 if (rp->status)
910 return;
911
912 hdev->le_mtu = __le16_to_cpu(rp->le_mtu);
913 hdev->le_pkts = rp->le_max_pkt;
914
915 hdev->le_cnt = hdev->le_pkts;
916
917 BT_DBG("%s le mtu %d:%d", hdev->name, hdev->le_mtu, hdev->le_pkts);
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300918}
Johan Hedberg980e1a52011-01-22 06:10:07 +0200919
Johan Hedberg60e77322013-01-22 14:01:59 +0200920static void hci_cc_le_read_local_features(struct hci_dev *hdev,
921 struct sk_buff *skb)
922{
923 struct hci_rp_le_read_local_features *rp = (void *) skb->data;
924
925 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
926
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200927 if (rp->status)
928 return;
929
930 memcpy(hdev->le_features, rp->features, 8);
Johan Hedberg60e77322013-01-22 14:01:59 +0200931}
932
Johan Hedberg8fa19092012-10-19 20:57:49 +0300933static void hci_cc_le_read_adv_tx_power(struct hci_dev *hdev,
934 struct sk_buff *skb)
935{
936 struct hci_rp_le_read_adv_tx_power *rp = (void *) skb->data;
937
938 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
939
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200940 if (rp->status)
941 return;
942
943 hdev->adv_tx_power = rp->tx_power;
Johan Hedberg8fa19092012-10-19 20:57:49 +0300944}
945
Johan Hedberga5c29682011-02-19 12:05:57 -0300946static void hci_cc_user_confirm_reply(struct hci_dev *hdev, struct sk_buff *skb)
947{
948 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
949
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300950 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberga5c29682011-02-19 12:05:57 -0300951
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200952 hci_dev_lock(hdev);
953
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700954 if (hci_dev_test_flag(hdev, HCI_MGMT))
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300955 mgmt_user_confirm_reply_complete(hdev, &rp->bdaddr, ACL_LINK, 0,
956 rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200957
958 hci_dev_unlock(hdev);
Johan Hedberga5c29682011-02-19 12:05:57 -0300959}
960
961static void hci_cc_user_confirm_neg_reply(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300962 struct sk_buff *skb)
Johan Hedberga5c29682011-02-19 12:05:57 -0300963{
964 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
965
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300966 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberga5c29682011-02-19 12:05:57 -0300967
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200968 hci_dev_lock(hdev);
969
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700970 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg744cf192011-11-08 20:40:14 +0200971 mgmt_user_confirm_neg_reply_complete(hdev, &rp->bdaddr,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300972 ACL_LINK, 0, rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200973
974 hci_dev_unlock(hdev);
Johan Hedberga5c29682011-02-19 12:05:57 -0300975}
976
Brian Gix1143d452011-11-23 08:28:34 -0800977static void hci_cc_user_passkey_reply(struct hci_dev *hdev, struct sk_buff *skb)
978{
979 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
980
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300981 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -0800982
983 hci_dev_lock(hdev);
984
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700985 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg272d90d2012-02-09 15:26:12 +0200986 mgmt_user_passkey_reply_complete(hdev, &rp->bdaddr, ACL_LINK,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300987 0, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -0800988
989 hci_dev_unlock(hdev);
990}
991
992static void hci_cc_user_passkey_neg_reply(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300993 struct sk_buff *skb)
Brian Gix1143d452011-11-23 08:28:34 -0800994{
995 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
996
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300997 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -0800998
999 hci_dev_lock(hdev);
1000
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001001 if (hci_dev_test_flag(hdev, HCI_MGMT))
Brian Gix1143d452011-11-23 08:28:34 -08001002 mgmt_user_passkey_neg_reply_complete(hdev, &rp->bdaddr,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001003 ACL_LINK, 0, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -08001004
1005 hci_dev_unlock(hdev);
1006}
1007
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08001008static void hci_cc_read_local_oob_data(struct hci_dev *hdev,
1009 struct sk_buff *skb)
Szymon Jancc35938b2011-03-22 13:12:21 +01001010{
1011 struct hci_rp_read_local_oob_data *rp = (void *) skb->data;
1012
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001013 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08001014}
1015
1016static void hci_cc_read_local_oob_ext_data(struct hci_dev *hdev,
1017 struct sk_buff *skb)
1018{
1019 struct hci_rp_read_local_oob_ext_data *rp = (void *) skb->data;
1020
1021 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Szymon Jancc35938b2011-03-22 13:12:21 +01001022}
1023
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08001024static void hci_cc_le_set_random_addr(struct hci_dev *hdev, struct sk_buff *skb)
1025{
1026 __u8 status = *((__u8 *) skb->data);
1027 bdaddr_t *sent;
1028
1029 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1030
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001031 if (status)
1032 return;
1033
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08001034 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_RANDOM_ADDR);
1035 if (!sent)
1036 return;
1037
1038 hci_dev_lock(hdev);
1039
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001040 bacpy(&hdev->random_addr, sent);
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08001041
1042 hci_dev_unlock(hdev);
1043}
1044
Jaganath Kanakkassery0314f282018-07-19 17:09:35 +05301045static void hci_cc_le_set_default_phy(struct hci_dev *hdev, struct sk_buff *skb)
1046{
1047 __u8 status = *((__u8 *) skb->data);
1048 struct hci_cp_le_set_default_phy *cp;
1049
1050 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1051
1052 if (status)
1053 return;
1054
1055 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_DEFAULT_PHY);
1056 if (!cp)
1057 return;
1058
1059 hci_dev_lock(hdev);
1060
1061 hdev->le_tx_def_phys = cp->tx_phys;
1062 hdev->le_rx_def_phys = cp->rx_phys;
1063
1064 hci_dev_unlock(hdev);
1065}
1066
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001067static void hci_cc_le_set_adv_enable(struct hci_dev *hdev, struct sk_buff *skb)
1068{
1069 __u8 *sent, status = *((__u8 *) skb->data);
1070
1071 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1072
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001073 if (status)
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001074 return;
1075
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001076 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADV_ENABLE);
1077 if (!sent)
Johan Hedberg3c857752014-03-25 10:30:49 +02001078 return;
1079
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001080 hci_dev_lock(hdev);
1081
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001082 /* If we're doing connection initiation as peripheral. Set a
Johan Hedberg3c857752014-03-25 10:30:49 +02001083 * timeout in case something goes wrong.
1084 */
1085 if (*sent) {
1086 struct hci_conn *conn;
1087
Marcel Holtmanna1536da2015-03-13 02:11:01 -07001088 hci_dev_set_flag(hdev, HCI_LE_ADV);
Johan Hedberg66c417c2014-07-08 15:07:47 +03001089
Jakub Pawlowskie7d9ab72015-08-07 20:22:52 +02001090 conn = hci_lookup_le_connect(hdev);
Johan Hedberg3c857752014-03-25 10:30:49 +02001091 if (conn)
1092 queue_delayed_work(hdev->workqueue,
1093 &conn->le_conn_timeout,
Johan Hedberg09ae2602014-07-06 13:41:15 +03001094 conn->conn_timeout);
Johan Hedberg66c417c2014-07-08 15:07:47 +03001095 } else {
Marcel Holtmanna358dc12015-03-13 02:11:02 -07001096 hci_dev_clear_flag(hdev, HCI_LE_ADV);
Johan Hedberg3c857752014-03-25 10:30:49 +02001097 }
1098
Johan Hedberg04b4edc2013-03-15 17:07:01 -05001099 hci_dev_unlock(hdev);
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001100}
1101
Jaganath Kanakkasseryde181e82018-07-19 17:09:41 +05301102static void hci_cc_le_set_ext_adv_enable(struct hci_dev *hdev,
1103 struct sk_buff *skb)
1104{
1105 struct hci_cp_le_set_ext_adv_enable *cp;
1106 struct hci_cp_ext_adv_set *adv_set;
1107 __u8 status = *((__u8 *) skb->data);
1108
1109 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1110
1111 if (status)
1112 return;
1113
1114 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_EXT_ADV_ENABLE);
1115 if (!cp)
1116 return;
1117
1118 adv_set = (void *) cp->data;
1119
1120 hci_dev_lock(hdev);
1121
1122 if (cp->enable) {
1123 struct hci_conn *conn;
1124
1125 hci_dev_set_flag(hdev, HCI_LE_ADV);
1126
1127 conn = hci_lookup_le_connect(hdev);
1128 if (conn)
1129 queue_delayed_work(hdev->workqueue,
1130 &conn->le_conn_timeout,
1131 conn->conn_timeout);
Jaganath Kanakkassery45b77492018-07-19 17:09:43 +05301132 } else {
1133 hci_dev_clear_flag(hdev, HCI_LE_ADV);
Jaganath Kanakkasseryde181e82018-07-19 17:09:41 +05301134 }
1135
1136 hci_dev_unlock(hdev);
1137}
1138
Marcel Holtmann533553f2014-03-21 12:18:10 -07001139static void hci_cc_le_set_scan_param(struct hci_dev *hdev, struct sk_buff *skb)
1140{
1141 struct hci_cp_le_set_scan_param *cp;
1142 __u8 status = *((__u8 *) skb->data);
1143
1144 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1145
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001146 if (status)
1147 return;
1148
Marcel Holtmann533553f2014-03-21 12:18:10 -07001149 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_PARAM);
1150 if (!cp)
1151 return;
1152
1153 hci_dev_lock(hdev);
1154
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001155 hdev->le_scan_type = cp->type;
Marcel Holtmann533553f2014-03-21 12:18:10 -07001156
1157 hci_dev_unlock(hdev);
1158}
1159
Jaganath Kanakkasserya2344b92018-07-06 17:05:28 +05301160static void hci_cc_le_set_ext_scan_param(struct hci_dev *hdev,
1161 struct sk_buff *skb)
1162{
1163 struct hci_cp_le_set_ext_scan_params *cp;
1164 __u8 status = *((__u8 *) skb->data);
1165 struct hci_cp_le_scan_phy_params *phy_param;
1166
1167 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1168
1169 if (status)
1170 return;
1171
1172 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_EXT_SCAN_PARAMS);
1173 if (!cp)
1174 return;
1175
1176 phy_param = (void *)cp->data;
1177
1178 hci_dev_lock(hdev);
1179
1180 hdev->le_scan_type = phy_param->type;
1181
1182 hci_dev_unlock(hdev);
1183}
1184
Johan Hedbergb9a63282014-03-25 10:51:52 +02001185static bool has_pending_adv_report(struct hci_dev *hdev)
1186{
1187 struct discovery_state *d = &hdev->discovery;
1188
1189 return bacmp(&d->last_adv_addr, BDADDR_ANY);
1190}
1191
1192static void clear_pending_adv_report(struct hci_dev *hdev)
1193{
1194 struct discovery_state *d = &hdev->discovery;
1195
1196 bacpy(&d->last_adv_addr, BDADDR_ANY);
1197 d->last_adv_data_len = 0;
1198}
1199
1200static void store_pending_adv_report(struct hci_dev *hdev, bdaddr_t *bdaddr,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001201 u8 bdaddr_type, s8 rssi, u32 flags,
1202 u8 *data, u8 len)
Johan Hedbergb9a63282014-03-25 10:51:52 +02001203{
1204 struct discovery_state *d = &hdev->discovery;
1205
1206 bacpy(&d->last_adv_addr, bdaddr);
1207 d->last_adv_addr_type = bdaddr_type;
Johan Hedbergff5cd292014-03-25 14:40:52 +02001208 d->last_adv_rssi = rssi;
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001209 d->last_adv_flags = flags;
Johan Hedbergb9a63282014-03-25 10:51:52 +02001210 memcpy(d->last_adv_data, data, len);
1211 d->last_adv_data_len = len;
1212}
1213
Jaganath Kanakkassery3baef812018-07-06 17:05:27 +05301214static void le_set_scan_enable_complete(struct hci_dev *hdev, u8 enable)
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001215{
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301216 hci_dev_lock(hdev);
1217
Jaganath Kanakkassery3baef812018-07-06 17:05:27 +05301218 switch (enable) {
Andre Guedes76a388be2013-04-04 20:21:02 -03001219 case LE_SCAN_ENABLE:
Marcel Holtmanna1536da2015-03-13 02:11:01 -07001220 hci_dev_set_flag(hdev, HCI_LE_SCAN);
Johan Hedbergb9a63282014-03-25 10:51:52 +02001221 if (hdev->le_scan_type == LE_SCAN_ACTIVE)
1222 clear_pending_adv_report(hdev);
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001223 break;
1224
Andre Guedes76a388be2013-04-04 20:21:02 -03001225 case LE_SCAN_DISABLE:
Johan Hedbergb9a63282014-03-25 10:51:52 +02001226 /* We do this here instead of when setting DISCOVERY_STOPPED
1227 * since the latter would potentially require waiting for
1228 * inquiry to stop too.
1229 */
1230 if (has_pending_adv_report(hdev)) {
1231 struct discovery_state *d = &hdev->discovery;
1232
1233 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergab0aa432014-03-26 14:17:12 +02001234 d->last_adv_addr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001235 d->last_adv_rssi, d->last_adv_flags,
Johan Hedbergab0aa432014-03-26 14:17:12 +02001236 d->last_adv_data,
Johan Hedbergb9a63282014-03-25 10:51:52 +02001237 d->last_adv_data_len, NULL, 0);
1238 }
1239
Johan Hedberg317ac8c2014-02-28 20:26:12 +02001240 /* Cancel this timer so that we don't try to disable scanning
1241 * when it's already disabled.
1242 */
1243 cancel_delayed_work(&hdev->le_scan_disable);
1244
Marcel Holtmanna358dc12015-03-13 02:11:02 -07001245 hci_dev_clear_flag(hdev, HCI_LE_SCAN);
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001246
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001247 /* The HCI_LE_SCAN_INTERRUPTED flag indicates that we
1248 * interrupted scanning due to a connect request. Mark
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001249 * therefore discovery as stopped. If this was not
1250 * because of a connect request advertising might have
1251 * been disabled because of active scanning, so
1252 * re-enable it again if necessary.
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001253 */
Marcel Holtmanna69d8922015-03-13 02:11:05 -07001254 if (hci_dev_test_and_clear_flag(hdev, HCI_LE_SCAN_INTERRUPTED))
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001255 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001256 else if (!hci_dev_test_flag(hdev, HCI_LE_ADV) &&
Johan Hedberg34722272014-07-08 16:05:05 +03001257 hdev->discovery.state == DISCOVERY_FINDING)
Johan Hedbergf2252572015-11-18 12:49:20 +02001258 hci_req_reenable_advertising(hdev);
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001259
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001260 break;
1261
1262 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001263 bt_dev_err(hdev, "use of reserved LE_Scan_Enable param %d",
Jaganath Kanakkassery3baef812018-07-06 17:05:27 +05301264 enable);
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001265 break;
Andre Guedes35815082011-05-26 16:23:53 -03001266 }
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301267
1268 hci_dev_unlock(hdev);
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001269}
1270
Jaganath Kanakkassery3baef812018-07-06 17:05:27 +05301271static void hci_cc_le_set_scan_enable(struct hci_dev *hdev,
1272 struct sk_buff *skb)
1273{
1274 struct hci_cp_le_set_scan_enable *cp;
1275 __u8 status = *((__u8 *) skb->data);
1276
1277 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1278
1279 if (status)
1280 return;
1281
1282 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_ENABLE);
1283 if (!cp)
1284 return;
1285
1286 le_set_scan_enable_complete(hdev, cp->enable);
1287}
1288
Jaganath Kanakkasserya2344b92018-07-06 17:05:28 +05301289static void hci_cc_le_set_ext_scan_enable(struct hci_dev *hdev,
1290 struct sk_buff *skb)
1291{
1292 struct hci_cp_le_set_ext_scan_enable *cp;
1293 __u8 status = *((__u8 *) skb->data);
1294
1295 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1296
1297 if (status)
1298 return;
1299
1300 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_EXT_SCAN_ENABLE);
1301 if (!cp)
1302 return;
1303
1304 le_set_scan_enable_complete(hdev, cp->enable);
1305}
1306
Jaganath Kanakkassery6b49bcb2018-07-19 17:09:40 +05301307static void hci_cc_le_read_num_adv_sets(struct hci_dev *hdev,
1308 struct sk_buff *skb)
1309{
1310 struct hci_rp_le_read_num_supported_adv_sets *rp = (void *) skb->data;
1311
1312 BT_DBG("%s status 0x%2.2x No of Adv sets %u", hdev->name, rp->status,
1313 rp->num_of_sets);
1314
1315 if (rp->status)
1316 return;
1317
1318 hdev->le_num_of_adv_sets = rp->num_of_sets;
1319}
1320
Johan Hedbergcf1d0812013-01-22 14:02:00 +02001321static void hci_cc_le_read_white_list_size(struct hci_dev *hdev,
1322 struct sk_buff *skb)
1323{
1324 struct hci_rp_le_read_white_list_size *rp = (void *) skb->data;
1325
1326 BT_DBG("%s status 0x%2.2x size %u", hdev->name, rp->status, rp->size);
1327
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001328 if (rp->status)
1329 return;
1330
1331 hdev->le_white_list_size = rp->size;
Johan Hedbergcf1d0812013-01-22 14:02:00 +02001332}
1333
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001334static void hci_cc_le_clear_white_list(struct hci_dev *hdev,
1335 struct sk_buff *skb)
1336{
1337 __u8 status = *((__u8 *) skb->data);
1338
1339 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1340
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001341 if (status)
1342 return;
1343
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001344 hci_bdaddr_list_clear(&hdev->le_white_list);
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001345}
1346
1347static void hci_cc_le_add_to_white_list(struct hci_dev *hdev,
1348 struct sk_buff *skb)
1349{
1350 struct hci_cp_le_add_to_white_list *sent;
1351 __u8 status = *((__u8 *) skb->data);
1352
1353 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1354
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001355 if (status)
1356 return;
1357
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001358 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_ADD_TO_WHITE_LIST);
1359 if (!sent)
1360 return;
1361
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001362 hci_bdaddr_list_add(&hdev->le_white_list, &sent->bdaddr,
1363 sent->bdaddr_type);
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001364}
1365
1366static void hci_cc_le_del_from_white_list(struct hci_dev *hdev,
1367 struct sk_buff *skb)
1368{
1369 struct hci_cp_le_del_from_white_list *sent;
1370 __u8 status = *((__u8 *) skb->data);
1371
1372 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1373
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001374 if (status)
1375 return;
1376
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001377 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_DEL_FROM_WHITE_LIST);
1378 if (!sent)
1379 return;
1380
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001381 hci_bdaddr_list_del(&hdev->le_white_list, &sent->bdaddr,
1382 sent->bdaddr_type);
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001383}
1384
Johan Hedberg9b008c02013-01-22 14:02:01 +02001385static void hci_cc_le_read_supported_states(struct hci_dev *hdev,
1386 struct sk_buff *skb)
1387{
1388 struct hci_rp_le_read_supported_states *rp = (void *) skb->data;
1389
1390 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1391
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001392 if (rp->status)
1393 return;
1394
1395 memcpy(hdev->le_states, rp->le_states, 8);
Johan Hedberg9b008c02013-01-22 14:02:01 +02001396}
1397
Marcel Holtmanna8e1bfa2014-12-20 16:28:40 +01001398static void hci_cc_le_read_def_data_len(struct hci_dev *hdev,
1399 struct sk_buff *skb)
1400{
1401 struct hci_rp_le_read_def_data_len *rp = (void *) skb->data;
1402
1403 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1404
1405 if (rp->status)
1406 return;
1407
1408 hdev->le_def_tx_len = le16_to_cpu(rp->tx_len);
1409 hdev->le_def_tx_time = le16_to_cpu(rp->tx_time);
1410}
1411
1412static void hci_cc_le_write_def_data_len(struct hci_dev *hdev,
1413 struct sk_buff *skb)
1414{
1415 struct hci_cp_le_write_def_data_len *sent;
1416 __u8 status = *((__u8 *) skb->data);
1417
1418 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1419
1420 if (status)
1421 return;
1422
1423 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_WRITE_DEF_DATA_LEN);
1424 if (!sent)
1425 return;
1426
1427 hdev->le_def_tx_len = le16_to_cpu(sent->tx_len);
1428 hdev->le_def_tx_time = le16_to_cpu(sent->tx_time);
1429}
1430
Ankit Navik545f2592018-06-29 12:13:20 +05301431static void hci_cc_le_clear_resolv_list(struct hci_dev *hdev,
1432 struct sk_buff *skb)
1433{
1434 __u8 status = *((__u8 *) skb->data);
1435
1436 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1437
1438 if (status)
1439 return;
1440
1441 hci_bdaddr_list_clear(&hdev->le_resolv_list);
1442}
1443
Ankit Navikcfdb0c22018-06-29 12:12:50 +05301444static void hci_cc_le_read_resolv_list_size(struct hci_dev *hdev,
1445 struct sk_buff *skb)
1446{
1447 struct hci_rp_le_read_resolv_list_size *rp = (void *) skb->data;
1448
1449 BT_DBG("%s status 0x%2.2x size %u", hdev->name, rp->status, rp->size);
1450
1451 if (rp->status)
1452 return;
1453
1454 hdev->le_resolv_list_size = rp->size;
1455}
1456
Marcel Holtmanna8e1bfa2014-12-20 16:28:40 +01001457static void hci_cc_le_read_max_data_len(struct hci_dev *hdev,
1458 struct sk_buff *skb)
1459{
1460 struct hci_rp_le_read_max_data_len *rp = (void *) skb->data;
1461
1462 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1463
1464 if (rp->status)
1465 return;
1466
1467 hdev->le_max_tx_len = le16_to_cpu(rp->tx_len);
1468 hdev->le_max_tx_time = le16_to_cpu(rp->tx_time);
1469 hdev->le_max_rx_len = le16_to_cpu(rp->rx_len);
1470 hdev->le_max_rx_time = le16_to_cpu(rp->rx_time);
1471}
1472
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001473static void hci_cc_write_le_host_supported(struct hci_dev *hdev,
1474 struct sk_buff *skb)
Andre Guedesf9b49302011-06-30 19:20:53 -03001475{
Johan Hedberg06199cf2012-02-22 16:37:11 +02001476 struct hci_cp_write_le_host_supported *sent;
Andre Guedesf9b49302011-06-30 19:20:53 -03001477 __u8 status = *((__u8 *) skb->data);
1478
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001479 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedesf9b49302011-06-30 19:20:53 -03001480
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001481 if (status)
1482 return;
1483
Johan Hedberg06199cf2012-02-22 16:37:11 +02001484 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LE_HOST_SUPPORTED);
Johan Hedberg8f984df2012-02-28 01:07:22 +02001485 if (!sent)
Andre Guedesf9b49302011-06-30 19:20:53 -03001486 return;
1487
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301488 hci_dev_lock(hdev);
1489
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001490 if (sent->le) {
1491 hdev->features[1][0] |= LMP_HOST_LE;
Marcel Holtmanna1536da2015-03-13 02:11:01 -07001492 hci_dev_set_flag(hdev, HCI_LE_ENABLED);
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001493 } else {
1494 hdev->features[1][0] &= ~LMP_HOST_LE;
Marcel Holtmanna358dc12015-03-13 02:11:02 -07001495 hci_dev_clear_flag(hdev, HCI_LE_ENABLED);
1496 hci_dev_clear_flag(hdev, HCI_ADVERTISING);
Johan Hedberg8f984df2012-02-28 01:07:22 +02001497 }
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001498
1499 if (sent->simul)
1500 hdev->features[1][0] |= LMP_HOST_LE_BREDR;
1501 else
1502 hdev->features[1][0] &= ~LMP_HOST_LE_BREDR;
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301503
1504 hci_dev_unlock(hdev);
Andre Guedesf9b49302011-06-30 19:20:53 -03001505}
1506
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02001507static void hci_cc_set_adv_param(struct hci_dev *hdev, struct sk_buff *skb)
1508{
1509 struct hci_cp_le_set_adv_param *cp;
1510 u8 status = *((u8 *) skb->data);
1511
1512 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1513
1514 if (status)
1515 return;
1516
1517 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADV_PARAM);
1518 if (!cp)
1519 return;
1520
1521 hci_dev_lock(hdev);
1522 hdev->adv_addr_type = cp->own_address_type;
1523 hci_dev_unlock(hdev);
1524}
1525
Jaganath Kanakkasseryde181e82018-07-19 17:09:41 +05301526static void hci_cc_set_ext_adv_param(struct hci_dev *hdev, struct sk_buff *skb)
1527{
1528 struct hci_rp_le_set_ext_adv_params *rp = (void *) skb->data;
1529 struct hci_cp_le_set_ext_adv_params *cp;
1530 struct adv_info *adv_instance;
1531
1532 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1533
1534 if (rp->status)
1535 return;
1536
1537 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_EXT_ADV_PARAMS);
1538 if (!cp)
1539 return;
1540
1541 hci_dev_lock(hdev);
1542 hdev->adv_addr_type = cp->own_addr_type;
1543 if (!hdev->cur_adv_instance) {
1544 /* Store in hdev for instance 0 */
1545 hdev->adv_tx_power = rp->tx_power;
1546 } else {
1547 adv_instance = hci_find_adv_instance(hdev,
1548 hdev->cur_adv_instance);
1549 if (adv_instance)
1550 adv_instance->tx_power = rp->tx_power;
1551 }
Jaganath Kanakkasserya0fb3722018-07-19 17:09:42 +05301552 /* Update adv data as tx power is known now */
1553 hci_req_update_adv_data(hdev, hdev->cur_adv_instance);
Jaganath Kanakkasseryde181e82018-07-19 17:09:41 +05301554 hci_dev_unlock(hdev);
1555}
1556
Andrzej Kaczmarek5ae76a92014-05-08 15:32:08 +02001557static void hci_cc_read_rssi(struct hci_dev *hdev, struct sk_buff *skb)
1558{
1559 struct hci_rp_read_rssi *rp = (void *) skb->data;
1560 struct hci_conn *conn;
1561
1562 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1563
1564 if (rp->status)
1565 return;
1566
1567 hci_dev_lock(hdev);
1568
1569 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
1570 if (conn)
1571 conn->rssi = rp->rssi;
1572
1573 hci_dev_unlock(hdev);
1574}
1575
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001576static void hci_cc_read_tx_power(struct hci_dev *hdev, struct sk_buff *skb)
1577{
1578 struct hci_cp_read_tx_power *sent;
1579 struct hci_rp_read_tx_power *rp = (void *) skb->data;
1580 struct hci_conn *conn;
1581
1582 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1583
1584 if (rp->status)
1585 return;
1586
1587 sent = hci_sent_cmd_data(hdev, HCI_OP_READ_TX_POWER);
1588 if (!sent)
1589 return;
1590
1591 hci_dev_lock(hdev);
1592
1593 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
Andrzej Kaczmarekd0455ed2014-05-14 13:43:05 +02001594 if (!conn)
1595 goto unlock;
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001596
Andrzej Kaczmarekd0455ed2014-05-14 13:43:05 +02001597 switch (sent->type) {
1598 case 0x00:
1599 conn->tx_power = rp->tx_power;
1600 break;
1601 case 0x01:
1602 conn->max_tx_power = rp->tx_power;
1603 break;
1604 }
1605
1606unlock:
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001607 hci_dev_unlock(hdev);
1608}
1609
Marcel Holtmannc50b33c2015-01-31 15:07:52 -08001610static void hci_cc_write_ssp_debug_mode(struct hci_dev *hdev, struct sk_buff *skb)
1611{
1612 u8 status = *((u8 *) skb->data);
1613 u8 *mode;
1614
1615 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1616
1617 if (status)
1618 return;
1619
1620 mode = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SSP_DEBUG_MODE);
1621 if (mode)
1622 hdev->ssp_debug_mode = *mode;
1623}
1624
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001625static void hci_cs_inquiry(struct hci_dev *hdev, __u8 status)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001626{
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001627 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001628
1629 if (status) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001630 hci_conn_check_pending(hdev);
Johan Hedberg314b2382011-04-27 10:29:57 -04001631 return;
1632 }
1633
Andre Guedes89352e72011-11-04 14:16:53 -03001634 set_bit(HCI_INQUIRY, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001635}
1636
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001637static void hci_cs_create_conn(struct hci_dev *hdev, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001638{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001639 struct hci_cp_create_conn *cp;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001640 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001641
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001642 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001643
1644 cp = hci_sent_cmd_data(hdev, HCI_OP_CREATE_CONN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001645 if (!cp)
1646 return;
1647
1648 hci_dev_lock(hdev);
1649
1650 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
1651
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03001652 BT_DBG("%s bdaddr %pMR hcon %p", hdev->name, &cp->bdaddr, conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001653
1654 if (status) {
1655 if (conn && conn->state == BT_CONNECT) {
Marcel Holtmann4c67bc72006-10-15 17:30:56 +02001656 if (status != 0x0c || conn->attempt > 2) {
1657 conn->state = BT_CLOSED;
Johan Hedberg539c4962015-02-18 14:53:57 +02001658 hci_connect_cfm(conn, status);
Marcel Holtmann4c67bc72006-10-15 17:30:56 +02001659 hci_conn_del(conn);
1660 } else
1661 conn->state = BT_CONNECT2;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001662 }
1663 } else {
1664 if (!conn) {
Johan Hedberga5c4e302014-07-16 11:56:07 +03001665 conn = hci_conn_add(hdev, ACL_LINK, &cp->bdaddr,
1666 HCI_ROLE_MASTER);
1667 if (!conn)
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001668 bt_dev_err(hdev, "no memory for new connection");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001669 }
1670 }
1671
1672 hci_dev_unlock(hdev);
1673}
1674
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001675static void hci_cs_add_sco(struct hci_dev *hdev, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001676{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001677 struct hci_cp_add_sco *cp;
1678 struct hci_conn *acl, *sco;
1679 __u16 handle;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001680
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001681 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001682
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001683 if (!status)
1684 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001685
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001686 cp = hci_sent_cmd_data(hdev, HCI_OP_ADD_SCO);
1687 if (!cp)
1688 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001689
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001690 handle = __le16_to_cpu(cp->handle);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001691
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001692 BT_DBG("%s handle 0x%4.4x", hdev->name, handle);
Marcel Holtmann6bd57412006-11-18 22:14:22 +01001693
1694 hci_dev_lock(hdev);
1695
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001696 acl = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001697 if (acl) {
1698 sco = acl->link;
1699 if (sco) {
1700 sco->state = BT_CLOSED;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001701
Johan Hedberg539c4962015-02-18 14:53:57 +02001702 hci_connect_cfm(sco, status);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001703 hci_conn_del(sco);
1704 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001705 }
Marcel Holtmann6bd57412006-11-18 22:14:22 +01001706
1707 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001708}
1709
Marcel Holtmannf8558552008-07-14 20:13:49 +02001710static void hci_cs_auth_requested(struct hci_dev *hdev, __u8 status)
1711{
1712 struct hci_cp_auth_requested *cp;
1713 struct hci_conn *conn;
1714
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001715 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001716
1717 if (!status)
1718 return;
1719
1720 cp = hci_sent_cmd_data(hdev, HCI_OP_AUTH_REQUESTED);
1721 if (!cp)
1722 return;
1723
1724 hci_dev_lock(hdev);
1725
1726 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1727 if (conn) {
1728 if (conn->state == BT_CONFIG) {
Johan Hedberg539c4962015-02-18 14:53:57 +02001729 hci_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001730 hci_conn_drop(conn);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001731 }
1732 }
1733
1734 hci_dev_unlock(hdev);
1735}
1736
1737static void hci_cs_set_conn_encrypt(struct hci_dev *hdev, __u8 status)
1738{
1739 struct hci_cp_set_conn_encrypt *cp;
1740 struct hci_conn *conn;
1741
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001742 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001743
1744 if (!status)
1745 return;
1746
1747 cp = hci_sent_cmd_data(hdev, HCI_OP_SET_CONN_ENCRYPT);
1748 if (!cp)
1749 return;
1750
1751 hci_dev_lock(hdev);
1752
1753 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1754 if (conn) {
1755 if (conn->state == BT_CONFIG) {
Johan Hedberg539c4962015-02-18 14:53:57 +02001756 hci_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001757 hci_conn_drop(conn);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001758 }
1759 }
1760
1761 hci_dev_unlock(hdev);
1762}
1763
Johan Hedberg127178d2010-11-18 22:22:29 +02001764static int hci_outgoing_auth_needed(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -03001765 struct hci_conn *conn)
Johan Hedberg392599b2010-11-18 22:22:28 +02001766{
Johan Hedberg392599b2010-11-18 22:22:28 +02001767 if (conn->state != BT_CONFIG || !conn->out)
1768 return 0;
1769
Johan Hedberg765c2a92011-01-19 12:06:52 +05301770 if (conn->pending_sec_level == BT_SECURITY_SDP)
Johan Hedberg392599b2010-11-18 22:22:28 +02001771 return 0;
1772
1773 /* Only request authentication for SSP connections or non-SSP
Johan Hedberg264b8b42014-01-08 16:40:39 +02001774 * devices with sec_level MEDIUM or HIGH or if MITM protection
1775 * is requested.
1776 */
Gustavo Padovan807deac2012-05-17 00:36:24 -03001777 if (!hci_conn_ssp_enabled(conn) && !(conn->auth_type & 0x01) &&
Johan Hedberg7e3691e2014-05-30 14:45:19 +03001778 conn->pending_sec_level != BT_SECURITY_FIPS &&
Johan Hedberg264b8b42014-01-08 16:40:39 +02001779 conn->pending_sec_level != BT_SECURITY_HIGH &&
1780 conn->pending_sec_level != BT_SECURITY_MEDIUM)
Johan Hedberg392599b2010-11-18 22:22:28 +02001781 return 0;
1782
Johan Hedberg392599b2010-11-18 22:22:28 +02001783 return 1;
1784}
1785
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001786static int hci_resolve_name(struct hci_dev *hdev,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001787 struct inquiry_entry *e)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001788{
1789 struct hci_cp_remote_name_req cp;
1790
1791 memset(&cp, 0, sizeof(cp));
1792
1793 bacpy(&cp.bdaddr, &e->data.bdaddr);
1794 cp.pscan_rep_mode = e->data.pscan_rep_mode;
1795 cp.pscan_mode = e->data.pscan_mode;
1796 cp.clock_offset = e->data.clock_offset;
1797
1798 return hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
1799}
1800
Johan Hedbergb644ba32012-01-17 21:48:47 +02001801static bool hci_resolve_next_name(struct hci_dev *hdev)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001802{
1803 struct discovery_state *discov = &hdev->discovery;
1804 struct inquiry_entry *e;
1805
Johan Hedbergb644ba32012-01-17 21:48:47 +02001806 if (list_empty(&discov->resolve))
1807 return false;
1808
1809 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
Ram Malovanyc8100892012-07-19 10:26:09 +03001810 if (!e)
1811 return false;
1812
Johan Hedbergb644ba32012-01-17 21:48:47 +02001813 if (hci_resolve_name(hdev, e) == 0) {
1814 e->name_state = NAME_PENDING;
1815 return true;
1816 }
1817
1818 return false;
1819}
1820
1821static void hci_check_pending_name(struct hci_dev *hdev, struct hci_conn *conn,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001822 bdaddr_t *bdaddr, u8 *name, u8 name_len)
Johan Hedbergb644ba32012-01-17 21:48:47 +02001823{
1824 struct discovery_state *discov = &hdev->discovery;
1825 struct inquiry_entry *e;
1826
Johan Hedberg60cb49d2014-11-11 11:33:24 +02001827 /* Update the mgmt connected state if necessary. Be careful with
1828 * conn objects that exist but are not (yet) connected however.
1829 * Only those in BT_CONFIG or BT_CONNECTED states can be
1830 * considered connected.
1831 */
1832 if (conn &&
1833 (conn->state == BT_CONFIG || conn->state == BT_CONNECTED) &&
Jaganath Kanakkasserycb77c3e2014-11-07 16:39:09 +05301834 !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00001835 mgmt_device_connected(hdev, conn, 0, name, name_len);
Johan Hedbergb644ba32012-01-17 21:48:47 +02001836
1837 if (discov->state == DISCOVERY_STOPPED)
1838 return;
1839
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001840 if (discov->state == DISCOVERY_STOPPING)
1841 goto discov_complete;
1842
1843 if (discov->state != DISCOVERY_RESOLVING)
1844 return;
1845
1846 e = hci_inquiry_cache_lookup_resolve(hdev, bdaddr, NAME_PENDING);
Ram Malovany7cc83802012-07-19 10:26:10 +03001847 /* If the device was not found in a list of found devices names of which
1848 * are pending. there is no need to continue resolving a next name as it
1849 * will be done upon receiving another Remote Name Request Complete
1850 * Event */
1851 if (!e)
1852 return;
1853
1854 list_del(&e->list);
1855 if (name) {
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001856 e->name_state = NAME_KNOWN;
Ram Malovany7cc83802012-07-19 10:26:10 +03001857 mgmt_remote_name(hdev, bdaddr, ACL_LINK, 0x00,
1858 e->data.rssi, name, name_len);
Ram Malovanyc3e7c0d2012-07-19 10:26:11 +03001859 } else {
1860 e->name_state = NAME_NOT_KNOWN;
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001861 }
1862
Johan Hedbergb644ba32012-01-17 21:48:47 +02001863 if (hci_resolve_next_name(hdev))
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001864 return;
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001865
1866discov_complete:
1867 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
1868}
1869
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001870static void hci_cs_remote_name_req(struct hci_dev *hdev, __u8 status)
1871{
Johan Hedberg127178d2010-11-18 22:22:29 +02001872 struct hci_cp_remote_name_req *cp;
1873 struct hci_conn *conn;
1874
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001875 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Johan Hedberg127178d2010-11-18 22:22:29 +02001876
1877 /* If successful wait for the name req complete event before
1878 * checking for the need to do authentication */
1879 if (!status)
1880 return;
1881
1882 cp = hci_sent_cmd_data(hdev, HCI_OP_REMOTE_NAME_REQ);
1883 if (!cp)
1884 return;
1885
1886 hci_dev_lock(hdev);
1887
1888 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02001889
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001890 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedbergb644ba32012-01-17 21:48:47 +02001891 hci_check_pending_name(hdev, conn, &cp->bdaddr, NULL, 0);
1892
Johan Hedberg79c6c702011-04-28 11:28:55 -07001893 if (!conn)
1894 goto unlock;
1895
1896 if (!hci_outgoing_auth_needed(hdev, conn))
1897 goto unlock;
1898
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001899 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02001900 struct hci_cp_auth_requested auth_cp;
1901
Johan Hedberg977f8fc2014-07-17 15:35:39 +03001902 set_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags);
1903
Johannes Bergc1f23a22013-10-07 18:19:16 +02001904 auth_cp.handle = __cpu_to_le16(conn->handle);
1905 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED,
1906 sizeof(auth_cp), &auth_cp);
Johan Hedberg127178d2010-11-18 22:22:29 +02001907 }
1908
Johan Hedberg79c6c702011-04-28 11:28:55 -07001909unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02001910 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001911}
1912
Marcel Holtmann769be972008-07-14 20:13:49 +02001913static void hci_cs_read_remote_features(struct hci_dev *hdev, __u8 status)
1914{
1915 struct hci_cp_read_remote_features *cp;
1916 struct hci_conn *conn;
1917
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001918 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann769be972008-07-14 20:13:49 +02001919
1920 if (!status)
1921 return;
1922
1923 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_REMOTE_FEATURES);
1924 if (!cp)
1925 return;
1926
1927 hci_dev_lock(hdev);
1928
1929 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1930 if (conn) {
1931 if (conn->state == BT_CONFIG) {
Johan Hedberg539c4962015-02-18 14:53:57 +02001932 hci_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001933 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02001934 }
1935 }
1936
1937 hci_dev_unlock(hdev);
1938}
1939
1940static void hci_cs_read_remote_ext_features(struct hci_dev *hdev, __u8 status)
1941{
1942 struct hci_cp_read_remote_ext_features *cp;
1943 struct hci_conn *conn;
1944
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001945 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann769be972008-07-14 20:13:49 +02001946
1947 if (!status)
1948 return;
1949
1950 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES);
1951 if (!cp)
1952 return;
1953
1954 hci_dev_lock(hdev);
1955
1956 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1957 if (conn) {
1958 if (conn->state == BT_CONFIG) {
Johan Hedberg539c4962015-02-18 14:53:57 +02001959 hci_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001960 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02001961 }
1962 }
1963
1964 hci_dev_unlock(hdev);
1965}
1966
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001967static void hci_cs_setup_sync_conn(struct hci_dev *hdev, __u8 status)
1968{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001969 struct hci_cp_setup_sync_conn *cp;
1970 struct hci_conn *acl, *sco;
1971 __u16 handle;
1972
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001973 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001974
1975 if (!status)
1976 return;
1977
1978 cp = hci_sent_cmd_data(hdev, HCI_OP_SETUP_SYNC_CONN);
1979 if (!cp)
1980 return;
1981
1982 handle = __le16_to_cpu(cp->handle);
1983
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001984 BT_DBG("%s handle 0x%4.4x", hdev->name, handle);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001985
1986 hci_dev_lock(hdev);
1987
1988 acl = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001989 if (acl) {
1990 sco = acl->link;
1991 if (sco) {
1992 sco->state = BT_CLOSED;
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001993
Johan Hedberg539c4962015-02-18 14:53:57 +02001994 hci_connect_cfm(sco, status);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001995 hci_conn_del(sco);
1996 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001997 }
1998
1999 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002000}
2001
2002static void hci_cs_sniff_mode(struct hci_dev *hdev, __u8 status)
2003{
2004 struct hci_cp_sniff_mode *cp;
2005 struct hci_conn *conn;
2006
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002007 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002008
2009 if (!status)
2010 return;
2011
2012 cp = hci_sent_cmd_data(hdev, HCI_OP_SNIFF_MODE);
2013 if (!cp)
2014 return;
2015
2016 hci_dev_lock(hdev);
2017
2018 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
Marcel Holtmanne73439d2010-07-26 10:06:00 -04002019 if (conn) {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002020 clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002021
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002022 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04002023 hci_sco_setup(conn, status);
2024 }
2025
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002026 hci_dev_unlock(hdev);
2027}
2028
2029static void hci_cs_exit_sniff_mode(struct hci_dev *hdev, __u8 status)
2030{
2031 struct hci_cp_exit_sniff_mode *cp;
2032 struct hci_conn *conn;
2033
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002034 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002035
2036 if (!status)
2037 return;
2038
2039 cp = hci_sent_cmd_data(hdev, HCI_OP_EXIT_SNIFF_MODE);
2040 if (!cp)
2041 return;
2042
2043 hci_dev_lock(hdev);
2044
2045 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
Marcel Holtmanne73439d2010-07-26 10:06:00 -04002046 if (conn) {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002047 clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002048
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002049 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04002050 hci_sco_setup(conn, status);
2051 }
2052
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002053 hci_dev_unlock(hdev);
2054}
2055
Johan Hedberg88c3df12012-02-09 14:27:38 +02002056static void hci_cs_disconnect(struct hci_dev *hdev, u8 status)
2057{
2058 struct hci_cp_disconnect *cp;
2059 struct hci_conn *conn;
2060
2061 if (!status)
2062 return;
2063
2064 cp = hci_sent_cmd_data(hdev, HCI_OP_DISCONNECT);
2065 if (!cp)
2066 return;
2067
2068 hci_dev_lock(hdev);
2069
2070 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
2071 if (conn)
2072 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002073 conn->dst_type, status);
Johan Hedberg88c3df12012-02-09 14:27:38 +02002074
2075 hci_dev_unlock(hdev);
2076}
2077
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05302078static void cs_le_create_conn(struct hci_dev *hdev, bdaddr_t *peer_addr,
2079 u8 peer_addr_type, u8 own_address_type,
2080 u8 filter_policy)
2081{
2082 struct hci_conn *conn;
2083
2084 conn = hci_conn_hash_lookup_le(hdev, peer_addr,
2085 peer_addr_type);
2086 if (!conn)
2087 return;
2088
2089 /* Store the initiator and responder address information which
2090 * is needed for SMP. These values will not change during the
2091 * lifetime of the connection.
2092 */
2093 conn->init_addr_type = own_address_type;
2094 if (own_address_type == ADDR_LE_DEV_RANDOM)
2095 bacpy(&conn->init_addr, &hdev->random_addr);
2096 else
2097 bacpy(&conn->init_addr, &hdev->bdaddr);
2098
2099 conn->resp_addr_type = peer_addr_type;
2100 bacpy(&conn->resp_addr, peer_addr);
2101
2102 /* We don't want the connection attempt to stick around
2103 * indefinitely since LE doesn't have a page timeout concept
2104 * like BR/EDR. Set a timer for any connection that doesn't use
2105 * the white list for connecting.
2106 */
2107 if (filter_policy == HCI_LE_USE_PEER_ADDR)
2108 queue_delayed_work(conn->hdev->workqueue,
2109 &conn->le_conn_timeout,
2110 conn->conn_timeout);
2111}
2112
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02002113static void hci_cs_le_create_conn(struct hci_dev *hdev, u8 status)
2114{
2115 struct hci_cp_le_create_conn *cp;
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02002116
2117 BT_DBG("%s status 0x%2.2x", hdev->name, status);
2118
2119 /* All connection failure handling is taken care of by the
2120 * hci_le_conn_failed function which is triggered by the HCI
2121 * request completion callbacks used for connecting.
2122 */
2123 if (status)
2124 return;
2125
2126 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_CREATE_CONN);
2127 if (!cp)
2128 return;
2129
2130 hci_dev_lock(hdev);
2131
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05302132 cs_le_create_conn(hdev, &cp->peer_addr, cp->peer_addr_type,
2133 cp->own_address_type, cp->filter_policy);
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02002134
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02002135 hci_dev_unlock(hdev);
2136}
2137
Jaganath Kanakkassery4d94f952018-07-06 22:50:32 +02002138static void hci_cs_le_ext_create_conn(struct hci_dev *hdev, u8 status)
2139{
2140 struct hci_cp_le_ext_create_conn *cp;
2141
2142 BT_DBG("%s status 0x%2.2x", hdev->name, status);
2143
2144 /* All connection failure handling is taken care of by the
2145 * hci_le_conn_failed function which is triggered by the HCI
2146 * request completion callbacks used for connecting.
2147 */
2148 if (status)
2149 return;
2150
2151 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_EXT_CREATE_CONN);
2152 if (!cp)
2153 return;
2154
2155 hci_dev_lock(hdev);
2156
2157 cs_le_create_conn(hdev, &cp->peer_addr, cp->peer_addr_type,
2158 cp->own_addr_type, cp->filter_policy);
2159
2160 hci_dev_unlock(hdev);
2161}
2162
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07002163static void hci_cs_le_read_remote_features(struct hci_dev *hdev, u8 status)
2164{
2165 struct hci_cp_le_read_remote_features *cp;
2166 struct hci_conn *conn;
2167
2168 BT_DBG("%s status 0x%2.2x", hdev->name, status);
2169
2170 if (!status)
2171 return;
2172
2173 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_READ_REMOTE_FEATURES);
2174 if (!cp)
2175 return;
2176
2177 hci_dev_lock(hdev);
2178
2179 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
2180 if (conn) {
2181 if (conn->state == BT_CONFIG) {
2182 hci_connect_cfm(conn, status);
2183 hci_conn_drop(conn);
2184 }
2185 }
2186
2187 hci_dev_unlock(hdev);
2188}
2189
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02002190static void hci_cs_le_start_enc(struct hci_dev *hdev, u8 status)
2191{
2192 struct hci_cp_le_start_enc *cp;
2193 struct hci_conn *conn;
2194
2195 BT_DBG("%s status 0x%2.2x", hdev->name, status);
2196
2197 if (!status)
2198 return;
2199
2200 hci_dev_lock(hdev);
2201
2202 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_START_ENC);
2203 if (!cp)
2204 goto unlock;
2205
2206 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
2207 if (!conn)
2208 goto unlock;
2209
2210 if (conn->state != BT_CONNECTED)
2211 goto unlock;
2212
2213 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
2214 hci_conn_drop(conn);
2215
2216unlock:
2217 hci_dev_unlock(hdev);
2218}
2219
Kuba Pawlak50fc85f2014-11-06 19:36:52 +01002220static void hci_cs_switch_role(struct hci_dev *hdev, u8 status)
2221{
2222 struct hci_cp_switch_role *cp;
2223 struct hci_conn *conn;
2224
2225 BT_DBG("%s status 0x%2.2x", hdev->name, status);
2226
2227 if (!status)
2228 return;
2229
2230 cp = hci_sent_cmd_data(hdev, HCI_OP_SWITCH_ROLE);
2231 if (!cp)
2232 return;
2233
2234 hci_dev_lock(hdev);
2235
2236 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
2237 if (conn)
2238 clear_bit(HCI_CONN_RSWITCH_PEND, &conn->flags);
2239
2240 hci_dev_unlock(hdev);
2241}
2242
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002243static void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002244{
2245 __u8 status = *((__u8 *) skb->data);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002246 struct discovery_state *discov = &hdev->discovery;
2247 struct inquiry_entry *e;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002248
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002249 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002250
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002251 hci_conn_check_pending(hdev);
Andre Guedes89352e72011-11-04 14:16:53 -03002252
2253 if (!test_and_clear_bit(HCI_INQUIRY, &hdev->flags))
2254 return;
2255
Peter Zijlstra4e857c52014-03-17 18:06:10 +01002256 smp_mb__after_atomic(); /* wake_up_bit advises about this barrier */
Andre Guedes3e13fa12013-03-27 20:04:56 -03002257 wake_up_bit(&hdev->flags, HCI_INQUIRY);
2258
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002259 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002260 return;
2261
Johan Hedberg56e5cb82011-11-08 20:40:16 +02002262 hci_dev_lock(hdev);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002263
Andre Guedes343f9352012-02-17 20:39:37 -03002264 if (discov->state != DISCOVERY_FINDING)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002265 goto unlock;
2266
2267 if (list_empty(&discov->resolve)) {
Jakub Pawlowski07d23342015-03-17 09:04:14 -07002268 /* When BR/EDR inquiry is active and no LE scanning is in
2269 * progress, then change discovery state to indicate completion.
2270 *
2271 * When running LE scanning and BR/EDR inquiry simultaneously
2272 * and the LE scan already finished, then change the discovery
2273 * state to indicate completion.
2274 */
2275 if (!hci_dev_test_flag(hdev, HCI_LE_SCAN) ||
2276 !test_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks))
2277 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002278 goto unlock;
2279 }
2280
2281 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
2282 if (e && hci_resolve_name(hdev, e) == 0) {
2283 e->name_state = NAME_PENDING;
2284 hci_discovery_set_state(hdev, DISCOVERY_RESOLVING);
2285 } else {
Jakub Pawlowski07d23342015-03-17 09:04:14 -07002286 /* When BR/EDR inquiry is active and no LE scanning is in
2287 * progress, then change discovery state to indicate completion.
2288 *
2289 * When running LE scanning and BR/EDR inquiry simultaneously
2290 * and the LE scan already finished, then change the discovery
2291 * state to indicate completion.
2292 */
2293 if (!hci_dev_test_flag(hdev, HCI_LE_SCAN) ||
2294 !test_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks))
2295 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002296 }
2297
2298unlock:
Johan Hedberg56e5cb82011-11-08 20:40:16 +02002299 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002300}
2301
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002302static void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002303{
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002304 struct inquiry_data data;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002305 struct inquiry_info *info = (void *) (skb->data + 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002306 int num_rsp = *((__u8 *) skb->data);
2307
2308 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
2309
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002310 if (!num_rsp)
2311 return;
2312
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002313 if (hci_dev_test_flag(hdev, HCI_PERIODIC_INQ))
Andre Guedes1519cc12012-03-21 00:03:38 -03002314 return;
2315
Linus Torvalds1da177e2005-04-16 15:20:36 -07002316 hci_dev_lock(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002317
Johan Hedberge17acd42011-03-30 23:57:16 +03002318 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02002319 u32 flags;
Johan Hedberg31754052012-01-04 13:39:52 +02002320
Linus Torvalds1da177e2005-04-16 15:20:36 -07002321 bacpy(&data.bdaddr, &info->bdaddr);
2322 data.pscan_rep_mode = info->pscan_rep_mode;
2323 data.pscan_period_mode = info->pscan_period_mode;
2324 data.pscan_mode = info->pscan_mode;
2325 memcpy(data.dev_class, info->dev_class, 3);
2326 data.clock_offset = info->clock_offset;
Marcel Holtmannefb25132014-12-05 13:03:34 +01002327 data.rssi = HCI_RSSI_INVALID;
Marcel Holtmann41a96212008-07-14 20:13:48 +02002328 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02002329
Marcel Holtmannaf589252014-07-01 14:11:20 +02002330 flags = hci_inquiry_cache_update(hdev, &data, false);
2331
Johan Hedberg48264f02011-11-09 13:58:58 +02002332 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Marcel Holtmannefb25132014-12-05 13:03:34 +01002333 info->dev_class, HCI_RSSI_INVALID,
2334 flags, NULL, 0, NULL, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002335 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002336
Linus Torvalds1da177e2005-04-16 15:20:36 -07002337 hci_dev_unlock(hdev);
2338}
2339
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002340static void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002341{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002342 struct hci_ev_conn_complete *ev = (void *) skb->data;
2343 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002344
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002345 BT_DBG("%s", hdev->name);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002346
Linus Torvalds1da177e2005-04-16 15:20:36 -07002347 hci_dev_lock(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002348
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002349 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann94992372009-04-19 19:30:03 +02002350 if (!conn) {
2351 if (ev->link_type != SCO_LINK)
2352 goto unlock;
2353
2354 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
2355 if (!conn)
2356 goto unlock;
2357
2358 conn->type = SCO_LINK;
2359 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002360
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002361 if (!ev->status) {
2362 conn->handle = __le16_to_cpu(ev->handle);
Marcel Holtmann769be972008-07-14 20:13:49 +02002363
2364 if (conn->type == ACL_LINK) {
2365 conn->state = BT_CONFIG;
2366 hci_conn_hold(conn);
Szymon Janca9ea3ed2012-07-19 14:46:08 +02002367
2368 if (!conn->out && !hci_conn_ssp_enabled(conn) &&
2369 !hci_find_link_key(hdev, &ev->bdaddr))
2370 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
2371 else
2372 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
Marcel Holtmann769be972008-07-14 20:13:49 +02002373 } else
2374 conn->state = BT_CONNECTED;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002375
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01002376 hci_debugfs_create_conn(conn);
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02002377 hci_conn_add_sysfs(conn);
2378
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002379 if (test_bit(HCI_AUTH, &hdev->flags))
Johan Hedberg4dae2792014-06-24 17:03:50 +03002380 set_bit(HCI_CONN_AUTH, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002381
2382 if (test_bit(HCI_ENCRYPT, &hdev->flags))
Johan Hedberg4dae2792014-06-24 17:03:50 +03002383 set_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002384
2385 /* Get remote features */
2386 if (conn->type == ACL_LINK) {
2387 struct hci_cp_read_remote_features cp;
2388 cp.handle = ev->handle;
Marcel Holtmann769be972008-07-14 20:13:49 +02002389 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_FEATURES,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002390 sizeof(cp), &cp);
Johan Hedberg22f433d2014-08-01 11:13:32 +03002391
Johan Hedberg01b1cb82015-11-16 12:52:21 +02002392 hci_req_update_scan(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002393 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002394
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002395 /* Set packet type for incoming connection */
Andrei Emeltchenkod095c1e2011-12-01 14:33:27 +02002396 if (!conn->out && hdev->hci_ver < BLUETOOTH_VER_2_0) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002397 struct hci_cp_change_conn_ptype cp;
2398 cp.handle = ev->handle;
Marcel Holtmanna8746412008-07-14 20:13:46 +02002399 cp.pkt_type = cpu_to_le16(conn->pkt_type);
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002400 hci_send_cmd(hdev, HCI_OP_CHANGE_CONN_PTYPE, sizeof(cp),
2401 &cp);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002402 }
Johan Hedberg17d5c042011-01-22 06:09:08 +02002403 } else {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002404 conn->state = BT_CLOSED;
Johan Hedberg17d5c042011-01-22 06:09:08 +02002405 if (conn->type == ACL_LINK)
Marcel Holtmann64c7b772014-02-18 14:22:20 -08002406 mgmt_connect_failed(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002407 conn->dst_type, ev->status);
Johan Hedberg17d5c042011-01-22 06:09:08 +02002408 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002409
Marcel Holtmanne73439d2010-07-26 10:06:00 -04002410 if (conn->type == ACL_LINK)
2411 hci_sco_setup(conn, ev->status);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002412
Marcel Holtmann769be972008-07-14 20:13:49 +02002413 if (ev->status) {
Johan Hedberg539c4962015-02-18 14:53:57 +02002414 hci_connect_cfm(conn, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002415 hci_conn_del(conn);
Marcel Holtmannc89b6e62009-01-15 21:57:03 +01002416 } else if (ev->link_type != ACL_LINK)
Johan Hedberg539c4962015-02-18 14:53:57 +02002417 hci_connect_cfm(conn, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002418
2419unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002420 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002421
2422 hci_conn_check_pending(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002423}
2424
Johan Hedberg70c46422014-07-09 12:59:17 +03002425static void hci_reject_conn(struct hci_dev *hdev, bdaddr_t *bdaddr)
2426{
2427 struct hci_cp_reject_conn_req cp;
2428
2429 bacpy(&cp.bdaddr, bdaddr);
2430 cp.reason = HCI_ERROR_REJ_BAD_ADDR;
2431 hci_send_cmd(hdev, HCI_OP_REJECT_CONN_REQ, sizeof(cp), &cp);
2432}
2433
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002434static void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002435{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002436 struct hci_ev_conn_request *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002437 int mask = hdev->link_mode;
Johan Hedberg70c46422014-07-09 12:59:17 +03002438 struct inquiry_entry *ie;
2439 struct hci_conn *conn;
Frédéric Dalleau20714bfe2012-11-21 10:51:12 +01002440 __u8 flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002441
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03002442 BT_DBG("%s bdaddr %pMR type 0x%x", hdev->name, &ev->bdaddr,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002443 ev->link_type);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002444
Frédéric Dalleau20714bfe2012-11-21 10:51:12 +01002445 mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, ev->link_type,
2446 &flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002447
Johan Hedberg70c46422014-07-09 12:59:17 +03002448 if (!(mask & HCI_LM_ACCEPT)) {
2449 hci_reject_conn(hdev, &ev->bdaddr);
2450 return;
2451 }
2452
Johan Hedberg46c4c942014-07-16 16:19:21 +03002453 if (hci_bdaddr_list_lookup(&hdev->blacklist, &ev->bdaddr,
2454 BDADDR_BREDR)) {
2455 hci_reject_conn(hdev, &ev->bdaddr);
2456 return;
2457 }
2458
Johan Hedberg6a8fc952014-12-24 20:43:11 +02002459 /* Require HCI_CONNECTABLE or a whitelist entry to accept the
2460 * connection. These features are only touched through mgmt so
2461 * only do the checks if HCI_MGMT is set.
2462 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002463 if (hci_dev_test_flag(hdev, HCI_MGMT) &&
2464 !hci_dev_test_flag(hdev, HCI_CONNECTABLE) &&
Johan Hedberg46c4c942014-07-16 16:19:21 +03002465 !hci_bdaddr_list_lookup(&hdev->whitelist, &ev->bdaddr,
2466 BDADDR_BREDR)) {
2467 hci_reject_conn(hdev, &ev->bdaddr);
2468 return;
Johan Hedberg70c46422014-07-09 12:59:17 +03002469 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002470
Johan Hedberg70c46422014-07-09 12:59:17 +03002471 /* Connection accepted */
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002472
Johan Hedberg70c46422014-07-09 12:59:17 +03002473 hci_dev_lock(hdev);
Marcel Holtmannc7bdd502008-07-14 20:13:47 +02002474
Johan Hedberg70c46422014-07-09 12:59:17 +03002475 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
2476 if (ie)
2477 memcpy(ie->data.dev_class, ev->dev_class, 3);
2478
2479 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type,
2480 &ev->bdaddr);
2481 if (!conn) {
Johan Hedberga5c4e302014-07-16 11:56:07 +03002482 conn = hci_conn_add(hdev, ev->link_type, &ev->bdaddr,
2483 HCI_ROLE_SLAVE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002484 if (!conn) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002485 bt_dev_err(hdev, "no memory for new connection");
Johan Hedberg70c46422014-07-09 12:59:17 +03002486 hci_dev_unlock(hdev);
2487 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002488 }
Johan Hedberg70c46422014-07-09 12:59:17 +03002489 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002490
Johan Hedberg70c46422014-07-09 12:59:17 +03002491 memcpy(conn->dev_class, ev->dev_class, 3);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002492
Johan Hedberg70c46422014-07-09 12:59:17 +03002493 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002494
Johan Hedberg70c46422014-07-09 12:59:17 +03002495 if (ev->link_type == ACL_LINK ||
2496 (!(flags & HCI_PROTO_DEFER) && !lmp_esco_capable(hdev))) {
2497 struct hci_cp_accept_conn_req cp;
2498 conn->state = BT_CONNECT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002499
2500 bacpy(&cp.bdaddr, &ev->bdaddr);
Johan Hedberg70c46422014-07-09 12:59:17 +03002501
2502 if (lmp_rswitch_capable(hdev) && (mask & HCI_LM_MASTER))
2503 cp.role = 0x00; /* Become master */
2504 else
2505 cp.role = 0x01; /* Remain slave */
2506
2507 hci_send_cmd(hdev, HCI_OP_ACCEPT_CONN_REQ, sizeof(cp), &cp);
2508 } else if (!(flags & HCI_PROTO_DEFER)) {
2509 struct hci_cp_accept_sync_conn_req cp;
2510 conn->state = BT_CONNECT;
2511
2512 bacpy(&cp.bdaddr, &ev->bdaddr);
2513 cp.pkt_type = cpu_to_le16(conn->pkt_type);
2514
2515 cp.tx_bandwidth = cpu_to_le32(0x00001f40);
2516 cp.rx_bandwidth = cpu_to_le32(0x00001f40);
2517 cp.max_latency = cpu_to_le16(0xffff);
2518 cp.content_format = cpu_to_le16(hdev->voice_setting);
2519 cp.retrans_effort = 0xff;
2520
2521 hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ, sizeof(cp),
2522 &cp);
2523 } else {
2524 conn->state = BT_CONNECT2;
Johan Hedberg539c4962015-02-18 14:53:57 +02002525 hci_connect_cfm(conn, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002526 }
2527}
2528
Mikel Astizf0d6a0e2012-08-09 09:52:30 +02002529static u8 hci_to_mgmt_reason(u8 err)
2530{
2531 switch (err) {
2532 case HCI_ERROR_CONNECTION_TIMEOUT:
2533 return MGMT_DEV_DISCONN_TIMEOUT;
2534 case HCI_ERROR_REMOTE_USER_TERM:
2535 case HCI_ERROR_REMOTE_LOW_RESOURCES:
2536 case HCI_ERROR_REMOTE_POWER_OFF:
2537 return MGMT_DEV_DISCONN_REMOTE;
2538 case HCI_ERROR_LOCAL_HOST_TERM:
2539 return MGMT_DEV_DISCONN_LOCAL_HOST;
2540 default:
2541 return MGMT_DEV_DISCONN_UNKNOWN;
2542 }
2543}
2544
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002545static void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002546{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002547 struct hci_ev_disconn_complete *ev = (void *) skb->data;
Szymon Janc160b9252016-07-12 02:12:16 +02002548 u8 reason;
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002549 struct hci_conn_params *params;
Marcel Holtmann04837f62006-07-03 10:02:33 +02002550 struct hci_conn *conn;
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002551 bool mgmt_connected;
Andre Guedes38462202013-11-07 17:36:10 -03002552 u8 type;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002553
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002554 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002555
Linus Torvalds1da177e2005-04-16 15:20:36 -07002556 hci_dev_lock(hdev);
2557
Marcel Holtmann04837f62006-07-03 10:02:33 +02002558 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergf7520542011-01-20 12:34:39 +02002559 if (!conn)
2560 goto unlock;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02002561
Andre Guedesabf54a52013-11-07 17:36:09 -03002562 if (ev->status) {
2563 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
2564 conn->dst_type, ev->status);
2565 goto unlock;
Johan Hedberg37d9ef72011-11-10 15:54:39 +02002566 }
Johan Hedbergf7520542011-01-20 12:34:39 +02002567
Andre Guedes38462202013-11-07 17:36:10 -03002568 conn->state = BT_CLOSED;
2569
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002570 mgmt_connected = test_and_clear_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags);
Szymon Janc160b9252016-07-12 02:12:16 +02002571
2572 if (test_bit(HCI_CONN_AUTH_FAILURE, &conn->flags))
2573 reason = MGMT_DEV_DISCONN_AUTH_FAILURE;
2574 else
2575 reason = hci_to_mgmt_reason(ev->reason);
2576
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002577 mgmt_device_disconnected(hdev, &conn->dst, conn->type, conn->dst_type,
2578 reason, mgmt_connected);
Andre Guedesabf54a52013-11-07 17:36:09 -03002579
Johan Hedberg22f433d2014-08-01 11:13:32 +03002580 if (conn->type == ACL_LINK) {
2581 if (test_bit(HCI_CONN_FLUSH_KEY, &conn->flags))
2582 hci_remove_link_key(hdev, &conn->dst);
2583
Johan Hedberg01b1cb82015-11-16 12:52:21 +02002584 hci_req_update_scan(hdev);
Johan Hedberg22f433d2014-08-01 11:13:32 +03002585 }
Johan Hedberg22102462013-10-05 12:01:06 +02002586
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002587 params = hci_conn_params_lookup(hdev, &conn->dst, conn->dst_type);
2588 if (params) {
2589 switch (params->auto_connect) {
2590 case HCI_AUTO_CONN_LINK_LOSS:
2591 if (ev->reason != HCI_ERROR_CONNECTION_TIMEOUT)
2592 break;
2593 /* Fall through */
2594
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02002595 case HCI_AUTO_CONN_DIRECT:
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002596 case HCI_AUTO_CONN_ALWAYS:
Johan Hedberg418025d2014-07-04 12:37:24 +03002597 list_del_init(&params->action);
2598 list_add(&params->action, &hdev->pend_le_conns);
2599 hci_update_background_scan(hdev);
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002600 break;
2601
2602 default:
2603 break;
2604 }
2605 }
2606
Andre Guedes38462202013-11-07 17:36:10 -03002607 type = conn->type;
Johan Hedberg22102462013-10-05 12:01:06 +02002608
Johan Hedberg3a6d5762015-02-18 14:53:58 +02002609 hci_disconn_cfm(conn, ev->reason);
Andre Guedes38462202013-11-07 17:36:10 -03002610 hci_conn_del(conn);
2611
2612 /* Re-enable advertising if necessary, since it might
2613 * have been disabled by the connection. From the
2614 * HCI_LE_Set_Advertise_Enable command description in
2615 * the core specification (v4.0):
2616 * "The Controller shall continue advertising until the Host
2617 * issues an LE_Set_Advertise_Enable command with
2618 * Advertising_Enable set to 0x00 (Advertising is disabled)
2619 * or until a connection is created or until the Advertising
2620 * is timed out due to Directed Advertising."
2621 */
2622 if (type == LE_LINK)
Johan Hedbergf2252572015-11-18 12:49:20 +02002623 hci_req_reenable_advertising(hdev);
Johan Hedbergf7520542011-01-20 12:34:39 +02002624
2625unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002626 hci_dev_unlock(hdev);
2627}
2628
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002629static void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002630{
2631 struct hci_ev_auth_complete *ev = (void *) skb->data;
2632 struct hci_conn *conn;
2633
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002634 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002635
2636 hci_dev_lock(hdev);
2637
2638 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002639 if (!conn)
2640 goto unlock;
2641
2642 if (!ev->status) {
Szymon Janc160b9252016-07-12 02:12:16 +02002643 clear_bit(HCI_CONN_AUTH_FAILURE, &conn->flags);
2644
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002645 if (!hci_conn_ssp_enabled(conn) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03002646 test_bit(HCI_CONN_REAUTH_PEND, &conn->flags)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002647 bt_dev_info(hdev, "re-auth of legacy device is not possible.");
Johan Hedberg2a611692011-02-19 12:06:00 -03002648 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002649 set_bit(HCI_CONN_AUTH, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002650 conn->sec_level = conn->pending_sec_level;
Johan Hedberg2a611692011-02-19 12:06:00 -03002651 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002652 } else {
Szymon Janc160b9252016-07-12 02:12:16 +02002653 if (ev->status == HCI_ERROR_PIN_OR_KEY_MISSING)
2654 set_bit(HCI_CONN_AUTH_FAILURE, &conn->flags);
2655
Johan Hedberge1e930f2014-09-08 17:09:49 -07002656 mgmt_auth_failed(conn, ev->status);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002657 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002658
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002659 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
2660 clear_bit(HCI_CONN_REAUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002661
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002662 if (conn->state == BT_CONFIG) {
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002663 if (!ev->status && hci_conn_ssp_enabled(conn)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002664 struct hci_cp_set_conn_encrypt cp;
2665 cp.handle = ev->handle;
2666 cp.encrypt = 0x01;
2667 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002668 &cp);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002669 } else {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002670 conn->state = BT_CONNECTED;
Johan Hedberg539c4962015-02-18 14:53:57 +02002671 hci_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002672 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002673 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002674 } else {
2675 hci_auth_cfm(conn, ev->status);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002676
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002677 hci_conn_hold(conn);
2678 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02002679 hci_conn_drop(conn);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002680 }
2681
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002682 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002683 if (!ev->status) {
2684 struct hci_cp_set_conn_encrypt cp;
2685 cp.handle = ev->handle;
2686 cp.encrypt = 0x01;
2687 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002688 &cp);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002689 } else {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002690 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002691 hci_encrypt_cfm(conn, ev->status, 0x00);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002692 }
2693 }
2694
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002695unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002696 hci_dev_unlock(hdev);
2697}
2698
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002699static void hci_remote_name_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002700{
Johan Hedberg127178d2010-11-18 22:22:29 +02002701 struct hci_ev_remote_name *ev = (void *) skb->data;
2702 struct hci_conn *conn;
2703
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002704 BT_DBG("%s", hdev->name);
2705
2706 hci_conn_check_pending(hdev);
Johan Hedberg127178d2010-11-18 22:22:29 +02002707
2708 hci_dev_lock(hdev);
2709
2710 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002711
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002712 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedbergb644ba32012-01-17 21:48:47 +02002713 goto check_auth;
2714
2715 if (ev->status == 0)
2716 hci_check_pending_name(hdev, conn, &ev->bdaddr, ev->name,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002717 strnlen(ev->name, HCI_MAX_NAME_LENGTH));
Johan Hedbergb644ba32012-01-17 21:48:47 +02002718 else
2719 hci_check_pending_name(hdev, conn, &ev->bdaddr, NULL, 0);
2720
2721check_auth:
Johan Hedberg79c6c702011-04-28 11:28:55 -07002722 if (!conn)
2723 goto unlock;
2724
2725 if (!hci_outgoing_auth_needed(hdev, conn))
2726 goto unlock;
2727
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002728 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002729 struct hci_cp_auth_requested cp;
Johan Hedberg977f8fc2014-07-17 15:35:39 +03002730
2731 set_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags);
2732
Johan Hedberg127178d2010-11-18 22:22:29 +02002733 cp.handle = __cpu_to_le16(conn->handle);
2734 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED, sizeof(cp), &cp);
2735 }
2736
Johan Hedberg79c6c702011-04-28 11:28:55 -07002737unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02002738 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002739}
2740
Johan Hedberg821f3762015-06-11 13:52:29 +03002741static void read_enc_key_size_complete(struct hci_dev *hdev, u8 status,
2742 u16 opcode, struct sk_buff *skb)
2743{
2744 const struct hci_rp_read_enc_key_size *rp;
2745 struct hci_conn *conn;
2746 u16 handle;
2747
2748 BT_DBG("%s status 0x%02x", hdev->name, status);
2749
2750 if (!skb || skb->len < sizeof(*rp)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002751 bt_dev_err(hdev, "invalid read key size response");
Johan Hedberg821f3762015-06-11 13:52:29 +03002752 return;
2753 }
2754
2755 rp = (void *)skb->data;
2756 handle = le16_to_cpu(rp->handle);
2757
2758 hci_dev_lock(hdev);
2759
2760 conn = hci_conn_hash_lookup_handle(hdev, handle);
2761 if (!conn)
2762 goto unlock;
2763
2764 /* If we fail to read the encryption key size, assume maximum
2765 * (which is the same we do also when this HCI command isn't
2766 * supported.
2767 */
2768 if (rp->status) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002769 bt_dev_err(hdev, "failed to read key size for handle %u",
2770 handle);
Johan Hedberg821f3762015-06-11 13:52:29 +03002771 conn->enc_key_size = HCI_LINK_KEY_SIZE;
2772 } else {
2773 conn->enc_key_size = rp->key_size;
2774 }
2775
2776 if (conn->state == BT_CONFIG) {
2777 conn->state = BT_CONNECTED;
2778 hci_connect_cfm(conn, 0);
2779 hci_conn_drop(conn);
2780 } else {
2781 u8 encrypt;
2782
2783 if (!test_bit(HCI_CONN_ENCRYPT, &conn->flags))
2784 encrypt = 0x00;
Johan Hedberg5d667ef2015-06-12 13:04:47 +03002785 else if (test_bit(HCI_CONN_AES_CCM, &conn->flags))
Johan Hedberg821f3762015-06-11 13:52:29 +03002786 encrypt = 0x02;
2787 else
2788 encrypt = 0x01;
2789
2790 hci_encrypt_cfm(conn, 0, encrypt);
2791 }
2792
2793unlock:
2794 hci_dev_unlock(hdev);
2795}
2796
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002797static void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002798{
2799 struct hci_ev_encrypt_change *ev = (void *) skb->data;
2800 struct hci_conn *conn;
2801
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002802 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002803
2804 hci_dev_lock(hdev);
2805
2806 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002807 if (!conn)
2808 goto unlock;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002809
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002810 if (!ev->status) {
2811 if (ev->encrypt) {
2812 /* Encryption implies authentication */
Johan Hedberg4dae2792014-06-24 17:03:50 +03002813 set_bit(HCI_CONN_AUTH, &conn->flags);
2814 set_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002815 conn->sec_level = conn->pending_sec_level;
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002816
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002817 /* P-256 authentication key implies FIPS */
2818 if (conn->key_type == HCI_LK_AUTH_COMBINATION_P256)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002819 set_bit(HCI_CONN_FIPS, &conn->flags);
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002820
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002821 if ((conn->type == ACL_LINK && ev->encrypt == 0x02) ||
2822 conn->type == LE_LINK)
2823 set_bit(HCI_CONN_AES_CCM, &conn->flags);
2824 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002825 clear_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002826 clear_bit(HCI_CONN_AES_CCM, &conn->flags);
2827 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002828 }
2829
Johan Hedberg7ed3fa22014-09-10 22:16:35 -07002830 /* We should disregard the current RPA and generate a new one
2831 * whenever the encryption procedure fails.
2832 */
2833 if (ev->status && conn->type == LE_LINK)
Marcel Holtmanna1536da2015-03-13 02:11:01 -07002834 hci_dev_set_flag(hdev, HCI_RPA_EXPIRED);
Johan Hedberg7ed3fa22014-09-10 22:16:35 -07002835
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002836 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
2837
2838 if (ev->status && conn->state == BT_CONNECTED) {
Szymon Janc160b9252016-07-12 02:12:16 +02002839 if (ev->status == HCI_ERROR_PIN_OR_KEY_MISSING)
2840 set_bit(HCI_CONN_AUTH_FAILURE, &conn->flags);
2841
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002842 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
2843 hci_conn_drop(conn);
2844 goto unlock;
2845 }
2846
Johan Hedberg035ad622015-06-11 13:52:28 +03002847 /* In Secure Connections Only mode, do not allow any connections
2848 * that are not encrypted with AES-CCM using a P-256 authenticated
2849 * combination key.
2850 */
2851 if (hci_dev_test_flag(hdev, HCI_SC_ONLY) &&
2852 (!test_bit(HCI_CONN_AES_CCM, &conn->flags) ||
2853 conn->key_type != HCI_LK_AUTH_COMBINATION_P256)) {
2854 hci_connect_cfm(conn, HCI_ERROR_AUTH_FAILURE);
2855 hci_conn_drop(conn);
2856 goto unlock;
2857 }
2858
Johan Hedberg821f3762015-06-11 13:52:29 +03002859 /* Try reading the encryption key size for encrypted ACL links */
2860 if (!ev->status && ev->encrypt && conn->type == ACL_LINK) {
2861 struct hci_cp_read_enc_key_size cp;
2862 struct hci_request req;
2863
2864 /* Only send HCI_Read_Encryption_Key_Size if the
2865 * controller really supports it. If it doesn't, assume
2866 * the default size (16).
2867 */
2868 if (!(hdev->commands[20] & 0x10)) {
2869 conn->enc_key_size = HCI_LINK_KEY_SIZE;
2870 goto notify;
2871 }
2872
2873 hci_req_init(&req, hdev);
2874
2875 cp.handle = cpu_to_le16(conn->handle);
2876 hci_req_add(&req, HCI_OP_READ_ENC_KEY_SIZE, sizeof(cp), &cp);
2877
2878 if (hci_req_run_skb(&req, read_enc_key_size_complete)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002879 bt_dev_err(hdev, "sending read key size failed");
Johan Hedberg821f3762015-06-11 13:52:29 +03002880 conn->enc_key_size = HCI_LINK_KEY_SIZE;
2881 goto notify;
2882 }
2883
2884 goto unlock;
2885 }
2886
2887notify:
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002888 if (conn->state == BT_CONFIG) {
2889 if (!ev->status)
2890 conn->state = BT_CONNECTED;
2891
Johan Hedberg539c4962015-02-18 14:53:57 +02002892 hci_connect_cfm(conn, ev->status);
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002893 hci_conn_drop(conn);
2894 } else
2895 hci_encrypt_cfm(conn, ev->status, ev->encrypt);
2896
Gustavo Padovana7d77232012-05-13 03:20:07 -03002897unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002898 hci_dev_unlock(hdev);
2899}
2900
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002901static void hci_change_link_key_complete_evt(struct hci_dev *hdev,
2902 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002903{
2904 struct hci_ev_change_link_key_complete *ev = (void *) skb->data;
2905 struct hci_conn *conn;
2906
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002907 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002908
2909 hci_dev_lock(hdev);
2910
2911 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
2912 if (conn) {
2913 if (!ev->status)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002914 set_bit(HCI_CONN_SECURE, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002915
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002916 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002917
2918 hci_key_change_cfm(conn, ev->status);
2919 }
2920
2921 hci_dev_unlock(hdev);
2922}
2923
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002924static void hci_remote_features_evt(struct hci_dev *hdev,
2925 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002926{
2927 struct hci_ev_remote_features *ev = (void *) skb->data;
2928 struct hci_conn *conn;
2929
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002930 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002931
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002932 hci_dev_lock(hdev);
2933
2934 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02002935 if (!conn)
2936 goto unlock;
Marcel Holtmann769be972008-07-14 20:13:49 +02002937
Johan Hedbergccd556f2010-11-10 17:11:51 +02002938 if (!ev->status)
Johan Hedbergcad718e2013-04-17 15:00:51 +03002939 memcpy(conn->features[0], ev->features, 8);
Johan Hedbergccd556f2010-11-10 17:11:51 +02002940
2941 if (conn->state != BT_CONFIG)
2942 goto unlock;
2943
Szymon Jancac363cf2015-01-29 16:36:59 +01002944 if (!ev->status && lmp_ext_feat_capable(hdev) &&
2945 lmp_ext_feat_capable(conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02002946 struct hci_cp_read_remote_ext_features cp;
2947 cp.handle = ev->handle;
2948 cp.page = 0x01;
2949 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002950 sizeof(cp), &cp);
Johan Hedberg392599b2010-11-18 22:22:28 +02002951 goto unlock;
2952 }
2953
Johan Hedberg671267b2012-05-12 16:11:50 -03002954 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002955 struct hci_cp_remote_name_req cp;
2956 memset(&cp, 0, sizeof(cp));
2957 bacpy(&cp.bdaddr, &conn->dst);
2958 cp.pscan_rep_mode = 0x02;
2959 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002960 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00002961 mgmt_device_connected(hdev, conn, 0, NULL, 0);
Johan Hedberg392599b2010-11-18 22:22:28 +02002962
Johan Hedberg127178d2010-11-18 22:22:29 +02002963 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02002964 conn->state = BT_CONNECTED;
Johan Hedberg539c4962015-02-18 14:53:57 +02002965 hci_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002966 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02002967 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002968
Johan Hedbergccd556f2010-11-10 17:11:51 +02002969unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002970 hci_dev_unlock(hdev);
2971}
2972
Johan Hedberge62144872015-04-02 13:41:08 +03002973static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb,
2974 u16 *opcode, u8 *status,
2975 hci_req_complete_t *req_complete,
2976 hci_req_complete_skb_t *req_complete_skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002977{
2978 struct hci_ev_cmd_complete *ev = (void *) skb->data;
Johan Hedberge62144872015-04-02 13:41:08 +03002979
2980 *opcode = __le16_to_cpu(ev->opcode);
2981 *status = skb->data[sizeof(*ev)];
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002982
2983 skb_pull(skb, sizeof(*ev));
2984
Johan Hedberge62144872015-04-02 13:41:08 +03002985 switch (*opcode) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002986 case HCI_OP_INQUIRY_CANCEL:
2987 hci_cc_inquiry_cancel(hdev, skb);
2988 break;
2989
Andre Guedes4d934832012-03-21 00:03:35 -03002990 case HCI_OP_PERIODIC_INQ:
2991 hci_cc_periodic_inq(hdev, skb);
2992 break;
2993
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002994 case HCI_OP_EXIT_PERIODIC_INQ:
2995 hci_cc_exit_periodic_inq(hdev, skb);
2996 break;
2997
2998 case HCI_OP_REMOTE_NAME_REQ_CANCEL:
2999 hci_cc_remote_name_req_cancel(hdev, skb);
3000 break;
3001
3002 case HCI_OP_ROLE_DISCOVERY:
3003 hci_cc_role_discovery(hdev, skb);
3004 break;
3005
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02003006 case HCI_OP_READ_LINK_POLICY:
3007 hci_cc_read_link_policy(hdev, skb);
3008 break;
3009
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003010 case HCI_OP_WRITE_LINK_POLICY:
3011 hci_cc_write_link_policy(hdev, skb);
3012 break;
3013
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02003014 case HCI_OP_READ_DEF_LINK_POLICY:
3015 hci_cc_read_def_link_policy(hdev, skb);
3016 break;
3017
3018 case HCI_OP_WRITE_DEF_LINK_POLICY:
3019 hci_cc_write_def_link_policy(hdev, skb);
3020 break;
3021
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003022 case HCI_OP_RESET:
3023 hci_cc_reset(hdev, skb);
3024 break;
3025
Marcel Holtmannc2f0f972015-01-12 09:21:25 -08003026 case HCI_OP_READ_STORED_LINK_KEY:
3027 hci_cc_read_stored_link_key(hdev, skb);
3028 break;
3029
Marcel Holtmanna93661202015-01-12 09:21:28 -08003030 case HCI_OP_DELETE_STORED_LINK_KEY:
3031 hci_cc_delete_stored_link_key(hdev, skb);
3032 break;
3033
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003034 case HCI_OP_WRITE_LOCAL_NAME:
3035 hci_cc_write_local_name(hdev, skb);
3036 break;
3037
3038 case HCI_OP_READ_LOCAL_NAME:
3039 hci_cc_read_local_name(hdev, skb);
3040 break;
3041
3042 case HCI_OP_WRITE_AUTH_ENABLE:
3043 hci_cc_write_auth_enable(hdev, skb);
3044 break;
3045
3046 case HCI_OP_WRITE_ENCRYPT_MODE:
3047 hci_cc_write_encrypt_mode(hdev, skb);
3048 break;
3049
3050 case HCI_OP_WRITE_SCAN_ENABLE:
3051 hci_cc_write_scan_enable(hdev, skb);
3052 break;
3053
3054 case HCI_OP_READ_CLASS_OF_DEV:
3055 hci_cc_read_class_of_dev(hdev, skb);
3056 break;
3057
3058 case HCI_OP_WRITE_CLASS_OF_DEV:
3059 hci_cc_write_class_of_dev(hdev, skb);
3060 break;
3061
3062 case HCI_OP_READ_VOICE_SETTING:
3063 hci_cc_read_voice_setting(hdev, skb);
3064 break;
3065
3066 case HCI_OP_WRITE_VOICE_SETTING:
3067 hci_cc_write_voice_setting(hdev, skb);
3068 break;
3069
Marcel Holtmannb4cb9fb2013-10-14 13:56:16 -07003070 case HCI_OP_READ_NUM_SUPPORTED_IAC:
3071 hci_cc_read_num_supported_iac(hdev, skb);
3072 break;
3073
Marcel Holtmann333140b2008-07-14 20:13:48 +02003074 case HCI_OP_WRITE_SSP_MODE:
3075 hci_cc_write_ssp_mode(hdev, skb);
3076 break;
3077
Marcel Holtmanneac83dc2014-01-10 02:07:23 -08003078 case HCI_OP_WRITE_SC_SUPPORT:
3079 hci_cc_write_sc_support(hdev, skb);
3080 break;
3081
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003082 case HCI_OP_READ_LOCAL_VERSION:
3083 hci_cc_read_local_version(hdev, skb);
3084 break;
3085
3086 case HCI_OP_READ_LOCAL_COMMANDS:
3087 hci_cc_read_local_commands(hdev, skb);
3088 break;
3089
3090 case HCI_OP_READ_LOCAL_FEATURES:
3091 hci_cc_read_local_features(hdev, skb);
3092 break;
3093
Andre Guedes971e3a42011-06-30 19:20:52 -03003094 case HCI_OP_READ_LOCAL_EXT_FEATURES:
3095 hci_cc_read_local_ext_features(hdev, skb);
3096 break;
3097
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003098 case HCI_OP_READ_BUFFER_SIZE:
3099 hci_cc_read_buffer_size(hdev, skb);
3100 break;
3101
3102 case HCI_OP_READ_BD_ADDR:
3103 hci_cc_read_bd_addr(hdev, skb);
3104 break;
3105
Johan Hedbergf332ec62013-03-15 17:07:11 -05003106 case HCI_OP_READ_PAGE_SCAN_ACTIVITY:
3107 hci_cc_read_page_scan_activity(hdev, skb);
3108 break;
3109
Johan Hedberg4a3ee762013-03-15 17:07:12 -05003110 case HCI_OP_WRITE_PAGE_SCAN_ACTIVITY:
3111 hci_cc_write_page_scan_activity(hdev, skb);
3112 break;
3113
Johan Hedbergf332ec62013-03-15 17:07:11 -05003114 case HCI_OP_READ_PAGE_SCAN_TYPE:
3115 hci_cc_read_page_scan_type(hdev, skb);
3116 break;
3117
Johan Hedberg4a3ee762013-03-15 17:07:12 -05003118 case HCI_OP_WRITE_PAGE_SCAN_TYPE:
3119 hci_cc_write_page_scan_type(hdev, skb);
3120 break;
3121
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +02003122 case HCI_OP_READ_DATA_BLOCK_SIZE:
3123 hci_cc_read_data_block_size(hdev, skb);
3124 break;
3125
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +02003126 case HCI_OP_READ_FLOW_CONTROL_MODE:
3127 hci_cc_read_flow_control_mode(hdev, skb);
3128 break;
3129
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +03003130 case HCI_OP_READ_LOCAL_AMP_INFO:
3131 hci_cc_read_local_amp_info(hdev, skb);
3132 break;
3133
Johan Hedberg33f35722014-06-28 17:54:06 +03003134 case HCI_OP_READ_CLOCK:
3135 hci_cc_read_clock(hdev, skb);
3136 break;
3137
Johan Hedbergd5859e22011-01-25 01:19:58 +02003138 case HCI_OP_READ_INQ_RSP_TX_POWER:
3139 hci_cc_read_inq_rsp_tx_power(hdev, skb);
3140 break;
3141
Johan Hedberg980e1a52011-01-22 06:10:07 +02003142 case HCI_OP_PIN_CODE_REPLY:
3143 hci_cc_pin_code_reply(hdev, skb);
3144 break;
3145
3146 case HCI_OP_PIN_CODE_NEG_REPLY:
3147 hci_cc_pin_code_neg_reply(hdev, skb);
3148 break;
3149
Szymon Jancc35938b2011-03-22 13:12:21 +01003150 case HCI_OP_READ_LOCAL_OOB_DATA:
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08003151 hci_cc_read_local_oob_data(hdev, skb);
3152 break;
3153
3154 case HCI_OP_READ_LOCAL_OOB_EXT_DATA:
3155 hci_cc_read_local_oob_ext_data(hdev, skb);
Szymon Jancc35938b2011-03-22 13:12:21 +01003156 break;
3157
Ville Tervo6ed58ec2011-02-10 22:38:48 -03003158 case HCI_OP_LE_READ_BUFFER_SIZE:
3159 hci_cc_le_read_buffer_size(hdev, skb);
3160 break;
3161
Johan Hedberg60e77322013-01-22 14:01:59 +02003162 case HCI_OP_LE_READ_LOCAL_FEATURES:
3163 hci_cc_le_read_local_features(hdev, skb);
3164 break;
3165
Johan Hedberg8fa19092012-10-19 20:57:49 +03003166 case HCI_OP_LE_READ_ADV_TX_POWER:
3167 hci_cc_le_read_adv_tx_power(hdev, skb);
3168 break;
3169
Johan Hedberga5c29682011-02-19 12:05:57 -03003170 case HCI_OP_USER_CONFIRM_REPLY:
3171 hci_cc_user_confirm_reply(hdev, skb);
3172 break;
3173
3174 case HCI_OP_USER_CONFIRM_NEG_REPLY:
3175 hci_cc_user_confirm_neg_reply(hdev, skb);
3176 break;
3177
Brian Gix1143d452011-11-23 08:28:34 -08003178 case HCI_OP_USER_PASSKEY_REPLY:
3179 hci_cc_user_passkey_reply(hdev, skb);
3180 break;
3181
3182 case HCI_OP_USER_PASSKEY_NEG_REPLY:
3183 hci_cc_user_passkey_neg_reply(hdev, skb);
Szymon Janc16cde992012-04-13 12:32:42 +02003184 break;
Andre Guedes07f7fa52011-12-02 21:13:31 +09003185
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08003186 case HCI_OP_LE_SET_RANDOM_ADDR:
3187 hci_cc_le_set_random_addr(hdev, skb);
3188 break;
3189
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01003190 case HCI_OP_LE_SET_ADV_ENABLE:
3191 hci_cc_le_set_adv_enable(hdev, skb);
3192 break;
3193
Marcel Holtmann533553f2014-03-21 12:18:10 -07003194 case HCI_OP_LE_SET_SCAN_PARAM:
3195 hci_cc_le_set_scan_param(hdev, skb);
3196 break;
3197
Andre Guedeseb9d91f2011-05-26 16:23:52 -03003198 case HCI_OP_LE_SET_SCAN_ENABLE:
3199 hci_cc_le_set_scan_enable(hdev, skb);
3200 break;
3201
Johan Hedbergcf1d0812013-01-22 14:02:00 +02003202 case HCI_OP_LE_READ_WHITE_LIST_SIZE:
3203 hci_cc_le_read_white_list_size(hdev, skb);
3204 break;
3205
Marcel Holtmann0f36b582014-02-27 20:37:31 -08003206 case HCI_OP_LE_CLEAR_WHITE_LIST:
3207 hci_cc_le_clear_white_list(hdev, skb);
3208 break;
3209
3210 case HCI_OP_LE_ADD_TO_WHITE_LIST:
3211 hci_cc_le_add_to_white_list(hdev, skb);
3212 break;
3213
3214 case HCI_OP_LE_DEL_FROM_WHITE_LIST:
3215 hci_cc_le_del_from_white_list(hdev, skb);
3216 break;
3217
Johan Hedberg9b008c02013-01-22 14:02:01 +02003218 case HCI_OP_LE_READ_SUPPORTED_STATES:
3219 hci_cc_le_read_supported_states(hdev, skb);
3220 break;
3221
Marcel Holtmanna8e1bfa2014-12-20 16:28:40 +01003222 case HCI_OP_LE_READ_DEF_DATA_LEN:
3223 hci_cc_le_read_def_data_len(hdev, skb);
3224 break;
3225
3226 case HCI_OP_LE_WRITE_DEF_DATA_LEN:
3227 hci_cc_le_write_def_data_len(hdev, skb);
3228 break;
3229
Ankit Navik545f2592018-06-29 12:13:20 +05303230 case HCI_OP_LE_CLEAR_RESOLV_LIST:
3231 hci_cc_le_clear_resolv_list(hdev, skb);
3232 break;
3233
Ankit Navikcfdb0c22018-06-29 12:12:50 +05303234 case HCI_OP_LE_READ_RESOLV_LIST_SIZE:
3235 hci_cc_le_read_resolv_list_size(hdev, skb);
3236 break;
3237
Marcel Holtmanna8e1bfa2014-12-20 16:28:40 +01003238 case HCI_OP_LE_READ_MAX_DATA_LEN:
3239 hci_cc_le_read_max_data_len(hdev, skb);
3240 break;
3241
Andre Guedesf9b49302011-06-30 19:20:53 -03003242 case HCI_OP_WRITE_LE_HOST_SUPPORTED:
3243 hci_cc_write_le_host_supported(hdev, skb);
3244 break;
3245
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02003246 case HCI_OP_LE_SET_ADV_PARAM:
3247 hci_cc_set_adv_param(hdev, skb);
3248 break;
3249
Andrzej Kaczmarek5ae76a92014-05-08 15:32:08 +02003250 case HCI_OP_READ_RSSI:
3251 hci_cc_read_rssi(hdev, skb);
3252 break;
3253
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02003254 case HCI_OP_READ_TX_POWER:
3255 hci_cc_read_tx_power(hdev, skb);
3256 break;
3257
Marcel Holtmannc50b33c2015-01-31 15:07:52 -08003258 case HCI_OP_WRITE_SSP_DEBUG_MODE:
3259 hci_cc_write_ssp_debug_mode(hdev, skb);
3260 break;
3261
Jaganath Kanakkasserya2344b92018-07-06 17:05:28 +05303262 case HCI_OP_LE_SET_EXT_SCAN_PARAMS:
3263 hci_cc_le_set_ext_scan_param(hdev, skb);
3264 break;
3265
3266 case HCI_OP_LE_SET_EXT_SCAN_ENABLE:
3267 hci_cc_le_set_ext_scan_enable(hdev, skb);
3268 break;
3269
Jaganath Kanakkassery0314f282018-07-19 17:09:35 +05303270 case HCI_OP_LE_SET_DEFAULT_PHY:
3271 hci_cc_le_set_default_phy(hdev, skb);
3272 break;
3273
Jaganath Kanakkassery6b49bcb2018-07-19 17:09:40 +05303274 case HCI_OP_LE_READ_NUM_SUPPORTED_ADV_SETS:
3275 hci_cc_le_read_num_adv_sets(hdev, skb);
3276 break;
3277
Jaganath Kanakkasseryde181e82018-07-19 17:09:41 +05303278 case HCI_OP_LE_SET_EXT_ADV_PARAMS:
3279 hci_cc_set_ext_adv_param(hdev, skb);
3280 break;
3281
3282 case HCI_OP_LE_SET_EXT_ADV_ENABLE:
3283 hci_cc_le_set_ext_adv_enable(hdev, skb);
3284 break;
3285
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003286 default:
Johan Hedberge62144872015-04-02 13:41:08 +03003287 BT_DBG("%s opcode 0x%4.4x", hdev->name, *opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003288 break;
3289 }
3290
Johan Hedberge62144872015-04-02 13:41:08 +03003291 if (*opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02003292 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02003293
Johan Hedberg600b2152015-03-28 11:17:36 +02003294 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags))
3295 atomic_set(&hdev->cmd_cnt, 1);
3296
Johan Hedberge62144872015-04-02 13:41:08 +03003297 hci_req_cmd_complete(hdev, *opcode, *status, req_complete,
3298 req_complete_skb);
Johan Hedberg9238f362013-03-05 20:37:48 +02003299
Johan Hedberg600b2152015-03-28 11:17:36 +02003300 if (atomic_read(&hdev->cmd_cnt) && !skb_queue_empty(&hdev->cmd_q))
3301 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003302}
3303
Johan Hedberge62144872015-04-02 13:41:08 +03003304static void hci_cmd_status_evt(struct hci_dev *hdev, struct sk_buff *skb,
3305 u16 *opcode, u8 *status,
3306 hci_req_complete_t *req_complete,
3307 hci_req_complete_skb_t *req_complete_skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003308{
3309 struct hci_ev_cmd_status *ev = (void *) skb->data;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003310
3311 skb_pull(skb, sizeof(*ev));
3312
Johan Hedberge62144872015-04-02 13:41:08 +03003313 *opcode = __le16_to_cpu(ev->opcode);
3314 *status = ev->status;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003315
Johan Hedberge62144872015-04-02 13:41:08 +03003316 switch (*opcode) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003317 case HCI_OP_INQUIRY:
3318 hci_cs_inquiry(hdev, ev->status);
3319 break;
3320
3321 case HCI_OP_CREATE_CONN:
3322 hci_cs_create_conn(hdev, ev->status);
3323 break;
3324
Kuba Pawlak9645c762014-11-06 19:36:53 +01003325 case HCI_OP_DISCONNECT:
3326 hci_cs_disconnect(hdev, ev->status);
3327 break;
3328
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003329 case HCI_OP_ADD_SCO:
3330 hci_cs_add_sco(hdev, ev->status);
3331 break;
3332
Marcel Holtmannf8558552008-07-14 20:13:49 +02003333 case HCI_OP_AUTH_REQUESTED:
3334 hci_cs_auth_requested(hdev, ev->status);
3335 break;
3336
3337 case HCI_OP_SET_CONN_ENCRYPT:
3338 hci_cs_set_conn_encrypt(hdev, ev->status);
3339 break;
3340
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003341 case HCI_OP_REMOTE_NAME_REQ:
3342 hci_cs_remote_name_req(hdev, ev->status);
3343 break;
3344
Marcel Holtmann769be972008-07-14 20:13:49 +02003345 case HCI_OP_READ_REMOTE_FEATURES:
3346 hci_cs_read_remote_features(hdev, ev->status);
3347 break;
3348
3349 case HCI_OP_READ_REMOTE_EXT_FEATURES:
3350 hci_cs_read_remote_ext_features(hdev, ev->status);
3351 break;
3352
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003353 case HCI_OP_SETUP_SYNC_CONN:
3354 hci_cs_setup_sync_conn(hdev, ev->status);
3355 break;
3356
3357 case HCI_OP_SNIFF_MODE:
3358 hci_cs_sniff_mode(hdev, ev->status);
3359 break;
3360
3361 case HCI_OP_EXIT_SNIFF_MODE:
3362 hci_cs_exit_sniff_mode(hdev, ev->status);
3363 break;
3364
Kuba Pawlak50fc85f2014-11-06 19:36:52 +01003365 case HCI_OP_SWITCH_ROLE:
3366 hci_cs_switch_role(hdev, ev->status);
3367 break;
3368
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02003369 case HCI_OP_LE_CREATE_CONN:
3370 hci_cs_le_create_conn(hdev, ev->status);
3371 break;
3372
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07003373 case HCI_OP_LE_READ_REMOTE_FEATURES:
3374 hci_cs_le_read_remote_features(hdev, ev->status);
3375 break;
3376
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02003377 case HCI_OP_LE_START_ENC:
3378 hci_cs_le_start_enc(hdev, ev->status);
3379 break;
3380
Jaganath Kanakkassery4d94f952018-07-06 22:50:32 +02003381 case HCI_OP_LE_EXT_CREATE_CONN:
3382 hci_cs_le_ext_create_conn(hdev, ev->status);
3383 break;
3384
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003385 default:
Johan Hedberge62144872015-04-02 13:41:08 +03003386 BT_DBG("%s opcode 0x%4.4x", hdev->name, *opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003387 break;
3388 }
3389
Johan Hedberge62144872015-04-02 13:41:08 +03003390 if (*opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02003391 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02003392
Johan Hedberg600b2152015-03-28 11:17:36 +02003393 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags))
3394 atomic_set(&hdev->cmd_cnt, 1);
3395
Johan Hedberg444c6dd2015-04-02 13:41:07 +03003396 /* Indicate request completion if the command failed. Also, if
3397 * we're not waiting for a special event and we get a success
3398 * command status we should try to flag the request as completed
3399 * (since for this kind of commands there will not be a command
3400 * complete event).
3401 */
Johan Hedberg02350a72013-04-03 21:50:29 +03003402 if (ev->status ||
Marcel Holtmann242c0eb2015-10-25 22:45:53 +01003403 (hdev->sent_cmd && !bt_cb(hdev->sent_cmd)->hci.req_event))
Johan Hedberge62144872015-04-02 13:41:08 +03003404 hci_req_cmd_complete(hdev, *opcode, ev->status, req_complete,
3405 req_complete_skb);
Johan Hedberg9238f362013-03-05 20:37:48 +02003406
Johan Hedberg600b2152015-03-28 11:17:36 +02003407 if (atomic_read(&hdev->cmd_cnt) && !skb_queue_empty(&hdev->cmd_q))
3408 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003409}
3410
Marcel Holtmann24dfa342014-11-02 02:56:41 +01003411static void hci_hardware_error_evt(struct hci_dev *hdev, struct sk_buff *skb)
3412{
3413 struct hci_ev_hardware_error *ev = (void *) skb->data;
3414
Marcel Holtmannc7741d12015-01-28 11:09:55 -08003415 hdev->hw_error_code = ev->code;
3416
3417 queue_work(hdev->req_workqueue, &hdev->error_reset);
Marcel Holtmann24dfa342014-11-02 02:56:41 +01003418}
3419
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003420static void hci_role_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003421{
3422 struct hci_ev_role_change *ev = (void *) skb->data;
3423 struct hci_conn *conn;
3424
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003425 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003426
3427 hci_dev_lock(hdev);
3428
3429 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3430 if (conn) {
Johan Hedberg40bef302014-07-16 11:42:27 +03003431 if (!ev->status)
3432 conn->role = ev->role;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003433
Johan Hedberg51a8efd2012-01-16 06:10:31 +02003434 clear_bit(HCI_CONN_RSWITCH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003435
3436 hci_role_switch_cfm(conn, ev->status, ev->role);
3437 }
3438
3439 hci_dev_unlock(hdev);
3440}
3441
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003442static void hci_num_comp_pkts_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003443{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003444 struct hci_ev_num_comp_pkts *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003445 int i;
3446
Andrei Emeltchenko32ac5b92011-12-19 16:31:29 +02003447 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_PACKET_BASED) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003448 bt_dev_err(hdev, "wrong event for mode %d", hdev->flow_ctl_mode);
Andrei Emeltchenko32ac5b92011-12-19 16:31:29 +02003449 return;
3450 }
3451
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02003452 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03003453 ev->num_hndl * sizeof(struct hci_comp_pkts_info)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003454 BT_DBG("%s bad parameters", hdev->name);
3455 return;
3456 }
3457
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02003458 BT_DBG("%s num_hndl %d", hdev->name, ev->num_hndl);
3459
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02003460 for (i = 0; i < ev->num_hndl; i++) {
3461 struct hci_comp_pkts_info *info = &ev->handles[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07003462 struct hci_conn *conn;
3463 __u16 handle, count;
3464
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02003465 handle = __le16_to_cpu(info->handle);
3466 count = __le16_to_cpu(info->count);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003467
3468 conn = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003469 if (!conn)
3470 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003471
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003472 conn->sent -= count;
3473
3474 switch (conn->type) {
3475 case ACL_LINK:
3476 hdev->acl_cnt += count;
3477 if (hdev->acl_cnt > hdev->acl_pkts)
3478 hdev->acl_cnt = hdev->acl_pkts;
3479 break;
3480
3481 case LE_LINK:
3482 if (hdev->le_pkts) {
3483 hdev->le_cnt += count;
3484 if (hdev->le_cnt > hdev->le_pkts)
3485 hdev->le_cnt = hdev->le_pkts;
3486 } else {
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02003487 hdev->acl_cnt += count;
3488 if (hdev->acl_cnt > hdev->acl_pkts)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003489 hdev->acl_cnt = hdev->acl_pkts;
3490 }
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003491 break;
3492
3493 case SCO_LINK:
3494 hdev->sco_cnt += count;
3495 if (hdev->sco_cnt > hdev->sco_pkts)
3496 hdev->sco_cnt = hdev->sco_pkts;
3497 break;
3498
3499 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003500 bt_dev_err(hdev, "unknown type %d conn %p",
3501 conn->type, conn);
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003502 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003503 }
3504 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003505
Gustavo F. Padovan3eff45e2011-12-15 00:50:02 -02003506 queue_work(hdev->workqueue, &hdev->tx_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003507}
3508
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003509static struct hci_conn *__hci_conn_lookup_handle(struct hci_dev *hdev,
3510 __u16 handle)
3511{
3512 struct hci_chan *chan;
3513
3514 switch (hdev->dev_type) {
Marcel Holtmannca8bee52016-07-05 14:30:14 +02003515 case HCI_PRIMARY:
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003516 return hci_conn_hash_lookup_handle(hdev, handle);
3517 case HCI_AMP:
3518 chan = hci_chan_lookup_handle(hdev, handle);
3519 if (chan)
3520 return chan->conn;
3521 break;
3522 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003523 bt_dev_err(hdev, "unknown dev_type %d", hdev->dev_type);
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003524 break;
3525 }
3526
3527 return NULL;
3528}
3529
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003530static void hci_num_comp_blocks_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003531{
3532 struct hci_ev_num_comp_blocks *ev = (void *) skb->data;
3533 int i;
3534
3535 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_BLOCK_BASED) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003536 bt_dev_err(hdev, "wrong event for mode %d", hdev->flow_ctl_mode);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003537 return;
3538 }
3539
3540 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03003541 ev->num_hndl * sizeof(struct hci_comp_blocks_info)) {
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003542 BT_DBG("%s bad parameters", hdev->name);
3543 return;
3544 }
3545
3546 BT_DBG("%s num_blocks %d num_hndl %d", hdev->name, ev->num_blocks,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003547 ev->num_hndl);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003548
3549 for (i = 0; i < ev->num_hndl; i++) {
3550 struct hci_comp_blocks_info *info = &ev->handles[i];
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003551 struct hci_conn *conn = NULL;
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003552 __u16 handle, block_count;
3553
3554 handle = __le16_to_cpu(info->handle);
3555 block_count = __le16_to_cpu(info->blocks);
3556
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003557 conn = __hci_conn_lookup_handle(hdev, handle);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003558 if (!conn)
3559 continue;
3560
3561 conn->sent -= block_count;
3562
3563 switch (conn->type) {
3564 case ACL_LINK:
Andrei Emeltchenkobd1eb662012-10-10 17:38:30 +03003565 case AMP_LINK:
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003566 hdev->block_cnt += block_count;
3567 if (hdev->block_cnt > hdev->num_blocks)
3568 hdev->block_cnt = hdev->num_blocks;
3569 break;
3570
3571 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003572 bt_dev_err(hdev, "unknown type %d conn %p",
3573 conn->type, conn);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003574 break;
3575 }
3576 }
3577
3578 queue_work(hdev->workqueue, &hdev->tx_work);
3579}
3580
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003581static void hci_mode_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003582{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003583 struct hci_ev_mode_change *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003584 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003585
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003586 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003587
3588 hci_dev_lock(hdev);
3589
Marcel Holtmann04837f62006-07-03 10:02:33 +02003590 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3591 if (conn) {
3592 conn->mode = ev->mode;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003593
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003594 if (!test_and_clear_bit(HCI_CONN_MODE_CHANGE_PEND,
3595 &conn->flags)) {
Marcel Holtmann04837f62006-07-03 10:02:33 +02003596 if (conn->mode == HCI_CM_ACTIVE)
Johan Hedberg58a681e2012-01-16 06:47:28 +02003597 set_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003598 else
Johan Hedberg58a681e2012-01-16 06:47:28 +02003599 clear_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003600 }
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003601
Johan Hedberg51a8efd2012-01-16 06:10:31 +02003602 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003603 hci_sco_setup(conn, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003604 }
3605
3606 hci_dev_unlock(hdev);
3607}
3608
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003609static void hci_pin_code_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003610{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003611 struct hci_ev_pin_code_req *ev = (void *) skb->data;
3612 struct hci_conn *conn;
3613
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003614 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003615
3616 hci_dev_lock(hdev);
3617
3618 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003619 if (!conn)
3620 goto unlock;
3621
3622 if (conn->state == BT_CONNECTED) {
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003623 hci_conn_hold(conn);
3624 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003625 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003626 }
3627
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003628 if (!hci_dev_test_flag(hdev, HCI_BONDABLE) &&
Johan Hedberg2f407f02014-07-17 15:35:40 +03003629 !test_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags)) {
Johan Hedberg03b555e2011-01-04 15:40:05 +02003630 hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003631 sizeof(ev->bdaddr), &ev->bdaddr);
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003632 } else if (hci_dev_test_flag(hdev, HCI_MGMT)) {
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003633 u8 secure;
3634
3635 if (conn->pending_sec_level == BT_SECURITY_HIGH)
3636 secure = 1;
3637 else
3638 secure = 0;
3639
Johan Hedberg744cf192011-11-08 20:40:14 +02003640 mgmt_pin_code_request(hdev, &ev->bdaddr, secure);
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003641 }
Johan Hedberg980e1a52011-01-22 06:10:07 +02003642
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003643unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003644 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003645}
3646
Johan Hedbergcb6f3f72014-11-19 14:53:04 +02003647static void conn_set_key(struct hci_conn *conn, u8 key_type, u8 pin_len)
3648{
3649 if (key_type == HCI_LK_CHANGED_COMBINATION)
3650 return;
3651
3652 conn->pin_length = pin_len;
3653 conn->key_type = key_type;
3654
3655 switch (key_type) {
3656 case HCI_LK_LOCAL_UNIT:
3657 case HCI_LK_REMOTE_UNIT:
3658 case HCI_LK_DEBUG_COMBINATION:
3659 return;
3660 case HCI_LK_COMBINATION:
3661 if (pin_len == 16)
3662 conn->pending_sec_level = BT_SECURITY_HIGH;
3663 else
3664 conn->pending_sec_level = BT_SECURITY_MEDIUM;
3665 break;
3666 case HCI_LK_UNAUTH_COMBINATION_P192:
3667 case HCI_LK_UNAUTH_COMBINATION_P256:
3668 conn->pending_sec_level = BT_SECURITY_MEDIUM;
3669 break;
3670 case HCI_LK_AUTH_COMBINATION_P192:
3671 conn->pending_sec_level = BT_SECURITY_HIGH;
3672 break;
3673 case HCI_LK_AUTH_COMBINATION_P256:
3674 conn->pending_sec_level = BT_SECURITY_FIPS;
3675 break;
3676 }
3677}
3678
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003679static void hci_link_key_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003680{
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003681 struct hci_ev_link_key_req *ev = (void *) skb->data;
3682 struct hci_cp_link_key_reply cp;
3683 struct hci_conn *conn;
3684 struct link_key *key;
3685
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003686 BT_DBG("%s", hdev->name);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003687
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003688 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003689 return;
3690
3691 hci_dev_lock(hdev);
3692
3693 key = hci_find_link_key(hdev, &ev->bdaddr);
3694 if (!key) {
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003695 BT_DBG("%s link key not found for %pMR", hdev->name,
3696 &ev->bdaddr);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003697 goto not_found;
3698 }
3699
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003700 BT_DBG("%s found key type %u for %pMR", hdev->name, key->type,
3701 &ev->bdaddr);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003702
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003703 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003704 if (conn) {
Johan Hedbergfe8bc5a2014-08-14 12:33:17 +03003705 clear_bit(HCI_CONN_NEW_LINK_KEY, &conn->flags);
3706
Marcel Holtmann66138ce2014-01-10 02:07:20 -08003707 if ((key->type == HCI_LK_UNAUTH_COMBINATION_P192 ||
3708 key->type == HCI_LK_UNAUTH_COMBINATION_P256) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03003709 conn->auth_type != 0xff && (conn->auth_type & 0x01)) {
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003710 BT_DBG("%s ignoring unauthenticated key", hdev->name);
3711 goto not_found;
3712 }
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003713
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003714 if (key->type == HCI_LK_COMBINATION && key->pin_len < 16 &&
Johan Hedbergf3fb0b52014-06-02 10:12:44 +03003715 (conn->pending_sec_level == BT_SECURITY_HIGH ||
3716 conn->pending_sec_level == BT_SECURITY_FIPS)) {
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003717 BT_DBG("%s ignoring key unauthenticated for high security",
3718 hdev->name);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003719 goto not_found;
3720 }
3721
Johan Hedbergcb6f3f72014-11-19 14:53:04 +02003722 conn_set_key(conn, key->type, key->pin_len);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003723 }
3724
3725 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9b3b4462012-05-23 11:31:20 +03003726 memcpy(cp.link_key, key->val, HCI_LINK_KEY_SIZE);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003727
3728 hci_send_cmd(hdev, HCI_OP_LINK_KEY_REPLY, sizeof(cp), &cp);
3729
3730 hci_dev_unlock(hdev);
3731
3732 return;
3733
3734not_found:
3735 hci_send_cmd(hdev, HCI_OP_LINK_KEY_NEG_REPLY, 6, &ev->bdaddr);
3736 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003737}
3738
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003739static void hci_link_key_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003740{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003741 struct hci_ev_link_key_notify *ev = (void *) skb->data;
3742 struct hci_conn *conn;
Johan Hedberg7652ff62014-06-24 13:15:49 +03003743 struct link_key *key;
3744 bool persistent;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003745 u8 pin_len = 0;
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003746
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003747 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003748
3749 hci_dev_lock(hdev);
3750
3751 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg82c13d42014-12-03 11:03:06 +02003752 if (!conn)
3753 goto unlock;
3754
3755 hci_conn_hold(conn);
3756 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
3757 hci_conn_drop(conn);
3758
Johan Hedbergfe8bc5a2014-08-14 12:33:17 +03003759 set_bit(HCI_CONN_NEW_LINK_KEY, &conn->flags);
Johan Hedberg82c13d42014-12-03 11:03:06 +02003760 conn_set_key(conn, ev->key_type, conn->pin_length);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003761
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003762 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg7652ff62014-06-24 13:15:49 +03003763 goto unlock;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003764
Johan Hedberg7652ff62014-06-24 13:15:49 +03003765 key = hci_add_link_key(hdev, conn, &ev->bdaddr, ev->link_key,
3766 ev->key_type, pin_len, &persistent);
3767 if (!key)
3768 goto unlock;
3769
Johan Hedbergcb6f3f72014-11-19 14:53:04 +02003770 /* Update connection information since adding the key will have
3771 * fixed up the type in the case of changed combination keys.
3772 */
3773 if (ev->key_type == HCI_LK_CHANGED_COMBINATION)
3774 conn_set_key(conn, key->type, key->pin_len);
3775
Johan Hedberg7652ff62014-06-24 13:15:49 +03003776 mgmt_new_link_key(hdev, key, persistent);
3777
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003778 /* Keep debug keys around only if the HCI_KEEP_DEBUG_KEYS flag
3779 * is set. If it's not set simply remove the key from the kernel
3780 * list (we've still notified user space about it but with
3781 * store_hint being 0).
3782 */
3783 if (key->type == HCI_LK_DEBUG_COMBINATION &&
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003784 !hci_dev_test_flag(hdev, HCI_KEEP_DEBUG_KEYS)) {
Johan Hedberg0378b592014-11-19 15:22:22 +02003785 list_del_rcu(&key->list);
3786 kfree_rcu(key, rcu);
Johan Hedberg82c13d42014-12-03 11:03:06 +02003787 goto unlock;
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003788 }
Johan Hedberg7652ff62014-06-24 13:15:49 +03003789
Johan Hedberg82c13d42014-12-03 11:03:06 +02003790 if (persistent)
3791 clear_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
3792 else
3793 set_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
3794
Johan Hedberg7652ff62014-06-24 13:15:49 +03003795unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003796 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003797}
3798
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003799static void hci_clock_offset_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04837f62006-07-03 10:02:33 +02003800{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003801 struct hci_ev_clock_offset *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003802 struct hci_conn *conn;
3803
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003804 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003805
3806 hci_dev_lock(hdev);
3807
3808 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003809 if (conn && !ev->status) {
3810 struct inquiry_entry *ie;
3811
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003812 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3813 if (ie) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003814 ie->data.clock_offset = ev->clock_offset;
3815 ie->timestamp = jiffies;
3816 }
3817 }
3818
3819 hci_dev_unlock(hdev);
3820}
3821
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003822static void hci_pkt_type_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna8746412008-07-14 20:13:46 +02003823{
3824 struct hci_ev_pkt_type_change *ev = (void *) skb->data;
3825 struct hci_conn *conn;
3826
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003827 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna8746412008-07-14 20:13:46 +02003828
3829 hci_dev_lock(hdev);
3830
3831 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3832 if (conn && !ev->status)
3833 conn->pkt_type = __le16_to_cpu(ev->pkt_type);
3834
3835 hci_dev_unlock(hdev);
3836}
3837
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003838static void hci_pscan_rep_mode_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003839{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003840 struct hci_ev_pscan_rep_mode *ev = (void *) skb->data;
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003841 struct inquiry_entry *ie;
3842
3843 BT_DBG("%s", hdev->name);
3844
3845 hci_dev_lock(hdev);
3846
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003847 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
3848 if (ie) {
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003849 ie->data.pscan_rep_mode = ev->pscan_rep_mode;
3850 ie->timestamp = jiffies;
3851 }
3852
3853 hci_dev_unlock(hdev);
3854}
3855
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003856static void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev,
3857 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003858{
3859 struct inquiry_data data;
3860 int num_rsp = *((__u8 *) skb->data);
3861
3862 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
3863
3864 if (!num_rsp)
3865 return;
3866
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003867 if (hci_dev_test_flag(hdev, HCI_PERIODIC_INQ))
Andre Guedes1519cc12012-03-21 00:03:38 -03003868 return;
3869
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003870 hci_dev_lock(hdev);
3871
3872 if ((skb->len - 1) / num_rsp != sizeof(struct inquiry_info_with_rssi)) {
Szymon Janc138d22e2011-02-17 16:44:23 +01003873 struct inquiry_info_with_rssi_and_pscan_mode *info;
3874 info = (void *) (skb->data + 1);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003875
Johan Hedberge17acd42011-03-30 23:57:16 +03003876 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003877 u32 flags;
3878
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003879 bacpy(&data.bdaddr, &info->bdaddr);
3880 data.pscan_rep_mode = info->pscan_rep_mode;
3881 data.pscan_period_mode = info->pscan_period_mode;
3882 data.pscan_mode = info->pscan_mode;
3883 memcpy(data.dev_class, info->dev_class, 3);
3884 data.clock_offset = info->clock_offset;
3885 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003886 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02003887
Marcel Holtmannaf589252014-07-01 14:11:20 +02003888 flags = hci_inquiry_cache_update(hdev, &data, false);
3889
Johan Hedberg48264f02011-11-09 13:58:58 +02003890 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003891 info->dev_class, info->rssi,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003892 flags, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003893 }
3894 } else {
3895 struct inquiry_info_with_rssi *info = (void *) (skb->data + 1);
3896
Johan Hedberge17acd42011-03-30 23:57:16 +03003897 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003898 u32 flags;
3899
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003900 bacpy(&data.bdaddr, &info->bdaddr);
3901 data.pscan_rep_mode = info->pscan_rep_mode;
3902 data.pscan_period_mode = info->pscan_period_mode;
3903 data.pscan_mode = 0x00;
3904 memcpy(data.dev_class, info->dev_class, 3);
3905 data.clock_offset = info->clock_offset;
3906 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003907 data.ssp_mode = 0x00;
Marcel Holtmannaf589252014-07-01 14:11:20 +02003908
3909 flags = hci_inquiry_cache_update(hdev, &data, false);
3910
Johan Hedberg48264f02011-11-09 13:58:58 +02003911 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003912 info->dev_class, info->rssi,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003913 flags, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003914 }
3915 }
3916
3917 hci_dev_unlock(hdev);
3918}
3919
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003920static void hci_remote_ext_features_evt(struct hci_dev *hdev,
3921 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003922{
Marcel Holtmann41a96212008-07-14 20:13:48 +02003923 struct hci_ev_remote_ext_features *ev = (void *) skb->data;
3924 struct hci_conn *conn;
3925
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003926 BT_DBG("%s", hdev->name);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003927
Marcel Holtmann41a96212008-07-14 20:13:48 +02003928 hci_dev_lock(hdev);
3929
3930 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02003931 if (!conn)
3932 goto unlock;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003933
Johan Hedbergcad718e2013-04-17 15:00:51 +03003934 if (ev->page < HCI_MAX_PAGES)
3935 memcpy(conn->features[ev->page], ev->features, 8);
3936
Johan Hedbergccd556f2010-11-10 17:11:51 +02003937 if (!ev->status && ev->page == 0x01) {
3938 struct inquiry_entry *ie;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003939
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003940 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3941 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02003942 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann769be972008-07-14 20:13:49 +02003943
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303944 if (ev->features[0] & LMP_HOST_SSP) {
Johan Hedberg58a681e2012-01-16 06:47:28 +02003945 set_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303946 } else {
3947 /* It is mandatory by the Bluetooth specification that
3948 * Extended Inquiry Results are only used when Secure
3949 * Simple Pairing is enabled, but some devices violate
3950 * this.
3951 *
3952 * To make these devices work, the internal SSP
3953 * enabled flag needs to be cleared if the remote host
3954 * features do not indicate SSP support */
3955 clear_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
3956 }
Marcel Holtmanneb9a8f32014-01-15 22:37:38 -08003957
3958 if (ev->features[0] & LMP_HOST_SC)
3959 set_bit(HCI_CONN_SC_ENABLED, &conn->flags);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003960 }
3961
Johan Hedbergccd556f2010-11-10 17:11:51 +02003962 if (conn->state != BT_CONFIG)
3963 goto unlock;
3964
Johan Hedberg671267b2012-05-12 16:11:50 -03003965 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02003966 struct hci_cp_remote_name_req cp;
3967 memset(&cp, 0, sizeof(cp));
3968 bacpy(&cp.bdaddr, &conn->dst);
3969 cp.pscan_rep_mode = 0x02;
3970 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02003971 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00003972 mgmt_device_connected(hdev, conn, 0, NULL, 0);
Johan Hedberg392599b2010-11-18 22:22:28 +02003973
Johan Hedberg127178d2010-11-18 22:22:29 +02003974 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02003975 conn->state = BT_CONNECTED;
Johan Hedberg539c4962015-02-18 14:53:57 +02003976 hci_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02003977 hci_conn_drop(conn);
Johan Hedbergccd556f2010-11-10 17:11:51 +02003978 }
3979
3980unlock:
Marcel Holtmann41a96212008-07-14 20:13:48 +02003981 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003982}
3983
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003984static void hci_sync_conn_complete_evt(struct hci_dev *hdev,
3985 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003986{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003987 struct hci_ev_sync_conn_complete *ev = (void *) skb->data;
3988 struct hci_conn *conn;
3989
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003990 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003991
3992 hci_dev_lock(hdev);
3993
3994 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann9dc0a3a2008-07-14 20:13:46 +02003995 if (!conn) {
3996 if (ev->link_type == ESCO_LINK)
3997 goto unlock;
3998
Kuba Pawlak618353b2015-08-28 13:05:22 +01003999 /* When the link type in the event indicates SCO connection
4000 * and lookup of the connection object fails, then check
4001 * if an eSCO connection object exists.
4002 *
4003 * The core limits the synchronous connections to either
4004 * SCO or eSCO. The eSCO connection is preferred and tried
4005 * to be setup first and until successfully established,
4006 * the link type will be hinted as eSCO.
4007 */
Marcel Holtmann9dc0a3a2008-07-14 20:13:46 +02004008 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
4009 if (!conn)
4010 goto unlock;
Marcel Holtmann9dc0a3a2008-07-14 20:13:46 +02004011 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02004012
Marcel Holtmann732547f2009-04-19 19:14:14 +02004013 switch (ev->status) {
4014 case 0x00:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02004015 conn->handle = __le16_to_cpu(ev->handle);
4016 conn->state = BT_CONNECTED;
Kuba Pawlak618353b2015-08-28 13:05:22 +01004017 conn->type = ev->link_type;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02004018
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01004019 hci_debugfs_create_conn(conn);
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02004020 hci_conn_add_sysfs(conn);
Marcel Holtmann732547f2009-04-19 19:14:14 +02004021 break;
4022
Nick Pelly81218d22014-06-30 11:25:01 +05304023 case 0x10: /* Connection Accept Timeout */
Frédéric Dalleau1a4c9582013-08-19 14:24:02 +02004024 case 0x0d: /* Connection Rejected due to Limited Resources */
Stephen Coe705e5712010-02-16 11:29:44 -05004025 case 0x11: /* Unsupported Feature or Parameter Value */
Marcel Holtmann732547f2009-04-19 19:14:14 +02004026 case 0x1c: /* SCO interval rejected */
Nick Pelly1038a002010-02-03 11:42:26 -08004027 case 0x1a: /* Unsupported Remote Feature */
Marcel Holtmann732547f2009-04-19 19:14:14 +02004028 case 0x1f: /* Unspecified error */
Andrew Earl27539bc2014-03-10 10:31:04 +00004029 case 0x20: /* Unsupported LMP Parameter value */
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02004030 if (conn->out) {
Marcel Holtmann732547f2009-04-19 19:14:14 +02004031 conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) |
4032 (hdev->esco_type & EDR_ESCO_MASK);
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02004033 if (hci_setup_sync(conn, conn->link->handle))
4034 goto unlock;
Marcel Holtmann732547f2009-04-19 19:14:14 +02004035 }
4036 /* fall through */
4037
4038 default:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02004039 conn->state = BT_CLOSED;
Marcel Holtmann732547f2009-04-19 19:14:14 +02004040 break;
4041 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02004042
Johan Hedberg539c4962015-02-18 14:53:57 +02004043 hci_connect_cfm(conn, ev->status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02004044 if (ev->status)
4045 hci_conn_del(conn);
4046
4047unlock:
4048 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004049}
4050
Marcel Holtmannefdcf8e2013-10-15 10:31:12 -07004051static inline size_t eir_get_length(u8 *eir, size_t eir_len)
4052{
4053 size_t parsed = 0;
4054
4055 while (parsed < eir_len) {
4056 u8 field_len = eir[0];
4057
4058 if (field_len == 0)
4059 return parsed;
4060
4061 parsed += field_len + 1;
4062 eir += field_len + 1;
4063 }
4064
4065 return eir_len;
4066}
4067
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004068static void hci_extended_inquiry_result_evt(struct hci_dev *hdev,
4069 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004070{
4071 struct inquiry_data data;
4072 struct extended_inquiry_info *info = (void *) (skb->data + 1);
4073 int num_rsp = *((__u8 *) skb->data);
Vishal Agarwal9d939d92012-04-26 19:19:56 +05304074 size_t eir_len;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004075
4076 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
4077
4078 if (!num_rsp)
4079 return;
4080
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004081 if (hci_dev_test_flag(hdev, HCI_PERIODIC_INQ))
Andre Guedes1519cc12012-03-21 00:03:38 -03004082 return;
4083
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004084 hci_dev_lock(hdev);
4085
Johan Hedberge17acd42011-03-30 23:57:16 +03004086 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02004087 u32 flags;
4088 bool name_known;
Johan Hedberg561aafb2012-01-04 13:31:59 +02004089
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004090 bacpy(&data.bdaddr, &info->bdaddr);
Szymon Janc138d22e2011-02-17 16:44:23 +01004091 data.pscan_rep_mode = info->pscan_rep_mode;
4092 data.pscan_period_mode = info->pscan_period_mode;
4093 data.pscan_mode = 0x00;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004094 memcpy(data.dev_class, info->dev_class, 3);
Szymon Janc138d22e2011-02-17 16:44:23 +01004095 data.clock_offset = info->clock_offset;
4096 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02004097 data.ssp_mode = 0x01;
Johan Hedberg561aafb2012-01-04 13:31:59 +02004098
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004099 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg0d3b7f62016-01-05 13:19:31 +02004100 name_known = eir_get_data(info->data,
4101 sizeof(info->data),
4102 EIR_NAME_COMPLETE, NULL);
Johan Hedberg561aafb2012-01-04 13:31:59 +02004103 else
4104 name_known = true;
4105
Marcel Holtmannaf589252014-07-01 14:11:20 +02004106 flags = hci_inquiry_cache_update(hdev, &data, name_known);
4107
Vishal Agarwal9d939d92012-04-26 19:19:56 +05304108 eir_len = eir_get_length(info->data, sizeof(info->data));
Marcel Holtmannaf589252014-07-01 14:11:20 +02004109
Johan Hedberg48264f02011-11-09 13:58:58 +02004110 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Marcel Holtmannaf589252014-07-01 14:11:20 +02004111 info->dev_class, info->rssi,
4112 flags, info->data, eir_len, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004113 }
4114
4115 hci_dev_unlock(hdev);
4116}
4117
Johan Hedberg1c2e0042012-06-08 23:31:13 +08004118static void hci_key_refresh_complete_evt(struct hci_dev *hdev,
4119 struct sk_buff *skb)
4120{
4121 struct hci_ev_key_refresh_complete *ev = (void *) skb->data;
4122 struct hci_conn *conn;
4123
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004124 BT_DBG("%s status 0x%2.2x handle 0x%4.4x", hdev->name, ev->status,
Johan Hedberg1c2e0042012-06-08 23:31:13 +08004125 __le16_to_cpu(ev->handle));
4126
4127 hci_dev_lock(hdev);
4128
4129 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
4130 if (!conn)
4131 goto unlock;
4132
Johan Hedberg9eb1fbf2014-04-11 12:02:31 -07004133 /* For BR/EDR the necessary steps are taken through the
4134 * auth_complete event.
4135 */
4136 if (conn->type != LE_LINK)
4137 goto unlock;
4138
Johan Hedberg1c2e0042012-06-08 23:31:13 +08004139 if (!ev->status)
4140 conn->sec_level = conn->pending_sec_level;
4141
4142 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
4143
4144 if (ev->status && conn->state == BT_CONNECTED) {
Andre Guedesbed71742013-01-30 11:50:56 -03004145 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
David Herrmann76a68ba2013-04-06 20:28:37 +02004146 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08004147 goto unlock;
4148 }
4149
4150 if (conn->state == BT_CONFIG) {
4151 if (!ev->status)
4152 conn->state = BT_CONNECTED;
4153
Johan Hedberg539c4962015-02-18 14:53:57 +02004154 hci_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02004155 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08004156 } else {
4157 hci_auth_cfm(conn, ev->status);
4158
4159 hci_conn_hold(conn);
4160 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02004161 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08004162 }
4163
4164unlock:
4165 hci_dev_unlock(hdev);
4166}
4167
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004168static u8 hci_get_auth_req(struct hci_conn *conn)
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004169{
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004170 /* If remote requests no-bonding follow that lead */
Mikel Astizacabae92013-06-28 10:56:28 +02004171 if (conn->remote_auth == HCI_AT_NO_BONDING ||
4172 conn->remote_auth == HCI_AT_NO_BONDING_MITM)
Waldemar Rymarkiewicz58797bf2011-04-28 12:07:58 +02004173 return conn->remote_auth | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004174
Mikel Astizb7f94c82014-04-08 14:21:31 +02004175 /* If both remote and local have enough IO capabilities, require
4176 * MITM protection
4177 */
4178 if (conn->remote_cap != HCI_IO_NO_INPUT_OUTPUT &&
4179 conn->io_capability != HCI_IO_NO_INPUT_OUTPUT)
4180 return conn->remote_auth | 0x01;
4181
Timo Mueller7e741702014-04-08 14:21:33 +02004182 /* No MITM protection possible so ignore remote requirement */
4183 return (conn->remote_auth & ~0x01) | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004184}
4185
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08004186static u8 bredr_oob_data_present(struct hci_conn *conn)
4187{
4188 struct hci_dev *hdev = conn->hdev;
4189 struct oob_data *data;
4190
4191 data = hci_find_remote_oob_data(hdev, &conn->dst, BDADDR_BREDR);
4192 if (!data)
4193 return 0x00;
4194
Marcel Holtmann455c2ff2015-03-15 16:42:53 -07004195 if (bredr_sc_enabled(hdev)) {
4196 /* When Secure Connections is enabled, then just
4197 * return the present value stored with the OOB
4198 * data. The stored value contains the right present
4199 * information. However it can only be trusted when
4200 * not in Secure Connection Only mode.
Marcel Holtmann659c7fb2015-01-30 23:20:56 -08004201 */
Marcel Holtmann455c2ff2015-03-15 16:42:53 -07004202 if (!hci_dev_test_flag(hdev, HCI_SC_ONLY))
4203 return data->present;
4204
4205 /* When Secure Connections Only mode is enabled, then
4206 * the P-256 values are required. If they are not
4207 * available, then do not declare that OOB data is
4208 * present.
4209 */
4210 if (!memcmp(data->rand256, ZERO_KEY, 16) ||
4211 !memcmp(data->hash256, ZERO_KEY, 16))
Marcel Holtmann659c7fb2015-01-30 23:20:56 -08004212 return 0x00;
4213
Marcel Holtmann455c2ff2015-03-15 16:42:53 -07004214 return 0x02;
Marcel Holtmann659c7fb2015-01-30 23:20:56 -08004215 }
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08004216
Marcel Holtmann455c2ff2015-03-15 16:42:53 -07004217 /* When Secure Connections is not enabled or actually
4218 * not supported by the hardware, then check that if
4219 * P-192 data values are present.
4220 */
4221 if (!memcmp(data->rand192, ZERO_KEY, 16) ||
4222 !memcmp(data->hash192, ZERO_KEY, 16))
4223 return 0x00;
4224
4225 return 0x01;
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08004226}
4227
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004228static void hci_io_capa_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02004229{
4230 struct hci_ev_io_capa_request *ev = (void *) skb->data;
4231 struct hci_conn *conn;
4232
4233 BT_DBG("%s", hdev->name);
4234
4235 hci_dev_lock(hdev);
4236
4237 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg03b555e2011-01-04 15:40:05 +02004238 if (!conn)
4239 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02004240
Johan Hedberg03b555e2011-01-04 15:40:05 +02004241 hci_conn_hold(conn);
4242
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004243 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg03b555e2011-01-04 15:40:05 +02004244 goto unlock;
4245
Johan Hedberg2f407f02014-07-17 15:35:40 +03004246 /* Allow pairing if we're pairable, the initiators of the
4247 * pairing or if the remote is not requesting bonding.
4248 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004249 if (hci_dev_test_flag(hdev, HCI_BONDABLE) ||
Johan Hedberg2f407f02014-07-17 15:35:40 +03004250 test_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags) ||
Gustavo Padovan807deac2012-05-17 00:36:24 -03004251 (conn->remote_auth & ~0x01) == HCI_AT_NO_BONDING) {
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004252 struct hci_cp_io_capability_reply cp;
4253
4254 bacpy(&cp.bdaddr, &ev->bdaddr);
Hemant Gupta7a7f1e72012-01-16 13:34:29 +05304255 /* Change the IO capability from KeyboardDisplay
4256 * to DisplayYesNo as it is not supported by BT spec. */
4257 cp.capability = (conn->io_capability == 0x04) ?
Mikel Astiza7676312013-06-28 10:56:29 +02004258 HCI_IO_DISPLAY_YESNO : conn->io_capability;
Mikel Astizb7f94c82014-04-08 14:21:31 +02004259
4260 /* If we are initiators, there is no remote information yet */
4261 if (conn->remote_auth == 0xff) {
Mikel Astizb16c6602014-04-08 14:21:34 +02004262 /* Request MITM protection if our IO caps allow it
Johan Hedberg4ad51a72014-06-09 14:41:25 +03004263 * except for the no-bonding case.
Mikel Astizb16c6602014-04-08 14:21:34 +02004264 */
Mikel Astiz6fd6b912014-04-08 14:21:32 +02004265 if (conn->io_capability != HCI_IO_NO_INPUT_OUTPUT &&
Johan Hedberg9f743d72014-07-17 11:56:33 +03004266 conn->auth_type != HCI_AT_NO_BONDING)
Johan Hedberg6c538232014-07-11 15:32:23 +03004267 conn->auth_type |= 0x01;
Mikel Astizb7f94c82014-04-08 14:21:31 +02004268 } else {
4269 conn->auth_type = hci_get_auth_req(conn);
Mikel Astizb7f94c82014-04-08 14:21:31 +02004270 }
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004271
Johan Hedberg82c295b2014-07-30 09:22:24 +03004272 /* If we're not bondable, force one of the non-bondable
4273 * authentication requirement values.
4274 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004275 if (!hci_dev_test_flag(hdev, HCI_BONDABLE))
Johan Hedberg82c295b2014-07-30 09:22:24 +03004276 conn->auth_type &= HCI_AT_NO_BONDING_MITM;
4277
4278 cp.authentication = conn->auth_type;
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08004279 cp.oob_data = bredr_oob_data_present(conn);
Szymon Jancce85ee12011-03-22 13:12:23 +01004280
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004281 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03004282 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02004283 } else {
4284 struct hci_cp_io_capability_neg_reply cp;
4285
4286 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02004287 cp.reason = HCI_ERROR_PAIRING_NOT_ALLOWED;
Johan Hedberg03b555e2011-01-04 15:40:05 +02004288
4289 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03004290 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02004291 }
4292
4293unlock:
4294 hci_dev_unlock(hdev);
4295}
4296
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004297static void hci_io_capa_reply_evt(struct hci_dev *hdev, struct sk_buff *skb)
Johan Hedberg03b555e2011-01-04 15:40:05 +02004298{
4299 struct hci_ev_io_capa_reply *ev = (void *) skb->data;
4300 struct hci_conn *conn;
4301
4302 BT_DBG("%s", hdev->name);
4303
4304 hci_dev_lock(hdev);
4305
4306 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4307 if (!conn)
4308 goto unlock;
4309
Johan Hedberg03b555e2011-01-04 15:40:05 +02004310 conn->remote_cap = ev->capability;
Johan Hedberg03b555e2011-01-04 15:40:05 +02004311 conn->remote_auth = ev->authentication;
4312
4313unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02004314 hci_dev_unlock(hdev);
4315}
4316
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004317static void hci_user_confirm_request_evt(struct hci_dev *hdev,
4318 struct sk_buff *skb)
Johan Hedberga5c29682011-02-19 12:05:57 -03004319{
4320 struct hci_ev_user_confirm_req *ev = (void *) skb->data;
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004321 int loc_mitm, rem_mitm, confirm_hint = 0;
Johan Hedberg7a828902011-04-28 11:28:53 -07004322 struct hci_conn *conn;
Johan Hedberga5c29682011-02-19 12:05:57 -03004323
4324 BT_DBG("%s", hdev->name);
4325
4326 hci_dev_lock(hdev);
4327
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004328 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg7a828902011-04-28 11:28:53 -07004329 goto unlock;
Johan Hedberga5c29682011-02-19 12:05:57 -03004330
Johan Hedberg7a828902011-04-28 11:28:53 -07004331 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4332 if (!conn)
4333 goto unlock;
4334
4335 loc_mitm = (conn->auth_type & 0x01);
4336 rem_mitm = (conn->remote_auth & 0x01);
4337
4338 /* If we require MITM but the remote device can't provide that
Johan Hedberg6c538232014-07-11 15:32:23 +03004339 * (it has NoInputNoOutput) then reject the confirmation
4340 * request. We check the security level here since it doesn't
4341 * necessarily match conn->auth_type.
Mikel Astiz6fd6b912014-04-08 14:21:32 +02004342 */
Johan Hedberg6c538232014-07-11 15:32:23 +03004343 if (conn->pending_sec_level > BT_SECURITY_MEDIUM &&
4344 conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) {
Johan Hedberg7a828902011-04-28 11:28:53 -07004345 BT_DBG("Rejecting request: remote device can't provide MITM");
4346 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03004347 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07004348 goto unlock;
4349 }
4350
4351 /* If no side requires MITM protection; auto-accept */
Mikel Astiza7676312013-06-28 10:56:29 +02004352 if ((!loc_mitm || conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) &&
4353 (!rem_mitm || conn->io_capability == HCI_IO_NO_INPUT_OUTPUT)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004354
4355 /* If we're not the initiators request authorization to
4356 * proceed from user space (mgmt_user_confirm with
Johan Hedbergba15a582014-06-09 13:58:14 +03004357 * confirm_hint set to 1). The exception is if neither
Johan Hedberg02f3e252014-07-16 15:09:13 +03004358 * side had MITM or if the local IO capability is
4359 * NoInputNoOutput, in which case we do auto-accept
Johan Hedbergba15a582014-06-09 13:58:14 +03004360 */
4361 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) &&
Johan Hedberg02f3e252014-07-16 15:09:13 +03004362 conn->io_capability != HCI_IO_NO_INPUT_OUTPUT &&
Johan Hedbergba15a582014-06-09 13:58:14 +03004363 (loc_mitm || rem_mitm)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004364 BT_DBG("Confirming auto-accept as acceptor");
4365 confirm_hint = 1;
4366 goto confirm;
4367 }
4368
Johan Hedberg9f616562011-04-28 11:28:54 -07004369 BT_DBG("Auto-accept of user confirmation with %ums delay",
Gustavo Padovan807deac2012-05-17 00:36:24 -03004370 hdev->auto_accept_delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07004371
4372 if (hdev->auto_accept_delay > 0) {
4373 int delay = msecs_to_jiffies(hdev->auto_accept_delay);
Johan Hedberg7bc18d92013-10-16 18:11:39 +03004374 queue_delayed_work(conn->hdev->workqueue,
4375 &conn->auto_accept_work, delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07004376 goto unlock;
4377 }
4378
Johan Hedberg7a828902011-04-28 11:28:53 -07004379 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03004380 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07004381 goto unlock;
4382 }
4383
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004384confirm:
Johan Hedberg39adbff2014-03-20 08:18:14 +02004385 mgmt_user_confirm_request(hdev, &ev->bdaddr, ACL_LINK, 0,
4386 le32_to_cpu(ev->passkey), confirm_hint);
Johan Hedberg7a828902011-04-28 11:28:53 -07004387
4388unlock:
Johan Hedberga5c29682011-02-19 12:05:57 -03004389 hci_dev_unlock(hdev);
4390}
4391
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004392static void hci_user_passkey_request_evt(struct hci_dev *hdev,
4393 struct sk_buff *skb)
Brian Gix1143d452011-11-23 08:28:34 -08004394{
4395 struct hci_ev_user_passkey_req *ev = (void *) skb->data;
4396
4397 BT_DBG("%s", hdev->name);
4398
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004399 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg272d90d2012-02-09 15:26:12 +02004400 mgmt_user_passkey_request(hdev, &ev->bdaddr, ACL_LINK, 0);
Brian Gix1143d452011-11-23 08:28:34 -08004401}
4402
Johan Hedberg92a25252012-09-06 18:39:26 +03004403static void hci_user_passkey_notify_evt(struct hci_dev *hdev,
4404 struct sk_buff *skb)
4405{
4406 struct hci_ev_user_passkey_notify *ev = (void *) skb->data;
4407 struct hci_conn *conn;
4408
4409 BT_DBG("%s", hdev->name);
4410
4411 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4412 if (!conn)
4413 return;
4414
4415 conn->passkey_notify = __le32_to_cpu(ev->passkey);
4416 conn->passkey_entered = 0;
4417
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004418 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg92a25252012-09-06 18:39:26 +03004419 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
4420 conn->dst_type, conn->passkey_notify,
4421 conn->passkey_entered);
4422}
4423
4424static void hci_keypress_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
4425{
4426 struct hci_ev_keypress_notify *ev = (void *) skb->data;
4427 struct hci_conn *conn;
4428
4429 BT_DBG("%s", hdev->name);
4430
4431 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4432 if (!conn)
4433 return;
4434
4435 switch (ev->type) {
4436 case HCI_KEYPRESS_STARTED:
4437 conn->passkey_entered = 0;
4438 return;
4439
4440 case HCI_KEYPRESS_ENTERED:
4441 conn->passkey_entered++;
4442 break;
4443
4444 case HCI_KEYPRESS_ERASED:
4445 conn->passkey_entered--;
4446 break;
4447
4448 case HCI_KEYPRESS_CLEARED:
4449 conn->passkey_entered = 0;
4450 break;
4451
4452 case HCI_KEYPRESS_COMPLETED:
4453 return;
4454 }
4455
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004456 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg92a25252012-09-06 18:39:26 +03004457 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
4458 conn->dst_type, conn->passkey_notify,
4459 conn->passkey_entered);
4460}
4461
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004462static void hci_simple_pair_complete_evt(struct hci_dev *hdev,
4463 struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02004464{
4465 struct hci_ev_simple_pair_complete *ev = (void *) skb->data;
4466 struct hci_conn *conn;
4467
4468 BT_DBG("%s", hdev->name);
4469
4470 hci_dev_lock(hdev);
4471
4472 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg2a611692011-02-19 12:06:00 -03004473 if (!conn)
4474 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02004475
Johan Hedbergc1d4fa72014-07-17 15:14:50 +03004476 /* Reset the authentication requirement to unknown */
4477 conn->remote_auth = 0xff;
4478
Johan Hedberg2a611692011-02-19 12:06:00 -03004479 /* To avoid duplicate auth_failed events to user space we check
4480 * the HCI_CONN_AUTH_PEND flag which will be set if we
4481 * initiated the authentication. A traditional auth_complete
4482 * event gets always produced as initiator and is also mapped to
4483 * the mgmt_auth_failed event */
Mikel Astizfa1bd912012-08-09 09:52:29 +02004484 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) && ev->status)
Johan Hedberge1e930f2014-09-08 17:09:49 -07004485 mgmt_auth_failed(conn, ev->status);
Johan Hedberg2a611692011-02-19 12:06:00 -03004486
David Herrmann76a68ba2013-04-06 20:28:37 +02004487 hci_conn_drop(conn);
Johan Hedberg2a611692011-02-19 12:06:00 -03004488
4489unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02004490 hci_dev_unlock(hdev);
4491}
4492
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004493static void hci_remote_host_features_evt(struct hci_dev *hdev,
4494 struct sk_buff *skb)
Marcel Holtmann41a96212008-07-14 20:13:48 +02004495{
4496 struct hci_ev_remote_host_features *ev = (void *) skb->data;
4497 struct inquiry_entry *ie;
Johan Hedbergcad718e2013-04-17 15:00:51 +03004498 struct hci_conn *conn;
Marcel Holtmann41a96212008-07-14 20:13:48 +02004499
4500 BT_DBG("%s", hdev->name);
4501
4502 hci_dev_lock(hdev);
4503
Johan Hedbergcad718e2013-04-17 15:00:51 +03004504 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4505 if (conn)
4506 memcpy(conn->features[1], ev->features, 8);
4507
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02004508 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
4509 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02004510 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann41a96212008-07-14 20:13:48 +02004511
4512 hci_dev_unlock(hdev);
4513}
4514
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004515static void hci_remote_oob_data_request_evt(struct hci_dev *hdev,
4516 struct sk_buff *skb)
Szymon Janc2763eda2011-03-22 13:12:22 +01004517{
4518 struct hci_ev_remote_oob_data_request *ev = (void *) skb->data;
4519 struct oob_data *data;
4520
4521 BT_DBG("%s", hdev->name);
4522
4523 hci_dev_lock(hdev);
4524
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004525 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Szymon Jance1ba1f12011-04-06 13:01:59 +02004526 goto unlock;
4527
Johan Hedberg6928a922014-10-26 20:46:09 +01004528 data = hci_find_remote_oob_data(hdev, &ev->bdaddr, BDADDR_BREDR);
Marcel Holtmann6665d052015-01-27 16:04:31 -08004529 if (!data) {
Szymon Janc2763eda2011-03-22 13:12:22 +01004530 struct hci_cp_remote_oob_data_neg_reply cp;
4531
4532 bacpy(&cp.bdaddr, &ev->bdaddr);
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08004533 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_NEG_REPLY,
4534 sizeof(cp), &cp);
Marcel Holtmann6665d052015-01-27 16:04:31 -08004535 goto unlock;
4536 }
4537
4538 if (bredr_sc_enabled(hdev)) {
4539 struct hci_cp_remote_oob_ext_data_reply cp;
4540
4541 bacpy(&cp.bdaddr, &ev->bdaddr);
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004542 if (hci_dev_test_flag(hdev, HCI_SC_ONLY)) {
Marcel Holtmann6665d052015-01-27 16:04:31 -08004543 memset(cp.hash192, 0, sizeof(cp.hash192));
4544 memset(cp.rand192, 0, sizeof(cp.rand192));
4545 } else {
4546 memcpy(cp.hash192, data->hash192, sizeof(cp.hash192));
4547 memcpy(cp.rand192, data->rand192, sizeof(cp.rand192));
4548 }
4549 memcpy(cp.hash256, data->hash256, sizeof(cp.hash256));
4550 memcpy(cp.rand256, data->rand256, sizeof(cp.rand256));
4551
4552 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_EXT_DATA_REPLY,
4553 sizeof(cp), &cp);
4554 } else {
4555 struct hci_cp_remote_oob_data_reply cp;
4556
4557 bacpy(&cp.bdaddr, &ev->bdaddr);
4558 memcpy(cp.hash, data->hash192, sizeof(cp.hash));
4559 memcpy(cp.rand, data->rand192, sizeof(cp.rand));
4560
4561 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_REPLY,
4562 sizeof(cp), &cp);
Szymon Janc2763eda2011-03-22 13:12:22 +01004563 }
4564
Szymon Jance1ba1f12011-04-06 13:01:59 +02004565unlock:
Szymon Janc2763eda2011-03-22 13:12:22 +01004566 hci_dev_unlock(hdev);
4567}
4568
Arron Wanga77a6a12015-07-24 17:13:15 +08004569#if IS_ENABLED(CONFIG_BT_HS)
4570static void hci_chan_selected_evt(struct hci_dev *hdev, struct sk_buff *skb)
4571{
4572 struct hci_ev_channel_selected *ev = (void *)skb->data;
4573 struct hci_conn *hcon;
4574
4575 BT_DBG("%s handle 0x%2.2x", hdev->name, ev->phy_handle);
4576
4577 skb_pull(skb, sizeof(*ev));
4578
4579 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4580 if (!hcon)
4581 return;
4582
4583 amp_read_loc_assoc_final_data(hdev, hcon);
4584}
4585
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004586static void hci_phy_link_complete_evt(struct hci_dev *hdev,
4587 struct sk_buff *skb)
4588{
4589 struct hci_ev_phy_link_complete *ev = (void *) skb->data;
4590 struct hci_conn *hcon, *bredr_hcon;
4591
4592 BT_DBG("%s handle 0x%2.2x status 0x%2.2x", hdev->name, ev->phy_handle,
4593 ev->status);
4594
4595 hci_dev_lock(hdev);
4596
4597 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4598 if (!hcon) {
4599 hci_dev_unlock(hdev);
4600 return;
4601 }
4602
4603 if (ev->status) {
4604 hci_conn_del(hcon);
4605 hci_dev_unlock(hdev);
4606 return;
4607 }
4608
4609 bredr_hcon = hcon->amp_mgr->l2cap_conn->hcon;
4610
4611 hcon->state = BT_CONNECTED;
4612 bacpy(&hcon->dst, &bredr_hcon->dst);
4613
4614 hci_conn_hold(hcon);
4615 hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02004616 hci_conn_drop(hcon);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004617
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01004618 hci_debugfs_create_conn(hcon);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004619 hci_conn_add_sysfs(hcon);
4620
Andrei Emeltchenkocf70ff22012-10-31 15:46:36 +02004621 amp_physical_cfm(bredr_hcon, hcon);
4622
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004623 hci_dev_unlock(hdev);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004624}
4625
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004626static void hci_loglink_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
4627{
4628 struct hci_ev_logical_link_complete *ev = (void *) skb->data;
4629 struct hci_conn *hcon;
4630 struct hci_chan *hchan;
4631 struct amp_mgr *mgr;
4632
4633 BT_DBG("%s log_handle 0x%4.4x phy_handle 0x%2.2x status 0x%2.2x",
4634 hdev->name, le16_to_cpu(ev->handle), ev->phy_handle,
4635 ev->status);
4636
4637 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4638 if (!hcon)
4639 return;
4640
4641 /* Create AMP hchan */
4642 hchan = hci_chan_create(hcon);
4643 if (!hchan)
4644 return;
4645
4646 hchan->handle = le16_to_cpu(ev->handle);
4647
4648 BT_DBG("hcon %p mgr %p hchan %p", hcon, hcon->amp_mgr, hchan);
4649
4650 mgr = hcon->amp_mgr;
4651 if (mgr && mgr->bredr_chan) {
4652 struct l2cap_chan *bredr_chan = mgr->bredr_chan;
4653
4654 l2cap_chan_lock(bredr_chan);
4655
4656 bredr_chan->conn->mtu = hdev->block_mtu;
4657 l2cap_logical_cfm(bredr_chan, hchan, 0);
4658 hci_conn_hold(hcon);
4659
4660 l2cap_chan_unlock(bredr_chan);
4661 }
4662}
4663
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02004664static void hci_disconn_loglink_complete_evt(struct hci_dev *hdev,
4665 struct sk_buff *skb)
4666{
4667 struct hci_ev_disconn_logical_link_complete *ev = (void *) skb->data;
4668 struct hci_chan *hchan;
4669
4670 BT_DBG("%s log handle 0x%4.4x status 0x%2.2x", hdev->name,
4671 le16_to_cpu(ev->handle), ev->status);
4672
4673 if (ev->status)
4674 return;
4675
4676 hci_dev_lock(hdev);
4677
4678 hchan = hci_chan_lookup_handle(hdev, le16_to_cpu(ev->handle));
4679 if (!hchan)
4680 goto unlock;
4681
4682 amp_destroy_logical_link(hchan, ev->reason);
4683
4684unlock:
4685 hci_dev_unlock(hdev);
4686}
4687
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02004688static void hci_disconn_phylink_complete_evt(struct hci_dev *hdev,
4689 struct sk_buff *skb)
4690{
4691 struct hci_ev_disconn_phy_link_complete *ev = (void *) skb->data;
4692 struct hci_conn *hcon;
4693
4694 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4695
4696 if (ev->status)
4697 return;
4698
4699 hci_dev_lock(hdev);
4700
4701 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4702 if (hcon) {
4703 hcon->state = BT_CLOSED;
4704 hci_conn_del(hcon);
4705 }
4706
4707 hci_dev_unlock(hdev);
4708}
Arron Wanga77a6a12015-07-24 17:13:15 +08004709#endif
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02004710
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304711static void le_conn_complete_evt(struct hci_dev *hdev, u8 status,
4712 bdaddr_t *bdaddr, u8 bdaddr_type, u8 role, u16 handle,
4713 u16 interval, u16 latency, u16 supervision_timeout)
Ville Tervofcd89c02011-02-10 22:38:47 -03004714{
Johan Hedberg912b42ef2014-07-03 19:33:49 +03004715 struct hci_conn_params *params;
Ville Tervofcd89c02011-02-10 22:38:47 -03004716 struct hci_conn *conn;
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004717 struct smp_irk *irk;
Johan Hedberg837d5022014-07-02 09:36:22 +03004718 u8 addr_type;
Ville Tervofcd89c02011-02-10 22:38:47 -03004719
Ville Tervofcd89c02011-02-10 22:38:47 -03004720 hci_dev_lock(hdev);
4721
Johan Hedbergfbd96c12014-07-08 17:21:51 +03004722 /* All controllers implicitly stop advertising in the event of a
4723 * connection, so ensure that the state bit is cleared.
4724 */
Marcel Holtmanna358dc12015-03-13 02:11:02 -07004725 hci_dev_clear_flag(hdev, HCI_LE_ADV);
Johan Hedbergfbd96c12014-07-08 17:21:51 +03004726
Jakub Pawlowskie7d9ab72015-08-07 20:22:52 +02004727 conn = hci_lookup_le_connect(hdev);
Ville Tervob62f3282011-02-10 22:38:50 -03004728 if (!conn) {
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304729 conn = hci_conn_add(hdev, LE_LINK, bdaddr, role);
Ville Tervob62f3282011-02-10 22:38:50 -03004730 if (!conn) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01004731 bt_dev_err(hdev, "no memory for new connection");
Andre Guedes230fd162012-07-27 15:10:10 -03004732 goto unlock;
Ville Tervob62f3282011-02-10 22:38:50 -03004733 }
Andre Guedes29b79882011-05-31 14:20:54 -03004734
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304735 conn->dst_type = bdaddr_type;
Andre Guedesb9b343d2012-07-27 15:10:11 -03004736
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004737 /* If we didn't have a hci_conn object previously
4738 * but we're in master role this must be something
4739 * initiated using a white list. Since white list based
4740 * connections are not "first class citizens" we don't
4741 * have full tracking of them. Therefore, we go ahead
4742 * with a "best effort" approach of determining the
4743 * initiator address based on the HCI_PRIVACY flag.
4744 */
4745 if (conn->out) {
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304746 conn->resp_addr_type = bdaddr_type;
4747 bacpy(&conn->resp_addr, bdaddr);
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004748 if (hci_dev_test_flag(hdev, HCI_PRIVACY)) {
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004749 conn->init_addr_type = ADDR_LE_DEV_RANDOM;
4750 bacpy(&conn->init_addr, &hdev->rpa);
4751 } else {
4752 hci_copy_identity_address(hdev,
4753 &conn->init_addr,
4754 &conn->init_addr_type);
4755 }
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004756 }
Johan Hedberg9489eca2014-02-28 17:45:46 +02004757 } else {
4758 cancel_delayed_work(&conn->le_conn_timeout);
Ville Tervob62f3282011-02-10 22:38:50 -03004759 }
Ville Tervofcd89c02011-02-10 22:38:47 -03004760
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004761 if (!conn->out) {
4762 /* Set the responder (our side) address type based on
4763 * the advertising address type.
4764 */
4765 conn->resp_addr_type = hdev->adv_addr_type;
4766 if (hdev->adv_addr_type == ADDR_LE_DEV_RANDOM)
4767 bacpy(&conn->resp_addr, &hdev->random_addr);
4768 else
4769 bacpy(&conn->resp_addr, &hdev->bdaddr);
4770
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304771 conn->init_addr_type = bdaddr_type;
4772 bacpy(&conn->init_addr, bdaddr);
Marcel Holtmanna720d732014-06-23 12:14:51 +02004773
4774 /* For incoming connections, set the default minimum
4775 * and maximum connection interval. They will be used
4776 * to check if the parameters are in range and if not
4777 * trigger the connection update procedure.
4778 */
4779 conn->le_conn_min_interval = hdev->le_conn_min_interval;
4780 conn->le_conn_max_interval = hdev->le_conn_max_interval;
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004781 }
Johan Hedberg7be2edb2014-02-23 19:42:17 +02004782
Marcel Holtmannedb4b462014-02-18 15:13:43 -08004783 /* Lookup the identity address from the stored connection
4784 * address and address type.
4785 *
4786 * When establishing connections to an identity address, the
4787 * connection procedure will store the resolvable random
4788 * address first. Now if it can be converted back into the
4789 * identity address, start using the identity address from
4790 * now on.
4791 */
4792 irk = hci_get_irk(hdev, &conn->dst, conn->dst_type);
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004793 if (irk) {
4794 bacpy(&conn->dst, &irk->bdaddr);
4795 conn->dst_type = irk->addr_type;
4796 }
4797
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304798 if (status) {
4799 hci_le_conn_failed(conn, status);
Johan Hedberg837d5022014-07-02 09:36:22 +03004800 goto unlock;
4801 }
4802
Johan Hedberg08853f12014-08-15 21:06:55 +03004803 if (conn->dst_type == ADDR_LE_DEV_PUBLIC)
4804 addr_type = BDADDR_LE_PUBLIC;
4805 else
4806 addr_type = BDADDR_LE_RANDOM;
4807
Johan Hedberg2d3c2262014-07-15 11:51:28 +03004808 /* Drop the connection if the device is blocked */
4809 if (hci_bdaddr_list_lookup(&hdev->blacklist, &conn->dst, addr_type)) {
4810 hci_conn_drop(conn);
Andre Guedescd17dec2012-07-27 15:10:16 -03004811 goto unlock;
4812 }
4813
Johan Hedbergb644ba32012-01-17 21:48:47 +02004814 if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00004815 mgmt_device_connected(hdev, conn, 0, NULL, 0);
Vinicius Costa Gomes83bc71b2011-05-06 18:41:43 -03004816
Vinicius Costa Gomes7b5c0d52011-06-09 18:50:50 -03004817 conn->sec_level = BT_SECURITY_LOW;
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304818 conn->handle = handle;
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07004819 conn->state = BT_CONFIG;
Ville Tervofcd89c02011-02-10 22:38:47 -03004820
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304821 conn->le_conn_interval = interval;
4822 conn->le_conn_latency = latency;
4823 conn->le_supv_timeout = supervision_timeout;
Marcel Holtmanne04fde62014-06-23 11:40:04 +02004824
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01004825 hci_debugfs_create_conn(conn);
Ville Tervofcd89c02011-02-10 22:38:47 -03004826 hci_conn_add_sysfs(conn);
4827
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304828 if (!status) {
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07004829 /* The remote features procedure is defined for master
4830 * role only. So only in case of an initiated connection
4831 * request the remote features.
4832 *
4833 * If the local controller supports slave-initiated features
4834 * exchange, then requesting the remote features in slave
4835 * role is possible. Otherwise just transition into the
4836 * connected state without requesting the remote features.
4837 */
4838 if (conn->out ||
4839 (hdev->le_features[0] & HCI_LE_SLAVE_FEATURES)) {
4840 struct hci_cp_le_read_remote_features cp;
4841
4842 cp.handle = __cpu_to_le16(conn->handle);
4843
4844 hci_send_cmd(hdev, HCI_OP_LE_READ_REMOTE_FEATURES,
4845 sizeof(cp), &cp);
4846
4847 hci_conn_hold(conn);
4848 } else {
4849 conn->state = BT_CONNECTED;
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304850 hci_connect_cfm(conn, status);
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07004851 }
4852 } else {
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304853 hci_connect_cfm(conn, status);
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07004854 }
Ville Tervofcd89c02011-02-10 22:38:47 -03004855
Johan Hedberg54776102014-08-15 21:06:56 +03004856 params = hci_pend_le_action_lookup(&hdev->pend_le_conns, &conn->dst,
4857 conn->dst_type);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004858 if (params) {
Johan Hedberg95305ba2014-07-04 12:37:21 +03004859 list_del_init(&params->action);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004860 if (params->conn) {
4861 hci_conn_drop(params->conn);
Johan Hedbergf8aaf9b2014-08-17 23:28:57 +03004862 hci_conn_put(params->conn);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004863 params->conn = NULL;
4864 }
4865 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004866
Ville Tervofcd89c02011-02-10 22:38:47 -03004867unlock:
Johan Hedberg223683a52014-07-06 15:44:23 +03004868 hci_update_background_scan(hdev);
Ville Tervofcd89c02011-02-10 22:38:47 -03004869 hci_dev_unlock(hdev);
4870}
4871
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304872static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
4873{
4874 struct hci_ev_le_conn_complete *ev = (void *) skb->data;
4875
4876 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4877
4878 le_conn_complete_evt(hdev, ev->status, &ev->bdaddr, ev->bdaddr_type,
4879 ev->role, le16_to_cpu(ev->handle),
4880 le16_to_cpu(ev->interval),
4881 le16_to_cpu(ev->latency),
4882 le16_to_cpu(ev->supervision_timeout));
4883}
4884
Jaganath Kanakkassery4d94f952018-07-06 22:50:32 +02004885static void hci_le_enh_conn_complete_evt(struct hci_dev *hdev,
4886 struct sk_buff *skb)
4887{
4888 struct hci_ev_le_enh_conn_complete *ev = (void *) skb->data;
4889
4890 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4891
4892 le_conn_complete_evt(hdev, ev->status, &ev->bdaddr, ev->bdaddr_type,
4893 ev->role, le16_to_cpu(ev->handle),
4894 le16_to_cpu(ev->interval),
4895 le16_to_cpu(ev->latency),
4896 le16_to_cpu(ev->supervision_timeout));
4897}
4898
Marcel Holtmann1855d922014-06-23 11:40:05 +02004899static void hci_le_conn_update_complete_evt(struct hci_dev *hdev,
4900 struct sk_buff *skb)
4901{
4902 struct hci_ev_le_conn_update_complete *ev = (void *) skb->data;
4903 struct hci_conn *conn;
4904
4905 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4906
4907 if (ev->status)
4908 return;
4909
4910 hci_dev_lock(hdev);
4911
4912 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
4913 if (conn) {
4914 conn->le_conn_interval = le16_to_cpu(ev->interval);
4915 conn->le_conn_latency = le16_to_cpu(ev->latency);
4916 conn->le_supv_timeout = le16_to_cpu(ev->supervision_timeout);
4917 }
4918
4919 hci_dev_unlock(hdev);
4920}
4921
Andre Guedesa4790db2014-02-26 20:21:47 -03004922/* This function requires the caller holds hdev->lock */
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004923static struct hci_conn *check_pending_le_conn(struct hci_dev *hdev,
4924 bdaddr_t *addr,
Szymon Janc082f2302018-04-03 13:40:06 +02004925 u8 addr_type, u8 adv_type,
4926 bdaddr_t *direct_rpa)
Andre Guedesa4790db2014-02-26 20:21:47 -03004927{
4928 struct hci_conn *conn;
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004929 struct hci_conn_params *params;
Andre Guedesa4790db2014-02-26 20:21:47 -03004930
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004931 /* If the event is not connectable don't proceed further */
4932 if (adv_type != LE_ADV_IND && adv_type != LE_ADV_DIRECT_IND)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004933 return NULL;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004934
4935 /* Ignore if the device is blocked */
Johan Hedbergdcc36c12014-07-09 12:59:13 +03004936 if (hci_bdaddr_list_lookup(&hdev->blacklist, addr, addr_type))
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004937 return NULL;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004938
Johan Hedbergf99353c2014-07-16 11:56:09 +03004939 /* Most controller will fail if we try to create new connections
4940 * while we have an existing one in slave role.
4941 */
4942 if (hdev->conn_hash.le_num_slave > 0)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004943 return NULL;
Johan Hedbergf99353c2014-07-16 11:56:09 +03004944
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004945 /* If we're not connectable only connect devices that we have in
4946 * our pend_le_conns list.
4947 */
Johan Hedberg49c50922015-10-16 10:07:51 +03004948 params = hci_pend_le_action_lookup(&hdev->pend_le_conns, addr,
4949 addr_type);
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004950 if (!params)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004951 return NULL;
Andre Guedesa4790db2014-02-26 20:21:47 -03004952
Jakub Pawlowski28a667c2015-08-07 20:22:54 +02004953 if (!params->explicit_connect) {
4954 switch (params->auto_connect) {
4955 case HCI_AUTO_CONN_DIRECT:
4956 /* Only devices advertising with ADV_DIRECT_IND are
4957 * triggering a connection attempt. This is allowing
4958 * incoming connections from slave devices.
4959 */
4960 if (adv_type != LE_ADV_DIRECT_IND)
4961 return NULL;
4962 break;
4963 case HCI_AUTO_CONN_ALWAYS:
4964 /* Devices advertising with ADV_IND or ADV_DIRECT_IND
4965 * are triggering a connection attempt. This means
4966 * that incoming connectioms from slave device are
4967 * accepted and also outgoing connections to slave
4968 * devices are established when found.
4969 */
4970 break;
4971 default:
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004972 return NULL;
Jakub Pawlowski28a667c2015-08-07 20:22:54 +02004973 }
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004974 }
4975
Andre Guedesa4790db2014-02-26 20:21:47 -03004976 conn = hci_connect_le(hdev, addr, addr_type, BT_SECURITY_LOW,
Szymon Janc082f2302018-04-03 13:40:06 +02004977 HCI_LE_AUTOCONN_TIMEOUT, HCI_ROLE_MASTER,
4978 direct_rpa);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004979 if (!IS_ERR(conn)) {
Jakub Pawlowski28a667c2015-08-07 20:22:54 +02004980 /* If HCI_AUTO_CONN_EXPLICIT is set, conn is already owned
4981 * by higher layer that tried to connect, if no then
4982 * store the pointer since we don't really have any
Johan Hedbergf161dd42014-08-15 21:06:54 +03004983 * other owner of the object besides the params that
4984 * triggered it. This way we can abort the connection if
4985 * the parameters get removed and keep the reference
4986 * count consistent once the connection is established.
4987 */
Jakub Pawlowski28a667c2015-08-07 20:22:54 +02004988
4989 if (!params->explicit_connect)
4990 params->conn = hci_conn_get(conn);
4991
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004992 return conn;
Johan Hedbergf161dd42014-08-15 21:06:54 +03004993 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004994
4995 switch (PTR_ERR(conn)) {
4996 case -EBUSY:
4997 /* If hci_connect() returns -EBUSY it means there is already
4998 * an LE connection attempt going on. Since controllers don't
4999 * support more than one connection attempt at the time, we
5000 * don't consider this an error case.
5001 */
5002 break;
5003 default:
5004 BT_DBG("Failed to connect: err %ld", PTR_ERR(conn));
Alfonso Acostafd45ada2014-10-07 08:44:11 +00005005 return NULL;
Andre Guedesa4790db2014-02-26 20:21:47 -03005006 }
Alfonso Acostafd45ada2014-10-07 08:44:11 +00005007
5008 return NULL;
Andre Guedesa4790db2014-02-26 20:21:47 -03005009}
5010
Johan Hedberg4af605d2014-03-24 10:48:00 +02005011static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr,
Marcel Holtmann2f010b52014-12-05 16:20:13 +01005012 u8 bdaddr_type, bdaddr_t *direct_addr,
5013 u8 direct_addr_type, s8 rssi, u8 *data, u8 len)
Johan Hedberg4af605d2014-03-24 10:48:00 +02005014{
Johan Hedbergb9a63282014-03-25 10:51:52 +02005015 struct discovery_state *d = &hdev->discovery;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03005016 struct smp_irk *irk;
Alfonso Acostafd45ada2014-10-07 08:44:11 +00005017 struct hci_conn *conn;
Johan Hedberg474ee062014-03-25 14:34:59 +02005018 bool match;
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02005019 u32 flags;
Szymon Janc68183752015-09-16 20:21:54 +02005020 u8 *ptr, real_len;
5021
Johan Hedberg56b40fb2016-04-07 21:01:27 +03005022 switch (type) {
5023 case LE_ADV_IND:
5024 case LE_ADV_DIRECT_IND:
5025 case LE_ADV_SCAN_IND:
5026 case LE_ADV_NONCONN_IND:
5027 case LE_ADV_SCAN_RSP:
5028 break;
5029 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01005030 bt_dev_err_ratelimited(hdev, "unknown advertising packet "
5031 "type: 0x%02x", type);
Johan Hedberg56b40fb2016-04-07 21:01:27 +03005032 return;
5033 }
5034
Szymon Janc68183752015-09-16 20:21:54 +02005035 /* Find the end of the data in case the report contains padded zero
5036 * bytes at the end causing an invalid length value.
5037 *
5038 * When data is NULL, len is 0 so there is no need for extra ptr
5039 * check as 'ptr < data + 0' is already false in such case.
5040 */
5041 for (ptr = data; ptr < data + len && *ptr; ptr += *ptr + 1) {
5042 if (ptr + 1 + *ptr > data + len)
5043 break;
5044 }
5045
5046 real_len = ptr - data;
5047
5048 /* Adjust for actual length */
5049 if (len != real_len) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01005050 bt_dev_err_ratelimited(hdev, "advertising data len corrected");
Szymon Janc68183752015-09-16 20:21:54 +02005051 len = real_len;
5052 }
Johan Hedbergb9a63282014-03-25 10:51:52 +02005053
Marcel Holtmann2f010b52014-12-05 16:20:13 +01005054 /* If the direct address is present, then this report is from
5055 * a LE Direct Advertising Report event. In that case it is
5056 * important to see if the address is matching the local
5057 * controller address.
5058 */
5059 if (direct_addr) {
5060 /* Only resolvable random addresses are valid for these
5061 * kind of reports and others can be ignored.
5062 */
5063 if (!hci_bdaddr_is_rpa(direct_addr, direct_addr_type))
5064 return;
5065
5066 /* If the controller is not using resolvable random
5067 * addresses, then this report can be ignored.
5068 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07005069 if (!hci_dev_test_flag(hdev, HCI_PRIVACY))
Marcel Holtmann2f010b52014-12-05 16:20:13 +01005070 return;
5071
5072 /* If the local IRK of the controller does not match
5073 * with the resolvable random address provided, then
5074 * this report can be ignored.
5075 */
5076 if (!smp_irk_matches(hdev, hdev->irk, direct_addr))
5077 return;
5078 }
5079
Johan Hedberg1c1abca2014-07-07 12:45:53 +03005080 /* Check if we need to convert to identity address */
5081 irk = hci_get_irk(hdev, bdaddr, bdaddr_type);
5082 if (irk) {
5083 bdaddr = &irk->bdaddr;
5084 bdaddr_type = irk->addr_type;
5085 }
5086
Szymon Janc082f2302018-04-03 13:40:06 +02005087 /* Check if we have been requested to connect to this device.
5088 *
5089 * direct_addr is set only for directed advertising reports (it is NULL
5090 * for advertising reports) and is already verified to be RPA above.
5091 */
5092 conn = check_pending_le_conn(hdev, bdaddr, bdaddr_type, type,
5093 direct_addr);
Alfonso Acostafd45ada2014-10-07 08:44:11 +00005094 if (conn && type == LE_ADV_IND) {
5095 /* Store report for later inclusion by
5096 * mgmt_device_connected
5097 */
5098 memcpy(conn->le_adv_data, data, len);
5099 conn->le_adv_data_len = len;
5100 }
Johan Hedberg1c1abca2014-07-07 12:45:53 +03005101
Johan Hedberg0d2bf132014-07-02 22:42:02 +03005102 /* Passive scanning shouldn't trigger any device found events,
5103 * except for devices marked as CONN_REPORT for which we do send
5104 * device found events.
5105 */
Johan Hedbergca5c4be2014-03-25 10:30:46 +02005106 if (hdev->le_scan_type == LE_SCAN_PASSIVE) {
Johan Hedberg0d2bf132014-07-02 22:42:02 +03005107 if (type == LE_ADV_DIRECT_IND)
5108 return;
5109
Johan Hedberg3a19b6f2014-07-15 08:07:59 +03005110 if (!hci_pend_le_action_lookup(&hdev->pend_le_reports,
5111 bdaddr, bdaddr_type))
Johan Hedberg0d2bf132014-07-02 22:42:02 +03005112 return;
5113
5114 if (type == LE_ADV_NONCONN_IND || type == LE_ADV_SCAN_IND)
5115 flags = MGMT_DEV_FOUND_NOT_CONNECTABLE;
5116 else
5117 flags = 0;
5118 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
5119 rssi, flags, data, len, NULL, 0);
Johan Hedberg97bf2e92014-07-04 12:37:16 +03005120 return;
Johan Hedbergca5c4be2014-03-25 10:30:46 +02005121 }
Johan Hedberg4af605d2014-03-24 10:48:00 +02005122
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02005123 /* When receiving non-connectable or scannable undirected
5124 * advertising reports, this means that the remote device is
5125 * not connectable and then clearly indicate this in the
5126 * device found event.
5127 *
5128 * When receiving a scan response, then there is no way to
5129 * know if the remote device is connectable or not. However
5130 * since scan responses are merged with a previously seen
5131 * advertising report, the flags field from that report
5132 * will be used.
5133 *
5134 * In the really unlikely case that a controller get confused
5135 * and just sends a scan response event, then it is marked as
5136 * not connectable as well.
5137 */
5138 if (type == LE_ADV_NONCONN_IND || type == LE_ADV_SCAN_IND ||
5139 type == LE_ADV_SCAN_RSP)
5140 flags = MGMT_DEV_FOUND_NOT_CONNECTABLE;
5141 else
5142 flags = 0;
5143
Johan Hedbergb9a63282014-03-25 10:51:52 +02005144 /* If there's nothing pending either store the data from this
5145 * event or send an immediate device found event if the data
5146 * should not be stored for later.
5147 */
5148 if (!has_pending_adv_report(hdev)) {
5149 /* If the report will trigger a SCAN_REQ store it for
5150 * later merging.
5151 */
5152 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
5153 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02005154 rssi, flags, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02005155 return;
5156 }
5157
5158 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02005159 rssi, flags, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02005160 return;
5161 }
5162
Johan Hedberg474ee062014-03-25 14:34:59 +02005163 /* Check if the pending report is for the same device as the new one */
5164 match = (!bacmp(bdaddr, &d->last_adv_addr) &&
5165 bdaddr_type == d->last_adv_addr_type);
5166
Johan Hedbergb9a63282014-03-25 10:51:52 +02005167 /* If the pending data doesn't match this report or this isn't a
5168 * scan response (e.g. we got a duplicate ADV_IND) then force
5169 * sending of the pending data.
5170 */
Johan Hedberg474ee062014-03-25 14:34:59 +02005171 if (type != LE_ADV_SCAN_RSP || !match) {
5172 /* Send out whatever is in the cache, but skip duplicates */
5173 if (!match)
5174 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergff5cd292014-03-25 14:40:52 +02005175 d->last_adv_addr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02005176 d->last_adv_rssi, d->last_adv_flags,
Johan Hedbergff5cd292014-03-25 14:40:52 +02005177 d->last_adv_data,
Johan Hedberg474ee062014-03-25 14:34:59 +02005178 d->last_adv_data_len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02005179
5180 /* If the new report will trigger a SCAN_REQ store it for
5181 * later merging.
5182 */
5183 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
5184 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02005185 rssi, flags, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02005186 return;
5187 }
5188
5189 /* The advertising reports cannot be merged, so clear
5190 * the pending report and send out a device found event.
5191 */
5192 clear_pending_adv_report(hdev);
Johan Hedberg5c5b93e2014-03-29 08:39:53 +02005193 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02005194 rssi, flags, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02005195 return;
5196 }
5197
5198 /* If we get here we've got a pending ADV_IND or ADV_SCAN_IND and
5199 * the new event is a SCAN_RSP. We can therefore proceed with
5200 * sending a merged device found event.
5201 */
5202 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02005203 d->last_adv_addr_type, NULL, rssi, d->last_adv_flags,
Marcel Holtmann42bd6a52014-07-01 14:11:19 +02005204 d->last_adv_data, d->last_adv_data_len, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02005205 clear_pending_adv_report(hdev);
Johan Hedberg4af605d2014-03-24 10:48:00 +02005206}
5207
Gustavo Padovan6039aa72012-05-23 04:04:18 -03005208static void hci_le_adv_report_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andre Guedes9aa04c92011-05-26 16:23:51 -03005209{
Andre Guedese95beb42011-09-26 20:48:35 -03005210 u8 num_reports = skb->data[0];
5211 void *ptr = &skb->data[1];
Andre Guedes9aa04c92011-05-26 16:23:51 -03005212
Andre Guedesa4790db2014-02-26 20:21:47 -03005213 hci_dev_lock(hdev);
5214
Andre Guedese95beb42011-09-26 20:48:35 -03005215 while (num_reports--) {
5216 struct hci_ev_le_advertising_info *ev = ptr;
Johan Hedberg4af605d2014-03-24 10:48:00 +02005217 s8 rssi;
Andre Guedesa4790db2014-02-26 20:21:47 -03005218
Chriz Chowee649342018-04-20 15:46:24 +08005219 if (ev->length <= HCI_MAX_AD_LENGTH) {
5220 rssi = ev->data[ev->length];
5221 process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
5222 ev->bdaddr_type, NULL, 0, rssi,
5223 ev->data, ev->length);
5224 } else {
5225 bt_dev_err(hdev, "Dropping invalid advertising data");
5226 }
Andre Guedes3c9e9192012-01-10 18:20:50 -03005227
Andre Guedese95beb42011-09-26 20:48:35 -03005228 ptr += sizeof(*ev) + ev->length + 1;
Andre Guedes9aa04c92011-05-26 16:23:51 -03005229 }
Andre Guedesa4790db2014-02-26 20:21:47 -03005230
5231 hci_dev_unlock(hdev);
Andre Guedes9aa04c92011-05-26 16:23:51 -03005232}
5233
Jaganath Kanakkasseryb2cc9762018-07-19 17:09:38 +05305234static u8 ext_evt_type_to_legacy(u16 evt_type)
Jaganath Kanakkasseryc215e932018-07-06 17:05:29 +05305235{
Jaganath Kanakkasseryb2cc9762018-07-19 17:09:38 +05305236 if (evt_type & LE_EXT_ADV_LEGACY_PDU) {
5237 switch (evt_type) {
5238 case LE_LEGACY_ADV_IND:
5239 return LE_ADV_IND;
5240 case LE_LEGACY_ADV_DIRECT_IND:
5241 return LE_ADV_DIRECT_IND;
5242 case LE_LEGACY_ADV_SCAN_IND:
5243 return LE_ADV_SCAN_IND;
5244 case LE_LEGACY_NONCONN_IND:
5245 return LE_ADV_NONCONN_IND;
5246 case LE_LEGACY_SCAN_RSP_ADV:
5247 case LE_LEGACY_SCAN_RSP_ADV_SCAN:
5248 return LE_ADV_SCAN_RSP;
5249 }
5250
5251 BT_ERR_RATELIMITED("Unknown advertising packet type: 0x%02x",
5252 evt_type);
5253
5254 return LE_ADV_INVALID;
Jaganath Kanakkasseryc215e932018-07-06 17:05:29 +05305255 }
5256
Jaganath Kanakkasseryb2cc9762018-07-19 17:09:38 +05305257 if (evt_type & LE_EXT_ADV_CONN_IND) {
5258 if (evt_type & LE_EXT_ADV_DIRECT_IND)
5259 return LE_ADV_DIRECT_IND;
5260
5261 return LE_ADV_IND;
5262 }
5263
5264 if (evt_type & LE_EXT_ADV_SCAN_RSP)
5265 return LE_ADV_SCAN_RSP;
5266
5267 if (evt_type & LE_EXT_ADV_SCAN_IND)
5268 return LE_ADV_SCAN_IND;
5269
5270 if (evt_type == LE_EXT_ADV_NON_CONN_IND ||
5271 evt_type & LE_EXT_ADV_DIRECT_IND)
5272 return LE_ADV_NONCONN_IND;
5273
Jaganath Kanakkasseryc215e932018-07-06 17:05:29 +05305274 BT_ERR_RATELIMITED("Unknown advertising packet type: 0x%02x",
5275 evt_type);
5276
5277 return LE_ADV_INVALID;
5278}
5279
5280static void hci_le_ext_adv_report_evt(struct hci_dev *hdev, struct sk_buff *skb)
5281{
5282 u8 num_reports = skb->data[0];
5283 void *ptr = &skb->data[1];
5284
5285 hci_dev_lock(hdev);
5286
5287 while (num_reports--) {
5288 struct hci_ev_le_ext_adv_report *ev = ptr;
5289 u8 legacy_evt_type;
5290 u16 evt_type;
5291
5292 evt_type = __le16_to_cpu(ev->evt_type);
Jaganath Kanakkasseryb2cc9762018-07-19 17:09:38 +05305293 legacy_evt_type = ext_evt_type_to_legacy(evt_type);
Jaganath Kanakkasseryc215e932018-07-06 17:05:29 +05305294 if (legacy_evt_type != LE_ADV_INVALID) {
5295 process_adv_report(hdev, legacy_evt_type, &ev->bdaddr,
5296 ev->bdaddr_type, NULL, 0, ev->rssi,
5297 ev->data, ev->length);
5298 }
5299
5300 ptr += sizeof(*ev) + ev->length + 1;
5301 }
5302
5303 hci_dev_unlock(hdev);
5304}
5305
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07005306static void hci_le_remote_feat_complete_evt(struct hci_dev *hdev,
5307 struct sk_buff *skb)
5308{
5309 struct hci_ev_le_remote_feat_complete *ev = (void *)skb->data;
5310 struct hci_conn *conn;
5311
5312 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
5313
5314 hci_dev_lock(hdev);
5315
5316 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
5317 if (conn) {
5318 if (!ev->status)
5319 memcpy(conn->features[0], ev->features, 8);
5320
5321 if (conn->state == BT_CONFIG) {
5322 __u8 status;
5323
5324 /* If the local controller supports slave-initiated
5325 * features exchange, but the remote controller does
5326 * not, then it is possible that the error code 0x1a
5327 * for unsupported remote feature gets returned.
5328 *
5329 * In this specific case, allow the connection to
5330 * transition into connected state and mark it as
5331 * successful.
5332 */
5333 if ((hdev->le_features[0] & HCI_LE_SLAVE_FEATURES) &&
5334 !conn->out && ev->status == 0x1a)
5335 status = 0x00;
5336 else
5337 status = ev->status;
5338
5339 conn->state = BT_CONNECTED;
5340 hci_connect_cfm(conn, status);
5341 hci_conn_drop(conn);
5342 }
5343 }
5344
5345 hci_dev_unlock(hdev);
5346}
5347
Gustavo Padovan6039aa72012-05-23 04:04:18 -03005348static void hci_le_ltk_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005349{
5350 struct hci_ev_le_ltk_req *ev = (void *) skb->data;
5351 struct hci_cp_le_ltk_reply cp;
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03005352 struct hci_cp_le_ltk_neg_reply neg;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005353 struct hci_conn *conn;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03005354 struct smp_ltk *ltk;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005355
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03005356 BT_DBG("%s handle 0x%4.4x", hdev->name, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005357
5358 hci_dev_lock(hdev);
5359
5360 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03005361 if (conn == NULL)
5362 goto not_found;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005363
Johan Hedbergf3a73d92014-05-29 15:02:59 +03005364 ltk = hci_find_ltk(hdev, &conn->dst, conn->dst_type, conn->role);
Johan Hedberg5378bc52014-05-29 14:00:39 +03005365 if (!ltk)
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03005366 goto not_found;
5367
Johan Hedberg5378bc52014-05-29 14:00:39 +03005368 if (smp_ltk_is_sc(ltk)) {
5369 /* With SC both EDiv and Rand are set to zero */
5370 if (ev->ediv || ev->rand)
5371 goto not_found;
5372 } else {
5373 /* For non-SC keys check that EDiv and Rand match */
5374 if (ev->ediv != ltk->ediv || ev->rand != ltk->rand)
5375 goto not_found;
5376 }
5377
Johan Hedberg8b76ce32015-06-08 18:14:39 +03005378 memcpy(cp.ltk, ltk->val, ltk->enc_size);
5379 memset(cp.ltk + ltk->enc_size, 0, sizeof(cp.ltk) - ltk->enc_size);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005380 cp.handle = cpu_to_le16(conn->handle);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03005381
Johan Hedberga6f78332014-09-10 17:37:45 -07005382 conn->pending_sec_level = smp_ltk_sec_level(ltk);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005383
Andre Guedes89cbb4d2013-07-31 16:25:29 -03005384 conn->enc_key_size = ltk->enc_size;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005385
5386 hci_send_cmd(hdev, HCI_OP_LE_LTK_REPLY, sizeof(cp), &cp);
5387
Claudio Takahasi5981a882013-07-25 16:34:24 -03005388 /* Ref. Bluetooth Core SPEC pages 1975 and 2004. STK is a
5389 * temporary key used to encrypt a connection following
5390 * pairing. It is used during the Encrypted Session Setup to
5391 * distribute the keys. Later, security can be re-established
5392 * using a distributed LTK.
5393 */
Johan Hedberg2ceba532014-06-16 19:25:16 +03005394 if (ltk->type == SMP_STK) {
Johan Hedbergfe59a052014-07-01 19:14:12 +03005395 set_bit(HCI_CONN_STK_ENCRYPT, &conn->flags);
Johan Hedberg970d0f12014-11-13 14:37:47 +02005396 list_del_rcu(&ltk->list);
5397 kfree_rcu(ltk, rcu);
Johan Hedbergfe59a052014-07-01 19:14:12 +03005398 } else {
5399 clear_bit(HCI_CONN_STK_ENCRYPT, &conn->flags);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03005400 }
5401
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005402 hci_dev_unlock(hdev);
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03005403
5404 return;
5405
5406not_found:
5407 neg.handle = ev->handle;
5408 hci_send_cmd(hdev, HCI_OP_LE_LTK_NEG_REPLY, sizeof(neg), &neg);
5409 hci_dev_unlock(hdev);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005410}
5411
Andre Guedes8e75b462014-07-01 18:10:08 -03005412static void send_conn_param_neg_reply(struct hci_dev *hdev, u16 handle,
5413 u8 reason)
5414{
5415 struct hci_cp_le_conn_param_req_neg_reply cp;
5416
5417 cp.handle = cpu_to_le16(handle);
5418 cp.reason = reason;
5419
5420 hci_send_cmd(hdev, HCI_OP_LE_CONN_PARAM_REQ_NEG_REPLY, sizeof(cp),
5421 &cp);
5422}
5423
5424static void hci_le_remote_conn_param_req_evt(struct hci_dev *hdev,
5425 struct sk_buff *skb)
5426{
5427 struct hci_ev_le_remote_conn_param_req *ev = (void *) skb->data;
5428 struct hci_cp_le_conn_param_req_reply cp;
5429 struct hci_conn *hcon;
5430 u16 handle, min, max, latency, timeout;
5431
5432 handle = le16_to_cpu(ev->handle);
5433 min = le16_to_cpu(ev->interval_min);
5434 max = le16_to_cpu(ev->interval_max);
5435 latency = le16_to_cpu(ev->latency);
5436 timeout = le16_to_cpu(ev->timeout);
5437
5438 hcon = hci_conn_hash_lookup_handle(hdev, handle);
5439 if (!hcon || hcon->state != BT_CONNECTED)
5440 return send_conn_param_neg_reply(hdev, handle,
5441 HCI_ERROR_UNKNOWN_CONN_ID);
5442
5443 if (hci_check_conn_params(min, max, latency, timeout))
5444 return send_conn_param_neg_reply(hdev, handle,
5445 HCI_ERROR_INVALID_LL_PARAMS);
5446
Johan Hedberg40bef302014-07-16 11:42:27 +03005447 if (hcon->role == HCI_ROLE_MASTER) {
Johan Hedberg348d50b2014-07-02 17:37:30 +03005448 struct hci_conn_params *params;
Johan Hedbergf4869e22014-07-02 17:37:32 +03005449 u8 store_hint;
Johan Hedberg348d50b2014-07-02 17:37:30 +03005450
5451 hci_dev_lock(hdev);
5452
5453 params = hci_conn_params_lookup(hdev, &hcon->dst,
5454 hcon->dst_type);
5455 if (params) {
5456 params->conn_min_interval = min;
5457 params->conn_max_interval = max;
5458 params->conn_latency = latency;
5459 params->supervision_timeout = timeout;
Johan Hedbergf4869e22014-07-02 17:37:32 +03005460 store_hint = 0x01;
5461 } else{
5462 store_hint = 0x00;
Johan Hedberg348d50b2014-07-02 17:37:30 +03005463 }
5464
5465 hci_dev_unlock(hdev);
5466
Johan Hedbergf4869e22014-07-02 17:37:32 +03005467 mgmt_new_conn_param(hdev, &hcon->dst, hcon->dst_type,
5468 store_hint, min, max, latency, timeout);
Johan Hedberg348d50b2014-07-02 17:37:30 +03005469 }
Andre Guedesffb5a8272014-07-01 18:10:11 -03005470
Andre Guedes8e75b462014-07-01 18:10:08 -03005471 cp.handle = ev->handle;
5472 cp.interval_min = ev->interval_min;
5473 cp.interval_max = ev->interval_max;
5474 cp.latency = ev->latency;
5475 cp.timeout = ev->timeout;
5476 cp.min_ce_len = 0;
5477 cp.max_ce_len = 0;
5478
5479 hci_send_cmd(hdev, HCI_OP_LE_CONN_PARAM_REQ_REPLY, sizeof(cp), &cp);
5480}
5481
Marcel Holtmann2f010b52014-12-05 16:20:13 +01005482static void hci_le_direct_adv_report_evt(struct hci_dev *hdev,
5483 struct sk_buff *skb)
5484{
5485 u8 num_reports = skb->data[0];
5486 void *ptr = &skb->data[1];
5487
5488 hci_dev_lock(hdev);
5489
5490 while (num_reports--) {
5491 struct hci_ev_le_direct_adv_info *ev = ptr;
5492
5493 process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
5494 ev->bdaddr_type, &ev->direct_addr,
5495 ev->direct_addr_type, ev->rssi, NULL, 0);
5496
5497 ptr += sizeof(*ev);
5498 }
5499
5500 hci_dev_unlock(hdev);
5501}
5502
Gustavo Padovan6039aa72012-05-23 04:04:18 -03005503static void hci_le_meta_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03005504{
5505 struct hci_ev_le_meta *le_ev = (void *) skb->data;
5506
5507 skb_pull(skb, sizeof(*le_ev));
5508
5509 switch (le_ev->subevent) {
5510 case HCI_EV_LE_CONN_COMPLETE:
5511 hci_le_conn_complete_evt(hdev, skb);
5512 break;
5513
Marcel Holtmann1855d922014-06-23 11:40:05 +02005514 case HCI_EV_LE_CONN_UPDATE_COMPLETE:
5515 hci_le_conn_update_complete_evt(hdev, skb);
5516 break;
5517
Andre Guedes9aa04c92011-05-26 16:23:51 -03005518 case HCI_EV_LE_ADVERTISING_REPORT:
5519 hci_le_adv_report_evt(hdev, skb);
5520 break;
5521
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07005522 case HCI_EV_LE_REMOTE_FEAT_COMPLETE:
5523 hci_le_remote_feat_complete_evt(hdev, skb);
5524 break;
5525
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005526 case HCI_EV_LE_LTK_REQ:
5527 hci_le_ltk_request_evt(hdev, skb);
5528 break;
5529
Andre Guedes8e75b462014-07-01 18:10:08 -03005530 case HCI_EV_LE_REMOTE_CONN_PARAM_REQ:
5531 hci_le_remote_conn_param_req_evt(hdev, skb);
5532 break;
5533
Marcel Holtmann2f010b52014-12-05 16:20:13 +01005534 case HCI_EV_LE_DIRECT_ADV_REPORT:
5535 hci_le_direct_adv_report_evt(hdev, skb);
5536 break;
5537
Jaganath Kanakkasseryc215e932018-07-06 17:05:29 +05305538 case HCI_EV_LE_EXT_ADV_REPORT:
5539 hci_le_ext_adv_report_evt(hdev, skb);
5540 break;
5541
Jaganath Kanakkassery4d94f952018-07-06 22:50:32 +02005542 case HCI_EV_LE_ENHANCED_CONN_COMPLETE:
5543 hci_le_enh_conn_complete_evt(hdev, skb);
5544 break;
5545
Ville Tervofcd89c02011-02-10 22:38:47 -03005546 default:
5547 break;
5548 }
5549}
5550
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005551static bool hci_get_cmd_complete(struct hci_dev *hdev, u16 opcode,
5552 u8 event, struct sk_buff *skb)
5553{
5554 struct hci_ev_cmd_complete *ev;
5555 struct hci_event_hdr *hdr;
5556
5557 if (!skb)
5558 return false;
5559
5560 if (skb->len < sizeof(*hdr)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01005561 bt_dev_err(hdev, "too short HCI event");
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005562 return false;
5563 }
5564
5565 hdr = (void *) skb->data;
5566 skb_pull(skb, HCI_EVENT_HDR_SIZE);
5567
5568 if (event) {
5569 if (hdr->evt != event)
5570 return false;
5571 return true;
5572 }
5573
5574 if (hdr->evt != HCI_EV_CMD_COMPLETE) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01005575 bt_dev_err(hdev, "last event is not cmd complete (0x%2.2x)",
5576 hdr->evt);
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005577 return false;
5578 }
5579
5580 if (skb->len < sizeof(*ev)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01005581 bt_dev_err(hdev, "too short cmd_complete event");
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005582 return false;
5583 }
5584
5585 ev = (void *) skb->data;
5586 skb_pull(skb, sizeof(*ev));
5587
5588 if (opcode != __le16_to_cpu(ev->opcode)) {
5589 BT_DBG("opcode doesn't match (0x%2.2x != 0x%2.2x)", opcode,
5590 __le16_to_cpu(ev->opcode));
5591 return false;
5592 }
5593
5594 return true;
5595}
5596
Linus Torvalds1da177e2005-04-16 15:20:36 -07005597void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)
5598{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005599 struct hci_event_hdr *hdr = (void *) skb->data;
Johan Hedberge62144872015-04-02 13:41:08 +03005600 hci_req_complete_t req_complete = NULL;
5601 hci_req_complete_skb_t req_complete_skb = NULL;
5602 struct sk_buff *orig_skb = NULL;
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005603 u8 status = 0, event = hdr->evt, req_evt = 0;
Johan Hedberge62144872015-04-02 13:41:08 +03005604 u16 opcode = HCI_OP_NOP;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005605
Marcel Holtmann242c0eb2015-10-25 22:45:53 +01005606 if (hdev->sent_cmd && bt_cb(hdev->sent_cmd)->hci.req_event == event) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02005607 struct hci_command_hdr *cmd_hdr = (void *) hdev->sent_cmd->data;
Johan Hedberge62144872015-04-02 13:41:08 +03005608 opcode = __le16_to_cpu(cmd_hdr->opcode);
5609 hci_req_cmd_complete(hdev, opcode, status, &req_complete,
5610 &req_complete_skb);
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005611 req_evt = event;
Johan Hedberg02350a72013-04-03 21:50:29 +03005612 }
5613
Johan Hedberge62144872015-04-02 13:41:08 +03005614 /* If it looks like we might end up having to call
5615 * req_complete_skb, store a pristine copy of the skb since the
5616 * various handlers may modify the original one through
5617 * skb_pull() calls, etc.
5618 */
5619 if (req_complete_skb || event == HCI_EV_CMD_STATUS ||
5620 event == HCI_EV_CMD_COMPLETE)
5621 orig_skb = skb_clone(skb, GFP_KERNEL);
5622
5623 skb_pull(skb, HCI_EVENT_HDR_SIZE);
5624
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005625 switch (event) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005626 case HCI_EV_INQUIRY_COMPLETE:
5627 hci_inquiry_complete_evt(hdev, skb);
5628 break;
5629
5630 case HCI_EV_INQUIRY_RESULT:
5631 hci_inquiry_result_evt(hdev, skb);
5632 break;
5633
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005634 case HCI_EV_CONN_COMPLETE:
5635 hci_conn_complete_evt(hdev, skb);
Marcel Holtmann21d9e302005-09-13 01:32:25 +02005636 break;
5637
Linus Torvalds1da177e2005-04-16 15:20:36 -07005638 case HCI_EV_CONN_REQUEST:
5639 hci_conn_request_evt(hdev, skb);
5640 break;
5641
Linus Torvalds1da177e2005-04-16 15:20:36 -07005642 case HCI_EV_DISCONN_COMPLETE:
5643 hci_disconn_complete_evt(hdev, skb);
5644 break;
5645
Linus Torvalds1da177e2005-04-16 15:20:36 -07005646 case HCI_EV_AUTH_COMPLETE:
5647 hci_auth_complete_evt(hdev, skb);
5648 break;
5649
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005650 case HCI_EV_REMOTE_NAME:
5651 hci_remote_name_evt(hdev, skb);
5652 break;
5653
Linus Torvalds1da177e2005-04-16 15:20:36 -07005654 case HCI_EV_ENCRYPT_CHANGE:
5655 hci_encrypt_change_evt(hdev, skb);
5656 break;
5657
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005658 case HCI_EV_CHANGE_LINK_KEY_COMPLETE:
5659 hci_change_link_key_complete_evt(hdev, skb);
5660 break;
5661
5662 case HCI_EV_REMOTE_FEATURES:
5663 hci_remote_features_evt(hdev, skb);
5664 break;
5665
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005666 case HCI_EV_CMD_COMPLETE:
Johan Hedberge62144872015-04-02 13:41:08 +03005667 hci_cmd_complete_evt(hdev, skb, &opcode, &status,
5668 &req_complete, &req_complete_skb);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005669 break;
5670
5671 case HCI_EV_CMD_STATUS:
Johan Hedberge62144872015-04-02 13:41:08 +03005672 hci_cmd_status_evt(hdev, skb, &opcode, &status, &req_complete,
5673 &req_complete_skb);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005674 break;
5675
Marcel Holtmann24dfa342014-11-02 02:56:41 +01005676 case HCI_EV_HARDWARE_ERROR:
5677 hci_hardware_error_evt(hdev, skb);
5678 break;
5679
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005680 case HCI_EV_ROLE_CHANGE:
5681 hci_role_change_evt(hdev, skb);
5682 break;
5683
5684 case HCI_EV_NUM_COMP_PKTS:
5685 hci_num_comp_pkts_evt(hdev, skb);
5686 break;
5687
5688 case HCI_EV_MODE_CHANGE:
5689 hci_mode_change_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005690 break;
5691
5692 case HCI_EV_PIN_CODE_REQ:
5693 hci_pin_code_request_evt(hdev, skb);
5694 break;
5695
5696 case HCI_EV_LINK_KEY_REQ:
5697 hci_link_key_request_evt(hdev, skb);
5698 break;
5699
5700 case HCI_EV_LINK_KEY_NOTIFY:
5701 hci_link_key_notify_evt(hdev, skb);
5702 break;
5703
5704 case HCI_EV_CLOCK_OFFSET:
5705 hci_clock_offset_evt(hdev, skb);
5706 break;
5707
Marcel Holtmanna8746412008-07-14 20:13:46 +02005708 case HCI_EV_PKT_TYPE_CHANGE:
5709 hci_pkt_type_change_evt(hdev, skb);
5710 break;
5711
Marcel Holtmann85a1e932005-08-09 20:28:02 -07005712 case HCI_EV_PSCAN_REP_MODE:
5713 hci_pscan_rep_mode_evt(hdev, skb);
5714 break;
5715
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005716 case HCI_EV_INQUIRY_RESULT_WITH_RSSI:
5717 hci_inquiry_result_with_rssi_evt(hdev, skb);
5718 break;
5719
5720 case HCI_EV_REMOTE_EXT_FEATURES:
5721 hci_remote_ext_features_evt(hdev, skb);
5722 break;
5723
5724 case HCI_EV_SYNC_CONN_COMPLETE:
5725 hci_sync_conn_complete_evt(hdev, skb);
5726 break;
5727
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005728 case HCI_EV_EXTENDED_INQUIRY_RESULT:
5729 hci_extended_inquiry_result_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005730 break;
5731
Johan Hedberg1c2e0042012-06-08 23:31:13 +08005732 case HCI_EV_KEY_REFRESH_COMPLETE:
5733 hci_key_refresh_complete_evt(hdev, skb);
5734 break;
5735
Marcel Holtmann04936842008-07-14 20:13:48 +02005736 case HCI_EV_IO_CAPA_REQUEST:
5737 hci_io_capa_request_evt(hdev, skb);
5738 break;
5739
Johan Hedberg03b555e2011-01-04 15:40:05 +02005740 case HCI_EV_IO_CAPA_REPLY:
5741 hci_io_capa_reply_evt(hdev, skb);
5742 break;
5743
Johan Hedberga5c29682011-02-19 12:05:57 -03005744 case HCI_EV_USER_CONFIRM_REQUEST:
5745 hci_user_confirm_request_evt(hdev, skb);
5746 break;
5747
Brian Gix1143d452011-11-23 08:28:34 -08005748 case HCI_EV_USER_PASSKEY_REQUEST:
5749 hci_user_passkey_request_evt(hdev, skb);
5750 break;
5751
Johan Hedberg92a25252012-09-06 18:39:26 +03005752 case HCI_EV_USER_PASSKEY_NOTIFY:
5753 hci_user_passkey_notify_evt(hdev, skb);
5754 break;
5755
5756 case HCI_EV_KEYPRESS_NOTIFY:
5757 hci_keypress_notify_evt(hdev, skb);
5758 break;
5759
Marcel Holtmann04936842008-07-14 20:13:48 +02005760 case HCI_EV_SIMPLE_PAIR_COMPLETE:
5761 hci_simple_pair_complete_evt(hdev, skb);
5762 break;
5763
Marcel Holtmann41a96212008-07-14 20:13:48 +02005764 case HCI_EV_REMOTE_HOST_FEATURES:
5765 hci_remote_host_features_evt(hdev, skb);
5766 break;
5767
Ville Tervofcd89c02011-02-10 22:38:47 -03005768 case HCI_EV_LE_META:
5769 hci_le_meta_evt(hdev, skb);
5770 break;
5771
Szymon Janc2763eda2011-03-22 13:12:22 +01005772 case HCI_EV_REMOTE_OOB_DATA_REQUEST:
5773 hci_remote_oob_data_request_evt(hdev, skb);
5774 break;
5775
Arron Wanga77a6a12015-07-24 17:13:15 +08005776#if IS_ENABLED(CONFIG_BT_HS)
5777 case HCI_EV_CHANNEL_SELECTED:
5778 hci_chan_selected_evt(hdev, skb);
5779 break;
5780
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03005781 case HCI_EV_PHY_LINK_COMPLETE:
5782 hci_phy_link_complete_evt(hdev, skb);
5783 break;
5784
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03005785 case HCI_EV_LOGICAL_LINK_COMPLETE:
5786 hci_loglink_complete_evt(hdev, skb);
5787 break;
5788
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02005789 case HCI_EV_DISCONN_LOGICAL_LINK_COMPLETE:
5790 hci_disconn_loglink_complete_evt(hdev, skb);
5791 break;
5792
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02005793 case HCI_EV_DISCONN_PHY_LINK_COMPLETE:
5794 hci_disconn_phylink_complete_evt(hdev, skb);
5795 break;
Arron Wanga77a6a12015-07-24 17:13:15 +08005796#endif
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02005797
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02005798 case HCI_EV_NUM_COMP_BLOCKS:
5799 hci_num_comp_blocks_evt(hdev, skb);
5800 break;
5801
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005802 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03005803 BT_DBG("%s event 0x%2.2x", hdev->name, event);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005804 break;
5805 }
5806
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005807 if (req_complete) {
Johan Hedberge62144872015-04-02 13:41:08 +03005808 req_complete(hdev, status, opcode);
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005809 } else if (req_complete_skb) {
5810 if (!hci_get_cmd_complete(hdev, opcode, req_evt, orig_skb)) {
5811 kfree_skb(orig_skb);
5812 orig_skb = NULL;
5813 }
Johan Hedberge62144872015-04-02 13:41:08 +03005814 req_complete_skb(hdev, status, opcode, orig_skb);
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005815 }
Johan Hedberge62144872015-04-02 13:41:08 +03005816
5817 kfree_skb(orig_skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005818 kfree_skb(skb);
5819 hdev->stat.evt_rx++;
5820}