blob: 754714c8d75288bc90c459bf4a659ac2e719ed7a [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;
1135 struct hci_cp_ext_adv_set *adv_set;
1136 __u8 status = *((__u8 *) skb->data);
1137
1138 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1139
1140 if (status)
1141 return;
1142
1143 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_EXT_ADV_ENABLE);
1144 if (!cp)
1145 return;
1146
1147 adv_set = (void *) cp->data;
1148
1149 hci_dev_lock(hdev);
1150
1151 if (cp->enable) {
1152 struct hci_conn *conn;
1153
1154 hci_dev_set_flag(hdev, HCI_LE_ADV);
1155
1156 conn = hci_lookup_le_connect(hdev);
1157 if (conn)
1158 queue_delayed_work(hdev->workqueue,
1159 &conn->le_conn_timeout,
1160 conn->conn_timeout);
Jaganath Kanakkassery45b77492018-07-19 17:09:43 +05301161 } else {
1162 hci_dev_clear_flag(hdev, HCI_LE_ADV);
Jaganath Kanakkasseryde181e82018-07-19 17:09:41 +05301163 }
1164
1165 hci_dev_unlock(hdev);
1166}
1167
Marcel Holtmann533553f2014-03-21 12:18:10 -07001168static void hci_cc_le_set_scan_param(struct hci_dev *hdev, struct sk_buff *skb)
1169{
1170 struct hci_cp_le_set_scan_param *cp;
1171 __u8 status = *((__u8 *) skb->data);
1172
1173 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1174
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001175 if (status)
1176 return;
1177
Marcel Holtmann533553f2014-03-21 12:18:10 -07001178 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_PARAM);
1179 if (!cp)
1180 return;
1181
1182 hci_dev_lock(hdev);
1183
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001184 hdev->le_scan_type = cp->type;
Marcel Holtmann533553f2014-03-21 12:18:10 -07001185
1186 hci_dev_unlock(hdev);
1187}
1188
Jaganath Kanakkasserya2344b92018-07-06 17:05:28 +05301189static void hci_cc_le_set_ext_scan_param(struct hci_dev *hdev,
1190 struct sk_buff *skb)
1191{
1192 struct hci_cp_le_set_ext_scan_params *cp;
1193 __u8 status = *((__u8 *) skb->data);
1194 struct hci_cp_le_scan_phy_params *phy_param;
1195
1196 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1197
1198 if (status)
1199 return;
1200
1201 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_EXT_SCAN_PARAMS);
1202 if (!cp)
1203 return;
1204
1205 phy_param = (void *)cp->data;
1206
1207 hci_dev_lock(hdev);
1208
1209 hdev->le_scan_type = phy_param->type;
1210
1211 hci_dev_unlock(hdev);
1212}
1213
Johan Hedbergb9a63282014-03-25 10:51:52 +02001214static bool has_pending_adv_report(struct hci_dev *hdev)
1215{
1216 struct discovery_state *d = &hdev->discovery;
1217
1218 return bacmp(&d->last_adv_addr, BDADDR_ANY);
1219}
1220
1221static void clear_pending_adv_report(struct hci_dev *hdev)
1222{
1223 struct discovery_state *d = &hdev->discovery;
1224
1225 bacpy(&d->last_adv_addr, BDADDR_ANY);
1226 d->last_adv_data_len = 0;
1227}
1228
1229static void store_pending_adv_report(struct hci_dev *hdev, bdaddr_t *bdaddr,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001230 u8 bdaddr_type, s8 rssi, u32 flags,
1231 u8 *data, u8 len)
Johan Hedbergb9a63282014-03-25 10:51:52 +02001232{
1233 struct discovery_state *d = &hdev->discovery;
1234
1235 bacpy(&d->last_adv_addr, bdaddr);
1236 d->last_adv_addr_type = bdaddr_type;
Johan Hedbergff5cd292014-03-25 14:40:52 +02001237 d->last_adv_rssi = rssi;
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001238 d->last_adv_flags = flags;
Johan Hedbergb9a63282014-03-25 10:51:52 +02001239 memcpy(d->last_adv_data, data, len);
1240 d->last_adv_data_len = len;
1241}
1242
Jaganath Kanakkassery3baef812018-07-06 17:05:27 +05301243static void le_set_scan_enable_complete(struct hci_dev *hdev, u8 enable)
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001244{
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301245 hci_dev_lock(hdev);
1246
Jaganath Kanakkassery3baef812018-07-06 17:05:27 +05301247 switch (enable) {
Andre Guedes76a388b2013-04-04 20:21:02 -03001248 case LE_SCAN_ENABLE:
Marcel Holtmanna1536da2015-03-13 02:11:01 -07001249 hci_dev_set_flag(hdev, HCI_LE_SCAN);
Johan Hedbergb9a63282014-03-25 10:51:52 +02001250 if (hdev->le_scan_type == LE_SCAN_ACTIVE)
1251 clear_pending_adv_report(hdev);
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001252 break;
1253
Andre Guedes76a388b2013-04-04 20:21:02 -03001254 case LE_SCAN_DISABLE:
Johan Hedbergb9a63282014-03-25 10:51:52 +02001255 /* We do this here instead of when setting DISCOVERY_STOPPED
1256 * since the latter would potentially require waiting for
1257 * inquiry to stop too.
1258 */
1259 if (has_pending_adv_report(hdev)) {
1260 struct discovery_state *d = &hdev->discovery;
1261
1262 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergab0aa432014-03-26 14:17:12 +02001263 d->last_adv_addr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001264 d->last_adv_rssi, d->last_adv_flags,
Johan Hedbergab0aa432014-03-26 14:17:12 +02001265 d->last_adv_data,
Johan Hedbergb9a63282014-03-25 10:51:52 +02001266 d->last_adv_data_len, NULL, 0);
1267 }
1268
Johan Hedberg317ac8c2014-02-28 20:26:12 +02001269 /* Cancel this timer so that we don't try to disable scanning
1270 * when it's already disabled.
1271 */
1272 cancel_delayed_work(&hdev->le_scan_disable);
1273
Marcel Holtmanna358dc12015-03-13 02:11:02 -07001274 hci_dev_clear_flag(hdev, HCI_LE_SCAN);
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001275
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001276 /* The HCI_LE_SCAN_INTERRUPTED flag indicates that we
1277 * interrupted scanning due to a connect request. Mark
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001278 * therefore discovery as stopped. If this was not
1279 * because of a connect request advertising might have
1280 * been disabled because of active scanning, so
1281 * re-enable it again if necessary.
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001282 */
Marcel Holtmanna69d8922015-03-13 02:11:05 -07001283 if (hci_dev_test_and_clear_flag(hdev, HCI_LE_SCAN_INTERRUPTED))
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001284 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001285 else if (!hci_dev_test_flag(hdev, HCI_LE_ADV) &&
Johan Hedberg34722272014-07-08 16:05:05 +03001286 hdev->discovery.state == DISCOVERY_FINDING)
Johan Hedbergf2252572015-11-18 12:49:20 +02001287 hci_req_reenable_advertising(hdev);
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001288
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001289 break;
1290
1291 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001292 bt_dev_err(hdev, "use of reserved LE_Scan_Enable param %d",
Jaganath Kanakkassery3baef812018-07-06 17:05:27 +05301293 enable);
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001294 break;
Andre Guedes35815082011-05-26 16:23:53 -03001295 }
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301296
1297 hci_dev_unlock(hdev);
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001298}
1299
Jaganath Kanakkassery3baef812018-07-06 17:05:27 +05301300static void hci_cc_le_set_scan_enable(struct hci_dev *hdev,
1301 struct sk_buff *skb)
1302{
1303 struct hci_cp_le_set_scan_enable *cp;
1304 __u8 status = *((__u8 *) skb->data);
1305
1306 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1307
1308 if (status)
1309 return;
1310
1311 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_ENABLE);
1312 if (!cp)
1313 return;
1314
1315 le_set_scan_enable_complete(hdev, cp->enable);
1316}
1317
Jaganath Kanakkasserya2344b92018-07-06 17:05:28 +05301318static void hci_cc_le_set_ext_scan_enable(struct hci_dev *hdev,
1319 struct sk_buff *skb)
1320{
1321 struct hci_cp_le_set_ext_scan_enable *cp;
1322 __u8 status = *((__u8 *) skb->data);
1323
1324 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1325
1326 if (status)
1327 return;
1328
1329 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_EXT_SCAN_ENABLE);
1330 if (!cp)
1331 return;
1332
1333 le_set_scan_enable_complete(hdev, cp->enable);
1334}
1335
Jaganath Kanakkassery6b49bcb2018-07-19 17:09:40 +05301336static void hci_cc_le_read_num_adv_sets(struct hci_dev *hdev,
1337 struct sk_buff *skb)
1338{
1339 struct hci_rp_le_read_num_supported_adv_sets *rp = (void *) skb->data;
1340
1341 BT_DBG("%s status 0x%2.2x No of Adv sets %u", hdev->name, rp->status,
1342 rp->num_of_sets);
1343
1344 if (rp->status)
1345 return;
1346
1347 hdev->le_num_of_adv_sets = rp->num_of_sets;
1348}
1349
Johan Hedbergcf1d0812013-01-22 14:02:00 +02001350static void hci_cc_le_read_white_list_size(struct hci_dev *hdev,
1351 struct sk_buff *skb)
1352{
1353 struct hci_rp_le_read_white_list_size *rp = (void *) skb->data;
1354
1355 BT_DBG("%s status 0x%2.2x size %u", hdev->name, rp->status, rp->size);
1356
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001357 if (rp->status)
1358 return;
1359
1360 hdev->le_white_list_size = rp->size;
Johan Hedbergcf1d0812013-01-22 14:02:00 +02001361}
1362
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001363static void hci_cc_le_clear_white_list(struct hci_dev *hdev,
1364 struct sk_buff *skb)
1365{
1366 __u8 status = *((__u8 *) skb->data);
1367
1368 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1369
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001370 if (status)
1371 return;
1372
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001373 hci_bdaddr_list_clear(&hdev->le_white_list);
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001374}
1375
1376static void hci_cc_le_add_to_white_list(struct hci_dev *hdev,
1377 struct sk_buff *skb)
1378{
1379 struct hci_cp_le_add_to_white_list *sent;
1380 __u8 status = *((__u8 *) skb->data);
1381
1382 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1383
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001384 if (status)
1385 return;
1386
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001387 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_ADD_TO_WHITE_LIST);
1388 if (!sent)
1389 return;
1390
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001391 hci_bdaddr_list_add(&hdev->le_white_list, &sent->bdaddr,
1392 sent->bdaddr_type);
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001393}
1394
1395static void hci_cc_le_del_from_white_list(struct hci_dev *hdev,
1396 struct sk_buff *skb)
1397{
1398 struct hci_cp_le_del_from_white_list *sent;
1399 __u8 status = *((__u8 *) skb->data);
1400
1401 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1402
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001403 if (status)
1404 return;
1405
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001406 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_DEL_FROM_WHITE_LIST);
1407 if (!sent)
1408 return;
1409
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001410 hci_bdaddr_list_del(&hdev->le_white_list, &sent->bdaddr,
1411 sent->bdaddr_type);
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001412}
1413
Johan Hedberg9b008c02013-01-22 14:02:01 +02001414static void hci_cc_le_read_supported_states(struct hci_dev *hdev,
1415 struct sk_buff *skb)
1416{
1417 struct hci_rp_le_read_supported_states *rp = (void *) skb->data;
1418
1419 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1420
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001421 if (rp->status)
1422 return;
1423
1424 memcpy(hdev->le_states, rp->le_states, 8);
Johan Hedberg9b008c02013-01-22 14:02:01 +02001425}
1426
Marcel Holtmanna8e1bfa2014-12-20 16:28:40 +01001427static void hci_cc_le_read_def_data_len(struct hci_dev *hdev,
1428 struct sk_buff *skb)
1429{
1430 struct hci_rp_le_read_def_data_len *rp = (void *) skb->data;
1431
1432 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1433
1434 if (rp->status)
1435 return;
1436
1437 hdev->le_def_tx_len = le16_to_cpu(rp->tx_len);
1438 hdev->le_def_tx_time = le16_to_cpu(rp->tx_time);
1439}
1440
1441static void hci_cc_le_write_def_data_len(struct hci_dev *hdev,
1442 struct sk_buff *skb)
1443{
1444 struct hci_cp_le_write_def_data_len *sent;
1445 __u8 status = *((__u8 *) skb->data);
1446
1447 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1448
1449 if (status)
1450 return;
1451
1452 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_WRITE_DEF_DATA_LEN);
1453 if (!sent)
1454 return;
1455
1456 hdev->le_def_tx_len = le16_to_cpu(sent->tx_len);
1457 hdev->le_def_tx_time = le16_to_cpu(sent->tx_time);
1458}
1459
Ankit Navik545f2592018-06-29 12:13:20 +05301460static void hci_cc_le_clear_resolv_list(struct hci_dev *hdev,
1461 struct sk_buff *skb)
1462{
1463 __u8 status = *((__u8 *) skb->data);
1464
1465 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1466
1467 if (status)
1468 return;
1469
1470 hci_bdaddr_list_clear(&hdev->le_resolv_list);
1471}
1472
Ankit Navikcfdb0c22018-06-29 12:12:50 +05301473static void hci_cc_le_read_resolv_list_size(struct hci_dev *hdev,
1474 struct sk_buff *skb)
1475{
1476 struct hci_rp_le_read_resolv_list_size *rp = (void *) skb->data;
1477
1478 BT_DBG("%s status 0x%2.2x size %u", hdev->name, rp->status, rp->size);
1479
1480 if (rp->status)
1481 return;
1482
1483 hdev->le_resolv_list_size = rp->size;
1484}
1485
Marcel Holtmanna8e1bfa2014-12-20 16:28:40 +01001486static void hci_cc_le_read_max_data_len(struct hci_dev *hdev,
1487 struct sk_buff *skb)
1488{
1489 struct hci_rp_le_read_max_data_len *rp = (void *) skb->data;
1490
1491 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1492
1493 if (rp->status)
1494 return;
1495
1496 hdev->le_max_tx_len = le16_to_cpu(rp->tx_len);
1497 hdev->le_max_tx_time = le16_to_cpu(rp->tx_time);
1498 hdev->le_max_rx_len = le16_to_cpu(rp->rx_len);
1499 hdev->le_max_rx_time = le16_to_cpu(rp->rx_time);
1500}
1501
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001502static void hci_cc_write_le_host_supported(struct hci_dev *hdev,
1503 struct sk_buff *skb)
Andre Guedesf9b49302011-06-30 19:20:53 -03001504{
Johan Hedberg06199cf2012-02-22 16:37:11 +02001505 struct hci_cp_write_le_host_supported *sent;
Andre Guedesf9b49302011-06-30 19:20:53 -03001506 __u8 status = *((__u8 *) skb->data);
1507
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001508 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedesf9b49302011-06-30 19:20:53 -03001509
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001510 if (status)
1511 return;
1512
Johan Hedberg06199cf2012-02-22 16:37:11 +02001513 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LE_HOST_SUPPORTED);
Johan Hedberg8f984df2012-02-28 01:07:22 +02001514 if (!sent)
Andre Guedesf9b49302011-06-30 19:20:53 -03001515 return;
1516
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301517 hci_dev_lock(hdev);
1518
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001519 if (sent->le) {
1520 hdev->features[1][0] |= LMP_HOST_LE;
Marcel Holtmanna1536da2015-03-13 02:11:01 -07001521 hci_dev_set_flag(hdev, HCI_LE_ENABLED);
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001522 } else {
1523 hdev->features[1][0] &= ~LMP_HOST_LE;
Marcel Holtmanna358dc12015-03-13 02:11:02 -07001524 hci_dev_clear_flag(hdev, HCI_LE_ENABLED);
1525 hci_dev_clear_flag(hdev, HCI_ADVERTISING);
Johan Hedberg8f984df2012-02-28 01:07:22 +02001526 }
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001527
1528 if (sent->simul)
1529 hdev->features[1][0] |= LMP_HOST_LE_BREDR;
1530 else
1531 hdev->features[1][0] &= ~LMP_HOST_LE_BREDR;
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301532
1533 hci_dev_unlock(hdev);
Andre Guedesf9b49302011-06-30 19:20:53 -03001534}
1535
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02001536static void hci_cc_set_adv_param(struct hci_dev *hdev, struct sk_buff *skb)
1537{
1538 struct hci_cp_le_set_adv_param *cp;
1539 u8 status = *((u8 *) skb->data);
1540
1541 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1542
1543 if (status)
1544 return;
1545
1546 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADV_PARAM);
1547 if (!cp)
1548 return;
1549
1550 hci_dev_lock(hdev);
1551 hdev->adv_addr_type = cp->own_address_type;
1552 hci_dev_unlock(hdev);
1553}
1554
Jaganath Kanakkasseryde181e82018-07-19 17:09:41 +05301555static void hci_cc_set_ext_adv_param(struct hci_dev *hdev, struct sk_buff *skb)
1556{
1557 struct hci_rp_le_set_ext_adv_params *rp = (void *) skb->data;
1558 struct hci_cp_le_set_ext_adv_params *cp;
1559 struct adv_info *adv_instance;
1560
1561 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1562
1563 if (rp->status)
1564 return;
1565
1566 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_EXT_ADV_PARAMS);
1567 if (!cp)
1568 return;
1569
1570 hci_dev_lock(hdev);
1571 hdev->adv_addr_type = cp->own_addr_type;
1572 if (!hdev->cur_adv_instance) {
1573 /* Store in hdev for instance 0 */
1574 hdev->adv_tx_power = rp->tx_power;
1575 } else {
1576 adv_instance = hci_find_adv_instance(hdev,
1577 hdev->cur_adv_instance);
1578 if (adv_instance)
1579 adv_instance->tx_power = rp->tx_power;
1580 }
Jaganath Kanakkasserya0fb3722018-07-19 17:09:42 +05301581 /* Update adv data as tx power is known now */
1582 hci_req_update_adv_data(hdev, hdev->cur_adv_instance);
Jaganath Kanakkasseryde181e82018-07-19 17:09:41 +05301583 hci_dev_unlock(hdev);
1584}
1585
Andrzej Kaczmarek5ae76a92014-05-08 15:32:08 +02001586static void hci_cc_read_rssi(struct hci_dev *hdev, struct sk_buff *skb)
1587{
1588 struct hci_rp_read_rssi *rp = (void *) skb->data;
1589 struct hci_conn *conn;
1590
1591 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1592
1593 if (rp->status)
1594 return;
1595
1596 hci_dev_lock(hdev);
1597
1598 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
1599 if (conn)
1600 conn->rssi = rp->rssi;
1601
1602 hci_dev_unlock(hdev);
1603}
1604
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001605static void hci_cc_read_tx_power(struct hci_dev *hdev, struct sk_buff *skb)
1606{
1607 struct hci_cp_read_tx_power *sent;
1608 struct hci_rp_read_tx_power *rp = (void *) skb->data;
1609 struct hci_conn *conn;
1610
1611 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1612
1613 if (rp->status)
1614 return;
1615
1616 sent = hci_sent_cmd_data(hdev, HCI_OP_READ_TX_POWER);
1617 if (!sent)
1618 return;
1619
1620 hci_dev_lock(hdev);
1621
1622 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
Andrzej Kaczmarekd0455ed2014-05-14 13:43:05 +02001623 if (!conn)
1624 goto unlock;
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001625
Andrzej Kaczmarekd0455ed2014-05-14 13:43:05 +02001626 switch (sent->type) {
1627 case 0x00:
1628 conn->tx_power = rp->tx_power;
1629 break;
1630 case 0x01:
1631 conn->max_tx_power = rp->tx_power;
1632 break;
1633 }
1634
1635unlock:
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001636 hci_dev_unlock(hdev);
1637}
1638
Marcel Holtmannc50b33c2015-01-31 15:07:52 -08001639static void hci_cc_write_ssp_debug_mode(struct hci_dev *hdev, struct sk_buff *skb)
1640{
1641 u8 status = *((u8 *) skb->data);
1642 u8 *mode;
1643
1644 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1645
1646 if (status)
1647 return;
1648
1649 mode = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SSP_DEBUG_MODE);
1650 if (mode)
1651 hdev->ssp_debug_mode = *mode;
1652}
1653
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001654static void hci_cs_inquiry(struct hci_dev *hdev, __u8 status)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001655{
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001656 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001657
1658 if (status) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001659 hci_conn_check_pending(hdev);
Johan Hedberg314b2382011-04-27 10:29:57 -04001660 return;
1661 }
1662
Andre Guedes89352e72011-11-04 14:16:53 -03001663 set_bit(HCI_INQUIRY, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001664}
1665
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001666static void hci_cs_create_conn(struct hci_dev *hdev, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001667{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001668 struct hci_cp_create_conn *cp;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001669 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001670
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001671 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001672
1673 cp = hci_sent_cmd_data(hdev, HCI_OP_CREATE_CONN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001674 if (!cp)
1675 return;
1676
1677 hci_dev_lock(hdev);
1678
1679 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
1680
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03001681 BT_DBG("%s bdaddr %pMR hcon %p", hdev->name, &cp->bdaddr, conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001682
1683 if (status) {
1684 if (conn && conn->state == BT_CONNECT) {
Marcel Holtmann4c67bc72006-10-15 17:30:56 +02001685 if (status != 0x0c || conn->attempt > 2) {
1686 conn->state = BT_CLOSED;
Johan Hedberg539c4962015-02-18 14:53:57 +02001687 hci_connect_cfm(conn, status);
Marcel Holtmann4c67bc72006-10-15 17:30:56 +02001688 hci_conn_del(conn);
1689 } else
1690 conn->state = BT_CONNECT2;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001691 }
1692 } else {
1693 if (!conn) {
Johan Hedberga5c4e302014-07-16 11:56:07 +03001694 conn = hci_conn_add(hdev, ACL_LINK, &cp->bdaddr,
1695 HCI_ROLE_MASTER);
1696 if (!conn)
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001697 bt_dev_err(hdev, "no memory for new connection");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001698 }
1699 }
1700
1701 hci_dev_unlock(hdev);
1702}
1703
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001704static void hci_cs_add_sco(struct hci_dev *hdev, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001705{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001706 struct hci_cp_add_sco *cp;
1707 struct hci_conn *acl, *sco;
1708 __u16 handle;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001709
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001710 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001711
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001712 if (!status)
1713 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001714
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001715 cp = hci_sent_cmd_data(hdev, HCI_OP_ADD_SCO);
1716 if (!cp)
1717 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001718
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001719 handle = __le16_to_cpu(cp->handle);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001720
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001721 BT_DBG("%s handle 0x%4.4x", hdev->name, handle);
Marcel Holtmann6bd57412006-11-18 22:14:22 +01001722
1723 hci_dev_lock(hdev);
1724
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001725 acl = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001726 if (acl) {
1727 sco = acl->link;
1728 if (sco) {
1729 sco->state = BT_CLOSED;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001730
Johan Hedberg539c4962015-02-18 14:53:57 +02001731 hci_connect_cfm(sco, status);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001732 hci_conn_del(sco);
1733 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001734 }
Marcel Holtmann6bd57412006-11-18 22:14:22 +01001735
1736 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001737}
1738
Marcel Holtmannf8558552008-07-14 20:13:49 +02001739static void hci_cs_auth_requested(struct hci_dev *hdev, __u8 status)
1740{
1741 struct hci_cp_auth_requested *cp;
1742 struct hci_conn *conn;
1743
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001744 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001745
1746 if (!status)
1747 return;
1748
1749 cp = hci_sent_cmd_data(hdev, HCI_OP_AUTH_REQUESTED);
1750 if (!cp)
1751 return;
1752
1753 hci_dev_lock(hdev);
1754
1755 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1756 if (conn) {
1757 if (conn->state == BT_CONFIG) {
Johan Hedberg539c4962015-02-18 14:53:57 +02001758 hci_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001759 hci_conn_drop(conn);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001760 }
1761 }
1762
1763 hci_dev_unlock(hdev);
1764}
1765
1766static void hci_cs_set_conn_encrypt(struct hci_dev *hdev, __u8 status)
1767{
1768 struct hci_cp_set_conn_encrypt *cp;
1769 struct hci_conn *conn;
1770
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001771 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001772
1773 if (!status)
1774 return;
1775
1776 cp = hci_sent_cmd_data(hdev, HCI_OP_SET_CONN_ENCRYPT);
1777 if (!cp)
1778 return;
1779
1780 hci_dev_lock(hdev);
1781
1782 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1783 if (conn) {
1784 if (conn->state == BT_CONFIG) {
Johan Hedberg539c4962015-02-18 14:53:57 +02001785 hci_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001786 hci_conn_drop(conn);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001787 }
1788 }
1789
1790 hci_dev_unlock(hdev);
1791}
1792
Johan Hedberg127178d2010-11-18 22:22:29 +02001793static int hci_outgoing_auth_needed(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -03001794 struct hci_conn *conn)
Johan Hedberg392599b2010-11-18 22:22:28 +02001795{
Johan Hedberg392599b2010-11-18 22:22:28 +02001796 if (conn->state != BT_CONFIG || !conn->out)
1797 return 0;
1798
Johan Hedberg765c2a92011-01-19 12:06:52 +05301799 if (conn->pending_sec_level == BT_SECURITY_SDP)
Johan Hedberg392599b2010-11-18 22:22:28 +02001800 return 0;
1801
1802 /* Only request authentication for SSP connections or non-SSP
Johan Hedberg264b8b42014-01-08 16:40:39 +02001803 * devices with sec_level MEDIUM or HIGH or if MITM protection
1804 * is requested.
1805 */
Gustavo Padovan807deac2012-05-17 00:36:24 -03001806 if (!hci_conn_ssp_enabled(conn) && !(conn->auth_type & 0x01) &&
Johan Hedberg7e3691e2014-05-30 14:45:19 +03001807 conn->pending_sec_level != BT_SECURITY_FIPS &&
Johan Hedberg264b8b42014-01-08 16:40:39 +02001808 conn->pending_sec_level != BT_SECURITY_HIGH &&
1809 conn->pending_sec_level != BT_SECURITY_MEDIUM)
Johan Hedberg392599b2010-11-18 22:22:28 +02001810 return 0;
1811
Johan Hedberg392599b2010-11-18 22:22:28 +02001812 return 1;
1813}
1814
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001815static int hci_resolve_name(struct hci_dev *hdev,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001816 struct inquiry_entry *e)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001817{
1818 struct hci_cp_remote_name_req cp;
1819
1820 memset(&cp, 0, sizeof(cp));
1821
1822 bacpy(&cp.bdaddr, &e->data.bdaddr);
1823 cp.pscan_rep_mode = e->data.pscan_rep_mode;
1824 cp.pscan_mode = e->data.pscan_mode;
1825 cp.clock_offset = e->data.clock_offset;
1826
1827 return hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
1828}
1829
Johan Hedbergb644ba32012-01-17 21:48:47 +02001830static bool hci_resolve_next_name(struct hci_dev *hdev)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001831{
1832 struct discovery_state *discov = &hdev->discovery;
1833 struct inquiry_entry *e;
1834
Johan Hedbergb644ba32012-01-17 21:48:47 +02001835 if (list_empty(&discov->resolve))
1836 return false;
1837
1838 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
Ram Malovanyc8100892012-07-19 10:26:09 +03001839 if (!e)
1840 return false;
1841
Johan Hedbergb644ba32012-01-17 21:48:47 +02001842 if (hci_resolve_name(hdev, e) == 0) {
1843 e->name_state = NAME_PENDING;
1844 return true;
1845 }
1846
1847 return false;
1848}
1849
1850static void hci_check_pending_name(struct hci_dev *hdev, struct hci_conn *conn,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001851 bdaddr_t *bdaddr, u8 *name, u8 name_len)
Johan Hedbergb644ba32012-01-17 21:48:47 +02001852{
1853 struct discovery_state *discov = &hdev->discovery;
1854 struct inquiry_entry *e;
1855
Johan Hedberg60cb49d2014-11-11 11:33:24 +02001856 /* Update the mgmt connected state if necessary. Be careful with
1857 * conn objects that exist but are not (yet) connected however.
1858 * Only those in BT_CONFIG or BT_CONNECTED states can be
1859 * considered connected.
1860 */
1861 if (conn &&
1862 (conn->state == BT_CONFIG || conn->state == BT_CONNECTED) &&
Jaganath Kanakkasserycb77c3e2014-11-07 16:39:09 +05301863 !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00001864 mgmt_device_connected(hdev, conn, 0, name, name_len);
Johan Hedbergb644ba32012-01-17 21:48:47 +02001865
1866 if (discov->state == DISCOVERY_STOPPED)
1867 return;
1868
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001869 if (discov->state == DISCOVERY_STOPPING)
1870 goto discov_complete;
1871
1872 if (discov->state != DISCOVERY_RESOLVING)
1873 return;
1874
1875 e = hci_inquiry_cache_lookup_resolve(hdev, bdaddr, NAME_PENDING);
Ram Malovany7cc83802012-07-19 10:26:10 +03001876 /* If the device was not found in a list of found devices names of which
1877 * are pending. there is no need to continue resolving a next name as it
1878 * will be done upon receiving another Remote Name Request Complete
1879 * Event */
1880 if (!e)
1881 return;
1882
1883 list_del(&e->list);
1884 if (name) {
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001885 e->name_state = NAME_KNOWN;
Ram Malovany7cc83802012-07-19 10:26:10 +03001886 mgmt_remote_name(hdev, bdaddr, ACL_LINK, 0x00,
1887 e->data.rssi, name, name_len);
Ram Malovanyc3e7c0d2012-07-19 10:26:11 +03001888 } else {
1889 e->name_state = NAME_NOT_KNOWN;
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001890 }
1891
Johan Hedbergb644ba32012-01-17 21:48:47 +02001892 if (hci_resolve_next_name(hdev))
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001893 return;
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001894
1895discov_complete:
1896 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
1897}
1898
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001899static void hci_cs_remote_name_req(struct hci_dev *hdev, __u8 status)
1900{
Johan Hedberg127178d2010-11-18 22:22:29 +02001901 struct hci_cp_remote_name_req *cp;
1902 struct hci_conn *conn;
1903
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001904 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Johan Hedberg127178d2010-11-18 22:22:29 +02001905
1906 /* If successful wait for the name req complete event before
1907 * checking for the need to do authentication */
1908 if (!status)
1909 return;
1910
1911 cp = hci_sent_cmd_data(hdev, HCI_OP_REMOTE_NAME_REQ);
1912 if (!cp)
1913 return;
1914
1915 hci_dev_lock(hdev);
1916
1917 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02001918
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001919 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedbergb644ba32012-01-17 21:48:47 +02001920 hci_check_pending_name(hdev, conn, &cp->bdaddr, NULL, 0);
1921
Johan Hedberg79c6c702011-04-28 11:28:55 -07001922 if (!conn)
1923 goto unlock;
1924
1925 if (!hci_outgoing_auth_needed(hdev, conn))
1926 goto unlock;
1927
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001928 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02001929 struct hci_cp_auth_requested auth_cp;
1930
Johan Hedberg977f8fc2014-07-17 15:35:39 +03001931 set_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags);
1932
Johannes Bergc1f23a22013-10-07 18:19:16 +02001933 auth_cp.handle = __cpu_to_le16(conn->handle);
1934 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED,
1935 sizeof(auth_cp), &auth_cp);
Johan Hedberg127178d2010-11-18 22:22:29 +02001936 }
1937
Johan Hedberg79c6c702011-04-28 11:28:55 -07001938unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02001939 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001940}
1941
Marcel Holtmann769be972008-07-14 20:13:49 +02001942static void hci_cs_read_remote_features(struct hci_dev *hdev, __u8 status)
1943{
1944 struct hci_cp_read_remote_features *cp;
1945 struct hci_conn *conn;
1946
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001947 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann769be972008-07-14 20:13:49 +02001948
1949 if (!status)
1950 return;
1951
1952 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_REMOTE_FEATURES);
1953 if (!cp)
1954 return;
1955
1956 hci_dev_lock(hdev);
1957
1958 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1959 if (conn) {
1960 if (conn->state == BT_CONFIG) {
Johan Hedberg539c4962015-02-18 14:53:57 +02001961 hci_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001962 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02001963 }
1964 }
1965
1966 hci_dev_unlock(hdev);
1967}
1968
1969static void hci_cs_read_remote_ext_features(struct hci_dev *hdev, __u8 status)
1970{
1971 struct hci_cp_read_remote_ext_features *cp;
1972 struct hci_conn *conn;
1973
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001974 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann769be972008-07-14 20:13:49 +02001975
1976 if (!status)
1977 return;
1978
1979 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES);
1980 if (!cp)
1981 return;
1982
1983 hci_dev_lock(hdev);
1984
1985 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1986 if (conn) {
1987 if (conn->state == BT_CONFIG) {
Johan Hedberg539c4962015-02-18 14:53:57 +02001988 hci_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001989 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02001990 }
1991 }
1992
1993 hci_dev_unlock(hdev);
1994}
1995
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001996static void hci_cs_setup_sync_conn(struct hci_dev *hdev, __u8 status)
1997{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001998 struct hci_cp_setup_sync_conn *cp;
1999 struct hci_conn *acl, *sco;
2000 __u16 handle;
2001
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002002 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002003
2004 if (!status)
2005 return;
2006
2007 cp = hci_sent_cmd_data(hdev, HCI_OP_SETUP_SYNC_CONN);
2008 if (!cp)
2009 return;
2010
2011 handle = __le16_to_cpu(cp->handle);
2012
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002013 BT_DBG("%s handle 0x%4.4x", hdev->name, handle);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002014
2015 hci_dev_lock(hdev);
2016
2017 acl = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02002018 if (acl) {
2019 sco = acl->link;
2020 if (sco) {
2021 sco->state = BT_CLOSED;
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002022
Johan Hedberg539c4962015-02-18 14:53:57 +02002023 hci_connect_cfm(sco, status);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02002024 hci_conn_del(sco);
2025 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002026 }
2027
2028 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002029}
2030
2031static void hci_cs_sniff_mode(struct hci_dev *hdev, __u8 status)
2032{
2033 struct hci_cp_sniff_mode *cp;
2034 struct hci_conn *conn;
2035
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002036 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002037
2038 if (!status)
2039 return;
2040
2041 cp = hci_sent_cmd_data(hdev, HCI_OP_SNIFF_MODE);
2042 if (!cp)
2043 return;
2044
2045 hci_dev_lock(hdev);
2046
2047 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
Marcel Holtmanne73439d2010-07-26 10:06:00 -04002048 if (conn) {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002049 clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002050
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002051 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04002052 hci_sco_setup(conn, status);
2053 }
2054
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002055 hci_dev_unlock(hdev);
2056}
2057
2058static void hci_cs_exit_sniff_mode(struct hci_dev *hdev, __u8 status)
2059{
2060 struct hci_cp_exit_sniff_mode *cp;
2061 struct hci_conn *conn;
2062
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002063 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002064
2065 if (!status)
2066 return;
2067
2068 cp = hci_sent_cmd_data(hdev, HCI_OP_EXIT_SNIFF_MODE);
2069 if (!cp)
2070 return;
2071
2072 hci_dev_lock(hdev);
2073
2074 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
Marcel Holtmanne73439d2010-07-26 10:06:00 -04002075 if (conn) {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002076 clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002077
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002078 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04002079 hci_sco_setup(conn, status);
2080 }
2081
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002082 hci_dev_unlock(hdev);
2083}
2084
Johan Hedberg88c3df12012-02-09 14:27:38 +02002085static void hci_cs_disconnect(struct hci_dev *hdev, u8 status)
2086{
2087 struct hci_cp_disconnect *cp;
2088 struct hci_conn *conn;
2089
2090 if (!status)
2091 return;
2092
2093 cp = hci_sent_cmd_data(hdev, HCI_OP_DISCONNECT);
2094 if (!cp)
2095 return;
2096
2097 hci_dev_lock(hdev);
2098
2099 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
2100 if (conn)
2101 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002102 conn->dst_type, status);
Johan Hedberg88c3df12012-02-09 14:27:38 +02002103
2104 hci_dev_unlock(hdev);
2105}
2106
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05302107static void cs_le_create_conn(struct hci_dev *hdev, bdaddr_t *peer_addr,
2108 u8 peer_addr_type, u8 own_address_type,
2109 u8 filter_policy)
2110{
2111 struct hci_conn *conn;
2112
2113 conn = hci_conn_hash_lookup_le(hdev, peer_addr,
2114 peer_addr_type);
2115 if (!conn)
2116 return;
2117
2118 /* Store the initiator and responder address information which
2119 * is needed for SMP. These values will not change during the
2120 * lifetime of the connection.
2121 */
2122 conn->init_addr_type = own_address_type;
2123 if (own_address_type == ADDR_LE_DEV_RANDOM)
2124 bacpy(&conn->init_addr, &hdev->random_addr);
2125 else
2126 bacpy(&conn->init_addr, &hdev->bdaddr);
2127
2128 conn->resp_addr_type = peer_addr_type;
2129 bacpy(&conn->resp_addr, peer_addr);
2130
2131 /* We don't want the connection attempt to stick around
2132 * indefinitely since LE doesn't have a page timeout concept
2133 * like BR/EDR. Set a timer for any connection that doesn't use
2134 * the white list for connecting.
2135 */
2136 if (filter_policy == HCI_LE_USE_PEER_ADDR)
2137 queue_delayed_work(conn->hdev->workqueue,
2138 &conn->le_conn_timeout,
2139 conn->conn_timeout);
2140}
2141
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02002142static void hci_cs_le_create_conn(struct hci_dev *hdev, u8 status)
2143{
2144 struct hci_cp_le_create_conn *cp;
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02002145
2146 BT_DBG("%s status 0x%2.2x", hdev->name, status);
2147
2148 /* All connection failure handling is taken care of by the
2149 * hci_le_conn_failed function which is triggered by the HCI
2150 * request completion callbacks used for connecting.
2151 */
2152 if (status)
2153 return;
2154
2155 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_CREATE_CONN);
2156 if (!cp)
2157 return;
2158
2159 hci_dev_lock(hdev);
2160
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05302161 cs_le_create_conn(hdev, &cp->peer_addr, cp->peer_addr_type,
2162 cp->own_address_type, cp->filter_policy);
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02002163
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02002164 hci_dev_unlock(hdev);
2165}
2166
Jaganath Kanakkassery4d94f952018-07-06 22:50:32 +02002167static void hci_cs_le_ext_create_conn(struct hci_dev *hdev, u8 status)
2168{
2169 struct hci_cp_le_ext_create_conn *cp;
2170
2171 BT_DBG("%s status 0x%2.2x", hdev->name, status);
2172
2173 /* All connection failure handling is taken care of by the
2174 * hci_le_conn_failed function which is triggered by the HCI
2175 * request completion callbacks used for connecting.
2176 */
2177 if (status)
2178 return;
2179
2180 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_EXT_CREATE_CONN);
2181 if (!cp)
2182 return;
2183
2184 hci_dev_lock(hdev);
2185
2186 cs_le_create_conn(hdev, &cp->peer_addr, cp->peer_addr_type,
2187 cp->own_addr_type, cp->filter_policy);
2188
2189 hci_dev_unlock(hdev);
2190}
2191
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07002192static void hci_cs_le_read_remote_features(struct hci_dev *hdev, u8 status)
2193{
2194 struct hci_cp_le_read_remote_features *cp;
2195 struct hci_conn *conn;
2196
2197 BT_DBG("%s status 0x%2.2x", hdev->name, status);
2198
2199 if (!status)
2200 return;
2201
2202 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_READ_REMOTE_FEATURES);
2203 if (!cp)
2204 return;
2205
2206 hci_dev_lock(hdev);
2207
2208 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
2209 if (conn) {
2210 if (conn->state == BT_CONFIG) {
2211 hci_connect_cfm(conn, status);
2212 hci_conn_drop(conn);
2213 }
2214 }
2215
2216 hci_dev_unlock(hdev);
2217}
2218
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02002219static void hci_cs_le_start_enc(struct hci_dev *hdev, u8 status)
2220{
2221 struct hci_cp_le_start_enc *cp;
2222 struct hci_conn *conn;
2223
2224 BT_DBG("%s status 0x%2.2x", hdev->name, status);
2225
2226 if (!status)
2227 return;
2228
2229 hci_dev_lock(hdev);
2230
2231 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_START_ENC);
2232 if (!cp)
2233 goto unlock;
2234
2235 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
2236 if (!conn)
2237 goto unlock;
2238
2239 if (conn->state != BT_CONNECTED)
2240 goto unlock;
2241
2242 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
2243 hci_conn_drop(conn);
2244
2245unlock:
2246 hci_dev_unlock(hdev);
2247}
2248
Kuba Pawlak50fc85f2014-11-06 19:36:52 +01002249static void hci_cs_switch_role(struct hci_dev *hdev, u8 status)
2250{
2251 struct hci_cp_switch_role *cp;
2252 struct hci_conn *conn;
2253
2254 BT_DBG("%s status 0x%2.2x", hdev->name, status);
2255
2256 if (!status)
2257 return;
2258
2259 cp = hci_sent_cmd_data(hdev, HCI_OP_SWITCH_ROLE);
2260 if (!cp)
2261 return;
2262
2263 hci_dev_lock(hdev);
2264
2265 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
2266 if (conn)
2267 clear_bit(HCI_CONN_RSWITCH_PEND, &conn->flags);
2268
2269 hci_dev_unlock(hdev);
2270}
2271
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002272static void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002273{
2274 __u8 status = *((__u8 *) skb->data);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002275 struct discovery_state *discov = &hdev->discovery;
2276 struct inquiry_entry *e;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002277
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002278 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002279
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002280 hci_conn_check_pending(hdev);
Andre Guedes89352e72011-11-04 14:16:53 -03002281
2282 if (!test_and_clear_bit(HCI_INQUIRY, &hdev->flags))
2283 return;
2284
Peter Zijlstra4e857c52014-03-17 18:06:10 +01002285 smp_mb__after_atomic(); /* wake_up_bit advises about this barrier */
Andre Guedes3e13fa12013-03-27 20:04:56 -03002286 wake_up_bit(&hdev->flags, HCI_INQUIRY);
2287
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002288 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002289 return;
2290
Johan Hedberg56e5cb82011-11-08 20:40:16 +02002291 hci_dev_lock(hdev);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002292
Andre Guedes343f9352012-02-17 20:39:37 -03002293 if (discov->state != DISCOVERY_FINDING)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002294 goto unlock;
2295
2296 if (list_empty(&discov->resolve)) {
Jakub Pawlowski07d23342015-03-17 09:04:14 -07002297 /* When BR/EDR inquiry is active and no LE scanning is in
2298 * progress, then change discovery state to indicate completion.
2299 *
2300 * When running LE scanning and BR/EDR inquiry simultaneously
2301 * and the LE scan already finished, then change the discovery
2302 * state to indicate completion.
2303 */
2304 if (!hci_dev_test_flag(hdev, HCI_LE_SCAN) ||
2305 !test_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks))
2306 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002307 goto unlock;
2308 }
2309
2310 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
2311 if (e && hci_resolve_name(hdev, e) == 0) {
2312 e->name_state = NAME_PENDING;
2313 hci_discovery_set_state(hdev, DISCOVERY_RESOLVING);
2314 } else {
Jakub Pawlowski07d23342015-03-17 09:04:14 -07002315 /* When BR/EDR inquiry is active and no LE scanning is in
2316 * progress, then change discovery state to indicate completion.
2317 *
2318 * When running LE scanning and BR/EDR inquiry simultaneously
2319 * and the LE scan already finished, then change the discovery
2320 * state to indicate completion.
2321 */
2322 if (!hci_dev_test_flag(hdev, HCI_LE_SCAN) ||
2323 !test_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks))
2324 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002325 }
2326
2327unlock:
Johan Hedberg56e5cb82011-11-08 20:40:16 +02002328 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002329}
2330
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002331static void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002332{
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002333 struct inquiry_data data;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002334 struct inquiry_info *info = (void *) (skb->data + 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002335 int num_rsp = *((__u8 *) skb->data);
2336
2337 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
2338
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002339 if (!num_rsp)
2340 return;
2341
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002342 if (hci_dev_test_flag(hdev, HCI_PERIODIC_INQ))
Andre Guedes1519cc12012-03-21 00:03:38 -03002343 return;
2344
Linus Torvalds1da177e2005-04-16 15:20:36 -07002345 hci_dev_lock(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002346
Johan Hedberge17acd42011-03-30 23:57:16 +03002347 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02002348 u32 flags;
Johan Hedberg31754052012-01-04 13:39:52 +02002349
Linus Torvalds1da177e2005-04-16 15:20:36 -07002350 bacpy(&data.bdaddr, &info->bdaddr);
2351 data.pscan_rep_mode = info->pscan_rep_mode;
2352 data.pscan_period_mode = info->pscan_period_mode;
2353 data.pscan_mode = info->pscan_mode;
2354 memcpy(data.dev_class, info->dev_class, 3);
2355 data.clock_offset = info->clock_offset;
Marcel Holtmannefb25132014-12-05 13:03:34 +01002356 data.rssi = HCI_RSSI_INVALID;
Marcel Holtmann41a96212008-07-14 20:13:48 +02002357 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02002358
Marcel Holtmannaf589252014-07-01 14:11:20 +02002359 flags = hci_inquiry_cache_update(hdev, &data, false);
2360
Johan Hedberg48264f02011-11-09 13:58:58 +02002361 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Marcel Holtmannefb25132014-12-05 13:03:34 +01002362 info->dev_class, HCI_RSSI_INVALID,
2363 flags, NULL, 0, NULL, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002364 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002365
Linus Torvalds1da177e2005-04-16 15:20:36 -07002366 hci_dev_unlock(hdev);
2367}
2368
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002369static void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002370{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002371 struct hci_ev_conn_complete *ev = (void *) skb->data;
2372 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002373
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002374 BT_DBG("%s", hdev->name);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002375
Linus Torvalds1da177e2005-04-16 15:20:36 -07002376 hci_dev_lock(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002377
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002378 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann94992372009-04-19 19:30:03 +02002379 if (!conn) {
2380 if (ev->link_type != SCO_LINK)
2381 goto unlock;
2382
2383 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
2384 if (!conn)
2385 goto unlock;
2386
2387 conn->type = SCO_LINK;
2388 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002389
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002390 if (!ev->status) {
2391 conn->handle = __le16_to_cpu(ev->handle);
Marcel Holtmann769be972008-07-14 20:13:49 +02002392
2393 if (conn->type == ACL_LINK) {
2394 conn->state = BT_CONFIG;
2395 hci_conn_hold(conn);
Szymon Janca9ea3ed2012-07-19 14:46:08 +02002396
2397 if (!conn->out && !hci_conn_ssp_enabled(conn) &&
2398 !hci_find_link_key(hdev, &ev->bdaddr))
2399 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
2400 else
2401 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
Marcel Holtmann769be972008-07-14 20:13:49 +02002402 } else
2403 conn->state = BT_CONNECTED;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002404
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01002405 hci_debugfs_create_conn(conn);
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02002406 hci_conn_add_sysfs(conn);
2407
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002408 if (test_bit(HCI_AUTH, &hdev->flags))
Johan Hedberg4dae2792014-06-24 17:03:50 +03002409 set_bit(HCI_CONN_AUTH, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002410
2411 if (test_bit(HCI_ENCRYPT, &hdev->flags))
Johan Hedberg4dae2792014-06-24 17:03:50 +03002412 set_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002413
2414 /* Get remote features */
2415 if (conn->type == ACL_LINK) {
2416 struct hci_cp_read_remote_features cp;
2417 cp.handle = ev->handle;
Marcel Holtmann769be972008-07-14 20:13:49 +02002418 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_FEATURES,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002419 sizeof(cp), &cp);
Johan Hedberg22f433d2014-08-01 11:13:32 +03002420
Johan Hedberg01b1cb82015-11-16 12:52:21 +02002421 hci_req_update_scan(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002422 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002423
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002424 /* Set packet type for incoming connection */
Andrei Emeltchenkod095c1e2011-12-01 14:33:27 +02002425 if (!conn->out && hdev->hci_ver < BLUETOOTH_VER_2_0) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002426 struct hci_cp_change_conn_ptype cp;
2427 cp.handle = ev->handle;
Marcel Holtmanna8746412008-07-14 20:13:46 +02002428 cp.pkt_type = cpu_to_le16(conn->pkt_type);
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002429 hci_send_cmd(hdev, HCI_OP_CHANGE_CONN_PTYPE, sizeof(cp),
2430 &cp);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002431 }
Johan Hedberg17d5c042011-01-22 06:09:08 +02002432 } else {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002433 conn->state = BT_CLOSED;
Johan Hedberg17d5c042011-01-22 06:09:08 +02002434 if (conn->type == ACL_LINK)
Marcel Holtmann64c7b772014-02-18 14:22:20 -08002435 mgmt_connect_failed(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002436 conn->dst_type, ev->status);
Johan Hedberg17d5c042011-01-22 06:09:08 +02002437 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002438
Marcel Holtmanne73439d2010-07-26 10:06:00 -04002439 if (conn->type == ACL_LINK)
2440 hci_sco_setup(conn, ev->status);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002441
Marcel Holtmann769be972008-07-14 20:13:49 +02002442 if (ev->status) {
Johan Hedberg539c4962015-02-18 14:53:57 +02002443 hci_connect_cfm(conn, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002444 hci_conn_del(conn);
Marcel Holtmannc89b6e62009-01-15 21:57:03 +01002445 } else if (ev->link_type != ACL_LINK)
Johan Hedberg539c4962015-02-18 14:53:57 +02002446 hci_connect_cfm(conn, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002447
2448unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002449 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002450
2451 hci_conn_check_pending(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002452}
2453
Johan Hedberg70c46422014-07-09 12:59:17 +03002454static void hci_reject_conn(struct hci_dev *hdev, bdaddr_t *bdaddr)
2455{
2456 struct hci_cp_reject_conn_req cp;
2457
2458 bacpy(&cp.bdaddr, bdaddr);
2459 cp.reason = HCI_ERROR_REJ_BAD_ADDR;
2460 hci_send_cmd(hdev, HCI_OP_REJECT_CONN_REQ, sizeof(cp), &cp);
2461}
2462
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002463static void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002464{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002465 struct hci_ev_conn_request *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002466 int mask = hdev->link_mode;
Johan Hedberg70c46422014-07-09 12:59:17 +03002467 struct inquiry_entry *ie;
2468 struct hci_conn *conn;
Frédéric Dalleau20714bfe2012-11-21 10:51:12 +01002469 __u8 flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002470
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03002471 BT_DBG("%s bdaddr %pMR type 0x%x", hdev->name, &ev->bdaddr,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002472 ev->link_type);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002473
Frédéric Dalleau20714bfe2012-11-21 10:51:12 +01002474 mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, ev->link_type,
2475 &flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002476
Johan Hedberg70c46422014-07-09 12:59:17 +03002477 if (!(mask & HCI_LM_ACCEPT)) {
2478 hci_reject_conn(hdev, &ev->bdaddr);
2479 return;
2480 }
2481
Johan Hedberg46c4c942014-07-16 16:19:21 +03002482 if (hci_bdaddr_list_lookup(&hdev->blacklist, &ev->bdaddr,
2483 BDADDR_BREDR)) {
2484 hci_reject_conn(hdev, &ev->bdaddr);
2485 return;
2486 }
2487
Johan Hedberg6a8fc952014-12-24 20:43:11 +02002488 /* Require HCI_CONNECTABLE or a whitelist entry to accept the
2489 * connection. These features are only touched through mgmt so
2490 * only do the checks if HCI_MGMT is set.
2491 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002492 if (hci_dev_test_flag(hdev, HCI_MGMT) &&
2493 !hci_dev_test_flag(hdev, HCI_CONNECTABLE) &&
Johan Hedberg46c4c942014-07-16 16:19:21 +03002494 !hci_bdaddr_list_lookup(&hdev->whitelist, &ev->bdaddr,
2495 BDADDR_BREDR)) {
2496 hci_reject_conn(hdev, &ev->bdaddr);
2497 return;
Johan Hedberg70c46422014-07-09 12:59:17 +03002498 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002499
Johan Hedberg70c46422014-07-09 12:59:17 +03002500 /* Connection accepted */
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002501
Johan Hedberg70c46422014-07-09 12:59:17 +03002502 hci_dev_lock(hdev);
Marcel Holtmannc7bdd502008-07-14 20:13:47 +02002503
Johan Hedberg70c46422014-07-09 12:59:17 +03002504 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
2505 if (ie)
2506 memcpy(ie->data.dev_class, ev->dev_class, 3);
2507
2508 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type,
2509 &ev->bdaddr);
2510 if (!conn) {
Johan Hedberga5c4e302014-07-16 11:56:07 +03002511 conn = hci_conn_add(hdev, ev->link_type, &ev->bdaddr,
2512 HCI_ROLE_SLAVE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002513 if (!conn) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002514 bt_dev_err(hdev, "no memory for new connection");
Johan Hedberg70c46422014-07-09 12:59:17 +03002515 hci_dev_unlock(hdev);
2516 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002517 }
Johan Hedberg70c46422014-07-09 12:59:17 +03002518 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002519
Johan Hedberg70c46422014-07-09 12:59:17 +03002520 memcpy(conn->dev_class, ev->dev_class, 3);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002521
Johan Hedberg70c46422014-07-09 12:59:17 +03002522 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002523
Johan Hedberg70c46422014-07-09 12:59:17 +03002524 if (ev->link_type == ACL_LINK ||
2525 (!(flags & HCI_PROTO_DEFER) && !lmp_esco_capable(hdev))) {
2526 struct hci_cp_accept_conn_req cp;
2527 conn->state = BT_CONNECT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002528
2529 bacpy(&cp.bdaddr, &ev->bdaddr);
Johan Hedberg70c46422014-07-09 12:59:17 +03002530
2531 if (lmp_rswitch_capable(hdev) && (mask & HCI_LM_MASTER))
2532 cp.role = 0x00; /* Become master */
2533 else
2534 cp.role = 0x01; /* Remain slave */
2535
2536 hci_send_cmd(hdev, HCI_OP_ACCEPT_CONN_REQ, sizeof(cp), &cp);
2537 } else if (!(flags & HCI_PROTO_DEFER)) {
2538 struct hci_cp_accept_sync_conn_req cp;
2539 conn->state = BT_CONNECT;
2540
2541 bacpy(&cp.bdaddr, &ev->bdaddr);
2542 cp.pkt_type = cpu_to_le16(conn->pkt_type);
2543
2544 cp.tx_bandwidth = cpu_to_le32(0x00001f40);
2545 cp.rx_bandwidth = cpu_to_le32(0x00001f40);
2546 cp.max_latency = cpu_to_le16(0xffff);
2547 cp.content_format = cpu_to_le16(hdev->voice_setting);
2548 cp.retrans_effort = 0xff;
2549
2550 hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ, sizeof(cp),
2551 &cp);
2552 } else {
2553 conn->state = BT_CONNECT2;
Johan Hedberg539c4962015-02-18 14:53:57 +02002554 hci_connect_cfm(conn, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002555 }
2556}
2557
Mikel Astizf0d6a0e2012-08-09 09:52:30 +02002558static u8 hci_to_mgmt_reason(u8 err)
2559{
2560 switch (err) {
2561 case HCI_ERROR_CONNECTION_TIMEOUT:
2562 return MGMT_DEV_DISCONN_TIMEOUT;
2563 case HCI_ERROR_REMOTE_USER_TERM:
2564 case HCI_ERROR_REMOTE_LOW_RESOURCES:
2565 case HCI_ERROR_REMOTE_POWER_OFF:
2566 return MGMT_DEV_DISCONN_REMOTE;
2567 case HCI_ERROR_LOCAL_HOST_TERM:
2568 return MGMT_DEV_DISCONN_LOCAL_HOST;
2569 default:
2570 return MGMT_DEV_DISCONN_UNKNOWN;
2571 }
2572}
2573
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002574static void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002575{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002576 struct hci_ev_disconn_complete *ev = (void *) skb->data;
Szymon Janc160b9252016-07-12 02:12:16 +02002577 u8 reason;
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002578 struct hci_conn_params *params;
Marcel Holtmann04837f62006-07-03 10:02:33 +02002579 struct hci_conn *conn;
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002580 bool mgmt_connected;
Andre Guedes38462202013-11-07 17:36:10 -03002581 u8 type;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002582
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002583 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002584
Linus Torvalds1da177e2005-04-16 15:20:36 -07002585 hci_dev_lock(hdev);
2586
Marcel Holtmann04837f62006-07-03 10:02:33 +02002587 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergf7520542011-01-20 12:34:39 +02002588 if (!conn)
2589 goto unlock;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02002590
Andre Guedesabf54a52013-11-07 17:36:09 -03002591 if (ev->status) {
2592 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
2593 conn->dst_type, ev->status);
2594 goto unlock;
Johan Hedberg37d9ef72011-11-10 15:54:39 +02002595 }
Johan Hedbergf7520542011-01-20 12:34:39 +02002596
Andre Guedes38462202013-11-07 17:36:10 -03002597 conn->state = BT_CLOSED;
2598
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002599 mgmt_connected = test_and_clear_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags);
Szymon Janc160b9252016-07-12 02:12:16 +02002600
2601 if (test_bit(HCI_CONN_AUTH_FAILURE, &conn->flags))
2602 reason = MGMT_DEV_DISCONN_AUTH_FAILURE;
2603 else
2604 reason = hci_to_mgmt_reason(ev->reason);
2605
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002606 mgmt_device_disconnected(hdev, &conn->dst, conn->type, conn->dst_type,
2607 reason, mgmt_connected);
Andre Guedesabf54a52013-11-07 17:36:09 -03002608
Johan Hedberg22f433d2014-08-01 11:13:32 +03002609 if (conn->type == ACL_LINK) {
2610 if (test_bit(HCI_CONN_FLUSH_KEY, &conn->flags))
2611 hci_remove_link_key(hdev, &conn->dst);
2612
Johan Hedberg01b1cb82015-11-16 12:52:21 +02002613 hci_req_update_scan(hdev);
Johan Hedberg22f433d2014-08-01 11:13:32 +03002614 }
Johan Hedberg22102462013-10-05 12:01:06 +02002615
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002616 params = hci_conn_params_lookup(hdev, &conn->dst, conn->dst_type);
2617 if (params) {
2618 switch (params->auto_connect) {
2619 case HCI_AUTO_CONN_LINK_LOSS:
2620 if (ev->reason != HCI_ERROR_CONNECTION_TIMEOUT)
2621 break;
2622 /* Fall through */
2623
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02002624 case HCI_AUTO_CONN_DIRECT:
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002625 case HCI_AUTO_CONN_ALWAYS:
Johan Hedberg418025d2014-07-04 12:37:24 +03002626 list_del_init(&params->action);
2627 list_add(&params->action, &hdev->pend_le_conns);
2628 hci_update_background_scan(hdev);
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002629 break;
2630
2631 default:
2632 break;
2633 }
2634 }
2635
Andre Guedes38462202013-11-07 17:36:10 -03002636 type = conn->type;
Johan Hedberg22102462013-10-05 12:01:06 +02002637
Johan Hedberg3a6d5762015-02-18 14:53:58 +02002638 hci_disconn_cfm(conn, ev->reason);
Andre Guedes38462202013-11-07 17:36:10 -03002639 hci_conn_del(conn);
2640
2641 /* Re-enable advertising if necessary, since it might
2642 * have been disabled by the connection. From the
2643 * HCI_LE_Set_Advertise_Enable command description in
2644 * the core specification (v4.0):
2645 * "The Controller shall continue advertising until the Host
2646 * issues an LE_Set_Advertise_Enable command with
2647 * Advertising_Enable set to 0x00 (Advertising is disabled)
2648 * or until a connection is created or until the Advertising
2649 * is timed out due to Directed Advertising."
2650 */
2651 if (type == LE_LINK)
Johan Hedbergf2252572015-11-18 12:49:20 +02002652 hci_req_reenable_advertising(hdev);
Johan Hedbergf7520542011-01-20 12:34:39 +02002653
2654unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002655 hci_dev_unlock(hdev);
2656}
2657
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002658static void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002659{
2660 struct hci_ev_auth_complete *ev = (void *) skb->data;
2661 struct hci_conn *conn;
2662
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002663 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002664
2665 hci_dev_lock(hdev);
2666
2667 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002668 if (!conn)
2669 goto unlock;
2670
2671 if (!ev->status) {
Szymon Janc160b9252016-07-12 02:12:16 +02002672 clear_bit(HCI_CONN_AUTH_FAILURE, &conn->flags);
2673
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002674 if (!hci_conn_ssp_enabled(conn) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03002675 test_bit(HCI_CONN_REAUTH_PEND, &conn->flags)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002676 bt_dev_info(hdev, "re-auth of legacy device is not possible.");
Johan Hedberg2a611692011-02-19 12:06:00 -03002677 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002678 set_bit(HCI_CONN_AUTH, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002679 conn->sec_level = conn->pending_sec_level;
Johan Hedberg2a611692011-02-19 12:06:00 -03002680 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002681 } else {
Szymon Janc160b9252016-07-12 02:12:16 +02002682 if (ev->status == HCI_ERROR_PIN_OR_KEY_MISSING)
2683 set_bit(HCI_CONN_AUTH_FAILURE, &conn->flags);
2684
Johan Hedberge1e930f2014-09-08 17:09:49 -07002685 mgmt_auth_failed(conn, ev->status);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002686 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002687
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002688 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
2689 clear_bit(HCI_CONN_REAUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002690
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002691 if (conn->state == BT_CONFIG) {
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002692 if (!ev->status && hci_conn_ssp_enabled(conn)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002693 struct hci_cp_set_conn_encrypt cp;
2694 cp.handle = ev->handle;
2695 cp.encrypt = 0x01;
2696 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002697 &cp);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002698 } else {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002699 conn->state = BT_CONNECTED;
Johan Hedberg539c4962015-02-18 14:53:57 +02002700 hci_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002701 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002702 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002703 } else {
2704 hci_auth_cfm(conn, ev->status);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002705
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002706 hci_conn_hold(conn);
2707 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02002708 hci_conn_drop(conn);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002709 }
2710
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002711 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002712 if (!ev->status) {
2713 struct hci_cp_set_conn_encrypt cp;
2714 cp.handle = ev->handle;
2715 cp.encrypt = 0x01;
2716 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002717 &cp);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002718 } else {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002719 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002720 hci_encrypt_cfm(conn, ev->status, 0x00);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002721 }
2722 }
2723
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002724unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002725 hci_dev_unlock(hdev);
2726}
2727
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002728static void hci_remote_name_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002729{
Johan Hedberg127178d2010-11-18 22:22:29 +02002730 struct hci_ev_remote_name *ev = (void *) skb->data;
2731 struct hci_conn *conn;
2732
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002733 BT_DBG("%s", hdev->name);
2734
2735 hci_conn_check_pending(hdev);
Johan Hedberg127178d2010-11-18 22:22:29 +02002736
2737 hci_dev_lock(hdev);
2738
2739 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002740
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002741 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedbergb644ba32012-01-17 21:48:47 +02002742 goto check_auth;
2743
2744 if (ev->status == 0)
2745 hci_check_pending_name(hdev, conn, &ev->bdaddr, ev->name,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002746 strnlen(ev->name, HCI_MAX_NAME_LENGTH));
Johan Hedbergb644ba32012-01-17 21:48:47 +02002747 else
2748 hci_check_pending_name(hdev, conn, &ev->bdaddr, NULL, 0);
2749
2750check_auth:
Johan Hedberg79c6c702011-04-28 11:28:55 -07002751 if (!conn)
2752 goto unlock;
2753
2754 if (!hci_outgoing_auth_needed(hdev, conn))
2755 goto unlock;
2756
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002757 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002758 struct hci_cp_auth_requested cp;
Johan Hedberg977f8fc2014-07-17 15:35:39 +03002759
2760 set_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags);
2761
Johan Hedberg127178d2010-11-18 22:22:29 +02002762 cp.handle = __cpu_to_le16(conn->handle);
2763 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED, sizeof(cp), &cp);
2764 }
2765
Johan Hedberg79c6c702011-04-28 11:28:55 -07002766unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02002767 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002768}
2769
Johan Hedberg821f3762015-06-11 13:52:29 +03002770static void read_enc_key_size_complete(struct hci_dev *hdev, u8 status,
2771 u16 opcode, struct sk_buff *skb)
2772{
2773 const struct hci_rp_read_enc_key_size *rp;
2774 struct hci_conn *conn;
2775 u16 handle;
2776
2777 BT_DBG("%s status 0x%02x", hdev->name, status);
2778
2779 if (!skb || skb->len < sizeof(*rp)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002780 bt_dev_err(hdev, "invalid read key size response");
Johan Hedberg821f3762015-06-11 13:52:29 +03002781 return;
2782 }
2783
2784 rp = (void *)skb->data;
2785 handle = le16_to_cpu(rp->handle);
2786
2787 hci_dev_lock(hdev);
2788
2789 conn = hci_conn_hash_lookup_handle(hdev, handle);
2790 if (!conn)
2791 goto unlock;
2792
2793 /* If we fail to read the encryption key size, assume maximum
2794 * (which is the same we do also when this HCI command isn't
2795 * supported.
2796 */
2797 if (rp->status) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002798 bt_dev_err(hdev, "failed to read key size for handle %u",
2799 handle);
Johan Hedberg821f3762015-06-11 13:52:29 +03002800 conn->enc_key_size = HCI_LINK_KEY_SIZE;
2801 } else {
2802 conn->enc_key_size = rp->key_size;
2803 }
2804
2805 if (conn->state == BT_CONFIG) {
2806 conn->state = BT_CONNECTED;
2807 hci_connect_cfm(conn, 0);
2808 hci_conn_drop(conn);
2809 } else {
2810 u8 encrypt;
2811
2812 if (!test_bit(HCI_CONN_ENCRYPT, &conn->flags))
2813 encrypt = 0x00;
Johan Hedberg5d667ef2015-06-12 13:04:47 +03002814 else if (test_bit(HCI_CONN_AES_CCM, &conn->flags))
Johan Hedberg821f3762015-06-11 13:52:29 +03002815 encrypt = 0x02;
2816 else
2817 encrypt = 0x01;
2818
2819 hci_encrypt_cfm(conn, 0, encrypt);
2820 }
2821
2822unlock:
2823 hci_dev_unlock(hdev);
2824}
2825
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002826static void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002827{
2828 struct hci_ev_encrypt_change *ev = (void *) skb->data;
2829 struct hci_conn *conn;
2830
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002831 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002832
2833 hci_dev_lock(hdev);
2834
2835 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002836 if (!conn)
2837 goto unlock;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002838
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002839 if (!ev->status) {
2840 if (ev->encrypt) {
2841 /* Encryption implies authentication */
Johan Hedberg4dae2792014-06-24 17:03:50 +03002842 set_bit(HCI_CONN_AUTH, &conn->flags);
2843 set_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002844 conn->sec_level = conn->pending_sec_level;
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002845
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002846 /* P-256 authentication key implies FIPS */
2847 if (conn->key_type == HCI_LK_AUTH_COMBINATION_P256)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002848 set_bit(HCI_CONN_FIPS, &conn->flags);
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002849
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002850 if ((conn->type == ACL_LINK && ev->encrypt == 0x02) ||
2851 conn->type == LE_LINK)
2852 set_bit(HCI_CONN_AES_CCM, &conn->flags);
2853 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002854 clear_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002855 clear_bit(HCI_CONN_AES_CCM, &conn->flags);
2856 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002857 }
2858
Johan Hedberg7ed3fa22014-09-10 22:16:35 -07002859 /* We should disregard the current RPA and generate a new one
2860 * whenever the encryption procedure fails.
2861 */
Jaganath Kanakkasserya73c0462018-07-19 17:09:45 +05302862 if (ev->status && conn->type == LE_LINK) {
Marcel Holtmanna1536da2015-03-13 02:11:01 -07002863 hci_dev_set_flag(hdev, HCI_RPA_EXPIRED);
Jaganath Kanakkasserya73c0462018-07-19 17:09:45 +05302864 hci_adv_instances_set_rpa_expired(hdev, true);
2865 }
Johan Hedberg7ed3fa22014-09-10 22:16:35 -07002866
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002867 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
2868
2869 if (ev->status && conn->state == BT_CONNECTED) {
Szymon Janc160b9252016-07-12 02:12:16 +02002870 if (ev->status == HCI_ERROR_PIN_OR_KEY_MISSING)
2871 set_bit(HCI_CONN_AUTH_FAILURE, &conn->flags);
2872
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002873 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
2874 hci_conn_drop(conn);
2875 goto unlock;
2876 }
2877
Johan Hedberg035ad622015-06-11 13:52:28 +03002878 /* In Secure Connections Only mode, do not allow any connections
2879 * that are not encrypted with AES-CCM using a P-256 authenticated
2880 * combination key.
2881 */
2882 if (hci_dev_test_flag(hdev, HCI_SC_ONLY) &&
2883 (!test_bit(HCI_CONN_AES_CCM, &conn->flags) ||
2884 conn->key_type != HCI_LK_AUTH_COMBINATION_P256)) {
2885 hci_connect_cfm(conn, HCI_ERROR_AUTH_FAILURE);
2886 hci_conn_drop(conn);
2887 goto unlock;
2888 }
2889
Johan Hedberg821f3762015-06-11 13:52:29 +03002890 /* Try reading the encryption key size for encrypted ACL links */
2891 if (!ev->status && ev->encrypt && conn->type == ACL_LINK) {
2892 struct hci_cp_read_enc_key_size cp;
2893 struct hci_request req;
2894
2895 /* Only send HCI_Read_Encryption_Key_Size if the
2896 * controller really supports it. If it doesn't, assume
2897 * the default size (16).
2898 */
2899 if (!(hdev->commands[20] & 0x10)) {
2900 conn->enc_key_size = HCI_LINK_KEY_SIZE;
2901 goto notify;
2902 }
2903
2904 hci_req_init(&req, hdev);
2905
2906 cp.handle = cpu_to_le16(conn->handle);
2907 hci_req_add(&req, HCI_OP_READ_ENC_KEY_SIZE, sizeof(cp), &cp);
2908
2909 if (hci_req_run_skb(&req, read_enc_key_size_complete)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002910 bt_dev_err(hdev, "sending read key size failed");
Johan Hedberg821f3762015-06-11 13:52:29 +03002911 conn->enc_key_size = HCI_LINK_KEY_SIZE;
2912 goto notify;
2913 }
2914
2915 goto unlock;
2916 }
2917
2918notify:
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002919 if (conn->state == BT_CONFIG) {
2920 if (!ev->status)
2921 conn->state = BT_CONNECTED;
2922
Johan Hedberg539c4962015-02-18 14:53:57 +02002923 hci_connect_cfm(conn, ev->status);
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002924 hci_conn_drop(conn);
2925 } else
2926 hci_encrypt_cfm(conn, ev->status, ev->encrypt);
2927
Gustavo Padovana7d77232012-05-13 03:20:07 -03002928unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002929 hci_dev_unlock(hdev);
2930}
2931
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002932static void hci_change_link_key_complete_evt(struct hci_dev *hdev,
2933 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002934{
2935 struct hci_ev_change_link_key_complete *ev = (void *) skb->data;
2936 struct hci_conn *conn;
2937
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002938 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002939
2940 hci_dev_lock(hdev);
2941
2942 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
2943 if (conn) {
2944 if (!ev->status)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002945 set_bit(HCI_CONN_SECURE, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002946
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002947 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002948
2949 hci_key_change_cfm(conn, ev->status);
2950 }
2951
2952 hci_dev_unlock(hdev);
2953}
2954
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002955static void hci_remote_features_evt(struct hci_dev *hdev,
2956 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002957{
2958 struct hci_ev_remote_features *ev = (void *) skb->data;
2959 struct hci_conn *conn;
2960
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002961 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002962
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002963 hci_dev_lock(hdev);
2964
2965 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02002966 if (!conn)
2967 goto unlock;
Marcel Holtmann769be972008-07-14 20:13:49 +02002968
Johan Hedbergccd556f2010-11-10 17:11:51 +02002969 if (!ev->status)
Johan Hedbergcad718e2013-04-17 15:00:51 +03002970 memcpy(conn->features[0], ev->features, 8);
Johan Hedbergccd556f2010-11-10 17:11:51 +02002971
2972 if (conn->state != BT_CONFIG)
2973 goto unlock;
2974
Szymon Jancac363cf2015-01-29 16:36:59 +01002975 if (!ev->status && lmp_ext_feat_capable(hdev) &&
2976 lmp_ext_feat_capable(conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02002977 struct hci_cp_read_remote_ext_features cp;
2978 cp.handle = ev->handle;
2979 cp.page = 0x01;
2980 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002981 sizeof(cp), &cp);
Johan Hedberg392599b2010-11-18 22:22:28 +02002982 goto unlock;
2983 }
2984
Johan Hedberg671267b2012-05-12 16:11:50 -03002985 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002986 struct hci_cp_remote_name_req cp;
2987 memset(&cp, 0, sizeof(cp));
2988 bacpy(&cp.bdaddr, &conn->dst);
2989 cp.pscan_rep_mode = 0x02;
2990 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002991 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00002992 mgmt_device_connected(hdev, conn, 0, NULL, 0);
Johan Hedberg392599b2010-11-18 22:22:28 +02002993
Johan Hedberg127178d2010-11-18 22:22:29 +02002994 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02002995 conn->state = BT_CONNECTED;
Johan Hedberg539c4962015-02-18 14:53:57 +02002996 hci_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002997 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02002998 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002999
Johan Hedbergccd556f2010-11-10 17:11:51 +02003000unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003001 hci_dev_unlock(hdev);
3002}
3003
Johan Hedberge62144872015-04-02 13:41:08 +03003004static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb,
3005 u16 *opcode, u8 *status,
3006 hci_req_complete_t *req_complete,
3007 hci_req_complete_skb_t *req_complete_skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003008{
3009 struct hci_ev_cmd_complete *ev = (void *) skb->data;
Johan Hedberge62144872015-04-02 13:41:08 +03003010
3011 *opcode = __le16_to_cpu(ev->opcode);
3012 *status = skb->data[sizeof(*ev)];
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003013
3014 skb_pull(skb, sizeof(*ev));
3015
Johan Hedberge62144872015-04-02 13:41:08 +03003016 switch (*opcode) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003017 case HCI_OP_INQUIRY_CANCEL:
3018 hci_cc_inquiry_cancel(hdev, skb);
3019 break;
3020
Andre Guedes4d934832012-03-21 00:03:35 -03003021 case HCI_OP_PERIODIC_INQ:
3022 hci_cc_periodic_inq(hdev, skb);
3023 break;
3024
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003025 case HCI_OP_EXIT_PERIODIC_INQ:
3026 hci_cc_exit_periodic_inq(hdev, skb);
3027 break;
3028
3029 case HCI_OP_REMOTE_NAME_REQ_CANCEL:
3030 hci_cc_remote_name_req_cancel(hdev, skb);
3031 break;
3032
3033 case HCI_OP_ROLE_DISCOVERY:
3034 hci_cc_role_discovery(hdev, skb);
3035 break;
3036
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02003037 case HCI_OP_READ_LINK_POLICY:
3038 hci_cc_read_link_policy(hdev, skb);
3039 break;
3040
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003041 case HCI_OP_WRITE_LINK_POLICY:
3042 hci_cc_write_link_policy(hdev, skb);
3043 break;
3044
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02003045 case HCI_OP_READ_DEF_LINK_POLICY:
3046 hci_cc_read_def_link_policy(hdev, skb);
3047 break;
3048
3049 case HCI_OP_WRITE_DEF_LINK_POLICY:
3050 hci_cc_write_def_link_policy(hdev, skb);
3051 break;
3052
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003053 case HCI_OP_RESET:
3054 hci_cc_reset(hdev, skb);
3055 break;
3056
Marcel Holtmannc2f0f972015-01-12 09:21:25 -08003057 case HCI_OP_READ_STORED_LINK_KEY:
3058 hci_cc_read_stored_link_key(hdev, skb);
3059 break;
3060
Marcel Holtmanna93661202015-01-12 09:21:28 -08003061 case HCI_OP_DELETE_STORED_LINK_KEY:
3062 hci_cc_delete_stored_link_key(hdev, skb);
3063 break;
3064
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003065 case HCI_OP_WRITE_LOCAL_NAME:
3066 hci_cc_write_local_name(hdev, skb);
3067 break;
3068
3069 case HCI_OP_READ_LOCAL_NAME:
3070 hci_cc_read_local_name(hdev, skb);
3071 break;
3072
3073 case HCI_OP_WRITE_AUTH_ENABLE:
3074 hci_cc_write_auth_enable(hdev, skb);
3075 break;
3076
3077 case HCI_OP_WRITE_ENCRYPT_MODE:
3078 hci_cc_write_encrypt_mode(hdev, skb);
3079 break;
3080
3081 case HCI_OP_WRITE_SCAN_ENABLE:
3082 hci_cc_write_scan_enable(hdev, skb);
3083 break;
3084
3085 case HCI_OP_READ_CLASS_OF_DEV:
3086 hci_cc_read_class_of_dev(hdev, skb);
3087 break;
3088
3089 case HCI_OP_WRITE_CLASS_OF_DEV:
3090 hci_cc_write_class_of_dev(hdev, skb);
3091 break;
3092
3093 case HCI_OP_READ_VOICE_SETTING:
3094 hci_cc_read_voice_setting(hdev, skb);
3095 break;
3096
3097 case HCI_OP_WRITE_VOICE_SETTING:
3098 hci_cc_write_voice_setting(hdev, skb);
3099 break;
3100
Marcel Holtmannb4cb9fb2013-10-14 13:56:16 -07003101 case HCI_OP_READ_NUM_SUPPORTED_IAC:
3102 hci_cc_read_num_supported_iac(hdev, skb);
3103 break;
3104
Marcel Holtmann333140b2008-07-14 20:13:48 +02003105 case HCI_OP_WRITE_SSP_MODE:
3106 hci_cc_write_ssp_mode(hdev, skb);
3107 break;
3108
Marcel Holtmanneac83dc2014-01-10 02:07:23 -08003109 case HCI_OP_WRITE_SC_SUPPORT:
3110 hci_cc_write_sc_support(hdev, skb);
3111 break;
3112
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003113 case HCI_OP_READ_LOCAL_VERSION:
3114 hci_cc_read_local_version(hdev, skb);
3115 break;
3116
3117 case HCI_OP_READ_LOCAL_COMMANDS:
3118 hci_cc_read_local_commands(hdev, skb);
3119 break;
3120
3121 case HCI_OP_READ_LOCAL_FEATURES:
3122 hci_cc_read_local_features(hdev, skb);
3123 break;
3124
Andre Guedes971e3a42011-06-30 19:20:52 -03003125 case HCI_OP_READ_LOCAL_EXT_FEATURES:
3126 hci_cc_read_local_ext_features(hdev, skb);
3127 break;
3128
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003129 case HCI_OP_READ_BUFFER_SIZE:
3130 hci_cc_read_buffer_size(hdev, skb);
3131 break;
3132
3133 case HCI_OP_READ_BD_ADDR:
3134 hci_cc_read_bd_addr(hdev, skb);
3135 break;
3136
Johan Hedbergf332ec62013-03-15 17:07:11 -05003137 case HCI_OP_READ_PAGE_SCAN_ACTIVITY:
3138 hci_cc_read_page_scan_activity(hdev, skb);
3139 break;
3140
Johan Hedberg4a3ee762013-03-15 17:07:12 -05003141 case HCI_OP_WRITE_PAGE_SCAN_ACTIVITY:
3142 hci_cc_write_page_scan_activity(hdev, skb);
3143 break;
3144
Johan Hedbergf332ec62013-03-15 17:07:11 -05003145 case HCI_OP_READ_PAGE_SCAN_TYPE:
3146 hci_cc_read_page_scan_type(hdev, skb);
3147 break;
3148
Johan Hedberg4a3ee762013-03-15 17:07:12 -05003149 case HCI_OP_WRITE_PAGE_SCAN_TYPE:
3150 hci_cc_write_page_scan_type(hdev, skb);
3151 break;
3152
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +02003153 case HCI_OP_READ_DATA_BLOCK_SIZE:
3154 hci_cc_read_data_block_size(hdev, skb);
3155 break;
3156
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +02003157 case HCI_OP_READ_FLOW_CONTROL_MODE:
3158 hci_cc_read_flow_control_mode(hdev, skb);
3159 break;
3160
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +03003161 case HCI_OP_READ_LOCAL_AMP_INFO:
3162 hci_cc_read_local_amp_info(hdev, skb);
3163 break;
3164
Johan Hedberg33f35722014-06-28 17:54:06 +03003165 case HCI_OP_READ_CLOCK:
3166 hci_cc_read_clock(hdev, skb);
3167 break;
3168
Johan Hedbergd5859e22011-01-25 01:19:58 +02003169 case HCI_OP_READ_INQ_RSP_TX_POWER:
3170 hci_cc_read_inq_rsp_tx_power(hdev, skb);
3171 break;
3172
Johan Hedberg980e1a52011-01-22 06:10:07 +02003173 case HCI_OP_PIN_CODE_REPLY:
3174 hci_cc_pin_code_reply(hdev, skb);
3175 break;
3176
3177 case HCI_OP_PIN_CODE_NEG_REPLY:
3178 hci_cc_pin_code_neg_reply(hdev, skb);
3179 break;
3180
Szymon Jancc35938b2011-03-22 13:12:21 +01003181 case HCI_OP_READ_LOCAL_OOB_DATA:
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08003182 hci_cc_read_local_oob_data(hdev, skb);
3183 break;
3184
3185 case HCI_OP_READ_LOCAL_OOB_EXT_DATA:
3186 hci_cc_read_local_oob_ext_data(hdev, skb);
Szymon Jancc35938b2011-03-22 13:12:21 +01003187 break;
3188
Ville Tervo6ed58ec2011-02-10 22:38:48 -03003189 case HCI_OP_LE_READ_BUFFER_SIZE:
3190 hci_cc_le_read_buffer_size(hdev, skb);
3191 break;
3192
Johan Hedberg60e77322013-01-22 14:01:59 +02003193 case HCI_OP_LE_READ_LOCAL_FEATURES:
3194 hci_cc_le_read_local_features(hdev, skb);
3195 break;
3196
Johan Hedberg8fa19092012-10-19 20:57:49 +03003197 case HCI_OP_LE_READ_ADV_TX_POWER:
3198 hci_cc_le_read_adv_tx_power(hdev, skb);
3199 break;
3200
Johan Hedberga5c29682011-02-19 12:05:57 -03003201 case HCI_OP_USER_CONFIRM_REPLY:
3202 hci_cc_user_confirm_reply(hdev, skb);
3203 break;
3204
3205 case HCI_OP_USER_CONFIRM_NEG_REPLY:
3206 hci_cc_user_confirm_neg_reply(hdev, skb);
3207 break;
3208
Brian Gix1143d452011-11-23 08:28:34 -08003209 case HCI_OP_USER_PASSKEY_REPLY:
3210 hci_cc_user_passkey_reply(hdev, skb);
3211 break;
3212
3213 case HCI_OP_USER_PASSKEY_NEG_REPLY:
3214 hci_cc_user_passkey_neg_reply(hdev, skb);
Szymon Janc16cde992012-04-13 12:32:42 +02003215 break;
Andre Guedes07f7fa52011-12-02 21:13:31 +09003216
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08003217 case HCI_OP_LE_SET_RANDOM_ADDR:
3218 hci_cc_le_set_random_addr(hdev, skb);
3219 break;
3220
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01003221 case HCI_OP_LE_SET_ADV_ENABLE:
3222 hci_cc_le_set_adv_enable(hdev, skb);
3223 break;
3224
Marcel Holtmann533553f2014-03-21 12:18:10 -07003225 case HCI_OP_LE_SET_SCAN_PARAM:
3226 hci_cc_le_set_scan_param(hdev, skb);
3227 break;
3228
Andre Guedeseb9d91f2011-05-26 16:23:52 -03003229 case HCI_OP_LE_SET_SCAN_ENABLE:
3230 hci_cc_le_set_scan_enable(hdev, skb);
3231 break;
3232
Johan Hedbergcf1d0812013-01-22 14:02:00 +02003233 case HCI_OP_LE_READ_WHITE_LIST_SIZE:
3234 hci_cc_le_read_white_list_size(hdev, skb);
3235 break;
3236
Marcel Holtmann0f36b582014-02-27 20:37:31 -08003237 case HCI_OP_LE_CLEAR_WHITE_LIST:
3238 hci_cc_le_clear_white_list(hdev, skb);
3239 break;
3240
3241 case HCI_OP_LE_ADD_TO_WHITE_LIST:
3242 hci_cc_le_add_to_white_list(hdev, skb);
3243 break;
3244
3245 case HCI_OP_LE_DEL_FROM_WHITE_LIST:
3246 hci_cc_le_del_from_white_list(hdev, skb);
3247 break;
3248
Johan Hedberg9b008c02013-01-22 14:02:01 +02003249 case HCI_OP_LE_READ_SUPPORTED_STATES:
3250 hci_cc_le_read_supported_states(hdev, skb);
3251 break;
3252
Marcel Holtmanna8e1bfa2014-12-20 16:28:40 +01003253 case HCI_OP_LE_READ_DEF_DATA_LEN:
3254 hci_cc_le_read_def_data_len(hdev, skb);
3255 break;
3256
3257 case HCI_OP_LE_WRITE_DEF_DATA_LEN:
3258 hci_cc_le_write_def_data_len(hdev, skb);
3259 break;
3260
Ankit Navik545f2592018-06-29 12:13:20 +05303261 case HCI_OP_LE_CLEAR_RESOLV_LIST:
3262 hci_cc_le_clear_resolv_list(hdev, skb);
3263 break;
3264
Ankit Navikcfdb0c22018-06-29 12:12:50 +05303265 case HCI_OP_LE_READ_RESOLV_LIST_SIZE:
3266 hci_cc_le_read_resolv_list_size(hdev, skb);
3267 break;
3268
Marcel Holtmanna8e1bfa2014-12-20 16:28:40 +01003269 case HCI_OP_LE_READ_MAX_DATA_LEN:
3270 hci_cc_le_read_max_data_len(hdev, skb);
3271 break;
3272
Andre Guedesf9b49302011-06-30 19:20:53 -03003273 case HCI_OP_WRITE_LE_HOST_SUPPORTED:
3274 hci_cc_write_le_host_supported(hdev, skb);
3275 break;
3276
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02003277 case HCI_OP_LE_SET_ADV_PARAM:
3278 hci_cc_set_adv_param(hdev, skb);
3279 break;
3280
Andrzej Kaczmarek5ae76a92014-05-08 15:32:08 +02003281 case HCI_OP_READ_RSSI:
3282 hci_cc_read_rssi(hdev, skb);
3283 break;
3284
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02003285 case HCI_OP_READ_TX_POWER:
3286 hci_cc_read_tx_power(hdev, skb);
3287 break;
3288
Marcel Holtmannc50b33c2015-01-31 15:07:52 -08003289 case HCI_OP_WRITE_SSP_DEBUG_MODE:
3290 hci_cc_write_ssp_debug_mode(hdev, skb);
3291 break;
3292
Jaganath Kanakkasserya2344b92018-07-06 17:05:28 +05303293 case HCI_OP_LE_SET_EXT_SCAN_PARAMS:
3294 hci_cc_le_set_ext_scan_param(hdev, skb);
3295 break;
3296
3297 case HCI_OP_LE_SET_EXT_SCAN_ENABLE:
3298 hci_cc_le_set_ext_scan_enable(hdev, skb);
3299 break;
3300
Jaganath Kanakkassery0314f282018-07-19 17:09:35 +05303301 case HCI_OP_LE_SET_DEFAULT_PHY:
3302 hci_cc_le_set_default_phy(hdev, skb);
3303 break;
3304
Jaganath Kanakkassery6b49bcb2018-07-19 17:09:40 +05303305 case HCI_OP_LE_READ_NUM_SUPPORTED_ADV_SETS:
3306 hci_cc_le_read_num_adv_sets(hdev, skb);
3307 break;
3308
Jaganath Kanakkasseryde181e82018-07-19 17:09:41 +05303309 case HCI_OP_LE_SET_EXT_ADV_PARAMS:
3310 hci_cc_set_ext_adv_param(hdev, skb);
3311 break;
3312
3313 case HCI_OP_LE_SET_EXT_ADV_ENABLE:
3314 hci_cc_le_set_ext_adv_enable(hdev, skb);
3315 break;
3316
Jaganath Kanakkasserya73c0462018-07-19 17:09:45 +05303317 case HCI_OP_LE_SET_ADV_SET_RAND_ADDR:
3318 hci_cc_le_set_adv_set_random_addr(hdev, skb);
3319 break;
3320
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003321 default:
Johan Hedberge62144872015-04-02 13:41:08 +03003322 BT_DBG("%s opcode 0x%4.4x", hdev->name, *opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003323 break;
3324 }
3325
Johan Hedberge62144872015-04-02 13:41:08 +03003326 if (*opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02003327 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02003328
Johan Hedberg600b2152015-03-28 11:17:36 +02003329 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags))
3330 atomic_set(&hdev->cmd_cnt, 1);
3331
Johan Hedberge62144872015-04-02 13:41:08 +03003332 hci_req_cmd_complete(hdev, *opcode, *status, req_complete,
3333 req_complete_skb);
Johan Hedberg9238f362013-03-05 20:37:48 +02003334
Johan Hedberg600b2152015-03-28 11:17:36 +02003335 if (atomic_read(&hdev->cmd_cnt) && !skb_queue_empty(&hdev->cmd_q))
3336 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003337}
3338
Johan Hedberge62144872015-04-02 13:41:08 +03003339static void hci_cmd_status_evt(struct hci_dev *hdev, struct sk_buff *skb,
3340 u16 *opcode, u8 *status,
3341 hci_req_complete_t *req_complete,
3342 hci_req_complete_skb_t *req_complete_skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003343{
3344 struct hci_ev_cmd_status *ev = (void *) skb->data;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003345
3346 skb_pull(skb, sizeof(*ev));
3347
Johan Hedberge62144872015-04-02 13:41:08 +03003348 *opcode = __le16_to_cpu(ev->opcode);
3349 *status = ev->status;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003350
Johan Hedberge62144872015-04-02 13:41:08 +03003351 switch (*opcode) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003352 case HCI_OP_INQUIRY:
3353 hci_cs_inquiry(hdev, ev->status);
3354 break;
3355
3356 case HCI_OP_CREATE_CONN:
3357 hci_cs_create_conn(hdev, ev->status);
3358 break;
3359
Kuba Pawlak9645c762014-11-06 19:36:53 +01003360 case HCI_OP_DISCONNECT:
3361 hci_cs_disconnect(hdev, ev->status);
3362 break;
3363
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003364 case HCI_OP_ADD_SCO:
3365 hci_cs_add_sco(hdev, ev->status);
3366 break;
3367
Marcel Holtmannf8558552008-07-14 20:13:49 +02003368 case HCI_OP_AUTH_REQUESTED:
3369 hci_cs_auth_requested(hdev, ev->status);
3370 break;
3371
3372 case HCI_OP_SET_CONN_ENCRYPT:
3373 hci_cs_set_conn_encrypt(hdev, ev->status);
3374 break;
3375
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003376 case HCI_OP_REMOTE_NAME_REQ:
3377 hci_cs_remote_name_req(hdev, ev->status);
3378 break;
3379
Marcel Holtmann769be972008-07-14 20:13:49 +02003380 case HCI_OP_READ_REMOTE_FEATURES:
3381 hci_cs_read_remote_features(hdev, ev->status);
3382 break;
3383
3384 case HCI_OP_READ_REMOTE_EXT_FEATURES:
3385 hci_cs_read_remote_ext_features(hdev, ev->status);
3386 break;
3387
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003388 case HCI_OP_SETUP_SYNC_CONN:
3389 hci_cs_setup_sync_conn(hdev, ev->status);
3390 break;
3391
3392 case HCI_OP_SNIFF_MODE:
3393 hci_cs_sniff_mode(hdev, ev->status);
3394 break;
3395
3396 case HCI_OP_EXIT_SNIFF_MODE:
3397 hci_cs_exit_sniff_mode(hdev, ev->status);
3398 break;
3399
Kuba Pawlak50fc85f2014-11-06 19:36:52 +01003400 case HCI_OP_SWITCH_ROLE:
3401 hci_cs_switch_role(hdev, ev->status);
3402 break;
3403
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02003404 case HCI_OP_LE_CREATE_CONN:
3405 hci_cs_le_create_conn(hdev, ev->status);
3406 break;
3407
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07003408 case HCI_OP_LE_READ_REMOTE_FEATURES:
3409 hci_cs_le_read_remote_features(hdev, ev->status);
3410 break;
3411
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02003412 case HCI_OP_LE_START_ENC:
3413 hci_cs_le_start_enc(hdev, ev->status);
3414 break;
3415
Jaganath Kanakkassery4d94f952018-07-06 22:50:32 +02003416 case HCI_OP_LE_EXT_CREATE_CONN:
3417 hci_cs_le_ext_create_conn(hdev, ev->status);
3418 break;
3419
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003420 default:
Johan Hedberge62144872015-04-02 13:41:08 +03003421 BT_DBG("%s opcode 0x%4.4x", hdev->name, *opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003422 break;
3423 }
3424
Johan Hedberge62144872015-04-02 13:41:08 +03003425 if (*opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02003426 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02003427
Johan Hedberg600b2152015-03-28 11:17:36 +02003428 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags))
3429 atomic_set(&hdev->cmd_cnt, 1);
3430
Johan Hedberg444c6dd2015-04-02 13:41:07 +03003431 /* Indicate request completion if the command failed. Also, if
3432 * we're not waiting for a special event and we get a success
3433 * command status we should try to flag the request as completed
3434 * (since for this kind of commands there will not be a command
3435 * complete event).
3436 */
Johan Hedberg02350a72013-04-03 21:50:29 +03003437 if (ev->status ||
Marcel Holtmann242c0eb2015-10-25 22:45:53 +01003438 (hdev->sent_cmd && !bt_cb(hdev->sent_cmd)->hci.req_event))
Johan Hedberge62144872015-04-02 13:41:08 +03003439 hci_req_cmd_complete(hdev, *opcode, ev->status, req_complete,
3440 req_complete_skb);
Johan Hedberg9238f362013-03-05 20:37:48 +02003441
Johan Hedberg600b2152015-03-28 11:17:36 +02003442 if (atomic_read(&hdev->cmd_cnt) && !skb_queue_empty(&hdev->cmd_q))
3443 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003444}
3445
Marcel Holtmann24dfa342014-11-02 02:56:41 +01003446static void hci_hardware_error_evt(struct hci_dev *hdev, struct sk_buff *skb)
3447{
3448 struct hci_ev_hardware_error *ev = (void *) skb->data;
3449
Marcel Holtmannc7741d12015-01-28 11:09:55 -08003450 hdev->hw_error_code = ev->code;
3451
3452 queue_work(hdev->req_workqueue, &hdev->error_reset);
Marcel Holtmann24dfa342014-11-02 02:56:41 +01003453}
3454
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003455static void hci_role_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003456{
3457 struct hci_ev_role_change *ev = (void *) skb->data;
3458 struct hci_conn *conn;
3459
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003460 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003461
3462 hci_dev_lock(hdev);
3463
3464 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3465 if (conn) {
Johan Hedberg40bef302014-07-16 11:42:27 +03003466 if (!ev->status)
3467 conn->role = ev->role;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003468
Johan Hedberg51a8efd2012-01-16 06:10:31 +02003469 clear_bit(HCI_CONN_RSWITCH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003470
3471 hci_role_switch_cfm(conn, ev->status, ev->role);
3472 }
3473
3474 hci_dev_unlock(hdev);
3475}
3476
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003477static void hci_num_comp_pkts_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003478{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003479 struct hci_ev_num_comp_pkts *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003480 int i;
3481
Andrei Emeltchenko32ac5b92011-12-19 16:31:29 +02003482 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_PACKET_BASED) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003483 bt_dev_err(hdev, "wrong event for mode %d", hdev->flow_ctl_mode);
Andrei Emeltchenko32ac5b92011-12-19 16:31:29 +02003484 return;
3485 }
3486
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02003487 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03003488 ev->num_hndl * sizeof(struct hci_comp_pkts_info)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003489 BT_DBG("%s bad parameters", hdev->name);
3490 return;
3491 }
3492
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02003493 BT_DBG("%s num_hndl %d", hdev->name, ev->num_hndl);
3494
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02003495 for (i = 0; i < ev->num_hndl; i++) {
3496 struct hci_comp_pkts_info *info = &ev->handles[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07003497 struct hci_conn *conn;
3498 __u16 handle, count;
3499
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02003500 handle = __le16_to_cpu(info->handle);
3501 count = __le16_to_cpu(info->count);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003502
3503 conn = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003504 if (!conn)
3505 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003506
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003507 conn->sent -= count;
3508
3509 switch (conn->type) {
3510 case ACL_LINK:
3511 hdev->acl_cnt += count;
3512 if (hdev->acl_cnt > hdev->acl_pkts)
3513 hdev->acl_cnt = hdev->acl_pkts;
3514 break;
3515
3516 case LE_LINK:
3517 if (hdev->le_pkts) {
3518 hdev->le_cnt += count;
3519 if (hdev->le_cnt > hdev->le_pkts)
3520 hdev->le_cnt = hdev->le_pkts;
3521 } else {
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02003522 hdev->acl_cnt += count;
3523 if (hdev->acl_cnt > hdev->acl_pkts)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003524 hdev->acl_cnt = hdev->acl_pkts;
3525 }
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003526 break;
3527
3528 case SCO_LINK:
3529 hdev->sco_cnt += count;
3530 if (hdev->sco_cnt > hdev->sco_pkts)
3531 hdev->sco_cnt = hdev->sco_pkts;
3532 break;
3533
3534 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003535 bt_dev_err(hdev, "unknown type %d conn %p",
3536 conn->type, conn);
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003537 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003538 }
3539 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003540
Gustavo F. Padovan3eff45e2011-12-15 00:50:02 -02003541 queue_work(hdev->workqueue, &hdev->tx_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003542}
3543
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003544static struct hci_conn *__hci_conn_lookup_handle(struct hci_dev *hdev,
3545 __u16 handle)
3546{
3547 struct hci_chan *chan;
3548
3549 switch (hdev->dev_type) {
Marcel Holtmannca8bee52016-07-05 14:30:14 +02003550 case HCI_PRIMARY:
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003551 return hci_conn_hash_lookup_handle(hdev, handle);
3552 case HCI_AMP:
3553 chan = hci_chan_lookup_handle(hdev, handle);
3554 if (chan)
3555 return chan->conn;
3556 break;
3557 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003558 bt_dev_err(hdev, "unknown dev_type %d", hdev->dev_type);
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003559 break;
3560 }
3561
3562 return NULL;
3563}
3564
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003565static void hci_num_comp_blocks_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003566{
3567 struct hci_ev_num_comp_blocks *ev = (void *) skb->data;
3568 int i;
3569
3570 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_BLOCK_BASED) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003571 bt_dev_err(hdev, "wrong event for mode %d", hdev->flow_ctl_mode);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003572 return;
3573 }
3574
3575 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03003576 ev->num_hndl * sizeof(struct hci_comp_blocks_info)) {
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003577 BT_DBG("%s bad parameters", hdev->name);
3578 return;
3579 }
3580
3581 BT_DBG("%s num_blocks %d num_hndl %d", hdev->name, ev->num_blocks,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003582 ev->num_hndl);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003583
3584 for (i = 0; i < ev->num_hndl; i++) {
3585 struct hci_comp_blocks_info *info = &ev->handles[i];
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003586 struct hci_conn *conn = NULL;
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003587 __u16 handle, block_count;
3588
3589 handle = __le16_to_cpu(info->handle);
3590 block_count = __le16_to_cpu(info->blocks);
3591
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003592 conn = __hci_conn_lookup_handle(hdev, handle);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003593 if (!conn)
3594 continue;
3595
3596 conn->sent -= block_count;
3597
3598 switch (conn->type) {
3599 case ACL_LINK:
Andrei Emeltchenkobd1eb662012-10-10 17:38:30 +03003600 case AMP_LINK:
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003601 hdev->block_cnt += block_count;
3602 if (hdev->block_cnt > hdev->num_blocks)
3603 hdev->block_cnt = hdev->num_blocks;
3604 break;
3605
3606 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003607 bt_dev_err(hdev, "unknown type %d conn %p",
3608 conn->type, conn);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003609 break;
3610 }
3611 }
3612
3613 queue_work(hdev->workqueue, &hdev->tx_work);
3614}
3615
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003616static void hci_mode_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003617{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003618 struct hci_ev_mode_change *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003619 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003620
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003621 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003622
3623 hci_dev_lock(hdev);
3624
Marcel Holtmann04837f62006-07-03 10:02:33 +02003625 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3626 if (conn) {
3627 conn->mode = ev->mode;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003628
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003629 if (!test_and_clear_bit(HCI_CONN_MODE_CHANGE_PEND,
3630 &conn->flags)) {
Marcel Holtmann04837f62006-07-03 10:02:33 +02003631 if (conn->mode == HCI_CM_ACTIVE)
Johan Hedberg58a681e2012-01-16 06:47:28 +02003632 set_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003633 else
Johan Hedberg58a681e2012-01-16 06:47:28 +02003634 clear_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003635 }
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003636
Johan Hedberg51a8efd2012-01-16 06:10:31 +02003637 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003638 hci_sco_setup(conn, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003639 }
3640
3641 hci_dev_unlock(hdev);
3642}
3643
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003644static void hci_pin_code_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003645{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003646 struct hci_ev_pin_code_req *ev = (void *) skb->data;
3647 struct hci_conn *conn;
3648
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003649 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003650
3651 hci_dev_lock(hdev);
3652
3653 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003654 if (!conn)
3655 goto unlock;
3656
3657 if (conn->state == BT_CONNECTED) {
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003658 hci_conn_hold(conn);
3659 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003660 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003661 }
3662
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003663 if (!hci_dev_test_flag(hdev, HCI_BONDABLE) &&
Johan Hedberg2f407f02014-07-17 15:35:40 +03003664 !test_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags)) {
Johan Hedberg03b555e2011-01-04 15:40:05 +02003665 hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003666 sizeof(ev->bdaddr), &ev->bdaddr);
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003667 } else if (hci_dev_test_flag(hdev, HCI_MGMT)) {
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003668 u8 secure;
3669
3670 if (conn->pending_sec_level == BT_SECURITY_HIGH)
3671 secure = 1;
3672 else
3673 secure = 0;
3674
Johan Hedberg744cf192011-11-08 20:40:14 +02003675 mgmt_pin_code_request(hdev, &ev->bdaddr, secure);
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003676 }
Johan Hedberg980e1a52011-01-22 06:10:07 +02003677
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003678unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003679 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003680}
3681
Johan Hedbergcb6f3f72014-11-19 14:53:04 +02003682static void conn_set_key(struct hci_conn *conn, u8 key_type, u8 pin_len)
3683{
3684 if (key_type == HCI_LK_CHANGED_COMBINATION)
3685 return;
3686
3687 conn->pin_length = pin_len;
3688 conn->key_type = key_type;
3689
3690 switch (key_type) {
3691 case HCI_LK_LOCAL_UNIT:
3692 case HCI_LK_REMOTE_UNIT:
3693 case HCI_LK_DEBUG_COMBINATION:
3694 return;
3695 case HCI_LK_COMBINATION:
3696 if (pin_len == 16)
3697 conn->pending_sec_level = BT_SECURITY_HIGH;
3698 else
3699 conn->pending_sec_level = BT_SECURITY_MEDIUM;
3700 break;
3701 case HCI_LK_UNAUTH_COMBINATION_P192:
3702 case HCI_LK_UNAUTH_COMBINATION_P256:
3703 conn->pending_sec_level = BT_SECURITY_MEDIUM;
3704 break;
3705 case HCI_LK_AUTH_COMBINATION_P192:
3706 conn->pending_sec_level = BT_SECURITY_HIGH;
3707 break;
3708 case HCI_LK_AUTH_COMBINATION_P256:
3709 conn->pending_sec_level = BT_SECURITY_FIPS;
3710 break;
3711 }
3712}
3713
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003714static void hci_link_key_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003715{
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003716 struct hci_ev_link_key_req *ev = (void *) skb->data;
3717 struct hci_cp_link_key_reply cp;
3718 struct hci_conn *conn;
3719 struct link_key *key;
3720
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003721 BT_DBG("%s", hdev->name);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003722
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003723 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003724 return;
3725
3726 hci_dev_lock(hdev);
3727
3728 key = hci_find_link_key(hdev, &ev->bdaddr);
3729 if (!key) {
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003730 BT_DBG("%s link key not found for %pMR", hdev->name,
3731 &ev->bdaddr);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003732 goto not_found;
3733 }
3734
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003735 BT_DBG("%s found key type %u for %pMR", hdev->name, key->type,
3736 &ev->bdaddr);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003737
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003738 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003739 if (conn) {
Johan Hedbergfe8bc5a2014-08-14 12:33:17 +03003740 clear_bit(HCI_CONN_NEW_LINK_KEY, &conn->flags);
3741
Marcel Holtmann66138ce2014-01-10 02:07:20 -08003742 if ((key->type == HCI_LK_UNAUTH_COMBINATION_P192 ||
3743 key->type == HCI_LK_UNAUTH_COMBINATION_P256) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03003744 conn->auth_type != 0xff && (conn->auth_type & 0x01)) {
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003745 BT_DBG("%s ignoring unauthenticated key", hdev->name);
3746 goto not_found;
3747 }
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003748
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003749 if (key->type == HCI_LK_COMBINATION && key->pin_len < 16 &&
Johan Hedbergf3fb0b52014-06-02 10:12:44 +03003750 (conn->pending_sec_level == BT_SECURITY_HIGH ||
3751 conn->pending_sec_level == BT_SECURITY_FIPS)) {
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003752 BT_DBG("%s ignoring key unauthenticated for high security",
3753 hdev->name);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003754 goto not_found;
3755 }
3756
Johan Hedbergcb6f3f72014-11-19 14:53:04 +02003757 conn_set_key(conn, key->type, key->pin_len);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003758 }
3759
3760 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9b3b4462012-05-23 11:31:20 +03003761 memcpy(cp.link_key, key->val, HCI_LINK_KEY_SIZE);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003762
3763 hci_send_cmd(hdev, HCI_OP_LINK_KEY_REPLY, sizeof(cp), &cp);
3764
3765 hci_dev_unlock(hdev);
3766
3767 return;
3768
3769not_found:
3770 hci_send_cmd(hdev, HCI_OP_LINK_KEY_NEG_REPLY, 6, &ev->bdaddr);
3771 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003772}
3773
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003774static void hci_link_key_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003775{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003776 struct hci_ev_link_key_notify *ev = (void *) skb->data;
3777 struct hci_conn *conn;
Johan Hedberg7652ff62014-06-24 13:15:49 +03003778 struct link_key *key;
3779 bool persistent;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003780 u8 pin_len = 0;
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003781
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003782 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003783
3784 hci_dev_lock(hdev);
3785
3786 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg82c13d42014-12-03 11:03:06 +02003787 if (!conn)
3788 goto unlock;
3789
3790 hci_conn_hold(conn);
3791 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
3792 hci_conn_drop(conn);
3793
Johan Hedbergfe8bc5a2014-08-14 12:33:17 +03003794 set_bit(HCI_CONN_NEW_LINK_KEY, &conn->flags);
Johan Hedberg82c13d42014-12-03 11:03:06 +02003795 conn_set_key(conn, ev->key_type, conn->pin_length);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003796
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003797 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg7652ff62014-06-24 13:15:49 +03003798 goto unlock;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003799
Johan Hedberg7652ff62014-06-24 13:15:49 +03003800 key = hci_add_link_key(hdev, conn, &ev->bdaddr, ev->link_key,
3801 ev->key_type, pin_len, &persistent);
3802 if (!key)
3803 goto unlock;
3804
Johan Hedbergcb6f3f72014-11-19 14:53:04 +02003805 /* Update connection information since adding the key will have
3806 * fixed up the type in the case of changed combination keys.
3807 */
3808 if (ev->key_type == HCI_LK_CHANGED_COMBINATION)
3809 conn_set_key(conn, key->type, key->pin_len);
3810
Johan Hedberg7652ff62014-06-24 13:15:49 +03003811 mgmt_new_link_key(hdev, key, persistent);
3812
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003813 /* Keep debug keys around only if the HCI_KEEP_DEBUG_KEYS flag
3814 * is set. If it's not set simply remove the key from the kernel
3815 * list (we've still notified user space about it but with
3816 * store_hint being 0).
3817 */
3818 if (key->type == HCI_LK_DEBUG_COMBINATION &&
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003819 !hci_dev_test_flag(hdev, HCI_KEEP_DEBUG_KEYS)) {
Johan Hedberg0378b592014-11-19 15:22:22 +02003820 list_del_rcu(&key->list);
3821 kfree_rcu(key, rcu);
Johan Hedberg82c13d42014-12-03 11:03:06 +02003822 goto unlock;
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003823 }
Johan Hedberg7652ff62014-06-24 13:15:49 +03003824
Johan Hedberg82c13d42014-12-03 11:03:06 +02003825 if (persistent)
3826 clear_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
3827 else
3828 set_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
3829
Johan Hedberg7652ff62014-06-24 13:15:49 +03003830unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003831 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003832}
3833
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003834static void hci_clock_offset_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04837f62006-07-03 10:02:33 +02003835{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003836 struct hci_ev_clock_offset *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003837 struct hci_conn *conn;
3838
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003839 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003840
3841 hci_dev_lock(hdev);
3842
3843 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003844 if (conn && !ev->status) {
3845 struct inquiry_entry *ie;
3846
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003847 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3848 if (ie) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003849 ie->data.clock_offset = ev->clock_offset;
3850 ie->timestamp = jiffies;
3851 }
3852 }
3853
3854 hci_dev_unlock(hdev);
3855}
3856
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003857static void hci_pkt_type_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna8746412008-07-14 20:13:46 +02003858{
3859 struct hci_ev_pkt_type_change *ev = (void *) skb->data;
3860 struct hci_conn *conn;
3861
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003862 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna8746412008-07-14 20:13:46 +02003863
3864 hci_dev_lock(hdev);
3865
3866 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3867 if (conn && !ev->status)
3868 conn->pkt_type = __le16_to_cpu(ev->pkt_type);
3869
3870 hci_dev_unlock(hdev);
3871}
3872
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003873static void hci_pscan_rep_mode_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003874{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003875 struct hci_ev_pscan_rep_mode *ev = (void *) skb->data;
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003876 struct inquiry_entry *ie;
3877
3878 BT_DBG("%s", hdev->name);
3879
3880 hci_dev_lock(hdev);
3881
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003882 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
3883 if (ie) {
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003884 ie->data.pscan_rep_mode = ev->pscan_rep_mode;
3885 ie->timestamp = jiffies;
3886 }
3887
3888 hci_dev_unlock(hdev);
3889}
3890
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003891static void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev,
3892 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003893{
3894 struct inquiry_data data;
3895 int num_rsp = *((__u8 *) skb->data);
3896
3897 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
3898
3899 if (!num_rsp)
3900 return;
3901
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003902 if (hci_dev_test_flag(hdev, HCI_PERIODIC_INQ))
Andre Guedes1519cc12012-03-21 00:03:38 -03003903 return;
3904
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003905 hci_dev_lock(hdev);
3906
3907 if ((skb->len - 1) / num_rsp != sizeof(struct inquiry_info_with_rssi)) {
Szymon Janc138d22e2011-02-17 16:44:23 +01003908 struct inquiry_info_with_rssi_and_pscan_mode *info;
3909 info = (void *) (skb->data + 1);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003910
Johan Hedberge17acd42011-03-30 23:57:16 +03003911 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003912 u32 flags;
3913
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003914 bacpy(&data.bdaddr, &info->bdaddr);
3915 data.pscan_rep_mode = info->pscan_rep_mode;
3916 data.pscan_period_mode = info->pscan_period_mode;
3917 data.pscan_mode = info->pscan_mode;
3918 memcpy(data.dev_class, info->dev_class, 3);
3919 data.clock_offset = info->clock_offset;
3920 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003921 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02003922
Marcel Holtmannaf589252014-07-01 14:11:20 +02003923 flags = hci_inquiry_cache_update(hdev, &data, false);
3924
Johan Hedberg48264f02011-11-09 13:58:58 +02003925 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003926 info->dev_class, info->rssi,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003927 flags, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003928 }
3929 } else {
3930 struct inquiry_info_with_rssi *info = (void *) (skb->data + 1);
3931
Johan Hedberge17acd42011-03-30 23:57:16 +03003932 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003933 u32 flags;
3934
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003935 bacpy(&data.bdaddr, &info->bdaddr);
3936 data.pscan_rep_mode = info->pscan_rep_mode;
3937 data.pscan_period_mode = info->pscan_period_mode;
3938 data.pscan_mode = 0x00;
3939 memcpy(data.dev_class, info->dev_class, 3);
3940 data.clock_offset = info->clock_offset;
3941 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003942 data.ssp_mode = 0x00;
Marcel Holtmannaf589252014-07-01 14:11:20 +02003943
3944 flags = hci_inquiry_cache_update(hdev, &data, false);
3945
Johan Hedberg48264f02011-11-09 13:58:58 +02003946 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003947 info->dev_class, info->rssi,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003948 flags, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003949 }
3950 }
3951
3952 hci_dev_unlock(hdev);
3953}
3954
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003955static void hci_remote_ext_features_evt(struct hci_dev *hdev,
3956 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003957{
Marcel Holtmann41a96212008-07-14 20:13:48 +02003958 struct hci_ev_remote_ext_features *ev = (void *) skb->data;
3959 struct hci_conn *conn;
3960
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003961 BT_DBG("%s", hdev->name);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003962
Marcel Holtmann41a96212008-07-14 20:13:48 +02003963 hci_dev_lock(hdev);
3964
3965 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02003966 if (!conn)
3967 goto unlock;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003968
Johan Hedbergcad718e2013-04-17 15:00:51 +03003969 if (ev->page < HCI_MAX_PAGES)
3970 memcpy(conn->features[ev->page], ev->features, 8);
3971
Johan Hedbergccd556f2010-11-10 17:11:51 +02003972 if (!ev->status && ev->page == 0x01) {
3973 struct inquiry_entry *ie;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003974
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003975 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3976 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02003977 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann769be972008-07-14 20:13:49 +02003978
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303979 if (ev->features[0] & LMP_HOST_SSP) {
Johan Hedberg58a681e2012-01-16 06:47:28 +02003980 set_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303981 } else {
3982 /* It is mandatory by the Bluetooth specification that
3983 * Extended Inquiry Results are only used when Secure
3984 * Simple Pairing is enabled, but some devices violate
3985 * this.
3986 *
3987 * To make these devices work, the internal SSP
3988 * enabled flag needs to be cleared if the remote host
3989 * features do not indicate SSP support */
3990 clear_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
3991 }
Marcel Holtmanneb9a8f32014-01-15 22:37:38 -08003992
3993 if (ev->features[0] & LMP_HOST_SC)
3994 set_bit(HCI_CONN_SC_ENABLED, &conn->flags);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003995 }
3996
Johan Hedbergccd556f2010-11-10 17:11:51 +02003997 if (conn->state != BT_CONFIG)
3998 goto unlock;
3999
Johan Hedberg671267b2012-05-12 16:11:50 -03004000 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02004001 struct hci_cp_remote_name_req cp;
4002 memset(&cp, 0, sizeof(cp));
4003 bacpy(&cp.bdaddr, &conn->dst);
4004 cp.pscan_rep_mode = 0x02;
4005 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02004006 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00004007 mgmt_device_connected(hdev, conn, 0, NULL, 0);
Johan Hedberg392599b2010-11-18 22:22:28 +02004008
Johan Hedberg127178d2010-11-18 22:22:29 +02004009 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02004010 conn->state = BT_CONNECTED;
Johan Hedberg539c4962015-02-18 14:53:57 +02004011 hci_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02004012 hci_conn_drop(conn);
Johan Hedbergccd556f2010-11-10 17:11:51 +02004013 }
4014
4015unlock:
Marcel Holtmann41a96212008-07-14 20:13:48 +02004016 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004017}
4018
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004019static void hci_sync_conn_complete_evt(struct hci_dev *hdev,
4020 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004021{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02004022 struct hci_ev_sync_conn_complete *ev = (void *) skb->data;
4023 struct hci_conn *conn;
4024
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004025 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02004026
4027 hci_dev_lock(hdev);
4028
4029 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann9dc0a3a2008-07-14 20:13:46 +02004030 if (!conn) {
4031 if (ev->link_type == ESCO_LINK)
4032 goto unlock;
4033
Kuba Pawlak618353b2015-08-28 13:05:22 +01004034 /* When the link type in the event indicates SCO connection
4035 * and lookup of the connection object fails, then check
4036 * if an eSCO connection object exists.
4037 *
4038 * The core limits the synchronous connections to either
4039 * SCO or eSCO. The eSCO connection is preferred and tried
4040 * to be setup first and until successfully established,
4041 * the link type will be hinted as eSCO.
4042 */
Marcel Holtmann9dc0a3a2008-07-14 20:13:46 +02004043 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
4044 if (!conn)
4045 goto unlock;
Marcel Holtmann9dc0a3a2008-07-14 20:13:46 +02004046 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02004047
Marcel Holtmann732547f2009-04-19 19:14:14 +02004048 switch (ev->status) {
4049 case 0x00:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02004050 conn->handle = __le16_to_cpu(ev->handle);
4051 conn->state = BT_CONNECTED;
Kuba Pawlak618353b2015-08-28 13:05:22 +01004052 conn->type = ev->link_type;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02004053
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01004054 hci_debugfs_create_conn(conn);
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02004055 hci_conn_add_sysfs(conn);
Marcel Holtmann732547f2009-04-19 19:14:14 +02004056 break;
4057
Nick Pelly81218d22014-06-30 11:25:01 +05304058 case 0x10: /* Connection Accept Timeout */
Frédéric Dalleau1a4c9582013-08-19 14:24:02 +02004059 case 0x0d: /* Connection Rejected due to Limited Resources */
Stephen Coe705e5712010-02-16 11:29:44 -05004060 case 0x11: /* Unsupported Feature or Parameter Value */
Marcel Holtmann732547f2009-04-19 19:14:14 +02004061 case 0x1c: /* SCO interval rejected */
Nick Pelly1038a002010-02-03 11:42:26 -08004062 case 0x1a: /* Unsupported Remote Feature */
Marcel Holtmann732547f2009-04-19 19:14:14 +02004063 case 0x1f: /* Unspecified error */
Andrew Earl27539bc2014-03-10 10:31:04 +00004064 case 0x20: /* Unsupported LMP Parameter value */
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02004065 if (conn->out) {
Marcel Holtmann732547f2009-04-19 19:14:14 +02004066 conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) |
4067 (hdev->esco_type & EDR_ESCO_MASK);
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02004068 if (hci_setup_sync(conn, conn->link->handle))
4069 goto unlock;
Marcel Holtmann732547f2009-04-19 19:14:14 +02004070 }
4071 /* fall through */
4072
4073 default:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02004074 conn->state = BT_CLOSED;
Marcel Holtmann732547f2009-04-19 19:14:14 +02004075 break;
4076 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02004077
Johan Hedberg539c4962015-02-18 14:53:57 +02004078 hci_connect_cfm(conn, ev->status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02004079 if (ev->status)
4080 hci_conn_del(conn);
4081
4082unlock:
4083 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004084}
4085
Marcel Holtmannefdcf8e2013-10-15 10:31:12 -07004086static inline size_t eir_get_length(u8 *eir, size_t eir_len)
4087{
4088 size_t parsed = 0;
4089
4090 while (parsed < eir_len) {
4091 u8 field_len = eir[0];
4092
4093 if (field_len == 0)
4094 return parsed;
4095
4096 parsed += field_len + 1;
4097 eir += field_len + 1;
4098 }
4099
4100 return eir_len;
4101}
4102
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004103static void hci_extended_inquiry_result_evt(struct hci_dev *hdev,
4104 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004105{
4106 struct inquiry_data data;
4107 struct extended_inquiry_info *info = (void *) (skb->data + 1);
4108 int num_rsp = *((__u8 *) skb->data);
Vishal Agarwal9d939d92012-04-26 19:19:56 +05304109 size_t eir_len;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004110
4111 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
4112
4113 if (!num_rsp)
4114 return;
4115
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004116 if (hci_dev_test_flag(hdev, HCI_PERIODIC_INQ))
Andre Guedes1519cc12012-03-21 00:03:38 -03004117 return;
4118
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004119 hci_dev_lock(hdev);
4120
Johan Hedberge17acd42011-03-30 23:57:16 +03004121 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02004122 u32 flags;
4123 bool name_known;
Johan Hedberg561aafb2012-01-04 13:31:59 +02004124
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004125 bacpy(&data.bdaddr, &info->bdaddr);
Szymon Janc138d22e2011-02-17 16:44:23 +01004126 data.pscan_rep_mode = info->pscan_rep_mode;
4127 data.pscan_period_mode = info->pscan_period_mode;
4128 data.pscan_mode = 0x00;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004129 memcpy(data.dev_class, info->dev_class, 3);
Szymon Janc138d22e2011-02-17 16:44:23 +01004130 data.clock_offset = info->clock_offset;
4131 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02004132 data.ssp_mode = 0x01;
Johan Hedberg561aafb2012-01-04 13:31:59 +02004133
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004134 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg0d3b7f62016-01-05 13:19:31 +02004135 name_known = eir_get_data(info->data,
4136 sizeof(info->data),
4137 EIR_NAME_COMPLETE, NULL);
Johan Hedberg561aafb2012-01-04 13:31:59 +02004138 else
4139 name_known = true;
4140
Marcel Holtmannaf589252014-07-01 14:11:20 +02004141 flags = hci_inquiry_cache_update(hdev, &data, name_known);
4142
Vishal Agarwal9d939d92012-04-26 19:19:56 +05304143 eir_len = eir_get_length(info->data, sizeof(info->data));
Marcel Holtmannaf589252014-07-01 14:11:20 +02004144
Johan Hedberg48264f02011-11-09 13:58:58 +02004145 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Marcel Holtmannaf589252014-07-01 14:11:20 +02004146 info->dev_class, info->rssi,
4147 flags, info->data, eir_len, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004148 }
4149
4150 hci_dev_unlock(hdev);
4151}
4152
Johan Hedberg1c2e0042012-06-08 23:31:13 +08004153static void hci_key_refresh_complete_evt(struct hci_dev *hdev,
4154 struct sk_buff *skb)
4155{
4156 struct hci_ev_key_refresh_complete *ev = (void *) skb->data;
4157 struct hci_conn *conn;
4158
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004159 BT_DBG("%s status 0x%2.2x handle 0x%4.4x", hdev->name, ev->status,
Johan Hedberg1c2e0042012-06-08 23:31:13 +08004160 __le16_to_cpu(ev->handle));
4161
4162 hci_dev_lock(hdev);
4163
4164 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
4165 if (!conn)
4166 goto unlock;
4167
Johan Hedberg9eb1fbf2014-04-11 12:02:31 -07004168 /* For BR/EDR the necessary steps are taken through the
4169 * auth_complete event.
4170 */
4171 if (conn->type != LE_LINK)
4172 goto unlock;
4173
Johan Hedberg1c2e0042012-06-08 23:31:13 +08004174 if (!ev->status)
4175 conn->sec_level = conn->pending_sec_level;
4176
4177 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
4178
4179 if (ev->status && conn->state == BT_CONNECTED) {
Andre Guedesbed71742013-01-30 11:50:56 -03004180 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
David Herrmann76a68ba2013-04-06 20:28:37 +02004181 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08004182 goto unlock;
4183 }
4184
4185 if (conn->state == BT_CONFIG) {
4186 if (!ev->status)
4187 conn->state = BT_CONNECTED;
4188
Johan Hedberg539c4962015-02-18 14:53:57 +02004189 hci_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02004190 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08004191 } else {
4192 hci_auth_cfm(conn, ev->status);
4193
4194 hci_conn_hold(conn);
4195 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02004196 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08004197 }
4198
4199unlock:
4200 hci_dev_unlock(hdev);
4201}
4202
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004203static u8 hci_get_auth_req(struct hci_conn *conn)
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004204{
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004205 /* If remote requests no-bonding follow that lead */
Mikel Astizacabae92013-06-28 10:56:28 +02004206 if (conn->remote_auth == HCI_AT_NO_BONDING ||
4207 conn->remote_auth == HCI_AT_NO_BONDING_MITM)
Waldemar Rymarkiewicz58797bf2011-04-28 12:07:58 +02004208 return conn->remote_auth | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004209
Mikel Astizb7f94c82014-04-08 14:21:31 +02004210 /* If both remote and local have enough IO capabilities, require
4211 * MITM protection
4212 */
4213 if (conn->remote_cap != HCI_IO_NO_INPUT_OUTPUT &&
4214 conn->io_capability != HCI_IO_NO_INPUT_OUTPUT)
4215 return conn->remote_auth | 0x01;
4216
Timo Mueller7e741702014-04-08 14:21:33 +02004217 /* No MITM protection possible so ignore remote requirement */
4218 return (conn->remote_auth & ~0x01) | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004219}
4220
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08004221static u8 bredr_oob_data_present(struct hci_conn *conn)
4222{
4223 struct hci_dev *hdev = conn->hdev;
4224 struct oob_data *data;
4225
4226 data = hci_find_remote_oob_data(hdev, &conn->dst, BDADDR_BREDR);
4227 if (!data)
4228 return 0x00;
4229
Marcel Holtmann455c2ff2015-03-15 16:42:53 -07004230 if (bredr_sc_enabled(hdev)) {
4231 /* When Secure Connections is enabled, then just
4232 * return the present value stored with the OOB
4233 * data. The stored value contains the right present
4234 * information. However it can only be trusted when
4235 * not in Secure Connection Only mode.
Marcel Holtmann659c7fb2015-01-30 23:20:56 -08004236 */
Marcel Holtmann455c2ff2015-03-15 16:42:53 -07004237 if (!hci_dev_test_flag(hdev, HCI_SC_ONLY))
4238 return data->present;
4239
4240 /* When Secure Connections Only mode is enabled, then
4241 * the P-256 values are required. If they are not
4242 * available, then do not declare that OOB data is
4243 * present.
4244 */
4245 if (!memcmp(data->rand256, ZERO_KEY, 16) ||
4246 !memcmp(data->hash256, ZERO_KEY, 16))
Marcel Holtmann659c7fb2015-01-30 23:20:56 -08004247 return 0x00;
4248
Marcel Holtmann455c2ff2015-03-15 16:42:53 -07004249 return 0x02;
Marcel Holtmann659c7fb2015-01-30 23:20:56 -08004250 }
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08004251
Marcel Holtmann455c2ff2015-03-15 16:42:53 -07004252 /* When Secure Connections is not enabled or actually
4253 * not supported by the hardware, then check that if
4254 * P-192 data values are present.
4255 */
4256 if (!memcmp(data->rand192, ZERO_KEY, 16) ||
4257 !memcmp(data->hash192, ZERO_KEY, 16))
4258 return 0x00;
4259
4260 return 0x01;
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08004261}
4262
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004263static void hci_io_capa_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02004264{
4265 struct hci_ev_io_capa_request *ev = (void *) skb->data;
4266 struct hci_conn *conn;
4267
4268 BT_DBG("%s", hdev->name);
4269
4270 hci_dev_lock(hdev);
4271
4272 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg03b555e2011-01-04 15:40:05 +02004273 if (!conn)
4274 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02004275
Johan Hedberg03b555e2011-01-04 15:40:05 +02004276 hci_conn_hold(conn);
4277
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004278 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg03b555e2011-01-04 15:40:05 +02004279 goto unlock;
4280
Johan Hedberg2f407f02014-07-17 15:35:40 +03004281 /* Allow pairing if we're pairable, the initiators of the
4282 * pairing or if the remote is not requesting bonding.
4283 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004284 if (hci_dev_test_flag(hdev, HCI_BONDABLE) ||
Johan Hedberg2f407f02014-07-17 15:35:40 +03004285 test_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags) ||
Gustavo Padovan807deac2012-05-17 00:36:24 -03004286 (conn->remote_auth & ~0x01) == HCI_AT_NO_BONDING) {
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004287 struct hci_cp_io_capability_reply cp;
4288
4289 bacpy(&cp.bdaddr, &ev->bdaddr);
Hemant Gupta7a7f1e72012-01-16 13:34:29 +05304290 /* Change the IO capability from KeyboardDisplay
4291 * to DisplayYesNo as it is not supported by BT spec. */
4292 cp.capability = (conn->io_capability == 0x04) ?
Mikel Astiza7676312013-06-28 10:56:29 +02004293 HCI_IO_DISPLAY_YESNO : conn->io_capability;
Mikel Astizb7f94c82014-04-08 14:21:31 +02004294
4295 /* If we are initiators, there is no remote information yet */
4296 if (conn->remote_auth == 0xff) {
Mikel Astizb16c6602014-04-08 14:21:34 +02004297 /* Request MITM protection if our IO caps allow it
Johan Hedberg4ad51a72014-06-09 14:41:25 +03004298 * except for the no-bonding case.
Mikel Astizb16c6602014-04-08 14:21:34 +02004299 */
Mikel Astiz6fd6b912014-04-08 14:21:32 +02004300 if (conn->io_capability != HCI_IO_NO_INPUT_OUTPUT &&
Johan Hedberg9f743d72014-07-17 11:56:33 +03004301 conn->auth_type != HCI_AT_NO_BONDING)
Johan Hedberg6c538232014-07-11 15:32:23 +03004302 conn->auth_type |= 0x01;
Mikel Astizb7f94c82014-04-08 14:21:31 +02004303 } else {
4304 conn->auth_type = hci_get_auth_req(conn);
Mikel Astizb7f94c82014-04-08 14:21:31 +02004305 }
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004306
Johan Hedberg82c295b2014-07-30 09:22:24 +03004307 /* If we're not bondable, force one of the non-bondable
4308 * authentication requirement values.
4309 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004310 if (!hci_dev_test_flag(hdev, HCI_BONDABLE))
Johan Hedberg82c295b2014-07-30 09:22:24 +03004311 conn->auth_type &= HCI_AT_NO_BONDING_MITM;
4312
4313 cp.authentication = conn->auth_type;
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08004314 cp.oob_data = bredr_oob_data_present(conn);
Szymon Jancce85ee12011-03-22 13:12:23 +01004315
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004316 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03004317 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02004318 } else {
4319 struct hci_cp_io_capability_neg_reply cp;
4320
4321 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02004322 cp.reason = HCI_ERROR_PAIRING_NOT_ALLOWED;
Johan Hedberg03b555e2011-01-04 15:40:05 +02004323
4324 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03004325 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02004326 }
4327
4328unlock:
4329 hci_dev_unlock(hdev);
4330}
4331
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004332static void hci_io_capa_reply_evt(struct hci_dev *hdev, struct sk_buff *skb)
Johan Hedberg03b555e2011-01-04 15:40:05 +02004333{
4334 struct hci_ev_io_capa_reply *ev = (void *) skb->data;
4335 struct hci_conn *conn;
4336
4337 BT_DBG("%s", hdev->name);
4338
4339 hci_dev_lock(hdev);
4340
4341 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4342 if (!conn)
4343 goto unlock;
4344
Johan Hedberg03b555e2011-01-04 15:40:05 +02004345 conn->remote_cap = ev->capability;
Johan Hedberg03b555e2011-01-04 15:40:05 +02004346 conn->remote_auth = ev->authentication;
4347
4348unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02004349 hci_dev_unlock(hdev);
4350}
4351
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004352static void hci_user_confirm_request_evt(struct hci_dev *hdev,
4353 struct sk_buff *skb)
Johan Hedberga5c29682011-02-19 12:05:57 -03004354{
4355 struct hci_ev_user_confirm_req *ev = (void *) skb->data;
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004356 int loc_mitm, rem_mitm, confirm_hint = 0;
Johan Hedberg7a828902011-04-28 11:28:53 -07004357 struct hci_conn *conn;
Johan Hedberga5c29682011-02-19 12:05:57 -03004358
4359 BT_DBG("%s", hdev->name);
4360
4361 hci_dev_lock(hdev);
4362
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004363 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg7a828902011-04-28 11:28:53 -07004364 goto unlock;
Johan Hedberga5c29682011-02-19 12:05:57 -03004365
Johan Hedberg7a828902011-04-28 11:28:53 -07004366 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4367 if (!conn)
4368 goto unlock;
4369
4370 loc_mitm = (conn->auth_type & 0x01);
4371 rem_mitm = (conn->remote_auth & 0x01);
4372
4373 /* If we require MITM but the remote device can't provide that
Johan Hedberg6c538232014-07-11 15:32:23 +03004374 * (it has NoInputNoOutput) then reject the confirmation
4375 * request. We check the security level here since it doesn't
4376 * necessarily match conn->auth_type.
Mikel Astiz6fd6b912014-04-08 14:21:32 +02004377 */
Johan Hedberg6c538232014-07-11 15:32:23 +03004378 if (conn->pending_sec_level > BT_SECURITY_MEDIUM &&
4379 conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) {
Johan Hedberg7a828902011-04-28 11:28:53 -07004380 BT_DBG("Rejecting request: remote device can't provide MITM");
4381 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03004382 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07004383 goto unlock;
4384 }
4385
4386 /* If no side requires MITM protection; auto-accept */
Mikel Astiza7676312013-06-28 10:56:29 +02004387 if ((!loc_mitm || conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) &&
4388 (!rem_mitm || conn->io_capability == HCI_IO_NO_INPUT_OUTPUT)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004389
4390 /* If we're not the initiators request authorization to
4391 * proceed from user space (mgmt_user_confirm with
Johan Hedbergba15a582014-06-09 13:58:14 +03004392 * confirm_hint set to 1). The exception is if neither
Johan Hedberg02f3e252014-07-16 15:09:13 +03004393 * side had MITM or if the local IO capability is
4394 * NoInputNoOutput, in which case we do auto-accept
Johan Hedbergba15a582014-06-09 13:58:14 +03004395 */
4396 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) &&
Johan Hedberg02f3e252014-07-16 15:09:13 +03004397 conn->io_capability != HCI_IO_NO_INPUT_OUTPUT &&
Johan Hedbergba15a582014-06-09 13:58:14 +03004398 (loc_mitm || rem_mitm)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004399 BT_DBG("Confirming auto-accept as acceptor");
4400 confirm_hint = 1;
4401 goto confirm;
4402 }
4403
Johan Hedberg9f616562011-04-28 11:28:54 -07004404 BT_DBG("Auto-accept of user confirmation with %ums delay",
Gustavo Padovan807deac2012-05-17 00:36:24 -03004405 hdev->auto_accept_delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07004406
4407 if (hdev->auto_accept_delay > 0) {
4408 int delay = msecs_to_jiffies(hdev->auto_accept_delay);
Johan Hedberg7bc18d92013-10-16 18:11:39 +03004409 queue_delayed_work(conn->hdev->workqueue,
4410 &conn->auto_accept_work, delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07004411 goto unlock;
4412 }
4413
Johan Hedberg7a828902011-04-28 11:28:53 -07004414 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03004415 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07004416 goto unlock;
4417 }
4418
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004419confirm:
Johan Hedberg39adbff2014-03-20 08:18:14 +02004420 mgmt_user_confirm_request(hdev, &ev->bdaddr, ACL_LINK, 0,
4421 le32_to_cpu(ev->passkey), confirm_hint);
Johan Hedberg7a828902011-04-28 11:28:53 -07004422
4423unlock:
Johan Hedberga5c29682011-02-19 12:05:57 -03004424 hci_dev_unlock(hdev);
4425}
4426
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004427static void hci_user_passkey_request_evt(struct hci_dev *hdev,
4428 struct sk_buff *skb)
Brian Gix1143d452011-11-23 08:28:34 -08004429{
4430 struct hci_ev_user_passkey_req *ev = (void *) skb->data;
4431
4432 BT_DBG("%s", hdev->name);
4433
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004434 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg272d90d2012-02-09 15:26:12 +02004435 mgmt_user_passkey_request(hdev, &ev->bdaddr, ACL_LINK, 0);
Brian Gix1143d452011-11-23 08:28:34 -08004436}
4437
Johan Hedberg92a25252012-09-06 18:39:26 +03004438static void hci_user_passkey_notify_evt(struct hci_dev *hdev,
4439 struct sk_buff *skb)
4440{
4441 struct hci_ev_user_passkey_notify *ev = (void *) skb->data;
4442 struct hci_conn *conn;
4443
4444 BT_DBG("%s", hdev->name);
4445
4446 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4447 if (!conn)
4448 return;
4449
4450 conn->passkey_notify = __le32_to_cpu(ev->passkey);
4451 conn->passkey_entered = 0;
4452
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004453 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg92a25252012-09-06 18:39:26 +03004454 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
4455 conn->dst_type, conn->passkey_notify,
4456 conn->passkey_entered);
4457}
4458
4459static void hci_keypress_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
4460{
4461 struct hci_ev_keypress_notify *ev = (void *) skb->data;
4462 struct hci_conn *conn;
4463
4464 BT_DBG("%s", hdev->name);
4465
4466 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4467 if (!conn)
4468 return;
4469
4470 switch (ev->type) {
4471 case HCI_KEYPRESS_STARTED:
4472 conn->passkey_entered = 0;
4473 return;
4474
4475 case HCI_KEYPRESS_ENTERED:
4476 conn->passkey_entered++;
4477 break;
4478
4479 case HCI_KEYPRESS_ERASED:
4480 conn->passkey_entered--;
4481 break;
4482
4483 case HCI_KEYPRESS_CLEARED:
4484 conn->passkey_entered = 0;
4485 break;
4486
4487 case HCI_KEYPRESS_COMPLETED:
4488 return;
4489 }
4490
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004491 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg92a25252012-09-06 18:39:26 +03004492 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
4493 conn->dst_type, conn->passkey_notify,
4494 conn->passkey_entered);
4495}
4496
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004497static void hci_simple_pair_complete_evt(struct hci_dev *hdev,
4498 struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02004499{
4500 struct hci_ev_simple_pair_complete *ev = (void *) skb->data;
4501 struct hci_conn *conn;
4502
4503 BT_DBG("%s", hdev->name);
4504
4505 hci_dev_lock(hdev);
4506
4507 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg2a611692011-02-19 12:06:00 -03004508 if (!conn)
4509 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02004510
Johan Hedbergc1d4fa72014-07-17 15:14:50 +03004511 /* Reset the authentication requirement to unknown */
4512 conn->remote_auth = 0xff;
4513
Johan Hedberg2a611692011-02-19 12:06:00 -03004514 /* To avoid duplicate auth_failed events to user space we check
4515 * the HCI_CONN_AUTH_PEND flag which will be set if we
4516 * initiated the authentication. A traditional auth_complete
4517 * event gets always produced as initiator and is also mapped to
4518 * the mgmt_auth_failed event */
Mikel Astizfa1bd912012-08-09 09:52:29 +02004519 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) && ev->status)
Johan Hedberge1e930f2014-09-08 17:09:49 -07004520 mgmt_auth_failed(conn, ev->status);
Johan Hedberg2a611692011-02-19 12:06:00 -03004521
David Herrmann76a68ba2013-04-06 20:28:37 +02004522 hci_conn_drop(conn);
Johan Hedberg2a611692011-02-19 12:06:00 -03004523
4524unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02004525 hci_dev_unlock(hdev);
4526}
4527
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004528static void hci_remote_host_features_evt(struct hci_dev *hdev,
4529 struct sk_buff *skb)
Marcel Holtmann41a96212008-07-14 20:13:48 +02004530{
4531 struct hci_ev_remote_host_features *ev = (void *) skb->data;
4532 struct inquiry_entry *ie;
Johan Hedbergcad718e2013-04-17 15:00:51 +03004533 struct hci_conn *conn;
Marcel Holtmann41a96212008-07-14 20:13:48 +02004534
4535 BT_DBG("%s", hdev->name);
4536
4537 hci_dev_lock(hdev);
4538
Johan Hedbergcad718e2013-04-17 15:00:51 +03004539 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4540 if (conn)
4541 memcpy(conn->features[1], ev->features, 8);
4542
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02004543 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
4544 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02004545 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann41a96212008-07-14 20:13:48 +02004546
4547 hci_dev_unlock(hdev);
4548}
4549
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004550static void hci_remote_oob_data_request_evt(struct hci_dev *hdev,
4551 struct sk_buff *skb)
Szymon Janc2763eda2011-03-22 13:12:22 +01004552{
4553 struct hci_ev_remote_oob_data_request *ev = (void *) skb->data;
4554 struct oob_data *data;
4555
4556 BT_DBG("%s", hdev->name);
4557
4558 hci_dev_lock(hdev);
4559
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004560 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Szymon Jance1ba1f12011-04-06 13:01:59 +02004561 goto unlock;
4562
Johan Hedberg6928a922014-10-26 20:46:09 +01004563 data = hci_find_remote_oob_data(hdev, &ev->bdaddr, BDADDR_BREDR);
Marcel Holtmann6665d052015-01-27 16:04:31 -08004564 if (!data) {
Szymon Janc2763eda2011-03-22 13:12:22 +01004565 struct hci_cp_remote_oob_data_neg_reply cp;
4566
4567 bacpy(&cp.bdaddr, &ev->bdaddr);
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08004568 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_NEG_REPLY,
4569 sizeof(cp), &cp);
Marcel Holtmann6665d052015-01-27 16:04:31 -08004570 goto unlock;
4571 }
4572
4573 if (bredr_sc_enabled(hdev)) {
4574 struct hci_cp_remote_oob_ext_data_reply cp;
4575
4576 bacpy(&cp.bdaddr, &ev->bdaddr);
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004577 if (hci_dev_test_flag(hdev, HCI_SC_ONLY)) {
Marcel Holtmann6665d052015-01-27 16:04:31 -08004578 memset(cp.hash192, 0, sizeof(cp.hash192));
4579 memset(cp.rand192, 0, sizeof(cp.rand192));
4580 } else {
4581 memcpy(cp.hash192, data->hash192, sizeof(cp.hash192));
4582 memcpy(cp.rand192, data->rand192, sizeof(cp.rand192));
4583 }
4584 memcpy(cp.hash256, data->hash256, sizeof(cp.hash256));
4585 memcpy(cp.rand256, data->rand256, sizeof(cp.rand256));
4586
4587 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_EXT_DATA_REPLY,
4588 sizeof(cp), &cp);
4589 } else {
4590 struct hci_cp_remote_oob_data_reply cp;
4591
4592 bacpy(&cp.bdaddr, &ev->bdaddr);
4593 memcpy(cp.hash, data->hash192, sizeof(cp.hash));
4594 memcpy(cp.rand, data->rand192, sizeof(cp.rand));
4595
4596 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_REPLY,
4597 sizeof(cp), &cp);
Szymon Janc2763eda2011-03-22 13:12:22 +01004598 }
4599
Szymon Jance1ba1f12011-04-06 13:01:59 +02004600unlock:
Szymon Janc2763eda2011-03-22 13:12:22 +01004601 hci_dev_unlock(hdev);
4602}
4603
Arron Wanga77a6a12015-07-24 17:13:15 +08004604#if IS_ENABLED(CONFIG_BT_HS)
4605static void hci_chan_selected_evt(struct hci_dev *hdev, struct sk_buff *skb)
4606{
4607 struct hci_ev_channel_selected *ev = (void *)skb->data;
4608 struct hci_conn *hcon;
4609
4610 BT_DBG("%s handle 0x%2.2x", hdev->name, ev->phy_handle);
4611
4612 skb_pull(skb, sizeof(*ev));
4613
4614 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4615 if (!hcon)
4616 return;
4617
4618 amp_read_loc_assoc_final_data(hdev, hcon);
4619}
4620
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004621static void hci_phy_link_complete_evt(struct hci_dev *hdev,
4622 struct sk_buff *skb)
4623{
4624 struct hci_ev_phy_link_complete *ev = (void *) skb->data;
4625 struct hci_conn *hcon, *bredr_hcon;
4626
4627 BT_DBG("%s handle 0x%2.2x status 0x%2.2x", hdev->name, ev->phy_handle,
4628 ev->status);
4629
4630 hci_dev_lock(hdev);
4631
4632 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4633 if (!hcon) {
4634 hci_dev_unlock(hdev);
4635 return;
4636 }
4637
4638 if (ev->status) {
4639 hci_conn_del(hcon);
4640 hci_dev_unlock(hdev);
4641 return;
4642 }
4643
4644 bredr_hcon = hcon->amp_mgr->l2cap_conn->hcon;
4645
4646 hcon->state = BT_CONNECTED;
4647 bacpy(&hcon->dst, &bredr_hcon->dst);
4648
4649 hci_conn_hold(hcon);
4650 hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02004651 hci_conn_drop(hcon);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004652
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01004653 hci_debugfs_create_conn(hcon);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004654 hci_conn_add_sysfs(hcon);
4655
Andrei Emeltchenkocf70ff22012-10-31 15:46:36 +02004656 amp_physical_cfm(bredr_hcon, hcon);
4657
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004658 hci_dev_unlock(hdev);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004659}
4660
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004661static void hci_loglink_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
4662{
4663 struct hci_ev_logical_link_complete *ev = (void *) skb->data;
4664 struct hci_conn *hcon;
4665 struct hci_chan *hchan;
4666 struct amp_mgr *mgr;
4667
4668 BT_DBG("%s log_handle 0x%4.4x phy_handle 0x%2.2x status 0x%2.2x",
4669 hdev->name, le16_to_cpu(ev->handle), ev->phy_handle,
4670 ev->status);
4671
4672 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4673 if (!hcon)
4674 return;
4675
4676 /* Create AMP hchan */
4677 hchan = hci_chan_create(hcon);
4678 if (!hchan)
4679 return;
4680
4681 hchan->handle = le16_to_cpu(ev->handle);
4682
4683 BT_DBG("hcon %p mgr %p hchan %p", hcon, hcon->amp_mgr, hchan);
4684
4685 mgr = hcon->amp_mgr;
4686 if (mgr && mgr->bredr_chan) {
4687 struct l2cap_chan *bredr_chan = mgr->bredr_chan;
4688
4689 l2cap_chan_lock(bredr_chan);
4690
4691 bredr_chan->conn->mtu = hdev->block_mtu;
4692 l2cap_logical_cfm(bredr_chan, hchan, 0);
4693 hci_conn_hold(hcon);
4694
4695 l2cap_chan_unlock(bredr_chan);
4696 }
4697}
4698
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02004699static void hci_disconn_loglink_complete_evt(struct hci_dev *hdev,
4700 struct sk_buff *skb)
4701{
4702 struct hci_ev_disconn_logical_link_complete *ev = (void *) skb->data;
4703 struct hci_chan *hchan;
4704
4705 BT_DBG("%s log handle 0x%4.4x status 0x%2.2x", hdev->name,
4706 le16_to_cpu(ev->handle), ev->status);
4707
4708 if (ev->status)
4709 return;
4710
4711 hci_dev_lock(hdev);
4712
4713 hchan = hci_chan_lookup_handle(hdev, le16_to_cpu(ev->handle));
4714 if (!hchan)
4715 goto unlock;
4716
4717 amp_destroy_logical_link(hchan, ev->reason);
4718
4719unlock:
4720 hci_dev_unlock(hdev);
4721}
4722
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02004723static void hci_disconn_phylink_complete_evt(struct hci_dev *hdev,
4724 struct sk_buff *skb)
4725{
4726 struct hci_ev_disconn_phy_link_complete *ev = (void *) skb->data;
4727 struct hci_conn *hcon;
4728
4729 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4730
4731 if (ev->status)
4732 return;
4733
4734 hci_dev_lock(hdev);
4735
4736 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4737 if (hcon) {
4738 hcon->state = BT_CLOSED;
4739 hci_conn_del(hcon);
4740 }
4741
4742 hci_dev_unlock(hdev);
4743}
Arron Wanga77a6a12015-07-24 17:13:15 +08004744#endif
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02004745
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304746static void le_conn_complete_evt(struct hci_dev *hdev, u8 status,
4747 bdaddr_t *bdaddr, u8 bdaddr_type, u8 role, u16 handle,
4748 u16 interval, u16 latency, u16 supervision_timeout)
Ville Tervofcd89c02011-02-10 22:38:47 -03004749{
Johan Hedberg912b42ef2014-07-03 19:33:49 +03004750 struct hci_conn_params *params;
Ville Tervofcd89c02011-02-10 22:38:47 -03004751 struct hci_conn *conn;
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004752 struct smp_irk *irk;
Johan Hedberg837d5022014-07-02 09:36:22 +03004753 u8 addr_type;
Ville Tervofcd89c02011-02-10 22:38:47 -03004754
Ville Tervofcd89c02011-02-10 22:38:47 -03004755 hci_dev_lock(hdev);
4756
Johan Hedbergfbd96c12014-07-08 17:21:51 +03004757 /* All controllers implicitly stop advertising in the event of a
4758 * connection, so ensure that the state bit is cleared.
4759 */
Marcel Holtmanna358dc12015-03-13 02:11:02 -07004760 hci_dev_clear_flag(hdev, HCI_LE_ADV);
Johan Hedbergfbd96c12014-07-08 17:21:51 +03004761
Jakub Pawlowskie7d9ab72015-08-07 20:22:52 +02004762 conn = hci_lookup_le_connect(hdev);
Ville Tervob62f3282011-02-10 22:38:50 -03004763 if (!conn) {
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304764 conn = hci_conn_add(hdev, LE_LINK, bdaddr, role);
Ville Tervob62f3282011-02-10 22:38:50 -03004765 if (!conn) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01004766 bt_dev_err(hdev, "no memory for new connection");
Andre Guedes230fd162012-07-27 15:10:10 -03004767 goto unlock;
Ville Tervob62f3282011-02-10 22:38:50 -03004768 }
Andre Guedes29b79882011-05-31 14:20:54 -03004769
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304770 conn->dst_type = bdaddr_type;
Andre Guedesb9b343d2012-07-27 15:10:11 -03004771
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004772 /* If we didn't have a hci_conn object previously
4773 * but we're in master role this must be something
4774 * initiated using a white list. Since white list based
4775 * connections are not "first class citizens" we don't
4776 * have full tracking of them. Therefore, we go ahead
4777 * with a "best effort" approach of determining the
4778 * initiator address based on the HCI_PRIVACY flag.
4779 */
4780 if (conn->out) {
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304781 conn->resp_addr_type = bdaddr_type;
4782 bacpy(&conn->resp_addr, bdaddr);
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004783 if (hci_dev_test_flag(hdev, HCI_PRIVACY)) {
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004784 conn->init_addr_type = ADDR_LE_DEV_RANDOM;
4785 bacpy(&conn->init_addr, &hdev->rpa);
4786 } else {
4787 hci_copy_identity_address(hdev,
4788 &conn->init_addr,
4789 &conn->init_addr_type);
4790 }
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004791 }
Johan Hedberg9489eca2014-02-28 17:45:46 +02004792 } else {
4793 cancel_delayed_work(&conn->le_conn_timeout);
Ville Tervob62f3282011-02-10 22:38:50 -03004794 }
Ville Tervofcd89c02011-02-10 22:38:47 -03004795
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004796 if (!conn->out) {
4797 /* Set the responder (our side) address type based on
4798 * the advertising address type.
4799 */
4800 conn->resp_addr_type = hdev->adv_addr_type;
Jaganath Kanakkasseryacf0aea2018-07-19 17:09:46 +05304801 if (hdev->adv_addr_type == ADDR_LE_DEV_RANDOM) {
4802 /* In case of ext adv, resp_addr will be updated in
4803 * Adv Terminated event.
4804 */
4805 if (!ext_adv_capable(hdev))
4806 bacpy(&conn->resp_addr, &hdev->random_addr);
4807 } else {
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004808 bacpy(&conn->resp_addr, &hdev->bdaddr);
Jaganath Kanakkasseryacf0aea2018-07-19 17:09:46 +05304809 }
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004810
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304811 conn->init_addr_type = bdaddr_type;
4812 bacpy(&conn->init_addr, bdaddr);
Marcel Holtmanna720d732014-06-23 12:14:51 +02004813
4814 /* For incoming connections, set the default minimum
4815 * and maximum connection interval. They will be used
4816 * to check if the parameters are in range and if not
4817 * trigger the connection update procedure.
4818 */
4819 conn->le_conn_min_interval = hdev->le_conn_min_interval;
4820 conn->le_conn_max_interval = hdev->le_conn_max_interval;
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004821 }
Johan Hedberg7be2edb2014-02-23 19:42:17 +02004822
Marcel Holtmannedb4b462014-02-18 15:13:43 -08004823 /* Lookup the identity address from the stored connection
4824 * address and address type.
4825 *
4826 * When establishing connections to an identity address, the
4827 * connection procedure will store the resolvable random
4828 * address first. Now if it can be converted back into the
4829 * identity address, start using the identity address from
4830 * now on.
4831 */
4832 irk = hci_get_irk(hdev, &conn->dst, conn->dst_type);
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004833 if (irk) {
4834 bacpy(&conn->dst, &irk->bdaddr);
4835 conn->dst_type = irk->addr_type;
4836 }
4837
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304838 if (status) {
4839 hci_le_conn_failed(conn, status);
Johan Hedberg837d5022014-07-02 09:36:22 +03004840 goto unlock;
4841 }
4842
Johan Hedberg08853f12014-08-15 21:06:55 +03004843 if (conn->dst_type == ADDR_LE_DEV_PUBLIC)
4844 addr_type = BDADDR_LE_PUBLIC;
4845 else
4846 addr_type = BDADDR_LE_RANDOM;
4847
Johan Hedberg2d3c2262014-07-15 11:51:28 +03004848 /* Drop the connection if the device is blocked */
4849 if (hci_bdaddr_list_lookup(&hdev->blacklist, &conn->dst, addr_type)) {
4850 hci_conn_drop(conn);
Andre Guedescd17dec2012-07-27 15:10:16 -03004851 goto unlock;
4852 }
4853
Johan Hedbergb644ba32012-01-17 21:48:47 +02004854 if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00004855 mgmt_device_connected(hdev, conn, 0, NULL, 0);
Vinicius Costa Gomes83bc71b2011-05-06 18:41:43 -03004856
Vinicius Costa Gomes7b5c0d52011-06-09 18:50:50 -03004857 conn->sec_level = BT_SECURITY_LOW;
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304858 conn->handle = handle;
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07004859 conn->state = BT_CONFIG;
Ville Tervofcd89c02011-02-10 22:38:47 -03004860
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304861 conn->le_conn_interval = interval;
4862 conn->le_conn_latency = latency;
4863 conn->le_supv_timeout = supervision_timeout;
Marcel Holtmanne04fde62014-06-23 11:40:04 +02004864
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01004865 hci_debugfs_create_conn(conn);
Ville Tervofcd89c02011-02-10 22:38:47 -03004866 hci_conn_add_sysfs(conn);
4867
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304868 if (!status) {
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07004869 /* The remote features procedure is defined for master
4870 * role only. So only in case of an initiated connection
4871 * request the remote features.
4872 *
4873 * If the local controller supports slave-initiated features
4874 * exchange, then requesting the remote features in slave
4875 * role is possible. Otherwise just transition into the
4876 * connected state without requesting the remote features.
4877 */
4878 if (conn->out ||
4879 (hdev->le_features[0] & HCI_LE_SLAVE_FEATURES)) {
4880 struct hci_cp_le_read_remote_features cp;
4881
4882 cp.handle = __cpu_to_le16(conn->handle);
4883
4884 hci_send_cmd(hdev, HCI_OP_LE_READ_REMOTE_FEATURES,
4885 sizeof(cp), &cp);
4886
4887 hci_conn_hold(conn);
4888 } else {
4889 conn->state = BT_CONNECTED;
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304890 hci_connect_cfm(conn, status);
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07004891 }
4892 } else {
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304893 hci_connect_cfm(conn, status);
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07004894 }
Ville Tervofcd89c02011-02-10 22:38:47 -03004895
Johan Hedberg54776102014-08-15 21:06:56 +03004896 params = hci_pend_le_action_lookup(&hdev->pend_le_conns, &conn->dst,
4897 conn->dst_type);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004898 if (params) {
Johan Hedberg95305ba2014-07-04 12:37:21 +03004899 list_del_init(&params->action);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004900 if (params->conn) {
4901 hci_conn_drop(params->conn);
Johan Hedbergf8aaf9b2014-08-17 23:28:57 +03004902 hci_conn_put(params->conn);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004903 params->conn = NULL;
4904 }
4905 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004906
Ville Tervofcd89c02011-02-10 22:38:47 -03004907unlock:
Johan Hedberg223683a2014-07-06 15:44:23 +03004908 hci_update_background_scan(hdev);
Ville Tervofcd89c02011-02-10 22:38:47 -03004909 hci_dev_unlock(hdev);
4910}
4911
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304912static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
4913{
4914 struct hci_ev_le_conn_complete *ev = (void *) skb->data;
4915
4916 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4917
4918 le_conn_complete_evt(hdev, ev->status, &ev->bdaddr, ev->bdaddr_type,
4919 ev->role, le16_to_cpu(ev->handle),
4920 le16_to_cpu(ev->interval),
4921 le16_to_cpu(ev->latency),
4922 le16_to_cpu(ev->supervision_timeout));
4923}
4924
Jaganath Kanakkassery4d94f952018-07-06 22:50:32 +02004925static void hci_le_enh_conn_complete_evt(struct hci_dev *hdev,
4926 struct sk_buff *skb)
4927{
4928 struct hci_ev_le_enh_conn_complete *ev = (void *) skb->data;
4929
4930 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4931
4932 le_conn_complete_evt(hdev, ev->status, &ev->bdaddr, ev->bdaddr_type,
4933 ev->role, le16_to_cpu(ev->handle),
4934 le16_to_cpu(ev->interval),
4935 le16_to_cpu(ev->latency),
4936 le16_to_cpu(ev->supervision_timeout));
4937}
4938
Jaganath Kanakkasseryacf0aea2018-07-19 17:09:46 +05304939static void hci_le_ext_adv_term_evt(struct hci_dev *hdev, struct sk_buff *skb)
4940{
4941 struct hci_evt_le_ext_adv_set_term *ev = (void *) skb->data;
4942 struct hci_conn *conn;
4943
4944 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4945
4946 if (ev->status)
4947 return;
4948
4949 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->conn_handle));
4950 if (conn) {
4951 struct adv_info *adv_instance;
4952
4953 if (hdev->adv_addr_type != ADDR_LE_DEV_RANDOM)
4954 return;
4955
4956 if (!hdev->cur_adv_instance) {
4957 bacpy(&conn->resp_addr, &hdev->random_addr);
4958 return;
4959 }
4960
4961 adv_instance = hci_find_adv_instance(hdev, hdev->cur_adv_instance);
4962 if (adv_instance)
4963 bacpy(&conn->resp_addr, &adv_instance->random_addr);
4964 }
4965}
4966
Marcel Holtmann1855d922014-06-23 11:40:05 +02004967static void hci_le_conn_update_complete_evt(struct hci_dev *hdev,
4968 struct sk_buff *skb)
4969{
4970 struct hci_ev_le_conn_update_complete *ev = (void *) skb->data;
4971 struct hci_conn *conn;
4972
4973 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4974
4975 if (ev->status)
4976 return;
4977
4978 hci_dev_lock(hdev);
4979
4980 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
4981 if (conn) {
4982 conn->le_conn_interval = le16_to_cpu(ev->interval);
4983 conn->le_conn_latency = le16_to_cpu(ev->latency);
4984 conn->le_supv_timeout = le16_to_cpu(ev->supervision_timeout);
4985 }
4986
4987 hci_dev_unlock(hdev);
4988}
4989
Andre Guedesa4790db2014-02-26 20:21:47 -03004990/* This function requires the caller holds hdev->lock */
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004991static struct hci_conn *check_pending_le_conn(struct hci_dev *hdev,
4992 bdaddr_t *addr,
Szymon Janc082f2302018-04-03 13:40:06 +02004993 u8 addr_type, u8 adv_type,
4994 bdaddr_t *direct_rpa)
Andre Guedesa4790db2014-02-26 20:21:47 -03004995{
4996 struct hci_conn *conn;
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004997 struct hci_conn_params *params;
Andre Guedesa4790db2014-02-26 20:21:47 -03004998
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004999 /* If the event is not connectable don't proceed further */
5000 if (adv_type != LE_ADV_IND && adv_type != LE_ADV_DIRECT_IND)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00005001 return NULL;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03005002
5003 /* Ignore if the device is blocked */
Johan Hedbergdcc36c12014-07-09 12:59:13 +03005004 if (hci_bdaddr_list_lookup(&hdev->blacklist, addr, addr_type))
Alfonso Acostafd45ada2014-10-07 08:44:11 +00005005 return NULL;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03005006
Johan Hedbergf99353c2014-07-16 11:56:09 +03005007 /* Most controller will fail if we try to create new connections
5008 * while we have an existing one in slave role.
5009 */
5010 if (hdev->conn_hash.le_num_slave > 0)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00005011 return NULL;
Johan Hedbergf99353c2014-07-16 11:56:09 +03005012
Johan Hedberg1c1abca2014-07-07 12:45:53 +03005013 /* If we're not connectable only connect devices that we have in
5014 * our pend_le_conns list.
5015 */
Johan Hedberg49c50922015-10-16 10:07:51 +03005016 params = hci_pend_le_action_lookup(&hdev->pend_le_conns, addr,
5017 addr_type);
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02005018 if (!params)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00005019 return NULL;
Andre Guedesa4790db2014-02-26 20:21:47 -03005020
Jakub Pawlowski28a667c2015-08-07 20:22:54 +02005021 if (!params->explicit_connect) {
5022 switch (params->auto_connect) {
5023 case HCI_AUTO_CONN_DIRECT:
5024 /* Only devices advertising with ADV_DIRECT_IND are
5025 * triggering a connection attempt. This is allowing
5026 * incoming connections from slave devices.
5027 */
5028 if (adv_type != LE_ADV_DIRECT_IND)
5029 return NULL;
5030 break;
5031 case HCI_AUTO_CONN_ALWAYS:
5032 /* Devices advertising with ADV_IND or ADV_DIRECT_IND
5033 * are triggering a connection attempt. This means
5034 * that incoming connectioms from slave device are
5035 * accepted and also outgoing connections to slave
5036 * devices are established when found.
5037 */
5038 break;
5039 default:
Alfonso Acostafd45ada2014-10-07 08:44:11 +00005040 return NULL;
Jakub Pawlowski28a667c2015-08-07 20:22:54 +02005041 }
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02005042 }
5043
Andre Guedesa4790db2014-02-26 20:21:47 -03005044 conn = hci_connect_le(hdev, addr, addr_type, BT_SECURITY_LOW,
Szymon Janc082f2302018-04-03 13:40:06 +02005045 HCI_LE_AUTOCONN_TIMEOUT, HCI_ROLE_MASTER,
5046 direct_rpa);
Johan Hedbergf161dd42014-08-15 21:06:54 +03005047 if (!IS_ERR(conn)) {
Jakub Pawlowski28a667c2015-08-07 20:22:54 +02005048 /* If HCI_AUTO_CONN_EXPLICIT is set, conn is already owned
5049 * by higher layer that tried to connect, if no then
5050 * store the pointer since we don't really have any
Johan Hedbergf161dd42014-08-15 21:06:54 +03005051 * other owner of the object besides the params that
5052 * triggered it. This way we can abort the connection if
5053 * the parameters get removed and keep the reference
5054 * count consistent once the connection is established.
5055 */
Jakub Pawlowski28a667c2015-08-07 20:22:54 +02005056
5057 if (!params->explicit_connect)
5058 params->conn = hci_conn_get(conn);
5059
Alfonso Acostafd45ada2014-10-07 08:44:11 +00005060 return conn;
Johan Hedbergf161dd42014-08-15 21:06:54 +03005061 }
Andre Guedesa4790db2014-02-26 20:21:47 -03005062
5063 switch (PTR_ERR(conn)) {
5064 case -EBUSY:
5065 /* If hci_connect() returns -EBUSY it means there is already
5066 * an LE connection attempt going on. Since controllers don't
5067 * support more than one connection attempt at the time, we
5068 * don't consider this an error case.
5069 */
5070 break;
5071 default:
5072 BT_DBG("Failed to connect: err %ld", PTR_ERR(conn));
Alfonso Acostafd45ada2014-10-07 08:44:11 +00005073 return NULL;
Andre Guedesa4790db2014-02-26 20:21:47 -03005074 }
Alfonso Acostafd45ada2014-10-07 08:44:11 +00005075
5076 return NULL;
Andre Guedesa4790db2014-02-26 20:21:47 -03005077}
5078
Johan Hedberg4af605d2014-03-24 10:48:00 +02005079static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr,
Marcel Holtmann2f010b52014-12-05 16:20:13 +01005080 u8 bdaddr_type, bdaddr_t *direct_addr,
5081 u8 direct_addr_type, s8 rssi, u8 *data, u8 len)
Johan Hedberg4af605d2014-03-24 10:48:00 +02005082{
Johan Hedbergb9a63282014-03-25 10:51:52 +02005083 struct discovery_state *d = &hdev->discovery;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03005084 struct smp_irk *irk;
Alfonso Acostafd45ada2014-10-07 08:44:11 +00005085 struct hci_conn *conn;
Johan Hedberg474ee062014-03-25 14:34:59 +02005086 bool match;
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02005087 u32 flags;
Szymon Janc68183752015-09-16 20:21:54 +02005088 u8 *ptr, real_len;
5089
Johan Hedberg56b40fb2016-04-07 21:01:27 +03005090 switch (type) {
5091 case LE_ADV_IND:
5092 case LE_ADV_DIRECT_IND:
5093 case LE_ADV_SCAN_IND:
5094 case LE_ADV_NONCONN_IND:
5095 case LE_ADV_SCAN_RSP:
5096 break;
5097 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01005098 bt_dev_err_ratelimited(hdev, "unknown advertising packet "
5099 "type: 0x%02x", type);
Johan Hedberg56b40fb2016-04-07 21:01:27 +03005100 return;
5101 }
5102
Szymon Janc68183752015-09-16 20:21:54 +02005103 /* Find the end of the data in case the report contains padded zero
5104 * bytes at the end causing an invalid length value.
5105 *
5106 * When data is NULL, len is 0 so there is no need for extra ptr
5107 * check as 'ptr < data + 0' is already false in such case.
5108 */
5109 for (ptr = data; ptr < data + len && *ptr; ptr += *ptr + 1) {
5110 if (ptr + 1 + *ptr > data + len)
5111 break;
5112 }
5113
5114 real_len = ptr - data;
5115
5116 /* Adjust for actual length */
5117 if (len != real_len) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01005118 bt_dev_err_ratelimited(hdev, "advertising data len corrected");
Szymon Janc68183752015-09-16 20:21:54 +02005119 len = real_len;
5120 }
Johan Hedbergb9a63282014-03-25 10:51:52 +02005121
Marcel Holtmann2f010b52014-12-05 16:20:13 +01005122 /* If the direct address is present, then this report is from
5123 * a LE Direct Advertising Report event. In that case it is
5124 * important to see if the address is matching the local
5125 * controller address.
5126 */
5127 if (direct_addr) {
5128 /* Only resolvable random addresses are valid for these
5129 * kind of reports and others can be ignored.
5130 */
5131 if (!hci_bdaddr_is_rpa(direct_addr, direct_addr_type))
5132 return;
5133
5134 /* If the controller is not using resolvable random
5135 * addresses, then this report can be ignored.
5136 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07005137 if (!hci_dev_test_flag(hdev, HCI_PRIVACY))
Marcel Holtmann2f010b52014-12-05 16:20:13 +01005138 return;
5139
5140 /* If the local IRK of the controller does not match
5141 * with the resolvable random address provided, then
5142 * this report can be ignored.
5143 */
5144 if (!smp_irk_matches(hdev, hdev->irk, direct_addr))
5145 return;
5146 }
5147
Johan Hedberg1c1abca2014-07-07 12:45:53 +03005148 /* Check if we need to convert to identity address */
5149 irk = hci_get_irk(hdev, bdaddr, bdaddr_type);
5150 if (irk) {
5151 bdaddr = &irk->bdaddr;
5152 bdaddr_type = irk->addr_type;
5153 }
5154
Szymon Janc082f2302018-04-03 13:40:06 +02005155 /* Check if we have been requested to connect to this device.
5156 *
5157 * direct_addr is set only for directed advertising reports (it is NULL
5158 * for advertising reports) and is already verified to be RPA above.
5159 */
5160 conn = check_pending_le_conn(hdev, bdaddr, bdaddr_type, type,
5161 direct_addr);
Alfonso Acostafd45ada2014-10-07 08:44:11 +00005162 if (conn && type == LE_ADV_IND) {
5163 /* Store report for later inclusion by
5164 * mgmt_device_connected
5165 */
5166 memcpy(conn->le_adv_data, data, len);
5167 conn->le_adv_data_len = len;
5168 }
Johan Hedberg1c1abca2014-07-07 12:45:53 +03005169
Johan Hedberg0d2bf132014-07-02 22:42:02 +03005170 /* Passive scanning shouldn't trigger any device found events,
5171 * except for devices marked as CONN_REPORT for which we do send
5172 * device found events.
5173 */
Johan Hedbergca5c4be2014-03-25 10:30:46 +02005174 if (hdev->le_scan_type == LE_SCAN_PASSIVE) {
Johan Hedberg0d2bf132014-07-02 22:42:02 +03005175 if (type == LE_ADV_DIRECT_IND)
5176 return;
5177
Johan Hedberg3a19b6f2014-07-15 08:07:59 +03005178 if (!hci_pend_le_action_lookup(&hdev->pend_le_reports,
5179 bdaddr, bdaddr_type))
Johan Hedberg0d2bf132014-07-02 22:42:02 +03005180 return;
5181
5182 if (type == LE_ADV_NONCONN_IND || type == LE_ADV_SCAN_IND)
5183 flags = MGMT_DEV_FOUND_NOT_CONNECTABLE;
5184 else
5185 flags = 0;
5186 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
5187 rssi, flags, data, len, NULL, 0);
Johan Hedberg97bf2e92014-07-04 12:37:16 +03005188 return;
Johan Hedbergca5c4be2014-03-25 10:30:46 +02005189 }
Johan Hedberg4af605d2014-03-24 10:48:00 +02005190
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02005191 /* When receiving non-connectable or scannable undirected
5192 * advertising reports, this means that the remote device is
5193 * not connectable and then clearly indicate this in the
5194 * device found event.
5195 *
5196 * When receiving a scan response, then there is no way to
5197 * know if the remote device is connectable or not. However
5198 * since scan responses are merged with a previously seen
5199 * advertising report, the flags field from that report
5200 * will be used.
5201 *
5202 * In the really unlikely case that a controller get confused
5203 * and just sends a scan response event, then it is marked as
5204 * not connectable as well.
5205 */
5206 if (type == LE_ADV_NONCONN_IND || type == LE_ADV_SCAN_IND ||
5207 type == LE_ADV_SCAN_RSP)
5208 flags = MGMT_DEV_FOUND_NOT_CONNECTABLE;
5209 else
5210 flags = 0;
5211
Johan Hedbergb9a63282014-03-25 10:51:52 +02005212 /* If there's nothing pending either store the data from this
5213 * event or send an immediate device found event if the data
5214 * should not be stored for later.
5215 */
5216 if (!has_pending_adv_report(hdev)) {
5217 /* If the report will trigger a SCAN_REQ store it for
5218 * later merging.
5219 */
5220 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
5221 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02005222 rssi, flags, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02005223 return;
5224 }
5225
5226 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02005227 rssi, flags, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02005228 return;
5229 }
5230
Johan Hedberg474ee062014-03-25 14:34:59 +02005231 /* Check if the pending report is for the same device as the new one */
5232 match = (!bacmp(bdaddr, &d->last_adv_addr) &&
5233 bdaddr_type == d->last_adv_addr_type);
5234
Johan Hedbergb9a63282014-03-25 10:51:52 +02005235 /* If the pending data doesn't match this report or this isn't a
5236 * scan response (e.g. we got a duplicate ADV_IND) then force
5237 * sending of the pending data.
5238 */
Johan Hedberg474ee062014-03-25 14:34:59 +02005239 if (type != LE_ADV_SCAN_RSP || !match) {
5240 /* Send out whatever is in the cache, but skip duplicates */
5241 if (!match)
5242 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergff5cd292014-03-25 14:40:52 +02005243 d->last_adv_addr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02005244 d->last_adv_rssi, d->last_adv_flags,
Johan Hedbergff5cd292014-03-25 14:40:52 +02005245 d->last_adv_data,
Johan Hedberg474ee062014-03-25 14:34:59 +02005246 d->last_adv_data_len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02005247
5248 /* If the new report will trigger a SCAN_REQ store it for
5249 * later merging.
5250 */
5251 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
5252 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02005253 rssi, flags, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02005254 return;
5255 }
5256
5257 /* The advertising reports cannot be merged, so clear
5258 * the pending report and send out a device found event.
5259 */
5260 clear_pending_adv_report(hdev);
Johan Hedberg5c5b93e2014-03-29 08:39:53 +02005261 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02005262 rssi, flags, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02005263 return;
5264 }
5265
5266 /* If we get here we've got a pending ADV_IND or ADV_SCAN_IND and
5267 * the new event is a SCAN_RSP. We can therefore proceed with
5268 * sending a merged device found event.
5269 */
5270 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02005271 d->last_adv_addr_type, NULL, rssi, d->last_adv_flags,
Marcel Holtmann42bd6a52014-07-01 14:11:19 +02005272 d->last_adv_data, d->last_adv_data_len, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02005273 clear_pending_adv_report(hdev);
Johan Hedberg4af605d2014-03-24 10:48:00 +02005274}
5275
Gustavo Padovan6039aa72012-05-23 04:04:18 -03005276static void hci_le_adv_report_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andre Guedes9aa04c92011-05-26 16:23:51 -03005277{
Andre Guedese95beb42011-09-26 20:48:35 -03005278 u8 num_reports = skb->data[0];
5279 void *ptr = &skb->data[1];
Andre Guedes9aa04c92011-05-26 16:23:51 -03005280
Andre Guedesa4790db2014-02-26 20:21:47 -03005281 hci_dev_lock(hdev);
5282
Andre Guedese95beb42011-09-26 20:48:35 -03005283 while (num_reports--) {
5284 struct hci_ev_le_advertising_info *ev = ptr;
Johan Hedberg4af605d2014-03-24 10:48:00 +02005285 s8 rssi;
Andre Guedesa4790db2014-02-26 20:21:47 -03005286
Chriz Chowee649342018-04-20 15:46:24 +08005287 if (ev->length <= HCI_MAX_AD_LENGTH) {
5288 rssi = ev->data[ev->length];
5289 process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
5290 ev->bdaddr_type, NULL, 0, rssi,
5291 ev->data, ev->length);
5292 } else {
5293 bt_dev_err(hdev, "Dropping invalid advertising data");
5294 }
Andre Guedes3c9e9192012-01-10 18:20:50 -03005295
Andre Guedese95beb42011-09-26 20:48:35 -03005296 ptr += sizeof(*ev) + ev->length + 1;
Andre Guedes9aa04c92011-05-26 16:23:51 -03005297 }
Andre Guedesa4790db2014-02-26 20:21:47 -03005298
5299 hci_dev_unlock(hdev);
Andre Guedes9aa04c92011-05-26 16:23:51 -03005300}
5301
Jaganath Kanakkasseryb2cc9762018-07-19 17:09:38 +05305302static u8 ext_evt_type_to_legacy(u16 evt_type)
Jaganath Kanakkasseryc215e932018-07-06 17:05:29 +05305303{
Jaganath Kanakkasseryb2cc9762018-07-19 17:09:38 +05305304 if (evt_type & LE_EXT_ADV_LEGACY_PDU) {
5305 switch (evt_type) {
5306 case LE_LEGACY_ADV_IND:
5307 return LE_ADV_IND;
5308 case LE_LEGACY_ADV_DIRECT_IND:
5309 return LE_ADV_DIRECT_IND;
5310 case LE_LEGACY_ADV_SCAN_IND:
5311 return LE_ADV_SCAN_IND;
5312 case LE_LEGACY_NONCONN_IND:
5313 return LE_ADV_NONCONN_IND;
5314 case LE_LEGACY_SCAN_RSP_ADV:
5315 case LE_LEGACY_SCAN_RSP_ADV_SCAN:
5316 return LE_ADV_SCAN_RSP;
5317 }
5318
5319 BT_ERR_RATELIMITED("Unknown advertising packet type: 0x%02x",
5320 evt_type);
5321
5322 return LE_ADV_INVALID;
Jaganath Kanakkasseryc215e932018-07-06 17:05:29 +05305323 }
5324
Jaganath Kanakkasseryb2cc9762018-07-19 17:09:38 +05305325 if (evt_type & LE_EXT_ADV_CONN_IND) {
5326 if (evt_type & LE_EXT_ADV_DIRECT_IND)
5327 return LE_ADV_DIRECT_IND;
5328
5329 return LE_ADV_IND;
5330 }
5331
5332 if (evt_type & LE_EXT_ADV_SCAN_RSP)
5333 return LE_ADV_SCAN_RSP;
5334
5335 if (evt_type & LE_EXT_ADV_SCAN_IND)
5336 return LE_ADV_SCAN_IND;
5337
5338 if (evt_type == LE_EXT_ADV_NON_CONN_IND ||
5339 evt_type & LE_EXT_ADV_DIRECT_IND)
5340 return LE_ADV_NONCONN_IND;
5341
Jaganath Kanakkasseryc215e932018-07-06 17:05:29 +05305342 BT_ERR_RATELIMITED("Unknown advertising packet type: 0x%02x",
5343 evt_type);
5344
5345 return LE_ADV_INVALID;
5346}
5347
5348static void hci_le_ext_adv_report_evt(struct hci_dev *hdev, struct sk_buff *skb)
5349{
5350 u8 num_reports = skb->data[0];
5351 void *ptr = &skb->data[1];
5352
5353 hci_dev_lock(hdev);
5354
5355 while (num_reports--) {
5356 struct hci_ev_le_ext_adv_report *ev = ptr;
5357 u8 legacy_evt_type;
5358 u16 evt_type;
5359
5360 evt_type = __le16_to_cpu(ev->evt_type);
Jaganath Kanakkasseryb2cc9762018-07-19 17:09:38 +05305361 legacy_evt_type = ext_evt_type_to_legacy(evt_type);
Jaganath Kanakkasseryc215e932018-07-06 17:05:29 +05305362 if (legacy_evt_type != LE_ADV_INVALID) {
5363 process_adv_report(hdev, legacy_evt_type, &ev->bdaddr,
5364 ev->bdaddr_type, NULL, 0, ev->rssi,
5365 ev->data, ev->length);
5366 }
5367
5368 ptr += sizeof(*ev) + ev->length + 1;
5369 }
5370
5371 hci_dev_unlock(hdev);
5372}
5373
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07005374static void hci_le_remote_feat_complete_evt(struct hci_dev *hdev,
5375 struct sk_buff *skb)
5376{
5377 struct hci_ev_le_remote_feat_complete *ev = (void *)skb->data;
5378 struct hci_conn *conn;
5379
5380 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
5381
5382 hci_dev_lock(hdev);
5383
5384 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
5385 if (conn) {
5386 if (!ev->status)
5387 memcpy(conn->features[0], ev->features, 8);
5388
5389 if (conn->state == BT_CONFIG) {
5390 __u8 status;
5391
5392 /* If the local controller supports slave-initiated
5393 * features exchange, but the remote controller does
5394 * not, then it is possible that the error code 0x1a
5395 * for unsupported remote feature gets returned.
5396 *
5397 * In this specific case, allow the connection to
5398 * transition into connected state and mark it as
5399 * successful.
5400 */
5401 if ((hdev->le_features[0] & HCI_LE_SLAVE_FEATURES) &&
5402 !conn->out && ev->status == 0x1a)
5403 status = 0x00;
5404 else
5405 status = ev->status;
5406
5407 conn->state = BT_CONNECTED;
5408 hci_connect_cfm(conn, status);
5409 hci_conn_drop(conn);
5410 }
5411 }
5412
5413 hci_dev_unlock(hdev);
5414}
5415
Gustavo Padovan6039aa72012-05-23 04:04:18 -03005416static void hci_le_ltk_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005417{
5418 struct hci_ev_le_ltk_req *ev = (void *) skb->data;
5419 struct hci_cp_le_ltk_reply cp;
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03005420 struct hci_cp_le_ltk_neg_reply neg;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005421 struct hci_conn *conn;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03005422 struct smp_ltk *ltk;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005423
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03005424 BT_DBG("%s handle 0x%4.4x", hdev->name, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005425
5426 hci_dev_lock(hdev);
5427
5428 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03005429 if (conn == NULL)
5430 goto not_found;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005431
Johan Hedbergf3a73d92014-05-29 15:02:59 +03005432 ltk = hci_find_ltk(hdev, &conn->dst, conn->dst_type, conn->role);
Johan Hedberg5378bc52014-05-29 14:00:39 +03005433 if (!ltk)
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03005434 goto not_found;
5435
Johan Hedberg5378bc52014-05-29 14:00:39 +03005436 if (smp_ltk_is_sc(ltk)) {
5437 /* With SC both EDiv and Rand are set to zero */
5438 if (ev->ediv || ev->rand)
5439 goto not_found;
5440 } else {
5441 /* For non-SC keys check that EDiv and Rand match */
5442 if (ev->ediv != ltk->ediv || ev->rand != ltk->rand)
5443 goto not_found;
5444 }
5445
Johan Hedberg8b76ce32015-06-08 18:14:39 +03005446 memcpy(cp.ltk, ltk->val, ltk->enc_size);
5447 memset(cp.ltk + ltk->enc_size, 0, sizeof(cp.ltk) - ltk->enc_size);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005448 cp.handle = cpu_to_le16(conn->handle);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03005449
Johan Hedberga6f78332014-09-10 17:37:45 -07005450 conn->pending_sec_level = smp_ltk_sec_level(ltk);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005451
Andre Guedes89cbb4d2013-07-31 16:25:29 -03005452 conn->enc_key_size = ltk->enc_size;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005453
5454 hci_send_cmd(hdev, HCI_OP_LE_LTK_REPLY, sizeof(cp), &cp);
5455
Claudio Takahasi5981a882013-07-25 16:34:24 -03005456 /* Ref. Bluetooth Core SPEC pages 1975 and 2004. STK is a
5457 * temporary key used to encrypt a connection following
5458 * pairing. It is used during the Encrypted Session Setup to
5459 * distribute the keys. Later, security can be re-established
5460 * using a distributed LTK.
5461 */
Johan Hedberg2ceba532014-06-16 19:25:16 +03005462 if (ltk->type == SMP_STK) {
Johan Hedbergfe59a052014-07-01 19:14:12 +03005463 set_bit(HCI_CONN_STK_ENCRYPT, &conn->flags);
Johan Hedberg970d0f12014-11-13 14:37:47 +02005464 list_del_rcu(&ltk->list);
5465 kfree_rcu(ltk, rcu);
Johan Hedbergfe59a052014-07-01 19:14:12 +03005466 } else {
5467 clear_bit(HCI_CONN_STK_ENCRYPT, &conn->flags);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03005468 }
5469
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005470 hci_dev_unlock(hdev);
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03005471
5472 return;
5473
5474not_found:
5475 neg.handle = ev->handle;
5476 hci_send_cmd(hdev, HCI_OP_LE_LTK_NEG_REPLY, sizeof(neg), &neg);
5477 hci_dev_unlock(hdev);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005478}
5479
Andre Guedes8e75b462014-07-01 18:10:08 -03005480static void send_conn_param_neg_reply(struct hci_dev *hdev, u16 handle,
5481 u8 reason)
5482{
5483 struct hci_cp_le_conn_param_req_neg_reply cp;
5484
5485 cp.handle = cpu_to_le16(handle);
5486 cp.reason = reason;
5487
5488 hci_send_cmd(hdev, HCI_OP_LE_CONN_PARAM_REQ_NEG_REPLY, sizeof(cp),
5489 &cp);
5490}
5491
5492static void hci_le_remote_conn_param_req_evt(struct hci_dev *hdev,
5493 struct sk_buff *skb)
5494{
5495 struct hci_ev_le_remote_conn_param_req *ev = (void *) skb->data;
5496 struct hci_cp_le_conn_param_req_reply cp;
5497 struct hci_conn *hcon;
5498 u16 handle, min, max, latency, timeout;
5499
5500 handle = le16_to_cpu(ev->handle);
5501 min = le16_to_cpu(ev->interval_min);
5502 max = le16_to_cpu(ev->interval_max);
5503 latency = le16_to_cpu(ev->latency);
5504 timeout = le16_to_cpu(ev->timeout);
5505
5506 hcon = hci_conn_hash_lookup_handle(hdev, handle);
5507 if (!hcon || hcon->state != BT_CONNECTED)
5508 return send_conn_param_neg_reply(hdev, handle,
5509 HCI_ERROR_UNKNOWN_CONN_ID);
5510
5511 if (hci_check_conn_params(min, max, latency, timeout))
5512 return send_conn_param_neg_reply(hdev, handle,
5513 HCI_ERROR_INVALID_LL_PARAMS);
5514
Johan Hedberg40bef302014-07-16 11:42:27 +03005515 if (hcon->role == HCI_ROLE_MASTER) {
Johan Hedberg348d50b2014-07-02 17:37:30 +03005516 struct hci_conn_params *params;
Johan Hedbergf4869e22014-07-02 17:37:32 +03005517 u8 store_hint;
Johan Hedberg348d50b2014-07-02 17:37:30 +03005518
5519 hci_dev_lock(hdev);
5520
5521 params = hci_conn_params_lookup(hdev, &hcon->dst,
5522 hcon->dst_type);
5523 if (params) {
5524 params->conn_min_interval = min;
5525 params->conn_max_interval = max;
5526 params->conn_latency = latency;
5527 params->supervision_timeout = timeout;
Johan Hedbergf4869e22014-07-02 17:37:32 +03005528 store_hint = 0x01;
5529 } else{
5530 store_hint = 0x00;
Johan Hedberg348d50b2014-07-02 17:37:30 +03005531 }
5532
5533 hci_dev_unlock(hdev);
5534
Johan Hedbergf4869e22014-07-02 17:37:32 +03005535 mgmt_new_conn_param(hdev, &hcon->dst, hcon->dst_type,
5536 store_hint, min, max, latency, timeout);
Johan Hedberg348d50b2014-07-02 17:37:30 +03005537 }
Andre Guedesffb5a8272014-07-01 18:10:11 -03005538
Andre Guedes8e75b462014-07-01 18:10:08 -03005539 cp.handle = ev->handle;
5540 cp.interval_min = ev->interval_min;
5541 cp.interval_max = ev->interval_max;
5542 cp.latency = ev->latency;
5543 cp.timeout = ev->timeout;
5544 cp.min_ce_len = 0;
5545 cp.max_ce_len = 0;
5546
5547 hci_send_cmd(hdev, HCI_OP_LE_CONN_PARAM_REQ_REPLY, sizeof(cp), &cp);
5548}
5549
Marcel Holtmann2f010b52014-12-05 16:20:13 +01005550static void hci_le_direct_adv_report_evt(struct hci_dev *hdev,
5551 struct sk_buff *skb)
5552{
5553 u8 num_reports = skb->data[0];
5554 void *ptr = &skb->data[1];
5555
5556 hci_dev_lock(hdev);
5557
5558 while (num_reports--) {
5559 struct hci_ev_le_direct_adv_info *ev = ptr;
5560
5561 process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
5562 ev->bdaddr_type, &ev->direct_addr,
5563 ev->direct_addr_type, ev->rssi, NULL, 0);
5564
5565 ptr += sizeof(*ev);
5566 }
5567
5568 hci_dev_unlock(hdev);
5569}
5570
Gustavo Padovan6039aa72012-05-23 04:04:18 -03005571static void hci_le_meta_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03005572{
5573 struct hci_ev_le_meta *le_ev = (void *) skb->data;
5574
5575 skb_pull(skb, sizeof(*le_ev));
5576
5577 switch (le_ev->subevent) {
5578 case HCI_EV_LE_CONN_COMPLETE:
5579 hci_le_conn_complete_evt(hdev, skb);
5580 break;
5581
Marcel Holtmann1855d922014-06-23 11:40:05 +02005582 case HCI_EV_LE_CONN_UPDATE_COMPLETE:
5583 hci_le_conn_update_complete_evt(hdev, skb);
5584 break;
5585
Andre Guedes9aa04c92011-05-26 16:23:51 -03005586 case HCI_EV_LE_ADVERTISING_REPORT:
5587 hci_le_adv_report_evt(hdev, skb);
5588 break;
5589
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07005590 case HCI_EV_LE_REMOTE_FEAT_COMPLETE:
5591 hci_le_remote_feat_complete_evt(hdev, skb);
5592 break;
5593
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005594 case HCI_EV_LE_LTK_REQ:
5595 hci_le_ltk_request_evt(hdev, skb);
5596 break;
5597
Andre Guedes8e75b462014-07-01 18:10:08 -03005598 case HCI_EV_LE_REMOTE_CONN_PARAM_REQ:
5599 hci_le_remote_conn_param_req_evt(hdev, skb);
5600 break;
5601
Marcel Holtmann2f010b52014-12-05 16:20:13 +01005602 case HCI_EV_LE_DIRECT_ADV_REPORT:
5603 hci_le_direct_adv_report_evt(hdev, skb);
5604 break;
5605
Jaganath Kanakkasseryc215e932018-07-06 17:05:29 +05305606 case HCI_EV_LE_EXT_ADV_REPORT:
5607 hci_le_ext_adv_report_evt(hdev, skb);
5608 break;
5609
Jaganath Kanakkassery4d94f952018-07-06 22:50:32 +02005610 case HCI_EV_LE_ENHANCED_CONN_COMPLETE:
5611 hci_le_enh_conn_complete_evt(hdev, skb);
5612 break;
5613
Jaganath Kanakkasseryacf0aea2018-07-19 17:09:46 +05305614 case HCI_EV_LE_EXT_ADV_SET_TERM:
5615 hci_le_ext_adv_term_evt(hdev, skb);
5616 break;
5617
Ville Tervofcd89c02011-02-10 22:38:47 -03005618 default:
5619 break;
5620 }
5621}
5622
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005623static bool hci_get_cmd_complete(struct hci_dev *hdev, u16 opcode,
5624 u8 event, struct sk_buff *skb)
5625{
5626 struct hci_ev_cmd_complete *ev;
5627 struct hci_event_hdr *hdr;
5628
5629 if (!skb)
5630 return false;
5631
5632 if (skb->len < sizeof(*hdr)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01005633 bt_dev_err(hdev, "too short HCI event");
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005634 return false;
5635 }
5636
5637 hdr = (void *) skb->data;
5638 skb_pull(skb, HCI_EVENT_HDR_SIZE);
5639
5640 if (event) {
5641 if (hdr->evt != event)
5642 return false;
5643 return true;
5644 }
5645
5646 if (hdr->evt != HCI_EV_CMD_COMPLETE) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01005647 bt_dev_err(hdev, "last event is not cmd complete (0x%2.2x)",
5648 hdr->evt);
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005649 return false;
5650 }
5651
5652 if (skb->len < sizeof(*ev)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01005653 bt_dev_err(hdev, "too short cmd_complete event");
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005654 return false;
5655 }
5656
5657 ev = (void *) skb->data;
5658 skb_pull(skb, sizeof(*ev));
5659
5660 if (opcode != __le16_to_cpu(ev->opcode)) {
5661 BT_DBG("opcode doesn't match (0x%2.2x != 0x%2.2x)", opcode,
5662 __le16_to_cpu(ev->opcode));
5663 return false;
5664 }
5665
5666 return true;
5667}
5668
Linus Torvalds1da177e2005-04-16 15:20:36 -07005669void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)
5670{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005671 struct hci_event_hdr *hdr = (void *) skb->data;
Johan Hedberge62144872015-04-02 13:41:08 +03005672 hci_req_complete_t req_complete = NULL;
5673 hci_req_complete_skb_t req_complete_skb = NULL;
5674 struct sk_buff *orig_skb = NULL;
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005675 u8 status = 0, event = hdr->evt, req_evt = 0;
Johan Hedberge62144872015-04-02 13:41:08 +03005676 u16 opcode = HCI_OP_NOP;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005677
Marcel Holtmann242c0eb2015-10-25 22:45:53 +01005678 if (hdev->sent_cmd && bt_cb(hdev->sent_cmd)->hci.req_event == event) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02005679 struct hci_command_hdr *cmd_hdr = (void *) hdev->sent_cmd->data;
Johan Hedberge62144872015-04-02 13:41:08 +03005680 opcode = __le16_to_cpu(cmd_hdr->opcode);
5681 hci_req_cmd_complete(hdev, opcode, status, &req_complete,
5682 &req_complete_skb);
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005683 req_evt = event;
Johan Hedberg02350a72013-04-03 21:50:29 +03005684 }
5685
Johan Hedberge62144872015-04-02 13:41:08 +03005686 /* If it looks like we might end up having to call
5687 * req_complete_skb, store a pristine copy of the skb since the
5688 * various handlers may modify the original one through
5689 * skb_pull() calls, etc.
5690 */
5691 if (req_complete_skb || event == HCI_EV_CMD_STATUS ||
5692 event == HCI_EV_CMD_COMPLETE)
5693 orig_skb = skb_clone(skb, GFP_KERNEL);
5694
5695 skb_pull(skb, HCI_EVENT_HDR_SIZE);
5696
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005697 switch (event) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005698 case HCI_EV_INQUIRY_COMPLETE:
5699 hci_inquiry_complete_evt(hdev, skb);
5700 break;
5701
5702 case HCI_EV_INQUIRY_RESULT:
5703 hci_inquiry_result_evt(hdev, skb);
5704 break;
5705
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005706 case HCI_EV_CONN_COMPLETE:
5707 hci_conn_complete_evt(hdev, skb);
Marcel Holtmann21d9e302005-09-13 01:32:25 +02005708 break;
5709
Linus Torvalds1da177e2005-04-16 15:20:36 -07005710 case HCI_EV_CONN_REQUEST:
5711 hci_conn_request_evt(hdev, skb);
5712 break;
5713
Linus Torvalds1da177e2005-04-16 15:20:36 -07005714 case HCI_EV_DISCONN_COMPLETE:
5715 hci_disconn_complete_evt(hdev, skb);
5716 break;
5717
Linus Torvalds1da177e2005-04-16 15:20:36 -07005718 case HCI_EV_AUTH_COMPLETE:
5719 hci_auth_complete_evt(hdev, skb);
5720 break;
5721
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005722 case HCI_EV_REMOTE_NAME:
5723 hci_remote_name_evt(hdev, skb);
5724 break;
5725
Linus Torvalds1da177e2005-04-16 15:20:36 -07005726 case HCI_EV_ENCRYPT_CHANGE:
5727 hci_encrypt_change_evt(hdev, skb);
5728 break;
5729
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005730 case HCI_EV_CHANGE_LINK_KEY_COMPLETE:
5731 hci_change_link_key_complete_evt(hdev, skb);
5732 break;
5733
5734 case HCI_EV_REMOTE_FEATURES:
5735 hci_remote_features_evt(hdev, skb);
5736 break;
5737
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005738 case HCI_EV_CMD_COMPLETE:
Johan Hedberge62144872015-04-02 13:41:08 +03005739 hci_cmd_complete_evt(hdev, skb, &opcode, &status,
5740 &req_complete, &req_complete_skb);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005741 break;
5742
5743 case HCI_EV_CMD_STATUS:
Johan Hedberge62144872015-04-02 13:41:08 +03005744 hci_cmd_status_evt(hdev, skb, &opcode, &status, &req_complete,
5745 &req_complete_skb);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005746 break;
5747
Marcel Holtmann24dfa342014-11-02 02:56:41 +01005748 case HCI_EV_HARDWARE_ERROR:
5749 hci_hardware_error_evt(hdev, skb);
5750 break;
5751
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005752 case HCI_EV_ROLE_CHANGE:
5753 hci_role_change_evt(hdev, skb);
5754 break;
5755
5756 case HCI_EV_NUM_COMP_PKTS:
5757 hci_num_comp_pkts_evt(hdev, skb);
5758 break;
5759
5760 case HCI_EV_MODE_CHANGE:
5761 hci_mode_change_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005762 break;
5763
5764 case HCI_EV_PIN_CODE_REQ:
5765 hci_pin_code_request_evt(hdev, skb);
5766 break;
5767
5768 case HCI_EV_LINK_KEY_REQ:
5769 hci_link_key_request_evt(hdev, skb);
5770 break;
5771
5772 case HCI_EV_LINK_KEY_NOTIFY:
5773 hci_link_key_notify_evt(hdev, skb);
5774 break;
5775
5776 case HCI_EV_CLOCK_OFFSET:
5777 hci_clock_offset_evt(hdev, skb);
5778 break;
5779
Marcel Holtmanna8746412008-07-14 20:13:46 +02005780 case HCI_EV_PKT_TYPE_CHANGE:
5781 hci_pkt_type_change_evt(hdev, skb);
5782 break;
5783
Marcel Holtmann85a1e932005-08-09 20:28:02 -07005784 case HCI_EV_PSCAN_REP_MODE:
5785 hci_pscan_rep_mode_evt(hdev, skb);
5786 break;
5787
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005788 case HCI_EV_INQUIRY_RESULT_WITH_RSSI:
5789 hci_inquiry_result_with_rssi_evt(hdev, skb);
5790 break;
5791
5792 case HCI_EV_REMOTE_EXT_FEATURES:
5793 hci_remote_ext_features_evt(hdev, skb);
5794 break;
5795
5796 case HCI_EV_SYNC_CONN_COMPLETE:
5797 hci_sync_conn_complete_evt(hdev, skb);
5798 break;
5799
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005800 case HCI_EV_EXTENDED_INQUIRY_RESULT:
5801 hci_extended_inquiry_result_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005802 break;
5803
Johan Hedberg1c2e0042012-06-08 23:31:13 +08005804 case HCI_EV_KEY_REFRESH_COMPLETE:
5805 hci_key_refresh_complete_evt(hdev, skb);
5806 break;
5807
Marcel Holtmann04936842008-07-14 20:13:48 +02005808 case HCI_EV_IO_CAPA_REQUEST:
5809 hci_io_capa_request_evt(hdev, skb);
5810 break;
5811
Johan Hedberg03b555e2011-01-04 15:40:05 +02005812 case HCI_EV_IO_CAPA_REPLY:
5813 hci_io_capa_reply_evt(hdev, skb);
5814 break;
5815
Johan Hedberga5c29682011-02-19 12:05:57 -03005816 case HCI_EV_USER_CONFIRM_REQUEST:
5817 hci_user_confirm_request_evt(hdev, skb);
5818 break;
5819
Brian Gix1143d452011-11-23 08:28:34 -08005820 case HCI_EV_USER_PASSKEY_REQUEST:
5821 hci_user_passkey_request_evt(hdev, skb);
5822 break;
5823
Johan Hedberg92a25252012-09-06 18:39:26 +03005824 case HCI_EV_USER_PASSKEY_NOTIFY:
5825 hci_user_passkey_notify_evt(hdev, skb);
5826 break;
5827
5828 case HCI_EV_KEYPRESS_NOTIFY:
5829 hci_keypress_notify_evt(hdev, skb);
5830 break;
5831
Marcel Holtmann04936842008-07-14 20:13:48 +02005832 case HCI_EV_SIMPLE_PAIR_COMPLETE:
5833 hci_simple_pair_complete_evt(hdev, skb);
5834 break;
5835
Marcel Holtmann41a96212008-07-14 20:13:48 +02005836 case HCI_EV_REMOTE_HOST_FEATURES:
5837 hci_remote_host_features_evt(hdev, skb);
5838 break;
5839
Ville Tervofcd89c02011-02-10 22:38:47 -03005840 case HCI_EV_LE_META:
5841 hci_le_meta_evt(hdev, skb);
5842 break;
5843
Szymon Janc2763eda2011-03-22 13:12:22 +01005844 case HCI_EV_REMOTE_OOB_DATA_REQUEST:
5845 hci_remote_oob_data_request_evt(hdev, skb);
5846 break;
5847
Arron Wanga77a6a12015-07-24 17:13:15 +08005848#if IS_ENABLED(CONFIG_BT_HS)
5849 case HCI_EV_CHANNEL_SELECTED:
5850 hci_chan_selected_evt(hdev, skb);
5851 break;
5852
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03005853 case HCI_EV_PHY_LINK_COMPLETE:
5854 hci_phy_link_complete_evt(hdev, skb);
5855 break;
5856
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03005857 case HCI_EV_LOGICAL_LINK_COMPLETE:
5858 hci_loglink_complete_evt(hdev, skb);
5859 break;
5860
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02005861 case HCI_EV_DISCONN_LOGICAL_LINK_COMPLETE:
5862 hci_disconn_loglink_complete_evt(hdev, skb);
5863 break;
5864
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02005865 case HCI_EV_DISCONN_PHY_LINK_COMPLETE:
5866 hci_disconn_phylink_complete_evt(hdev, skb);
5867 break;
Arron Wanga77a6a12015-07-24 17:13:15 +08005868#endif
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02005869
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02005870 case HCI_EV_NUM_COMP_BLOCKS:
5871 hci_num_comp_blocks_evt(hdev, skb);
5872 break;
5873
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005874 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03005875 BT_DBG("%s event 0x%2.2x", hdev->name, event);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005876 break;
5877 }
5878
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005879 if (req_complete) {
Johan Hedberge62144872015-04-02 13:41:08 +03005880 req_complete(hdev, status, opcode);
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005881 } else if (req_complete_skb) {
5882 if (!hci_get_cmd_complete(hdev, opcode, req_evt, orig_skb)) {
5883 kfree_skb(orig_skb);
5884 orig_skb = NULL;
5885 }
Johan Hedberge62144872015-04-02 13:41:08 +03005886 req_complete_skb(hdev, status, opcode, orig_skb);
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005887 }
Johan Hedberge62144872015-04-02 13:41:08 +03005888
5889 kfree_skb(orig_skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005890 kfree_skb(skb);
5891 hdev->stat.evt_rx++;
5892}