blob: 562e7a854ed6b21ac59ded14a562d1277c38d9ee [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
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001045static void hci_cc_le_set_adv_enable(struct hci_dev *hdev, struct sk_buff *skb)
1046{
1047 __u8 *sent, status = *((__u8 *) skb->data);
1048
1049 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1050
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001051 if (status)
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001052 return;
1053
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001054 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADV_ENABLE);
1055 if (!sent)
Johan Hedberg3c857752014-03-25 10:30:49 +02001056 return;
1057
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001058 hci_dev_lock(hdev);
1059
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001060 /* If we're doing connection initiation as peripheral. Set a
Johan Hedberg3c857752014-03-25 10:30:49 +02001061 * timeout in case something goes wrong.
1062 */
1063 if (*sent) {
1064 struct hci_conn *conn;
1065
Marcel Holtmanna1536da2015-03-13 02:11:01 -07001066 hci_dev_set_flag(hdev, HCI_LE_ADV);
Johan Hedberg66c417c2014-07-08 15:07:47 +03001067
Jakub Pawlowskie7d9ab72015-08-07 20:22:52 +02001068 conn = hci_lookup_le_connect(hdev);
Johan Hedberg3c857752014-03-25 10:30:49 +02001069 if (conn)
1070 queue_delayed_work(hdev->workqueue,
1071 &conn->le_conn_timeout,
Johan Hedberg09ae2602014-07-06 13:41:15 +03001072 conn->conn_timeout);
Johan Hedberg66c417c2014-07-08 15:07:47 +03001073 } else {
Marcel Holtmanna358dc12015-03-13 02:11:02 -07001074 hci_dev_clear_flag(hdev, HCI_LE_ADV);
Johan Hedberg3c857752014-03-25 10:30:49 +02001075 }
1076
Johan Hedberg04b4edc2013-03-15 17:07:01 -05001077 hci_dev_unlock(hdev);
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001078}
1079
Marcel Holtmann533553f2014-03-21 12:18:10 -07001080static void hci_cc_le_set_scan_param(struct hci_dev *hdev, struct sk_buff *skb)
1081{
1082 struct hci_cp_le_set_scan_param *cp;
1083 __u8 status = *((__u8 *) skb->data);
1084
1085 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1086
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001087 if (status)
1088 return;
1089
Marcel Holtmann533553f2014-03-21 12:18:10 -07001090 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_PARAM);
1091 if (!cp)
1092 return;
1093
1094 hci_dev_lock(hdev);
1095
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001096 hdev->le_scan_type = cp->type;
Marcel Holtmann533553f2014-03-21 12:18:10 -07001097
1098 hci_dev_unlock(hdev);
1099}
1100
Johan Hedbergb9a63282014-03-25 10:51:52 +02001101static bool has_pending_adv_report(struct hci_dev *hdev)
1102{
1103 struct discovery_state *d = &hdev->discovery;
1104
1105 return bacmp(&d->last_adv_addr, BDADDR_ANY);
1106}
1107
1108static void clear_pending_adv_report(struct hci_dev *hdev)
1109{
1110 struct discovery_state *d = &hdev->discovery;
1111
1112 bacpy(&d->last_adv_addr, BDADDR_ANY);
1113 d->last_adv_data_len = 0;
1114}
1115
1116static void store_pending_adv_report(struct hci_dev *hdev, bdaddr_t *bdaddr,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001117 u8 bdaddr_type, s8 rssi, u32 flags,
1118 u8 *data, u8 len)
Johan Hedbergb9a63282014-03-25 10:51:52 +02001119{
1120 struct discovery_state *d = &hdev->discovery;
1121
1122 bacpy(&d->last_adv_addr, bdaddr);
1123 d->last_adv_addr_type = bdaddr_type;
Johan Hedbergff5cd292014-03-25 14:40:52 +02001124 d->last_adv_rssi = rssi;
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001125 d->last_adv_flags = flags;
Johan Hedbergb9a63282014-03-25 10:51:52 +02001126 memcpy(d->last_adv_data, data, len);
1127 d->last_adv_data_len = len;
1128}
1129
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001130static void hci_cc_le_set_scan_enable(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -03001131 struct sk_buff *skb)
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001132{
1133 struct hci_cp_le_set_scan_enable *cp;
1134 __u8 status = *((__u8 *) skb->data);
1135
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001136 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001137
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001138 if (status)
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001139 return;
1140
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001141 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_ENABLE);
1142 if (!cp)
Andre Guedes3fd319b2013-04-30 15:29:36 -03001143 return;
1144
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301145 hci_dev_lock(hdev);
1146
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001147 switch (cp->enable) {
Andre Guedes76a388b2013-04-04 20:21:02 -03001148 case LE_SCAN_ENABLE:
Marcel Holtmanna1536da2015-03-13 02:11:01 -07001149 hci_dev_set_flag(hdev, HCI_LE_SCAN);
Johan Hedbergb9a63282014-03-25 10:51:52 +02001150 if (hdev->le_scan_type == LE_SCAN_ACTIVE)
1151 clear_pending_adv_report(hdev);
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001152 break;
1153
Andre Guedes76a388b2013-04-04 20:21:02 -03001154 case LE_SCAN_DISABLE:
Johan Hedbergb9a63282014-03-25 10:51:52 +02001155 /* We do this here instead of when setting DISCOVERY_STOPPED
1156 * since the latter would potentially require waiting for
1157 * inquiry to stop too.
1158 */
1159 if (has_pending_adv_report(hdev)) {
1160 struct discovery_state *d = &hdev->discovery;
1161
1162 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergab0aa432014-03-26 14:17:12 +02001163 d->last_adv_addr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001164 d->last_adv_rssi, d->last_adv_flags,
Johan Hedbergab0aa432014-03-26 14:17:12 +02001165 d->last_adv_data,
Johan Hedbergb9a63282014-03-25 10:51:52 +02001166 d->last_adv_data_len, NULL, 0);
1167 }
1168
Johan Hedberg317ac8c2014-02-28 20:26:12 +02001169 /* Cancel this timer so that we don't try to disable scanning
1170 * when it's already disabled.
1171 */
1172 cancel_delayed_work(&hdev->le_scan_disable);
1173
Marcel Holtmanna358dc12015-03-13 02:11:02 -07001174 hci_dev_clear_flag(hdev, HCI_LE_SCAN);
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001175
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001176 /* The HCI_LE_SCAN_INTERRUPTED flag indicates that we
1177 * interrupted scanning due to a connect request. Mark
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001178 * therefore discovery as stopped. If this was not
1179 * because of a connect request advertising might have
1180 * been disabled because of active scanning, so
1181 * re-enable it again if necessary.
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001182 */
Marcel Holtmanna69d8922015-03-13 02:11:05 -07001183 if (hci_dev_test_and_clear_flag(hdev, HCI_LE_SCAN_INTERRUPTED))
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001184 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001185 else if (!hci_dev_test_flag(hdev, HCI_LE_ADV) &&
Johan Hedberg34722272014-07-08 16:05:05 +03001186 hdev->discovery.state == DISCOVERY_FINDING)
Johan Hedbergf2252572015-11-18 12:49:20 +02001187 hci_req_reenable_advertising(hdev);
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001188
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001189 break;
1190
1191 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001192 bt_dev_err(hdev, "use of reserved LE_Scan_Enable param %d",
1193 cp->enable);
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001194 break;
Andre Guedes35815082011-05-26 16:23:53 -03001195 }
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301196
1197 hci_dev_unlock(hdev);
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001198}
1199
Johan Hedbergcf1d0812013-01-22 14:02:00 +02001200static void hci_cc_le_read_white_list_size(struct hci_dev *hdev,
1201 struct sk_buff *skb)
1202{
1203 struct hci_rp_le_read_white_list_size *rp = (void *) skb->data;
1204
1205 BT_DBG("%s status 0x%2.2x size %u", hdev->name, rp->status, rp->size);
1206
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001207 if (rp->status)
1208 return;
1209
1210 hdev->le_white_list_size = rp->size;
Johan Hedbergcf1d0812013-01-22 14:02:00 +02001211}
1212
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001213static void hci_cc_le_clear_white_list(struct hci_dev *hdev,
1214 struct sk_buff *skb)
1215{
1216 __u8 status = *((__u8 *) skb->data);
1217
1218 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1219
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001220 if (status)
1221 return;
1222
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001223 hci_bdaddr_list_clear(&hdev->le_white_list);
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001224}
1225
1226static void hci_cc_le_add_to_white_list(struct hci_dev *hdev,
1227 struct sk_buff *skb)
1228{
1229 struct hci_cp_le_add_to_white_list *sent;
1230 __u8 status = *((__u8 *) skb->data);
1231
1232 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1233
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001234 if (status)
1235 return;
1236
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001237 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_ADD_TO_WHITE_LIST);
1238 if (!sent)
1239 return;
1240
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001241 hci_bdaddr_list_add(&hdev->le_white_list, &sent->bdaddr,
1242 sent->bdaddr_type);
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001243}
1244
1245static void hci_cc_le_del_from_white_list(struct hci_dev *hdev,
1246 struct sk_buff *skb)
1247{
1248 struct hci_cp_le_del_from_white_list *sent;
1249 __u8 status = *((__u8 *) skb->data);
1250
1251 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1252
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001253 if (status)
1254 return;
1255
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001256 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_DEL_FROM_WHITE_LIST);
1257 if (!sent)
1258 return;
1259
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001260 hci_bdaddr_list_del(&hdev->le_white_list, &sent->bdaddr,
1261 sent->bdaddr_type);
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001262}
1263
Johan Hedberg9b008c02013-01-22 14:02:01 +02001264static void hci_cc_le_read_supported_states(struct hci_dev *hdev,
1265 struct sk_buff *skb)
1266{
1267 struct hci_rp_le_read_supported_states *rp = (void *) skb->data;
1268
1269 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1270
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001271 if (rp->status)
1272 return;
1273
1274 memcpy(hdev->le_states, rp->le_states, 8);
Johan Hedberg9b008c02013-01-22 14:02:01 +02001275}
1276
Marcel Holtmanna8e1bfa2014-12-20 16:28:40 +01001277static void hci_cc_le_read_def_data_len(struct hci_dev *hdev,
1278 struct sk_buff *skb)
1279{
1280 struct hci_rp_le_read_def_data_len *rp = (void *) skb->data;
1281
1282 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1283
1284 if (rp->status)
1285 return;
1286
1287 hdev->le_def_tx_len = le16_to_cpu(rp->tx_len);
1288 hdev->le_def_tx_time = le16_to_cpu(rp->tx_time);
1289}
1290
1291static void hci_cc_le_write_def_data_len(struct hci_dev *hdev,
1292 struct sk_buff *skb)
1293{
1294 struct hci_cp_le_write_def_data_len *sent;
1295 __u8 status = *((__u8 *) skb->data);
1296
1297 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1298
1299 if (status)
1300 return;
1301
1302 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_WRITE_DEF_DATA_LEN);
1303 if (!sent)
1304 return;
1305
1306 hdev->le_def_tx_len = le16_to_cpu(sent->tx_len);
1307 hdev->le_def_tx_time = le16_to_cpu(sent->tx_time);
1308}
1309
Ankit Navik545f2592018-06-29 12:13:20 +05301310static void hci_cc_le_clear_resolv_list(struct hci_dev *hdev,
1311 struct sk_buff *skb)
1312{
1313 __u8 status = *((__u8 *) skb->data);
1314
1315 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1316
1317 if (status)
1318 return;
1319
1320 hci_bdaddr_list_clear(&hdev->le_resolv_list);
1321}
1322
Ankit Navikcfdb0c22018-06-29 12:12:50 +05301323static void hci_cc_le_read_resolv_list_size(struct hci_dev *hdev,
1324 struct sk_buff *skb)
1325{
1326 struct hci_rp_le_read_resolv_list_size *rp = (void *) skb->data;
1327
1328 BT_DBG("%s status 0x%2.2x size %u", hdev->name, rp->status, rp->size);
1329
1330 if (rp->status)
1331 return;
1332
1333 hdev->le_resolv_list_size = rp->size;
1334}
1335
Marcel Holtmanna8e1bfa2014-12-20 16:28:40 +01001336static void hci_cc_le_read_max_data_len(struct hci_dev *hdev,
1337 struct sk_buff *skb)
1338{
1339 struct hci_rp_le_read_max_data_len *rp = (void *) skb->data;
1340
1341 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1342
1343 if (rp->status)
1344 return;
1345
1346 hdev->le_max_tx_len = le16_to_cpu(rp->tx_len);
1347 hdev->le_max_tx_time = le16_to_cpu(rp->tx_time);
1348 hdev->le_max_rx_len = le16_to_cpu(rp->rx_len);
1349 hdev->le_max_rx_time = le16_to_cpu(rp->rx_time);
1350}
1351
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001352static void hci_cc_write_le_host_supported(struct hci_dev *hdev,
1353 struct sk_buff *skb)
Andre Guedesf9b49302011-06-30 19:20:53 -03001354{
Johan Hedberg06199cf2012-02-22 16:37:11 +02001355 struct hci_cp_write_le_host_supported *sent;
Andre Guedesf9b49302011-06-30 19:20:53 -03001356 __u8 status = *((__u8 *) skb->data);
1357
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001358 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedesf9b49302011-06-30 19:20:53 -03001359
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001360 if (status)
1361 return;
1362
Johan Hedberg06199cf2012-02-22 16:37:11 +02001363 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LE_HOST_SUPPORTED);
Johan Hedberg8f984df2012-02-28 01:07:22 +02001364 if (!sent)
Andre Guedesf9b49302011-06-30 19:20:53 -03001365 return;
1366
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301367 hci_dev_lock(hdev);
1368
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001369 if (sent->le) {
1370 hdev->features[1][0] |= LMP_HOST_LE;
Marcel Holtmanna1536da2015-03-13 02:11:01 -07001371 hci_dev_set_flag(hdev, HCI_LE_ENABLED);
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001372 } else {
1373 hdev->features[1][0] &= ~LMP_HOST_LE;
Marcel Holtmanna358dc12015-03-13 02:11:02 -07001374 hci_dev_clear_flag(hdev, HCI_LE_ENABLED);
1375 hci_dev_clear_flag(hdev, HCI_ADVERTISING);
Johan Hedberg8f984df2012-02-28 01:07:22 +02001376 }
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001377
1378 if (sent->simul)
1379 hdev->features[1][0] |= LMP_HOST_LE_BREDR;
1380 else
1381 hdev->features[1][0] &= ~LMP_HOST_LE_BREDR;
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301382
1383 hci_dev_unlock(hdev);
Andre Guedesf9b49302011-06-30 19:20:53 -03001384}
1385
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02001386static void hci_cc_set_adv_param(struct hci_dev *hdev, struct sk_buff *skb)
1387{
1388 struct hci_cp_le_set_adv_param *cp;
1389 u8 status = *((u8 *) skb->data);
1390
1391 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1392
1393 if (status)
1394 return;
1395
1396 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADV_PARAM);
1397 if (!cp)
1398 return;
1399
1400 hci_dev_lock(hdev);
1401 hdev->adv_addr_type = cp->own_address_type;
1402 hci_dev_unlock(hdev);
1403}
1404
Andrzej Kaczmarek5ae76a92014-05-08 15:32:08 +02001405static void hci_cc_read_rssi(struct hci_dev *hdev, struct sk_buff *skb)
1406{
1407 struct hci_rp_read_rssi *rp = (void *) skb->data;
1408 struct hci_conn *conn;
1409
1410 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1411
1412 if (rp->status)
1413 return;
1414
1415 hci_dev_lock(hdev);
1416
1417 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
1418 if (conn)
1419 conn->rssi = rp->rssi;
1420
1421 hci_dev_unlock(hdev);
1422}
1423
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001424static void hci_cc_read_tx_power(struct hci_dev *hdev, struct sk_buff *skb)
1425{
1426 struct hci_cp_read_tx_power *sent;
1427 struct hci_rp_read_tx_power *rp = (void *) skb->data;
1428 struct hci_conn *conn;
1429
1430 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1431
1432 if (rp->status)
1433 return;
1434
1435 sent = hci_sent_cmd_data(hdev, HCI_OP_READ_TX_POWER);
1436 if (!sent)
1437 return;
1438
1439 hci_dev_lock(hdev);
1440
1441 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
Andrzej Kaczmarekd0455ed2014-05-14 13:43:05 +02001442 if (!conn)
1443 goto unlock;
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001444
Andrzej Kaczmarekd0455ed2014-05-14 13:43:05 +02001445 switch (sent->type) {
1446 case 0x00:
1447 conn->tx_power = rp->tx_power;
1448 break;
1449 case 0x01:
1450 conn->max_tx_power = rp->tx_power;
1451 break;
1452 }
1453
1454unlock:
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001455 hci_dev_unlock(hdev);
1456}
1457
Marcel Holtmannc50b33c2015-01-31 15:07:52 -08001458static void hci_cc_write_ssp_debug_mode(struct hci_dev *hdev, struct sk_buff *skb)
1459{
1460 u8 status = *((u8 *) skb->data);
1461 u8 *mode;
1462
1463 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1464
1465 if (status)
1466 return;
1467
1468 mode = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SSP_DEBUG_MODE);
1469 if (mode)
1470 hdev->ssp_debug_mode = *mode;
1471}
1472
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001473static void hci_cs_inquiry(struct hci_dev *hdev, __u8 status)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001474{
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001475 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001476
1477 if (status) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001478 hci_conn_check_pending(hdev);
Johan Hedberg314b2382011-04-27 10:29:57 -04001479 return;
1480 }
1481
Andre Guedes89352e72011-11-04 14:16:53 -03001482 set_bit(HCI_INQUIRY, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001483}
1484
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001485static void hci_cs_create_conn(struct hci_dev *hdev, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001486{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001487 struct hci_cp_create_conn *cp;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001488 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001489
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001490 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001491
1492 cp = hci_sent_cmd_data(hdev, HCI_OP_CREATE_CONN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001493 if (!cp)
1494 return;
1495
1496 hci_dev_lock(hdev);
1497
1498 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
1499
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03001500 BT_DBG("%s bdaddr %pMR hcon %p", hdev->name, &cp->bdaddr, conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001501
1502 if (status) {
1503 if (conn && conn->state == BT_CONNECT) {
Marcel Holtmann4c67bc72006-10-15 17:30:56 +02001504 if (status != 0x0c || conn->attempt > 2) {
1505 conn->state = BT_CLOSED;
Johan Hedberg539c4962015-02-18 14:53:57 +02001506 hci_connect_cfm(conn, status);
Marcel Holtmann4c67bc72006-10-15 17:30:56 +02001507 hci_conn_del(conn);
1508 } else
1509 conn->state = BT_CONNECT2;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001510 }
1511 } else {
1512 if (!conn) {
Johan Hedberga5c4e302014-07-16 11:56:07 +03001513 conn = hci_conn_add(hdev, ACL_LINK, &cp->bdaddr,
1514 HCI_ROLE_MASTER);
1515 if (!conn)
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001516 bt_dev_err(hdev, "no memory for new connection");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001517 }
1518 }
1519
1520 hci_dev_unlock(hdev);
1521}
1522
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001523static void hci_cs_add_sco(struct hci_dev *hdev, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001524{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001525 struct hci_cp_add_sco *cp;
1526 struct hci_conn *acl, *sco;
1527 __u16 handle;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001528
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001529 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001530
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001531 if (!status)
1532 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001533
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001534 cp = hci_sent_cmd_data(hdev, HCI_OP_ADD_SCO);
1535 if (!cp)
1536 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001537
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001538 handle = __le16_to_cpu(cp->handle);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001539
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001540 BT_DBG("%s handle 0x%4.4x", hdev->name, handle);
Marcel Holtmann6bd57412006-11-18 22:14:22 +01001541
1542 hci_dev_lock(hdev);
1543
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001544 acl = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001545 if (acl) {
1546 sco = acl->link;
1547 if (sco) {
1548 sco->state = BT_CLOSED;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001549
Johan Hedberg539c4962015-02-18 14:53:57 +02001550 hci_connect_cfm(sco, status);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001551 hci_conn_del(sco);
1552 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001553 }
Marcel Holtmann6bd57412006-11-18 22:14:22 +01001554
1555 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001556}
1557
Marcel Holtmannf8558552008-07-14 20:13:49 +02001558static void hci_cs_auth_requested(struct hci_dev *hdev, __u8 status)
1559{
1560 struct hci_cp_auth_requested *cp;
1561 struct hci_conn *conn;
1562
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001563 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001564
1565 if (!status)
1566 return;
1567
1568 cp = hci_sent_cmd_data(hdev, HCI_OP_AUTH_REQUESTED);
1569 if (!cp)
1570 return;
1571
1572 hci_dev_lock(hdev);
1573
1574 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1575 if (conn) {
1576 if (conn->state == BT_CONFIG) {
Johan Hedberg539c4962015-02-18 14:53:57 +02001577 hci_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001578 hci_conn_drop(conn);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001579 }
1580 }
1581
1582 hci_dev_unlock(hdev);
1583}
1584
1585static void hci_cs_set_conn_encrypt(struct hci_dev *hdev, __u8 status)
1586{
1587 struct hci_cp_set_conn_encrypt *cp;
1588 struct hci_conn *conn;
1589
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001590 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001591
1592 if (!status)
1593 return;
1594
1595 cp = hci_sent_cmd_data(hdev, HCI_OP_SET_CONN_ENCRYPT);
1596 if (!cp)
1597 return;
1598
1599 hci_dev_lock(hdev);
1600
1601 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1602 if (conn) {
1603 if (conn->state == BT_CONFIG) {
Johan Hedberg539c4962015-02-18 14:53:57 +02001604 hci_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001605 hci_conn_drop(conn);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001606 }
1607 }
1608
1609 hci_dev_unlock(hdev);
1610}
1611
Johan Hedberg127178d2010-11-18 22:22:29 +02001612static int hci_outgoing_auth_needed(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -03001613 struct hci_conn *conn)
Johan Hedberg392599b2010-11-18 22:22:28 +02001614{
Johan Hedberg392599b2010-11-18 22:22:28 +02001615 if (conn->state != BT_CONFIG || !conn->out)
1616 return 0;
1617
Johan Hedberg765c2a92011-01-19 12:06:52 +05301618 if (conn->pending_sec_level == BT_SECURITY_SDP)
Johan Hedberg392599b2010-11-18 22:22:28 +02001619 return 0;
1620
1621 /* Only request authentication for SSP connections or non-SSP
Johan Hedberg264b8b42014-01-08 16:40:39 +02001622 * devices with sec_level MEDIUM or HIGH or if MITM protection
1623 * is requested.
1624 */
Gustavo Padovan807deac2012-05-17 00:36:24 -03001625 if (!hci_conn_ssp_enabled(conn) && !(conn->auth_type & 0x01) &&
Johan Hedberg7e3691e2014-05-30 14:45:19 +03001626 conn->pending_sec_level != BT_SECURITY_FIPS &&
Johan Hedberg264b8b42014-01-08 16:40:39 +02001627 conn->pending_sec_level != BT_SECURITY_HIGH &&
1628 conn->pending_sec_level != BT_SECURITY_MEDIUM)
Johan Hedberg392599b2010-11-18 22:22:28 +02001629 return 0;
1630
Johan Hedberg392599b2010-11-18 22:22:28 +02001631 return 1;
1632}
1633
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001634static int hci_resolve_name(struct hci_dev *hdev,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001635 struct inquiry_entry *e)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001636{
1637 struct hci_cp_remote_name_req cp;
1638
1639 memset(&cp, 0, sizeof(cp));
1640
1641 bacpy(&cp.bdaddr, &e->data.bdaddr);
1642 cp.pscan_rep_mode = e->data.pscan_rep_mode;
1643 cp.pscan_mode = e->data.pscan_mode;
1644 cp.clock_offset = e->data.clock_offset;
1645
1646 return hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
1647}
1648
Johan Hedbergb644ba32012-01-17 21:48:47 +02001649static bool hci_resolve_next_name(struct hci_dev *hdev)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001650{
1651 struct discovery_state *discov = &hdev->discovery;
1652 struct inquiry_entry *e;
1653
Johan Hedbergb644ba32012-01-17 21:48:47 +02001654 if (list_empty(&discov->resolve))
1655 return false;
1656
1657 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
Ram Malovanyc8100892012-07-19 10:26:09 +03001658 if (!e)
1659 return false;
1660
Johan Hedbergb644ba32012-01-17 21:48:47 +02001661 if (hci_resolve_name(hdev, e) == 0) {
1662 e->name_state = NAME_PENDING;
1663 return true;
1664 }
1665
1666 return false;
1667}
1668
1669static void hci_check_pending_name(struct hci_dev *hdev, struct hci_conn *conn,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001670 bdaddr_t *bdaddr, u8 *name, u8 name_len)
Johan Hedbergb644ba32012-01-17 21:48:47 +02001671{
1672 struct discovery_state *discov = &hdev->discovery;
1673 struct inquiry_entry *e;
1674
Johan Hedberg60cb49d2014-11-11 11:33:24 +02001675 /* Update the mgmt connected state if necessary. Be careful with
1676 * conn objects that exist but are not (yet) connected however.
1677 * Only those in BT_CONFIG or BT_CONNECTED states can be
1678 * considered connected.
1679 */
1680 if (conn &&
1681 (conn->state == BT_CONFIG || conn->state == BT_CONNECTED) &&
Jaganath Kanakkasserycb77c3e2014-11-07 16:39:09 +05301682 !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00001683 mgmt_device_connected(hdev, conn, 0, name, name_len);
Johan Hedbergb644ba32012-01-17 21:48:47 +02001684
1685 if (discov->state == DISCOVERY_STOPPED)
1686 return;
1687
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001688 if (discov->state == DISCOVERY_STOPPING)
1689 goto discov_complete;
1690
1691 if (discov->state != DISCOVERY_RESOLVING)
1692 return;
1693
1694 e = hci_inquiry_cache_lookup_resolve(hdev, bdaddr, NAME_PENDING);
Ram Malovany7cc83802012-07-19 10:26:10 +03001695 /* If the device was not found in a list of found devices names of which
1696 * are pending. there is no need to continue resolving a next name as it
1697 * will be done upon receiving another Remote Name Request Complete
1698 * Event */
1699 if (!e)
1700 return;
1701
1702 list_del(&e->list);
1703 if (name) {
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001704 e->name_state = NAME_KNOWN;
Ram Malovany7cc83802012-07-19 10:26:10 +03001705 mgmt_remote_name(hdev, bdaddr, ACL_LINK, 0x00,
1706 e->data.rssi, name, name_len);
Ram Malovanyc3e7c0d2012-07-19 10:26:11 +03001707 } else {
1708 e->name_state = NAME_NOT_KNOWN;
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001709 }
1710
Johan Hedbergb644ba32012-01-17 21:48:47 +02001711 if (hci_resolve_next_name(hdev))
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001712 return;
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001713
1714discov_complete:
1715 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
1716}
1717
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001718static void hci_cs_remote_name_req(struct hci_dev *hdev, __u8 status)
1719{
Johan Hedberg127178d2010-11-18 22:22:29 +02001720 struct hci_cp_remote_name_req *cp;
1721 struct hci_conn *conn;
1722
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001723 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Johan Hedberg127178d2010-11-18 22:22:29 +02001724
1725 /* If successful wait for the name req complete event before
1726 * checking for the need to do authentication */
1727 if (!status)
1728 return;
1729
1730 cp = hci_sent_cmd_data(hdev, HCI_OP_REMOTE_NAME_REQ);
1731 if (!cp)
1732 return;
1733
1734 hci_dev_lock(hdev);
1735
1736 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02001737
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001738 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedbergb644ba32012-01-17 21:48:47 +02001739 hci_check_pending_name(hdev, conn, &cp->bdaddr, NULL, 0);
1740
Johan Hedberg79c6c702011-04-28 11:28:55 -07001741 if (!conn)
1742 goto unlock;
1743
1744 if (!hci_outgoing_auth_needed(hdev, conn))
1745 goto unlock;
1746
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001747 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02001748 struct hci_cp_auth_requested auth_cp;
1749
Johan Hedberg977f8fc2014-07-17 15:35:39 +03001750 set_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags);
1751
Johannes Bergc1f23a22013-10-07 18:19:16 +02001752 auth_cp.handle = __cpu_to_le16(conn->handle);
1753 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED,
1754 sizeof(auth_cp), &auth_cp);
Johan Hedberg127178d2010-11-18 22:22:29 +02001755 }
1756
Johan Hedberg79c6c702011-04-28 11:28:55 -07001757unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02001758 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001759}
1760
Marcel Holtmann769be972008-07-14 20:13:49 +02001761static void hci_cs_read_remote_features(struct hci_dev *hdev, __u8 status)
1762{
1763 struct hci_cp_read_remote_features *cp;
1764 struct hci_conn *conn;
1765
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001766 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann769be972008-07-14 20:13:49 +02001767
1768 if (!status)
1769 return;
1770
1771 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_REMOTE_FEATURES);
1772 if (!cp)
1773 return;
1774
1775 hci_dev_lock(hdev);
1776
1777 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1778 if (conn) {
1779 if (conn->state == BT_CONFIG) {
Johan Hedberg539c4962015-02-18 14:53:57 +02001780 hci_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001781 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02001782 }
1783 }
1784
1785 hci_dev_unlock(hdev);
1786}
1787
1788static void hci_cs_read_remote_ext_features(struct hci_dev *hdev, __u8 status)
1789{
1790 struct hci_cp_read_remote_ext_features *cp;
1791 struct hci_conn *conn;
1792
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001793 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann769be972008-07-14 20:13:49 +02001794
1795 if (!status)
1796 return;
1797
1798 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES);
1799 if (!cp)
1800 return;
1801
1802 hci_dev_lock(hdev);
1803
1804 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1805 if (conn) {
1806 if (conn->state == BT_CONFIG) {
Johan Hedberg539c4962015-02-18 14:53:57 +02001807 hci_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001808 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02001809 }
1810 }
1811
1812 hci_dev_unlock(hdev);
1813}
1814
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001815static void hci_cs_setup_sync_conn(struct hci_dev *hdev, __u8 status)
1816{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001817 struct hci_cp_setup_sync_conn *cp;
1818 struct hci_conn *acl, *sco;
1819 __u16 handle;
1820
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001821 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001822
1823 if (!status)
1824 return;
1825
1826 cp = hci_sent_cmd_data(hdev, HCI_OP_SETUP_SYNC_CONN);
1827 if (!cp)
1828 return;
1829
1830 handle = __le16_to_cpu(cp->handle);
1831
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001832 BT_DBG("%s handle 0x%4.4x", hdev->name, handle);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001833
1834 hci_dev_lock(hdev);
1835
1836 acl = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001837 if (acl) {
1838 sco = acl->link;
1839 if (sco) {
1840 sco->state = BT_CLOSED;
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001841
Johan Hedberg539c4962015-02-18 14:53:57 +02001842 hci_connect_cfm(sco, status);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001843 hci_conn_del(sco);
1844 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001845 }
1846
1847 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001848}
1849
1850static void hci_cs_sniff_mode(struct hci_dev *hdev, __u8 status)
1851{
1852 struct hci_cp_sniff_mode *cp;
1853 struct hci_conn *conn;
1854
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001855 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001856
1857 if (!status)
1858 return;
1859
1860 cp = hci_sent_cmd_data(hdev, HCI_OP_SNIFF_MODE);
1861 if (!cp)
1862 return;
1863
1864 hci_dev_lock(hdev);
1865
1866 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001867 if (conn) {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001868 clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001869
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001870 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001871 hci_sco_setup(conn, status);
1872 }
1873
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001874 hci_dev_unlock(hdev);
1875}
1876
1877static void hci_cs_exit_sniff_mode(struct hci_dev *hdev, __u8 status)
1878{
1879 struct hci_cp_exit_sniff_mode *cp;
1880 struct hci_conn *conn;
1881
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001882 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001883
1884 if (!status)
1885 return;
1886
1887 cp = hci_sent_cmd_data(hdev, HCI_OP_EXIT_SNIFF_MODE);
1888 if (!cp)
1889 return;
1890
1891 hci_dev_lock(hdev);
1892
1893 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001894 if (conn) {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001895 clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001896
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001897 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001898 hci_sco_setup(conn, status);
1899 }
1900
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001901 hci_dev_unlock(hdev);
1902}
1903
Johan Hedberg88c3df12012-02-09 14:27:38 +02001904static void hci_cs_disconnect(struct hci_dev *hdev, u8 status)
1905{
1906 struct hci_cp_disconnect *cp;
1907 struct hci_conn *conn;
1908
1909 if (!status)
1910 return;
1911
1912 cp = hci_sent_cmd_data(hdev, HCI_OP_DISCONNECT);
1913 if (!cp)
1914 return;
1915
1916 hci_dev_lock(hdev);
1917
1918 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1919 if (conn)
1920 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001921 conn->dst_type, status);
Johan Hedberg88c3df12012-02-09 14:27:38 +02001922
1923 hci_dev_unlock(hdev);
1924}
1925
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02001926static void hci_cs_le_create_conn(struct hci_dev *hdev, u8 status)
1927{
1928 struct hci_cp_le_create_conn *cp;
1929 struct hci_conn *conn;
1930
1931 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1932
1933 /* All connection failure handling is taken care of by the
1934 * hci_le_conn_failed function which is triggered by the HCI
1935 * request completion callbacks used for connecting.
1936 */
1937 if (status)
1938 return;
1939
1940 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_CREATE_CONN);
1941 if (!cp)
1942 return;
1943
1944 hci_dev_lock(hdev);
1945
Johan Hedberg9d4c1cc2015-10-21 18:03:01 +03001946 conn = hci_conn_hash_lookup_le(hdev, &cp->peer_addr,
1947 cp->peer_addr_type);
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02001948 if (!conn)
1949 goto unlock;
1950
1951 /* Store the initiator and responder address information which
1952 * is needed for SMP. These values will not change during the
1953 * lifetime of the connection.
1954 */
1955 conn->init_addr_type = cp->own_address_type;
1956 if (cp->own_address_type == ADDR_LE_DEV_RANDOM)
1957 bacpy(&conn->init_addr, &hdev->random_addr);
1958 else
1959 bacpy(&conn->init_addr, &hdev->bdaddr);
1960
1961 conn->resp_addr_type = cp->peer_addr_type;
1962 bacpy(&conn->resp_addr, &cp->peer_addr);
1963
Johan Hedberg9489eca2014-02-28 17:45:46 +02001964 /* We don't want the connection attempt to stick around
1965 * indefinitely since LE doesn't have a page timeout concept
1966 * like BR/EDR. Set a timer for any connection that doesn't use
1967 * the white list for connecting.
1968 */
1969 if (cp->filter_policy == HCI_LE_USE_PEER_ADDR)
1970 queue_delayed_work(conn->hdev->workqueue,
1971 &conn->le_conn_timeout,
Johan Hedberg09ae2602014-07-06 13:41:15 +03001972 conn->conn_timeout);
Johan Hedberg9489eca2014-02-28 17:45:46 +02001973
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02001974unlock:
1975 hci_dev_unlock(hdev);
1976}
1977
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07001978static void hci_cs_le_read_remote_features(struct hci_dev *hdev, u8 status)
1979{
1980 struct hci_cp_le_read_remote_features *cp;
1981 struct hci_conn *conn;
1982
1983 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1984
1985 if (!status)
1986 return;
1987
1988 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_READ_REMOTE_FEATURES);
1989 if (!cp)
1990 return;
1991
1992 hci_dev_lock(hdev);
1993
1994 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1995 if (conn) {
1996 if (conn->state == BT_CONFIG) {
1997 hci_connect_cfm(conn, status);
1998 hci_conn_drop(conn);
1999 }
2000 }
2001
2002 hci_dev_unlock(hdev);
2003}
2004
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02002005static void hci_cs_le_start_enc(struct hci_dev *hdev, u8 status)
2006{
2007 struct hci_cp_le_start_enc *cp;
2008 struct hci_conn *conn;
2009
2010 BT_DBG("%s status 0x%2.2x", hdev->name, status);
2011
2012 if (!status)
2013 return;
2014
2015 hci_dev_lock(hdev);
2016
2017 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_START_ENC);
2018 if (!cp)
2019 goto unlock;
2020
2021 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
2022 if (!conn)
2023 goto unlock;
2024
2025 if (conn->state != BT_CONNECTED)
2026 goto unlock;
2027
2028 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
2029 hci_conn_drop(conn);
2030
2031unlock:
2032 hci_dev_unlock(hdev);
2033}
2034
Kuba Pawlak50fc85f2014-11-06 19:36:52 +01002035static void hci_cs_switch_role(struct hci_dev *hdev, u8 status)
2036{
2037 struct hci_cp_switch_role *cp;
2038 struct hci_conn *conn;
2039
2040 BT_DBG("%s status 0x%2.2x", hdev->name, status);
2041
2042 if (!status)
2043 return;
2044
2045 cp = hci_sent_cmd_data(hdev, HCI_OP_SWITCH_ROLE);
2046 if (!cp)
2047 return;
2048
2049 hci_dev_lock(hdev);
2050
2051 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
2052 if (conn)
2053 clear_bit(HCI_CONN_RSWITCH_PEND, &conn->flags);
2054
2055 hci_dev_unlock(hdev);
2056}
2057
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002058static void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002059{
2060 __u8 status = *((__u8 *) skb->data);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002061 struct discovery_state *discov = &hdev->discovery;
2062 struct inquiry_entry *e;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002063
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002064 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002065
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002066 hci_conn_check_pending(hdev);
Andre Guedes89352e72011-11-04 14:16:53 -03002067
2068 if (!test_and_clear_bit(HCI_INQUIRY, &hdev->flags))
2069 return;
2070
Peter Zijlstra4e857c52014-03-17 18:06:10 +01002071 smp_mb__after_atomic(); /* wake_up_bit advises about this barrier */
Andre Guedes3e13fa12013-03-27 20:04:56 -03002072 wake_up_bit(&hdev->flags, HCI_INQUIRY);
2073
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002074 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002075 return;
2076
Johan Hedberg56e5cb82011-11-08 20:40:16 +02002077 hci_dev_lock(hdev);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002078
Andre Guedes343f9352012-02-17 20:39:37 -03002079 if (discov->state != DISCOVERY_FINDING)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002080 goto unlock;
2081
2082 if (list_empty(&discov->resolve)) {
Jakub Pawlowski07d23342015-03-17 09:04:14 -07002083 /* When BR/EDR inquiry is active and no LE scanning is in
2084 * progress, then change discovery state to indicate completion.
2085 *
2086 * When running LE scanning and BR/EDR inquiry simultaneously
2087 * and the LE scan already finished, then change the discovery
2088 * state to indicate completion.
2089 */
2090 if (!hci_dev_test_flag(hdev, HCI_LE_SCAN) ||
2091 !test_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks))
2092 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002093 goto unlock;
2094 }
2095
2096 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
2097 if (e && hci_resolve_name(hdev, e) == 0) {
2098 e->name_state = NAME_PENDING;
2099 hci_discovery_set_state(hdev, DISCOVERY_RESOLVING);
2100 } else {
Jakub Pawlowski07d23342015-03-17 09:04:14 -07002101 /* When BR/EDR inquiry is active and no LE scanning is in
2102 * progress, then change discovery state to indicate completion.
2103 *
2104 * When running LE scanning and BR/EDR inquiry simultaneously
2105 * and the LE scan already finished, then change the discovery
2106 * state to indicate completion.
2107 */
2108 if (!hci_dev_test_flag(hdev, HCI_LE_SCAN) ||
2109 !test_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks))
2110 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002111 }
2112
2113unlock:
Johan Hedberg56e5cb82011-11-08 20:40:16 +02002114 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002115}
2116
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002117static void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002118{
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002119 struct inquiry_data data;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002120 struct inquiry_info *info = (void *) (skb->data + 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002121 int num_rsp = *((__u8 *) skb->data);
2122
2123 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
2124
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002125 if (!num_rsp)
2126 return;
2127
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002128 if (hci_dev_test_flag(hdev, HCI_PERIODIC_INQ))
Andre Guedes1519cc12012-03-21 00:03:38 -03002129 return;
2130
Linus Torvalds1da177e2005-04-16 15:20:36 -07002131 hci_dev_lock(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002132
Johan Hedberge17acd42011-03-30 23:57:16 +03002133 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02002134 u32 flags;
Johan Hedberg31754052012-01-04 13:39:52 +02002135
Linus Torvalds1da177e2005-04-16 15:20:36 -07002136 bacpy(&data.bdaddr, &info->bdaddr);
2137 data.pscan_rep_mode = info->pscan_rep_mode;
2138 data.pscan_period_mode = info->pscan_period_mode;
2139 data.pscan_mode = info->pscan_mode;
2140 memcpy(data.dev_class, info->dev_class, 3);
2141 data.clock_offset = info->clock_offset;
Marcel Holtmannefb25132014-12-05 13:03:34 +01002142 data.rssi = HCI_RSSI_INVALID;
Marcel Holtmann41a96212008-07-14 20:13:48 +02002143 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02002144
Marcel Holtmannaf589252014-07-01 14:11:20 +02002145 flags = hci_inquiry_cache_update(hdev, &data, false);
2146
Johan Hedberg48264f02011-11-09 13:58:58 +02002147 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Marcel Holtmannefb25132014-12-05 13:03:34 +01002148 info->dev_class, HCI_RSSI_INVALID,
2149 flags, NULL, 0, NULL, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002150 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002151
Linus Torvalds1da177e2005-04-16 15:20:36 -07002152 hci_dev_unlock(hdev);
2153}
2154
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002155static void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002156{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002157 struct hci_ev_conn_complete *ev = (void *) skb->data;
2158 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002159
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002160 BT_DBG("%s", hdev->name);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002161
Linus Torvalds1da177e2005-04-16 15:20:36 -07002162 hci_dev_lock(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002163
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002164 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann94992372009-04-19 19:30:03 +02002165 if (!conn) {
2166 if (ev->link_type != SCO_LINK)
2167 goto unlock;
2168
2169 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
2170 if (!conn)
2171 goto unlock;
2172
2173 conn->type = SCO_LINK;
2174 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002175
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002176 if (!ev->status) {
2177 conn->handle = __le16_to_cpu(ev->handle);
Marcel Holtmann769be972008-07-14 20:13:49 +02002178
2179 if (conn->type == ACL_LINK) {
2180 conn->state = BT_CONFIG;
2181 hci_conn_hold(conn);
Szymon Janca9ea3ed2012-07-19 14:46:08 +02002182
2183 if (!conn->out && !hci_conn_ssp_enabled(conn) &&
2184 !hci_find_link_key(hdev, &ev->bdaddr))
2185 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
2186 else
2187 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
Marcel Holtmann769be972008-07-14 20:13:49 +02002188 } else
2189 conn->state = BT_CONNECTED;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002190
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01002191 hci_debugfs_create_conn(conn);
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02002192 hci_conn_add_sysfs(conn);
2193
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002194 if (test_bit(HCI_AUTH, &hdev->flags))
Johan Hedberg4dae2792014-06-24 17:03:50 +03002195 set_bit(HCI_CONN_AUTH, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002196
2197 if (test_bit(HCI_ENCRYPT, &hdev->flags))
Johan Hedberg4dae2792014-06-24 17:03:50 +03002198 set_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002199
2200 /* Get remote features */
2201 if (conn->type == ACL_LINK) {
2202 struct hci_cp_read_remote_features cp;
2203 cp.handle = ev->handle;
Marcel Holtmann769be972008-07-14 20:13:49 +02002204 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_FEATURES,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002205 sizeof(cp), &cp);
Johan Hedberg22f433d2014-08-01 11:13:32 +03002206
Johan Hedberg01b1cb82015-11-16 12:52:21 +02002207 hci_req_update_scan(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002208 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002209
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002210 /* Set packet type for incoming connection */
Andrei Emeltchenkod095c1e2011-12-01 14:33:27 +02002211 if (!conn->out && hdev->hci_ver < BLUETOOTH_VER_2_0) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002212 struct hci_cp_change_conn_ptype cp;
2213 cp.handle = ev->handle;
Marcel Holtmanna8746412008-07-14 20:13:46 +02002214 cp.pkt_type = cpu_to_le16(conn->pkt_type);
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002215 hci_send_cmd(hdev, HCI_OP_CHANGE_CONN_PTYPE, sizeof(cp),
2216 &cp);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002217 }
Johan Hedberg17d5c042011-01-22 06:09:08 +02002218 } else {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002219 conn->state = BT_CLOSED;
Johan Hedberg17d5c042011-01-22 06:09:08 +02002220 if (conn->type == ACL_LINK)
Marcel Holtmann64c7b772014-02-18 14:22:20 -08002221 mgmt_connect_failed(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002222 conn->dst_type, ev->status);
Johan Hedberg17d5c042011-01-22 06:09:08 +02002223 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002224
Marcel Holtmanne73439d2010-07-26 10:06:00 -04002225 if (conn->type == ACL_LINK)
2226 hci_sco_setup(conn, ev->status);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002227
Marcel Holtmann769be972008-07-14 20:13:49 +02002228 if (ev->status) {
Johan Hedberg539c4962015-02-18 14:53:57 +02002229 hci_connect_cfm(conn, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002230 hci_conn_del(conn);
Marcel Holtmannc89b6e62009-01-15 21:57:03 +01002231 } else if (ev->link_type != ACL_LINK)
Johan Hedberg539c4962015-02-18 14:53:57 +02002232 hci_connect_cfm(conn, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002233
2234unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002235 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002236
2237 hci_conn_check_pending(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002238}
2239
Johan Hedberg70c46422014-07-09 12:59:17 +03002240static void hci_reject_conn(struct hci_dev *hdev, bdaddr_t *bdaddr)
2241{
2242 struct hci_cp_reject_conn_req cp;
2243
2244 bacpy(&cp.bdaddr, bdaddr);
2245 cp.reason = HCI_ERROR_REJ_BAD_ADDR;
2246 hci_send_cmd(hdev, HCI_OP_REJECT_CONN_REQ, sizeof(cp), &cp);
2247}
2248
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002249static void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002250{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002251 struct hci_ev_conn_request *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002252 int mask = hdev->link_mode;
Johan Hedberg70c46422014-07-09 12:59:17 +03002253 struct inquiry_entry *ie;
2254 struct hci_conn *conn;
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002255 __u8 flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002256
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03002257 BT_DBG("%s bdaddr %pMR type 0x%x", hdev->name, &ev->bdaddr,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002258 ev->link_type);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002259
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002260 mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, ev->link_type,
2261 &flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002262
Johan Hedberg70c46422014-07-09 12:59:17 +03002263 if (!(mask & HCI_LM_ACCEPT)) {
2264 hci_reject_conn(hdev, &ev->bdaddr);
2265 return;
2266 }
2267
Johan Hedberg46c4c942014-07-16 16:19:21 +03002268 if (hci_bdaddr_list_lookup(&hdev->blacklist, &ev->bdaddr,
2269 BDADDR_BREDR)) {
2270 hci_reject_conn(hdev, &ev->bdaddr);
2271 return;
2272 }
2273
Johan Hedberg6a8fc952014-12-24 20:43:11 +02002274 /* Require HCI_CONNECTABLE or a whitelist entry to accept the
2275 * connection. These features are only touched through mgmt so
2276 * only do the checks if HCI_MGMT is set.
2277 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002278 if (hci_dev_test_flag(hdev, HCI_MGMT) &&
2279 !hci_dev_test_flag(hdev, HCI_CONNECTABLE) &&
Johan Hedberg46c4c942014-07-16 16:19:21 +03002280 !hci_bdaddr_list_lookup(&hdev->whitelist, &ev->bdaddr,
2281 BDADDR_BREDR)) {
2282 hci_reject_conn(hdev, &ev->bdaddr);
2283 return;
Johan Hedberg70c46422014-07-09 12:59:17 +03002284 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002285
Johan Hedberg70c46422014-07-09 12:59:17 +03002286 /* Connection accepted */
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002287
Johan Hedberg70c46422014-07-09 12:59:17 +03002288 hci_dev_lock(hdev);
Marcel Holtmannc7bdd502008-07-14 20:13:47 +02002289
Johan Hedberg70c46422014-07-09 12:59:17 +03002290 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
2291 if (ie)
2292 memcpy(ie->data.dev_class, ev->dev_class, 3);
2293
2294 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type,
2295 &ev->bdaddr);
2296 if (!conn) {
Johan Hedberga5c4e302014-07-16 11:56:07 +03002297 conn = hci_conn_add(hdev, ev->link_type, &ev->bdaddr,
2298 HCI_ROLE_SLAVE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002299 if (!conn) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002300 bt_dev_err(hdev, "no memory for new connection");
Johan Hedberg70c46422014-07-09 12:59:17 +03002301 hci_dev_unlock(hdev);
2302 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002303 }
Johan Hedberg70c46422014-07-09 12:59:17 +03002304 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002305
Johan Hedberg70c46422014-07-09 12:59:17 +03002306 memcpy(conn->dev_class, ev->dev_class, 3);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002307
Johan Hedberg70c46422014-07-09 12:59:17 +03002308 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002309
Johan Hedberg70c46422014-07-09 12:59:17 +03002310 if (ev->link_type == ACL_LINK ||
2311 (!(flags & HCI_PROTO_DEFER) && !lmp_esco_capable(hdev))) {
2312 struct hci_cp_accept_conn_req cp;
2313 conn->state = BT_CONNECT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002314
2315 bacpy(&cp.bdaddr, &ev->bdaddr);
Johan Hedberg70c46422014-07-09 12:59:17 +03002316
2317 if (lmp_rswitch_capable(hdev) && (mask & HCI_LM_MASTER))
2318 cp.role = 0x00; /* Become master */
2319 else
2320 cp.role = 0x01; /* Remain slave */
2321
2322 hci_send_cmd(hdev, HCI_OP_ACCEPT_CONN_REQ, sizeof(cp), &cp);
2323 } else if (!(flags & HCI_PROTO_DEFER)) {
2324 struct hci_cp_accept_sync_conn_req cp;
2325 conn->state = BT_CONNECT;
2326
2327 bacpy(&cp.bdaddr, &ev->bdaddr);
2328 cp.pkt_type = cpu_to_le16(conn->pkt_type);
2329
2330 cp.tx_bandwidth = cpu_to_le32(0x00001f40);
2331 cp.rx_bandwidth = cpu_to_le32(0x00001f40);
2332 cp.max_latency = cpu_to_le16(0xffff);
2333 cp.content_format = cpu_to_le16(hdev->voice_setting);
2334 cp.retrans_effort = 0xff;
2335
2336 hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ, sizeof(cp),
2337 &cp);
2338 } else {
2339 conn->state = BT_CONNECT2;
Johan Hedberg539c4962015-02-18 14:53:57 +02002340 hci_connect_cfm(conn, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002341 }
2342}
2343
Mikel Astizf0d6a0e2012-08-09 09:52:30 +02002344static u8 hci_to_mgmt_reason(u8 err)
2345{
2346 switch (err) {
2347 case HCI_ERROR_CONNECTION_TIMEOUT:
2348 return MGMT_DEV_DISCONN_TIMEOUT;
2349 case HCI_ERROR_REMOTE_USER_TERM:
2350 case HCI_ERROR_REMOTE_LOW_RESOURCES:
2351 case HCI_ERROR_REMOTE_POWER_OFF:
2352 return MGMT_DEV_DISCONN_REMOTE;
2353 case HCI_ERROR_LOCAL_HOST_TERM:
2354 return MGMT_DEV_DISCONN_LOCAL_HOST;
2355 default:
2356 return MGMT_DEV_DISCONN_UNKNOWN;
2357 }
2358}
2359
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002360static void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002361{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002362 struct hci_ev_disconn_complete *ev = (void *) skb->data;
Szymon Janc160b9252016-07-12 02:12:16 +02002363 u8 reason;
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002364 struct hci_conn_params *params;
Marcel Holtmann04837f62006-07-03 10:02:33 +02002365 struct hci_conn *conn;
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002366 bool mgmt_connected;
Andre Guedes38462202013-11-07 17:36:10 -03002367 u8 type;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002368
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002369 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002370
Linus Torvalds1da177e2005-04-16 15:20:36 -07002371 hci_dev_lock(hdev);
2372
Marcel Holtmann04837f62006-07-03 10:02:33 +02002373 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergf7520542011-01-20 12:34:39 +02002374 if (!conn)
2375 goto unlock;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02002376
Andre Guedesabf54a52013-11-07 17:36:09 -03002377 if (ev->status) {
2378 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
2379 conn->dst_type, ev->status);
2380 goto unlock;
Johan Hedberg37d9ef72011-11-10 15:54:39 +02002381 }
Johan Hedbergf7520542011-01-20 12:34:39 +02002382
Andre Guedes38462202013-11-07 17:36:10 -03002383 conn->state = BT_CLOSED;
2384
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002385 mgmt_connected = test_and_clear_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags);
Szymon Janc160b9252016-07-12 02:12:16 +02002386
2387 if (test_bit(HCI_CONN_AUTH_FAILURE, &conn->flags))
2388 reason = MGMT_DEV_DISCONN_AUTH_FAILURE;
2389 else
2390 reason = hci_to_mgmt_reason(ev->reason);
2391
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002392 mgmt_device_disconnected(hdev, &conn->dst, conn->type, conn->dst_type,
2393 reason, mgmt_connected);
Andre Guedesabf54a52013-11-07 17:36:09 -03002394
Johan Hedberg22f433d2014-08-01 11:13:32 +03002395 if (conn->type == ACL_LINK) {
2396 if (test_bit(HCI_CONN_FLUSH_KEY, &conn->flags))
2397 hci_remove_link_key(hdev, &conn->dst);
2398
Johan Hedberg01b1cb82015-11-16 12:52:21 +02002399 hci_req_update_scan(hdev);
Johan Hedberg22f433d2014-08-01 11:13:32 +03002400 }
Johan Hedberg22102462013-10-05 12:01:06 +02002401
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002402 params = hci_conn_params_lookup(hdev, &conn->dst, conn->dst_type);
2403 if (params) {
2404 switch (params->auto_connect) {
2405 case HCI_AUTO_CONN_LINK_LOSS:
2406 if (ev->reason != HCI_ERROR_CONNECTION_TIMEOUT)
2407 break;
2408 /* Fall through */
2409
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02002410 case HCI_AUTO_CONN_DIRECT:
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002411 case HCI_AUTO_CONN_ALWAYS:
Johan Hedberg418025d2014-07-04 12:37:24 +03002412 list_del_init(&params->action);
2413 list_add(&params->action, &hdev->pend_le_conns);
2414 hci_update_background_scan(hdev);
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002415 break;
2416
2417 default:
2418 break;
2419 }
2420 }
2421
Andre Guedes38462202013-11-07 17:36:10 -03002422 type = conn->type;
Johan Hedberg22102462013-10-05 12:01:06 +02002423
Johan Hedberg3a6d5762015-02-18 14:53:58 +02002424 hci_disconn_cfm(conn, ev->reason);
Andre Guedes38462202013-11-07 17:36:10 -03002425 hci_conn_del(conn);
2426
2427 /* Re-enable advertising if necessary, since it might
2428 * have been disabled by the connection. From the
2429 * HCI_LE_Set_Advertise_Enable command description in
2430 * the core specification (v4.0):
2431 * "The Controller shall continue advertising until the Host
2432 * issues an LE_Set_Advertise_Enable command with
2433 * Advertising_Enable set to 0x00 (Advertising is disabled)
2434 * or until a connection is created or until the Advertising
2435 * is timed out due to Directed Advertising."
2436 */
2437 if (type == LE_LINK)
Johan Hedbergf2252572015-11-18 12:49:20 +02002438 hci_req_reenable_advertising(hdev);
Johan Hedbergf7520542011-01-20 12:34:39 +02002439
2440unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002441 hci_dev_unlock(hdev);
2442}
2443
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002444static void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002445{
2446 struct hci_ev_auth_complete *ev = (void *) skb->data;
2447 struct hci_conn *conn;
2448
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002449 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002450
2451 hci_dev_lock(hdev);
2452
2453 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002454 if (!conn)
2455 goto unlock;
2456
2457 if (!ev->status) {
Szymon Janc160b9252016-07-12 02:12:16 +02002458 clear_bit(HCI_CONN_AUTH_FAILURE, &conn->flags);
2459
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002460 if (!hci_conn_ssp_enabled(conn) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03002461 test_bit(HCI_CONN_REAUTH_PEND, &conn->flags)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002462 bt_dev_info(hdev, "re-auth of legacy device is not possible.");
Johan Hedberg2a611692011-02-19 12:06:00 -03002463 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002464 set_bit(HCI_CONN_AUTH, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002465 conn->sec_level = conn->pending_sec_level;
Johan Hedberg2a611692011-02-19 12:06:00 -03002466 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002467 } else {
Szymon Janc160b9252016-07-12 02:12:16 +02002468 if (ev->status == HCI_ERROR_PIN_OR_KEY_MISSING)
2469 set_bit(HCI_CONN_AUTH_FAILURE, &conn->flags);
2470
Johan Hedberge1e930f2014-09-08 17:09:49 -07002471 mgmt_auth_failed(conn, ev->status);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002472 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002473
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002474 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
2475 clear_bit(HCI_CONN_REAUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002476
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002477 if (conn->state == BT_CONFIG) {
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002478 if (!ev->status && hci_conn_ssp_enabled(conn)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002479 struct hci_cp_set_conn_encrypt cp;
2480 cp.handle = ev->handle;
2481 cp.encrypt = 0x01;
2482 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002483 &cp);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002484 } else {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002485 conn->state = BT_CONNECTED;
Johan Hedberg539c4962015-02-18 14:53:57 +02002486 hci_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002487 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002488 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002489 } else {
2490 hci_auth_cfm(conn, ev->status);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002491
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002492 hci_conn_hold(conn);
2493 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02002494 hci_conn_drop(conn);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002495 }
2496
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002497 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002498 if (!ev->status) {
2499 struct hci_cp_set_conn_encrypt cp;
2500 cp.handle = ev->handle;
2501 cp.encrypt = 0x01;
2502 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002503 &cp);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002504 } else {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002505 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002506 hci_encrypt_cfm(conn, ev->status, 0x00);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002507 }
2508 }
2509
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002510unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002511 hci_dev_unlock(hdev);
2512}
2513
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002514static void hci_remote_name_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002515{
Johan Hedberg127178d2010-11-18 22:22:29 +02002516 struct hci_ev_remote_name *ev = (void *) skb->data;
2517 struct hci_conn *conn;
2518
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002519 BT_DBG("%s", hdev->name);
2520
2521 hci_conn_check_pending(hdev);
Johan Hedberg127178d2010-11-18 22:22:29 +02002522
2523 hci_dev_lock(hdev);
2524
2525 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002526
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002527 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedbergb644ba32012-01-17 21:48:47 +02002528 goto check_auth;
2529
2530 if (ev->status == 0)
2531 hci_check_pending_name(hdev, conn, &ev->bdaddr, ev->name,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002532 strnlen(ev->name, HCI_MAX_NAME_LENGTH));
Johan Hedbergb644ba32012-01-17 21:48:47 +02002533 else
2534 hci_check_pending_name(hdev, conn, &ev->bdaddr, NULL, 0);
2535
2536check_auth:
Johan Hedberg79c6c702011-04-28 11:28:55 -07002537 if (!conn)
2538 goto unlock;
2539
2540 if (!hci_outgoing_auth_needed(hdev, conn))
2541 goto unlock;
2542
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002543 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002544 struct hci_cp_auth_requested cp;
Johan Hedberg977f8fc2014-07-17 15:35:39 +03002545
2546 set_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags);
2547
Johan Hedberg127178d2010-11-18 22:22:29 +02002548 cp.handle = __cpu_to_le16(conn->handle);
2549 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED, sizeof(cp), &cp);
2550 }
2551
Johan Hedberg79c6c702011-04-28 11:28:55 -07002552unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02002553 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002554}
2555
Johan Hedberg821f3762015-06-11 13:52:29 +03002556static void read_enc_key_size_complete(struct hci_dev *hdev, u8 status,
2557 u16 opcode, struct sk_buff *skb)
2558{
2559 const struct hci_rp_read_enc_key_size *rp;
2560 struct hci_conn *conn;
2561 u16 handle;
2562
2563 BT_DBG("%s status 0x%02x", hdev->name, status);
2564
2565 if (!skb || skb->len < sizeof(*rp)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002566 bt_dev_err(hdev, "invalid read key size response");
Johan Hedberg821f3762015-06-11 13:52:29 +03002567 return;
2568 }
2569
2570 rp = (void *)skb->data;
2571 handle = le16_to_cpu(rp->handle);
2572
2573 hci_dev_lock(hdev);
2574
2575 conn = hci_conn_hash_lookup_handle(hdev, handle);
2576 if (!conn)
2577 goto unlock;
2578
2579 /* If we fail to read the encryption key size, assume maximum
2580 * (which is the same we do also when this HCI command isn't
2581 * supported.
2582 */
2583 if (rp->status) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002584 bt_dev_err(hdev, "failed to read key size for handle %u",
2585 handle);
Johan Hedberg821f3762015-06-11 13:52:29 +03002586 conn->enc_key_size = HCI_LINK_KEY_SIZE;
2587 } else {
2588 conn->enc_key_size = rp->key_size;
2589 }
2590
2591 if (conn->state == BT_CONFIG) {
2592 conn->state = BT_CONNECTED;
2593 hci_connect_cfm(conn, 0);
2594 hci_conn_drop(conn);
2595 } else {
2596 u8 encrypt;
2597
2598 if (!test_bit(HCI_CONN_ENCRYPT, &conn->flags))
2599 encrypt = 0x00;
Johan Hedberg5d667ef2015-06-12 13:04:47 +03002600 else if (test_bit(HCI_CONN_AES_CCM, &conn->flags))
Johan Hedberg821f3762015-06-11 13:52:29 +03002601 encrypt = 0x02;
2602 else
2603 encrypt = 0x01;
2604
2605 hci_encrypt_cfm(conn, 0, encrypt);
2606 }
2607
2608unlock:
2609 hci_dev_unlock(hdev);
2610}
2611
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002612static void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002613{
2614 struct hci_ev_encrypt_change *ev = (void *) skb->data;
2615 struct hci_conn *conn;
2616
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002617 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002618
2619 hci_dev_lock(hdev);
2620
2621 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002622 if (!conn)
2623 goto unlock;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002624
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002625 if (!ev->status) {
2626 if (ev->encrypt) {
2627 /* Encryption implies authentication */
Johan Hedberg4dae2792014-06-24 17:03:50 +03002628 set_bit(HCI_CONN_AUTH, &conn->flags);
2629 set_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002630 conn->sec_level = conn->pending_sec_level;
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002631
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002632 /* P-256 authentication key implies FIPS */
2633 if (conn->key_type == HCI_LK_AUTH_COMBINATION_P256)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002634 set_bit(HCI_CONN_FIPS, &conn->flags);
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002635
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002636 if ((conn->type == ACL_LINK && ev->encrypt == 0x02) ||
2637 conn->type == LE_LINK)
2638 set_bit(HCI_CONN_AES_CCM, &conn->flags);
2639 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002640 clear_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002641 clear_bit(HCI_CONN_AES_CCM, &conn->flags);
2642 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002643 }
2644
Johan Hedberg7ed3fa22014-09-10 22:16:35 -07002645 /* We should disregard the current RPA and generate a new one
2646 * whenever the encryption procedure fails.
2647 */
2648 if (ev->status && conn->type == LE_LINK)
Marcel Holtmanna1536da2015-03-13 02:11:01 -07002649 hci_dev_set_flag(hdev, HCI_RPA_EXPIRED);
Johan Hedberg7ed3fa22014-09-10 22:16:35 -07002650
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002651 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
2652
2653 if (ev->status && conn->state == BT_CONNECTED) {
Szymon Janc160b9252016-07-12 02:12:16 +02002654 if (ev->status == HCI_ERROR_PIN_OR_KEY_MISSING)
2655 set_bit(HCI_CONN_AUTH_FAILURE, &conn->flags);
2656
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002657 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
2658 hci_conn_drop(conn);
2659 goto unlock;
2660 }
2661
Johan Hedberg035ad622015-06-11 13:52:28 +03002662 /* In Secure Connections Only mode, do not allow any connections
2663 * that are not encrypted with AES-CCM using a P-256 authenticated
2664 * combination key.
2665 */
2666 if (hci_dev_test_flag(hdev, HCI_SC_ONLY) &&
2667 (!test_bit(HCI_CONN_AES_CCM, &conn->flags) ||
2668 conn->key_type != HCI_LK_AUTH_COMBINATION_P256)) {
2669 hci_connect_cfm(conn, HCI_ERROR_AUTH_FAILURE);
2670 hci_conn_drop(conn);
2671 goto unlock;
2672 }
2673
Johan Hedberg821f3762015-06-11 13:52:29 +03002674 /* Try reading the encryption key size for encrypted ACL links */
2675 if (!ev->status && ev->encrypt && conn->type == ACL_LINK) {
2676 struct hci_cp_read_enc_key_size cp;
2677 struct hci_request req;
2678
2679 /* Only send HCI_Read_Encryption_Key_Size if the
2680 * controller really supports it. If it doesn't, assume
2681 * the default size (16).
2682 */
2683 if (!(hdev->commands[20] & 0x10)) {
2684 conn->enc_key_size = HCI_LINK_KEY_SIZE;
2685 goto notify;
2686 }
2687
2688 hci_req_init(&req, hdev);
2689
2690 cp.handle = cpu_to_le16(conn->handle);
2691 hci_req_add(&req, HCI_OP_READ_ENC_KEY_SIZE, sizeof(cp), &cp);
2692
2693 if (hci_req_run_skb(&req, read_enc_key_size_complete)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002694 bt_dev_err(hdev, "sending read key size failed");
Johan Hedberg821f3762015-06-11 13:52:29 +03002695 conn->enc_key_size = HCI_LINK_KEY_SIZE;
2696 goto notify;
2697 }
2698
2699 goto unlock;
2700 }
2701
2702notify:
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002703 if (conn->state == BT_CONFIG) {
2704 if (!ev->status)
2705 conn->state = BT_CONNECTED;
2706
Johan Hedberg539c4962015-02-18 14:53:57 +02002707 hci_connect_cfm(conn, ev->status);
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002708 hci_conn_drop(conn);
2709 } else
2710 hci_encrypt_cfm(conn, ev->status, ev->encrypt);
2711
Gustavo Padovana7d77232012-05-13 03:20:07 -03002712unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002713 hci_dev_unlock(hdev);
2714}
2715
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002716static void hci_change_link_key_complete_evt(struct hci_dev *hdev,
2717 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002718{
2719 struct hci_ev_change_link_key_complete *ev = (void *) skb->data;
2720 struct hci_conn *conn;
2721
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002722 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002723
2724 hci_dev_lock(hdev);
2725
2726 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
2727 if (conn) {
2728 if (!ev->status)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002729 set_bit(HCI_CONN_SECURE, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002730
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002731 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002732
2733 hci_key_change_cfm(conn, ev->status);
2734 }
2735
2736 hci_dev_unlock(hdev);
2737}
2738
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002739static void hci_remote_features_evt(struct hci_dev *hdev,
2740 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002741{
2742 struct hci_ev_remote_features *ev = (void *) skb->data;
2743 struct hci_conn *conn;
2744
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002745 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002746
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002747 hci_dev_lock(hdev);
2748
2749 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02002750 if (!conn)
2751 goto unlock;
Marcel Holtmann769be972008-07-14 20:13:49 +02002752
Johan Hedbergccd556f2010-11-10 17:11:51 +02002753 if (!ev->status)
Johan Hedbergcad718e2013-04-17 15:00:51 +03002754 memcpy(conn->features[0], ev->features, 8);
Johan Hedbergccd556f2010-11-10 17:11:51 +02002755
2756 if (conn->state != BT_CONFIG)
2757 goto unlock;
2758
Szymon Jancac363cf2015-01-29 16:36:59 +01002759 if (!ev->status && lmp_ext_feat_capable(hdev) &&
2760 lmp_ext_feat_capable(conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02002761 struct hci_cp_read_remote_ext_features cp;
2762 cp.handle = ev->handle;
2763 cp.page = 0x01;
2764 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002765 sizeof(cp), &cp);
Johan Hedberg392599b2010-11-18 22:22:28 +02002766 goto unlock;
2767 }
2768
Johan Hedberg671267b2012-05-12 16:11:50 -03002769 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002770 struct hci_cp_remote_name_req cp;
2771 memset(&cp, 0, sizeof(cp));
2772 bacpy(&cp.bdaddr, &conn->dst);
2773 cp.pscan_rep_mode = 0x02;
2774 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002775 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00002776 mgmt_device_connected(hdev, conn, 0, NULL, 0);
Johan Hedberg392599b2010-11-18 22:22:28 +02002777
Johan Hedberg127178d2010-11-18 22:22:29 +02002778 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02002779 conn->state = BT_CONNECTED;
Johan Hedberg539c4962015-02-18 14:53:57 +02002780 hci_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002781 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02002782 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002783
Johan Hedbergccd556f2010-11-10 17:11:51 +02002784unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002785 hci_dev_unlock(hdev);
2786}
2787
Johan Hedberge62144872015-04-02 13:41:08 +03002788static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb,
2789 u16 *opcode, u8 *status,
2790 hci_req_complete_t *req_complete,
2791 hci_req_complete_skb_t *req_complete_skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002792{
2793 struct hci_ev_cmd_complete *ev = (void *) skb->data;
Johan Hedberge62144872015-04-02 13:41:08 +03002794
2795 *opcode = __le16_to_cpu(ev->opcode);
2796 *status = skb->data[sizeof(*ev)];
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002797
2798 skb_pull(skb, sizeof(*ev));
2799
Johan Hedberge62144872015-04-02 13:41:08 +03002800 switch (*opcode) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002801 case HCI_OP_INQUIRY_CANCEL:
2802 hci_cc_inquiry_cancel(hdev, skb);
2803 break;
2804
Andre Guedes4d934832012-03-21 00:03:35 -03002805 case HCI_OP_PERIODIC_INQ:
2806 hci_cc_periodic_inq(hdev, skb);
2807 break;
2808
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002809 case HCI_OP_EXIT_PERIODIC_INQ:
2810 hci_cc_exit_periodic_inq(hdev, skb);
2811 break;
2812
2813 case HCI_OP_REMOTE_NAME_REQ_CANCEL:
2814 hci_cc_remote_name_req_cancel(hdev, skb);
2815 break;
2816
2817 case HCI_OP_ROLE_DISCOVERY:
2818 hci_cc_role_discovery(hdev, skb);
2819 break;
2820
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002821 case HCI_OP_READ_LINK_POLICY:
2822 hci_cc_read_link_policy(hdev, skb);
2823 break;
2824
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002825 case HCI_OP_WRITE_LINK_POLICY:
2826 hci_cc_write_link_policy(hdev, skb);
2827 break;
2828
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002829 case HCI_OP_READ_DEF_LINK_POLICY:
2830 hci_cc_read_def_link_policy(hdev, skb);
2831 break;
2832
2833 case HCI_OP_WRITE_DEF_LINK_POLICY:
2834 hci_cc_write_def_link_policy(hdev, skb);
2835 break;
2836
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002837 case HCI_OP_RESET:
2838 hci_cc_reset(hdev, skb);
2839 break;
2840
Marcel Holtmannc2f0f972015-01-12 09:21:25 -08002841 case HCI_OP_READ_STORED_LINK_KEY:
2842 hci_cc_read_stored_link_key(hdev, skb);
2843 break;
2844
Marcel Holtmanna93661202015-01-12 09:21:28 -08002845 case HCI_OP_DELETE_STORED_LINK_KEY:
2846 hci_cc_delete_stored_link_key(hdev, skb);
2847 break;
2848
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002849 case HCI_OP_WRITE_LOCAL_NAME:
2850 hci_cc_write_local_name(hdev, skb);
2851 break;
2852
2853 case HCI_OP_READ_LOCAL_NAME:
2854 hci_cc_read_local_name(hdev, skb);
2855 break;
2856
2857 case HCI_OP_WRITE_AUTH_ENABLE:
2858 hci_cc_write_auth_enable(hdev, skb);
2859 break;
2860
2861 case HCI_OP_WRITE_ENCRYPT_MODE:
2862 hci_cc_write_encrypt_mode(hdev, skb);
2863 break;
2864
2865 case HCI_OP_WRITE_SCAN_ENABLE:
2866 hci_cc_write_scan_enable(hdev, skb);
2867 break;
2868
2869 case HCI_OP_READ_CLASS_OF_DEV:
2870 hci_cc_read_class_of_dev(hdev, skb);
2871 break;
2872
2873 case HCI_OP_WRITE_CLASS_OF_DEV:
2874 hci_cc_write_class_of_dev(hdev, skb);
2875 break;
2876
2877 case HCI_OP_READ_VOICE_SETTING:
2878 hci_cc_read_voice_setting(hdev, skb);
2879 break;
2880
2881 case HCI_OP_WRITE_VOICE_SETTING:
2882 hci_cc_write_voice_setting(hdev, skb);
2883 break;
2884
Marcel Holtmannb4cb9fb2013-10-14 13:56:16 -07002885 case HCI_OP_READ_NUM_SUPPORTED_IAC:
2886 hci_cc_read_num_supported_iac(hdev, skb);
2887 break;
2888
Marcel Holtmann333140b2008-07-14 20:13:48 +02002889 case HCI_OP_WRITE_SSP_MODE:
2890 hci_cc_write_ssp_mode(hdev, skb);
2891 break;
2892
Marcel Holtmanneac83dc2014-01-10 02:07:23 -08002893 case HCI_OP_WRITE_SC_SUPPORT:
2894 hci_cc_write_sc_support(hdev, skb);
2895 break;
2896
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002897 case HCI_OP_READ_LOCAL_VERSION:
2898 hci_cc_read_local_version(hdev, skb);
2899 break;
2900
2901 case HCI_OP_READ_LOCAL_COMMANDS:
2902 hci_cc_read_local_commands(hdev, skb);
2903 break;
2904
2905 case HCI_OP_READ_LOCAL_FEATURES:
2906 hci_cc_read_local_features(hdev, skb);
2907 break;
2908
Andre Guedes971e3a42011-06-30 19:20:52 -03002909 case HCI_OP_READ_LOCAL_EXT_FEATURES:
2910 hci_cc_read_local_ext_features(hdev, skb);
2911 break;
2912
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002913 case HCI_OP_READ_BUFFER_SIZE:
2914 hci_cc_read_buffer_size(hdev, skb);
2915 break;
2916
2917 case HCI_OP_READ_BD_ADDR:
2918 hci_cc_read_bd_addr(hdev, skb);
2919 break;
2920
Johan Hedbergf332ec62013-03-15 17:07:11 -05002921 case HCI_OP_READ_PAGE_SCAN_ACTIVITY:
2922 hci_cc_read_page_scan_activity(hdev, skb);
2923 break;
2924
Johan Hedberg4a3ee762013-03-15 17:07:12 -05002925 case HCI_OP_WRITE_PAGE_SCAN_ACTIVITY:
2926 hci_cc_write_page_scan_activity(hdev, skb);
2927 break;
2928
Johan Hedbergf332ec62013-03-15 17:07:11 -05002929 case HCI_OP_READ_PAGE_SCAN_TYPE:
2930 hci_cc_read_page_scan_type(hdev, skb);
2931 break;
2932
Johan Hedberg4a3ee762013-03-15 17:07:12 -05002933 case HCI_OP_WRITE_PAGE_SCAN_TYPE:
2934 hci_cc_write_page_scan_type(hdev, skb);
2935 break;
2936
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +02002937 case HCI_OP_READ_DATA_BLOCK_SIZE:
2938 hci_cc_read_data_block_size(hdev, skb);
2939 break;
2940
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +02002941 case HCI_OP_READ_FLOW_CONTROL_MODE:
2942 hci_cc_read_flow_control_mode(hdev, skb);
2943 break;
2944
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +03002945 case HCI_OP_READ_LOCAL_AMP_INFO:
2946 hci_cc_read_local_amp_info(hdev, skb);
2947 break;
2948
Johan Hedberg33f35722014-06-28 17:54:06 +03002949 case HCI_OP_READ_CLOCK:
2950 hci_cc_read_clock(hdev, skb);
2951 break;
2952
Johan Hedbergd5859e22011-01-25 01:19:58 +02002953 case HCI_OP_READ_INQ_RSP_TX_POWER:
2954 hci_cc_read_inq_rsp_tx_power(hdev, skb);
2955 break;
2956
Johan Hedberg980e1a52011-01-22 06:10:07 +02002957 case HCI_OP_PIN_CODE_REPLY:
2958 hci_cc_pin_code_reply(hdev, skb);
2959 break;
2960
2961 case HCI_OP_PIN_CODE_NEG_REPLY:
2962 hci_cc_pin_code_neg_reply(hdev, skb);
2963 break;
2964
Szymon Jancc35938b2011-03-22 13:12:21 +01002965 case HCI_OP_READ_LOCAL_OOB_DATA:
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08002966 hci_cc_read_local_oob_data(hdev, skb);
2967 break;
2968
2969 case HCI_OP_READ_LOCAL_OOB_EXT_DATA:
2970 hci_cc_read_local_oob_ext_data(hdev, skb);
Szymon Jancc35938b2011-03-22 13:12:21 +01002971 break;
2972
Ville Tervo6ed58ec2011-02-10 22:38:48 -03002973 case HCI_OP_LE_READ_BUFFER_SIZE:
2974 hci_cc_le_read_buffer_size(hdev, skb);
2975 break;
2976
Johan Hedberg60e77322013-01-22 14:01:59 +02002977 case HCI_OP_LE_READ_LOCAL_FEATURES:
2978 hci_cc_le_read_local_features(hdev, skb);
2979 break;
2980
Johan Hedberg8fa19092012-10-19 20:57:49 +03002981 case HCI_OP_LE_READ_ADV_TX_POWER:
2982 hci_cc_le_read_adv_tx_power(hdev, skb);
2983 break;
2984
Johan Hedberga5c29682011-02-19 12:05:57 -03002985 case HCI_OP_USER_CONFIRM_REPLY:
2986 hci_cc_user_confirm_reply(hdev, skb);
2987 break;
2988
2989 case HCI_OP_USER_CONFIRM_NEG_REPLY:
2990 hci_cc_user_confirm_neg_reply(hdev, skb);
2991 break;
2992
Brian Gix1143d452011-11-23 08:28:34 -08002993 case HCI_OP_USER_PASSKEY_REPLY:
2994 hci_cc_user_passkey_reply(hdev, skb);
2995 break;
2996
2997 case HCI_OP_USER_PASSKEY_NEG_REPLY:
2998 hci_cc_user_passkey_neg_reply(hdev, skb);
Szymon Janc16cde992012-04-13 12:32:42 +02002999 break;
Andre Guedes07f7fa52011-12-02 21:13:31 +09003000
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08003001 case HCI_OP_LE_SET_RANDOM_ADDR:
3002 hci_cc_le_set_random_addr(hdev, skb);
3003 break;
3004
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01003005 case HCI_OP_LE_SET_ADV_ENABLE:
3006 hci_cc_le_set_adv_enable(hdev, skb);
3007 break;
3008
Marcel Holtmann533553f2014-03-21 12:18:10 -07003009 case HCI_OP_LE_SET_SCAN_PARAM:
3010 hci_cc_le_set_scan_param(hdev, skb);
3011 break;
3012
Andre Guedeseb9d91f2011-05-26 16:23:52 -03003013 case HCI_OP_LE_SET_SCAN_ENABLE:
3014 hci_cc_le_set_scan_enable(hdev, skb);
3015 break;
3016
Johan Hedbergcf1d0812013-01-22 14:02:00 +02003017 case HCI_OP_LE_READ_WHITE_LIST_SIZE:
3018 hci_cc_le_read_white_list_size(hdev, skb);
3019 break;
3020
Marcel Holtmann0f36b582014-02-27 20:37:31 -08003021 case HCI_OP_LE_CLEAR_WHITE_LIST:
3022 hci_cc_le_clear_white_list(hdev, skb);
3023 break;
3024
3025 case HCI_OP_LE_ADD_TO_WHITE_LIST:
3026 hci_cc_le_add_to_white_list(hdev, skb);
3027 break;
3028
3029 case HCI_OP_LE_DEL_FROM_WHITE_LIST:
3030 hci_cc_le_del_from_white_list(hdev, skb);
3031 break;
3032
Johan Hedberg9b008c02013-01-22 14:02:01 +02003033 case HCI_OP_LE_READ_SUPPORTED_STATES:
3034 hci_cc_le_read_supported_states(hdev, skb);
3035 break;
3036
Marcel Holtmanna8e1bfa2014-12-20 16:28:40 +01003037 case HCI_OP_LE_READ_DEF_DATA_LEN:
3038 hci_cc_le_read_def_data_len(hdev, skb);
3039 break;
3040
3041 case HCI_OP_LE_WRITE_DEF_DATA_LEN:
3042 hci_cc_le_write_def_data_len(hdev, skb);
3043 break;
3044
Ankit Navik545f2592018-06-29 12:13:20 +05303045 case HCI_OP_LE_CLEAR_RESOLV_LIST:
3046 hci_cc_le_clear_resolv_list(hdev, skb);
3047 break;
3048
Ankit Navikcfdb0c22018-06-29 12:12:50 +05303049 case HCI_OP_LE_READ_RESOLV_LIST_SIZE:
3050 hci_cc_le_read_resolv_list_size(hdev, skb);
3051 break;
3052
Marcel Holtmanna8e1bfa2014-12-20 16:28:40 +01003053 case HCI_OP_LE_READ_MAX_DATA_LEN:
3054 hci_cc_le_read_max_data_len(hdev, skb);
3055 break;
3056
Andre Guedesf9b49302011-06-30 19:20:53 -03003057 case HCI_OP_WRITE_LE_HOST_SUPPORTED:
3058 hci_cc_write_le_host_supported(hdev, skb);
3059 break;
3060
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02003061 case HCI_OP_LE_SET_ADV_PARAM:
3062 hci_cc_set_adv_param(hdev, skb);
3063 break;
3064
Andrzej Kaczmarek5ae76a92014-05-08 15:32:08 +02003065 case HCI_OP_READ_RSSI:
3066 hci_cc_read_rssi(hdev, skb);
3067 break;
3068
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02003069 case HCI_OP_READ_TX_POWER:
3070 hci_cc_read_tx_power(hdev, skb);
3071 break;
3072
Marcel Holtmannc50b33c2015-01-31 15:07:52 -08003073 case HCI_OP_WRITE_SSP_DEBUG_MODE:
3074 hci_cc_write_ssp_debug_mode(hdev, skb);
3075 break;
3076
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003077 default:
Johan Hedberge62144872015-04-02 13:41:08 +03003078 BT_DBG("%s opcode 0x%4.4x", hdev->name, *opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003079 break;
3080 }
3081
Johan Hedberge62144872015-04-02 13:41:08 +03003082 if (*opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02003083 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02003084
Johan Hedberg600b2152015-03-28 11:17:36 +02003085 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags))
3086 atomic_set(&hdev->cmd_cnt, 1);
3087
Johan Hedberge62144872015-04-02 13:41:08 +03003088 hci_req_cmd_complete(hdev, *opcode, *status, req_complete,
3089 req_complete_skb);
Johan Hedberg9238f362013-03-05 20:37:48 +02003090
Johan Hedberg600b2152015-03-28 11:17:36 +02003091 if (atomic_read(&hdev->cmd_cnt) && !skb_queue_empty(&hdev->cmd_q))
3092 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003093}
3094
Johan Hedberge62144872015-04-02 13:41:08 +03003095static void hci_cmd_status_evt(struct hci_dev *hdev, struct sk_buff *skb,
3096 u16 *opcode, u8 *status,
3097 hci_req_complete_t *req_complete,
3098 hci_req_complete_skb_t *req_complete_skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003099{
3100 struct hci_ev_cmd_status *ev = (void *) skb->data;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003101
3102 skb_pull(skb, sizeof(*ev));
3103
Johan Hedberge62144872015-04-02 13:41:08 +03003104 *opcode = __le16_to_cpu(ev->opcode);
3105 *status = ev->status;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003106
Johan Hedberge62144872015-04-02 13:41:08 +03003107 switch (*opcode) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003108 case HCI_OP_INQUIRY:
3109 hci_cs_inquiry(hdev, ev->status);
3110 break;
3111
3112 case HCI_OP_CREATE_CONN:
3113 hci_cs_create_conn(hdev, ev->status);
3114 break;
3115
Kuba Pawlak9645c762014-11-06 19:36:53 +01003116 case HCI_OP_DISCONNECT:
3117 hci_cs_disconnect(hdev, ev->status);
3118 break;
3119
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003120 case HCI_OP_ADD_SCO:
3121 hci_cs_add_sco(hdev, ev->status);
3122 break;
3123
Marcel Holtmannf8558552008-07-14 20:13:49 +02003124 case HCI_OP_AUTH_REQUESTED:
3125 hci_cs_auth_requested(hdev, ev->status);
3126 break;
3127
3128 case HCI_OP_SET_CONN_ENCRYPT:
3129 hci_cs_set_conn_encrypt(hdev, ev->status);
3130 break;
3131
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003132 case HCI_OP_REMOTE_NAME_REQ:
3133 hci_cs_remote_name_req(hdev, ev->status);
3134 break;
3135
Marcel Holtmann769be972008-07-14 20:13:49 +02003136 case HCI_OP_READ_REMOTE_FEATURES:
3137 hci_cs_read_remote_features(hdev, ev->status);
3138 break;
3139
3140 case HCI_OP_READ_REMOTE_EXT_FEATURES:
3141 hci_cs_read_remote_ext_features(hdev, ev->status);
3142 break;
3143
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003144 case HCI_OP_SETUP_SYNC_CONN:
3145 hci_cs_setup_sync_conn(hdev, ev->status);
3146 break;
3147
3148 case HCI_OP_SNIFF_MODE:
3149 hci_cs_sniff_mode(hdev, ev->status);
3150 break;
3151
3152 case HCI_OP_EXIT_SNIFF_MODE:
3153 hci_cs_exit_sniff_mode(hdev, ev->status);
3154 break;
3155
Kuba Pawlak50fc85f2014-11-06 19:36:52 +01003156 case HCI_OP_SWITCH_ROLE:
3157 hci_cs_switch_role(hdev, ev->status);
3158 break;
3159
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02003160 case HCI_OP_LE_CREATE_CONN:
3161 hci_cs_le_create_conn(hdev, ev->status);
3162 break;
3163
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07003164 case HCI_OP_LE_READ_REMOTE_FEATURES:
3165 hci_cs_le_read_remote_features(hdev, ev->status);
3166 break;
3167
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02003168 case HCI_OP_LE_START_ENC:
3169 hci_cs_le_start_enc(hdev, ev->status);
3170 break;
3171
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003172 default:
Johan Hedberge62144872015-04-02 13:41:08 +03003173 BT_DBG("%s opcode 0x%4.4x", hdev->name, *opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003174 break;
3175 }
3176
Johan Hedberge62144872015-04-02 13:41:08 +03003177 if (*opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02003178 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02003179
Johan Hedberg600b2152015-03-28 11:17:36 +02003180 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags))
3181 atomic_set(&hdev->cmd_cnt, 1);
3182
Johan Hedberg444c6dd2015-04-02 13:41:07 +03003183 /* Indicate request completion if the command failed. Also, if
3184 * we're not waiting for a special event and we get a success
3185 * command status we should try to flag the request as completed
3186 * (since for this kind of commands there will not be a command
3187 * complete event).
3188 */
Johan Hedberg02350a72013-04-03 21:50:29 +03003189 if (ev->status ||
Marcel Holtmann242c0eb2015-10-25 22:45:53 +01003190 (hdev->sent_cmd && !bt_cb(hdev->sent_cmd)->hci.req_event))
Johan Hedberge62144872015-04-02 13:41:08 +03003191 hci_req_cmd_complete(hdev, *opcode, ev->status, req_complete,
3192 req_complete_skb);
Johan Hedberg9238f362013-03-05 20:37:48 +02003193
Johan Hedberg600b2152015-03-28 11:17:36 +02003194 if (atomic_read(&hdev->cmd_cnt) && !skb_queue_empty(&hdev->cmd_q))
3195 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003196}
3197
Marcel Holtmann24dfa342014-11-02 02:56:41 +01003198static void hci_hardware_error_evt(struct hci_dev *hdev, struct sk_buff *skb)
3199{
3200 struct hci_ev_hardware_error *ev = (void *) skb->data;
3201
Marcel Holtmannc7741d12015-01-28 11:09:55 -08003202 hdev->hw_error_code = ev->code;
3203
3204 queue_work(hdev->req_workqueue, &hdev->error_reset);
Marcel Holtmann24dfa342014-11-02 02:56:41 +01003205}
3206
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003207static void hci_role_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003208{
3209 struct hci_ev_role_change *ev = (void *) skb->data;
3210 struct hci_conn *conn;
3211
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003212 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003213
3214 hci_dev_lock(hdev);
3215
3216 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3217 if (conn) {
Johan Hedberg40bef302014-07-16 11:42:27 +03003218 if (!ev->status)
3219 conn->role = ev->role;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003220
Johan Hedberg51a8efd2012-01-16 06:10:31 +02003221 clear_bit(HCI_CONN_RSWITCH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003222
3223 hci_role_switch_cfm(conn, ev->status, ev->role);
3224 }
3225
3226 hci_dev_unlock(hdev);
3227}
3228
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003229static void hci_num_comp_pkts_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003230{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003231 struct hci_ev_num_comp_pkts *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003232 int i;
3233
Andrei Emeltchenko32ac5b92011-12-19 16:31:29 +02003234 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_PACKET_BASED) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003235 bt_dev_err(hdev, "wrong event for mode %d", hdev->flow_ctl_mode);
Andrei Emeltchenko32ac5b92011-12-19 16:31:29 +02003236 return;
3237 }
3238
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02003239 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03003240 ev->num_hndl * sizeof(struct hci_comp_pkts_info)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003241 BT_DBG("%s bad parameters", hdev->name);
3242 return;
3243 }
3244
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02003245 BT_DBG("%s num_hndl %d", hdev->name, ev->num_hndl);
3246
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02003247 for (i = 0; i < ev->num_hndl; i++) {
3248 struct hci_comp_pkts_info *info = &ev->handles[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07003249 struct hci_conn *conn;
3250 __u16 handle, count;
3251
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02003252 handle = __le16_to_cpu(info->handle);
3253 count = __le16_to_cpu(info->count);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003254
3255 conn = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003256 if (!conn)
3257 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003258
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003259 conn->sent -= count;
3260
3261 switch (conn->type) {
3262 case ACL_LINK:
3263 hdev->acl_cnt += count;
3264 if (hdev->acl_cnt > hdev->acl_pkts)
3265 hdev->acl_cnt = hdev->acl_pkts;
3266 break;
3267
3268 case LE_LINK:
3269 if (hdev->le_pkts) {
3270 hdev->le_cnt += count;
3271 if (hdev->le_cnt > hdev->le_pkts)
3272 hdev->le_cnt = hdev->le_pkts;
3273 } else {
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02003274 hdev->acl_cnt += count;
3275 if (hdev->acl_cnt > hdev->acl_pkts)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003276 hdev->acl_cnt = hdev->acl_pkts;
3277 }
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003278 break;
3279
3280 case SCO_LINK:
3281 hdev->sco_cnt += count;
3282 if (hdev->sco_cnt > hdev->sco_pkts)
3283 hdev->sco_cnt = hdev->sco_pkts;
3284 break;
3285
3286 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003287 bt_dev_err(hdev, "unknown type %d conn %p",
3288 conn->type, conn);
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003289 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003290 }
3291 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003292
Gustavo F. Padovan3eff45e2011-12-15 00:50:02 -02003293 queue_work(hdev->workqueue, &hdev->tx_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003294}
3295
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003296static struct hci_conn *__hci_conn_lookup_handle(struct hci_dev *hdev,
3297 __u16 handle)
3298{
3299 struct hci_chan *chan;
3300
3301 switch (hdev->dev_type) {
Marcel Holtmannca8bee52016-07-05 14:30:14 +02003302 case HCI_PRIMARY:
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003303 return hci_conn_hash_lookup_handle(hdev, handle);
3304 case HCI_AMP:
3305 chan = hci_chan_lookup_handle(hdev, handle);
3306 if (chan)
3307 return chan->conn;
3308 break;
3309 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003310 bt_dev_err(hdev, "unknown dev_type %d", hdev->dev_type);
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003311 break;
3312 }
3313
3314 return NULL;
3315}
3316
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003317static void hci_num_comp_blocks_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003318{
3319 struct hci_ev_num_comp_blocks *ev = (void *) skb->data;
3320 int i;
3321
3322 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_BLOCK_BASED) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003323 bt_dev_err(hdev, "wrong event for mode %d", hdev->flow_ctl_mode);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003324 return;
3325 }
3326
3327 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03003328 ev->num_hndl * sizeof(struct hci_comp_blocks_info)) {
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003329 BT_DBG("%s bad parameters", hdev->name);
3330 return;
3331 }
3332
3333 BT_DBG("%s num_blocks %d num_hndl %d", hdev->name, ev->num_blocks,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003334 ev->num_hndl);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003335
3336 for (i = 0; i < ev->num_hndl; i++) {
3337 struct hci_comp_blocks_info *info = &ev->handles[i];
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003338 struct hci_conn *conn = NULL;
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003339 __u16 handle, block_count;
3340
3341 handle = __le16_to_cpu(info->handle);
3342 block_count = __le16_to_cpu(info->blocks);
3343
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003344 conn = __hci_conn_lookup_handle(hdev, handle);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003345 if (!conn)
3346 continue;
3347
3348 conn->sent -= block_count;
3349
3350 switch (conn->type) {
3351 case ACL_LINK:
Andrei Emeltchenkobd1eb662012-10-10 17:38:30 +03003352 case AMP_LINK:
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003353 hdev->block_cnt += block_count;
3354 if (hdev->block_cnt > hdev->num_blocks)
3355 hdev->block_cnt = hdev->num_blocks;
3356 break;
3357
3358 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003359 bt_dev_err(hdev, "unknown type %d conn %p",
3360 conn->type, conn);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003361 break;
3362 }
3363 }
3364
3365 queue_work(hdev->workqueue, &hdev->tx_work);
3366}
3367
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003368static void hci_mode_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003369{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003370 struct hci_ev_mode_change *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003371 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003372
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003373 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003374
3375 hci_dev_lock(hdev);
3376
Marcel Holtmann04837f62006-07-03 10:02:33 +02003377 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3378 if (conn) {
3379 conn->mode = ev->mode;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003380
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003381 if (!test_and_clear_bit(HCI_CONN_MODE_CHANGE_PEND,
3382 &conn->flags)) {
Marcel Holtmann04837f62006-07-03 10:02:33 +02003383 if (conn->mode == HCI_CM_ACTIVE)
Johan Hedberg58a681e2012-01-16 06:47:28 +02003384 set_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003385 else
Johan Hedberg58a681e2012-01-16 06:47:28 +02003386 clear_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003387 }
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003388
Johan Hedberg51a8efd2012-01-16 06:10:31 +02003389 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003390 hci_sco_setup(conn, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003391 }
3392
3393 hci_dev_unlock(hdev);
3394}
3395
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003396static void hci_pin_code_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003397{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003398 struct hci_ev_pin_code_req *ev = (void *) skb->data;
3399 struct hci_conn *conn;
3400
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003401 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003402
3403 hci_dev_lock(hdev);
3404
3405 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003406 if (!conn)
3407 goto unlock;
3408
3409 if (conn->state == BT_CONNECTED) {
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003410 hci_conn_hold(conn);
3411 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003412 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003413 }
3414
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003415 if (!hci_dev_test_flag(hdev, HCI_BONDABLE) &&
Johan Hedberg2f407f02014-07-17 15:35:40 +03003416 !test_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags)) {
Johan Hedberg03b555e2011-01-04 15:40:05 +02003417 hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003418 sizeof(ev->bdaddr), &ev->bdaddr);
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003419 } else if (hci_dev_test_flag(hdev, HCI_MGMT)) {
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003420 u8 secure;
3421
3422 if (conn->pending_sec_level == BT_SECURITY_HIGH)
3423 secure = 1;
3424 else
3425 secure = 0;
3426
Johan Hedberg744cf192011-11-08 20:40:14 +02003427 mgmt_pin_code_request(hdev, &ev->bdaddr, secure);
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003428 }
Johan Hedberg980e1a52011-01-22 06:10:07 +02003429
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003430unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003431 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003432}
3433
Johan Hedbergcb6f3f72014-11-19 14:53:04 +02003434static void conn_set_key(struct hci_conn *conn, u8 key_type, u8 pin_len)
3435{
3436 if (key_type == HCI_LK_CHANGED_COMBINATION)
3437 return;
3438
3439 conn->pin_length = pin_len;
3440 conn->key_type = key_type;
3441
3442 switch (key_type) {
3443 case HCI_LK_LOCAL_UNIT:
3444 case HCI_LK_REMOTE_UNIT:
3445 case HCI_LK_DEBUG_COMBINATION:
3446 return;
3447 case HCI_LK_COMBINATION:
3448 if (pin_len == 16)
3449 conn->pending_sec_level = BT_SECURITY_HIGH;
3450 else
3451 conn->pending_sec_level = BT_SECURITY_MEDIUM;
3452 break;
3453 case HCI_LK_UNAUTH_COMBINATION_P192:
3454 case HCI_LK_UNAUTH_COMBINATION_P256:
3455 conn->pending_sec_level = BT_SECURITY_MEDIUM;
3456 break;
3457 case HCI_LK_AUTH_COMBINATION_P192:
3458 conn->pending_sec_level = BT_SECURITY_HIGH;
3459 break;
3460 case HCI_LK_AUTH_COMBINATION_P256:
3461 conn->pending_sec_level = BT_SECURITY_FIPS;
3462 break;
3463 }
3464}
3465
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003466static void hci_link_key_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003467{
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003468 struct hci_ev_link_key_req *ev = (void *) skb->data;
3469 struct hci_cp_link_key_reply cp;
3470 struct hci_conn *conn;
3471 struct link_key *key;
3472
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003473 BT_DBG("%s", hdev->name);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003474
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003475 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003476 return;
3477
3478 hci_dev_lock(hdev);
3479
3480 key = hci_find_link_key(hdev, &ev->bdaddr);
3481 if (!key) {
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003482 BT_DBG("%s link key not found for %pMR", hdev->name,
3483 &ev->bdaddr);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003484 goto not_found;
3485 }
3486
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003487 BT_DBG("%s found key type %u for %pMR", hdev->name, key->type,
3488 &ev->bdaddr);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003489
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003490 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003491 if (conn) {
Johan Hedbergfe8bc5a2014-08-14 12:33:17 +03003492 clear_bit(HCI_CONN_NEW_LINK_KEY, &conn->flags);
3493
Marcel Holtmann66138ce2014-01-10 02:07:20 -08003494 if ((key->type == HCI_LK_UNAUTH_COMBINATION_P192 ||
3495 key->type == HCI_LK_UNAUTH_COMBINATION_P256) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03003496 conn->auth_type != 0xff && (conn->auth_type & 0x01)) {
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003497 BT_DBG("%s ignoring unauthenticated key", hdev->name);
3498 goto not_found;
3499 }
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003500
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003501 if (key->type == HCI_LK_COMBINATION && key->pin_len < 16 &&
Johan Hedbergf3fb0b52014-06-02 10:12:44 +03003502 (conn->pending_sec_level == BT_SECURITY_HIGH ||
3503 conn->pending_sec_level == BT_SECURITY_FIPS)) {
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003504 BT_DBG("%s ignoring key unauthenticated for high security",
3505 hdev->name);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003506 goto not_found;
3507 }
3508
Johan Hedbergcb6f3f72014-11-19 14:53:04 +02003509 conn_set_key(conn, key->type, key->pin_len);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003510 }
3511
3512 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9b3b4462012-05-23 11:31:20 +03003513 memcpy(cp.link_key, key->val, HCI_LINK_KEY_SIZE);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003514
3515 hci_send_cmd(hdev, HCI_OP_LINK_KEY_REPLY, sizeof(cp), &cp);
3516
3517 hci_dev_unlock(hdev);
3518
3519 return;
3520
3521not_found:
3522 hci_send_cmd(hdev, HCI_OP_LINK_KEY_NEG_REPLY, 6, &ev->bdaddr);
3523 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003524}
3525
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003526static void hci_link_key_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003527{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003528 struct hci_ev_link_key_notify *ev = (void *) skb->data;
3529 struct hci_conn *conn;
Johan Hedberg7652ff62014-06-24 13:15:49 +03003530 struct link_key *key;
3531 bool persistent;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003532 u8 pin_len = 0;
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003533
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003534 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003535
3536 hci_dev_lock(hdev);
3537
3538 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg82c13d42014-12-03 11:03:06 +02003539 if (!conn)
3540 goto unlock;
3541
3542 hci_conn_hold(conn);
3543 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
3544 hci_conn_drop(conn);
3545
Johan Hedbergfe8bc5a2014-08-14 12:33:17 +03003546 set_bit(HCI_CONN_NEW_LINK_KEY, &conn->flags);
Johan Hedberg82c13d42014-12-03 11:03:06 +02003547 conn_set_key(conn, ev->key_type, conn->pin_length);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003548
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003549 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg7652ff62014-06-24 13:15:49 +03003550 goto unlock;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003551
Johan Hedberg7652ff62014-06-24 13:15:49 +03003552 key = hci_add_link_key(hdev, conn, &ev->bdaddr, ev->link_key,
3553 ev->key_type, pin_len, &persistent);
3554 if (!key)
3555 goto unlock;
3556
Johan Hedbergcb6f3f72014-11-19 14:53:04 +02003557 /* Update connection information since adding the key will have
3558 * fixed up the type in the case of changed combination keys.
3559 */
3560 if (ev->key_type == HCI_LK_CHANGED_COMBINATION)
3561 conn_set_key(conn, key->type, key->pin_len);
3562
Johan Hedberg7652ff62014-06-24 13:15:49 +03003563 mgmt_new_link_key(hdev, key, persistent);
3564
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003565 /* Keep debug keys around only if the HCI_KEEP_DEBUG_KEYS flag
3566 * is set. If it's not set simply remove the key from the kernel
3567 * list (we've still notified user space about it but with
3568 * store_hint being 0).
3569 */
3570 if (key->type == HCI_LK_DEBUG_COMBINATION &&
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003571 !hci_dev_test_flag(hdev, HCI_KEEP_DEBUG_KEYS)) {
Johan Hedberg0378b592014-11-19 15:22:22 +02003572 list_del_rcu(&key->list);
3573 kfree_rcu(key, rcu);
Johan Hedberg82c13d42014-12-03 11:03:06 +02003574 goto unlock;
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003575 }
Johan Hedberg7652ff62014-06-24 13:15:49 +03003576
Johan Hedberg82c13d42014-12-03 11:03:06 +02003577 if (persistent)
3578 clear_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
3579 else
3580 set_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
3581
Johan Hedberg7652ff62014-06-24 13:15:49 +03003582unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003583 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003584}
3585
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003586static void hci_clock_offset_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04837f62006-07-03 10:02:33 +02003587{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003588 struct hci_ev_clock_offset *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003589 struct hci_conn *conn;
3590
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003591 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003592
3593 hci_dev_lock(hdev);
3594
3595 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003596 if (conn && !ev->status) {
3597 struct inquiry_entry *ie;
3598
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003599 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3600 if (ie) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003601 ie->data.clock_offset = ev->clock_offset;
3602 ie->timestamp = jiffies;
3603 }
3604 }
3605
3606 hci_dev_unlock(hdev);
3607}
3608
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003609static void hci_pkt_type_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna8746412008-07-14 20:13:46 +02003610{
3611 struct hci_ev_pkt_type_change *ev = (void *) skb->data;
3612 struct hci_conn *conn;
3613
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003614 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna8746412008-07-14 20:13:46 +02003615
3616 hci_dev_lock(hdev);
3617
3618 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3619 if (conn && !ev->status)
3620 conn->pkt_type = __le16_to_cpu(ev->pkt_type);
3621
3622 hci_dev_unlock(hdev);
3623}
3624
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003625static void hci_pscan_rep_mode_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003626{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003627 struct hci_ev_pscan_rep_mode *ev = (void *) skb->data;
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003628 struct inquiry_entry *ie;
3629
3630 BT_DBG("%s", hdev->name);
3631
3632 hci_dev_lock(hdev);
3633
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003634 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
3635 if (ie) {
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003636 ie->data.pscan_rep_mode = ev->pscan_rep_mode;
3637 ie->timestamp = jiffies;
3638 }
3639
3640 hci_dev_unlock(hdev);
3641}
3642
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003643static void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev,
3644 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003645{
3646 struct inquiry_data data;
3647 int num_rsp = *((__u8 *) skb->data);
3648
3649 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
3650
3651 if (!num_rsp)
3652 return;
3653
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003654 if (hci_dev_test_flag(hdev, HCI_PERIODIC_INQ))
Andre Guedes1519cc12012-03-21 00:03:38 -03003655 return;
3656
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003657 hci_dev_lock(hdev);
3658
3659 if ((skb->len - 1) / num_rsp != sizeof(struct inquiry_info_with_rssi)) {
Szymon Janc138d22e2011-02-17 16:44:23 +01003660 struct inquiry_info_with_rssi_and_pscan_mode *info;
3661 info = (void *) (skb->data + 1);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003662
Johan Hedberge17acd42011-03-30 23:57:16 +03003663 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003664 u32 flags;
3665
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003666 bacpy(&data.bdaddr, &info->bdaddr);
3667 data.pscan_rep_mode = info->pscan_rep_mode;
3668 data.pscan_period_mode = info->pscan_period_mode;
3669 data.pscan_mode = info->pscan_mode;
3670 memcpy(data.dev_class, info->dev_class, 3);
3671 data.clock_offset = info->clock_offset;
3672 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003673 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02003674
Marcel Holtmannaf589252014-07-01 14:11:20 +02003675 flags = hci_inquiry_cache_update(hdev, &data, false);
3676
Johan Hedberg48264f02011-11-09 13:58:58 +02003677 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003678 info->dev_class, info->rssi,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003679 flags, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003680 }
3681 } else {
3682 struct inquiry_info_with_rssi *info = (void *) (skb->data + 1);
3683
Johan Hedberge17acd42011-03-30 23:57:16 +03003684 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003685 u32 flags;
3686
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003687 bacpy(&data.bdaddr, &info->bdaddr);
3688 data.pscan_rep_mode = info->pscan_rep_mode;
3689 data.pscan_period_mode = info->pscan_period_mode;
3690 data.pscan_mode = 0x00;
3691 memcpy(data.dev_class, info->dev_class, 3);
3692 data.clock_offset = info->clock_offset;
3693 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003694 data.ssp_mode = 0x00;
Marcel Holtmannaf589252014-07-01 14:11:20 +02003695
3696 flags = hci_inquiry_cache_update(hdev, &data, false);
3697
Johan Hedberg48264f02011-11-09 13:58:58 +02003698 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003699 info->dev_class, info->rssi,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003700 flags, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003701 }
3702 }
3703
3704 hci_dev_unlock(hdev);
3705}
3706
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003707static void hci_remote_ext_features_evt(struct hci_dev *hdev,
3708 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003709{
Marcel Holtmann41a96212008-07-14 20:13:48 +02003710 struct hci_ev_remote_ext_features *ev = (void *) skb->data;
3711 struct hci_conn *conn;
3712
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003713 BT_DBG("%s", hdev->name);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003714
Marcel Holtmann41a96212008-07-14 20:13:48 +02003715 hci_dev_lock(hdev);
3716
3717 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02003718 if (!conn)
3719 goto unlock;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003720
Johan Hedbergcad718e2013-04-17 15:00:51 +03003721 if (ev->page < HCI_MAX_PAGES)
3722 memcpy(conn->features[ev->page], ev->features, 8);
3723
Johan Hedbergccd556f2010-11-10 17:11:51 +02003724 if (!ev->status && ev->page == 0x01) {
3725 struct inquiry_entry *ie;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003726
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003727 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3728 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02003729 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann769be972008-07-14 20:13:49 +02003730
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303731 if (ev->features[0] & LMP_HOST_SSP) {
Johan Hedberg58a681e2012-01-16 06:47:28 +02003732 set_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303733 } else {
3734 /* It is mandatory by the Bluetooth specification that
3735 * Extended Inquiry Results are only used when Secure
3736 * Simple Pairing is enabled, but some devices violate
3737 * this.
3738 *
3739 * To make these devices work, the internal SSP
3740 * enabled flag needs to be cleared if the remote host
3741 * features do not indicate SSP support */
3742 clear_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
3743 }
Marcel Holtmanneb9a8f32014-01-15 22:37:38 -08003744
3745 if (ev->features[0] & LMP_HOST_SC)
3746 set_bit(HCI_CONN_SC_ENABLED, &conn->flags);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003747 }
3748
Johan Hedbergccd556f2010-11-10 17:11:51 +02003749 if (conn->state != BT_CONFIG)
3750 goto unlock;
3751
Johan Hedberg671267b2012-05-12 16:11:50 -03003752 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02003753 struct hci_cp_remote_name_req cp;
3754 memset(&cp, 0, sizeof(cp));
3755 bacpy(&cp.bdaddr, &conn->dst);
3756 cp.pscan_rep_mode = 0x02;
3757 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02003758 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00003759 mgmt_device_connected(hdev, conn, 0, NULL, 0);
Johan Hedberg392599b2010-11-18 22:22:28 +02003760
Johan Hedberg127178d2010-11-18 22:22:29 +02003761 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02003762 conn->state = BT_CONNECTED;
Johan Hedberg539c4962015-02-18 14:53:57 +02003763 hci_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02003764 hci_conn_drop(conn);
Johan Hedbergccd556f2010-11-10 17:11:51 +02003765 }
3766
3767unlock:
Marcel Holtmann41a96212008-07-14 20:13:48 +02003768 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003769}
3770
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003771static void hci_sync_conn_complete_evt(struct hci_dev *hdev,
3772 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003773{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003774 struct hci_ev_sync_conn_complete *ev = (void *) skb->data;
3775 struct hci_conn *conn;
3776
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003777 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003778
3779 hci_dev_lock(hdev);
3780
3781 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann9dc0a3a2008-07-14 20:13:46 +02003782 if (!conn) {
3783 if (ev->link_type == ESCO_LINK)
3784 goto unlock;
3785
Kuba Pawlak618353b2015-08-28 13:05:22 +01003786 /* When the link type in the event indicates SCO connection
3787 * and lookup of the connection object fails, then check
3788 * if an eSCO connection object exists.
3789 *
3790 * The core limits the synchronous connections to either
3791 * SCO or eSCO. The eSCO connection is preferred and tried
3792 * to be setup first and until successfully established,
3793 * the link type will be hinted as eSCO.
3794 */
Marcel Holtmann9dc0a3a2008-07-14 20:13:46 +02003795 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
3796 if (!conn)
3797 goto unlock;
Marcel Holtmann9dc0a3a2008-07-14 20:13:46 +02003798 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003799
Marcel Holtmann732547f2009-04-19 19:14:14 +02003800 switch (ev->status) {
3801 case 0x00:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003802 conn->handle = __le16_to_cpu(ev->handle);
3803 conn->state = BT_CONNECTED;
Kuba Pawlak618353b2015-08-28 13:05:22 +01003804 conn->type = ev->link_type;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02003805
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01003806 hci_debugfs_create_conn(conn);
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02003807 hci_conn_add_sysfs(conn);
Marcel Holtmann732547f2009-04-19 19:14:14 +02003808 break;
3809
Nick Pelly81218d22014-06-30 11:25:01 +05303810 case 0x10: /* Connection Accept Timeout */
Frédéric Dalleau1a4c9582013-08-19 14:24:02 +02003811 case 0x0d: /* Connection Rejected due to Limited Resources */
Stephen Coe705e5712010-02-16 11:29:44 -05003812 case 0x11: /* Unsupported Feature or Parameter Value */
Marcel Holtmann732547f2009-04-19 19:14:14 +02003813 case 0x1c: /* SCO interval rejected */
Nick Pelly1038a002010-02-03 11:42:26 -08003814 case 0x1a: /* Unsupported Remote Feature */
Marcel Holtmann732547f2009-04-19 19:14:14 +02003815 case 0x1f: /* Unspecified error */
Andrew Earl27539bc2014-03-10 10:31:04 +00003816 case 0x20: /* Unsupported LMP Parameter value */
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02003817 if (conn->out) {
Marcel Holtmann732547f2009-04-19 19:14:14 +02003818 conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) |
3819 (hdev->esco_type & EDR_ESCO_MASK);
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02003820 if (hci_setup_sync(conn, conn->link->handle))
3821 goto unlock;
Marcel Holtmann732547f2009-04-19 19:14:14 +02003822 }
3823 /* fall through */
3824
3825 default:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003826 conn->state = BT_CLOSED;
Marcel Holtmann732547f2009-04-19 19:14:14 +02003827 break;
3828 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003829
Johan Hedberg539c4962015-02-18 14:53:57 +02003830 hci_connect_cfm(conn, ev->status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003831 if (ev->status)
3832 hci_conn_del(conn);
3833
3834unlock:
3835 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003836}
3837
Marcel Holtmannefdcf8e2013-10-15 10:31:12 -07003838static inline size_t eir_get_length(u8 *eir, size_t eir_len)
3839{
3840 size_t parsed = 0;
3841
3842 while (parsed < eir_len) {
3843 u8 field_len = eir[0];
3844
3845 if (field_len == 0)
3846 return parsed;
3847
3848 parsed += field_len + 1;
3849 eir += field_len + 1;
3850 }
3851
3852 return eir_len;
3853}
3854
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003855static void hci_extended_inquiry_result_evt(struct hci_dev *hdev,
3856 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003857{
3858 struct inquiry_data data;
3859 struct extended_inquiry_info *info = (void *) (skb->data + 1);
3860 int num_rsp = *((__u8 *) skb->data);
Vishal Agarwal9d939d92012-04-26 19:19:56 +05303861 size_t eir_len;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003862
3863 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
3864
3865 if (!num_rsp)
3866 return;
3867
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003868 if (hci_dev_test_flag(hdev, HCI_PERIODIC_INQ))
Andre Guedes1519cc12012-03-21 00:03:38 -03003869 return;
3870
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003871 hci_dev_lock(hdev);
3872
Johan Hedberge17acd42011-03-30 23:57:16 +03003873 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003874 u32 flags;
3875 bool name_known;
Johan Hedberg561aafb2012-01-04 13:31:59 +02003876
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003877 bacpy(&data.bdaddr, &info->bdaddr);
Szymon Janc138d22e2011-02-17 16:44:23 +01003878 data.pscan_rep_mode = info->pscan_rep_mode;
3879 data.pscan_period_mode = info->pscan_period_mode;
3880 data.pscan_mode = 0x00;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003881 memcpy(data.dev_class, info->dev_class, 3);
Szymon Janc138d22e2011-02-17 16:44:23 +01003882 data.clock_offset = info->clock_offset;
3883 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003884 data.ssp_mode = 0x01;
Johan Hedberg561aafb2012-01-04 13:31:59 +02003885
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003886 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg0d3b7f62016-01-05 13:19:31 +02003887 name_known = eir_get_data(info->data,
3888 sizeof(info->data),
3889 EIR_NAME_COMPLETE, NULL);
Johan Hedberg561aafb2012-01-04 13:31:59 +02003890 else
3891 name_known = true;
3892
Marcel Holtmannaf589252014-07-01 14:11:20 +02003893 flags = hci_inquiry_cache_update(hdev, &data, name_known);
3894
Vishal Agarwal9d939d92012-04-26 19:19:56 +05303895 eir_len = eir_get_length(info->data, sizeof(info->data));
Marcel Holtmannaf589252014-07-01 14:11:20 +02003896
Johan Hedberg48264f02011-11-09 13:58:58 +02003897 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003898 info->dev_class, info->rssi,
3899 flags, info->data, eir_len, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003900 }
3901
3902 hci_dev_unlock(hdev);
3903}
3904
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003905static void hci_key_refresh_complete_evt(struct hci_dev *hdev,
3906 struct sk_buff *skb)
3907{
3908 struct hci_ev_key_refresh_complete *ev = (void *) skb->data;
3909 struct hci_conn *conn;
3910
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003911 BT_DBG("%s status 0x%2.2x handle 0x%4.4x", hdev->name, ev->status,
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003912 __le16_to_cpu(ev->handle));
3913
3914 hci_dev_lock(hdev);
3915
3916 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3917 if (!conn)
3918 goto unlock;
3919
Johan Hedberg9eb1fbf2014-04-11 12:02:31 -07003920 /* For BR/EDR the necessary steps are taken through the
3921 * auth_complete event.
3922 */
3923 if (conn->type != LE_LINK)
3924 goto unlock;
3925
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003926 if (!ev->status)
3927 conn->sec_level = conn->pending_sec_level;
3928
3929 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
3930
3931 if (ev->status && conn->state == BT_CONNECTED) {
Andre Guedesbed71742013-01-30 11:50:56 -03003932 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
David Herrmann76a68ba2013-04-06 20:28:37 +02003933 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003934 goto unlock;
3935 }
3936
3937 if (conn->state == BT_CONFIG) {
3938 if (!ev->status)
3939 conn->state = BT_CONNECTED;
3940
Johan Hedberg539c4962015-02-18 14:53:57 +02003941 hci_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02003942 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003943 } else {
3944 hci_auth_cfm(conn, ev->status);
3945
3946 hci_conn_hold(conn);
3947 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003948 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003949 }
3950
3951unlock:
3952 hci_dev_unlock(hdev);
3953}
3954
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003955static u8 hci_get_auth_req(struct hci_conn *conn)
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003956{
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003957 /* If remote requests no-bonding follow that lead */
Mikel Astizacabae92013-06-28 10:56:28 +02003958 if (conn->remote_auth == HCI_AT_NO_BONDING ||
3959 conn->remote_auth == HCI_AT_NO_BONDING_MITM)
Waldemar Rymarkiewicz58797bf2011-04-28 12:07:58 +02003960 return conn->remote_auth | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003961
Mikel Astizb7f94c82014-04-08 14:21:31 +02003962 /* If both remote and local have enough IO capabilities, require
3963 * MITM protection
3964 */
3965 if (conn->remote_cap != HCI_IO_NO_INPUT_OUTPUT &&
3966 conn->io_capability != HCI_IO_NO_INPUT_OUTPUT)
3967 return conn->remote_auth | 0x01;
3968
Timo Mueller7e741702014-04-08 14:21:33 +02003969 /* No MITM protection possible so ignore remote requirement */
3970 return (conn->remote_auth & ~0x01) | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003971}
3972
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08003973static u8 bredr_oob_data_present(struct hci_conn *conn)
3974{
3975 struct hci_dev *hdev = conn->hdev;
3976 struct oob_data *data;
3977
3978 data = hci_find_remote_oob_data(hdev, &conn->dst, BDADDR_BREDR);
3979 if (!data)
3980 return 0x00;
3981
Marcel Holtmann455c2ff2015-03-15 16:42:53 -07003982 if (bredr_sc_enabled(hdev)) {
3983 /* When Secure Connections is enabled, then just
3984 * return the present value stored with the OOB
3985 * data. The stored value contains the right present
3986 * information. However it can only be trusted when
3987 * not in Secure Connection Only mode.
Marcel Holtmann659c7fb2015-01-30 23:20:56 -08003988 */
Marcel Holtmann455c2ff2015-03-15 16:42:53 -07003989 if (!hci_dev_test_flag(hdev, HCI_SC_ONLY))
3990 return data->present;
3991
3992 /* When Secure Connections Only mode is enabled, then
3993 * the P-256 values are required. If they are not
3994 * available, then do not declare that OOB data is
3995 * present.
3996 */
3997 if (!memcmp(data->rand256, ZERO_KEY, 16) ||
3998 !memcmp(data->hash256, ZERO_KEY, 16))
Marcel Holtmann659c7fb2015-01-30 23:20:56 -08003999 return 0x00;
4000
Marcel Holtmann455c2ff2015-03-15 16:42:53 -07004001 return 0x02;
Marcel Holtmann659c7fb2015-01-30 23:20:56 -08004002 }
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08004003
Marcel Holtmann455c2ff2015-03-15 16:42:53 -07004004 /* When Secure Connections is not enabled or actually
4005 * not supported by the hardware, then check that if
4006 * P-192 data values are present.
4007 */
4008 if (!memcmp(data->rand192, ZERO_KEY, 16) ||
4009 !memcmp(data->hash192, ZERO_KEY, 16))
4010 return 0x00;
4011
4012 return 0x01;
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08004013}
4014
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004015static void hci_io_capa_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02004016{
4017 struct hci_ev_io_capa_request *ev = (void *) skb->data;
4018 struct hci_conn *conn;
4019
4020 BT_DBG("%s", hdev->name);
4021
4022 hci_dev_lock(hdev);
4023
4024 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg03b555e2011-01-04 15:40:05 +02004025 if (!conn)
4026 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02004027
Johan Hedberg03b555e2011-01-04 15:40:05 +02004028 hci_conn_hold(conn);
4029
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004030 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg03b555e2011-01-04 15:40:05 +02004031 goto unlock;
4032
Johan Hedberg2f407f02014-07-17 15:35:40 +03004033 /* Allow pairing if we're pairable, the initiators of the
4034 * pairing or if the remote is not requesting bonding.
4035 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004036 if (hci_dev_test_flag(hdev, HCI_BONDABLE) ||
Johan Hedberg2f407f02014-07-17 15:35:40 +03004037 test_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags) ||
Gustavo Padovan807deac2012-05-17 00:36:24 -03004038 (conn->remote_auth & ~0x01) == HCI_AT_NO_BONDING) {
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004039 struct hci_cp_io_capability_reply cp;
4040
4041 bacpy(&cp.bdaddr, &ev->bdaddr);
Hemant Gupta7a7f1e72012-01-16 13:34:29 +05304042 /* Change the IO capability from KeyboardDisplay
4043 * to DisplayYesNo as it is not supported by BT spec. */
4044 cp.capability = (conn->io_capability == 0x04) ?
Mikel Astiza7676312013-06-28 10:56:29 +02004045 HCI_IO_DISPLAY_YESNO : conn->io_capability;
Mikel Astizb7f94c82014-04-08 14:21:31 +02004046
4047 /* If we are initiators, there is no remote information yet */
4048 if (conn->remote_auth == 0xff) {
Mikel Astizb16c6602014-04-08 14:21:34 +02004049 /* Request MITM protection if our IO caps allow it
Johan Hedberg4ad51a72014-06-09 14:41:25 +03004050 * except for the no-bonding case.
Mikel Astizb16c6602014-04-08 14:21:34 +02004051 */
Mikel Astiz6fd6b912014-04-08 14:21:32 +02004052 if (conn->io_capability != HCI_IO_NO_INPUT_OUTPUT &&
Johan Hedberg9f743d72014-07-17 11:56:33 +03004053 conn->auth_type != HCI_AT_NO_BONDING)
Johan Hedberg6c538232014-07-11 15:32:23 +03004054 conn->auth_type |= 0x01;
Mikel Astizb7f94c82014-04-08 14:21:31 +02004055 } else {
4056 conn->auth_type = hci_get_auth_req(conn);
Mikel Astizb7f94c82014-04-08 14:21:31 +02004057 }
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004058
Johan Hedberg82c295b2014-07-30 09:22:24 +03004059 /* If we're not bondable, force one of the non-bondable
4060 * authentication requirement values.
4061 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004062 if (!hci_dev_test_flag(hdev, HCI_BONDABLE))
Johan Hedberg82c295b2014-07-30 09:22:24 +03004063 conn->auth_type &= HCI_AT_NO_BONDING_MITM;
4064
4065 cp.authentication = conn->auth_type;
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08004066 cp.oob_data = bredr_oob_data_present(conn);
Szymon Jancce85ee12011-03-22 13:12:23 +01004067
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004068 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03004069 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02004070 } else {
4071 struct hci_cp_io_capability_neg_reply cp;
4072
4073 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02004074 cp.reason = HCI_ERROR_PAIRING_NOT_ALLOWED;
Johan Hedberg03b555e2011-01-04 15:40:05 +02004075
4076 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03004077 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02004078 }
4079
4080unlock:
4081 hci_dev_unlock(hdev);
4082}
4083
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004084static void hci_io_capa_reply_evt(struct hci_dev *hdev, struct sk_buff *skb)
Johan Hedberg03b555e2011-01-04 15:40:05 +02004085{
4086 struct hci_ev_io_capa_reply *ev = (void *) skb->data;
4087 struct hci_conn *conn;
4088
4089 BT_DBG("%s", hdev->name);
4090
4091 hci_dev_lock(hdev);
4092
4093 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4094 if (!conn)
4095 goto unlock;
4096
Johan Hedberg03b555e2011-01-04 15:40:05 +02004097 conn->remote_cap = ev->capability;
Johan Hedberg03b555e2011-01-04 15:40:05 +02004098 conn->remote_auth = ev->authentication;
4099
4100unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02004101 hci_dev_unlock(hdev);
4102}
4103
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004104static void hci_user_confirm_request_evt(struct hci_dev *hdev,
4105 struct sk_buff *skb)
Johan Hedberga5c29682011-02-19 12:05:57 -03004106{
4107 struct hci_ev_user_confirm_req *ev = (void *) skb->data;
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004108 int loc_mitm, rem_mitm, confirm_hint = 0;
Johan Hedberg7a828902011-04-28 11:28:53 -07004109 struct hci_conn *conn;
Johan Hedberga5c29682011-02-19 12:05:57 -03004110
4111 BT_DBG("%s", hdev->name);
4112
4113 hci_dev_lock(hdev);
4114
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004115 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg7a828902011-04-28 11:28:53 -07004116 goto unlock;
Johan Hedberga5c29682011-02-19 12:05:57 -03004117
Johan Hedberg7a828902011-04-28 11:28:53 -07004118 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4119 if (!conn)
4120 goto unlock;
4121
4122 loc_mitm = (conn->auth_type & 0x01);
4123 rem_mitm = (conn->remote_auth & 0x01);
4124
4125 /* If we require MITM but the remote device can't provide that
Johan Hedberg6c538232014-07-11 15:32:23 +03004126 * (it has NoInputNoOutput) then reject the confirmation
4127 * request. We check the security level here since it doesn't
4128 * necessarily match conn->auth_type.
Mikel Astiz6fd6b912014-04-08 14:21:32 +02004129 */
Johan Hedberg6c538232014-07-11 15:32:23 +03004130 if (conn->pending_sec_level > BT_SECURITY_MEDIUM &&
4131 conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) {
Johan Hedberg7a828902011-04-28 11:28:53 -07004132 BT_DBG("Rejecting request: remote device can't provide MITM");
4133 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03004134 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07004135 goto unlock;
4136 }
4137
4138 /* If no side requires MITM protection; auto-accept */
Mikel Astiza7676312013-06-28 10:56:29 +02004139 if ((!loc_mitm || conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) &&
4140 (!rem_mitm || conn->io_capability == HCI_IO_NO_INPUT_OUTPUT)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004141
4142 /* If we're not the initiators request authorization to
4143 * proceed from user space (mgmt_user_confirm with
Johan Hedbergba15a582014-06-09 13:58:14 +03004144 * confirm_hint set to 1). The exception is if neither
Johan Hedberg02f3e252014-07-16 15:09:13 +03004145 * side had MITM or if the local IO capability is
4146 * NoInputNoOutput, in which case we do auto-accept
Johan Hedbergba15a582014-06-09 13:58:14 +03004147 */
4148 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) &&
Johan Hedberg02f3e252014-07-16 15:09:13 +03004149 conn->io_capability != HCI_IO_NO_INPUT_OUTPUT &&
Johan Hedbergba15a582014-06-09 13:58:14 +03004150 (loc_mitm || rem_mitm)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004151 BT_DBG("Confirming auto-accept as acceptor");
4152 confirm_hint = 1;
4153 goto confirm;
4154 }
4155
Johan Hedberg9f616562011-04-28 11:28:54 -07004156 BT_DBG("Auto-accept of user confirmation with %ums delay",
Gustavo Padovan807deac2012-05-17 00:36:24 -03004157 hdev->auto_accept_delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07004158
4159 if (hdev->auto_accept_delay > 0) {
4160 int delay = msecs_to_jiffies(hdev->auto_accept_delay);
Johan Hedberg7bc18d92013-10-16 18:11:39 +03004161 queue_delayed_work(conn->hdev->workqueue,
4162 &conn->auto_accept_work, delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07004163 goto unlock;
4164 }
4165
Johan Hedberg7a828902011-04-28 11:28:53 -07004166 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03004167 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07004168 goto unlock;
4169 }
4170
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004171confirm:
Johan Hedberg39adbff2014-03-20 08:18:14 +02004172 mgmt_user_confirm_request(hdev, &ev->bdaddr, ACL_LINK, 0,
4173 le32_to_cpu(ev->passkey), confirm_hint);
Johan Hedberg7a828902011-04-28 11:28:53 -07004174
4175unlock:
Johan Hedberga5c29682011-02-19 12:05:57 -03004176 hci_dev_unlock(hdev);
4177}
4178
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004179static void hci_user_passkey_request_evt(struct hci_dev *hdev,
4180 struct sk_buff *skb)
Brian Gix1143d452011-11-23 08:28:34 -08004181{
4182 struct hci_ev_user_passkey_req *ev = (void *) skb->data;
4183
4184 BT_DBG("%s", hdev->name);
4185
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004186 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg272d90d2012-02-09 15:26:12 +02004187 mgmt_user_passkey_request(hdev, &ev->bdaddr, ACL_LINK, 0);
Brian Gix1143d452011-11-23 08:28:34 -08004188}
4189
Johan Hedberg92a25252012-09-06 18:39:26 +03004190static void hci_user_passkey_notify_evt(struct hci_dev *hdev,
4191 struct sk_buff *skb)
4192{
4193 struct hci_ev_user_passkey_notify *ev = (void *) skb->data;
4194 struct hci_conn *conn;
4195
4196 BT_DBG("%s", hdev->name);
4197
4198 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4199 if (!conn)
4200 return;
4201
4202 conn->passkey_notify = __le32_to_cpu(ev->passkey);
4203 conn->passkey_entered = 0;
4204
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004205 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg92a25252012-09-06 18:39:26 +03004206 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
4207 conn->dst_type, conn->passkey_notify,
4208 conn->passkey_entered);
4209}
4210
4211static void hci_keypress_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
4212{
4213 struct hci_ev_keypress_notify *ev = (void *) skb->data;
4214 struct hci_conn *conn;
4215
4216 BT_DBG("%s", hdev->name);
4217
4218 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4219 if (!conn)
4220 return;
4221
4222 switch (ev->type) {
4223 case HCI_KEYPRESS_STARTED:
4224 conn->passkey_entered = 0;
4225 return;
4226
4227 case HCI_KEYPRESS_ENTERED:
4228 conn->passkey_entered++;
4229 break;
4230
4231 case HCI_KEYPRESS_ERASED:
4232 conn->passkey_entered--;
4233 break;
4234
4235 case HCI_KEYPRESS_CLEARED:
4236 conn->passkey_entered = 0;
4237 break;
4238
4239 case HCI_KEYPRESS_COMPLETED:
4240 return;
4241 }
4242
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004243 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg92a25252012-09-06 18:39:26 +03004244 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
4245 conn->dst_type, conn->passkey_notify,
4246 conn->passkey_entered);
4247}
4248
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004249static void hci_simple_pair_complete_evt(struct hci_dev *hdev,
4250 struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02004251{
4252 struct hci_ev_simple_pair_complete *ev = (void *) skb->data;
4253 struct hci_conn *conn;
4254
4255 BT_DBG("%s", hdev->name);
4256
4257 hci_dev_lock(hdev);
4258
4259 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg2a611692011-02-19 12:06:00 -03004260 if (!conn)
4261 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02004262
Johan Hedbergc1d4fa72014-07-17 15:14:50 +03004263 /* Reset the authentication requirement to unknown */
4264 conn->remote_auth = 0xff;
4265
Johan Hedberg2a611692011-02-19 12:06:00 -03004266 /* To avoid duplicate auth_failed events to user space we check
4267 * the HCI_CONN_AUTH_PEND flag which will be set if we
4268 * initiated the authentication. A traditional auth_complete
4269 * event gets always produced as initiator and is also mapped to
4270 * the mgmt_auth_failed event */
Mikel Astizfa1bd912012-08-09 09:52:29 +02004271 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) && ev->status)
Johan Hedberge1e930f2014-09-08 17:09:49 -07004272 mgmt_auth_failed(conn, ev->status);
Johan Hedberg2a611692011-02-19 12:06:00 -03004273
David Herrmann76a68ba2013-04-06 20:28:37 +02004274 hci_conn_drop(conn);
Johan Hedberg2a611692011-02-19 12:06:00 -03004275
4276unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02004277 hci_dev_unlock(hdev);
4278}
4279
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004280static void hci_remote_host_features_evt(struct hci_dev *hdev,
4281 struct sk_buff *skb)
Marcel Holtmann41a96212008-07-14 20:13:48 +02004282{
4283 struct hci_ev_remote_host_features *ev = (void *) skb->data;
4284 struct inquiry_entry *ie;
Johan Hedbergcad718e2013-04-17 15:00:51 +03004285 struct hci_conn *conn;
Marcel Holtmann41a96212008-07-14 20:13:48 +02004286
4287 BT_DBG("%s", hdev->name);
4288
4289 hci_dev_lock(hdev);
4290
Johan Hedbergcad718e2013-04-17 15:00:51 +03004291 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4292 if (conn)
4293 memcpy(conn->features[1], ev->features, 8);
4294
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02004295 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
4296 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02004297 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann41a96212008-07-14 20:13:48 +02004298
4299 hci_dev_unlock(hdev);
4300}
4301
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004302static void hci_remote_oob_data_request_evt(struct hci_dev *hdev,
4303 struct sk_buff *skb)
Szymon Janc2763eda2011-03-22 13:12:22 +01004304{
4305 struct hci_ev_remote_oob_data_request *ev = (void *) skb->data;
4306 struct oob_data *data;
4307
4308 BT_DBG("%s", hdev->name);
4309
4310 hci_dev_lock(hdev);
4311
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004312 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Szymon Jance1ba1f12011-04-06 13:01:59 +02004313 goto unlock;
4314
Johan Hedberg6928a922014-10-26 20:46:09 +01004315 data = hci_find_remote_oob_data(hdev, &ev->bdaddr, BDADDR_BREDR);
Marcel Holtmann6665d052015-01-27 16:04:31 -08004316 if (!data) {
Szymon Janc2763eda2011-03-22 13:12:22 +01004317 struct hci_cp_remote_oob_data_neg_reply cp;
4318
4319 bacpy(&cp.bdaddr, &ev->bdaddr);
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08004320 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_NEG_REPLY,
4321 sizeof(cp), &cp);
Marcel Holtmann6665d052015-01-27 16:04:31 -08004322 goto unlock;
4323 }
4324
4325 if (bredr_sc_enabled(hdev)) {
4326 struct hci_cp_remote_oob_ext_data_reply cp;
4327
4328 bacpy(&cp.bdaddr, &ev->bdaddr);
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004329 if (hci_dev_test_flag(hdev, HCI_SC_ONLY)) {
Marcel Holtmann6665d052015-01-27 16:04:31 -08004330 memset(cp.hash192, 0, sizeof(cp.hash192));
4331 memset(cp.rand192, 0, sizeof(cp.rand192));
4332 } else {
4333 memcpy(cp.hash192, data->hash192, sizeof(cp.hash192));
4334 memcpy(cp.rand192, data->rand192, sizeof(cp.rand192));
4335 }
4336 memcpy(cp.hash256, data->hash256, sizeof(cp.hash256));
4337 memcpy(cp.rand256, data->rand256, sizeof(cp.rand256));
4338
4339 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_EXT_DATA_REPLY,
4340 sizeof(cp), &cp);
4341 } else {
4342 struct hci_cp_remote_oob_data_reply cp;
4343
4344 bacpy(&cp.bdaddr, &ev->bdaddr);
4345 memcpy(cp.hash, data->hash192, sizeof(cp.hash));
4346 memcpy(cp.rand, data->rand192, sizeof(cp.rand));
4347
4348 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_REPLY,
4349 sizeof(cp), &cp);
Szymon Janc2763eda2011-03-22 13:12:22 +01004350 }
4351
Szymon Jance1ba1f12011-04-06 13:01:59 +02004352unlock:
Szymon Janc2763eda2011-03-22 13:12:22 +01004353 hci_dev_unlock(hdev);
4354}
4355
Arron Wanga77a6a12015-07-24 17:13:15 +08004356#if IS_ENABLED(CONFIG_BT_HS)
4357static void hci_chan_selected_evt(struct hci_dev *hdev, struct sk_buff *skb)
4358{
4359 struct hci_ev_channel_selected *ev = (void *)skb->data;
4360 struct hci_conn *hcon;
4361
4362 BT_DBG("%s handle 0x%2.2x", hdev->name, ev->phy_handle);
4363
4364 skb_pull(skb, sizeof(*ev));
4365
4366 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4367 if (!hcon)
4368 return;
4369
4370 amp_read_loc_assoc_final_data(hdev, hcon);
4371}
4372
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004373static void hci_phy_link_complete_evt(struct hci_dev *hdev,
4374 struct sk_buff *skb)
4375{
4376 struct hci_ev_phy_link_complete *ev = (void *) skb->data;
4377 struct hci_conn *hcon, *bredr_hcon;
4378
4379 BT_DBG("%s handle 0x%2.2x status 0x%2.2x", hdev->name, ev->phy_handle,
4380 ev->status);
4381
4382 hci_dev_lock(hdev);
4383
4384 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4385 if (!hcon) {
4386 hci_dev_unlock(hdev);
4387 return;
4388 }
4389
4390 if (ev->status) {
4391 hci_conn_del(hcon);
4392 hci_dev_unlock(hdev);
4393 return;
4394 }
4395
4396 bredr_hcon = hcon->amp_mgr->l2cap_conn->hcon;
4397
4398 hcon->state = BT_CONNECTED;
4399 bacpy(&hcon->dst, &bredr_hcon->dst);
4400
4401 hci_conn_hold(hcon);
4402 hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02004403 hci_conn_drop(hcon);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004404
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01004405 hci_debugfs_create_conn(hcon);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004406 hci_conn_add_sysfs(hcon);
4407
Andrei Emeltchenkocf70ff22012-10-31 15:46:36 +02004408 amp_physical_cfm(bredr_hcon, hcon);
4409
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004410 hci_dev_unlock(hdev);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004411}
4412
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004413static void hci_loglink_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
4414{
4415 struct hci_ev_logical_link_complete *ev = (void *) skb->data;
4416 struct hci_conn *hcon;
4417 struct hci_chan *hchan;
4418 struct amp_mgr *mgr;
4419
4420 BT_DBG("%s log_handle 0x%4.4x phy_handle 0x%2.2x status 0x%2.2x",
4421 hdev->name, le16_to_cpu(ev->handle), ev->phy_handle,
4422 ev->status);
4423
4424 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4425 if (!hcon)
4426 return;
4427
4428 /* Create AMP hchan */
4429 hchan = hci_chan_create(hcon);
4430 if (!hchan)
4431 return;
4432
4433 hchan->handle = le16_to_cpu(ev->handle);
4434
4435 BT_DBG("hcon %p mgr %p hchan %p", hcon, hcon->amp_mgr, hchan);
4436
4437 mgr = hcon->amp_mgr;
4438 if (mgr && mgr->bredr_chan) {
4439 struct l2cap_chan *bredr_chan = mgr->bredr_chan;
4440
4441 l2cap_chan_lock(bredr_chan);
4442
4443 bredr_chan->conn->mtu = hdev->block_mtu;
4444 l2cap_logical_cfm(bredr_chan, hchan, 0);
4445 hci_conn_hold(hcon);
4446
4447 l2cap_chan_unlock(bredr_chan);
4448 }
4449}
4450
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02004451static void hci_disconn_loglink_complete_evt(struct hci_dev *hdev,
4452 struct sk_buff *skb)
4453{
4454 struct hci_ev_disconn_logical_link_complete *ev = (void *) skb->data;
4455 struct hci_chan *hchan;
4456
4457 BT_DBG("%s log handle 0x%4.4x status 0x%2.2x", hdev->name,
4458 le16_to_cpu(ev->handle), ev->status);
4459
4460 if (ev->status)
4461 return;
4462
4463 hci_dev_lock(hdev);
4464
4465 hchan = hci_chan_lookup_handle(hdev, le16_to_cpu(ev->handle));
4466 if (!hchan)
4467 goto unlock;
4468
4469 amp_destroy_logical_link(hchan, ev->reason);
4470
4471unlock:
4472 hci_dev_unlock(hdev);
4473}
4474
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02004475static void hci_disconn_phylink_complete_evt(struct hci_dev *hdev,
4476 struct sk_buff *skb)
4477{
4478 struct hci_ev_disconn_phy_link_complete *ev = (void *) skb->data;
4479 struct hci_conn *hcon;
4480
4481 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4482
4483 if (ev->status)
4484 return;
4485
4486 hci_dev_lock(hdev);
4487
4488 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4489 if (hcon) {
4490 hcon->state = BT_CLOSED;
4491 hci_conn_del(hcon);
4492 }
4493
4494 hci_dev_unlock(hdev);
4495}
Arron Wanga77a6a12015-07-24 17:13:15 +08004496#endif
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02004497
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004498static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03004499{
4500 struct hci_ev_le_conn_complete *ev = (void *) skb->data;
Johan Hedberg912b42e2014-07-03 19:33:49 +03004501 struct hci_conn_params *params;
Ville Tervofcd89c02011-02-10 22:38:47 -03004502 struct hci_conn *conn;
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004503 struct smp_irk *irk;
Johan Hedberg837d5022014-07-02 09:36:22 +03004504 u8 addr_type;
Ville Tervofcd89c02011-02-10 22:38:47 -03004505
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004506 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Ville Tervofcd89c02011-02-10 22:38:47 -03004507
4508 hci_dev_lock(hdev);
4509
Johan Hedbergfbd96c12014-07-08 17:21:51 +03004510 /* All controllers implicitly stop advertising in the event of a
4511 * connection, so ensure that the state bit is cleared.
4512 */
Marcel Holtmanna358dc12015-03-13 02:11:02 -07004513 hci_dev_clear_flag(hdev, HCI_LE_ADV);
Johan Hedbergfbd96c12014-07-08 17:21:51 +03004514
Jakub Pawlowskie7d9ab72015-08-07 20:22:52 +02004515 conn = hci_lookup_le_connect(hdev);
Ville Tervob62f3282011-02-10 22:38:50 -03004516 if (!conn) {
Johan Hedberga5c4e302014-07-16 11:56:07 +03004517 conn = hci_conn_add(hdev, LE_LINK, &ev->bdaddr, ev->role);
Ville Tervob62f3282011-02-10 22:38:50 -03004518 if (!conn) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01004519 bt_dev_err(hdev, "no memory for new connection");
Andre Guedes230fd162012-07-27 15:10:10 -03004520 goto unlock;
Ville Tervob62f3282011-02-10 22:38:50 -03004521 }
Andre Guedes29b79882011-05-31 14:20:54 -03004522
4523 conn->dst_type = ev->bdaddr_type;
Andre Guedesb9b343d2012-07-27 15:10:11 -03004524
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004525 /* If we didn't have a hci_conn object previously
4526 * but we're in master role this must be something
4527 * initiated using a white list. Since white list based
4528 * connections are not "first class citizens" we don't
4529 * have full tracking of them. Therefore, we go ahead
4530 * with a "best effort" approach of determining the
4531 * initiator address based on the HCI_PRIVACY flag.
4532 */
4533 if (conn->out) {
4534 conn->resp_addr_type = ev->bdaddr_type;
4535 bacpy(&conn->resp_addr, &ev->bdaddr);
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004536 if (hci_dev_test_flag(hdev, HCI_PRIVACY)) {
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004537 conn->init_addr_type = ADDR_LE_DEV_RANDOM;
4538 bacpy(&conn->init_addr, &hdev->rpa);
4539 } else {
4540 hci_copy_identity_address(hdev,
4541 &conn->init_addr,
4542 &conn->init_addr_type);
4543 }
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004544 }
Johan Hedberg9489eca2014-02-28 17:45:46 +02004545 } else {
4546 cancel_delayed_work(&conn->le_conn_timeout);
Ville Tervob62f3282011-02-10 22:38:50 -03004547 }
Ville Tervofcd89c02011-02-10 22:38:47 -03004548
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004549 if (!conn->out) {
4550 /* Set the responder (our side) address type based on
4551 * the advertising address type.
4552 */
4553 conn->resp_addr_type = hdev->adv_addr_type;
4554 if (hdev->adv_addr_type == ADDR_LE_DEV_RANDOM)
4555 bacpy(&conn->resp_addr, &hdev->random_addr);
4556 else
4557 bacpy(&conn->resp_addr, &hdev->bdaddr);
4558
4559 conn->init_addr_type = ev->bdaddr_type;
4560 bacpy(&conn->init_addr, &ev->bdaddr);
Marcel Holtmanna720d732014-06-23 12:14:51 +02004561
4562 /* For incoming connections, set the default minimum
4563 * and maximum connection interval. They will be used
4564 * to check if the parameters are in range and if not
4565 * trigger the connection update procedure.
4566 */
4567 conn->le_conn_min_interval = hdev->le_conn_min_interval;
4568 conn->le_conn_max_interval = hdev->le_conn_max_interval;
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004569 }
Johan Hedberg7be2edb2014-02-23 19:42:17 +02004570
Marcel Holtmannedb4b462014-02-18 15:13:43 -08004571 /* Lookup the identity address from the stored connection
4572 * address and address type.
4573 *
4574 * When establishing connections to an identity address, the
4575 * connection procedure will store the resolvable random
4576 * address first. Now if it can be converted back into the
4577 * identity address, start using the identity address from
4578 * now on.
4579 */
4580 irk = hci_get_irk(hdev, &conn->dst, conn->dst_type);
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004581 if (irk) {
4582 bacpy(&conn->dst, &irk->bdaddr);
4583 conn->dst_type = irk->addr_type;
4584 }
4585
Johan Hedberg2d3c2262014-07-15 11:51:28 +03004586 if (ev->status) {
4587 hci_le_conn_failed(conn, ev->status);
Johan Hedberg837d5022014-07-02 09:36:22 +03004588 goto unlock;
4589 }
4590
Johan Hedberg08853f12014-08-15 21:06:55 +03004591 if (conn->dst_type == ADDR_LE_DEV_PUBLIC)
4592 addr_type = BDADDR_LE_PUBLIC;
4593 else
4594 addr_type = BDADDR_LE_RANDOM;
4595
Johan Hedberg2d3c2262014-07-15 11:51:28 +03004596 /* Drop the connection if the device is blocked */
4597 if (hci_bdaddr_list_lookup(&hdev->blacklist, &conn->dst, addr_type)) {
4598 hci_conn_drop(conn);
Andre Guedescd17dec2012-07-27 15:10:16 -03004599 goto unlock;
4600 }
4601
Johan Hedbergb644ba32012-01-17 21:48:47 +02004602 if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00004603 mgmt_device_connected(hdev, conn, 0, NULL, 0);
Vinicius Costa Gomes83bc71b2011-05-06 18:41:43 -03004604
Vinicius Costa Gomes7b5c0d52011-06-09 18:50:50 -03004605 conn->sec_level = BT_SECURITY_LOW;
Ville Tervofcd89c02011-02-10 22:38:47 -03004606 conn->handle = __le16_to_cpu(ev->handle);
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07004607 conn->state = BT_CONFIG;
Ville Tervofcd89c02011-02-10 22:38:47 -03004608
Marcel Holtmanne04fde62014-06-23 11:40:04 +02004609 conn->le_conn_interval = le16_to_cpu(ev->interval);
4610 conn->le_conn_latency = le16_to_cpu(ev->latency);
4611 conn->le_supv_timeout = le16_to_cpu(ev->supervision_timeout);
4612
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01004613 hci_debugfs_create_conn(conn);
Ville Tervofcd89c02011-02-10 22:38:47 -03004614 hci_conn_add_sysfs(conn);
4615
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07004616 if (!ev->status) {
4617 /* The remote features procedure is defined for master
4618 * role only. So only in case of an initiated connection
4619 * request the remote features.
4620 *
4621 * If the local controller supports slave-initiated features
4622 * exchange, then requesting the remote features in slave
4623 * role is possible. Otherwise just transition into the
4624 * connected state without requesting the remote features.
4625 */
4626 if (conn->out ||
4627 (hdev->le_features[0] & HCI_LE_SLAVE_FEATURES)) {
4628 struct hci_cp_le_read_remote_features cp;
4629
4630 cp.handle = __cpu_to_le16(conn->handle);
4631
4632 hci_send_cmd(hdev, HCI_OP_LE_READ_REMOTE_FEATURES,
4633 sizeof(cp), &cp);
4634
4635 hci_conn_hold(conn);
4636 } else {
4637 conn->state = BT_CONNECTED;
4638 hci_connect_cfm(conn, ev->status);
4639 }
4640 } else {
4641 hci_connect_cfm(conn, ev->status);
4642 }
Ville Tervofcd89c02011-02-10 22:38:47 -03004643
Johan Hedberg54776102014-08-15 21:06:56 +03004644 params = hci_pend_le_action_lookup(&hdev->pend_le_conns, &conn->dst,
4645 conn->dst_type);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004646 if (params) {
Johan Hedberg95305ba2014-07-04 12:37:21 +03004647 list_del_init(&params->action);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004648 if (params->conn) {
4649 hci_conn_drop(params->conn);
Johan Hedbergf8aaf9b2014-08-17 23:28:57 +03004650 hci_conn_put(params->conn);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004651 params->conn = NULL;
4652 }
4653 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004654
Ville Tervofcd89c02011-02-10 22:38:47 -03004655unlock:
Johan Hedberg223683a2014-07-06 15:44:23 +03004656 hci_update_background_scan(hdev);
Ville Tervofcd89c02011-02-10 22:38:47 -03004657 hci_dev_unlock(hdev);
4658}
4659
Marcel Holtmann1855d922014-06-23 11:40:05 +02004660static void hci_le_conn_update_complete_evt(struct hci_dev *hdev,
4661 struct sk_buff *skb)
4662{
4663 struct hci_ev_le_conn_update_complete *ev = (void *) skb->data;
4664 struct hci_conn *conn;
4665
4666 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4667
4668 if (ev->status)
4669 return;
4670
4671 hci_dev_lock(hdev);
4672
4673 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
4674 if (conn) {
4675 conn->le_conn_interval = le16_to_cpu(ev->interval);
4676 conn->le_conn_latency = le16_to_cpu(ev->latency);
4677 conn->le_supv_timeout = le16_to_cpu(ev->supervision_timeout);
4678 }
4679
4680 hci_dev_unlock(hdev);
4681}
4682
Andre Guedesa4790db2014-02-26 20:21:47 -03004683/* This function requires the caller holds hdev->lock */
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004684static struct hci_conn *check_pending_le_conn(struct hci_dev *hdev,
4685 bdaddr_t *addr,
Szymon Janc082f2302018-04-03 13:40:06 +02004686 u8 addr_type, u8 adv_type,
4687 bdaddr_t *direct_rpa)
Andre Guedesa4790db2014-02-26 20:21:47 -03004688{
4689 struct hci_conn *conn;
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004690 struct hci_conn_params *params;
Andre Guedesa4790db2014-02-26 20:21:47 -03004691
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004692 /* If the event is not connectable don't proceed further */
4693 if (adv_type != LE_ADV_IND && adv_type != LE_ADV_DIRECT_IND)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004694 return NULL;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004695
4696 /* Ignore if the device is blocked */
Johan Hedbergdcc36c12014-07-09 12:59:13 +03004697 if (hci_bdaddr_list_lookup(&hdev->blacklist, addr, addr_type))
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004698 return NULL;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004699
Johan Hedbergf99353c2014-07-16 11:56:09 +03004700 /* Most controller will fail if we try to create new connections
4701 * while we have an existing one in slave role.
4702 */
4703 if (hdev->conn_hash.le_num_slave > 0)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004704 return NULL;
Johan Hedbergf99353c2014-07-16 11:56:09 +03004705
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004706 /* If we're not connectable only connect devices that we have in
4707 * our pend_le_conns list.
4708 */
Johan Hedberg49c50922015-10-16 10:07:51 +03004709 params = hci_pend_le_action_lookup(&hdev->pend_le_conns, addr,
4710 addr_type);
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004711 if (!params)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004712 return NULL;
Andre Guedesa4790db2014-02-26 20:21:47 -03004713
Jakub Pawlowski28a667c2015-08-07 20:22:54 +02004714 if (!params->explicit_connect) {
4715 switch (params->auto_connect) {
4716 case HCI_AUTO_CONN_DIRECT:
4717 /* Only devices advertising with ADV_DIRECT_IND are
4718 * triggering a connection attempt. This is allowing
4719 * incoming connections from slave devices.
4720 */
4721 if (adv_type != LE_ADV_DIRECT_IND)
4722 return NULL;
4723 break;
4724 case HCI_AUTO_CONN_ALWAYS:
4725 /* Devices advertising with ADV_IND or ADV_DIRECT_IND
4726 * are triggering a connection attempt. This means
4727 * that incoming connectioms from slave device are
4728 * accepted and also outgoing connections to slave
4729 * devices are established when found.
4730 */
4731 break;
4732 default:
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004733 return NULL;
Jakub Pawlowski28a667c2015-08-07 20:22:54 +02004734 }
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004735 }
4736
Andre Guedesa4790db2014-02-26 20:21:47 -03004737 conn = hci_connect_le(hdev, addr, addr_type, BT_SECURITY_LOW,
Szymon Janc082f2302018-04-03 13:40:06 +02004738 HCI_LE_AUTOCONN_TIMEOUT, HCI_ROLE_MASTER,
4739 direct_rpa);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004740 if (!IS_ERR(conn)) {
Jakub Pawlowski28a667c2015-08-07 20:22:54 +02004741 /* If HCI_AUTO_CONN_EXPLICIT is set, conn is already owned
4742 * by higher layer that tried to connect, if no then
4743 * store the pointer since we don't really have any
Johan Hedbergf161dd42014-08-15 21:06:54 +03004744 * other owner of the object besides the params that
4745 * triggered it. This way we can abort the connection if
4746 * the parameters get removed and keep the reference
4747 * count consistent once the connection is established.
4748 */
Jakub Pawlowski28a667c2015-08-07 20:22:54 +02004749
4750 if (!params->explicit_connect)
4751 params->conn = hci_conn_get(conn);
4752
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004753 return conn;
Johan Hedbergf161dd42014-08-15 21:06:54 +03004754 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004755
4756 switch (PTR_ERR(conn)) {
4757 case -EBUSY:
4758 /* If hci_connect() returns -EBUSY it means there is already
4759 * an LE connection attempt going on. Since controllers don't
4760 * support more than one connection attempt at the time, we
4761 * don't consider this an error case.
4762 */
4763 break;
4764 default:
4765 BT_DBG("Failed to connect: err %ld", PTR_ERR(conn));
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004766 return NULL;
Andre Guedesa4790db2014-02-26 20:21:47 -03004767 }
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004768
4769 return NULL;
Andre Guedesa4790db2014-02-26 20:21:47 -03004770}
4771
Johan Hedberg4af605d2014-03-24 10:48:00 +02004772static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr,
Marcel Holtmann2f010b52014-12-05 16:20:13 +01004773 u8 bdaddr_type, bdaddr_t *direct_addr,
4774 u8 direct_addr_type, s8 rssi, u8 *data, u8 len)
Johan Hedberg4af605d2014-03-24 10:48:00 +02004775{
Johan Hedbergb9a63282014-03-25 10:51:52 +02004776 struct discovery_state *d = &hdev->discovery;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004777 struct smp_irk *irk;
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004778 struct hci_conn *conn;
Johan Hedberg474ee062014-03-25 14:34:59 +02004779 bool match;
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004780 u32 flags;
Szymon Janc68183752015-09-16 20:21:54 +02004781 u8 *ptr, real_len;
4782
Johan Hedberg56b40fb2016-04-07 21:01:27 +03004783 switch (type) {
4784 case LE_ADV_IND:
4785 case LE_ADV_DIRECT_IND:
4786 case LE_ADV_SCAN_IND:
4787 case LE_ADV_NONCONN_IND:
4788 case LE_ADV_SCAN_RSP:
4789 break;
4790 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01004791 bt_dev_err_ratelimited(hdev, "unknown advertising packet "
4792 "type: 0x%02x", type);
Johan Hedberg56b40fb2016-04-07 21:01:27 +03004793 return;
4794 }
4795
Szymon Janc68183752015-09-16 20:21:54 +02004796 /* Find the end of the data in case the report contains padded zero
4797 * bytes at the end causing an invalid length value.
4798 *
4799 * When data is NULL, len is 0 so there is no need for extra ptr
4800 * check as 'ptr < data + 0' is already false in such case.
4801 */
4802 for (ptr = data; ptr < data + len && *ptr; ptr += *ptr + 1) {
4803 if (ptr + 1 + *ptr > data + len)
4804 break;
4805 }
4806
4807 real_len = ptr - data;
4808
4809 /* Adjust for actual length */
4810 if (len != real_len) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01004811 bt_dev_err_ratelimited(hdev, "advertising data len corrected");
Szymon Janc68183752015-09-16 20:21:54 +02004812 len = real_len;
4813 }
Johan Hedbergb9a63282014-03-25 10:51:52 +02004814
Marcel Holtmann2f010b52014-12-05 16:20:13 +01004815 /* If the direct address is present, then this report is from
4816 * a LE Direct Advertising Report event. In that case it is
4817 * important to see if the address is matching the local
4818 * controller address.
4819 */
4820 if (direct_addr) {
4821 /* Only resolvable random addresses are valid for these
4822 * kind of reports and others can be ignored.
4823 */
4824 if (!hci_bdaddr_is_rpa(direct_addr, direct_addr_type))
4825 return;
4826
4827 /* If the controller is not using resolvable random
4828 * addresses, then this report can be ignored.
4829 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004830 if (!hci_dev_test_flag(hdev, HCI_PRIVACY))
Marcel Holtmann2f010b52014-12-05 16:20:13 +01004831 return;
4832
4833 /* If the local IRK of the controller does not match
4834 * with the resolvable random address provided, then
4835 * this report can be ignored.
4836 */
4837 if (!smp_irk_matches(hdev, hdev->irk, direct_addr))
4838 return;
4839 }
4840
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004841 /* Check if we need to convert to identity address */
4842 irk = hci_get_irk(hdev, bdaddr, bdaddr_type);
4843 if (irk) {
4844 bdaddr = &irk->bdaddr;
4845 bdaddr_type = irk->addr_type;
4846 }
4847
Szymon Janc082f2302018-04-03 13:40:06 +02004848 /* Check if we have been requested to connect to this device.
4849 *
4850 * direct_addr is set only for directed advertising reports (it is NULL
4851 * for advertising reports) and is already verified to be RPA above.
4852 */
4853 conn = check_pending_le_conn(hdev, bdaddr, bdaddr_type, type,
4854 direct_addr);
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004855 if (conn && type == LE_ADV_IND) {
4856 /* Store report for later inclusion by
4857 * mgmt_device_connected
4858 */
4859 memcpy(conn->le_adv_data, data, len);
4860 conn->le_adv_data_len = len;
4861 }
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004862
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004863 /* Passive scanning shouldn't trigger any device found events,
4864 * except for devices marked as CONN_REPORT for which we do send
4865 * device found events.
4866 */
Johan Hedbergca5c4be2014-03-25 10:30:46 +02004867 if (hdev->le_scan_type == LE_SCAN_PASSIVE) {
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004868 if (type == LE_ADV_DIRECT_IND)
4869 return;
4870
Johan Hedberg3a19b6f2014-07-15 08:07:59 +03004871 if (!hci_pend_le_action_lookup(&hdev->pend_le_reports,
4872 bdaddr, bdaddr_type))
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004873 return;
4874
4875 if (type == LE_ADV_NONCONN_IND || type == LE_ADV_SCAN_IND)
4876 flags = MGMT_DEV_FOUND_NOT_CONNECTABLE;
4877 else
4878 flags = 0;
4879 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
4880 rssi, flags, data, len, NULL, 0);
Johan Hedberg97bf2e92014-07-04 12:37:16 +03004881 return;
Johan Hedbergca5c4be2014-03-25 10:30:46 +02004882 }
Johan Hedberg4af605d2014-03-24 10:48:00 +02004883
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004884 /* When receiving non-connectable or scannable undirected
4885 * advertising reports, this means that the remote device is
4886 * not connectable and then clearly indicate this in the
4887 * device found event.
4888 *
4889 * When receiving a scan response, then there is no way to
4890 * know if the remote device is connectable or not. However
4891 * since scan responses are merged with a previously seen
4892 * advertising report, the flags field from that report
4893 * will be used.
4894 *
4895 * In the really unlikely case that a controller get confused
4896 * and just sends a scan response event, then it is marked as
4897 * not connectable as well.
4898 */
4899 if (type == LE_ADV_NONCONN_IND || type == LE_ADV_SCAN_IND ||
4900 type == LE_ADV_SCAN_RSP)
4901 flags = MGMT_DEV_FOUND_NOT_CONNECTABLE;
4902 else
4903 flags = 0;
4904
Johan Hedbergb9a63282014-03-25 10:51:52 +02004905 /* If there's nothing pending either store the data from this
4906 * event or send an immediate device found event if the data
4907 * should not be stored for later.
4908 */
4909 if (!has_pending_adv_report(hdev)) {
4910 /* If the report will trigger a SCAN_REQ store it for
4911 * later merging.
4912 */
4913 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
4914 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004915 rssi, flags, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004916 return;
4917 }
4918
4919 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004920 rssi, flags, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004921 return;
4922 }
4923
Johan Hedberg474ee062014-03-25 14:34:59 +02004924 /* Check if the pending report is for the same device as the new one */
4925 match = (!bacmp(bdaddr, &d->last_adv_addr) &&
4926 bdaddr_type == d->last_adv_addr_type);
4927
Johan Hedbergb9a63282014-03-25 10:51:52 +02004928 /* If the pending data doesn't match this report or this isn't a
4929 * scan response (e.g. we got a duplicate ADV_IND) then force
4930 * sending of the pending data.
4931 */
Johan Hedberg474ee062014-03-25 14:34:59 +02004932 if (type != LE_ADV_SCAN_RSP || !match) {
4933 /* Send out whatever is in the cache, but skip duplicates */
4934 if (!match)
4935 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004936 d->last_adv_addr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004937 d->last_adv_rssi, d->last_adv_flags,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004938 d->last_adv_data,
Johan Hedberg474ee062014-03-25 14:34:59 +02004939 d->last_adv_data_len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004940
4941 /* If the new report will trigger a SCAN_REQ store it for
4942 * later merging.
4943 */
4944 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
4945 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004946 rssi, flags, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004947 return;
4948 }
4949
4950 /* The advertising reports cannot be merged, so clear
4951 * the pending report and send out a device found event.
4952 */
4953 clear_pending_adv_report(hdev);
Johan Hedberg5c5b93e2014-03-29 08:39:53 +02004954 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004955 rssi, flags, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004956 return;
4957 }
4958
4959 /* If we get here we've got a pending ADV_IND or ADV_SCAN_IND and
4960 * the new event is a SCAN_RSP. We can therefore proceed with
4961 * sending a merged device found event.
4962 */
4963 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004964 d->last_adv_addr_type, NULL, rssi, d->last_adv_flags,
Marcel Holtmann42bd6a52014-07-01 14:11:19 +02004965 d->last_adv_data, d->last_adv_data_len, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004966 clear_pending_adv_report(hdev);
Johan Hedberg4af605d2014-03-24 10:48:00 +02004967}
4968
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004969static void hci_le_adv_report_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andre Guedes9aa04c92011-05-26 16:23:51 -03004970{
Andre Guedese95beb42011-09-26 20:48:35 -03004971 u8 num_reports = skb->data[0];
4972 void *ptr = &skb->data[1];
Andre Guedes9aa04c92011-05-26 16:23:51 -03004973
Andre Guedesa4790db2014-02-26 20:21:47 -03004974 hci_dev_lock(hdev);
4975
Andre Guedese95beb42011-09-26 20:48:35 -03004976 while (num_reports--) {
4977 struct hci_ev_le_advertising_info *ev = ptr;
Johan Hedberg4af605d2014-03-24 10:48:00 +02004978 s8 rssi;
Andre Guedesa4790db2014-02-26 20:21:47 -03004979
Chriz Chowee649342018-04-20 15:46:24 +08004980 if (ev->length <= HCI_MAX_AD_LENGTH) {
4981 rssi = ev->data[ev->length];
4982 process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
4983 ev->bdaddr_type, NULL, 0, rssi,
4984 ev->data, ev->length);
4985 } else {
4986 bt_dev_err(hdev, "Dropping invalid advertising data");
4987 }
Andre Guedes3c9e9192012-01-10 18:20:50 -03004988
Andre Guedese95beb42011-09-26 20:48:35 -03004989 ptr += sizeof(*ev) + ev->length + 1;
Andre Guedes9aa04c92011-05-26 16:23:51 -03004990 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004991
4992 hci_dev_unlock(hdev);
Andre Guedes9aa04c92011-05-26 16:23:51 -03004993}
4994
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07004995static void hci_le_remote_feat_complete_evt(struct hci_dev *hdev,
4996 struct sk_buff *skb)
4997{
4998 struct hci_ev_le_remote_feat_complete *ev = (void *)skb->data;
4999 struct hci_conn *conn;
5000
5001 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
5002
5003 hci_dev_lock(hdev);
5004
5005 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
5006 if (conn) {
5007 if (!ev->status)
5008 memcpy(conn->features[0], ev->features, 8);
5009
5010 if (conn->state == BT_CONFIG) {
5011 __u8 status;
5012
5013 /* If the local controller supports slave-initiated
5014 * features exchange, but the remote controller does
5015 * not, then it is possible that the error code 0x1a
5016 * for unsupported remote feature gets returned.
5017 *
5018 * In this specific case, allow the connection to
5019 * transition into connected state and mark it as
5020 * successful.
5021 */
5022 if ((hdev->le_features[0] & HCI_LE_SLAVE_FEATURES) &&
5023 !conn->out && ev->status == 0x1a)
5024 status = 0x00;
5025 else
5026 status = ev->status;
5027
5028 conn->state = BT_CONNECTED;
5029 hci_connect_cfm(conn, status);
5030 hci_conn_drop(conn);
5031 }
5032 }
5033
5034 hci_dev_unlock(hdev);
5035}
5036
Gustavo Padovan6039aa72012-05-23 04:04:18 -03005037static void hci_le_ltk_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005038{
5039 struct hci_ev_le_ltk_req *ev = (void *) skb->data;
5040 struct hci_cp_le_ltk_reply cp;
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03005041 struct hci_cp_le_ltk_neg_reply neg;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005042 struct hci_conn *conn;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03005043 struct smp_ltk *ltk;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005044
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03005045 BT_DBG("%s handle 0x%4.4x", hdev->name, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005046
5047 hci_dev_lock(hdev);
5048
5049 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03005050 if (conn == NULL)
5051 goto not_found;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005052
Johan Hedbergf3a73d92014-05-29 15:02:59 +03005053 ltk = hci_find_ltk(hdev, &conn->dst, conn->dst_type, conn->role);
Johan Hedberg5378bc52014-05-29 14:00:39 +03005054 if (!ltk)
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03005055 goto not_found;
5056
Johan Hedberg5378bc52014-05-29 14:00:39 +03005057 if (smp_ltk_is_sc(ltk)) {
5058 /* With SC both EDiv and Rand are set to zero */
5059 if (ev->ediv || ev->rand)
5060 goto not_found;
5061 } else {
5062 /* For non-SC keys check that EDiv and Rand match */
5063 if (ev->ediv != ltk->ediv || ev->rand != ltk->rand)
5064 goto not_found;
5065 }
5066
Johan Hedberg8b76ce32015-06-08 18:14:39 +03005067 memcpy(cp.ltk, ltk->val, ltk->enc_size);
5068 memset(cp.ltk + ltk->enc_size, 0, sizeof(cp.ltk) - ltk->enc_size);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005069 cp.handle = cpu_to_le16(conn->handle);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03005070
Johan Hedberga6f78332014-09-10 17:37:45 -07005071 conn->pending_sec_level = smp_ltk_sec_level(ltk);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005072
Andre Guedes89cbb4d2013-07-31 16:25:29 -03005073 conn->enc_key_size = ltk->enc_size;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005074
5075 hci_send_cmd(hdev, HCI_OP_LE_LTK_REPLY, sizeof(cp), &cp);
5076
Claudio Takahasi5981a882013-07-25 16:34:24 -03005077 /* Ref. Bluetooth Core SPEC pages 1975 and 2004. STK is a
5078 * temporary key used to encrypt a connection following
5079 * pairing. It is used during the Encrypted Session Setup to
5080 * distribute the keys. Later, security can be re-established
5081 * using a distributed LTK.
5082 */
Johan Hedberg2ceba532014-06-16 19:25:16 +03005083 if (ltk->type == SMP_STK) {
Johan Hedbergfe59a052014-07-01 19:14:12 +03005084 set_bit(HCI_CONN_STK_ENCRYPT, &conn->flags);
Johan Hedberg970d0f12014-11-13 14:37:47 +02005085 list_del_rcu(&ltk->list);
5086 kfree_rcu(ltk, rcu);
Johan Hedbergfe59a052014-07-01 19:14:12 +03005087 } else {
5088 clear_bit(HCI_CONN_STK_ENCRYPT, &conn->flags);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03005089 }
5090
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005091 hci_dev_unlock(hdev);
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03005092
5093 return;
5094
5095not_found:
5096 neg.handle = ev->handle;
5097 hci_send_cmd(hdev, HCI_OP_LE_LTK_NEG_REPLY, sizeof(neg), &neg);
5098 hci_dev_unlock(hdev);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005099}
5100
Andre Guedes8e75b462014-07-01 18:10:08 -03005101static void send_conn_param_neg_reply(struct hci_dev *hdev, u16 handle,
5102 u8 reason)
5103{
5104 struct hci_cp_le_conn_param_req_neg_reply cp;
5105
5106 cp.handle = cpu_to_le16(handle);
5107 cp.reason = reason;
5108
5109 hci_send_cmd(hdev, HCI_OP_LE_CONN_PARAM_REQ_NEG_REPLY, sizeof(cp),
5110 &cp);
5111}
5112
5113static void hci_le_remote_conn_param_req_evt(struct hci_dev *hdev,
5114 struct sk_buff *skb)
5115{
5116 struct hci_ev_le_remote_conn_param_req *ev = (void *) skb->data;
5117 struct hci_cp_le_conn_param_req_reply cp;
5118 struct hci_conn *hcon;
5119 u16 handle, min, max, latency, timeout;
5120
5121 handle = le16_to_cpu(ev->handle);
5122 min = le16_to_cpu(ev->interval_min);
5123 max = le16_to_cpu(ev->interval_max);
5124 latency = le16_to_cpu(ev->latency);
5125 timeout = le16_to_cpu(ev->timeout);
5126
5127 hcon = hci_conn_hash_lookup_handle(hdev, handle);
5128 if (!hcon || hcon->state != BT_CONNECTED)
5129 return send_conn_param_neg_reply(hdev, handle,
5130 HCI_ERROR_UNKNOWN_CONN_ID);
5131
5132 if (hci_check_conn_params(min, max, latency, timeout))
5133 return send_conn_param_neg_reply(hdev, handle,
5134 HCI_ERROR_INVALID_LL_PARAMS);
5135
Johan Hedberg40bef302014-07-16 11:42:27 +03005136 if (hcon->role == HCI_ROLE_MASTER) {
Johan Hedberg348d50b2014-07-02 17:37:30 +03005137 struct hci_conn_params *params;
Johan Hedbergf4869e22014-07-02 17:37:32 +03005138 u8 store_hint;
Johan Hedberg348d50b2014-07-02 17:37:30 +03005139
5140 hci_dev_lock(hdev);
5141
5142 params = hci_conn_params_lookup(hdev, &hcon->dst,
5143 hcon->dst_type);
5144 if (params) {
5145 params->conn_min_interval = min;
5146 params->conn_max_interval = max;
5147 params->conn_latency = latency;
5148 params->supervision_timeout = timeout;
Johan Hedbergf4869e22014-07-02 17:37:32 +03005149 store_hint = 0x01;
5150 } else{
5151 store_hint = 0x00;
Johan Hedberg348d50b2014-07-02 17:37:30 +03005152 }
5153
5154 hci_dev_unlock(hdev);
5155
Johan Hedbergf4869e22014-07-02 17:37:32 +03005156 mgmt_new_conn_param(hdev, &hcon->dst, hcon->dst_type,
5157 store_hint, min, max, latency, timeout);
Johan Hedberg348d50b2014-07-02 17:37:30 +03005158 }
Andre Guedesffb5a8272014-07-01 18:10:11 -03005159
Andre Guedes8e75b462014-07-01 18:10:08 -03005160 cp.handle = ev->handle;
5161 cp.interval_min = ev->interval_min;
5162 cp.interval_max = ev->interval_max;
5163 cp.latency = ev->latency;
5164 cp.timeout = ev->timeout;
5165 cp.min_ce_len = 0;
5166 cp.max_ce_len = 0;
5167
5168 hci_send_cmd(hdev, HCI_OP_LE_CONN_PARAM_REQ_REPLY, sizeof(cp), &cp);
5169}
5170
Marcel Holtmann2f010b52014-12-05 16:20:13 +01005171static void hci_le_direct_adv_report_evt(struct hci_dev *hdev,
5172 struct sk_buff *skb)
5173{
5174 u8 num_reports = skb->data[0];
5175 void *ptr = &skb->data[1];
5176
5177 hci_dev_lock(hdev);
5178
5179 while (num_reports--) {
5180 struct hci_ev_le_direct_adv_info *ev = ptr;
5181
5182 process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
5183 ev->bdaddr_type, &ev->direct_addr,
5184 ev->direct_addr_type, ev->rssi, NULL, 0);
5185
5186 ptr += sizeof(*ev);
5187 }
5188
5189 hci_dev_unlock(hdev);
5190}
5191
Gustavo Padovan6039aa72012-05-23 04:04:18 -03005192static void hci_le_meta_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03005193{
5194 struct hci_ev_le_meta *le_ev = (void *) skb->data;
5195
5196 skb_pull(skb, sizeof(*le_ev));
5197
5198 switch (le_ev->subevent) {
5199 case HCI_EV_LE_CONN_COMPLETE:
5200 hci_le_conn_complete_evt(hdev, skb);
5201 break;
5202
Marcel Holtmann1855d922014-06-23 11:40:05 +02005203 case HCI_EV_LE_CONN_UPDATE_COMPLETE:
5204 hci_le_conn_update_complete_evt(hdev, skb);
5205 break;
5206
Andre Guedes9aa04c92011-05-26 16:23:51 -03005207 case HCI_EV_LE_ADVERTISING_REPORT:
5208 hci_le_adv_report_evt(hdev, skb);
5209 break;
5210
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07005211 case HCI_EV_LE_REMOTE_FEAT_COMPLETE:
5212 hci_le_remote_feat_complete_evt(hdev, skb);
5213 break;
5214
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005215 case HCI_EV_LE_LTK_REQ:
5216 hci_le_ltk_request_evt(hdev, skb);
5217 break;
5218
Andre Guedes8e75b462014-07-01 18:10:08 -03005219 case HCI_EV_LE_REMOTE_CONN_PARAM_REQ:
5220 hci_le_remote_conn_param_req_evt(hdev, skb);
5221 break;
5222
Marcel Holtmann2f010b52014-12-05 16:20:13 +01005223 case HCI_EV_LE_DIRECT_ADV_REPORT:
5224 hci_le_direct_adv_report_evt(hdev, skb);
5225 break;
5226
Ville Tervofcd89c02011-02-10 22:38:47 -03005227 default:
5228 break;
5229 }
5230}
5231
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005232static bool hci_get_cmd_complete(struct hci_dev *hdev, u16 opcode,
5233 u8 event, struct sk_buff *skb)
5234{
5235 struct hci_ev_cmd_complete *ev;
5236 struct hci_event_hdr *hdr;
5237
5238 if (!skb)
5239 return false;
5240
5241 if (skb->len < sizeof(*hdr)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01005242 bt_dev_err(hdev, "too short HCI event");
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005243 return false;
5244 }
5245
5246 hdr = (void *) skb->data;
5247 skb_pull(skb, HCI_EVENT_HDR_SIZE);
5248
5249 if (event) {
5250 if (hdr->evt != event)
5251 return false;
5252 return true;
5253 }
5254
5255 if (hdr->evt != HCI_EV_CMD_COMPLETE) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01005256 bt_dev_err(hdev, "last event is not cmd complete (0x%2.2x)",
5257 hdr->evt);
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005258 return false;
5259 }
5260
5261 if (skb->len < sizeof(*ev)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01005262 bt_dev_err(hdev, "too short cmd_complete event");
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005263 return false;
5264 }
5265
5266 ev = (void *) skb->data;
5267 skb_pull(skb, sizeof(*ev));
5268
5269 if (opcode != __le16_to_cpu(ev->opcode)) {
5270 BT_DBG("opcode doesn't match (0x%2.2x != 0x%2.2x)", opcode,
5271 __le16_to_cpu(ev->opcode));
5272 return false;
5273 }
5274
5275 return true;
5276}
5277
Linus Torvalds1da177e2005-04-16 15:20:36 -07005278void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)
5279{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005280 struct hci_event_hdr *hdr = (void *) skb->data;
Johan Hedberge62144872015-04-02 13:41:08 +03005281 hci_req_complete_t req_complete = NULL;
5282 hci_req_complete_skb_t req_complete_skb = NULL;
5283 struct sk_buff *orig_skb = NULL;
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005284 u8 status = 0, event = hdr->evt, req_evt = 0;
Johan Hedberge62144872015-04-02 13:41:08 +03005285 u16 opcode = HCI_OP_NOP;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005286
Marcel Holtmann242c0eb2015-10-25 22:45:53 +01005287 if (hdev->sent_cmd && bt_cb(hdev->sent_cmd)->hci.req_event == event) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02005288 struct hci_command_hdr *cmd_hdr = (void *) hdev->sent_cmd->data;
Johan Hedberge62144872015-04-02 13:41:08 +03005289 opcode = __le16_to_cpu(cmd_hdr->opcode);
5290 hci_req_cmd_complete(hdev, opcode, status, &req_complete,
5291 &req_complete_skb);
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005292 req_evt = event;
Johan Hedberg02350a72013-04-03 21:50:29 +03005293 }
5294
Johan Hedberge62144872015-04-02 13:41:08 +03005295 /* If it looks like we might end up having to call
5296 * req_complete_skb, store a pristine copy of the skb since the
5297 * various handlers may modify the original one through
5298 * skb_pull() calls, etc.
5299 */
5300 if (req_complete_skb || event == HCI_EV_CMD_STATUS ||
5301 event == HCI_EV_CMD_COMPLETE)
5302 orig_skb = skb_clone(skb, GFP_KERNEL);
5303
5304 skb_pull(skb, HCI_EVENT_HDR_SIZE);
5305
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005306 switch (event) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005307 case HCI_EV_INQUIRY_COMPLETE:
5308 hci_inquiry_complete_evt(hdev, skb);
5309 break;
5310
5311 case HCI_EV_INQUIRY_RESULT:
5312 hci_inquiry_result_evt(hdev, skb);
5313 break;
5314
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005315 case HCI_EV_CONN_COMPLETE:
5316 hci_conn_complete_evt(hdev, skb);
Marcel Holtmann21d9e302005-09-13 01:32:25 +02005317 break;
5318
Linus Torvalds1da177e2005-04-16 15:20:36 -07005319 case HCI_EV_CONN_REQUEST:
5320 hci_conn_request_evt(hdev, skb);
5321 break;
5322
Linus Torvalds1da177e2005-04-16 15:20:36 -07005323 case HCI_EV_DISCONN_COMPLETE:
5324 hci_disconn_complete_evt(hdev, skb);
5325 break;
5326
Linus Torvalds1da177e2005-04-16 15:20:36 -07005327 case HCI_EV_AUTH_COMPLETE:
5328 hci_auth_complete_evt(hdev, skb);
5329 break;
5330
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005331 case HCI_EV_REMOTE_NAME:
5332 hci_remote_name_evt(hdev, skb);
5333 break;
5334
Linus Torvalds1da177e2005-04-16 15:20:36 -07005335 case HCI_EV_ENCRYPT_CHANGE:
5336 hci_encrypt_change_evt(hdev, skb);
5337 break;
5338
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005339 case HCI_EV_CHANGE_LINK_KEY_COMPLETE:
5340 hci_change_link_key_complete_evt(hdev, skb);
5341 break;
5342
5343 case HCI_EV_REMOTE_FEATURES:
5344 hci_remote_features_evt(hdev, skb);
5345 break;
5346
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005347 case HCI_EV_CMD_COMPLETE:
Johan Hedberge62144872015-04-02 13:41:08 +03005348 hci_cmd_complete_evt(hdev, skb, &opcode, &status,
5349 &req_complete, &req_complete_skb);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005350 break;
5351
5352 case HCI_EV_CMD_STATUS:
Johan Hedberge62144872015-04-02 13:41:08 +03005353 hci_cmd_status_evt(hdev, skb, &opcode, &status, &req_complete,
5354 &req_complete_skb);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005355 break;
5356
Marcel Holtmann24dfa342014-11-02 02:56:41 +01005357 case HCI_EV_HARDWARE_ERROR:
5358 hci_hardware_error_evt(hdev, skb);
5359 break;
5360
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005361 case HCI_EV_ROLE_CHANGE:
5362 hci_role_change_evt(hdev, skb);
5363 break;
5364
5365 case HCI_EV_NUM_COMP_PKTS:
5366 hci_num_comp_pkts_evt(hdev, skb);
5367 break;
5368
5369 case HCI_EV_MODE_CHANGE:
5370 hci_mode_change_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005371 break;
5372
5373 case HCI_EV_PIN_CODE_REQ:
5374 hci_pin_code_request_evt(hdev, skb);
5375 break;
5376
5377 case HCI_EV_LINK_KEY_REQ:
5378 hci_link_key_request_evt(hdev, skb);
5379 break;
5380
5381 case HCI_EV_LINK_KEY_NOTIFY:
5382 hci_link_key_notify_evt(hdev, skb);
5383 break;
5384
5385 case HCI_EV_CLOCK_OFFSET:
5386 hci_clock_offset_evt(hdev, skb);
5387 break;
5388
Marcel Holtmanna8746412008-07-14 20:13:46 +02005389 case HCI_EV_PKT_TYPE_CHANGE:
5390 hci_pkt_type_change_evt(hdev, skb);
5391 break;
5392
Marcel Holtmann85a1e932005-08-09 20:28:02 -07005393 case HCI_EV_PSCAN_REP_MODE:
5394 hci_pscan_rep_mode_evt(hdev, skb);
5395 break;
5396
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005397 case HCI_EV_INQUIRY_RESULT_WITH_RSSI:
5398 hci_inquiry_result_with_rssi_evt(hdev, skb);
5399 break;
5400
5401 case HCI_EV_REMOTE_EXT_FEATURES:
5402 hci_remote_ext_features_evt(hdev, skb);
5403 break;
5404
5405 case HCI_EV_SYNC_CONN_COMPLETE:
5406 hci_sync_conn_complete_evt(hdev, skb);
5407 break;
5408
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005409 case HCI_EV_EXTENDED_INQUIRY_RESULT:
5410 hci_extended_inquiry_result_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005411 break;
5412
Johan Hedberg1c2e0042012-06-08 23:31:13 +08005413 case HCI_EV_KEY_REFRESH_COMPLETE:
5414 hci_key_refresh_complete_evt(hdev, skb);
5415 break;
5416
Marcel Holtmann04936842008-07-14 20:13:48 +02005417 case HCI_EV_IO_CAPA_REQUEST:
5418 hci_io_capa_request_evt(hdev, skb);
5419 break;
5420
Johan Hedberg03b555e2011-01-04 15:40:05 +02005421 case HCI_EV_IO_CAPA_REPLY:
5422 hci_io_capa_reply_evt(hdev, skb);
5423 break;
5424
Johan Hedberga5c29682011-02-19 12:05:57 -03005425 case HCI_EV_USER_CONFIRM_REQUEST:
5426 hci_user_confirm_request_evt(hdev, skb);
5427 break;
5428
Brian Gix1143d452011-11-23 08:28:34 -08005429 case HCI_EV_USER_PASSKEY_REQUEST:
5430 hci_user_passkey_request_evt(hdev, skb);
5431 break;
5432
Johan Hedberg92a25252012-09-06 18:39:26 +03005433 case HCI_EV_USER_PASSKEY_NOTIFY:
5434 hci_user_passkey_notify_evt(hdev, skb);
5435 break;
5436
5437 case HCI_EV_KEYPRESS_NOTIFY:
5438 hci_keypress_notify_evt(hdev, skb);
5439 break;
5440
Marcel Holtmann04936842008-07-14 20:13:48 +02005441 case HCI_EV_SIMPLE_PAIR_COMPLETE:
5442 hci_simple_pair_complete_evt(hdev, skb);
5443 break;
5444
Marcel Holtmann41a96212008-07-14 20:13:48 +02005445 case HCI_EV_REMOTE_HOST_FEATURES:
5446 hci_remote_host_features_evt(hdev, skb);
5447 break;
5448
Ville Tervofcd89c02011-02-10 22:38:47 -03005449 case HCI_EV_LE_META:
5450 hci_le_meta_evt(hdev, skb);
5451 break;
5452
Szymon Janc2763eda2011-03-22 13:12:22 +01005453 case HCI_EV_REMOTE_OOB_DATA_REQUEST:
5454 hci_remote_oob_data_request_evt(hdev, skb);
5455 break;
5456
Arron Wanga77a6a12015-07-24 17:13:15 +08005457#if IS_ENABLED(CONFIG_BT_HS)
5458 case HCI_EV_CHANNEL_SELECTED:
5459 hci_chan_selected_evt(hdev, skb);
5460 break;
5461
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03005462 case HCI_EV_PHY_LINK_COMPLETE:
5463 hci_phy_link_complete_evt(hdev, skb);
5464 break;
5465
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03005466 case HCI_EV_LOGICAL_LINK_COMPLETE:
5467 hci_loglink_complete_evt(hdev, skb);
5468 break;
5469
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02005470 case HCI_EV_DISCONN_LOGICAL_LINK_COMPLETE:
5471 hci_disconn_loglink_complete_evt(hdev, skb);
5472 break;
5473
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02005474 case HCI_EV_DISCONN_PHY_LINK_COMPLETE:
5475 hci_disconn_phylink_complete_evt(hdev, skb);
5476 break;
Arron Wanga77a6a12015-07-24 17:13:15 +08005477#endif
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02005478
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02005479 case HCI_EV_NUM_COMP_BLOCKS:
5480 hci_num_comp_blocks_evt(hdev, skb);
5481 break;
5482
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005483 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03005484 BT_DBG("%s event 0x%2.2x", hdev->name, event);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005485 break;
5486 }
5487
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005488 if (req_complete) {
Johan Hedberge62144872015-04-02 13:41:08 +03005489 req_complete(hdev, status, opcode);
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005490 } else if (req_complete_skb) {
5491 if (!hci_get_cmd_complete(hdev, opcode, req_evt, orig_skb)) {
5492 kfree_skb(orig_skb);
5493 orig_skb = NULL;
5494 }
Johan Hedberge62144872015-04-02 13:41:08 +03005495 req_complete_skb(hdev, status, opcode, orig_skb);
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005496 }
Johan Hedberge62144872015-04-02 13:41:08 +03005497
5498 kfree_skb(orig_skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005499 kfree_skb(skb);
5500 hdev->stat.evt_rx++;
5501}