blob: f12555f23a49a025563a6f11f174a0be71556a75 [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
Jaganath Kanakkasserya73c0462018-07-19 17:09:45 +05301067static void hci_cc_le_set_adv_set_random_addr(struct hci_dev *hdev,
1068 struct sk_buff *skb)
1069{
1070 __u8 status = *((__u8 *) skb->data);
1071 struct hci_cp_le_set_adv_set_rand_addr *cp;
1072 struct adv_info *adv_instance;
1073
1074 if (status)
1075 return;
1076
1077 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADV_SET_RAND_ADDR);
1078 if (!cp)
1079 return;
1080
1081 hci_dev_lock(hdev);
1082
1083 if (!hdev->cur_adv_instance) {
1084 /* Store in hdev for instance 0 (Set adv and Directed advs) */
1085 bacpy(&hdev->random_addr, &cp->bdaddr);
1086 } else {
1087 adv_instance = hci_find_adv_instance(hdev,
1088 hdev->cur_adv_instance);
1089 if (adv_instance)
1090 bacpy(&adv_instance->random_addr, &cp->bdaddr);
1091 }
1092
1093 hci_dev_unlock(hdev);
1094}
1095
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001096static void hci_cc_le_set_adv_enable(struct hci_dev *hdev, struct sk_buff *skb)
1097{
1098 __u8 *sent, status = *((__u8 *) skb->data);
1099
1100 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1101
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001102 if (status)
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001103 return;
1104
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001105 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADV_ENABLE);
1106 if (!sent)
Johan Hedberg3c857752014-03-25 10:30:49 +02001107 return;
1108
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001109 hci_dev_lock(hdev);
1110
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001111 /* If we're doing connection initiation as peripheral. Set a
Johan Hedberg3c857752014-03-25 10:30:49 +02001112 * timeout in case something goes wrong.
1113 */
1114 if (*sent) {
1115 struct hci_conn *conn;
1116
Marcel Holtmanna1536da2015-03-13 02:11:01 -07001117 hci_dev_set_flag(hdev, HCI_LE_ADV);
Johan Hedberg66c417c2014-07-08 15:07:47 +03001118
Jakub Pawlowskie7d9ab72015-08-07 20:22:52 +02001119 conn = hci_lookup_le_connect(hdev);
Johan Hedberg3c857752014-03-25 10:30:49 +02001120 if (conn)
1121 queue_delayed_work(hdev->workqueue,
1122 &conn->le_conn_timeout,
Johan Hedberg09ae2602014-07-06 13:41:15 +03001123 conn->conn_timeout);
Johan Hedberg66c417c2014-07-08 15:07:47 +03001124 } else {
Marcel Holtmanna358dc12015-03-13 02:11:02 -07001125 hci_dev_clear_flag(hdev, HCI_LE_ADV);
Johan Hedberg3c857752014-03-25 10:30:49 +02001126 }
1127
Johan Hedberg04b4edc2013-03-15 17:07:01 -05001128 hci_dev_unlock(hdev);
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001129}
1130
Jaganath Kanakkasseryde181e82018-07-19 17:09:41 +05301131static void hci_cc_le_set_ext_adv_enable(struct hci_dev *hdev,
1132 struct sk_buff *skb)
1133{
1134 struct hci_cp_le_set_ext_adv_enable *cp;
Jaganath Kanakkasseryde181e82018-07-19 17:09:41 +05301135 __u8 status = *((__u8 *) skb->data);
1136
1137 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1138
1139 if (status)
1140 return;
1141
1142 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_EXT_ADV_ENABLE);
1143 if (!cp)
1144 return;
1145
Jaganath Kanakkasseryde181e82018-07-19 17:09:41 +05301146 hci_dev_lock(hdev);
1147
1148 if (cp->enable) {
1149 struct hci_conn *conn;
1150
1151 hci_dev_set_flag(hdev, HCI_LE_ADV);
1152
1153 conn = hci_lookup_le_connect(hdev);
1154 if (conn)
1155 queue_delayed_work(hdev->workqueue,
1156 &conn->le_conn_timeout,
1157 conn->conn_timeout);
Jaganath Kanakkassery45b77492018-07-19 17:09:43 +05301158 } else {
1159 hci_dev_clear_flag(hdev, HCI_LE_ADV);
Jaganath Kanakkasseryde181e82018-07-19 17:09:41 +05301160 }
1161
1162 hci_dev_unlock(hdev);
1163}
1164
Marcel Holtmann533553f2014-03-21 12:18:10 -07001165static void hci_cc_le_set_scan_param(struct hci_dev *hdev, struct sk_buff *skb)
1166{
1167 struct hci_cp_le_set_scan_param *cp;
1168 __u8 status = *((__u8 *) skb->data);
1169
1170 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1171
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001172 if (status)
1173 return;
1174
Marcel Holtmann533553f2014-03-21 12:18:10 -07001175 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_PARAM);
1176 if (!cp)
1177 return;
1178
1179 hci_dev_lock(hdev);
1180
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001181 hdev->le_scan_type = cp->type;
Marcel Holtmann533553f2014-03-21 12:18:10 -07001182
1183 hci_dev_unlock(hdev);
1184}
1185
Jaganath Kanakkasserya2344b92018-07-06 17:05:28 +05301186static void hci_cc_le_set_ext_scan_param(struct hci_dev *hdev,
1187 struct sk_buff *skb)
1188{
1189 struct hci_cp_le_set_ext_scan_params *cp;
1190 __u8 status = *((__u8 *) skb->data);
1191 struct hci_cp_le_scan_phy_params *phy_param;
1192
1193 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1194
1195 if (status)
1196 return;
1197
1198 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_EXT_SCAN_PARAMS);
1199 if (!cp)
1200 return;
1201
1202 phy_param = (void *)cp->data;
1203
1204 hci_dev_lock(hdev);
1205
1206 hdev->le_scan_type = phy_param->type;
1207
1208 hci_dev_unlock(hdev);
1209}
1210
Johan Hedbergb9a63282014-03-25 10:51:52 +02001211static bool has_pending_adv_report(struct hci_dev *hdev)
1212{
1213 struct discovery_state *d = &hdev->discovery;
1214
1215 return bacmp(&d->last_adv_addr, BDADDR_ANY);
1216}
1217
1218static void clear_pending_adv_report(struct hci_dev *hdev)
1219{
1220 struct discovery_state *d = &hdev->discovery;
1221
1222 bacpy(&d->last_adv_addr, BDADDR_ANY);
1223 d->last_adv_data_len = 0;
1224}
1225
1226static void store_pending_adv_report(struct hci_dev *hdev, bdaddr_t *bdaddr,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001227 u8 bdaddr_type, s8 rssi, u32 flags,
1228 u8 *data, u8 len)
Johan Hedbergb9a63282014-03-25 10:51:52 +02001229{
1230 struct discovery_state *d = &hdev->discovery;
1231
1232 bacpy(&d->last_adv_addr, bdaddr);
1233 d->last_adv_addr_type = bdaddr_type;
Johan Hedbergff5cd292014-03-25 14:40:52 +02001234 d->last_adv_rssi = rssi;
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001235 d->last_adv_flags = flags;
Johan Hedbergb9a63282014-03-25 10:51:52 +02001236 memcpy(d->last_adv_data, data, len);
1237 d->last_adv_data_len = len;
1238}
1239
Jaganath Kanakkassery3baef812018-07-06 17:05:27 +05301240static void le_set_scan_enable_complete(struct hci_dev *hdev, u8 enable)
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001241{
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301242 hci_dev_lock(hdev);
1243
Jaganath Kanakkassery3baef812018-07-06 17:05:27 +05301244 switch (enable) {
Andre Guedes76a388b2013-04-04 20:21:02 -03001245 case LE_SCAN_ENABLE:
Marcel Holtmanna1536da2015-03-13 02:11:01 -07001246 hci_dev_set_flag(hdev, HCI_LE_SCAN);
Johan Hedbergb9a63282014-03-25 10:51:52 +02001247 if (hdev->le_scan_type == LE_SCAN_ACTIVE)
1248 clear_pending_adv_report(hdev);
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001249 break;
1250
Andre Guedes76a388b2013-04-04 20:21:02 -03001251 case LE_SCAN_DISABLE:
Johan Hedbergb9a63282014-03-25 10:51:52 +02001252 /* We do this here instead of when setting DISCOVERY_STOPPED
1253 * since the latter would potentially require waiting for
1254 * inquiry to stop too.
1255 */
1256 if (has_pending_adv_report(hdev)) {
1257 struct discovery_state *d = &hdev->discovery;
1258
1259 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergab0aa432014-03-26 14:17:12 +02001260 d->last_adv_addr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001261 d->last_adv_rssi, d->last_adv_flags,
Johan Hedbergab0aa432014-03-26 14:17:12 +02001262 d->last_adv_data,
Johan Hedbergb9a63282014-03-25 10:51:52 +02001263 d->last_adv_data_len, NULL, 0);
1264 }
1265
Johan Hedberg317ac8c2014-02-28 20:26:12 +02001266 /* Cancel this timer so that we don't try to disable scanning
1267 * when it's already disabled.
1268 */
1269 cancel_delayed_work(&hdev->le_scan_disable);
1270
Marcel Holtmanna358dc12015-03-13 02:11:02 -07001271 hci_dev_clear_flag(hdev, HCI_LE_SCAN);
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001272
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001273 /* The HCI_LE_SCAN_INTERRUPTED flag indicates that we
1274 * interrupted scanning due to a connect request. Mark
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001275 * therefore discovery as stopped. If this was not
1276 * because of a connect request advertising might have
1277 * been disabled because of active scanning, so
1278 * re-enable it again if necessary.
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001279 */
Marcel Holtmanna69d8922015-03-13 02:11:05 -07001280 if (hci_dev_test_and_clear_flag(hdev, HCI_LE_SCAN_INTERRUPTED))
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001281 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001282 else if (!hci_dev_test_flag(hdev, HCI_LE_ADV) &&
Johan Hedberg34722272014-07-08 16:05:05 +03001283 hdev->discovery.state == DISCOVERY_FINDING)
Johan Hedbergf2252572015-11-18 12:49:20 +02001284 hci_req_reenable_advertising(hdev);
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001285
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001286 break;
1287
1288 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001289 bt_dev_err(hdev, "use of reserved LE_Scan_Enable param %d",
Jaganath Kanakkassery3baef812018-07-06 17:05:27 +05301290 enable);
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001291 break;
Andre Guedes35815082011-05-26 16:23:53 -03001292 }
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301293
1294 hci_dev_unlock(hdev);
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001295}
1296
Jaganath Kanakkassery3baef812018-07-06 17:05:27 +05301297static void hci_cc_le_set_scan_enable(struct hci_dev *hdev,
1298 struct sk_buff *skb)
1299{
1300 struct hci_cp_le_set_scan_enable *cp;
1301 __u8 status = *((__u8 *) skb->data);
1302
1303 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1304
1305 if (status)
1306 return;
1307
1308 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_ENABLE);
1309 if (!cp)
1310 return;
1311
1312 le_set_scan_enable_complete(hdev, cp->enable);
1313}
1314
Jaganath Kanakkasserya2344b92018-07-06 17:05:28 +05301315static void hci_cc_le_set_ext_scan_enable(struct hci_dev *hdev,
1316 struct sk_buff *skb)
1317{
1318 struct hci_cp_le_set_ext_scan_enable *cp;
1319 __u8 status = *((__u8 *) skb->data);
1320
1321 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1322
1323 if (status)
1324 return;
1325
1326 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_EXT_SCAN_ENABLE);
1327 if (!cp)
1328 return;
1329
1330 le_set_scan_enable_complete(hdev, cp->enable);
1331}
1332
Jaganath Kanakkassery6b49bcb2018-07-19 17:09:40 +05301333static void hci_cc_le_read_num_adv_sets(struct hci_dev *hdev,
1334 struct sk_buff *skb)
1335{
1336 struct hci_rp_le_read_num_supported_adv_sets *rp = (void *) skb->data;
1337
1338 BT_DBG("%s status 0x%2.2x No of Adv sets %u", hdev->name, rp->status,
1339 rp->num_of_sets);
1340
1341 if (rp->status)
1342 return;
1343
1344 hdev->le_num_of_adv_sets = rp->num_of_sets;
1345}
1346
Johan Hedbergcf1d0812013-01-22 14:02:00 +02001347static void hci_cc_le_read_white_list_size(struct hci_dev *hdev,
1348 struct sk_buff *skb)
1349{
1350 struct hci_rp_le_read_white_list_size *rp = (void *) skb->data;
1351
1352 BT_DBG("%s status 0x%2.2x size %u", hdev->name, rp->status, rp->size);
1353
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001354 if (rp->status)
1355 return;
1356
1357 hdev->le_white_list_size = rp->size;
Johan Hedbergcf1d0812013-01-22 14:02:00 +02001358}
1359
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001360static void hci_cc_le_clear_white_list(struct hci_dev *hdev,
1361 struct sk_buff *skb)
1362{
1363 __u8 status = *((__u8 *) skb->data);
1364
1365 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1366
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001367 if (status)
1368 return;
1369
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001370 hci_bdaddr_list_clear(&hdev->le_white_list);
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001371}
1372
1373static void hci_cc_le_add_to_white_list(struct hci_dev *hdev,
1374 struct sk_buff *skb)
1375{
1376 struct hci_cp_le_add_to_white_list *sent;
1377 __u8 status = *((__u8 *) skb->data);
1378
1379 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1380
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001381 if (status)
1382 return;
1383
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001384 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_ADD_TO_WHITE_LIST);
1385 if (!sent)
1386 return;
1387
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001388 hci_bdaddr_list_add(&hdev->le_white_list, &sent->bdaddr,
1389 sent->bdaddr_type);
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001390}
1391
1392static void hci_cc_le_del_from_white_list(struct hci_dev *hdev,
1393 struct sk_buff *skb)
1394{
1395 struct hci_cp_le_del_from_white_list *sent;
1396 __u8 status = *((__u8 *) skb->data);
1397
1398 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1399
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001400 if (status)
1401 return;
1402
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001403 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_DEL_FROM_WHITE_LIST);
1404 if (!sent)
1405 return;
1406
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001407 hci_bdaddr_list_del(&hdev->le_white_list, &sent->bdaddr,
1408 sent->bdaddr_type);
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001409}
1410
Johan Hedberg9b008c02013-01-22 14:02:01 +02001411static void hci_cc_le_read_supported_states(struct hci_dev *hdev,
1412 struct sk_buff *skb)
1413{
1414 struct hci_rp_le_read_supported_states *rp = (void *) skb->data;
1415
1416 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1417
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001418 if (rp->status)
1419 return;
1420
1421 memcpy(hdev->le_states, rp->le_states, 8);
Johan Hedberg9b008c02013-01-22 14:02:01 +02001422}
1423
Marcel Holtmanna8e1bfa2014-12-20 16:28:40 +01001424static void hci_cc_le_read_def_data_len(struct hci_dev *hdev,
1425 struct sk_buff *skb)
1426{
1427 struct hci_rp_le_read_def_data_len *rp = (void *) skb->data;
1428
1429 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1430
1431 if (rp->status)
1432 return;
1433
1434 hdev->le_def_tx_len = le16_to_cpu(rp->tx_len);
1435 hdev->le_def_tx_time = le16_to_cpu(rp->tx_time);
1436}
1437
1438static void hci_cc_le_write_def_data_len(struct hci_dev *hdev,
1439 struct sk_buff *skb)
1440{
1441 struct hci_cp_le_write_def_data_len *sent;
1442 __u8 status = *((__u8 *) skb->data);
1443
1444 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1445
1446 if (status)
1447 return;
1448
1449 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_WRITE_DEF_DATA_LEN);
1450 if (!sent)
1451 return;
1452
1453 hdev->le_def_tx_len = le16_to_cpu(sent->tx_len);
1454 hdev->le_def_tx_time = le16_to_cpu(sent->tx_time);
1455}
1456
Ankit Navik545f2592018-06-29 12:13:20 +05301457static void hci_cc_le_clear_resolv_list(struct hci_dev *hdev,
1458 struct sk_buff *skb)
1459{
1460 __u8 status = *((__u8 *) skb->data);
1461
1462 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1463
1464 if (status)
1465 return;
1466
1467 hci_bdaddr_list_clear(&hdev->le_resolv_list);
1468}
1469
Ankit Navikcfdb0c22018-06-29 12:12:50 +05301470static void hci_cc_le_read_resolv_list_size(struct hci_dev *hdev,
1471 struct sk_buff *skb)
1472{
1473 struct hci_rp_le_read_resolv_list_size *rp = (void *) skb->data;
1474
1475 BT_DBG("%s status 0x%2.2x size %u", hdev->name, rp->status, rp->size);
1476
1477 if (rp->status)
1478 return;
1479
1480 hdev->le_resolv_list_size = rp->size;
1481}
1482
Ankit Navikaa12af72018-08-07 13:16:35 +05301483static void hci_cc_le_set_addr_resolution_enable(struct hci_dev *hdev,
1484 struct sk_buff *skb)
1485{
1486 __u8 *sent, status = *((__u8 *) skb->data);
1487
1488 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1489
1490 if (status)
1491 return;
1492
1493 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADDR_RESOLV_ENABLE);
1494 if (!sent)
1495 return;
1496
1497 hci_dev_lock(hdev);
1498
1499 if (*sent)
1500 hci_dev_set_flag(hdev, HCI_LL_RPA_RESOLUTION);
1501 else
1502 hci_dev_clear_flag(hdev, HCI_LL_RPA_RESOLUTION);
1503
1504 hci_dev_unlock(hdev);
1505}
1506
Marcel Holtmanna8e1bfa2014-12-20 16:28:40 +01001507static void hci_cc_le_read_max_data_len(struct hci_dev *hdev,
1508 struct sk_buff *skb)
1509{
1510 struct hci_rp_le_read_max_data_len *rp = (void *) skb->data;
1511
1512 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1513
1514 if (rp->status)
1515 return;
1516
1517 hdev->le_max_tx_len = le16_to_cpu(rp->tx_len);
1518 hdev->le_max_tx_time = le16_to_cpu(rp->tx_time);
1519 hdev->le_max_rx_len = le16_to_cpu(rp->rx_len);
1520 hdev->le_max_rx_time = le16_to_cpu(rp->rx_time);
1521}
1522
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001523static void hci_cc_write_le_host_supported(struct hci_dev *hdev,
1524 struct sk_buff *skb)
Andre Guedesf9b49302011-06-30 19:20:53 -03001525{
Johan Hedberg06199cf2012-02-22 16:37:11 +02001526 struct hci_cp_write_le_host_supported *sent;
Andre Guedesf9b49302011-06-30 19:20:53 -03001527 __u8 status = *((__u8 *) skb->data);
1528
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001529 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedesf9b49302011-06-30 19:20:53 -03001530
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001531 if (status)
1532 return;
1533
Johan Hedberg06199cf2012-02-22 16:37:11 +02001534 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LE_HOST_SUPPORTED);
Johan Hedberg8f984df2012-02-28 01:07:22 +02001535 if (!sent)
Andre Guedesf9b49302011-06-30 19:20:53 -03001536 return;
1537
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301538 hci_dev_lock(hdev);
1539
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001540 if (sent->le) {
1541 hdev->features[1][0] |= LMP_HOST_LE;
Marcel Holtmanna1536da2015-03-13 02:11:01 -07001542 hci_dev_set_flag(hdev, HCI_LE_ENABLED);
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001543 } else {
1544 hdev->features[1][0] &= ~LMP_HOST_LE;
Marcel Holtmanna358dc12015-03-13 02:11:02 -07001545 hci_dev_clear_flag(hdev, HCI_LE_ENABLED);
1546 hci_dev_clear_flag(hdev, HCI_ADVERTISING);
Johan Hedberg8f984df2012-02-28 01:07:22 +02001547 }
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001548
1549 if (sent->simul)
1550 hdev->features[1][0] |= LMP_HOST_LE_BREDR;
1551 else
1552 hdev->features[1][0] &= ~LMP_HOST_LE_BREDR;
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301553
1554 hci_dev_unlock(hdev);
Andre Guedesf9b49302011-06-30 19:20:53 -03001555}
1556
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02001557static void hci_cc_set_adv_param(struct hci_dev *hdev, struct sk_buff *skb)
1558{
1559 struct hci_cp_le_set_adv_param *cp;
1560 u8 status = *((u8 *) skb->data);
1561
1562 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1563
1564 if (status)
1565 return;
1566
1567 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADV_PARAM);
1568 if (!cp)
1569 return;
1570
1571 hci_dev_lock(hdev);
1572 hdev->adv_addr_type = cp->own_address_type;
1573 hci_dev_unlock(hdev);
1574}
1575
Jaganath Kanakkasseryde181e82018-07-19 17:09:41 +05301576static void hci_cc_set_ext_adv_param(struct hci_dev *hdev, struct sk_buff *skb)
1577{
1578 struct hci_rp_le_set_ext_adv_params *rp = (void *) skb->data;
1579 struct hci_cp_le_set_ext_adv_params *cp;
1580 struct adv_info *adv_instance;
1581
1582 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1583
1584 if (rp->status)
1585 return;
1586
1587 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_EXT_ADV_PARAMS);
1588 if (!cp)
1589 return;
1590
1591 hci_dev_lock(hdev);
1592 hdev->adv_addr_type = cp->own_addr_type;
1593 if (!hdev->cur_adv_instance) {
1594 /* Store in hdev for instance 0 */
1595 hdev->adv_tx_power = rp->tx_power;
1596 } else {
1597 adv_instance = hci_find_adv_instance(hdev,
1598 hdev->cur_adv_instance);
1599 if (adv_instance)
1600 adv_instance->tx_power = rp->tx_power;
1601 }
Jaganath Kanakkasserya0fb3722018-07-19 17:09:42 +05301602 /* Update adv data as tx power is known now */
1603 hci_req_update_adv_data(hdev, hdev->cur_adv_instance);
Jaganath Kanakkasseryde181e82018-07-19 17:09:41 +05301604 hci_dev_unlock(hdev);
1605}
1606
Andrzej Kaczmarek5ae76a92014-05-08 15:32:08 +02001607static void hci_cc_read_rssi(struct hci_dev *hdev, struct sk_buff *skb)
1608{
1609 struct hci_rp_read_rssi *rp = (void *) skb->data;
1610 struct hci_conn *conn;
1611
1612 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1613
1614 if (rp->status)
1615 return;
1616
1617 hci_dev_lock(hdev);
1618
1619 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
1620 if (conn)
1621 conn->rssi = rp->rssi;
1622
1623 hci_dev_unlock(hdev);
1624}
1625
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001626static void hci_cc_read_tx_power(struct hci_dev *hdev, struct sk_buff *skb)
1627{
1628 struct hci_cp_read_tx_power *sent;
1629 struct hci_rp_read_tx_power *rp = (void *) skb->data;
1630 struct hci_conn *conn;
1631
1632 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1633
1634 if (rp->status)
1635 return;
1636
1637 sent = hci_sent_cmd_data(hdev, HCI_OP_READ_TX_POWER);
1638 if (!sent)
1639 return;
1640
1641 hci_dev_lock(hdev);
1642
1643 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
Andrzej Kaczmarekd0455ed2014-05-14 13:43:05 +02001644 if (!conn)
1645 goto unlock;
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001646
Andrzej Kaczmarekd0455ed2014-05-14 13:43:05 +02001647 switch (sent->type) {
1648 case 0x00:
1649 conn->tx_power = rp->tx_power;
1650 break;
1651 case 0x01:
1652 conn->max_tx_power = rp->tx_power;
1653 break;
1654 }
1655
1656unlock:
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001657 hci_dev_unlock(hdev);
1658}
1659
Marcel Holtmannc50b33c2015-01-31 15:07:52 -08001660static void hci_cc_write_ssp_debug_mode(struct hci_dev *hdev, struct sk_buff *skb)
1661{
1662 u8 status = *((u8 *) skb->data);
1663 u8 *mode;
1664
1665 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1666
1667 if (status)
1668 return;
1669
1670 mode = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SSP_DEBUG_MODE);
1671 if (mode)
1672 hdev->ssp_debug_mode = *mode;
1673}
1674
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001675static void hci_cs_inquiry(struct hci_dev *hdev, __u8 status)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001676{
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001677 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001678
1679 if (status) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001680 hci_conn_check_pending(hdev);
Johan Hedberg314b2382011-04-27 10:29:57 -04001681 return;
1682 }
1683
Andre Guedes89352e72011-11-04 14:16:53 -03001684 set_bit(HCI_INQUIRY, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001685}
1686
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001687static void hci_cs_create_conn(struct hci_dev *hdev, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001688{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001689 struct hci_cp_create_conn *cp;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001690 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001691
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001692 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001693
1694 cp = hci_sent_cmd_data(hdev, HCI_OP_CREATE_CONN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001695 if (!cp)
1696 return;
1697
1698 hci_dev_lock(hdev);
1699
1700 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
1701
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03001702 BT_DBG("%s bdaddr %pMR hcon %p", hdev->name, &cp->bdaddr, conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001703
1704 if (status) {
1705 if (conn && conn->state == BT_CONNECT) {
Marcel Holtmann4c67bc72006-10-15 17:30:56 +02001706 if (status != 0x0c || conn->attempt > 2) {
1707 conn->state = BT_CLOSED;
Johan Hedberg539c4962015-02-18 14:53:57 +02001708 hci_connect_cfm(conn, status);
Marcel Holtmann4c67bc72006-10-15 17:30:56 +02001709 hci_conn_del(conn);
1710 } else
1711 conn->state = BT_CONNECT2;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001712 }
1713 } else {
1714 if (!conn) {
Johan Hedberga5c4e302014-07-16 11:56:07 +03001715 conn = hci_conn_add(hdev, ACL_LINK, &cp->bdaddr,
1716 HCI_ROLE_MASTER);
1717 if (!conn)
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001718 bt_dev_err(hdev, "no memory for new connection");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001719 }
1720 }
1721
1722 hci_dev_unlock(hdev);
1723}
1724
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001725static void hci_cs_add_sco(struct hci_dev *hdev, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001726{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001727 struct hci_cp_add_sco *cp;
1728 struct hci_conn *acl, *sco;
1729 __u16 handle;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001730
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001731 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001732
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001733 if (!status)
1734 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001735
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001736 cp = hci_sent_cmd_data(hdev, HCI_OP_ADD_SCO);
1737 if (!cp)
1738 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001739
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001740 handle = __le16_to_cpu(cp->handle);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001741
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001742 BT_DBG("%s handle 0x%4.4x", hdev->name, handle);
Marcel Holtmann6bd57412006-11-18 22:14:22 +01001743
1744 hci_dev_lock(hdev);
1745
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001746 acl = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001747 if (acl) {
1748 sco = acl->link;
1749 if (sco) {
1750 sco->state = BT_CLOSED;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001751
Johan Hedberg539c4962015-02-18 14:53:57 +02001752 hci_connect_cfm(sco, status);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001753 hci_conn_del(sco);
1754 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001755 }
Marcel Holtmann6bd57412006-11-18 22:14:22 +01001756
1757 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001758}
1759
Marcel Holtmannf8558552008-07-14 20:13:49 +02001760static void hci_cs_auth_requested(struct hci_dev *hdev, __u8 status)
1761{
1762 struct hci_cp_auth_requested *cp;
1763 struct hci_conn *conn;
1764
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001765 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001766
1767 if (!status)
1768 return;
1769
1770 cp = hci_sent_cmd_data(hdev, HCI_OP_AUTH_REQUESTED);
1771 if (!cp)
1772 return;
1773
1774 hci_dev_lock(hdev);
1775
1776 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1777 if (conn) {
1778 if (conn->state == BT_CONFIG) {
Johan Hedberg539c4962015-02-18 14:53:57 +02001779 hci_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001780 hci_conn_drop(conn);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001781 }
1782 }
1783
1784 hci_dev_unlock(hdev);
1785}
1786
1787static void hci_cs_set_conn_encrypt(struct hci_dev *hdev, __u8 status)
1788{
1789 struct hci_cp_set_conn_encrypt *cp;
1790 struct hci_conn *conn;
1791
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001792 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001793
1794 if (!status)
1795 return;
1796
1797 cp = hci_sent_cmd_data(hdev, HCI_OP_SET_CONN_ENCRYPT);
1798 if (!cp)
1799 return;
1800
1801 hci_dev_lock(hdev);
1802
1803 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1804 if (conn) {
1805 if (conn->state == BT_CONFIG) {
Johan Hedberg539c4962015-02-18 14:53:57 +02001806 hci_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001807 hci_conn_drop(conn);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001808 }
1809 }
1810
1811 hci_dev_unlock(hdev);
1812}
1813
Johan Hedberg127178d2010-11-18 22:22:29 +02001814static int hci_outgoing_auth_needed(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -03001815 struct hci_conn *conn)
Johan Hedberg392599b2010-11-18 22:22:28 +02001816{
Johan Hedberg392599b2010-11-18 22:22:28 +02001817 if (conn->state != BT_CONFIG || !conn->out)
1818 return 0;
1819
Johan Hedberg765c2a92011-01-19 12:06:52 +05301820 if (conn->pending_sec_level == BT_SECURITY_SDP)
Johan Hedberg392599b2010-11-18 22:22:28 +02001821 return 0;
1822
1823 /* Only request authentication for SSP connections or non-SSP
Johan Hedberg264b8b42014-01-08 16:40:39 +02001824 * devices with sec_level MEDIUM or HIGH or if MITM protection
1825 * is requested.
1826 */
Gustavo Padovan807deac2012-05-17 00:36:24 -03001827 if (!hci_conn_ssp_enabled(conn) && !(conn->auth_type & 0x01) &&
Johan Hedberg7e3691e2014-05-30 14:45:19 +03001828 conn->pending_sec_level != BT_SECURITY_FIPS &&
Johan Hedberg264b8b42014-01-08 16:40:39 +02001829 conn->pending_sec_level != BT_SECURITY_HIGH &&
1830 conn->pending_sec_level != BT_SECURITY_MEDIUM)
Johan Hedberg392599b2010-11-18 22:22:28 +02001831 return 0;
1832
Johan Hedberg392599b2010-11-18 22:22:28 +02001833 return 1;
1834}
1835
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001836static int hci_resolve_name(struct hci_dev *hdev,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001837 struct inquiry_entry *e)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001838{
1839 struct hci_cp_remote_name_req cp;
1840
1841 memset(&cp, 0, sizeof(cp));
1842
1843 bacpy(&cp.bdaddr, &e->data.bdaddr);
1844 cp.pscan_rep_mode = e->data.pscan_rep_mode;
1845 cp.pscan_mode = e->data.pscan_mode;
1846 cp.clock_offset = e->data.clock_offset;
1847
1848 return hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
1849}
1850
Johan Hedbergb644ba32012-01-17 21:48:47 +02001851static bool hci_resolve_next_name(struct hci_dev *hdev)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001852{
1853 struct discovery_state *discov = &hdev->discovery;
1854 struct inquiry_entry *e;
1855
Johan Hedbergb644ba32012-01-17 21:48:47 +02001856 if (list_empty(&discov->resolve))
1857 return false;
1858
1859 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
Ram Malovanyc8100892012-07-19 10:26:09 +03001860 if (!e)
1861 return false;
1862
Johan Hedbergb644ba32012-01-17 21:48:47 +02001863 if (hci_resolve_name(hdev, e) == 0) {
1864 e->name_state = NAME_PENDING;
1865 return true;
1866 }
1867
1868 return false;
1869}
1870
1871static void hci_check_pending_name(struct hci_dev *hdev, struct hci_conn *conn,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001872 bdaddr_t *bdaddr, u8 *name, u8 name_len)
Johan Hedbergb644ba32012-01-17 21:48:47 +02001873{
1874 struct discovery_state *discov = &hdev->discovery;
1875 struct inquiry_entry *e;
1876
Johan Hedberg60cb49d2014-11-11 11:33:24 +02001877 /* Update the mgmt connected state if necessary. Be careful with
1878 * conn objects that exist but are not (yet) connected however.
1879 * Only those in BT_CONFIG or BT_CONNECTED states can be
1880 * considered connected.
1881 */
1882 if (conn &&
1883 (conn->state == BT_CONFIG || conn->state == BT_CONNECTED) &&
Jaganath Kanakkasserycb77c3e2014-11-07 16:39:09 +05301884 !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00001885 mgmt_device_connected(hdev, conn, 0, name, name_len);
Johan Hedbergb644ba32012-01-17 21:48:47 +02001886
1887 if (discov->state == DISCOVERY_STOPPED)
1888 return;
1889
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001890 if (discov->state == DISCOVERY_STOPPING)
1891 goto discov_complete;
1892
1893 if (discov->state != DISCOVERY_RESOLVING)
1894 return;
1895
1896 e = hci_inquiry_cache_lookup_resolve(hdev, bdaddr, NAME_PENDING);
Ram Malovany7cc83802012-07-19 10:26:10 +03001897 /* If the device was not found in a list of found devices names of which
1898 * are pending. there is no need to continue resolving a next name as it
1899 * will be done upon receiving another Remote Name Request Complete
1900 * Event */
1901 if (!e)
1902 return;
1903
1904 list_del(&e->list);
1905 if (name) {
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001906 e->name_state = NAME_KNOWN;
Ram Malovany7cc83802012-07-19 10:26:10 +03001907 mgmt_remote_name(hdev, bdaddr, ACL_LINK, 0x00,
1908 e->data.rssi, name, name_len);
Ram Malovanyc3e7c0d2012-07-19 10:26:11 +03001909 } else {
1910 e->name_state = NAME_NOT_KNOWN;
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001911 }
1912
Johan Hedbergb644ba32012-01-17 21:48:47 +02001913 if (hci_resolve_next_name(hdev))
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001914 return;
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001915
1916discov_complete:
1917 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
1918}
1919
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001920static void hci_cs_remote_name_req(struct hci_dev *hdev, __u8 status)
1921{
Johan Hedberg127178d2010-11-18 22:22:29 +02001922 struct hci_cp_remote_name_req *cp;
1923 struct hci_conn *conn;
1924
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001925 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Johan Hedberg127178d2010-11-18 22:22:29 +02001926
1927 /* If successful wait for the name req complete event before
1928 * checking for the need to do authentication */
1929 if (!status)
1930 return;
1931
1932 cp = hci_sent_cmd_data(hdev, HCI_OP_REMOTE_NAME_REQ);
1933 if (!cp)
1934 return;
1935
1936 hci_dev_lock(hdev);
1937
1938 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02001939
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001940 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedbergb644ba32012-01-17 21:48:47 +02001941 hci_check_pending_name(hdev, conn, &cp->bdaddr, NULL, 0);
1942
Johan Hedberg79c6c702011-04-28 11:28:55 -07001943 if (!conn)
1944 goto unlock;
1945
1946 if (!hci_outgoing_auth_needed(hdev, conn))
1947 goto unlock;
1948
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001949 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02001950 struct hci_cp_auth_requested auth_cp;
1951
Johan Hedberg977f8fc2014-07-17 15:35:39 +03001952 set_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags);
1953
Johannes Bergc1f23a22013-10-07 18:19:16 +02001954 auth_cp.handle = __cpu_to_le16(conn->handle);
1955 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED,
1956 sizeof(auth_cp), &auth_cp);
Johan Hedberg127178d2010-11-18 22:22:29 +02001957 }
1958
Johan Hedberg79c6c702011-04-28 11:28:55 -07001959unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02001960 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001961}
1962
Marcel Holtmann769be972008-07-14 20:13:49 +02001963static void hci_cs_read_remote_features(struct hci_dev *hdev, __u8 status)
1964{
1965 struct hci_cp_read_remote_features *cp;
1966 struct hci_conn *conn;
1967
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001968 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann769be972008-07-14 20:13:49 +02001969
1970 if (!status)
1971 return;
1972
1973 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_REMOTE_FEATURES);
1974 if (!cp)
1975 return;
1976
1977 hci_dev_lock(hdev);
1978
1979 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1980 if (conn) {
1981 if (conn->state == BT_CONFIG) {
Johan Hedberg539c4962015-02-18 14:53:57 +02001982 hci_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001983 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02001984 }
1985 }
1986
1987 hci_dev_unlock(hdev);
1988}
1989
1990static void hci_cs_read_remote_ext_features(struct hci_dev *hdev, __u8 status)
1991{
1992 struct hci_cp_read_remote_ext_features *cp;
1993 struct hci_conn *conn;
1994
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001995 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann769be972008-07-14 20:13:49 +02001996
1997 if (!status)
1998 return;
1999
2000 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES);
2001 if (!cp)
2002 return;
2003
2004 hci_dev_lock(hdev);
2005
2006 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
2007 if (conn) {
2008 if (conn->state == BT_CONFIG) {
Johan Hedberg539c4962015-02-18 14:53:57 +02002009 hci_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002010 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02002011 }
2012 }
2013
2014 hci_dev_unlock(hdev);
2015}
2016
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002017static void hci_cs_setup_sync_conn(struct hci_dev *hdev, __u8 status)
2018{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002019 struct hci_cp_setup_sync_conn *cp;
2020 struct hci_conn *acl, *sco;
2021 __u16 handle;
2022
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002023 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002024
2025 if (!status)
2026 return;
2027
2028 cp = hci_sent_cmd_data(hdev, HCI_OP_SETUP_SYNC_CONN);
2029 if (!cp)
2030 return;
2031
2032 handle = __le16_to_cpu(cp->handle);
2033
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002034 BT_DBG("%s handle 0x%4.4x", hdev->name, handle);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002035
2036 hci_dev_lock(hdev);
2037
2038 acl = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02002039 if (acl) {
2040 sco = acl->link;
2041 if (sco) {
2042 sco->state = BT_CLOSED;
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002043
Johan Hedberg539c4962015-02-18 14:53:57 +02002044 hci_connect_cfm(sco, status);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02002045 hci_conn_del(sco);
2046 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002047 }
2048
2049 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002050}
2051
2052static void hci_cs_sniff_mode(struct hci_dev *hdev, __u8 status)
2053{
2054 struct hci_cp_sniff_mode *cp;
2055 struct hci_conn *conn;
2056
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002057 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002058
2059 if (!status)
2060 return;
2061
2062 cp = hci_sent_cmd_data(hdev, HCI_OP_SNIFF_MODE);
2063 if (!cp)
2064 return;
2065
2066 hci_dev_lock(hdev);
2067
2068 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
Marcel Holtmanne73439d2010-07-26 10:06:00 -04002069 if (conn) {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002070 clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002071
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002072 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04002073 hci_sco_setup(conn, status);
2074 }
2075
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002076 hci_dev_unlock(hdev);
2077}
2078
2079static void hci_cs_exit_sniff_mode(struct hci_dev *hdev, __u8 status)
2080{
2081 struct hci_cp_exit_sniff_mode *cp;
2082 struct hci_conn *conn;
2083
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002084 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002085
2086 if (!status)
2087 return;
2088
2089 cp = hci_sent_cmd_data(hdev, HCI_OP_EXIT_SNIFF_MODE);
2090 if (!cp)
2091 return;
2092
2093 hci_dev_lock(hdev);
2094
2095 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
Marcel Holtmanne73439d2010-07-26 10:06:00 -04002096 if (conn) {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002097 clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002098
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002099 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04002100 hci_sco_setup(conn, status);
2101 }
2102
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002103 hci_dev_unlock(hdev);
2104}
2105
Johan Hedberg88c3df12012-02-09 14:27:38 +02002106static void hci_cs_disconnect(struct hci_dev *hdev, u8 status)
2107{
2108 struct hci_cp_disconnect *cp;
2109 struct hci_conn *conn;
2110
2111 if (!status)
2112 return;
2113
2114 cp = hci_sent_cmd_data(hdev, HCI_OP_DISCONNECT);
2115 if (!cp)
2116 return;
2117
2118 hci_dev_lock(hdev);
2119
2120 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
2121 if (conn)
2122 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002123 conn->dst_type, status);
Johan Hedberg88c3df12012-02-09 14:27:38 +02002124
2125 hci_dev_unlock(hdev);
2126}
2127
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05302128static void cs_le_create_conn(struct hci_dev *hdev, bdaddr_t *peer_addr,
2129 u8 peer_addr_type, u8 own_address_type,
2130 u8 filter_policy)
2131{
2132 struct hci_conn *conn;
2133
2134 conn = hci_conn_hash_lookup_le(hdev, peer_addr,
2135 peer_addr_type);
2136 if (!conn)
2137 return;
2138
2139 /* Store the initiator and responder address information which
2140 * is needed for SMP. These values will not change during the
2141 * lifetime of the connection.
2142 */
2143 conn->init_addr_type = own_address_type;
2144 if (own_address_type == ADDR_LE_DEV_RANDOM)
2145 bacpy(&conn->init_addr, &hdev->random_addr);
2146 else
2147 bacpy(&conn->init_addr, &hdev->bdaddr);
2148
2149 conn->resp_addr_type = peer_addr_type;
2150 bacpy(&conn->resp_addr, peer_addr);
2151
2152 /* We don't want the connection attempt to stick around
2153 * indefinitely since LE doesn't have a page timeout concept
2154 * like BR/EDR. Set a timer for any connection that doesn't use
2155 * the white list for connecting.
2156 */
2157 if (filter_policy == HCI_LE_USE_PEER_ADDR)
2158 queue_delayed_work(conn->hdev->workqueue,
2159 &conn->le_conn_timeout,
2160 conn->conn_timeout);
2161}
2162
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02002163static void hci_cs_le_create_conn(struct hci_dev *hdev, u8 status)
2164{
2165 struct hci_cp_le_create_conn *cp;
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02002166
2167 BT_DBG("%s status 0x%2.2x", hdev->name, status);
2168
2169 /* All connection failure handling is taken care of by the
2170 * hci_le_conn_failed function which is triggered by the HCI
2171 * request completion callbacks used for connecting.
2172 */
2173 if (status)
2174 return;
2175
2176 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_CREATE_CONN);
2177 if (!cp)
2178 return;
2179
2180 hci_dev_lock(hdev);
2181
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05302182 cs_le_create_conn(hdev, &cp->peer_addr, cp->peer_addr_type,
2183 cp->own_address_type, cp->filter_policy);
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02002184
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02002185 hci_dev_unlock(hdev);
2186}
2187
Jaganath Kanakkassery4d94f952018-07-06 22:50:32 +02002188static void hci_cs_le_ext_create_conn(struct hci_dev *hdev, u8 status)
2189{
2190 struct hci_cp_le_ext_create_conn *cp;
2191
2192 BT_DBG("%s status 0x%2.2x", hdev->name, status);
2193
2194 /* All connection failure handling is taken care of by the
2195 * hci_le_conn_failed function which is triggered by the HCI
2196 * request completion callbacks used for connecting.
2197 */
2198 if (status)
2199 return;
2200
2201 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_EXT_CREATE_CONN);
2202 if (!cp)
2203 return;
2204
2205 hci_dev_lock(hdev);
2206
2207 cs_le_create_conn(hdev, &cp->peer_addr, cp->peer_addr_type,
2208 cp->own_addr_type, cp->filter_policy);
2209
2210 hci_dev_unlock(hdev);
2211}
2212
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07002213static void hci_cs_le_read_remote_features(struct hci_dev *hdev, u8 status)
2214{
2215 struct hci_cp_le_read_remote_features *cp;
2216 struct hci_conn *conn;
2217
2218 BT_DBG("%s status 0x%2.2x", hdev->name, status);
2219
2220 if (!status)
2221 return;
2222
2223 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_READ_REMOTE_FEATURES);
2224 if (!cp)
2225 return;
2226
2227 hci_dev_lock(hdev);
2228
2229 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
2230 if (conn) {
2231 if (conn->state == BT_CONFIG) {
2232 hci_connect_cfm(conn, status);
2233 hci_conn_drop(conn);
2234 }
2235 }
2236
2237 hci_dev_unlock(hdev);
2238}
2239
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02002240static void hci_cs_le_start_enc(struct hci_dev *hdev, u8 status)
2241{
2242 struct hci_cp_le_start_enc *cp;
2243 struct hci_conn *conn;
2244
2245 BT_DBG("%s status 0x%2.2x", hdev->name, status);
2246
2247 if (!status)
2248 return;
2249
2250 hci_dev_lock(hdev);
2251
2252 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_START_ENC);
2253 if (!cp)
2254 goto unlock;
2255
2256 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
2257 if (!conn)
2258 goto unlock;
2259
2260 if (conn->state != BT_CONNECTED)
2261 goto unlock;
2262
2263 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
2264 hci_conn_drop(conn);
2265
2266unlock:
2267 hci_dev_unlock(hdev);
2268}
2269
Kuba Pawlak50fc85f2014-11-06 19:36:52 +01002270static void hci_cs_switch_role(struct hci_dev *hdev, u8 status)
2271{
2272 struct hci_cp_switch_role *cp;
2273 struct hci_conn *conn;
2274
2275 BT_DBG("%s status 0x%2.2x", hdev->name, status);
2276
2277 if (!status)
2278 return;
2279
2280 cp = hci_sent_cmd_data(hdev, HCI_OP_SWITCH_ROLE);
2281 if (!cp)
2282 return;
2283
2284 hci_dev_lock(hdev);
2285
2286 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
2287 if (conn)
2288 clear_bit(HCI_CONN_RSWITCH_PEND, &conn->flags);
2289
2290 hci_dev_unlock(hdev);
2291}
2292
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002293static void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002294{
2295 __u8 status = *((__u8 *) skb->data);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002296 struct discovery_state *discov = &hdev->discovery;
2297 struct inquiry_entry *e;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002298
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002299 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002300
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002301 hci_conn_check_pending(hdev);
Andre Guedes89352e72011-11-04 14:16:53 -03002302
2303 if (!test_and_clear_bit(HCI_INQUIRY, &hdev->flags))
2304 return;
2305
Peter Zijlstra4e857c52014-03-17 18:06:10 +01002306 smp_mb__after_atomic(); /* wake_up_bit advises about this barrier */
Andre Guedes3e13fa12013-03-27 20:04:56 -03002307 wake_up_bit(&hdev->flags, HCI_INQUIRY);
2308
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002309 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002310 return;
2311
Johan Hedberg56e5cb82011-11-08 20:40:16 +02002312 hci_dev_lock(hdev);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002313
Andre Guedes343f9352012-02-17 20:39:37 -03002314 if (discov->state != DISCOVERY_FINDING)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002315 goto unlock;
2316
2317 if (list_empty(&discov->resolve)) {
Jakub Pawlowski07d23342015-03-17 09:04:14 -07002318 /* When BR/EDR inquiry is active and no LE scanning is in
2319 * progress, then change discovery state to indicate completion.
2320 *
2321 * When running LE scanning and BR/EDR inquiry simultaneously
2322 * and the LE scan already finished, then change the discovery
2323 * state to indicate completion.
2324 */
2325 if (!hci_dev_test_flag(hdev, HCI_LE_SCAN) ||
2326 !test_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks))
2327 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002328 goto unlock;
2329 }
2330
2331 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
2332 if (e && hci_resolve_name(hdev, e) == 0) {
2333 e->name_state = NAME_PENDING;
2334 hci_discovery_set_state(hdev, DISCOVERY_RESOLVING);
2335 } else {
Jakub Pawlowski07d23342015-03-17 09:04:14 -07002336 /* When BR/EDR inquiry is active and no LE scanning is in
2337 * progress, then change discovery state to indicate completion.
2338 *
2339 * When running LE scanning and BR/EDR inquiry simultaneously
2340 * and the LE scan already finished, then change the discovery
2341 * state to indicate completion.
2342 */
2343 if (!hci_dev_test_flag(hdev, HCI_LE_SCAN) ||
2344 !test_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks))
2345 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002346 }
2347
2348unlock:
Johan Hedberg56e5cb82011-11-08 20:40:16 +02002349 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002350}
2351
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002352static void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002353{
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002354 struct inquiry_data data;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002355 struct inquiry_info *info = (void *) (skb->data + 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002356 int num_rsp = *((__u8 *) skb->data);
2357
2358 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
2359
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002360 if (!num_rsp)
2361 return;
2362
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002363 if (hci_dev_test_flag(hdev, HCI_PERIODIC_INQ))
Andre Guedes1519cc12012-03-21 00:03:38 -03002364 return;
2365
Linus Torvalds1da177e2005-04-16 15:20:36 -07002366 hci_dev_lock(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002367
Johan Hedberge17acd42011-03-30 23:57:16 +03002368 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02002369 u32 flags;
Johan Hedberg31754052012-01-04 13:39:52 +02002370
Linus Torvalds1da177e2005-04-16 15:20:36 -07002371 bacpy(&data.bdaddr, &info->bdaddr);
2372 data.pscan_rep_mode = info->pscan_rep_mode;
2373 data.pscan_period_mode = info->pscan_period_mode;
2374 data.pscan_mode = info->pscan_mode;
2375 memcpy(data.dev_class, info->dev_class, 3);
2376 data.clock_offset = info->clock_offset;
Marcel Holtmannefb25132014-12-05 13:03:34 +01002377 data.rssi = HCI_RSSI_INVALID;
Marcel Holtmann41a96212008-07-14 20:13:48 +02002378 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02002379
Marcel Holtmannaf589252014-07-01 14:11:20 +02002380 flags = hci_inquiry_cache_update(hdev, &data, false);
2381
Johan Hedberg48264f02011-11-09 13:58:58 +02002382 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Marcel Holtmannefb25132014-12-05 13:03:34 +01002383 info->dev_class, HCI_RSSI_INVALID,
2384 flags, NULL, 0, NULL, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002385 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002386
Linus Torvalds1da177e2005-04-16 15:20:36 -07002387 hci_dev_unlock(hdev);
2388}
2389
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002390static void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002391{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002392 struct hci_ev_conn_complete *ev = (void *) skb->data;
2393 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002394
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002395 BT_DBG("%s", hdev->name);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002396
Linus Torvalds1da177e2005-04-16 15:20:36 -07002397 hci_dev_lock(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002398
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002399 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann94992372009-04-19 19:30:03 +02002400 if (!conn) {
2401 if (ev->link_type != SCO_LINK)
2402 goto unlock;
2403
2404 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
2405 if (!conn)
2406 goto unlock;
2407
2408 conn->type = SCO_LINK;
2409 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002410
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002411 if (!ev->status) {
2412 conn->handle = __le16_to_cpu(ev->handle);
Marcel Holtmann769be972008-07-14 20:13:49 +02002413
2414 if (conn->type == ACL_LINK) {
2415 conn->state = BT_CONFIG;
2416 hci_conn_hold(conn);
Szymon Janca9ea3ed2012-07-19 14:46:08 +02002417
2418 if (!conn->out && !hci_conn_ssp_enabled(conn) &&
2419 !hci_find_link_key(hdev, &ev->bdaddr))
2420 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
2421 else
2422 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
Marcel Holtmann769be972008-07-14 20:13:49 +02002423 } else
2424 conn->state = BT_CONNECTED;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002425
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01002426 hci_debugfs_create_conn(conn);
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02002427 hci_conn_add_sysfs(conn);
2428
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002429 if (test_bit(HCI_AUTH, &hdev->flags))
Johan Hedberg4dae2792014-06-24 17:03:50 +03002430 set_bit(HCI_CONN_AUTH, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002431
2432 if (test_bit(HCI_ENCRYPT, &hdev->flags))
Johan Hedberg4dae2792014-06-24 17:03:50 +03002433 set_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002434
2435 /* Get remote features */
2436 if (conn->type == ACL_LINK) {
2437 struct hci_cp_read_remote_features cp;
2438 cp.handle = ev->handle;
Marcel Holtmann769be972008-07-14 20:13:49 +02002439 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_FEATURES,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002440 sizeof(cp), &cp);
Johan Hedberg22f433d2014-08-01 11:13:32 +03002441
Johan Hedberg01b1cb82015-11-16 12:52:21 +02002442 hci_req_update_scan(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002443 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002444
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002445 /* Set packet type for incoming connection */
Andrei Emeltchenkod095c1e2011-12-01 14:33:27 +02002446 if (!conn->out && hdev->hci_ver < BLUETOOTH_VER_2_0) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002447 struct hci_cp_change_conn_ptype cp;
2448 cp.handle = ev->handle;
Marcel Holtmanna8746412008-07-14 20:13:46 +02002449 cp.pkt_type = cpu_to_le16(conn->pkt_type);
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002450 hci_send_cmd(hdev, HCI_OP_CHANGE_CONN_PTYPE, sizeof(cp),
2451 &cp);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002452 }
Johan Hedberg17d5c042011-01-22 06:09:08 +02002453 } else {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002454 conn->state = BT_CLOSED;
Johan Hedberg17d5c042011-01-22 06:09:08 +02002455 if (conn->type == ACL_LINK)
Marcel Holtmann64c7b772014-02-18 14:22:20 -08002456 mgmt_connect_failed(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002457 conn->dst_type, ev->status);
Johan Hedberg17d5c042011-01-22 06:09:08 +02002458 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002459
Marcel Holtmanne73439d2010-07-26 10:06:00 -04002460 if (conn->type == ACL_LINK)
2461 hci_sco_setup(conn, ev->status);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002462
Marcel Holtmann769be972008-07-14 20:13:49 +02002463 if (ev->status) {
Johan Hedberg539c4962015-02-18 14:53:57 +02002464 hci_connect_cfm(conn, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002465 hci_conn_del(conn);
Marcel Holtmannc89b6e62009-01-15 21:57:03 +01002466 } else if (ev->link_type != ACL_LINK)
Johan Hedberg539c4962015-02-18 14:53:57 +02002467 hci_connect_cfm(conn, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002468
2469unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002470 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002471
2472 hci_conn_check_pending(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002473}
2474
Johan Hedberg70c46422014-07-09 12:59:17 +03002475static void hci_reject_conn(struct hci_dev *hdev, bdaddr_t *bdaddr)
2476{
2477 struct hci_cp_reject_conn_req cp;
2478
2479 bacpy(&cp.bdaddr, bdaddr);
2480 cp.reason = HCI_ERROR_REJ_BAD_ADDR;
2481 hci_send_cmd(hdev, HCI_OP_REJECT_CONN_REQ, sizeof(cp), &cp);
2482}
2483
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002484static void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002485{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002486 struct hci_ev_conn_request *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002487 int mask = hdev->link_mode;
Johan Hedberg70c46422014-07-09 12:59:17 +03002488 struct inquiry_entry *ie;
2489 struct hci_conn *conn;
Frédéric Dalleau20714bfe2012-11-21 10:51:12 +01002490 __u8 flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002491
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03002492 BT_DBG("%s bdaddr %pMR type 0x%x", hdev->name, &ev->bdaddr,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002493 ev->link_type);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002494
Frédéric Dalleau20714bfe2012-11-21 10:51:12 +01002495 mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, ev->link_type,
2496 &flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002497
Johan Hedberg70c46422014-07-09 12:59:17 +03002498 if (!(mask & HCI_LM_ACCEPT)) {
2499 hci_reject_conn(hdev, &ev->bdaddr);
2500 return;
2501 }
2502
Johan Hedberg46c4c942014-07-16 16:19:21 +03002503 if (hci_bdaddr_list_lookup(&hdev->blacklist, &ev->bdaddr,
2504 BDADDR_BREDR)) {
2505 hci_reject_conn(hdev, &ev->bdaddr);
2506 return;
2507 }
2508
Johan Hedberg6a8fc952014-12-24 20:43:11 +02002509 /* Require HCI_CONNECTABLE or a whitelist entry to accept the
2510 * connection. These features are only touched through mgmt so
2511 * only do the checks if HCI_MGMT is set.
2512 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002513 if (hci_dev_test_flag(hdev, HCI_MGMT) &&
2514 !hci_dev_test_flag(hdev, HCI_CONNECTABLE) &&
Johan Hedberg46c4c942014-07-16 16:19:21 +03002515 !hci_bdaddr_list_lookup(&hdev->whitelist, &ev->bdaddr,
2516 BDADDR_BREDR)) {
2517 hci_reject_conn(hdev, &ev->bdaddr);
2518 return;
Johan Hedberg70c46422014-07-09 12:59:17 +03002519 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002520
Johan Hedberg70c46422014-07-09 12:59:17 +03002521 /* Connection accepted */
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002522
Johan Hedberg70c46422014-07-09 12:59:17 +03002523 hci_dev_lock(hdev);
Marcel Holtmannc7bdd502008-07-14 20:13:47 +02002524
Johan Hedberg70c46422014-07-09 12:59:17 +03002525 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
2526 if (ie)
2527 memcpy(ie->data.dev_class, ev->dev_class, 3);
2528
2529 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type,
2530 &ev->bdaddr);
2531 if (!conn) {
Johan Hedberga5c4e302014-07-16 11:56:07 +03002532 conn = hci_conn_add(hdev, ev->link_type, &ev->bdaddr,
2533 HCI_ROLE_SLAVE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002534 if (!conn) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002535 bt_dev_err(hdev, "no memory for new connection");
Johan Hedberg70c46422014-07-09 12:59:17 +03002536 hci_dev_unlock(hdev);
2537 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002538 }
Johan Hedberg70c46422014-07-09 12:59:17 +03002539 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002540
Johan Hedberg70c46422014-07-09 12:59:17 +03002541 memcpy(conn->dev_class, ev->dev_class, 3);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002542
Johan Hedberg70c46422014-07-09 12:59:17 +03002543 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002544
Johan Hedberg70c46422014-07-09 12:59:17 +03002545 if (ev->link_type == ACL_LINK ||
2546 (!(flags & HCI_PROTO_DEFER) && !lmp_esco_capable(hdev))) {
2547 struct hci_cp_accept_conn_req cp;
2548 conn->state = BT_CONNECT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002549
2550 bacpy(&cp.bdaddr, &ev->bdaddr);
Johan Hedberg70c46422014-07-09 12:59:17 +03002551
2552 if (lmp_rswitch_capable(hdev) && (mask & HCI_LM_MASTER))
2553 cp.role = 0x00; /* Become master */
2554 else
2555 cp.role = 0x01; /* Remain slave */
2556
2557 hci_send_cmd(hdev, HCI_OP_ACCEPT_CONN_REQ, sizeof(cp), &cp);
2558 } else if (!(flags & HCI_PROTO_DEFER)) {
2559 struct hci_cp_accept_sync_conn_req cp;
2560 conn->state = BT_CONNECT;
2561
2562 bacpy(&cp.bdaddr, &ev->bdaddr);
2563 cp.pkt_type = cpu_to_le16(conn->pkt_type);
2564
2565 cp.tx_bandwidth = cpu_to_le32(0x00001f40);
2566 cp.rx_bandwidth = cpu_to_le32(0x00001f40);
2567 cp.max_latency = cpu_to_le16(0xffff);
2568 cp.content_format = cpu_to_le16(hdev->voice_setting);
2569 cp.retrans_effort = 0xff;
2570
2571 hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ, sizeof(cp),
2572 &cp);
2573 } else {
2574 conn->state = BT_CONNECT2;
Johan Hedberg539c4962015-02-18 14:53:57 +02002575 hci_connect_cfm(conn, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002576 }
2577}
2578
Mikel Astizf0d6a0e2012-08-09 09:52:30 +02002579static u8 hci_to_mgmt_reason(u8 err)
2580{
2581 switch (err) {
2582 case HCI_ERROR_CONNECTION_TIMEOUT:
2583 return MGMT_DEV_DISCONN_TIMEOUT;
2584 case HCI_ERROR_REMOTE_USER_TERM:
2585 case HCI_ERROR_REMOTE_LOW_RESOURCES:
2586 case HCI_ERROR_REMOTE_POWER_OFF:
2587 return MGMT_DEV_DISCONN_REMOTE;
2588 case HCI_ERROR_LOCAL_HOST_TERM:
2589 return MGMT_DEV_DISCONN_LOCAL_HOST;
2590 default:
2591 return MGMT_DEV_DISCONN_UNKNOWN;
2592 }
2593}
2594
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002595static void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002596{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002597 struct hci_ev_disconn_complete *ev = (void *) skb->data;
Szymon Janc160b9252016-07-12 02:12:16 +02002598 u8 reason;
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002599 struct hci_conn_params *params;
Marcel Holtmann04837f62006-07-03 10:02:33 +02002600 struct hci_conn *conn;
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002601 bool mgmt_connected;
Andre Guedes38462202013-11-07 17:36:10 -03002602 u8 type;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002603
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002604 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002605
Linus Torvalds1da177e2005-04-16 15:20:36 -07002606 hci_dev_lock(hdev);
2607
Marcel Holtmann04837f62006-07-03 10:02:33 +02002608 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergf7520542011-01-20 12:34:39 +02002609 if (!conn)
2610 goto unlock;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02002611
Andre Guedesabf54a52013-11-07 17:36:09 -03002612 if (ev->status) {
2613 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
2614 conn->dst_type, ev->status);
2615 goto unlock;
Johan Hedberg37d9ef72011-11-10 15:54:39 +02002616 }
Johan Hedbergf7520542011-01-20 12:34:39 +02002617
Andre Guedes38462202013-11-07 17:36:10 -03002618 conn->state = BT_CLOSED;
2619
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002620 mgmt_connected = test_and_clear_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags);
Szymon Janc160b9252016-07-12 02:12:16 +02002621
2622 if (test_bit(HCI_CONN_AUTH_FAILURE, &conn->flags))
2623 reason = MGMT_DEV_DISCONN_AUTH_FAILURE;
2624 else
2625 reason = hci_to_mgmt_reason(ev->reason);
2626
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002627 mgmt_device_disconnected(hdev, &conn->dst, conn->type, conn->dst_type,
2628 reason, mgmt_connected);
Andre Guedesabf54a52013-11-07 17:36:09 -03002629
Johan Hedberg22f433d2014-08-01 11:13:32 +03002630 if (conn->type == ACL_LINK) {
2631 if (test_bit(HCI_CONN_FLUSH_KEY, &conn->flags))
2632 hci_remove_link_key(hdev, &conn->dst);
2633
Johan Hedberg01b1cb82015-11-16 12:52:21 +02002634 hci_req_update_scan(hdev);
Johan Hedberg22f433d2014-08-01 11:13:32 +03002635 }
Johan Hedberg22102462013-10-05 12:01:06 +02002636
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002637 params = hci_conn_params_lookup(hdev, &conn->dst, conn->dst_type);
2638 if (params) {
2639 switch (params->auto_connect) {
2640 case HCI_AUTO_CONN_LINK_LOSS:
2641 if (ev->reason != HCI_ERROR_CONNECTION_TIMEOUT)
2642 break;
2643 /* Fall through */
2644
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02002645 case HCI_AUTO_CONN_DIRECT:
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002646 case HCI_AUTO_CONN_ALWAYS:
Johan Hedberg418025d2014-07-04 12:37:24 +03002647 list_del_init(&params->action);
2648 list_add(&params->action, &hdev->pend_le_conns);
2649 hci_update_background_scan(hdev);
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002650 break;
2651
2652 default:
2653 break;
2654 }
2655 }
2656
Andre Guedes38462202013-11-07 17:36:10 -03002657 type = conn->type;
Johan Hedberg22102462013-10-05 12:01:06 +02002658
Johan Hedberg3a6d5762015-02-18 14:53:58 +02002659 hci_disconn_cfm(conn, ev->reason);
Andre Guedes38462202013-11-07 17:36:10 -03002660 hci_conn_del(conn);
2661
2662 /* Re-enable advertising if necessary, since it might
2663 * have been disabled by the connection. From the
2664 * HCI_LE_Set_Advertise_Enable command description in
2665 * the core specification (v4.0):
2666 * "The Controller shall continue advertising until the Host
2667 * issues an LE_Set_Advertise_Enable command with
2668 * Advertising_Enable set to 0x00 (Advertising is disabled)
2669 * or until a connection is created or until the Advertising
2670 * is timed out due to Directed Advertising."
2671 */
2672 if (type == LE_LINK)
Johan Hedbergf2252572015-11-18 12:49:20 +02002673 hci_req_reenable_advertising(hdev);
Johan Hedbergf7520542011-01-20 12:34:39 +02002674
2675unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002676 hci_dev_unlock(hdev);
2677}
2678
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002679static void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002680{
2681 struct hci_ev_auth_complete *ev = (void *) skb->data;
2682 struct hci_conn *conn;
2683
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002684 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002685
2686 hci_dev_lock(hdev);
2687
2688 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002689 if (!conn)
2690 goto unlock;
2691
2692 if (!ev->status) {
Szymon Janc160b9252016-07-12 02:12:16 +02002693 clear_bit(HCI_CONN_AUTH_FAILURE, &conn->flags);
2694
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002695 if (!hci_conn_ssp_enabled(conn) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03002696 test_bit(HCI_CONN_REAUTH_PEND, &conn->flags)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002697 bt_dev_info(hdev, "re-auth of legacy device is not possible.");
Johan Hedberg2a611692011-02-19 12:06:00 -03002698 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002699 set_bit(HCI_CONN_AUTH, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002700 conn->sec_level = conn->pending_sec_level;
Johan Hedberg2a611692011-02-19 12:06:00 -03002701 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002702 } else {
Szymon Janc160b9252016-07-12 02:12:16 +02002703 if (ev->status == HCI_ERROR_PIN_OR_KEY_MISSING)
2704 set_bit(HCI_CONN_AUTH_FAILURE, &conn->flags);
2705
Johan Hedberge1e930f2014-09-08 17:09:49 -07002706 mgmt_auth_failed(conn, ev->status);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002707 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002708
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002709 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
2710 clear_bit(HCI_CONN_REAUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002711
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002712 if (conn->state == BT_CONFIG) {
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002713 if (!ev->status && hci_conn_ssp_enabled(conn)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002714 struct hci_cp_set_conn_encrypt cp;
2715 cp.handle = ev->handle;
2716 cp.encrypt = 0x01;
2717 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002718 &cp);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002719 } else {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002720 conn->state = BT_CONNECTED;
Johan Hedberg539c4962015-02-18 14:53:57 +02002721 hci_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002722 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002723 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002724 } else {
2725 hci_auth_cfm(conn, ev->status);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002726
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002727 hci_conn_hold(conn);
2728 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02002729 hci_conn_drop(conn);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002730 }
2731
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002732 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002733 if (!ev->status) {
2734 struct hci_cp_set_conn_encrypt cp;
2735 cp.handle = ev->handle;
2736 cp.encrypt = 0x01;
2737 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002738 &cp);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002739 } else {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002740 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002741 hci_encrypt_cfm(conn, ev->status, 0x00);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002742 }
2743 }
2744
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002745unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002746 hci_dev_unlock(hdev);
2747}
2748
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002749static void hci_remote_name_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002750{
Johan Hedberg127178d2010-11-18 22:22:29 +02002751 struct hci_ev_remote_name *ev = (void *) skb->data;
2752 struct hci_conn *conn;
2753
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002754 BT_DBG("%s", hdev->name);
2755
2756 hci_conn_check_pending(hdev);
Johan Hedberg127178d2010-11-18 22:22:29 +02002757
2758 hci_dev_lock(hdev);
2759
2760 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002761
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002762 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedbergb644ba32012-01-17 21:48:47 +02002763 goto check_auth;
2764
2765 if (ev->status == 0)
2766 hci_check_pending_name(hdev, conn, &ev->bdaddr, ev->name,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002767 strnlen(ev->name, HCI_MAX_NAME_LENGTH));
Johan Hedbergb644ba32012-01-17 21:48:47 +02002768 else
2769 hci_check_pending_name(hdev, conn, &ev->bdaddr, NULL, 0);
2770
2771check_auth:
Johan Hedberg79c6c702011-04-28 11:28:55 -07002772 if (!conn)
2773 goto unlock;
2774
2775 if (!hci_outgoing_auth_needed(hdev, conn))
2776 goto unlock;
2777
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002778 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002779 struct hci_cp_auth_requested cp;
Johan Hedberg977f8fc2014-07-17 15:35:39 +03002780
2781 set_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags);
2782
Johan Hedberg127178d2010-11-18 22:22:29 +02002783 cp.handle = __cpu_to_le16(conn->handle);
2784 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED, sizeof(cp), &cp);
2785 }
2786
Johan Hedberg79c6c702011-04-28 11:28:55 -07002787unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02002788 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002789}
2790
Johan Hedberg821f3762015-06-11 13:52:29 +03002791static void read_enc_key_size_complete(struct hci_dev *hdev, u8 status,
2792 u16 opcode, struct sk_buff *skb)
2793{
2794 const struct hci_rp_read_enc_key_size *rp;
2795 struct hci_conn *conn;
2796 u16 handle;
2797
2798 BT_DBG("%s status 0x%02x", hdev->name, status);
2799
2800 if (!skb || skb->len < sizeof(*rp)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002801 bt_dev_err(hdev, "invalid read key size response");
Johan Hedberg821f3762015-06-11 13:52:29 +03002802 return;
2803 }
2804
2805 rp = (void *)skb->data;
2806 handle = le16_to_cpu(rp->handle);
2807
2808 hci_dev_lock(hdev);
2809
2810 conn = hci_conn_hash_lookup_handle(hdev, handle);
2811 if (!conn)
2812 goto unlock;
2813
2814 /* If we fail to read the encryption key size, assume maximum
2815 * (which is the same we do also when this HCI command isn't
2816 * supported.
2817 */
2818 if (rp->status) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002819 bt_dev_err(hdev, "failed to read key size for handle %u",
2820 handle);
Johan Hedberg821f3762015-06-11 13:52:29 +03002821 conn->enc_key_size = HCI_LINK_KEY_SIZE;
2822 } else {
2823 conn->enc_key_size = rp->key_size;
2824 }
2825
2826 if (conn->state == BT_CONFIG) {
2827 conn->state = BT_CONNECTED;
2828 hci_connect_cfm(conn, 0);
2829 hci_conn_drop(conn);
2830 } else {
2831 u8 encrypt;
2832
2833 if (!test_bit(HCI_CONN_ENCRYPT, &conn->flags))
2834 encrypt = 0x00;
Johan Hedberg5d667ef2015-06-12 13:04:47 +03002835 else if (test_bit(HCI_CONN_AES_CCM, &conn->flags))
Johan Hedberg821f3762015-06-11 13:52:29 +03002836 encrypt = 0x02;
2837 else
2838 encrypt = 0x01;
2839
2840 hci_encrypt_cfm(conn, 0, encrypt);
2841 }
2842
2843unlock:
2844 hci_dev_unlock(hdev);
2845}
2846
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002847static void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002848{
2849 struct hci_ev_encrypt_change *ev = (void *) skb->data;
2850 struct hci_conn *conn;
2851
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002852 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002853
2854 hci_dev_lock(hdev);
2855
2856 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002857 if (!conn)
2858 goto unlock;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002859
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002860 if (!ev->status) {
2861 if (ev->encrypt) {
2862 /* Encryption implies authentication */
Johan Hedberg4dae2792014-06-24 17:03:50 +03002863 set_bit(HCI_CONN_AUTH, &conn->flags);
2864 set_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002865 conn->sec_level = conn->pending_sec_level;
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002866
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002867 /* P-256 authentication key implies FIPS */
2868 if (conn->key_type == HCI_LK_AUTH_COMBINATION_P256)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002869 set_bit(HCI_CONN_FIPS, &conn->flags);
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002870
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002871 if ((conn->type == ACL_LINK && ev->encrypt == 0x02) ||
2872 conn->type == LE_LINK)
2873 set_bit(HCI_CONN_AES_CCM, &conn->flags);
2874 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002875 clear_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002876 clear_bit(HCI_CONN_AES_CCM, &conn->flags);
2877 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002878 }
2879
Johan Hedberg7ed3fa22014-09-10 22:16:35 -07002880 /* We should disregard the current RPA and generate a new one
2881 * whenever the encryption procedure fails.
2882 */
Jaganath Kanakkasserya73c0462018-07-19 17:09:45 +05302883 if (ev->status && conn->type == LE_LINK) {
Marcel Holtmanna1536da2015-03-13 02:11:01 -07002884 hci_dev_set_flag(hdev, HCI_RPA_EXPIRED);
Jaganath Kanakkasserya73c0462018-07-19 17:09:45 +05302885 hci_adv_instances_set_rpa_expired(hdev, true);
2886 }
Johan Hedberg7ed3fa22014-09-10 22:16:35 -07002887
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002888 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
2889
2890 if (ev->status && conn->state == BT_CONNECTED) {
Szymon Janc160b9252016-07-12 02:12:16 +02002891 if (ev->status == HCI_ERROR_PIN_OR_KEY_MISSING)
2892 set_bit(HCI_CONN_AUTH_FAILURE, &conn->flags);
2893
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002894 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
2895 hci_conn_drop(conn);
2896 goto unlock;
2897 }
2898
Johan Hedberg035ad622015-06-11 13:52:28 +03002899 /* In Secure Connections Only mode, do not allow any connections
2900 * that are not encrypted with AES-CCM using a P-256 authenticated
2901 * combination key.
2902 */
2903 if (hci_dev_test_flag(hdev, HCI_SC_ONLY) &&
2904 (!test_bit(HCI_CONN_AES_CCM, &conn->flags) ||
2905 conn->key_type != HCI_LK_AUTH_COMBINATION_P256)) {
2906 hci_connect_cfm(conn, HCI_ERROR_AUTH_FAILURE);
2907 hci_conn_drop(conn);
2908 goto unlock;
2909 }
2910
Johan Hedberg821f3762015-06-11 13:52:29 +03002911 /* Try reading the encryption key size for encrypted ACL links */
2912 if (!ev->status && ev->encrypt && conn->type == ACL_LINK) {
2913 struct hci_cp_read_enc_key_size cp;
2914 struct hci_request req;
2915
2916 /* Only send HCI_Read_Encryption_Key_Size if the
2917 * controller really supports it. If it doesn't, assume
2918 * the default size (16).
2919 */
2920 if (!(hdev->commands[20] & 0x10)) {
2921 conn->enc_key_size = HCI_LINK_KEY_SIZE;
2922 goto notify;
2923 }
2924
2925 hci_req_init(&req, hdev);
2926
2927 cp.handle = cpu_to_le16(conn->handle);
2928 hci_req_add(&req, HCI_OP_READ_ENC_KEY_SIZE, sizeof(cp), &cp);
2929
2930 if (hci_req_run_skb(&req, read_enc_key_size_complete)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002931 bt_dev_err(hdev, "sending read key size failed");
Johan Hedberg821f3762015-06-11 13:52:29 +03002932 conn->enc_key_size = HCI_LINK_KEY_SIZE;
2933 goto notify;
2934 }
2935
2936 goto unlock;
2937 }
2938
2939notify:
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002940 if (conn->state == BT_CONFIG) {
2941 if (!ev->status)
2942 conn->state = BT_CONNECTED;
2943
Johan Hedberg539c4962015-02-18 14:53:57 +02002944 hci_connect_cfm(conn, ev->status);
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002945 hci_conn_drop(conn);
2946 } else
2947 hci_encrypt_cfm(conn, ev->status, ev->encrypt);
2948
Gustavo Padovana7d77232012-05-13 03:20:07 -03002949unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002950 hci_dev_unlock(hdev);
2951}
2952
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002953static void hci_change_link_key_complete_evt(struct hci_dev *hdev,
2954 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002955{
2956 struct hci_ev_change_link_key_complete *ev = (void *) skb->data;
2957 struct hci_conn *conn;
2958
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002959 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002960
2961 hci_dev_lock(hdev);
2962
2963 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
2964 if (conn) {
2965 if (!ev->status)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002966 set_bit(HCI_CONN_SECURE, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002967
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002968 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002969
2970 hci_key_change_cfm(conn, ev->status);
2971 }
2972
2973 hci_dev_unlock(hdev);
2974}
2975
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002976static void hci_remote_features_evt(struct hci_dev *hdev,
2977 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002978{
2979 struct hci_ev_remote_features *ev = (void *) skb->data;
2980 struct hci_conn *conn;
2981
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002982 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002983
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002984 hci_dev_lock(hdev);
2985
2986 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02002987 if (!conn)
2988 goto unlock;
Marcel Holtmann769be972008-07-14 20:13:49 +02002989
Johan Hedbergccd556f2010-11-10 17:11:51 +02002990 if (!ev->status)
Johan Hedbergcad718e2013-04-17 15:00:51 +03002991 memcpy(conn->features[0], ev->features, 8);
Johan Hedbergccd556f2010-11-10 17:11:51 +02002992
2993 if (conn->state != BT_CONFIG)
2994 goto unlock;
2995
Szymon Jancac363cf2015-01-29 16:36:59 +01002996 if (!ev->status && lmp_ext_feat_capable(hdev) &&
2997 lmp_ext_feat_capable(conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02002998 struct hci_cp_read_remote_ext_features cp;
2999 cp.handle = ev->handle;
3000 cp.page = 0x01;
3001 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003002 sizeof(cp), &cp);
Johan Hedberg392599b2010-11-18 22:22:28 +02003003 goto unlock;
3004 }
3005
Johan Hedberg671267b2012-05-12 16:11:50 -03003006 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02003007 struct hci_cp_remote_name_req cp;
3008 memset(&cp, 0, sizeof(cp));
3009 bacpy(&cp.bdaddr, &conn->dst);
3010 cp.pscan_rep_mode = 0x02;
3011 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02003012 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00003013 mgmt_device_connected(hdev, conn, 0, NULL, 0);
Johan Hedberg392599b2010-11-18 22:22:28 +02003014
Johan Hedberg127178d2010-11-18 22:22:29 +02003015 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02003016 conn->state = BT_CONNECTED;
Johan Hedberg539c4962015-02-18 14:53:57 +02003017 hci_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02003018 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02003019 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003020
Johan Hedbergccd556f2010-11-10 17:11:51 +02003021unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003022 hci_dev_unlock(hdev);
3023}
3024
Johan Hedberge62144872015-04-02 13:41:08 +03003025static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb,
3026 u16 *opcode, u8 *status,
3027 hci_req_complete_t *req_complete,
3028 hci_req_complete_skb_t *req_complete_skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003029{
3030 struct hci_ev_cmd_complete *ev = (void *) skb->data;
Johan Hedberge62144872015-04-02 13:41:08 +03003031
3032 *opcode = __le16_to_cpu(ev->opcode);
3033 *status = skb->data[sizeof(*ev)];
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003034
3035 skb_pull(skb, sizeof(*ev));
3036
Johan Hedberge62144872015-04-02 13:41:08 +03003037 switch (*opcode) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003038 case HCI_OP_INQUIRY_CANCEL:
3039 hci_cc_inquiry_cancel(hdev, skb);
3040 break;
3041
Andre Guedes4d934832012-03-21 00:03:35 -03003042 case HCI_OP_PERIODIC_INQ:
3043 hci_cc_periodic_inq(hdev, skb);
3044 break;
3045
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003046 case HCI_OP_EXIT_PERIODIC_INQ:
3047 hci_cc_exit_periodic_inq(hdev, skb);
3048 break;
3049
3050 case HCI_OP_REMOTE_NAME_REQ_CANCEL:
3051 hci_cc_remote_name_req_cancel(hdev, skb);
3052 break;
3053
3054 case HCI_OP_ROLE_DISCOVERY:
3055 hci_cc_role_discovery(hdev, skb);
3056 break;
3057
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02003058 case HCI_OP_READ_LINK_POLICY:
3059 hci_cc_read_link_policy(hdev, skb);
3060 break;
3061
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003062 case HCI_OP_WRITE_LINK_POLICY:
3063 hci_cc_write_link_policy(hdev, skb);
3064 break;
3065
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02003066 case HCI_OP_READ_DEF_LINK_POLICY:
3067 hci_cc_read_def_link_policy(hdev, skb);
3068 break;
3069
3070 case HCI_OP_WRITE_DEF_LINK_POLICY:
3071 hci_cc_write_def_link_policy(hdev, skb);
3072 break;
3073
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003074 case HCI_OP_RESET:
3075 hci_cc_reset(hdev, skb);
3076 break;
3077
Marcel Holtmannc2f0f972015-01-12 09:21:25 -08003078 case HCI_OP_READ_STORED_LINK_KEY:
3079 hci_cc_read_stored_link_key(hdev, skb);
3080 break;
3081
Marcel Holtmanna93661202015-01-12 09:21:28 -08003082 case HCI_OP_DELETE_STORED_LINK_KEY:
3083 hci_cc_delete_stored_link_key(hdev, skb);
3084 break;
3085
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003086 case HCI_OP_WRITE_LOCAL_NAME:
3087 hci_cc_write_local_name(hdev, skb);
3088 break;
3089
3090 case HCI_OP_READ_LOCAL_NAME:
3091 hci_cc_read_local_name(hdev, skb);
3092 break;
3093
3094 case HCI_OP_WRITE_AUTH_ENABLE:
3095 hci_cc_write_auth_enable(hdev, skb);
3096 break;
3097
3098 case HCI_OP_WRITE_ENCRYPT_MODE:
3099 hci_cc_write_encrypt_mode(hdev, skb);
3100 break;
3101
3102 case HCI_OP_WRITE_SCAN_ENABLE:
3103 hci_cc_write_scan_enable(hdev, skb);
3104 break;
3105
3106 case HCI_OP_READ_CLASS_OF_DEV:
3107 hci_cc_read_class_of_dev(hdev, skb);
3108 break;
3109
3110 case HCI_OP_WRITE_CLASS_OF_DEV:
3111 hci_cc_write_class_of_dev(hdev, skb);
3112 break;
3113
3114 case HCI_OP_READ_VOICE_SETTING:
3115 hci_cc_read_voice_setting(hdev, skb);
3116 break;
3117
3118 case HCI_OP_WRITE_VOICE_SETTING:
3119 hci_cc_write_voice_setting(hdev, skb);
3120 break;
3121
Marcel Holtmannb4cb9fb2013-10-14 13:56:16 -07003122 case HCI_OP_READ_NUM_SUPPORTED_IAC:
3123 hci_cc_read_num_supported_iac(hdev, skb);
3124 break;
3125
Marcel Holtmann333140b2008-07-14 20:13:48 +02003126 case HCI_OP_WRITE_SSP_MODE:
3127 hci_cc_write_ssp_mode(hdev, skb);
3128 break;
3129
Marcel Holtmanneac83dc2014-01-10 02:07:23 -08003130 case HCI_OP_WRITE_SC_SUPPORT:
3131 hci_cc_write_sc_support(hdev, skb);
3132 break;
3133
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003134 case HCI_OP_READ_LOCAL_VERSION:
3135 hci_cc_read_local_version(hdev, skb);
3136 break;
3137
3138 case HCI_OP_READ_LOCAL_COMMANDS:
3139 hci_cc_read_local_commands(hdev, skb);
3140 break;
3141
3142 case HCI_OP_READ_LOCAL_FEATURES:
3143 hci_cc_read_local_features(hdev, skb);
3144 break;
3145
Andre Guedes971e3a42011-06-30 19:20:52 -03003146 case HCI_OP_READ_LOCAL_EXT_FEATURES:
3147 hci_cc_read_local_ext_features(hdev, skb);
3148 break;
3149
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003150 case HCI_OP_READ_BUFFER_SIZE:
3151 hci_cc_read_buffer_size(hdev, skb);
3152 break;
3153
3154 case HCI_OP_READ_BD_ADDR:
3155 hci_cc_read_bd_addr(hdev, skb);
3156 break;
3157
Johan Hedbergf332ec62013-03-15 17:07:11 -05003158 case HCI_OP_READ_PAGE_SCAN_ACTIVITY:
3159 hci_cc_read_page_scan_activity(hdev, skb);
3160 break;
3161
Johan Hedberg4a3ee762013-03-15 17:07:12 -05003162 case HCI_OP_WRITE_PAGE_SCAN_ACTIVITY:
3163 hci_cc_write_page_scan_activity(hdev, skb);
3164 break;
3165
Johan Hedbergf332ec62013-03-15 17:07:11 -05003166 case HCI_OP_READ_PAGE_SCAN_TYPE:
3167 hci_cc_read_page_scan_type(hdev, skb);
3168 break;
3169
Johan Hedberg4a3ee762013-03-15 17:07:12 -05003170 case HCI_OP_WRITE_PAGE_SCAN_TYPE:
3171 hci_cc_write_page_scan_type(hdev, skb);
3172 break;
3173
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +02003174 case HCI_OP_READ_DATA_BLOCK_SIZE:
3175 hci_cc_read_data_block_size(hdev, skb);
3176 break;
3177
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +02003178 case HCI_OP_READ_FLOW_CONTROL_MODE:
3179 hci_cc_read_flow_control_mode(hdev, skb);
3180 break;
3181
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +03003182 case HCI_OP_READ_LOCAL_AMP_INFO:
3183 hci_cc_read_local_amp_info(hdev, skb);
3184 break;
3185
Johan Hedberg33f35722014-06-28 17:54:06 +03003186 case HCI_OP_READ_CLOCK:
3187 hci_cc_read_clock(hdev, skb);
3188 break;
3189
Johan Hedbergd5859e22011-01-25 01:19:58 +02003190 case HCI_OP_READ_INQ_RSP_TX_POWER:
3191 hci_cc_read_inq_rsp_tx_power(hdev, skb);
3192 break;
3193
Johan Hedberg980e1a52011-01-22 06:10:07 +02003194 case HCI_OP_PIN_CODE_REPLY:
3195 hci_cc_pin_code_reply(hdev, skb);
3196 break;
3197
3198 case HCI_OP_PIN_CODE_NEG_REPLY:
3199 hci_cc_pin_code_neg_reply(hdev, skb);
3200 break;
3201
Szymon Jancc35938b2011-03-22 13:12:21 +01003202 case HCI_OP_READ_LOCAL_OOB_DATA:
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08003203 hci_cc_read_local_oob_data(hdev, skb);
3204 break;
3205
3206 case HCI_OP_READ_LOCAL_OOB_EXT_DATA:
3207 hci_cc_read_local_oob_ext_data(hdev, skb);
Szymon Jancc35938b2011-03-22 13:12:21 +01003208 break;
3209
Ville Tervo6ed58ec2011-02-10 22:38:48 -03003210 case HCI_OP_LE_READ_BUFFER_SIZE:
3211 hci_cc_le_read_buffer_size(hdev, skb);
3212 break;
3213
Johan Hedberg60e77322013-01-22 14:01:59 +02003214 case HCI_OP_LE_READ_LOCAL_FEATURES:
3215 hci_cc_le_read_local_features(hdev, skb);
3216 break;
3217
Johan Hedberg8fa19092012-10-19 20:57:49 +03003218 case HCI_OP_LE_READ_ADV_TX_POWER:
3219 hci_cc_le_read_adv_tx_power(hdev, skb);
3220 break;
3221
Johan Hedberga5c29682011-02-19 12:05:57 -03003222 case HCI_OP_USER_CONFIRM_REPLY:
3223 hci_cc_user_confirm_reply(hdev, skb);
3224 break;
3225
3226 case HCI_OP_USER_CONFIRM_NEG_REPLY:
3227 hci_cc_user_confirm_neg_reply(hdev, skb);
3228 break;
3229
Brian Gix1143d452011-11-23 08:28:34 -08003230 case HCI_OP_USER_PASSKEY_REPLY:
3231 hci_cc_user_passkey_reply(hdev, skb);
3232 break;
3233
3234 case HCI_OP_USER_PASSKEY_NEG_REPLY:
3235 hci_cc_user_passkey_neg_reply(hdev, skb);
Szymon Janc16cde992012-04-13 12:32:42 +02003236 break;
Andre Guedes07f7fa52011-12-02 21:13:31 +09003237
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08003238 case HCI_OP_LE_SET_RANDOM_ADDR:
3239 hci_cc_le_set_random_addr(hdev, skb);
3240 break;
3241
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01003242 case HCI_OP_LE_SET_ADV_ENABLE:
3243 hci_cc_le_set_adv_enable(hdev, skb);
3244 break;
3245
Marcel Holtmann533553f2014-03-21 12:18:10 -07003246 case HCI_OP_LE_SET_SCAN_PARAM:
3247 hci_cc_le_set_scan_param(hdev, skb);
3248 break;
3249
Andre Guedeseb9d91f2011-05-26 16:23:52 -03003250 case HCI_OP_LE_SET_SCAN_ENABLE:
3251 hci_cc_le_set_scan_enable(hdev, skb);
3252 break;
3253
Johan Hedbergcf1d0812013-01-22 14:02:00 +02003254 case HCI_OP_LE_READ_WHITE_LIST_SIZE:
3255 hci_cc_le_read_white_list_size(hdev, skb);
3256 break;
3257
Marcel Holtmann0f36b582014-02-27 20:37:31 -08003258 case HCI_OP_LE_CLEAR_WHITE_LIST:
3259 hci_cc_le_clear_white_list(hdev, skb);
3260 break;
3261
3262 case HCI_OP_LE_ADD_TO_WHITE_LIST:
3263 hci_cc_le_add_to_white_list(hdev, skb);
3264 break;
3265
3266 case HCI_OP_LE_DEL_FROM_WHITE_LIST:
3267 hci_cc_le_del_from_white_list(hdev, skb);
3268 break;
3269
Johan Hedberg9b008c02013-01-22 14:02:01 +02003270 case HCI_OP_LE_READ_SUPPORTED_STATES:
3271 hci_cc_le_read_supported_states(hdev, skb);
3272 break;
3273
Marcel Holtmanna8e1bfa2014-12-20 16:28:40 +01003274 case HCI_OP_LE_READ_DEF_DATA_LEN:
3275 hci_cc_le_read_def_data_len(hdev, skb);
3276 break;
3277
3278 case HCI_OP_LE_WRITE_DEF_DATA_LEN:
3279 hci_cc_le_write_def_data_len(hdev, skb);
3280 break;
3281
Ankit Navik545f2592018-06-29 12:13:20 +05303282 case HCI_OP_LE_CLEAR_RESOLV_LIST:
3283 hci_cc_le_clear_resolv_list(hdev, skb);
3284 break;
3285
Ankit Navikcfdb0c22018-06-29 12:12:50 +05303286 case HCI_OP_LE_READ_RESOLV_LIST_SIZE:
3287 hci_cc_le_read_resolv_list_size(hdev, skb);
3288 break;
3289
Ankit Navikaa12af72018-08-07 13:16:35 +05303290 case HCI_OP_LE_SET_ADDR_RESOLV_ENABLE:
3291 hci_cc_le_set_addr_resolution_enable(hdev, skb);
3292 break;
3293
Marcel Holtmanna8e1bfa2014-12-20 16:28:40 +01003294 case HCI_OP_LE_READ_MAX_DATA_LEN:
3295 hci_cc_le_read_max_data_len(hdev, skb);
3296 break;
3297
Andre Guedesf9b49302011-06-30 19:20:53 -03003298 case HCI_OP_WRITE_LE_HOST_SUPPORTED:
3299 hci_cc_write_le_host_supported(hdev, skb);
3300 break;
3301
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02003302 case HCI_OP_LE_SET_ADV_PARAM:
3303 hci_cc_set_adv_param(hdev, skb);
3304 break;
3305
Andrzej Kaczmarek5ae76a92014-05-08 15:32:08 +02003306 case HCI_OP_READ_RSSI:
3307 hci_cc_read_rssi(hdev, skb);
3308 break;
3309
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02003310 case HCI_OP_READ_TX_POWER:
3311 hci_cc_read_tx_power(hdev, skb);
3312 break;
3313
Marcel Holtmannc50b33c2015-01-31 15:07:52 -08003314 case HCI_OP_WRITE_SSP_DEBUG_MODE:
3315 hci_cc_write_ssp_debug_mode(hdev, skb);
3316 break;
3317
Jaganath Kanakkasserya2344b92018-07-06 17:05:28 +05303318 case HCI_OP_LE_SET_EXT_SCAN_PARAMS:
3319 hci_cc_le_set_ext_scan_param(hdev, skb);
3320 break;
3321
3322 case HCI_OP_LE_SET_EXT_SCAN_ENABLE:
3323 hci_cc_le_set_ext_scan_enable(hdev, skb);
3324 break;
3325
Jaganath Kanakkassery0314f282018-07-19 17:09:35 +05303326 case HCI_OP_LE_SET_DEFAULT_PHY:
3327 hci_cc_le_set_default_phy(hdev, skb);
3328 break;
3329
Jaganath Kanakkassery6b49bcb2018-07-19 17:09:40 +05303330 case HCI_OP_LE_READ_NUM_SUPPORTED_ADV_SETS:
3331 hci_cc_le_read_num_adv_sets(hdev, skb);
3332 break;
3333
Jaganath Kanakkasseryde181e82018-07-19 17:09:41 +05303334 case HCI_OP_LE_SET_EXT_ADV_PARAMS:
3335 hci_cc_set_ext_adv_param(hdev, skb);
3336 break;
3337
3338 case HCI_OP_LE_SET_EXT_ADV_ENABLE:
3339 hci_cc_le_set_ext_adv_enable(hdev, skb);
3340 break;
3341
Jaganath Kanakkasserya73c0462018-07-19 17:09:45 +05303342 case HCI_OP_LE_SET_ADV_SET_RAND_ADDR:
3343 hci_cc_le_set_adv_set_random_addr(hdev, skb);
3344 break;
3345
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003346 default:
Johan Hedberge62144872015-04-02 13:41:08 +03003347 BT_DBG("%s opcode 0x%4.4x", hdev->name, *opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003348 break;
3349 }
3350
Johan Hedberge62144872015-04-02 13:41:08 +03003351 if (*opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02003352 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02003353
Johan Hedberg600b2152015-03-28 11:17:36 +02003354 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags))
3355 atomic_set(&hdev->cmd_cnt, 1);
3356
Johan Hedberge62144872015-04-02 13:41:08 +03003357 hci_req_cmd_complete(hdev, *opcode, *status, req_complete,
3358 req_complete_skb);
Johan Hedberg9238f362013-03-05 20:37:48 +02003359
Johan Hedberg600b2152015-03-28 11:17:36 +02003360 if (atomic_read(&hdev->cmd_cnt) && !skb_queue_empty(&hdev->cmd_q))
3361 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003362}
3363
Johan Hedberge62144872015-04-02 13:41:08 +03003364static void hci_cmd_status_evt(struct hci_dev *hdev, struct sk_buff *skb,
3365 u16 *opcode, u8 *status,
3366 hci_req_complete_t *req_complete,
3367 hci_req_complete_skb_t *req_complete_skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003368{
3369 struct hci_ev_cmd_status *ev = (void *) skb->data;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003370
3371 skb_pull(skb, sizeof(*ev));
3372
Johan Hedberge62144872015-04-02 13:41:08 +03003373 *opcode = __le16_to_cpu(ev->opcode);
3374 *status = ev->status;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003375
Johan Hedberge62144872015-04-02 13:41:08 +03003376 switch (*opcode) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003377 case HCI_OP_INQUIRY:
3378 hci_cs_inquiry(hdev, ev->status);
3379 break;
3380
3381 case HCI_OP_CREATE_CONN:
3382 hci_cs_create_conn(hdev, ev->status);
3383 break;
3384
Kuba Pawlak9645c762014-11-06 19:36:53 +01003385 case HCI_OP_DISCONNECT:
3386 hci_cs_disconnect(hdev, ev->status);
3387 break;
3388
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003389 case HCI_OP_ADD_SCO:
3390 hci_cs_add_sco(hdev, ev->status);
3391 break;
3392
Marcel Holtmannf8558552008-07-14 20:13:49 +02003393 case HCI_OP_AUTH_REQUESTED:
3394 hci_cs_auth_requested(hdev, ev->status);
3395 break;
3396
3397 case HCI_OP_SET_CONN_ENCRYPT:
3398 hci_cs_set_conn_encrypt(hdev, ev->status);
3399 break;
3400
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003401 case HCI_OP_REMOTE_NAME_REQ:
3402 hci_cs_remote_name_req(hdev, ev->status);
3403 break;
3404
Marcel Holtmann769be972008-07-14 20:13:49 +02003405 case HCI_OP_READ_REMOTE_FEATURES:
3406 hci_cs_read_remote_features(hdev, ev->status);
3407 break;
3408
3409 case HCI_OP_READ_REMOTE_EXT_FEATURES:
3410 hci_cs_read_remote_ext_features(hdev, ev->status);
3411 break;
3412
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003413 case HCI_OP_SETUP_SYNC_CONN:
3414 hci_cs_setup_sync_conn(hdev, ev->status);
3415 break;
3416
3417 case HCI_OP_SNIFF_MODE:
3418 hci_cs_sniff_mode(hdev, ev->status);
3419 break;
3420
3421 case HCI_OP_EXIT_SNIFF_MODE:
3422 hci_cs_exit_sniff_mode(hdev, ev->status);
3423 break;
3424
Kuba Pawlak50fc85f2014-11-06 19:36:52 +01003425 case HCI_OP_SWITCH_ROLE:
3426 hci_cs_switch_role(hdev, ev->status);
3427 break;
3428
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02003429 case HCI_OP_LE_CREATE_CONN:
3430 hci_cs_le_create_conn(hdev, ev->status);
3431 break;
3432
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07003433 case HCI_OP_LE_READ_REMOTE_FEATURES:
3434 hci_cs_le_read_remote_features(hdev, ev->status);
3435 break;
3436
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02003437 case HCI_OP_LE_START_ENC:
3438 hci_cs_le_start_enc(hdev, ev->status);
3439 break;
3440
Jaganath Kanakkassery4d94f952018-07-06 22:50:32 +02003441 case HCI_OP_LE_EXT_CREATE_CONN:
3442 hci_cs_le_ext_create_conn(hdev, ev->status);
3443 break;
3444
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003445 default:
Johan Hedberge62144872015-04-02 13:41:08 +03003446 BT_DBG("%s opcode 0x%4.4x", hdev->name, *opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003447 break;
3448 }
3449
Johan Hedberge62144872015-04-02 13:41:08 +03003450 if (*opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02003451 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02003452
Johan Hedberg600b2152015-03-28 11:17:36 +02003453 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags))
3454 atomic_set(&hdev->cmd_cnt, 1);
3455
Johan Hedberg444c6dd2015-04-02 13:41:07 +03003456 /* Indicate request completion if the command failed. Also, if
3457 * we're not waiting for a special event and we get a success
3458 * command status we should try to flag the request as completed
3459 * (since for this kind of commands there will not be a command
3460 * complete event).
3461 */
Johan Hedberg02350a72013-04-03 21:50:29 +03003462 if (ev->status ||
Marcel Holtmann242c0eb2015-10-25 22:45:53 +01003463 (hdev->sent_cmd && !bt_cb(hdev->sent_cmd)->hci.req_event))
Johan Hedberge62144872015-04-02 13:41:08 +03003464 hci_req_cmd_complete(hdev, *opcode, ev->status, req_complete,
3465 req_complete_skb);
Johan Hedberg9238f362013-03-05 20:37:48 +02003466
Johan Hedberg600b2152015-03-28 11:17:36 +02003467 if (atomic_read(&hdev->cmd_cnt) && !skb_queue_empty(&hdev->cmd_q))
3468 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003469}
3470
Marcel Holtmann24dfa342014-11-02 02:56:41 +01003471static void hci_hardware_error_evt(struct hci_dev *hdev, struct sk_buff *skb)
3472{
3473 struct hci_ev_hardware_error *ev = (void *) skb->data;
3474
Marcel Holtmannc7741d12015-01-28 11:09:55 -08003475 hdev->hw_error_code = ev->code;
3476
3477 queue_work(hdev->req_workqueue, &hdev->error_reset);
Marcel Holtmann24dfa342014-11-02 02:56:41 +01003478}
3479
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003480static void hci_role_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003481{
3482 struct hci_ev_role_change *ev = (void *) skb->data;
3483 struct hci_conn *conn;
3484
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003485 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003486
3487 hci_dev_lock(hdev);
3488
3489 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3490 if (conn) {
Johan Hedberg40bef302014-07-16 11:42:27 +03003491 if (!ev->status)
3492 conn->role = ev->role;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003493
Johan Hedberg51a8efd2012-01-16 06:10:31 +02003494 clear_bit(HCI_CONN_RSWITCH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003495
3496 hci_role_switch_cfm(conn, ev->status, ev->role);
3497 }
3498
3499 hci_dev_unlock(hdev);
3500}
3501
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003502static void hci_num_comp_pkts_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003503{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003504 struct hci_ev_num_comp_pkts *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003505 int i;
3506
Andrei Emeltchenko32ac5b92011-12-19 16:31:29 +02003507 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_PACKET_BASED) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003508 bt_dev_err(hdev, "wrong event for mode %d", hdev->flow_ctl_mode);
Andrei Emeltchenko32ac5b92011-12-19 16:31:29 +02003509 return;
3510 }
3511
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02003512 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03003513 ev->num_hndl * sizeof(struct hci_comp_pkts_info)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003514 BT_DBG("%s bad parameters", hdev->name);
3515 return;
3516 }
3517
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02003518 BT_DBG("%s num_hndl %d", hdev->name, ev->num_hndl);
3519
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02003520 for (i = 0; i < ev->num_hndl; i++) {
3521 struct hci_comp_pkts_info *info = &ev->handles[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07003522 struct hci_conn *conn;
3523 __u16 handle, count;
3524
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02003525 handle = __le16_to_cpu(info->handle);
3526 count = __le16_to_cpu(info->count);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003527
3528 conn = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003529 if (!conn)
3530 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003531
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003532 conn->sent -= count;
3533
3534 switch (conn->type) {
3535 case ACL_LINK:
3536 hdev->acl_cnt += count;
3537 if (hdev->acl_cnt > hdev->acl_pkts)
3538 hdev->acl_cnt = hdev->acl_pkts;
3539 break;
3540
3541 case LE_LINK:
3542 if (hdev->le_pkts) {
3543 hdev->le_cnt += count;
3544 if (hdev->le_cnt > hdev->le_pkts)
3545 hdev->le_cnt = hdev->le_pkts;
3546 } else {
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02003547 hdev->acl_cnt += count;
3548 if (hdev->acl_cnt > hdev->acl_pkts)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003549 hdev->acl_cnt = hdev->acl_pkts;
3550 }
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003551 break;
3552
3553 case SCO_LINK:
3554 hdev->sco_cnt += count;
3555 if (hdev->sco_cnt > hdev->sco_pkts)
3556 hdev->sco_cnt = hdev->sco_pkts;
3557 break;
3558
3559 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003560 bt_dev_err(hdev, "unknown type %d conn %p",
3561 conn->type, conn);
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003562 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003563 }
3564 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003565
Gustavo F. Padovan3eff45e2011-12-15 00:50:02 -02003566 queue_work(hdev->workqueue, &hdev->tx_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003567}
3568
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003569static struct hci_conn *__hci_conn_lookup_handle(struct hci_dev *hdev,
3570 __u16 handle)
3571{
3572 struct hci_chan *chan;
3573
3574 switch (hdev->dev_type) {
Marcel Holtmannca8bee52016-07-05 14:30:14 +02003575 case HCI_PRIMARY:
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003576 return hci_conn_hash_lookup_handle(hdev, handle);
3577 case HCI_AMP:
3578 chan = hci_chan_lookup_handle(hdev, handle);
3579 if (chan)
3580 return chan->conn;
3581 break;
3582 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003583 bt_dev_err(hdev, "unknown dev_type %d", hdev->dev_type);
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003584 break;
3585 }
3586
3587 return NULL;
3588}
3589
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003590static void hci_num_comp_blocks_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003591{
3592 struct hci_ev_num_comp_blocks *ev = (void *) skb->data;
3593 int i;
3594
3595 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_BLOCK_BASED) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003596 bt_dev_err(hdev, "wrong event for mode %d", hdev->flow_ctl_mode);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003597 return;
3598 }
3599
3600 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03003601 ev->num_hndl * sizeof(struct hci_comp_blocks_info)) {
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003602 BT_DBG("%s bad parameters", hdev->name);
3603 return;
3604 }
3605
3606 BT_DBG("%s num_blocks %d num_hndl %d", hdev->name, ev->num_blocks,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003607 ev->num_hndl);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003608
3609 for (i = 0; i < ev->num_hndl; i++) {
3610 struct hci_comp_blocks_info *info = &ev->handles[i];
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003611 struct hci_conn *conn = NULL;
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003612 __u16 handle, block_count;
3613
3614 handle = __le16_to_cpu(info->handle);
3615 block_count = __le16_to_cpu(info->blocks);
3616
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003617 conn = __hci_conn_lookup_handle(hdev, handle);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003618 if (!conn)
3619 continue;
3620
3621 conn->sent -= block_count;
3622
3623 switch (conn->type) {
3624 case ACL_LINK:
Andrei Emeltchenkobd1eb662012-10-10 17:38:30 +03003625 case AMP_LINK:
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003626 hdev->block_cnt += block_count;
3627 if (hdev->block_cnt > hdev->num_blocks)
3628 hdev->block_cnt = hdev->num_blocks;
3629 break;
3630
3631 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003632 bt_dev_err(hdev, "unknown type %d conn %p",
3633 conn->type, conn);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003634 break;
3635 }
3636 }
3637
3638 queue_work(hdev->workqueue, &hdev->tx_work);
3639}
3640
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003641static void hci_mode_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003642{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003643 struct hci_ev_mode_change *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003644 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003645
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003646 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003647
3648 hci_dev_lock(hdev);
3649
Marcel Holtmann04837f62006-07-03 10:02:33 +02003650 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3651 if (conn) {
3652 conn->mode = ev->mode;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003653
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003654 if (!test_and_clear_bit(HCI_CONN_MODE_CHANGE_PEND,
3655 &conn->flags)) {
Marcel Holtmann04837f62006-07-03 10:02:33 +02003656 if (conn->mode == HCI_CM_ACTIVE)
Johan Hedberg58a681e2012-01-16 06:47:28 +02003657 set_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003658 else
Johan Hedberg58a681e2012-01-16 06:47:28 +02003659 clear_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003660 }
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003661
Johan Hedberg51a8efd2012-01-16 06:10:31 +02003662 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003663 hci_sco_setup(conn, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003664 }
3665
3666 hci_dev_unlock(hdev);
3667}
3668
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003669static void hci_pin_code_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003670{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003671 struct hci_ev_pin_code_req *ev = (void *) skb->data;
3672 struct hci_conn *conn;
3673
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003674 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003675
3676 hci_dev_lock(hdev);
3677
3678 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003679 if (!conn)
3680 goto unlock;
3681
3682 if (conn->state == BT_CONNECTED) {
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003683 hci_conn_hold(conn);
3684 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003685 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003686 }
3687
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003688 if (!hci_dev_test_flag(hdev, HCI_BONDABLE) &&
Johan Hedberg2f407f02014-07-17 15:35:40 +03003689 !test_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags)) {
Johan Hedberg03b555e2011-01-04 15:40:05 +02003690 hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003691 sizeof(ev->bdaddr), &ev->bdaddr);
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003692 } else if (hci_dev_test_flag(hdev, HCI_MGMT)) {
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003693 u8 secure;
3694
3695 if (conn->pending_sec_level == BT_SECURITY_HIGH)
3696 secure = 1;
3697 else
3698 secure = 0;
3699
Johan Hedberg744cf192011-11-08 20:40:14 +02003700 mgmt_pin_code_request(hdev, &ev->bdaddr, secure);
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003701 }
Johan Hedberg980e1a52011-01-22 06:10:07 +02003702
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003703unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003704 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003705}
3706
Johan Hedbergcb6f3f72014-11-19 14:53:04 +02003707static void conn_set_key(struct hci_conn *conn, u8 key_type, u8 pin_len)
3708{
3709 if (key_type == HCI_LK_CHANGED_COMBINATION)
3710 return;
3711
3712 conn->pin_length = pin_len;
3713 conn->key_type = key_type;
3714
3715 switch (key_type) {
3716 case HCI_LK_LOCAL_UNIT:
3717 case HCI_LK_REMOTE_UNIT:
3718 case HCI_LK_DEBUG_COMBINATION:
3719 return;
3720 case HCI_LK_COMBINATION:
3721 if (pin_len == 16)
3722 conn->pending_sec_level = BT_SECURITY_HIGH;
3723 else
3724 conn->pending_sec_level = BT_SECURITY_MEDIUM;
3725 break;
3726 case HCI_LK_UNAUTH_COMBINATION_P192:
3727 case HCI_LK_UNAUTH_COMBINATION_P256:
3728 conn->pending_sec_level = BT_SECURITY_MEDIUM;
3729 break;
3730 case HCI_LK_AUTH_COMBINATION_P192:
3731 conn->pending_sec_level = BT_SECURITY_HIGH;
3732 break;
3733 case HCI_LK_AUTH_COMBINATION_P256:
3734 conn->pending_sec_level = BT_SECURITY_FIPS;
3735 break;
3736 }
3737}
3738
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003739static void hci_link_key_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003740{
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003741 struct hci_ev_link_key_req *ev = (void *) skb->data;
3742 struct hci_cp_link_key_reply cp;
3743 struct hci_conn *conn;
3744 struct link_key *key;
3745
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003746 BT_DBG("%s", hdev->name);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003747
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003748 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003749 return;
3750
3751 hci_dev_lock(hdev);
3752
3753 key = hci_find_link_key(hdev, &ev->bdaddr);
3754 if (!key) {
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003755 BT_DBG("%s link key not found for %pMR", hdev->name,
3756 &ev->bdaddr);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003757 goto not_found;
3758 }
3759
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003760 BT_DBG("%s found key type %u for %pMR", hdev->name, key->type,
3761 &ev->bdaddr);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003762
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003763 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003764 if (conn) {
Johan Hedbergfe8bc5a2014-08-14 12:33:17 +03003765 clear_bit(HCI_CONN_NEW_LINK_KEY, &conn->flags);
3766
Marcel Holtmann66138ce2014-01-10 02:07:20 -08003767 if ((key->type == HCI_LK_UNAUTH_COMBINATION_P192 ||
3768 key->type == HCI_LK_UNAUTH_COMBINATION_P256) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03003769 conn->auth_type != 0xff && (conn->auth_type & 0x01)) {
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003770 BT_DBG("%s ignoring unauthenticated key", hdev->name);
3771 goto not_found;
3772 }
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003773
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003774 if (key->type == HCI_LK_COMBINATION && key->pin_len < 16 &&
Johan Hedbergf3fb0b52014-06-02 10:12:44 +03003775 (conn->pending_sec_level == BT_SECURITY_HIGH ||
3776 conn->pending_sec_level == BT_SECURITY_FIPS)) {
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003777 BT_DBG("%s ignoring key unauthenticated for high security",
3778 hdev->name);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003779 goto not_found;
3780 }
3781
Johan Hedbergcb6f3f72014-11-19 14:53:04 +02003782 conn_set_key(conn, key->type, key->pin_len);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003783 }
3784
3785 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9b3b4462012-05-23 11:31:20 +03003786 memcpy(cp.link_key, key->val, HCI_LINK_KEY_SIZE);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003787
3788 hci_send_cmd(hdev, HCI_OP_LINK_KEY_REPLY, sizeof(cp), &cp);
3789
3790 hci_dev_unlock(hdev);
3791
3792 return;
3793
3794not_found:
3795 hci_send_cmd(hdev, HCI_OP_LINK_KEY_NEG_REPLY, 6, &ev->bdaddr);
3796 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003797}
3798
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003799static void hci_link_key_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003800{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003801 struct hci_ev_link_key_notify *ev = (void *) skb->data;
3802 struct hci_conn *conn;
Johan Hedberg7652ff62014-06-24 13:15:49 +03003803 struct link_key *key;
3804 bool persistent;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003805 u8 pin_len = 0;
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003806
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003807 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003808
3809 hci_dev_lock(hdev);
3810
3811 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg82c13d42014-12-03 11:03:06 +02003812 if (!conn)
3813 goto unlock;
3814
3815 hci_conn_hold(conn);
3816 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
3817 hci_conn_drop(conn);
3818
Johan Hedbergfe8bc5a2014-08-14 12:33:17 +03003819 set_bit(HCI_CONN_NEW_LINK_KEY, &conn->flags);
Johan Hedberg82c13d42014-12-03 11:03:06 +02003820 conn_set_key(conn, ev->key_type, conn->pin_length);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003821
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003822 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg7652ff62014-06-24 13:15:49 +03003823 goto unlock;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003824
Johan Hedberg7652ff62014-06-24 13:15:49 +03003825 key = hci_add_link_key(hdev, conn, &ev->bdaddr, ev->link_key,
3826 ev->key_type, pin_len, &persistent);
3827 if (!key)
3828 goto unlock;
3829
Johan Hedbergcb6f3f72014-11-19 14:53:04 +02003830 /* Update connection information since adding the key will have
3831 * fixed up the type in the case of changed combination keys.
3832 */
3833 if (ev->key_type == HCI_LK_CHANGED_COMBINATION)
3834 conn_set_key(conn, key->type, key->pin_len);
3835
Johan Hedberg7652ff62014-06-24 13:15:49 +03003836 mgmt_new_link_key(hdev, key, persistent);
3837
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003838 /* Keep debug keys around only if the HCI_KEEP_DEBUG_KEYS flag
3839 * is set. If it's not set simply remove the key from the kernel
3840 * list (we've still notified user space about it but with
3841 * store_hint being 0).
3842 */
3843 if (key->type == HCI_LK_DEBUG_COMBINATION &&
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003844 !hci_dev_test_flag(hdev, HCI_KEEP_DEBUG_KEYS)) {
Johan Hedberg0378b592014-11-19 15:22:22 +02003845 list_del_rcu(&key->list);
3846 kfree_rcu(key, rcu);
Johan Hedberg82c13d42014-12-03 11:03:06 +02003847 goto unlock;
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003848 }
Johan Hedberg7652ff62014-06-24 13:15:49 +03003849
Johan Hedberg82c13d42014-12-03 11:03:06 +02003850 if (persistent)
3851 clear_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
3852 else
3853 set_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
3854
Johan Hedberg7652ff62014-06-24 13:15:49 +03003855unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003856 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003857}
3858
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003859static void hci_clock_offset_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04837f62006-07-03 10:02:33 +02003860{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003861 struct hci_ev_clock_offset *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003862 struct hci_conn *conn;
3863
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003864 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003865
3866 hci_dev_lock(hdev);
3867
3868 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003869 if (conn && !ev->status) {
3870 struct inquiry_entry *ie;
3871
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003872 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3873 if (ie) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003874 ie->data.clock_offset = ev->clock_offset;
3875 ie->timestamp = jiffies;
3876 }
3877 }
3878
3879 hci_dev_unlock(hdev);
3880}
3881
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003882static void hci_pkt_type_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna8746412008-07-14 20:13:46 +02003883{
3884 struct hci_ev_pkt_type_change *ev = (void *) skb->data;
3885 struct hci_conn *conn;
3886
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003887 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna8746412008-07-14 20:13:46 +02003888
3889 hci_dev_lock(hdev);
3890
3891 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3892 if (conn && !ev->status)
3893 conn->pkt_type = __le16_to_cpu(ev->pkt_type);
3894
3895 hci_dev_unlock(hdev);
3896}
3897
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003898static void hci_pscan_rep_mode_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003899{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003900 struct hci_ev_pscan_rep_mode *ev = (void *) skb->data;
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003901 struct inquiry_entry *ie;
3902
3903 BT_DBG("%s", hdev->name);
3904
3905 hci_dev_lock(hdev);
3906
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003907 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
3908 if (ie) {
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003909 ie->data.pscan_rep_mode = ev->pscan_rep_mode;
3910 ie->timestamp = jiffies;
3911 }
3912
3913 hci_dev_unlock(hdev);
3914}
3915
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003916static void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev,
3917 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003918{
3919 struct inquiry_data data;
3920 int num_rsp = *((__u8 *) skb->data);
3921
3922 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
3923
3924 if (!num_rsp)
3925 return;
3926
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003927 if (hci_dev_test_flag(hdev, HCI_PERIODIC_INQ))
Andre Guedes1519cc12012-03-21 00:03:38 -03003928 return;
3929
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003930 hci_dev_lock(hdev);
3931
3932 if ((skb->len - 1) / num_rsp != sizeof(struct inquiry_info_with_rssi)) {
Szymon Janc138d22e2011-02-17 16:44:23 +01003933 struct inquiry_info_with_rssi_and_pscan_mode *info;
3934 info = (void *) (skb->data + 1);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003935
Johan Hedberge17acd42011-03-30 23:57:16 +03003936 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003937 u32 flags;
3938
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003939 bacpy(&data.bdaddr, &info->bdaddr);
3940 data.pscan_rep_mode = info->pscan_rep_mode;
3941 data.pscan_period_mode = info->pscan_period_mode;
3942 data.pscan_mode = info->pscan_mode;
3943 memcpy(data.dev_class, info->dev_class, 3);
3944 data.clock_offset = info->clock_offset;
3945 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003946 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02003947
Marcel Holtmannaf589252014-07-01 14:11:20 +02003948 flags = hci_inquiry_cache_update(hdev, &data, false);
3949
Johan Hedberg48264f02011-11-09 13:58:58 +02003950 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003951 info->dev_class, info->rssi,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003952 flags, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003953 }
3954 } else {
3955 struct inquiry_info_with_rssi *info = (void *) (skb->data + 1);
3956
Johan Hedberge17acd42011-03-30 23:57:16 +03003957 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003958 u32 flags;
3959
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003960 bacpy(&data.bdaddr, &info->bdaddr);
3961 data.pscan_rep_mode = info->pscan_rep_mode;
3962 data.pscan_period_mode = info->pscan_period_mode;
3963 data.pscan_mode = 0x00;
3964 memcpy(data.dev_class, info->dev_class, 3);
3965 data.clock_offset = info->clock_offset;
3966 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003967 data.ssp_mode = 0x00;
Marcel Holtmannaf589252014-07-01 14:11:20 +02003968
3969 flags = hci_inquiry_cache_update(hdev, &data, false);
3970
Johan Hedberg48264f02011-11-09 13:58:58 +02003971 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003972 info->dev_class, info->rssi,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003973 flags, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003974 }
3975 }
3976
3977 hci_dev_unlock(hdev);
3978}
3979
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003980static void hci_remote_ext_features_evt(struct hci_dev *hdev,
3981 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003982{
Marcel Holtmann41a96212008-07-14 20:13:48 +02003983 struct hci_ev_remote_ext_features *ev = (void *) skb->data;
3984 struct hci_conn *conn;
3985
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003986 BT_DBG("%s", hdev->name);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003987
Marcel Holtmann41a96212008-07-14 20:13:48 +02003988 hci_dev_lock(hdev);
3989
3990 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02003991 if (!conn)
3992 goto unlock;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003993
Johan Hedbergcad718e2013-04-17 15:00:51 +03003994 if (ev->page < HCI_MAX_PAGES)
3995 memcpy(conn->features[ev->page], ev->features, 8);
3996
Johan Hedbergccd556f2010-11-10 17:11:51 +02003997 if (!ev->status && ev->page == 0x01) {
3998 struct inquiry_entry *ie;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003999
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02004000 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
4001 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02004002 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann769be972008-07-14 20:13:49 +02004003
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05304004 if (ev->features[0] & LMP_HOST_SSP) {
Johan Hedberg58a681e2012-01-16 06:47:28 +02004005 set_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05304006 } else {
4007 /* It is mandatory by the Bluetooth specification that
4008 * Extended Inquiry Results are only used when Secure
4009 * Simple Pairing is enabled, but some devices violate
4010 * this.
4011 *
4012 * To make these devices work, the internal SSP
4013 * enabled flag needs to be cleared if the remote host
4014 * features do not indicate SSP support */
4015 clear_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
4016 }
Marcel Holtmanneb9a8f32014-01-15 22:37:38 -08004017
4018 if (ev->features[0] & LMP_HOST_SC)
4019 set_bit(HCI_CONN_SC_ENABLED, &conn->flags);
Marcel Holtmann41a96212008-07-14 20:13:48 +02004020 }
4021
Johan Hedbergccd556f2010-11-10 17:11:51 +02004022 if (conn->state != BT_CONFIG)
4023 goto unlock;
4024
Johan Hedberg671267b2012-05-12 16:11:50 -03004025 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02004026 struct hci_cp_remote_name_req cp;
4027 memset(&cp, 0, sizeof(cp));
4028 bacpy(&cp.bdaddr, &conn->dst);
4029 cp.pscan_rep_mode = 0x02;
4030 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02004031 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00004032 mgmt_device_connected(hdev, conn, 0, NULL, 0);
Johan Hedberg392599b2010-11-18 22:22:28 +02004033
Johan Hedberg127178d2010-11-18 22:22:29 +02004034 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02004035 conn->state = BT_CONNECTED;
Johan Hedberg539c4962015-02-18 14:53:57 +02004036 hci_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02004037 hci_conn_drop(conn);
Johan Hedbergccd556f2010-11-10 17:11:51 +02004038 }
4039
4040unlock:
Marcel Holtmann41a96212008-07-14 20:13:48 +02004041 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004042}
4043
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004044static void hci_sync_conn_complete_evt(struct hci_dev *hdev,
4045 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004046{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02004047 struct hci_ev_sync_conn_complete *ev = (void *) skb->data;
4048 struct hci_conn *conn;
4049
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004050 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02004051
4052 hci_dev_lock(hdev);
4053
4054 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann9dc0a3a2008-07-14 20:13:46 +02004055 if (!conn) {
4056 if (ev->link_type == ESCO_LINK)
4057 goto unlock;
4058
Kuba Pawlak618353b2015-08-28 13:05:22 +01004059 /* When the link type in the event indicates SCO connection
4060 * and lookup of the connection object fails, then check
4061 * if an eSCO connection object exists.
4062 *
4063 * The core limits the synchronous connections to either
4064 * SCO or eSCO. The eSCO connection is preferred and tried
4065 * to be setup first and until successfully established,
4066 * the link type will be hinted as eSCO.
4067 */
Marcel Holtmann9dc0a3a2008-07-14 20:13:46 +02004068 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
4069 if (!conn)
4070 goto unlock;
Marcel Holtmann9dc0a3a2008-07-14 20:13:46 +02004071 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02004072
Marcel Holtmann732547f2009-04-19 19:14:14 +02004073 switch (ev->status) {
4074 case 0x00:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02004075 conn->handle = __le16_to_cpu(ev->handle);
4076 conn->state = BT_CONNECTED;
Kuba Pawlak618353b2015-08-28 13:05:22 +01004077 conn->type = ev->link_type;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02004078
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01004079 hci_debugfs_create_conn(conn);
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02004080 hci_conn_add_sysfs(conn);
Marcel Holtmann732547f2009-04-19 19:14:14 +02004081 break;
4082
Nick Pelly81218d22014-06-30 11:25:01 +05304083 case 0x10: /* Connection Accept Timeout */
Frédéric Dalleau1a4c9582013-08-19 14:24:02 +02004084 case 0x0d: /* Connection Rejected due to Limited Resources */
Stephen Coe705e5712010-02-16 11:29:44 -05004085 case 0x11: /* Unsupported Feature or Parameter Value */
Marcel Holtmann732547f2009-04-19 19:14:14 +02004086 case 0x1c: /* SCO interval rejected */
Nick Pelly1038a002010-02-03 11:42:26 -08004087 case 0x1a: /* Unsupported Remote Feature */
Marcel Holtmann732547f2009-04-19 19:14:14 +02004088 case 0x1f: /* Unspecified error */
Andrew Earl27539bc2014-03-10 10:31:04 +00004089 case 0x20: /* Unsupported LMP Parameter value */
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02004090 if (conn->out) {
Marcel Holtmann732547f2009-04-19 19:14:14 +02004091 conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) |
4092 (hdev->esco_type & EDR_ESCO_MASK);
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02004093 if (hci_setup_sync(conn, conn->link->handle))
4094 goto unlock;
Marcel Holtmann732547f2009-04-19 19:14:14 +02004095 }
4096 /* fall through */
4097
4098 default:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02004099 conn->state = BT_CLOSED;
Marcel Holtmann732547f2009-04-19 19:14:14 +02004100 break;
4101 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02004102
Johan Hedberg539c4962015-02-18 14:53:57 +02004103 hci_connect_cfm(conn, ev->status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02004104 if (ev->status)
4105 hci_conn_del(conn);
4106
4107unlock:
4108 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004109}
4110
Marcel Holtmannefdcf8e2013-10-15 10:31:12 -07004111static inline size_t eir_get_length(u8 *eir, size_t eir_len)
4112{
4113 size_t parsed = 0;
4114
4115 while (parsed < eir_len) {
4116 u8 field_len = eir[0];
4117
4118 if (field_len == 0)
4119 return parsed;
4120
4121 parsed += field_len + 1;
4122 eir += field_len + 1;
4123 }
4124
4125 return eir_len;
4126}
4127
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004128static void hci_extended_inquiry_result_evt(struct hci_dev *hdev,
4129 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004130{
4131 struct inquiry_data data;
4132 struct extended_inquiry_info *info = (void *) (skb->data + 1);
4133 int num_rsp = *((__u8 *) skb->data);
Vishal Agarwal9d939d92012-04-26 19:19:56 +05304134 size_t eir_len;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004135
4136 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
4137
4138 if (!num_rsp)
4139 return;
4140
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004141 if (hci_dev_test_flag(hdev, HCI_PERIODIC_INQ))
Andre Guedes1519cc12012-03-21 00:03:38 -03004142 return;
4143
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004144 hci_dev_lock(hdev);
4145
Johan Hedberge17acd42011-03-30 23:57:16 +03004146 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02004147 u32 flags;
4148 bool name_known;
Johan Hedberg561aafb2012-01-04 13:31:59 +02004149
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004150 bacpy(&data.bdaddr, &info->bdaddr);
Szymon Janc138d22e2011-02-17 16:44:23 +01004151 data.pscan_rep_mode = info->pscan_rep_mode;
4152 data.pscan_period_mode = info->pscan_period_mode;
4153 data.pscan_mode = 0x00;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004154 memcpy(data.dev_class, info->dev_class, 3);
Szymon Janc138d22e2011-02-17 16:44:23 +01004155 data.clock_offset = info->clock_offset;
4156 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02004157 data.ssp_mode = 0x01;
Johan Hedberg561aafb2012-01-04 13:31:59 +02004158
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004159 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg0d3b7f62016-01-05 13:19:31 +02004160 name_known = eir_get_data(info->data,
4161 sizeof(info->data),
4162 EIR_NAME_COMPLETE, NULL);
Johan Hedberg561aafb2012-01-04 13:31:59 +02004163 else
4164 name_known = true;
4165
Marcel Holtmannaf589252014-07-01 14:11:20 +02004166 flags = hci_inquiry_cache_update(hdev, &data, name_known);
4167
Vishal Agarwal9d939d92012-04-26 19:19:56 +05304168 eir_len = eir_get_length(info->data, sizeof(info->data));
Marcel Holtmannaf589252014-07-01 14:11:20 +02004169
Johan Hedberg48264f02011-11-09 13:58:58 +02004170 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Marcel Holtmannaf589252014-07-01 14:11:20 +02004171 info->dev_class, info->rssi,
4172 flags, info->data, eir_len, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004173 }
4174
4175 hci_dev_unlock(hdev);
4176}
4177
Johan Hedberg1c2e0042012-06-08 23:31:13 +08004178static void hci_key_refresh_complete_evt(struct hci_dev *hdev,
4179 struct sk_buff *skb)
4180{
4181 struct hci_ev_key_refresh_complete *ev = (void *) skb->data;
4182 struct hci_conn *conn;
4183
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004184 BT_DBG("%s status 0x%2.2x handle 0x%4.4x", hdev->name, ev->status,
Johan Hedberg1c2e0042012-06-08 23:31:13 +08004185 __le16_to_cpu(ev->handle));
4186
4187 hci_dev_lock(hdev);
4188
4189 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
4190 if (!conn)
4191 goto unlock;
4192
Johan Hedberg9eb1fbf2014-04-11 12:02:31 -07004193 /* For BR/EDR the necessary steps are taken through the
4194 * auth_complete event.
4195 */
4196 if (conn->type != LE_LINK)
4197 goto unlock;
4198
Johan Hedberg1c2e0042012-06-08 23:31:13 +08004199 if (!ev->status)
4200 conn->sec_level = conn->pending_sec_level;
4201
4202 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
4203
4204 if (ev->status && conn->state == BT_CONNECTED) {
Andre Guedesbed71742013-01-30 11:50:56 -03004205 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
David Herrmann76a68ba2013-04-06 20:28:37 +02004206 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08004207 goto unlock;
4208 }
4209
4210 if (conn->state == BT_CONFIG) {
4211 if (!ev->status)
4212 conn->state = BT_CONNECTED;
4213
Johan Hedberg539c4962015-02-18 14:53:57 +02004214 hci_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02004215 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08004216 } else {
4217 hci_auth_cfm(conn, ev->status);
4218
4219 hci_conn_hold(conn);
4220 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02004221 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08004222 }
4223
4224unlock:
4225 hci_dev_unlock(hdev);
4226}
4227
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004228static u8 hci_get_auth_req(struct hci_conn *conn)
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004229{
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004230 /* If remote requests no-bonding follow that lead */
Mikel Astizacabae92013-06-28 10:56:28 +02004231 if (conn->remote_auth == HCI_AT_NO_BONDING ||
4232 conn->remote_auth == HCI_AT_NO_BONDING_MITM)
Waldemar Rymarkiewicz58797bf2011-04-28 12:07:58 +02004233 return conn->remote_auth | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004234
Mikel Astizb7f94c82014-04-08 14:21:31 +02004235 /* If both remote and local have enough IO capabilities, require
4236 * MITM protection
4237 */
4238 if (conn->remote_cap != HCI_IO_NO_INPUT_OUTPUT &&
4239 conn->io_capability != HCI_IO_NO_INPUT_OUTPUT)
4240 return conn->remote_auth | 0x01;
4241
Timo Mueller7e741702014-04-08 14:21:33 +02004242 /* No MITM protection possible so ignore remote requirement */
4243 return (conn->remote_auth & ~0x01) | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004244}
4245
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08004246static u8 bredr_oob_data_present(struct hci_conn *conn)
4247{
4248 struct hci_dev *hdev = conn->hdev;
4249 struct oob_data *data;
4250
4251 data = hci_find_remote_oob_data(hdev, &conn->dst, BDADDR_BREDR);
4252 if (!data)
4253 return 0x00;
4254
Marcel Holtmann455c2ff2015-03-15 16:42:53 -07004255 if (bredr_sc_enabled(hdev)) {
4256 /* When Secure Connections is enabled, then just
4257 * return the present value stored with the OOB
4258 * data. The stored value contains the right present
4259 * information. However it can only be trusted when
4260 * not in Secure Connection Only mode.
Marcel Holtmann659c7fb2015-01-30 23:20:56 -08004261 */
Marcel Holtmann455c2ff2015-03-15 16:42:53 -07004262 if (!hci_dev_test_flag(hdev, HCI_SC_ONLY))
4263 return data->present;
4264
4265 /* When Secure Connections Only mode is enabled, then
4266 * the P-256 values are required. If they are not
4267 * available, then do not declare that OOB data is
4268 * present.
4269 */
4270 if (!memcmp(data->rand256, ZERO_KEY, 16) ||
4271 !memcmp(data->hash256, ZERO_KEY, 16))
Marcel Holtmann659c7fb2015-01-30 23:20:56 -08004272 return 0x00;
4273
Marcel Holtmann455c2ff2015-03-15 16:42:53 -07004274 return 0x02;
Marcel Holtmann659c7fb2015-01-30 23:20:56 -08004275 }
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08004276
Marcel Holtmann455c2ff2015-03-15 16:42:53 -07004277 /* When Secure Connections is not enabled or actually
4278 * not supported by the hardware, then check that if
4279 * P-192 data values are present.
4280 */
4281 if (!memcmp(data->rand192, ZERO_KEY, 16) ||
4282 !memcmp(data->hash192, ZERO_KEY, 16))
4283 return 0x00;
4284
4285 return 0x01;
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08004286}
4287
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004288static void hci_io_capa_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02004289{
4290 struct hci_ev_io_capa_request *ev = (void *) skb->data;
4291 struct hci_conn *conn;
4292
4293 BT_DBG("%s", hdev->name);
4294
4295 hci_dev_lock(hdev);
4296
4297 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg03b555e2011-01-04 15:40:05 +02004298 if (!conn)
4299 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02004300
Johan Hedberg03b555e2011-01-04 15:40:05 +02004301 hci_conn_hold(conn);
4302
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004303 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg03b555e2011-01-04 15:40:05 +02004304 goto unlock;
4305
Johan Hedberg2f407f02014-07-17 15:35:40 +03004306 /* Allow pairing if we're pairable, the initiators of the
4307 * pairing or if the remote is not requesting bonding.
4308 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004309 if (hci_dev_test_flag(hdev, HCI_BONDABLE) ||
Johan Hedberg2f407f02014-07-17 15:35:40 +03004310 test_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags) ||
Gustavo Padovan807deac2012-05-17 00:36:24 -03004311 (conn->remote_auth & ~0x01) == HCI_AT_NO_BONDING) {
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004312 struct hci_cp_io_capability_reply cp;
4313
4314 bacpy(&cp.bdaddr, &ev->bdaddr);
Hemant Gupta7a7f1e72012-01-16 13:34:29 +05304315 /* Change the IO capability from KeyboardDisplay
4316 * to DisplayYesNo as it is not supported by BT spec. */
4317 cp.capability = (conn->io_capability == 0x04) ?
Mikel Astiza7676312013-06-28 10:56:29 +02004318 HCI_IO_DISPLAY_YESNO : conn->io_capability;
Mikel Astizb7f94c82014-04-08 14:21:31 +02004319
4320 /* If we are initiators, there is no remote information yet */
4321 if (conn->remote_auth == 0xff) {
Mikel Astizb16c6602014-04-08 14:21:34 +02004322 /* Request MITM protection if our IO caps allow it
Johan Hedberg4ad51a72014-06-09 14:41:25 +03004323 * except for the no-bonding case.
Mikel Astizb16c6602014-04-08 14:21:34 +02004324 */
Mikel Astiz6fd6b912014-04-08 14:21:32 +02004325 if (conn->io_capability != HCI_IO_NO_INPUT_OUTPUT &&
Johan Hedberg9f743d72014-07-17 11:56:33 +03004326 conn->auth_type != HCI_AT_NO_BONDING)
Johan Hedberg6c538232014-07-11 15:32:23 +03004327 conn->auth_type |= 0x01;
Mikel Astizb7f94c82014-04-08 14:21:31 +02004328 } else {
4329 conn->auth_type = hci_get_auth_req(conn);
Mikel Astizb7f94c82014-04-08 14:21:31 +02004330 }
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004331
Johan Hedberg82c295b2014-07-30 09:22:24 +03004332 /* If we're not bondable, force one of the non-bondable
4333 * authentication requirement values.
4334 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004335 if (!hci_dev_test_flag(hdev, HCI_BONDABLE))
Johan Hedberg82c295b2014-07-30 09:22:24 +03004336 conn->auth_type &= HCI_AT_NO_BONDING_MITM;
4337
4338 cp.authentication = conn->auth_type;
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08004339 cp.oob_data = bredr_oob_data_present(conn);
Szymon Jancce85ee12011-03-22 13:12:23 +01004340
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004341 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03004342 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02004343 } else {
4344 struct hci_cp_io_capability_neg_reply cp;
4345
4346 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02004347 cp.reason = HCI_ERROR_PAIRING_NOT_ALLOWED;
Johan Hedberg03b555e2011-01-04 15:40:05 +02004348
4349 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03004350 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02004351 }
4352
4353unlock:
4354 hci_dev_unlock(hdev);
4355}
4356
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004357static void hci_io_capa_reply_evt(struct hci_dev *hdev, struct sk_buff *skb)
Johan Hedberg03b555e2011-01-04 15:40:05 +02004358{
4359 struct hci_ev_io_capa_reply *ev = (void *) skb->data;
4360 struct hci_conn *conn;
4361
4362 BT_DBG("%s", hdev->name);
4363
4364 hci_dev_lock(hdev);
4365
4366 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4367 if (!conn)
4368 goto unlock;
4369
Johan Hedberg03b555e2011-01-04 15:40:05 +02004370 conn->remote_cap = ev->capability;
Johan Hedberg03b555e2011-01-04 15:40:05 +02004371 conn->remote_auth = ev->authentication;
4372
4373unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02004374 hci_dev_unlock(hdev);
4375}
4376
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004377static void hci_user_confirm_request_evt(struct hci_dev *hdev,
4378 struct sk_buff *skb)
Johan Hedberga5c29682011-02-19 12:05:57 -03004379{
4380 struct hci_ev_user_confirm_req *ev = (void *) skb->data;
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004381 int loc_mitm, rem_mitm, confirm_hint = 0;
Johan Hedberg7a828902011-04-28 11:28:53 -07004382 struct hci_conn *conn;
Johan Hedberga5c29682011-02-19 12:05:57 -03004383
4384 BT_DBG("%s", hdev->name);
4385
4386 hci_dev_lock(hdev);
4387
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004388 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg7a828902011-04-28 11:28:53 -07004389 goto unlock;
Johan Hedberga5c29682011-02-19 12:05:57 -03004390
Johan Hedberg7a828902011-04-28 11:28:53 -07004391 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4392 if (!conn)
4393 goto unlock;
4394
4395 loc_mitm = (conn->auth_type & 0x01);
4396 rem_mitm = (conn->remote_auth & 0x01);
4397
4398 /* If we require MITM but the remote device can't provide that
Johan Hedberg6c538232014-07-11 15:32:23 +03004399 * (it has NoInputNoOutput) then reject the confirmation
4400 * request. We check the security level here since it doesn't
4401 * necessarily match conn->auth_type.
Mikel Astiz6fd6b912014-04-08 14:21:32 +02004402 */
Johan Hedberg6c538232014-07-11 15:32:23 +03004403 if (conn->pending_sec_level > BT_SECURITY_MEDIUM &&
4404 conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) {
Johan Hedberg7a828902011-04-28 11:28:53 -07004405 BT_DBG("Rejecting request: remote device can't provide MITM");
4406 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03004407 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07004408 goto unlock;
4409 }
4410
4411 /* If no side requires MITM protection; auto-accept */
Mikel Astiza7676312013-06-28 10:56:29 +02004412 if ((!loc_mitm || conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) &&
4413 (!rem_mitm || conn->io_capability == HCI_IO_NO_INPUT_OUTPUT)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004414
4415 /* If we're not the initiators request authorization to
4416 * proceed from user space (mgmt_user_confirm with
Johan Hedbergba15a582014-06-09 13:58:14 +03004417 * confirm_hint set to 1). The exception is if neither
Johan Hedberg02f3e252014-07-16 15:09:13 +03004418 * side had MITM or if the local IO capability is
4419 * NoInputNoOutput, in which case we do auto-accept
Johan Hedbergba15a582014-06-09 13:58:14 +03004420 */
4421 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) &&
Johan Hedberg02f3e252014-07-16 15:09:13 +03004422 conn->io_capability != HCI_IO_NO_INPUT_OUTPUT &&
Johan Hedbergba15a582014-06-09 13:58:14 +03004423 (loc_mitm || rem_mitm)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004424 BT_DBG("Confirming auto-accept as acceptor");
4425 confirm_hint = 1;
4426 goto confirm;
4427 }
4428
Johan Hedberg9f616562011-04-28 11:28:54 -07004429 BT_DBG("Auto-accept of user confirmation with %ums delay",
Gustavo Padovan807deac2012-05-17 00:36:24 -03004430 hdev->auto_accept_delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07004431
4432 if (hdev->auto_accept_delay > 0) {
4433 int delay = msecs_to_jiffies(hdev->auto_accept_delay);
Johan Hedberg7bc18d92013-10-16 18:11:39 +03004434 queue_delayed_work(conn->hdev->workqueue,
4435 &conn->auto_accept_work, delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07004436 goto unlock;
4437 }
4438
Johan Hedberg7a828902011-04-28 11:28:53 -07004439 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03004440 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07004441 goto unlock;
4442 }
4443
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004444confirm:
Johan Hedberg39adbff2014-03-20 08:18:14 +02004445 mgmt_user_confirm_request(hdev, &ev->bdaddr, ACL_LINK, 0,
4446 le32_to_cpu(ev->passkey), confirm_hint);
Johan Hedberg7a828902011-04-28 11:28:53 -07004447
4448unlock:
Johan Hedberga5c29682011-02-19 12:05:57 -03004449 hci_dev_unlock(hdev);
4450}
4451
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004452static void hci_user_passkey_request_evt(struct hci_dev *hdev,
4453 struct sk_buff *skb)
Brian Gix1143d452011-11-23 08:28:34 -08004454{
4455 struct hci_ev_user_passkey_req *ev = (void *) skb->data;
4456
4457 BT_DBG("%s", hdev->name);
4458
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004459 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg272d90d2012-02-09 15:26:12 +02004460 mgmt_user_passkey_request(hdev, &ev->bdaddr, ACL_LINK, 0);
Brian Gix1143d452011-11-23 08:28:34 -08004461}
4462
Johan Hedberg92a25252012-09-06 18:39:26 +03004463static void hci_user_passkey_notify_evt(struct hci_dev *hdev,
4464 struct sk_buff *skb)
4465{
4466 struct hci_ev_user_passkey_notify *ev = (void *) skb->data;
4467 struct hci_conn *conn;
4468
4469 BT_DBG("%s", hdev->name);
4470
4471 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4472 if (!conn)
4473 return;
4474
4475 conn->passkey_notify = __le32_to_cpu(ev->passkey);
4476 conn->passkey_entered = 0;
4477
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004478 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg92a25252012-09-06 18:39:26 +03004479 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
4480 conn->dst_type, conn->passkey_notify,
4481 conn->passkey_entered);
4482}
4483
4484static void hci_keypress_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
4485{
4486 struct hci_ev_keypress_notify *ev = (void *) skb->data;
4487 struct hci_conn *conn;
4488
4489 BT_DBG("%s", hdev->name);
4490
4491 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4492 if (!conn)
4493 return;
4494
4495 switch (ev->type) {
4496 case HCI_KEYPRESS_STARTED:
4497 conn->passkey_entered = 0;
4498 return;
4499
4500 case HCI_KEYPRESS_ENTERED:
4501 conn->passkey_entered++;
4502 break;
4503
4504 case HCI_KEYPRESS_ERASED:
4505 conn->passkey_entered--;
4506 break;
4507
4508 case HCI_KEYPRESS_CLEARED:
4509 conn->passkey_entered = 0;
4510 break;
4511
4512 case HCI_KEYPRESS_COMPLETED:
4513 return;
4514 }
4515
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004516 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg92a25252012-09-06 18:39:26 +03004517 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
4518 conn->dst_type, conn->passkey_notify,
4519 conn->passkey_entered);
4520}
4521
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004522static void hci_simple_pair_complete_evt(struct hci_dev *hdev,
4523 struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02004524{
4525 struct hci_ev_simple_pair_complete *ev = (void *) skb->data;
4526 struct hci_conn *conn;
4527
4528 BT_DBG("%s", hdev->name);
4529
4530 hci_dev_lock(hdev);
4531
4532 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg2a611692011-02-19 12:06:00 -03004533 if (!conn)
4534 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02004535
Johan Hedbergc1d4fa72014-07-17 15:14:50 +03004536 /* Reset the authentication requirement to unknown */
4537 conn->remote_auth = 0xff;
4538
Johan Hedberg2a611692011-02-19 12:06:00 -03004539 /* To avoid duplicate auth_failed events to user space we check
4540 * the HCI_CONN_AUTH_PEND flag which will be set if we
4541 * initiated the authentication. A traditional auth_complete
4542 * event gets always produced as initiator and is also mapped to
4543 * the mgmt_auth_failed event */
Mikel Astizfa1bd912012-08-09 09:52:29 +02004544 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) && ev->status)
Johan Hedberge1e930f2014-09-08 17:09:49 -07004545 mgmt_auth_failed(conn, ev->status);
Johan Hedberg2a611692011-02-19 12:06:00 -03004546
David Herrmann76a68ba2013-04-06 20:28:37 +02004547 hci_conn_drop(conn);
Johan Hedberg2a611692011-02-19 12:06:00 -03004548
4549unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02004550 hci_dev_unlock(hdev);
4551}
4552
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004553static void hci_remote_host_features_evt(struct hci_dev *hdev,
4554 struct sk_buff *skb)
Marcel Holtmann41a96212008-07-14 20:13:48 +02004555{
4556 struct hci_ev_remote_host_features *ev = (void *) skb->data;
4557 struct inquiry_entry *ie;
Johan Hedbergcad718e2013-04-17 15:00:51 +03004558 struct hci_conn *conn;
Marcel Holtmann41a96212008-07-14 20:13:48 +02004559
4560 BT_DBG("%s", hdev->name);
4561
4562 hci_dev_lock(hdev);
4563
Johan Hedbergcad718e2013-04-17 15:00:51 +03004564 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4565 if (conn)
4566 memcpy(conn->features[1], ev->features, 8);
4567
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02004568 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
4569 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02004570 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann41a96212008-07-14 20:13:48 +02004571
4572 hci_dev_unlock(hdev);
4573}
4574
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004575static void hci_remote_oob_data_request_evt(struct hci_dev *hdev,
4576 struct sk_buff *skb)
Szymon Janc2763eda2011-03-22 13:12:22 +01004577{
4578 struct hci_ev_remote_oob_data_request *ev = (void *) skb->data;
4579 struct oob_data *data;
4580
4581 BT_DBG("%s", hdev->name);
4582
4583 hci_dev_lock(hdev);
4584
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004585 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Szymon Jance1ba1f12011-04-06 13:01:59 +02004586 goto unlock;
4587
Johan Hedberg6928a922014-10-26 20:46:09 +01004588 data = hci_find_remote_oob_data(hdev, &ev->bdaddr, BDADDR_BREDR);
Marcel Holtmann6665d052015-01-27 16:04:31 -08004589 if (!data) {
Szymon Janc2763eda2011-03-22 13:12:22 +01004590 struct hci_cp_remote_oob_data_neg_reply cp;
4591
4592 bacpy(&cp.bdaddr, &ev->bdaddr);
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08004593 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_NEG_REPLY,
4594 sizeof(cp), &cp);
Marcel Holtmann6665d052015-01-27 16:04:31 -08004595 goto unlock;
4596 }
4597
4598 if (bredr_sc_enabled(hdev)) {
4599 struct hci_cp_remote_oob_ext_data_reply cp;
4600
4601 bacpy(&cp.bdaddr, &ev->bdaddr);
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004602 if (hci_dev_test_flag(hdev, HCI_SC_ONLY)) {
Marcel Holtmann6665d052015-01-27 16:04:31 -08004603 memset(cp.hash192, 0, sizeof(cp.hash192));
4604 memset(cp.rand192, 0, sizeof(cp.rand192));
4605 } else {
4606 memcpy(cp.hash192, data->hash192, sizeof(cp.hash192));
4607 memcpy(cp.rand192, data->rand192, sizeof(cp.rand192));
4608 }
4609 memcpy(cp.hash256, data->hash256, sizeof(cp.hash256));
4610 memcpy(cp.rand256, data->rand256, sizeof(cp.rand256));
4611
4612 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_EXT_DATA_REPLY,
4613 sizeof(cp), &cp);
4614 } else {
4615 struct hci_cp_remote_oob_data_reply cp;
4616
4617 bacpy(&cp.bdaddr, &ev->bdaddr);
4618 memcpy(cp.hash, data->hash192, sizeof(cp.hash));
4619 memcpy(cp.rand, data->rand192, sizeof(cp.rand));
4620
4621 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_REPLY,
4622 sizeof(cp), &cp);
Szymon Janc2763eda2011-03-22 13:12:22 +01004623 }
4624
Szymon Jance1ba1f12011-04-06 13:01:59 +02004625unlock:
Szymon Janc2763eda2011-03-22 13:12:22 +01004626 hci_dev_unlock(hdev);
4627}
4628
Arron Wanga77a6a12015-07-24 17:13:15 +08004629#if IS_ENABLED(CONFIG_BT_HS)
4630static void hci_chan_selected_evt(struct hci_dev *hdev, struct sk_buff *skb)
4631{
4632 struct hci_ev_channel_selected *ev = (void *)skb->data;
4633 struct hci_conn *hcon;
4634
4635 BT_DBG("%s handle 0x%2.2x", hdev->name, ev->phy_handle);
4636
4637 skb_pull(skb, sizeof(*ev));
4638
4639 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4640 if (!hcon)
4641 return;
4642
4643 amp_read_loc_assoc_final_data(hdev, hcon);
4644}
4645
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004646static void hci_phy_link_complete_evt(struct hci_dev *hdev,
4647 struct sk_buff *skb)
4648{
4649 struct hci_ev_phy_link_complete *ev = (void *) skb->data;
4650 struct hci_conn *hcon, *bredr_hcon;
4651
4652 BT_DBG("%s handle 0x%2.2x status 0x%2.2x", hdev->name, ev->phy_handle,
4653 ev->status);
4654
4655 hci_dev_lock(hdev);
4656
4657 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4658 if (!hcon) {
4659 hci_dev_unlock(hdev);
4660 return;
4661 }
4662
4663 if (ev->status) {
4664 hci_conn_del(hcon);
4665 hci_dev_unlock(hdev);
4666 return;
4667 }
4668
4669 bredr_hcon = hcon->amp_mgr->l2cap_conn->hcon;
4670
4671 hcon->state = BT_CONNECTED;
4672 bacpy(&hcon->dst, &bredr_hcon->dst);
4673
4674 hci_conn_hold(hcon);
4675 hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02004676 hci_conn_drop(hcon);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004677
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01004678 hci_debugfs_create_conn(hcon);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004679 hci_conn_add_sysfs(hcon);
4680
Andrei Emeltchenkocf70ff22012-10-31 15:46:36 +02004681 amp_physical_cfm(bredr_hcon, hcon);
4682
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004683 hci_dev_unlock(hdev);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004684}
4685
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004686static void hci_loglink_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
4687{
4688 struct hci_ev_logical_link_complete *ev = (void *) skb->data;
4689 struct hci_conn *hcon;
4690 struct hci_chan *hchan;
4691 struct amp_mgr *mgr;
4692
4693 BT_DBG("%s log_handle 0x%4.4x phy_handle 0x%2.2x status 0x%2.2x",
4694 hdev->name, le16_to_cpu(ev->handle), ev->phy_handle,
4695 ev->status);
4696
4697 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4698 if (!hcon)
4699 return;
4700
4701 /* Create AMP hchan */
4702 hchan = hci_chan_create(hcon);
4703 if (!hchan)
4704 return;
4705
4706 hchan->handle = le16_to_cpu(ev->handle);
4707
4708 BT_DBG("hcon %p mgr %p hchan %p", hcon, hcon->amp_mgr, hchan);
4709
4710 mgr = hcon->amp_mgr;
4711 if (mgr && mgr->bredr_chan) {
4712 struct l2cap_chan *bredr_chan = mgr->bredr_chan;
4713
4714 l2cap_chan_lock(bredr_chan);
4715
4716 bredr_chan->conn->mtu = hdev->block_mtu;
4717 l2cap_logical_cfm(bredr_chan, hchan, 0);
4718 hci_conn_hold(hcon);
4719
4720 l2cap_chan_unlock(bredr_chan);
4721 }
4722}
4723
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02004724static void hci_disconn_loglink_complete_evt(struct hci_dev *hdev,
4725 struct sk_buff *skb)
4726{
4727 struct hci_ev_disconn_logical_link_complete *ev = (void *) skb->data;
4728 struct hci_chan *hchan;
4729
4730 BT_DBG("%s log handle 0x%4.4x status 0x%2.2x", hdev->name,
4731 le16_to_cpu(ev->handle), ev->status);
4732
4733 if (ev->status)
4734 return;
4735
4736 hci_dev_lock(hdev);
4737
4738 hchan = hci_chan_lookup_handle(hdev, le16_to_cpu(ev->handle));
4739 if (!hchan)
4740 goto unlock;
4741
4742 amp_destroy_logical_link(hchan, ev->reason);
4743
4744unlock:
4745 hci_dev_unlock(hdev);
4746}
4747
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02004748static void hci_disconn_phylink_complete_evt(struct hci_dev *hdev,
4749 struct sk_buff *skb)
4750{
4751 struct hci_ev_disconn_phy_link_complete *ev = (void *) skb->data;
4752 struct hci_conn *hcon;
4753
4754 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4755
4756 if (ev->status)
4757 return;
4758
4759 hci_dev_lock(hdev);
4760
4761 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4762 if (hcon) {
4763 hcon->state = BT_CLOSED;
4764 hci_conn_del(hcon);
4765 }
4766
4767 hci_dev_unlock(hdev);
4768}
Arron Wanga77a6a12015-07-24 17:13:15 +08004769#endif
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02004770
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304771static void le_conn_complete_evt(struct hci_dev *hdev, u8 status,
4772 bdaddr_t *bdaddr, u8 bdaddr_type, u8 role, u16 handle,
4773 u16 interval, u16 latency, u16 supervision_timeout)
Ville Tervofcd89c02011-02-10 22:38:47 -03004774{
Johan Hedberg912b42ef2014-07-03 19:33:49 +03004775 struct hci_conn_params *params;
Ville Tervofcd89c02011-02-10 22:38:47 -03004776 struct hci_conn *conn;
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004777 struct smp_irk *irk;
Johan Hedberg837d5022014-07-02 09:36:22 +03004778 u8 addr_type;
Ville Tervofcd89c02011-02-10 22:38:47 -03004779
Ville Tervofcd89c02011-02-10 22:38:47 -03004780 hci_dev_lock(hdev);
4781
Johan Hedbergfbd96c12014-07-08 17:21:51 +03004782 /* All controllers implicitly stop advertising in the event of a
4783 * connection, so ensure that the state bit is cleared.
4784 */
Marcel Holtmanna358dc12015-03-13 02:11:02 -07004785 hci_dev_clear_flag(hdev, HCI_LE_ADV);
Johan Hedbergfbd96c12014-07-08 17:21:51 +03004786
Jakub Pawlowskie7d9ab72015-08-07 20:22:52 +02004787 conn = hci_lookup_le_connect(hdev);
Ville Tervob62f3282011-02-10 22:38:50 -03004788 if (!conn) {
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304789 conn = hci_conn_add(hdev, LE_LINK, bdaddr, role);
Ville Tervob62f3282011-02-10 22:38:50 -03004790 if (!conn) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01004791 bt_dev_err(hdev, "no memory for new connection");
Andre Guedes230fd162012-07-27 15:10:10 -03004792 goto unlock;
Ville Tervob62f3282011-02-10 22:38:50 -03004793 }
Andre Guedes29b79882011-05-31 14:20:54 -03004794
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304795 conn->dst_type = bdaddr_type;
Andre Guedesb9b343d2012-07-27 15:10:11 -03004796
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004797 /* If we didn't have a hci_conn object previously
4798 * but we're in master role this must be something
4799 * initiated using a white list. Since white list based
4800 * connections are not "first class citizens" we don't
4801 * have full tracking of them. Therefore, we go ahead
4802 * with a "best effort" approach of determining the
4803 * initiator address based on the HCI_PRIVACY flag.
4804 */
4805 if (conn->out) {
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304806 conn->resp_addr_type = bdaddr_type;
4807 bacpy(&conn->resp_addr, bdaddr);
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004808 if (hci_dev_test_flag(hdev, HCI_PRIVACY)) {
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004809 conn->init_addr_type = ADDR_LE_DEV_RANDOM;
4810 bacpy(&conn->init_addr, &hdev->rpa);
4811 } else {
4812 hci_copy_identity_address(hdev,
4813 &conn->init_addr,
4814 &conn->init_addr_type);
4815 }
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004816 }
Johan Hedberg9489eca2014-02-28 17:45:46 +02004817 } else {
4818 cancel_delayed_work(&conn->le_conn_timeout);
Ville Tervob62f3282011-02-10 22:38:50 -03004819 }
Ville Tervofcd89c02011-02-10 22:38:47 -03004820
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004821 if (!conn->out) {
4822 /* Set the responder (our side) address type based on
4823 * the advertising address type.
4824 */
4825 conn->resp_addr_type = hdev->adv_addr_type;
Jaganath Kanakkasseryacf0aea2018-07-19 17:09:46 +05304826 if (hdev->adv_addr_type == ADDR_LE_DEV_RANDOM) {
4827 /* In case of ext adv, resp_addr will be updated in
4828 * Adv Terminated event.
4829 */
4830 if (!ext_adv_capable(hdev))
4831 bacpy(&conn->resp_addr, &hdev->random_addr);
4832 } else {
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004833 bacpy(&conn->resp_addr, &hdev->bdaddr);
Jaganath Kanakkasseryacf0aea2018-07-19 17:09:46 +05304834 }
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004835
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304836 conn->init_addr_type = bdaddr_type;
4837 bacpy(&conn->init_addr, bdaddr);
Marcel Holtmanna720d732014-06-23 12:14:51 +02004838
4839 /* For incoming connections, set the default minimum
4840 * and maximum connection interval. They will be used
4841 * to check if the parameters are in range and if not
4842 * trigger the connection update procedure.
4843 */
4844 conn->le_conn_min_interval = hdev->le_conn_min_interval;
4845 conn->le_conn_max_interval = hdev->le_conn_max_interval;
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004846 }
Johan Hedberg7be2edb2014-02-23 19:42:17 +02004847
Marcel Holtmannedb4b462014-02-18 15:13:43 -08004848 /* Lookup the identity address from the stored connection
4849 * address and address type.
4850 *
4851 * When establishing connections to an identity address, the
4852 * connection procedure will store the resolvable random
4853 * address first. Now if it can be converted back into the
4854 * identity address, start using the identity address from
4855 * now on.
4856 */
4857 irk = hci_get_irk(hdev, &conn->dst, conn->dst_type);
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004858 if (irk) {
4859 bacpy(&conn->dst, &irk->bdaddr);
4860 conn->dst_type = irk->addr_type;
4861 }
4862
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304863 if (status) {
4864 hci_le_conn_failed(conn, status);
Johan Hedberg837d5022014-07-02 09:36:22 +03004865 goto unlock;
4866 }
4867
Johan Hedberg08853f12014-08-15 21:06:55 +03004868 if (conn->dst_type == ADDR_LE_DEV_PUBLIC)
4869 addr_type = BDADDR_LE_PUBLIC;
4870 else
4871 addr_type = BDADDR_LE_RANDOM;
4872
Johan Hedberg2d3c2262014-07-15 11:51:28 +03004873 /* Drop the connection if the device is blocked */
4874 if (hci_bdaddr_list_lookup(&hdev->blacklist, &conn->dst, addr_type)) {
4875 hci_conn_drop(conn);
Andre Guedescd17dec2012-07-27 15:10:16 -03004876 goto unlock;
4877 }
4878
Johan Hedbergb644ba32012-01-17 21:48:47 +02004879 if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00004880 mgmt_device_connected(hdev, conn, 0, NULL, 0);
Vinicius Costa Gomes83bc71b2011-05-06 18:41:43 -03004881
Vinicius Costa Gomes7b5c0d52011-06-09 18:50:50 -03004882 conn->sec_level = BT_SECURITY_LOW;
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304883 conn->handle = handle;
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07004884 conn->state = BT_CONFIG;
Ville Tervofcd89c02011-02-10 22:38:47 -03004885
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304886 conn->le_conn_interval = interval;
4887 conn->le_conn_latency = latency;
4888 conn->le_supv_timeout = supervision_timeout;
Marcel Holtmanne04fde62014-06-23 11:40:04 +02004889
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01004890 hci_debugfs_create_conn(conn);
Ville Tervofcd89c02011-02-10 22:38:47 -03004891 hci_conn_add_sysfs(conn);
4892
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304893 if (!status) {
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07004894 /* The remote features procedure is defined for master
4895 * role only. So only in case of an initiated connection
4896 * request the remote features.
4897 *
4898 * If the local controller supports slave-initiated features
4899 * exchange, then requesting the remote features in slave
4900 * role is possible. Otherwise just transition into the
4901 * connected state without requesting the remote features.
4902 */
4903 if (conn->out ||
4904 (hdev->le_features[0] & HCI_LE_SLAVE_FEATURES)) {
4905 struct hci_cp_le_read_remote_features cp;
4906
4907 cp.handle = __cpu_to_le16(conn->handle);
4908
4909 hci_send_cmd(hdev, HCI_OP_LE_READ_REMOTE_FEATURES,
4910 sizeof(cp), &cp);
4911
4912 hci_conn_hold(conn);
4913 } else {
4914 conn->state = BT_CONNECTED;
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304915 hci_connect_cfm(conn, status);
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07004916 }
4917 } else {
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304918 hci_connect_cfm(conn, status);
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07004919 }
Ville Tervofcd89c02011-02-10 22:38:47 -03004920
Johan Hedberg54776102014-08-15 21:06:56 +03004921 params = hci_pend_le_action_lookup(&hdev->pend_le_conns, &conn->dst,
4922 conn->dst_type);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004923 if (params) {
Johan Hedberg95305ba2014-07-04 12:37:21 +03004924 list_del_init(&params->action);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004925 if (params->conn) {
4926 hci_conn_drop(params->conn);
Johan Hedbergf8aaf9b2014-08-17 23:28:57 +03004927 hci_conn_put(params->conn);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004928 params->conn = NULL;
4929 }
4930 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004931
Ville Tervofcd89c02011-02-10 22:38:47 -03004932unlock:
Johan Hedberg223683a2014-07-06 15:44:23 +03004933 hci_update_background_scan(hdev);
Ville Tervofcd89c02011-02-10 22:38:47 -03004934 hci_dev_unlock(hdev);
4935}
4936
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304937static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
4938{
4939 struct hci_ev_le_conn_complete *ev = (void *) skb->data;
4940
4941 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4942
4943 le_conn_complete_evt(hdev, ev->status, &ev->bdaddr, ev->bdaddr_type,
4944 ev->role, le16_to_cpu(ev->handle),
4945 le16_to_cpu(ev->interval),
4946 le16_to_cpu(ev->latency),
4947 le16_to_cpu(ev->supervision_timeout));
4948}
4949
Jaganath Kanakkassery4d94f952018-07-06 22:50:32 +02004950static void hci_le_enh_conn_complete_evt(struct hci_dev *hdev,
4951 struct sk_buff *skb)
4952{
4953 struct hci_ev_le_enh_conn_complete *ev = (void *) skb->data;
4954
4955 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4956
4957 le_conn_complete_evt(hdev, ev->status, &ev->bdaddr, ev->bdaddr_type,
4958 ev->role, le16_to_cpu(ev->handle),
4959 le16_to_cpu(ev->interval),
4960 le16_to_cpu(ev->latency),
4961 le16_to_cpu(ev->supervision_timeout));
4962}
4963
Jaganath Kanakkasseryacf0aea2018-07-19 17:09:46 +05304964static void hci_le_ext_adv_term_evt(struct hci_dev *hdev, struct sk_buff *skb)
4965{
4966 struct hci_evt_le_ext_adv_set_term *ev = (void *) skb->data;
4967 struct hci_conn *conn;
4968
4969 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4970
4971 if (ev->status)
4972 return;
4973
4974 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->conn_handle));
4975 if (conn) {
4976 struct adv_info *adv_instance;
4977
4978 if (hdev->adv_addr_type != ADDR_LE_DEV_RANDOM)
4979 return;
4980
4981 if (!hdev->cur_adv_instance) {
4982 bacpy(&conn->resp_addr, &hdev->random_addr);
4983 return;
4984 }
4985
4986 adv_instance = hci_find_adv_instance(hdev, hdev->cur_adv_instance);
4987 if (adv_instance)
4988 bacpy(&conn->resp_addr, &adv_instance->random_addr);
4989 }
4990}
4991
Marcel Holtmann1855d922014-06-23 11:40:05 +02004992static void hci_le_conn_update_complete_evt(struct hci_dev *hdev,
4993 struct sk_buff *skb)
4994{
4995 struct hci_ev_le_conn_update_complete *ev = (void *) skb->data;
4996 struct hci_conn *conn;
4997
4998 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4999
5000 if (ev->status)
5001 return;
5002
5003 hci_dev_lock(hdev);
5004
5005 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
5006 if (conn) {
5007 conn->le_conn_interval = le16_to_cpu(ev->interval);
5008 conn->le_conn_latency = le16_to_cpu(ev->latency);
5009 conn->le_supv_timeout = le16_to_cpu(ev->supervision_timeout);
5010 }
5011
5012 hci_dev_unlock(hdev);
5013}
5014
Andre Guedesa4790db2014-02-26 20:21:47 -03005015/* This function requires the caller holds hdev->lock */
Alfonso Acostafd45ada2014-10-07 08:44:11 +00005016static struct hci_conn *check_pending_le_conn(struct hci_dev *hdev,
5017 bdaddr_t *addr,
Szymon Janc082f2302018-04-03 13:40:06 +02005018 u8 addr_type, u8 adv_type,
5019 bdaddr_t *direct_rpa)
Andre Guedesa4790db2014-02-26 20:21:47 -03005020{
5021 struct hci_conn *conn;
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02005022 struct hci_conn_params *params;
Andre Guedesa4790db2014-02-26 20:21:47 -03005023
Johan Hedberg1c1abca2014-07-07 12:45:53 +03005024 /* If the event is not connectable don't proceed further */
5025 if (adv_type != LE_ADV_IND && adv_type != LE_ADV_DIRECT_IND)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00005026 return NULL;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03005027
5028 /* Ignore if the device is blocked */
Johan Hedbergdcc36c12014-07-09 12:59:13 +03005029 if (hci_bdaddr_list_lookup(&hdev->blacklist, addr, addr_type))
Alfonso Acostafd45ada2014-10-07 08:44:11 +00005030 return NULL;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03005031
Johan Hedbergf99353c2014-07-16 11:56:09 +03005032 /* Most controller will fail if we try to create new connections
5033 * while we have an existing one in slave role.
5034 */
5035 if (hdev->conn_hash.le_num_slave > 0)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00005036 return NULL;
Johan Hedbergf99353c2014-07-16 11:56:09 +03005037
Johan Hedberg1c1abca2014-07-07 12:45:53 +03005038 /* If we're not connectable only connect devices that we have in
5039 * our pend_le_conns list.
5040 */
Johan Hedberg49c50922015-10-16 10:07:51 +03005041 params = hci_pend_le_action_lookup(&hdev->pend_le_conns, addr,
5042 addr_type);
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02005043 if (!params)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00005044 return NULL;
Andre Guedesa4790db2014-02-26 20:21:47 -03005045
Jakub Pawlowski28a667c2015-08-07 20:22:54 +02005046 if (!params->explicit_connect) {
5047 switch (params->auto_connect) {
5048 case HCI_AUTO_CONN_DIRECT:
5049 /* Only devices advertising with ADV_DIRECT_IND are
5050 * triggering a connection attempt. This is allowing
5051 * incoming connections from slave devices.
5052 */
5053 if (adv_type != LE_ADV_DIRECT_IND)
5054 return NULL;
5055 break;
5056 case HCI_AUTO_CONN_ALWAYS:
5057 /* Devices advertising with ADV_IND or ADV_DIRECT_IND
5058 * are triggering a connection attempt. This means
5059 * that incoming connectioms from slave device are
5060 * accepted and also outgoing connections to slave
5061 * devices are established when found.
5062 */
5063 break;
5064 default:
Alfonso Acostafd45ada2014-10-07 08:44:11 +00005065 return NULL;
Jakub Pawlowski28a667c2015-08-07 20:22:54 +02005066 }
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02005067 }
5068
Andre Guedesa4790db2014-02-26 20:21:47 -03005069 conn = hci_connect_le(hdev, addr, addr_type, BT_SECURITY_LOW,
Szymon Janc082f2302018-04-03 13:40:06 +02005070 HCI_LE_AUTOCONN_TIMEOUT, HCI_ROLE_MASTER,
5071 direct_rpa);
Johan Hedbergf161dd42014-08-15 21:06:54 +03005072 if (!IS_ERR(conn)) {
Jakub Pawlowski28a667c2015-08-07 20:22:54 +02005073 /* If HCI_AUTO_CONN_EXPLICIT is set, conn is already owned
5074 * by higher layer that tried to connect, if no then
5075 * store the pointer since we don't really have any
Johan Hedbergf161dd42014-08-15 21:06:54 +03005076 * other owner of the object besides the params that
5077 * triggered it. This way we can abort the connection if
5078 * the parameters get removed and keep the reference
5079 * count consistent once the connection is established.
5080 */
Jakub Pawlowski28a667c2015-08-07 20:22:54 +02005081
5082 if (!params->explicit_connect)
5083 params->conn = hci_conn_get(conn);
5084
Alfonso Acostafd45ada2014-10-07 08:44:11 +00005085 return conn;
Johan Hedbergf161dd42014-08-15 21:06:54 +03005086 }
Andre Guedesa4790db2014-02-26 20:21:47 -03005087
5088 switch (PTR_ERR(conn)) {
5089 case -EBUSY:
5090 /* If hci_connect() returns -EBUSY it means there is already
5091 * an LE connection attempt going on. Since controllers don't
5092 * support more than one connection attempt at the time, we
5093 * don't consider this an error case.
5094 */
5095 break;
5096 default:
5097 BT_DBG("Failed to connect: err %ld", PTR_ERR(conn));
Alfonso Acostafd45ada2014-10-07 08:44:11 +00005098 return NULL;
Andre Guedesa4790db2014-02-26 20:21:47 -03005099 }
Alfonso Acostafd45ada2014-10-07 08:44:11 +00005100
5101 return NULL;
Andre Guedesa4790db2014-02-26 20:21:47 -03005102}
5103
Johan Hedberg4af605d2014-03-24 10:48:00 +02005104static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr,
Marcel Holtmann2f010b52014-12-05 16:20:13 +01005105 u8 bdaddr_type, bdaddr_t *direct_addr,
5106 u8 direct_addr_type, s8 rssi, u8 *data, u8 len)
Johan Hedberg4af605d2014-03-24 10:48:00 +02005107{
Johan Hedbergb9a63282014-03-25 10:51:52 +02005108 struct discovery_state *d = &hdev->discovery;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03005109 struct smp_irk *irk;
Alfonso Acostafd45ada2014-10-07 08:44:11 +00005110 struct hci_conn *conn;
Johan Hedberg474ee062014-03-25 14:34:59 +02005111 bool match;
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02005112 u32 flags;
Szymon Janc68183752015-09-16 20:21:54 +02005113 u8 *ptr, real_len;
5114
Johan Hedberg56b40fb2016-04-07 21:01:27 +03005115 switch (type) {
5116 case LE_ADV_IND:
5117 case LE_ADV_DIRECT_IND:
5118 case LE_ADV_SCAN_IND:
5119 case LE_ADV_NONCONN_IND:
5120 case LE_ADV_SCAN_RSP:
5121 break;
5122 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01005123 bt_dev_err_ratelimited(hdev, "unknown advertising packet "
5124 "type: 0x%02x", type);
Johan Hedberg56b40fb2016-04-07 21:01:27 +03005125 return;
5126 }
5127
Szymon Janc68183752015-09-16 20:21:54 +02005128 /* Find the end of the data in case the report contains padded zero
5129 * bytes at the end causing an invalid length value.
5130 *
5131 * When data is NULL, len is 0 so there is no need for extra ptr
5132 * check as 'ptr < data + 0' is already false in such case.
5133 */
5134 for (ptr = data; ptr < data + len && *ptr; ptr += *ptr + 1) {
5135 if (ptr + 1 + *ptr > data + len)
5136 break;
5137 }
5138
5139 real_len = ptr - data;
5140
5141 /* Adjust for actual length */
5142 if (len != real_len) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01005143 bt_dev_err_ratelimited(hdev, "advertising data len corrected");
Szymon Janc68183752015-09-16 20:21:54 +02005144 len = real_len;
5145 }
Johan Hedbergb9a63282014-03-25 10:51:52 +02005146
Marcel Holtmann2f010b52014-12-05 16:20:13 +01005147 /* If the direct address is present, then this report is from
5148 * a LE Direct Advertising Report event. In that case it is
5149 * important to see if the address is matching the local
5150 * controller address.
5151 */
5152 if (direct_addr) {
5153 /* Only resolvable random addresses are valid for these
5154 * kind of reports and others can be ignored.
5155 */
5156 if (!hci_bdaddr_is_rpa(direct_addr, direct_addr_type))
5157 return;
5158
5159 /* If the controller is not using resolvable random
5160 * addresses, then this report can be ignored.
5161 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07005162 if (!hci_dev_test_flag(hdev, HCI_PRIVACY))
Marcel Holtmann2f010b52014-12-05 16:20:13 +01005163 return;
5164
5165 /* If the local IRK of the controller does not match
5166 * with the resolvable random address provided, then
5167 * this report can be ignored.
5168 */
5169 if (!smp_irk_matches(hdev, hdev->irk, direct_addr))
5170 return;
5171 }
5172
Johan Hedberg1c1abca2014-07-07 12:45:53 +03005173 /* Check if we need to convert to identity address */
5174 irk = hci_get_irk(hdev, bdaddr, bdaddr_type);
5175 if (irk) {
5176 bdaddr = &irk->bdaddr;
5177 bdaddr_type = irk->addr_type;
5178 }
5179
Szymon Janc082f2302018-04-03 13:40:06 +02005180 /* Check if we have been requested to connect to this device.
5181 *
5182 * direct_addr is set only for directed advertising reports (it is NULL
5183 * for advertising reports) and is already verified to be RPA above.
5184 */
5185 conn = check_pending_le_conn(hdev, bdaddr, bdaddr_type, type,
5186 direct_addr);
Alfonso Acostafd45ada2014-10-07 08:44:11 +00005187 if (conn && type == LE_ADV_IND) {
5188 /* Store report for later inclusion by
5189 * mgmt_device_connected
5190 */
5191 memcpy(conn->le_adv_data, data, len);
5192 conn->le_adv_data_len = len;
5193 }
Johan Hedberg1c1abca2014-07-07 12:45:53 +03005194
Johan Hedberg0d2bf132014-07-02 22:42:02 +03005195 /* Passive scanning shouldn't trigger any device found events,
5196 * except for devices marked as CONN_REPORT for which we do send
5197 * device found events.
5198 */
Johan Hedbergca5c4be2014-03-25 10:30:46 +02005199 if (hdev->le_scan_type == LE_SCAN_PASSIVE) {
Johan Hedberg0d2bf132014-07-02 22:42:02 +03005200 if (type == LE_ADV_DIRECT_IND)
5201 return;
5202
Johan Hedberg3a19b6f2014-07-15 08:07:59 +03005203 if (!hci_pend_le_action_lookup(&hdev->pend_le_reports,
5204 bdaddr, bdaddr_type))
Johan Hedberg0d2bf132014-07-02 22:42:02 +03005205 return;
5206
5207 if (type == LE_ADV_NONCONN_IND || type == LE_ADV_SCAN_IND)
5208 flags = MGMT_DEV_FOUND_NOT_CONNECTABLE;
5209 else
5210 flags = 0;
5211 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
5212 rssi, flags, data, len, NULL, 0);
Johan Hedberg97bf2e92014-07-04 12:37:16 +03005213 return;
Johan Hedbergca5c4be2014-03-25 10:30:46 +02005214 }
Johan Hedberg4af605d2014-03-24 10:48:00 +02005215
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02005216 /* When receiving non-connectable or scannable undirected
5217 * advertising reports, this means that the remote device is
5218 * not connectable and then clearly indicate this in the
5219 * device found event.
5220 *
5221 * When receiving a scan response, then there is no way to
5222 * know if the remote device is connectable or not. However
5223 * since scan responses are merged with a previously seen
5224 * advertising report, the flags field from that report
5225 * will be used.
5226 *
5227 * In the really unlikely case that a controller get confused
5228 * and just sends a scan response event, then it is marked as
5229 * not connectable as well.
5230 */
5231 if (type == LE_ADV_NONCONN_IND || type == LE_ADV_SCAN_IND ||
5232 type == LE_ADV_SCAN_RSP)
5233 flags = MGMT_DEV_FOUND_NOT_CONNECTABLE;
5234 else
5235 flags = 0;
5236
Johan Hedbergb9a63282014-03-25 10:51:52 +02005237 /* If there's nothing pending either store the data from this
5238 * event or send an immediate device found event if the data
5239 * should not be stored for later.
5240 */
5241 if (!has_pending_adv_report(hdev)) {
5242 /* If the report will trigger a SCAN_REQ store it for
5243 * later merging.
5244 */
5245 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
5246 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02005247 rssi, flags, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02005248 return;
5249 }
5250
5251 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02005252 rssi, flags, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02005253 return;
5254 }
5255
Johan Hedberg474ee062014-03-25 14:34:59 +02005256 /* Check if the pending report is for the same device as the new one */
5257 match = (!bacmp(bdaddr, &d->last_adv_addr) &&
5258 bdaddr_type == d->last_adv_addr_type);
5259
Johan Hedbergb9a63282014-03-25 10:51:52 +02005260 /* If the pending data doesn't match this report or this isn't a
5261 * scan response (e.g. we got a duplicate ADV_IND) then force
5262 * sending of the pending data.
5263 */
Johan Hedberg474ee062014-03-25 14:34:59 +02005264 if (type != LE_ADV_SCAN_RSP || !match) {
5265 /* Send out whatever is in the cache, but skip duplicates */
5266 if (!match)
5267 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergff5cd292014-03-25 14:40:52 +02005268 d->last_adv_addr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02005269 d->last_adv_rssi, d->last_adv_flags,
Johan Hedbergff5cd292014-03-25 14:40:52 +02005270 d->last_adv_data,
Johan Hedberg474ee062014-03-25 14:34:59 +02005271 d->last_adv_data_len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02005272
5273 /* If the new report will trigger a SCAN_REQ store it for
5274 * later merging.
5275 */
5276 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
5277 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02005278 rssi, flags, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02005279 return;
5280 }
5281
5282 /* The advertising reports cannot be merged, so clear
5283 * the pending report and send out a device found event.
5284 */
5285 clear_pending_adv_report(hdev);
Johan Hedberg5c5b93e2014-03-29 08:39:53 +02005286 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02005287 rssi, flags, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02005288 return;
5289 }
5290
5291 /* If we get here we've got a pending ADV_IND or ADV_SCAN_IND and
5292 * the new event is a SCAN_RSP. We can therefore proceed with
5293 * sending a merged device found event.
5294 */
5295 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02005296 d->last_adv_addr_type, NULL, rssi, d->last_adv_flags,
Marcel Holtmann42bd6a52014-07-01 14:11:19 +02005297 d->last_adv_data, d->last_adv_data_len, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02005298 clear_pending_adv_report(hdev);
Johan Hedberg4af605d2014-03-24 10:48:00 +02005299}
5300
Gustavo Padovan6039aa72012-05-23 04:04:18 -03005301static void hci_le_adv_report_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andre Guedes9aa04c92011-05-26 16:23:51 -03005302{
Andre Guedese95beb42011-09-26 20:48:35 -03005303 u8 num_reports = skb->data[0];
5304 void *ptr = &skb->data[1];
Andre Guedes9aa04c92011-05-26 16:23:51 -03005305
Andre Guedesa4790db2014-02-26 20:21:47 -03005306 hci_dev_lock(hdev);
5307
Andre Guedese95beb42011-09-26 20:48:35 -03005308 while (num_reports--) {
5309 struct hci_ev_le_advertising_info *ev = ptr;
Johan Hedberg4af605d2014-03-24 10:48:00 +02005310 s8 rssi;
Andre Guedesa4790db2014-02-26 20:21:47 -03005311
Chriz Chowee649342018-04-20 15:46:24 +08005312 if (ev->length <= HCI_MAX_AD_LENGTH) {
5313 rssi = ev->data[ev->length];
5314 process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
5315 ev->bdaddr_type, NULL, 0, rssi,
5316 ev->data, ev->length);
5317 } else {
5318 bt_dev_err(hdev, "Dropping invalid advertising data");
5319 }
Andre Guedes3c9e9192012-01-10 18:20:50 -03005320
Andre Guedese95beb42011-09-26 20:48:35 -03005321 ptr += sizeof(*ev) + ev->length + 1;
Andre Guedes9aa04c92011-05-26 16:23:51 -03005322 }
Andre Guedesa4790db2014-02-26 20:21:47 -03005323
5324 hci_dev_unlock(hdev);
Andre Guedes9aa04c92011-05-26 16:23:51 -03005325}
5326
Jaganath Kanakkasseryb2cc9762018-07-19 17:09:38 +05305327static u8 ext_evt_type_to_legacy(u16 evt_type)
Jaganath Kanakkasseryc215e932018-07-06 17:05:29 +05305328{
Jaganath Kanakkasseryb2cc9762018-07-19 17:09:38 +05305329 if (evt_type & LE_EXT_ADV_LEGACY_PDU) {
5330 switch (evt_type) {
5331 case LE_LEGACY_ADV_IND:
5332 return LE_ADV_IND;
5333 case LE_LEGACY_ADV_DIRECT_IND:
5334 return LE_ADV_DIRECT_IND;
5335 case LE_LEGACY_ADV_SCAN_IND:
5336 return LE_ADV_SCAN_IND;
5337 case LE_LEGACY_NONCONN_IND:
5338 return LE_ADV_NONCONN_IND;
5339 case LE_LEGACY_SCAN_RSP_ADV:
5340 case LE_LEGACY_SCAN_RSP_ADV_SCAN:
5341 return LE_ADV_SCAN_RSP;
5342 }
5343
5344 BT_ERR_RATELIMITED("Unknown advertising packet type: 0x%02x",
5345 evt_type);
5346
5347 return LE_ADV_INVALID;
Jaganath Kanakkasseryc215e932018-07-06 17:05:29 +05305348 }
5349
Jaganath Kanakkasseryb2cc9762018-07-19 17:09:38 +05305350 if (evt_type & LE_EXT_ADV_CONN_IND) {
5351 if (evt_type & LE_EXT_ADV_DIRECT_IND)
5352 return LE_ADV_DIRECT_IND;
5353
5354 return LE_ADV_IND;
5355 }
5356
5357 if (evt_type & LE_EXT_ADV_SCAN_RSP)
5358 return LE_ADV_SCAN_RSP;
5359
5360 if (evt_type & LE_EXT_ADV_SCAN_IND)
5361 return LE_ADV_SCAN_IND;
5362
5363 if (evt_type == LE_EXT_ADV_NON_CONN_IND ||
5364 evt_type & LE_EXT_ADV_DIRECT_IND)
5365 return LE_ADV_NONCONN_IND;
5366
Jaganath Kanakkasseryc215e932018-07-06 17:05:29 +05305367 BT_ERR_RATELIMITED("Unknown advertising packet type: 0x%02x",
5368 evt_type);
5369
5370 return LE_ADV_INVALID;
5371}
5372
5373static void hci_le_ext_adv_report_evt(struct hci_dev *hdev, struct sk_buff *skb)
5374{
5375 u8 num_reports = skb->data[0];
5376 void *ptr = &skb->data[1];
5377
5378 hci_dev_lock(hdev);
5379
5380 while (num_reports--) {
5381 struct hci_ev_le_ext_adv_report *ev = ptr;
5382 u8 legacy_evt_type;
5383 u16 evt_type;
5384
5385 evt_type = __le16_to_cpu(ev->evt_type);
Jaganath Kanakkasseryb2cc9762018-07-19 17:09:38 +05305386 legacy_evt_type = ext_evt_type_to_legacy(evt_type);
Jaganath Kanakkasseryc215e932018-07-06 17:05:29 +05305387 if (legacy_evt_type != LE_ADV_INVALID) {
5388 process_adv_report(hdev, legacy_evt_type, &ev->bdaddr,
5389 ev->bdaddr_type, NULL, 0, ev->rssi,
5390 ev->data, ev->length);
5391 }
5392
5393 ptr += sizeof(*ev) + ev->length + 1;
5394 }
5395
5396 hci_dev_unlock(hdev);
5397}
5398
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07005399static void hci_le_remote_feat_complete_evt(struct hci_dev *hdev,
5400 struct sk_buff *skb)
5401{
5402 struct hci_ev_le_remote_feat_complete *ev = (void *)skb->data;
5403 struct hci_conn *conn;
5404
5405 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
5406
5407 hci_dev_lock(hdev);
5408
5409 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
5410 if (conn) {
5411 if (!ev->status)
5412 memcpy(conn->features[0], ev->features, 8);
5413
5414 if (conn->state == BT_CONFIG) {
5415 __u8 status;
5416
5417 /* If the local controller supports slave-initiated
5418 * features exchange, but the remote controller does
5419 * not, then it is possible that the error code 0x1a
5420 * for unsupported remote feature gets returned.
5421 *
5422 * In this specific case, allow the connection to
5423 * transition into connected state and mark it as
5424 * successful.
5425 */
5426 if ((hdev->le_features[0] & HCI_LE_SLAVE_FEATURES) &&
5427 !conn->out && ev->status == 0x1a)
5428 status = 0x00;
5429 else
5430 status = ev->status;
5431
5432 conn->state = BT_CONNECTED;
5433 hci_connect_cfm(conn, status);
5434 hci_conn_drop(conn);
5435 }
5436 }
5437
5438 hci_dev_unlock(hdev);
5439}
5440
Gustavo Padovan6039aa72012-05-23 04:04:18 -03005441static void hci_le_ltk_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005442{
5443 struct hci_ev_le_ltk_req *ev = (void *) skb->data;
5444 struct hci_cp_le_ltk_reply cp;
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03005445 struct hci_cp_le_ltk_neg_reply neg;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005446 struct hci_conn *conn;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03005447 struct smp_ltk *ltk;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005448
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03005449 BT_DBG("%s handle 0x%4.4x", hdev->name, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005450
5451 hci_dev_lock(hdev);
5452
5453 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03005454 if (conn == NULL)
5455 goto not_found;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005456
Johan Hedbergf3a73d92014-05-29 15:02:59 +03005457 ltk = hci_find_ltk(hdev, &conn->dst, conn->dst_type, conn->role);
Johan Hedberg5378bc52014-05-29 14:00:39 +03005458 if (!ltk)
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03005459 goto not_found;
5460
Johan Hedberg5378bc52014-05-29 14:00:39 +03005461 if (smp_ltk_is_sc(ltk)) {
5462 /* With SC both EDiv and Rand are set to zero */
5463 if (ev->ediv || ev->rand)
5464 goto not_found;
5465 } else {
5466 /* For non-SC keys check that EDiv and Rand match */
5467 if (ev->ediv != ltk->ediv || ev->rand != ltk->rand)
5468 goto not_found;
5469 }
5470
Johan Hedberg8b76ce32015-06-08 18:14:39 +03005471 memcpy(cp.ltk, ltk->val, ltk->enc_size);
5472 memset(cp.ltk + ltk->enc_size, 0, sizeof(cp.ltk) - ltk->enc_size);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005473 cp.handle = cpu_to_le16(conn->handle);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03005474
Johan Hedberga6f78332014-09-10 17:37:45 -07005475 conn->pending_sec_level = smp_ltk_sec_level(ltk);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005476
Andre Guedes89cbb4d2013-07-31 16:25:29 -03005477 conn->enc_key_size = ltk->enc_size;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005478
5479 hci_send_cmd(hdev, HCI_OP_LE_LTK_REPLY, sizeof(cp), &cp);
5480
Claudio Takahasi5981a882013-07-25 16:34:24 -03005481 /* Ref. Bluetooth Core SPEC pages 1975 and 2004. STK is a
5482 * temporary key used to encrypt a connection following
5483 * pairing. It is used during the Encrypted Session Setup to
5484 * distribute the keys. Later, security can be re-established
5485 * using a distributed LTK.
5486 */
Johan Hedberg2ceba532014-06-16 19:25:16 +03005487 if (ltk->type == SMP_STK) {
Johan Hedbergfe59a052014-07-01 19:14:12 +03005488 set_bit(HCI_CONN_STK_ENCRYPT, &conn->flags);
Johan Hedberg970d0f12014-11-13 14:37:47 +02005489 list_del_rcu(&ltk->list);
5490 kfree_rcu(ltk, rcu);
Johan Hedbergfe59a052014-07-01 19:14:12 +03005491 } else {
5492 clear_bit(HCI_CONN_STK_ENCRYPT, &conn->flags);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03005493 }
5494
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005495 hci_dev_unlock(hdev);
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03005496
5497 return;
5498
5499not_found:
5500 neg.handle = ev->handle;
5501 hci_send_cmd(hdev, HCI_OP_LE_LTK_NEG_REPLY, sizeof(neg), &neg);
5502 hci_dev_unlock(hdev);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005503}
5504
Andre Guedes8e75b462014-07-01 18:10:08 -03005505static void send_conn_param_neg_reply(struct hci_dev *hdev, u16 handle,
5506 u8 reason)
5507{
5508 struct hci_cp_le_conn_param_req_neg_reply cp;
5509
5510 cp.handle = cpu_to_le16(handle);
5511 cp.reason = reason;
5512
5513 hci_send_cmd(hdev, HCI_OP_LE_CONN_PARAM_REQ_NEG_REPLY, sizeof(cp),
5514 &cp);
5515}
5516
5517static void hci_le_remote_conn_param_req_evt(struct hci_dev *hdev,
5518 struct sk_buff *skb)
5519{
5520 struct hci_ev_le_remote_conn_param_req *ev = (void *) skb->data;
5521 struct hci_cp_le_conn_param_req_reply cp;
5522 struct hci_conn *hcon;
5523 u16 handle, min, max, latency, timeout;
5524
5525 handle = le16_to_cpu(ev->handle);
5526 min = le16_to_cpu(ev->interval_min);
5527 max = le16_to_cpu(ev->interval_max);
5528 latency = le16_to_cpu(ev->latency);
5529 timeout = le16_to_cpu(ev->timeout);
5530
5531 hcon = hci_conn_hash_lookup_handle(hdev, handle);
5532 if (!hcon || hcon->state != BT_CONNECTED)
5533 return send_conn_param_neg_reply(hdev, handle,
5534 HCI_ERROR_UNKNOWN_CONN_ID);
5535
5536 if (hci_check_conn_params(min, max, latency, timeout))
5537 return send_conn_param_neg_reply(hdev, handle,
5538 HCI_ERROR_INVALID_LL_PARAMS);
5539
Johan Hedberg40bef302014-07-16 11:42:27 +03005540 if (hcon->role == HCI_ROLE_MASTER) {
Johan Hedberg348d50b2014-07-02 17:37:30 +03005541 struct hci_conn_params *params;
Johan Hedbergf4869e22014-07-02 17:37:32 +03005542 u8 store_hint;
Johan Hedberg348d50b2014-07-02 17:37:30 +03005543
5544 hci_dev_lock(hdev);
5545
5546 params = hci_conn_params_lookup(hdev, &hcon->dst,
5547 hcon->dst_type);
5548 if (params) {
5549 params->conn_min_interval = min;
5550 params->conn_max_interval = max;
5551 params->conn_latency = latency;
5552 params->supervision_timeout = timeout;
Johan Hedbergf4869e22014-07-02 17:37:32 +03005553 store_hint = 0x01;
5554 } else{
5555 store_hint = 0x00;
Johan Hedberg348d50b2014-07-02 17:37:30 +03005556 }
5557
5558 hci_dev_unlock(hdev);
5559
Johan Hedbergf4869e22014-07-02 17:37:32 +03005560 mgmt_new_conn_param(hdev, &hcon->dst, hcon->dst_type,
5561 store_hint, min, max, latency, timeout);
Johan Hedberg348d50b2014-07-02 17:37:30 +03005562 }
Andre Guedesffb5a8272014-07-01 18:10:11 -03005563
Andre Guedes8e75b462014-07-01 18:10:08 -03005564 cp.handle = ev->handle;
5565 cp.interval_min = ev->interval_min;
5566 cp.interval_max = ev->interval_max;
5567 cp.latency = ev->latency;
5568 cp.timeout = ev->timeout;
5569 cp.min_ce_len = 0;
5570 cp.max_ce_len = 0;
5571
5572 hci_send_cmd(hdev, HCI_OP_LE_CONN_PARAM_REQ_REPLY, sizeof(cp), &cp);
5573}
5574
Marcel Holtmann2f010b52014-12-05 16:20:13 +01005575static void hci_le_direct_adv_report_evt(struct hci_dev *hdev,
5576 struct sk_buff *skb)
5577{
5578 u8 num_reports = skb->data[0];
5579 void *ptr = &skb->data[1];
5580
5581 hci_dev_lock(hdev);
5582
5583 while (num_reports--) {
5584 struct hci_ev_le_direct_adv_info *ev = ptr;
5585
5586 process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
5587 ev->bdaddr_type, &ev->direct_addr,
5588 ev->direct_addr_type, ev->rssi, NULL, 0);
5589
5590 ptr += sizeof(*ev);
5591 }
5592
5593 hci_dev_unlock(hdev);
5594}
5595
Gustavo Padovan6039aa72012-05-23 04:04:18 -03005596static void hci_le_meta_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03005597{
5598 struct hci_ev_le_meta *le_ev = (void *) skb->data;
5599
5600 skb_pull(skb, sizeof(*le_ev));
5601
5602 switch (le_ev->subevent) {
5603 case HCI_EV_LE_CONN_COMPLETE:
5604 hci_le_conn_complete_evt(hdev, skb);
5605 break;
5606
Marcel Holtmann1855d922014-06-23 11:40:05 +02005607 case HCI_EV_LE_CONN_UPDATE_COMPLETE:
5608 hci_le_conn_update_complete_evt(hdev, skb);
5609 break;
5610
Andre Guedes9aa04c92011-05-26 16:23:51 -03005611 case HCI_EV_LE_ADVERTISING_REPORT:
5612 hci_le_adv_report_evt(hdev, skb);
5613 break;
5614
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07005615 case HCI_EV_LE_REMOTE_FEAT_COMPLETE:
5616 hci_le_remote_feat_complete_evt(hdev, skb);
5617 break;
5618
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005619 case HCI_EV_LE_LTK_REQ:
5620 hci_le_ltk_request_evt(hdev, skb);
5621 break;
5622
Andre Guedes8e75b462014-07-01 18:10:08 -03005623 case HCI_EV_LE_REMOTE_CONN_PARAM_REQ:
5624 hci_le_remote_conn_param_req_evt(hdev, skb);
5625 break;
5626
Marcel Holtmann2f010b52014-12-05 16:20:13 +01005627 case HCI_EV_LE_DIRECT_ADV_REPORT:
5628 hci_le_direct_adv_report_evt(hdev, skb);
5629 break;
5630
Jaganath Kanakkasseryc215e932018-07-06 17:05:29 +05305631 case HCI_EV_LE_EXT_ADV_REPORT:
5632 hci_le_ext_adv_report_evt(hdev, skb);
5633 break;
5634
Jaganath Kanakkassery4d94f952018-07-06 22:50:32 +02005635 case HCI_EV_LE_ENHANCED_CONN_COMPLETE:
5636 hci_le_enh_conn_complete_evt(hdev, skb);
5637 break;
5638
Jaganath Kanakkasseryacf0aea2018-07-19 17:09:46 +05305639 case HCI_EV_LE_EXT_ADV_SET_TERM:
5640 hci_le_ext_adv_term_evt(hdev, skb);
5641 break;
5642
Ville Tervofcd89c02011-02-10 22:38:47 -03005643 default:
5644 break;
5645 }
5646}
5647
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005648static bool hci_get_cmd_complete(struct hci_dev *hdev, u16 opcode,
5649 u8 event, struct sk_buff *skb)
5650{
5651 struct hci_ev_cmd_complete *ev;
5652 struct hci_event_hdr *hdr;
5653
5654 if (!skb)
5655 return false;
5656
5657 if (skb->len < sizeof(*hdr)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01005658 bt_dev_err(hdev, "too short HCI event");
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005659 return false;
5660 }
5661
5662 hdr = (void *) skb->data;
5663 skb_pull(skb, HCI_EVENT_HDR_SIZE);
5664
5665 if (event) {
5666 if (hdr->evt != event)
5667 return false;
5668 return true;
5669 }
5670
5671 if (hdr->evt != HCI_EV_CMD_COMPLETE) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01005672 bt_dev_err(hdev, "last event is not cmd complete (0x%2.2x)",
5673 hdr->evt);
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005674 return false;
5675 }
5676
5677 if (skb->len < sizeof(*ev)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01005678 bt_dev_err(hdev, "too short cmd_complete event");
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005679 return false;
5680 }
5681
5682 ev = (void *) skb->data;
5683 skb_pull(skb, sizeof(*ev));
5684
5685 if (opcode != __le16_to_cpu(ev->opcode)) {
5686 BT_DBG("opcode doesn't match (0x%2.2x != 0x%2.2x)", opcode,
5687 __le16_to_cpu(ev->opcode));
5688 return false;
5689 }
5690
5691 return true;
5692}
5693
Linus Torvalds1da177e2005-04-16 15:20:36 -07005694void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)
5695{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005696 struct hci_event_hdr *hdr = (void *) skb->data;
Johan Hedberge62144872015-04-02 13:41:08 +03005697 hci_req_complete_t req_complete = NULL;
5698 hci_req_complete_skb_t req_complete_skb = NULL;
5699 struct sk_buff *orig_skb = NULL;
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005700 u8 status = 0, event = hdr->evt, req_evt = 0;
Johan Hedberge62144872015-04-02 13:41:08 +03005701 u16 opcode = HCI_OP_NOP;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005702
Marcel Holtmann242c0eb2015-10-25 22:45:53 +01005703 if (hdev->sent_cmd && bt_cb(hdev->sent_cmd)->hci.req_event == event) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02005704 struct hci_command_hdr *cmd_hdr = (void *) hdev->sent_cmd->data;
Johan Hedberge62144872015-04-02 13:41:08 +03005705 opcode = __le16_to_cpu(cmd_hdr->opcode);
5706 hci_req_cmd_complete(hdev, opcode, status, &req_complete,
5707 &req_complete_skb);
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005708 req_evt = event;
Johan Hedberg02350a72013-04-03 21:50:29 +03005709 }
5710
Johan Hedberge62144872015-04-02 13:41:08 +03005711 /* If it looks like we might end up having to call
5712 * req_complete_skb, store a pristine copy of the skb since the
5713 * various handlers may modify the original one through
5714 * skb_pull() calls, etc.
5715 */
5716 if (req_complete_skb || event == HCI_EV_CMD_STATUS ||
5717 event == HCI_EV_CMD_COMPLETE)
5718 orig_skb = skb_clone(skb, GFP_KERNEL);
5719
5720 skb_pull(skb, HCI_EVENT_HDR_SIZE);
5721
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005722 switch (event) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005723 case HCI_EV_INQUIRY_COMPLETE:
5724 hci_inquiry_complete_evt(hdev, skb);
5725 break;
5726
5727 case HCI_EV_INQUIRY_RESULT:
5728 hci_inquiry_result_evt(hdev, skb);
5729 break;
5730
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005731 case HCI_EV_CONN_COMPLETE:
5732 hci_conn_complete_evt(hdev, skb);
Marcel Holtmann21d9e302005-09-13 01:32:25 +02005733 break;
5734
Linus Torvalds1da177e2005-04-16 15:20:36 -07005735 case HCI_EV_CONN_REQUEST:
5736 hci_conn_request_evt(hdev, skb);
5737 break;
5738
Linus Torvalds1da177e2005-04-16 15:20:36 -07005739 case HCI_EV_DISCONN_COMPLETE:
5740 hci_disconn_complete_evt(hdev, skb);
5741 break;
5742
Linus Torvalds1da177e2005-04-16 15:20:36 -07005743 case HCI_EV_AUTH_COMPLETE:
5744 hci_auth_complete_evt(hdev, skb);
5745 break;
5746
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005747 case HCI_EV_REMOTE_NAME:
5748 hci_remote_name_evt(hdev, skb);
5749 break;
5750
Linus Torvalds1da177e2005-04-16 15:20:36 -07005751 case HCI_EV_ENCRYPT_CHANGE:
5752 hci_encrypt_change_evt(hdev, skb);
5753 break;
5754
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005755 case HCI_EV_CHANGE_LINK_KEY_COMPLETE:
5756 hci_change_link_key_complete_evt(hdev, skb);
5757 break;
5758
5759 case HCI_EV_REMOTE_FEATURES:
5760 hci_remote_features_evt(hdev, skb);
5761 break;
5762
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005763 case HCI_EV_CMD_COMPLETE:
Johan Hedberge62144872015-04-02 13:41:08 +03005764 hci_cmd_complete_evt(hdev, skb, &opcode, &status,
5765 &req_complete, &req_complete_skb);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005766 break;
5767
5768 case HCI_EV_CMD_STATUS:
Johan Hedberge62144872015-04-02 13:41:08 +03005769 hci_cmd_status_evt(hdev, skb, &opcode, &status, &req_complete,
5770 &req_complete_skb);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005771 break;
5772
Marcel Holtmann24dfa342014-11-02 02:56:41 +01005773 case HCI_EV_HARDWARE_ERROR:
5774 hci_hardware_error_evt(hdev, skb);
5775 break;
5776
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005777 case HCI_EV_ROLE_CHANGE:
5778 hci_role_change_evt(hdev, skb);
5779 break;
5780
5781 case HCI_EV_NUM_COMP_PKTS:
5782 hci_num_comp_pkts_evt(hdev, skb);
5783 break;
5784
5785 case HCI_EV_MODE_CHANGE:
5786 hci_mode_change_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005787 break;
5788
5789 case HCI_EV_PIN_CODE_REQ:
5790 hci_pin_code_request_evt(hdev, skb);
5791 break;
5792
5793 case HCI_EV_LINK_KEY_REQ:
5794 hci_link_key_request_evt(hdev, skb);
5795 break;
5796
5797 case HCI_EV_LINK_KEY_NOTIFY:
5798 hci_link_key_notify_evt(hdev, skb);
5799 break;
5800
5801 case HCI_EV_CLOCK_OFFSET:
5802 hci_clock_offset_evt(hdev, skb);
5803 break;
5804
Marcel Holtmanna8746412008-07-14 20:13:46 +02005805 case HCI_EV_PKT_TYPE_CHANGE:
5806 hci_pkt_type_change_evt(hdev, skb);
5807 break;
5808
Marcel Holtmann85a1e932005-08-09 20:28:02 -07005809 case HCI_EV_PSCAN_REP_MODE:
5810 hci_pscan_rep_mode_evt(hdev, skb);
5811 break;
5812
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005813 case HCI_EV_INQUIRY_RESULT_WITH_RSSI:
5814 hci_inquiry_result_with_rssi_evt(hdev, skb);
5815 break;
5816
5817 case HCI_EV_REMOTE_EXT_FEATURES:
5818 hci_remote_ext_features_evt(hdev, skb);
5819 break;
5820
5821 case HCI_EV_SYNC_CONN_COMPLETE:
5822 hci_sync_conn_complete_evt(hdev, skb);
5823 break;
5824
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005825 case HCI_EV_EXTENDED_INQUIRY_RESULT:
5826 hci_extended_inquiry_result_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005827 break;
5828
Johan Hedberg1c2e0042012-06-08 23:31:13 +08005829 case HCI_EV_KEY_REFRESH_COMPLETE:
5830 hci_key_refresh_complete_evt(hdev, skb);
5831 break;
5832
Marcel Holtmann04936842008-07-14 20:13:48 +02005833 case HCI_EV_IO_CAPA_REQUEST:
5834 hci_io_capa_request_evt(hdev, skb);
5835 break;
5836
Johan Hedberg03b555e2011-01-04 15:40:05 +02005837 case HCI_EV_IO_CAPA_REPLY:
5838 hci_io_capa_reply_evt(hdev, skb);
5839 break;
5840
Johan Hedberga5c29682011-02-19 12:05:57 -03005841 case HCI_EV_USER_CONFIRM_REQUEST:
5842 hci_user_confirm_request_evt(hdev, skb);
5843 break;
5844
Brian Gix1143d452011-11-23 08:28:34 -08005845 case HCI_EV_USER_PASSKEY_REQUEST:
5846 hci_user_passkey_request_evt(hdev, skb);
5847 break;
5848
Johan Hedberg92a25252012-09-06 18:39:26 +03005849 case HCI_EV_USER_PASSKEY_NOTIFY:
5850 hci_user_passkey_notify_evt(hdev, skb);
5851 break;
5852
5853 case HCI_EV_KEYPRESS_NOTIFY:
5854 hci_keypress_notify_evt(hdev, skb);
5855 break;
5856
Marcel Holtmann04936842008-07-14 20:13:48 +02005857 case HCI_EV_SIMPLE_PAIR_COMPLETE:
5858 hci_simple_pair_complete_evt(hdev, skb);
5859 break;
5860
Marcel Holtmann41a96212008-07-14 20:13:48 +02005861 case HCI_EV_REMOTE_HOST_FEATURES:
5862 hci_remote_host_features_evt(hdev, skb);
5863 break;
5864
Ville Tervofcd89c02011-02-10 22:38:47 -03005865 case HCI_EV_LE_META:
5866 hci_le_meta_evt(hdev, skb);
5867 break;
5868
Szymon Janc2763eda2011-03-22 13:12:22 +01005869 case HCI_EV_REMOTE_OOB_DATA_REQUEST:
5870 hci_remote_oob_data_request_evt(hdev, skb);
5871 break;
5872
Arron Wanga77a6a12015-07-24 17:13:15 +08005873#if IS_ENABLED(CONFIG_BT_HS)
5874 case HCI_EV_CHANNEL_SELECTED:
5875 hci_chan_selected_evt(hdev, skb);
5876 break;
5877
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03005878 case HCI_EV_PHY_LINK_COMPLETE:
5879 hci_phy_link_complete_evt(hdev, skb);
5880 break;
5881
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03005882 case HCI_EV_LOGICAL_LINK_COMPLETE:
5883 hci_loglink_complete_evt(hdev, skb);
5884 break;
5885
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02005886 case HCI_EV_DISCONN_LOGICAL_LINK_COMPLETE:
5887 hci_disconn_loglink_complete_evt(hdev, skb);
5888 break;
5889
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02005890 case HCI_EV_DISCONN_PHY_LINK_COMPLETE:
5891 hci_disconn_phylink_complete_evt(hdev, skb);
5892 break;
Arron Wanga77a6a12015-07-24 17:13:15 +08005893#endif
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02005894
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02005895 case HCI_EV_NUM_COMP_BLOCKS:
5896 hci_num_comp_blocks_evt(hdev, skb);
5897 break;
5898
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005899 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03005900 BT_DBG("%s event 0x%2.2x", hdev->name, event);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005901 break;
5902 }
5903
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005904 if (req_complete) {
Johan Hedberge62144872015-04-02 13:41:08 +03005905 req_complete(hdev, status, opcode);
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005906 } else if (req_complete_skb) {
5907 if (!hci_get_cmd_complete(hdev, opcode, req_evt, orig_skb)) {
5908 kfree_skb(orig_skb);
5909 orig_skb = NULL;
5910 }
Johan Hedberge62144872015-04-02 13:41:08 +03005911 req_complete_skb(hdev, status, opcode, orig_skb);
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005912 }
Johan Hedberge62144872015-04-02 13:41:08 +03005913
5914 kfree_skb(orig_skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005915 kfree_skb(skb);
5916 hdev->stat.evt_rx++;
5917}