blob: 139707cd9d352c9c76302b58c40b3148de33d051 [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);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200224}
225
Marcel Holtmannc2f0f972015-01-12 09:21:25 -0800226static void hci_cc_read_stored_link_key(struct hci_dev *hdev,
227 struct sk_buff *skb)
228{
229 struct hci_rp_read_stored_link_key *rp = (void *)skb->data;
230 struct hci_cp_read_stored_link_key *sent;
231
232 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
233
234 sent = hci_sent_cmd_data(hdev, HCI_OP_READ_STORED_LINK_KEY);
235 if (!sent)
236 return;
237
238 if (!rp->status && sent->read_all == 0x01) {
239 hdev->stored_max_keys = rp->max_keys;
240 hdev->stored_num_keys = rp->num_keys;
241 }
242}
243
Marcel Holtmanna93661202015-01-12 09:21:28 -0800244static void hci_cc_delete_stored_link_key(struct hci_dev *hdev,
245 struct sk_buff *skb)
246{
247 struct hci_rp_delete_stored_link_key *rp = (void *)skb->data;
248
249 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
250
251 if (rp->status)
252 return;
253
254 if (rp->num_keys <= hdev->stored_num_keys)
255 hdev->stored_num_keys -= rp->num_keys;
256 else
257 hdev->stored_num_keys = 0;
258}
259
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200260static void hci_cc_write_local_name(struct hci_dev *hdev, struct sk_buff *skb)
261{
262 __u8 status = *((__u8 *) skb->data);
263 void *sent;
264
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300265 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200266
267 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LOCAL_NAME);
268 if (!sent)
269 return;
270
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200271 hci_dev_lock(hdev);
272
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700273 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedbergf51d5b22012-02-22 18:17:32 +0200274 mgmt_set_local_name_complete(hdev, sent, status);
Johan Hedberg28cc7bd2012-02-22 21:06:55 +0200275 else if (!status)
276 memcpy(hdev->dev_name, sent, HCI_MAX_NAME_LENGTH);
Johan Hedbergf51d5b22012-02-22 18:17:32 +0200277
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200278 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200279}
280
281static void hci_cc_read_local_name(struct hci_dev *hdev, struct sk_buff *skb)
282{
283 struct hci_rp_read_local_name *rp = (void *) skb->data;
284
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300285 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200286
287 if (rp->status)
288 return;
289
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700290 if (hci_dev_test_flag(hdev, HCI_SETUP) ||
291 hci_dev_test_flag(hdev, HCI_CONFIG))
Johan Hedbergdb99b5f2012-02-22 20:14:22 +0200292 memcpy(hdev->dev_name, rp->name, HCI_MAX_NAME_LENGTH);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200293}
294
295static void hci_cc_write_auth_enable(struct hci_dev *hdev, struct sk_buff *skb)
296{
297 __u8 status = *((__u8 *) skb->data);
298 void *sent;
299
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300300 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200301
302 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_AUTH_ENABLE);
303 if (!sent)
304 return;
305
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530306 hci_dev_lock(hdev);
307
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200308 if (!status) {
309 __u8 param = *((__u8 *) sent);
310
311 if (param == AUTH_ENABLED)
312 set_bit(HCI_AUTH, &hdev->flags);
313 else
314 clear_bit(HCI_AUTH, &hdev->flags);
315 }
316
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700317 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg33ef95e2012-02-16 23:56:27 +0200318 mgmt_auth_enable_complete(hdev, status);
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530319
320 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200321}
322
323static void hci_cc_write_encrypt_mode(struct hci_dev *hdev, struct sk_buff *skb)
324{
325 __u8 status = *((__u8 *) skb->data);
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200326 __u8 param;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200327 void *sent;
328
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300329 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200330
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200331 if (status)
332 return;
333
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200334 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_ENCRYPT_MODE);
335 if (!sent)
336 return;
337
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200338 param = *((__u8 *) sent);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200339
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200340 if (param)
341 set_bit(HCI_ENCRYPT, &hdev->flags);
342 else
343 clear_bit(HCI_ENCRYPT, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200344}
345
346static void hci_cc_write_scan_enable(struct hci_dev *hdev, struct sk_buff *skb)
347{
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200348 __u8 status = *((__u8 *) skb->data);
349 __u8 param;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200350 void *sent;
351
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300352 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200353
354 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SCAN_ENABLE);
355 if (!sent)
356 return;
357
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200358 param = *((__u8 *) sent);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200359
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200360 hci_dev_lock(hdev);
361
Mikel Astizfa1bd912012-08-09 09:52:29 +0200362 if (status) {
Johan Hedberg2d7cee52011-11-07 22:16:03 +0200363 hdev->discov_timeout = 0;
364 goto done;
365 }
366
Johan Hedbergbc6d2d02014-07-10 12:09:08 +0300367 if (param & SCAN_INQUIRY)
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200368 set_bit(HCI_ISCAN, &hdev->flags);
Johan Hedbergbc6d2d02014-07-10 12:09:08 +0300369 else
370 clear_bit(HCI_ISCAN, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200371
Johan Hedberg031547d2014-07-10 12:09:06 +0300372 if (param & SCAN_PAGE)
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200373 set_bit(HCI_PSCAN, &hdev->flags);
Johan Hedbergbc6d2d02014-07-10 12:09:08 +0300374 else
Johan Hedberg204e3992014-07-28 15:45:31 +0300375 clear_bit(HCI_PSCAN, &hdev->flags);
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200376
377done:
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200378 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200379}
380
381static void hci_cc_read_class_of_dev(struct hci_dev *hdev, struct sk_buff *skb)
382{
383 struct hci_rp_read_class_of_dev *rp = (void *) skb->data;
384
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300385 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200386
387 if (rp->status)
388 return;
389
390 memcpy(hdev->dev_class, rp->dev_class, 3);
391
392 BT_DBG("%s class 0x%.2x%.2x%.2x", hdev->name,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300393 hdev->dev_class[2], hdev->dev_class[1], hdev->dev_class[0]);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200394}
395
396static void hci_cc_write_class_of_dev(struct hci_dev *hdev, struct sk_buff *skb)
397{
398 __u8 status = *((__u8 *) skb->data);
399 void *sent;
400
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300401 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200402
403 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_CLASS_OF_DEV);
404 if (!sent)
405 return;
406
Marcel Holtmann7f9a9032012-02-22 18:38:01 +0100407 hci_dev_lock(hdev);
408
409 if (status == 0)
410 memcpy(hdev->dev_class, sent, 3);
411
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700412 if (hci_dev_test_flag(hdev, HCI_MGMT))
Marcel Holtmann7f9a9032012-02-22 18:38:01 +0100413 mgmt_set_class_of_dev_complete(hdev, sent, status);
414
415 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200416}
417
418static void hci_cc_read_voice_setting(struct hci_dev *hdev, struct sk_buff *skb)
419{
420 struct hci_rp_read_voice_setting *rp = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700421 __u16 setting;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200422
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300423 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200424
425 if (rp->status)
426 return;
427
428 setting = __le16_to_cpu(rp->voice_setting);
429
Marcel Holtmannf383f272008-07-14 20:13:47 +0200430 if (hdev->voice_setting == setting)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200431 return;
432
433 hdev->voice_setting = setting;
434
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300435 BT_DBG("%s voice setting 0x%4.4x", hdev->name, setting);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200436
Gustavo F. Padovan3c547112011-12-14 22:58:44 -0200437 if (hdev->notify)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200438 hdev->notify(hdev, HCI_NOTIFY_VOICE_SETTING);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200439}
440
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300441static void hci_cc_write_voice_setting(struct hci_dev *hdev,
442 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200443{
444 __u8 status = *((__u8 *) skb->data);
Marcel Holtmannf383f272008-07-14 20:13:47 +0200445 __u16 setting;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700446 void *sent;
447
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300448 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700449
Marcel Holtmannf383f272008-07-14 20:13:47 +0200450 if (status)
451 return;
452
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200453 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_VOICE_SETTING);
454 if (!sent)
455 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700456
Marcel Holtmannf383f272008-07-14 20:13:47 +0200457 setting = get_unaligned_le16(sent);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700458
Marcel Holtmannf383f272008-07-14 20:13:47 +0200459 if (hdev->voice_setting == setting)
460 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700461
Marcel Holtmannf383f272008-07-14 20:13:47 +0200462 hdev->voice_setting = setting;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700463
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300464 BT_DBG("%s voice setting 0x%4.4x", hdev->name, setting);
Marcel Holtmannf383f272008-07-14 20:13:47 +0200465
Gustavo F. Padovan3c547112011-12-14 22:58:44 -0200466 if (hdev->notify)
Marcel Holtmannf383f272008-07-14 20:13:47 +0200467 hdev->notify(hdev, HCI_NOTIFY_VOICE_SETTING);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700468}
469
Marcel Holtmannb4cb9fb2013-10-14 13:56:16 -0700470static void hci_cc_read_num_supported_iac(struct hci_dev *hdev,
471 struct sk_buff *skb)
472{
473 struct hci_rp_read_num_supported_iac *rp = (void *) skb->data;
474
475 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
476
477 if (rp->status)
478 return;
479
480 hdev->num_iac = rp->num_iac;
481
482 BT_DBG("%s num iac %d", hdev->name, hdev->num_iac);
483}
484
Marcel Holtmann333140b2008-07-14 20:13:48 +0200485static void hci_cc_write_ssp_mode(struct hci_dev *hdev, struct sk_buff *skb)
486{
487 __u8 status = *((__u8 *) skb->data);
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300488 struct hci_cp_write_ssp_mode *sent;
Marcel Holtmann333140b2008-07-14 20:13:48 +0200489
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300490 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann333140b2008-07-14 20:13:48 +0200491
Marcel Holtmann333140b2008-07-14 20:13:48 +0200492 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SSP_MODE);
493 if (!sent)
494 return;
495
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530496 hci_dev_lock(hdev);
497
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300498 if (!status) {
499 if (sent->mode)
Johan Hedbergcad718e2013-04-17 15:00:51 +0300500 hdev->features[1][0] |= LMP_HOST_SSP;
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300501 else
Johan Hedbergcad718e2013-04-17 15:00:51 +0300502 hdev->features[1][0] &= ~LMP_HOST_SSP;
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300503 }
504
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700505 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300506 mgmt_ssp_enable_complete(hdev, sent->mode, status);
Johan Hedbergc0ecddc2012-02-22 12:38:31 +0200507 else if (!status) {
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300508 if (sent->mode)
Marcel Holtmanna1536da2015-03-13 02:11:01 -0700509 hci_dev_set_flag(hdev, HCI_SSP_ENABLED);
Johan Hedbergc0ecddc2012-02-22 12:38:31 +0200510 else
Marcel Holtmanna358dc12015-03-13 02:11:02 -0700511 hci_dev_clear_flag(hdev, HCI_SSP_ENABLED);
Johan Hedbergc0ecddc2012-02-22 12:38:31 +0200512 }
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530513
514 hci_dev_unlock(hdev);
Marcel Holtmann333140b2008-07-14 20:13:48 +0200515}
516
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800517static void hci_cc_write_sc_support(struct hci_dev *hdev, struct sk_buff *skb)
518{
519 u8 status = *((u8 *) skb->data);
520 struct hci_cp_write_sc_support *sent;
521
522 BT_DBG("%s status 0x%2.2x", hdev->name, status);
523
524 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SC_SUPPORT);
525 if (!sent)
526 return;
527
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530528 hci_dev_lock(hdev);
529
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800530 if (!status) {
531 if (sent->support)
532 hdev->features[1][0] |= LMP_HOST_SC;
533 else
534 hdev->features[1][0] &= ~LMP_HOST_SC;
535 }
536
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700537 if (!hci_dev_test_flag(hdev, HCI_MGMT) && !status) {
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800538 if (sent->support)
Marcel Holtmanna1536da2015-03-13 02:11:01 -0700539 hci_dev_set_flag(hdev, HCI_SC_ENABLED);
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800540 else
Marcel Holtmanna358dc12015-03-13 02:11:02 -0700541 hci_dev_clear_flag(hdev, HCI_SC_ENABLED);
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800542 }
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530543
544 hci_dev_unlock(hdev);
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800545}
546
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200547static void hci_cc_read_local_version(struct hci_dev *hdev, struct sk_buff *skb)
548{
549 struct hci_rp_read_local_version *rp = (void *) skb->data;
550
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300551 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200552
553 if (rp->status)
Johan Hedberg42c6b122013-03-05 20:37:49 +0200554 return;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200555
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700556 if (hci_dev_test_flag(hdev, HCI_SETUP) ||
557 hci_dev_test_flag(hdev, HCI_CONFIG)) {
Marcel Holtmann0d5551f2013-10-18 12:04:50 -0700558 hdev->hci_ver = rp->hci_ver;
559 hdev->hci_rev = __le16_to_cpu(rp->hci_rev);
560 hdev->lmp_ver = rp->lmp_ver;
561 hdev->manufacturer = __le16_to_cpu(rp->manufacturer);
562 hdev->lmp_subver = __le16_to_cpu(rp->lmp_subver);
563 }
Johan Hedbergd5859e22011-01-25 01:19:58 +0200564}
565
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300566static void hci_cc_read_local_commands(struct hci_dev *hdev,
567 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200568{
569 struct hci_rp_read_local_commands *rp = (void *) skb->data;
570
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300571 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200572
Marcel Holtmann6a070e62013-10-31 04:54:33 -0700573 if (rp->status)
574 return;
575
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700576 if (hci_dev_test_flag(hdev, HCI_SETUP) ||
577 hci_dev_test_flag(hdev, HCI_CONFIG))
Johan Hedberg2177bab2013-03-05 20:37:43 +0200578 memcpy(hdev->commands, rp->commands, sizeof(hdev->commands));
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200579}
580
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300581static void hci_cc_read_local_features(struct hci_dev *hdev,
582 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200583{
584 struct hci_rp_read_local_features *rp = (void *) skb->data;
585
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300586 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200587
588 if (rp->status)
589 return;
590
591 memcpy(hdev->features, rp->features, 8);
592
593 /* Adjust default settings according to features
594 * supported by device. */
595
Johan Hedbergcad718e2013-04-17 15:00:51 +0300596 if (hdev->features[0][0] & LMP_3SLOT)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200597 hdev->pkt_type |= (HCI_DM3 | HCI_DH3);
598
Johan Hedbergcad718e2013-04-17 15:00:51 +0300599 if (hdev->features[0][0] & LMP_5SLOT)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200600 hdev->pkt_type |= (HCI_DM5 | HCI_DH5);
601
Johan Hedbergcad718e2013-04-17 15:00:51 +0300602 if (hdev->features[0][1] & LMP_HV2) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200603 hdev->pkt_type |= (HCI_HV2);
604 hdev->esco_type |= (ESCO_HV2);
605 }
606
Johan Hedbergcad718e2013-04-17 15:00:51 +0300607 if (hdev->features[0][1] & LMP_HV3) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200608 hdev->pkt_type |= (HCI_HV3);
609 hdev->esco_type |= (ESCO_HV3);
610 }
611
Andre Guedes45db810f2012-07-24 15:03:49 -0300612 if (lmp_esco_capable(hdev))
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200613 hdev->esco_type |= (ESCO_EV3);
614
Johan Hedbergcad718e2013-04-17 15:00:51 +0300615 if (hdev->features[0][4] & LMP_EV4)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200616 hdev->esco_type |= (ESCO_EV4);
617
Johan Hedbergcad718e2013-04-17 15:00:51 +0300618 if (hdev->features[0][4] & LMP_EV5)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200619 hdev->esco_type |= (ESCO_EV5);
620
Johan Hedbergcad718e2013-04-17 15:00:51 +0300621 if (hdev->features[0][5] & LMP_EDR_ESCO_2M)
Marcel Holtmannefc76882009-02-06 09:13:37 +0100622 hdev->esco_type |= (ESCO_2EV3);
623
Johan Hedbergcad718e2013-04-17 15:00:51 +0300624 if (hdev->features[0][5] & LMP_EDR_ESCO_3M)
Marcel Holtmannefc76882009-02-06 09:13:37 +0100625 hdev->esco_type |= (ESCO_3EV3);
626
Johan Hedbergcad718e2013-04-17 15:00:51 +0300627 if (hdev->features[0][5] & LMP_EDR_3S_ESCO)
Marcel Holtmannefc76882009-02-06 09:13:37 +0100628 hdev->esco_type |= (ESCO_2EV5 | ESCO_3EV5);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200629}
630
Andre Guedes971e3a42011-06-30 19:20:52 -0300631static void hci_cc_read_local_ext_features(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300632 struct sk_buff *skb)
Andre Guedes971e3a42011-06-30 19:20:52 -0300633{
634 struct hci_rp_read_local_ext_features *rp = (void *) skb->data;
635
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300636 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andre Guedes971e3a42011-06-30 19:20:52 -0300637
638 if (rp->status)
Johan Hedberg42c6b122013-03-05 20:37:49 +0200639 return;
Andre Guedes971e3a42011-06-30 19:20:52 -0300640
Marcel Holtmann57af75a2013-10-18 12:04:47 -0700641 if (hdev->max_page < rp->max_page)
642 hdev->max_page = rp->max_page;
Johan Hedbergd2c5d772013-04-17 15:00:52 +0300643
Johan Hedbergcad718e2013-04-17 15:00:51 +0300644 if (rp->page < HCI_MAX_PAGES)
645 memcpy(hdev->features[rp->page], rp->features, 8);
Andre Guedes971e3a42011-06-30 19:20:52 -0300646}
647
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200648static void hci_cc_read_flow_control_mode(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300649 struct sk_buff *skb)
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200650{
651 struct hci_rp_read_flow_control_mode *rp = (void *) skb->data;
652
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300653 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200654
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200655 if (rp->status)
656 return;
657
658 hdev->flow_ctl_mode = rp->mode;
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200659}
660
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200661static void hci_cc_read_buffer_size(struct hci_dev *hdev, struct sk_buff *skb)
662{
663 struct hci_rp_read_buffer_size *rp = (void *) skb->data;
664
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300665 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200666
667 if (rp->status)
668 return;
669
670 hdev->acl_mtu = __le16_to_cpu(rp->acl_mtu);
671 hdev->sco_mtu = rp->sco_mtu;
672 hdev->acl_pkts = __le16_to_cpu(rp->acl_max_pkt);
673 hdev->sco_pkts = __le16_to_cpu(rp->sco_max_pkt);
674
675 if (test_bit(HCI_QUIRK_FIXUP_BUFFER_SIZE, &hdev->quirks)) {
676 hdev->sco_mtu = 64;
677 hdev->sco_pkts = 8;
678 }
679
680 hdev->acl_cnt = hdev->acl_pkts;
681 hdev->sco_cnt = hdev->sco_pkts;
682
Gustavo Padovan807deac2012-05-17 00:36:24 -0300683 BT_DBG("%s acl mtu %d:%d sco mtu %d:%d", hdev->name, hdev->acl_mtu,
684 hdev->acl_pkts, hdev->sco_mtu, hdev->sco_pkts);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200685}
686
687static void hci_cc_read_bd_addr(struct hci_dev *hdev, struct sk_buff *skb)
688{
689 struct hci_rp_read_bd_addr *rp = (void *) skb->data;
690
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300691 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200692
Marcel Holtmanne30d3f52014-07-05 10:48:03 +0200693 if (rp->status)
694 return;
695
696 if (test_bit(HCI_INIT, &hdev->flags))
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200697 bacpy(&hdev->bdaddr, &rp->bdaddr);
Marcel Holtmanne30d3f52014-07-05 10:48:03 +0200698
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700699 if (hci_dev_test_flag(hdev, HCI_SETUP))
Marcel Holtmanne30d3f52014-07-05 10:48:03 +0200700 bacpy(&hdev->setup_addr, &rp->bdaddr);
Johan Hedberg23bb5762010-12-21 23:01:27 +0200701}
702
Johan Hedbergf332ec62013-03-15 17:07:11 -0500703static void hci_cc_read_page_scan_activity(struct hci_dev *hdev,
704 struct sk_buff *skb)
705{
706 struct hci_rp_read_page_scan_activity *rp = (void *) skb->data;
707
708 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
709
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200710 if (rp->status)
711 return;
712
713 if (test_bit(HCI_INIT, &hdev->flags)) {
Johan Hedbergf332ec62013-03-15 17:07:11 -0500714 hdev->page_scan_interval = __le16_to_cpu(rp->interval);
715 hdev->page_scan_window = __le16_to_cpu(rp->window);
716 }
717}
718
Johan Hedberg4a3ee762013-03-15 17:07:12 -0500719static void hci_cc_write_page_scan_activity(struct hci_dev *hdev,
720 struct sk_buff *skb)
721{
722 u8 status = *((u8 *) skb->data);
723 struct hci_cp_write_page_scan_activity *sent;
724
725 BT_DBG("%s status 0x%2.2x", hdev->name, status);
726
727 if (status)
728 return;
729
730 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY);
731 if (!sent)
732 return;
733
734 hdev->page_scan_interval = __le16_to_cpu(sent->interval);
735 hdev->page_scan_window = __le16_to_cpu(sent->window);
736}
737
Johan Hedbergf332ec62013-03-15 17:07:11 -0500738static void hci_cc_read_page_scan_type(struct hci_dev *hdev,
739 struct sk_buff *skb)
740{
741 struct hci_rp_read_page_scan_type *rp = (void *) skb->data;
742
743 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
744
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200745 if (rp->status)
746 return;
747
748 if (test_bit(HCI_INIT, &hdev->flags))
Johan Hedbergf332ec62013-03-15 17:07:11 -0500749 hdev->page_scan_type = rp->type;
750}
751
Johan Hedberg4a3ee762013-03-15 17:07:12 -0500752static void hci_cc_write_page_scan_type(struct hci_dev *hdev,
753 struct sk_buff *skb)
754{
755 u8 status = *((u8 *) skb->data);
756 u8 *type;
757
758 BT_DBG("%s status 0x%2.2x", hdev->name, status);
759
760 if (status)
761 return;
762
763 type = hci_sent_cmd_data(hdev, HCI_OP_WRITE_PAGE_SCAN_TYPE);
764 if (type)
765 hdev->page_scan_type = *type;
766}
767
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200768static void hci_cc_read_data_block_size(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300769 struct sk_buff *skb)
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200770{
771 struct hci_rp_read_data_block_size *rp = (void *) skb->data;
772
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300773 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200774
775 if (rp->status)
776 return;
777
778 hdev->block_mtu = __le16_to_cpu(rp->max_acl_len);
779 hdev->block_len = __le16_to_cpu(rp->block_len);
780 hdev->num_blocks = __le16_to_cpu(rp->num_blocks);
781
782 hdev->block_cnt = hdev->num_blocks;
783
784 BT_DBG("%s blk mtu %d cnt %d len %d", hdev->name, hdev->block_mtu,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300785 hdev->block_cnt, hdev->block_len);
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200786}
787
Johan Hedberg33f35722014-06-28 17:54:06 +0300788static void hci_cc_read_clock(struct hci_dev *hdev, struct sk_buff *skb)
789{
790 struct hci_rp_read_clock *rp = (void *) skb->data;
791 struct hci_cp_read_clock *cp;
792 struct hci_conn *conn;
793
794 BT_DBG("%s", hdev->name);
795
796 if (skb->len < sizeof(*rp))
797 return;
798
799 if (rp->status)
800 return;
801
802 hci_dev_lock(hdev);
803
804 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_CLOCK);
805 if (!cp)
806 goto unlock;
807
808 if (cp->which == 0x00) {
809 hdev->clock = le32_to_cpu(rp->clock);
810 goto unlock;
811 }
812
813 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
814 if (conn) {
815 conn->clock = le32_to_cpu(rp->clock);
816 conn->clock_accuracy = le16_to_cpu(rp->accuracy);
817 }
818
819unlock:
820 hci_dev_unlock(hdev);
821}
822
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300823static void hci_cc_read_local_amp_info(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300824 struct sk_buff *skb)
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300825{
826 struct hci_rp_read_local_amp_info *rp = (void *) skb->data;
827
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300828 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300829
830 if (rp->status)
Arron Wang83927882015-07-24 17:10:16 +0800831 return;
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300832
833 hdev->amp_status = rp->amp_status;
834 hdev->amp_total_bw = __le32_to_cpu(rp->total_bw);
835 hdev->amp_max_bw = __le32_to_cpu(rp->max_bw);
836 hdev->amp_min_latency = __le32_to_cpu(rp->min_latency);
837 hdev->amp_max_pdu = __le32_to_cpu(rp->max_pdu);
838 hdev->amp_type = rp->amp_type;
839 hdev->amp_pal_cap = __le16_to_cpu(rp->pal_cap);
840 hdev->amp_assoc_size = __le16_to_cpu(rp->max_assoc_size);
841 hdev->amp_be_flush_to = __le32_to_cpu(rp->be_flush_to);
842 hdev->amp_max_flush_to = __le32_to_cpu(rp->max_flush_to);
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300843}
844
Johan Hedbergd5859e22011-01-25 01:19:58 +0200845static void hci_cc_read_inq_rsp_tx_power(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300846 struct sk_buff *skb)
Johan Hedbergd5859e22011-01-25 01:19:58 +0200847{
Marcel Holtmann91c4e9b2012-03-11 19:27:21 -0700848 struct hci_rp_read_inq_rsp_tx_power *rp = (void *) skb->data;
Johan Hedbergd5859e22011-01-25 01:19:58 +0200849
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300850 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedbergd5859e22011-01-25 01:19:58 +0200851
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200852 if (rp->status)
853 return;
854
855 hdev->inq_tx_power = rp->tx_power;
Johan Hedbergd5859e22011-01-25 01:19:58 +0200856}
857
Johan Hedberg980e1a52011-01-22 06:10:07 +0200858static void hci_cc_pin_code_reply(struct hci_dev *hdev, struct sk_buff *skb)
859{
860 struct hci_rp_pin_code_reply *rp = (void *) skb->data;
861 struct hci_cp_pin_code_reply *cp;
862 struct hci_conn *conn;
863
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300864 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200865
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200866 hci_dev_lock(hdev);
867
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700868 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg744cf192011-11-08 20:40:14 +0200869 mgmt_pin_code_reply_complete(hdev, &rp->bdaddr, rp->status);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200870
Mikel Astizfa1bd912012-08-09 09:52:29 +0200871 if (rp->status)
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200872 goto unlock;
Johan Hedberg980e1a52011-01-22 06:10:07 +0200873
874 cp = hci_sent_cmd_data(hdev, HCI_OP_PIN_CODE_REPLY);
875 if (!cp)
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200876 goto unlock;
Johan Hedberg980e1a52011-01-22 06:10:07 +0200877
878 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
879 if (conn)
880 conn->pin_length = cp->pin_len;
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200881
882unlock:
883 hci_dev_unlock(hdev);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200884}
885
886static void hci_cc_pin_code_neg_reply(struct hci_dev *hdev, struct sk_buff *skb)
887{
888 struct hci_rp_pin_code_neg_reply *rp = (void *) skb->data;
889
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300890 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200891
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200892 hci_dev_lock(hdev);
893
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700894 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg744cf192011-11-08 20:40:14 +0200895 mgmt_pin_code_neg_reply_complete(hdev, &rp->bdaddr,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300896 rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200897
898 hci_dev_unlock(hdev);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200899}
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200900
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300901static void hci_cc_le_read_buffer_size(struct hci_dev *hdev,
902 struct sk_buff *skb)
903{
904 struct hci_rp_le_read_buffer_size *rp = (void *) skb->data;
905
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300906 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300907
908 if (rp->status)
909 return;
910
911 hdev->le_mtu = __le16_to_cpu(rp->le_mtu);
912 hdev->le_pkts = rp->le_max_pkt;
913
914 hdev->le_cnt = hdev->le_pkts;
915
916 BT_DBG("%s le mtu %d:%d", hdev->name, hdev->le_mtu, hdev->le_pkts);
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300917}
Johan Hedberg980e1a52011-01-22 06:10:07 +0200918
Johan Hedberg60e77322013-01-22 14:01:59 +0200919static void hci_cc_le_read_local_features(struct hci_dev *hdev,
920 struct sk_buff *skb)
921{
922 struct hci_rp_le_read_local_features *rp = (void *) skb->data;
923
924 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
925
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200926 if (rp->status)
927 return;
928
929 memcpy(hdev->le_features, rp->features, 8);
Johan Hedberg60e77322013-01-22 14:01:59 +0200930}
931
Johan Hedberg8fa19092012-10-19 20:57:49 +0300932static void hci_cc_le_read_adv_tx_power(struct hci_dev *hdev,
933 struct sk_buff *skb)
934{
935 struct hci_rp_le_read_adv_tx_power *rp = (void *) skb->data;
936
937 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
938
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200939 if (rp->status)
940 return;
941
942 hdev->adv_tx_power = rp->tx_power;
Johan Hedberg8fa19092012-10-19 20:57:49 +0300943}
944
Johan Hedberga5c29682011-02-19 12:05:57 -0300945static void hci_cc_user_confirm_reply(struct hci_dev *hdev, struct sk_buff *skb)
946{
947 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
948
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300949 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberga5c29682011-02-19 12:05:57 -0300950
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200951 hci_dev_lock(hdev);
952
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700953 if (hci_dev_test_flag(hdev, HCI_MGMT))
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300954 mgmt_user_confirm_reply_complete(hdev, &rp->bdaddr, ACL_LINK, 0,
955 rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200956
957 hci_dev_unlock(hdev);
Johan Hedberga5c29682011-02-19 12:05:57 -0300958}
959
960static void hci_cc_user_confirm_neg_reply(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300961 struct sk_buff *skb)
Johan Hedberga5c29682011-02-19 12:05:57 -0300962{
963 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
964
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300965 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberga5c29682011-02-19 12:05:57 -0300966
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200967 hci_dev_lock(hdev);
968
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700969 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg744cf192011-11-08 20:40:14 +0200970 mgmt_user_confirm_neg_reply_complete(hdev, &rp->bdaddr,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300971 ACL_LINK, 0, rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200972
973 hci_dev_unlock(hdev);
Johan Hedberga5c29682011-02-19 12:05:57 -0300974}
975
Brian Gix1143d452011-11-23 08:28:34 -0800976static void hci_cc_user_passkey_reply(struct hci_dev *hdev, struct sk_buff *skb)
977{
978 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
979
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300980 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -0800981
982 hci_dev_lock(hdev);
983
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700984 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg272d90d2012-02-09 15:26:12 +0200985 mgmt_user_passkey_reply_complete(hdev, &rp->bdaddr, ACL_LINK,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300986 0, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -0800987
988 hci_dev_unlock(hdev);
989}
990
991static void hci_cc_user_passkey_neg_reply(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300992 struct sk_buff *skb)
Brian Gix1143d452011-11-23 08:28:34 -0800993{
994 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
995
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300996 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -0800997
998 hci_dev_lock(hdev);
999
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001000 if (hci_dev_test_flag(hdev, HCI_MGMT))
Brian Gix1143d452011-11-23 08:28:34 -08001001 mgmt_user_passkey_neg_reply_complete(hdev, &rp->bdaddr,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001002 ACL_LINK, 0, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -08001003
1004 hci_dev_unlock(hdev);
1005}
1006
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08001007static void hci_cc_read_local_oob_data(struct hci_dev *hdev,
1008 struct sk_buff *skb)
Szymon Jancc35938b2011-03-22 13:12:21 +01001009{
1010 struct hci_rp_read_local_oob_data *rp = (void *) skb->data;
1011
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001012 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08001013}
1014
1015static void hci_cc_read_local_oob_ext_data(struct hci_dev *hdev,
1016 struct sk_buff *skb)
1017{
1018 struct hci_rp_read_local_oob_ext_data *rp = (void *) skb->data;
1019
1020 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Szymon Jancc35938b2011-03-22 13:12:21 +01001021}
1022
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08001023static void hci_cc_le_set_random_addr(struct hci_dev *hdev, struct sk_buff *skb)
1024{
1025 __u8 status = *((__u8 *) skb->data);
1026 bdaddr_t *sent;
1027
1028 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1029
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001030 if (status)
1031 return;
1032
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08001033 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_RANDOM_ADDR);
1034 if (!sent)
1035 return;
1036
1037 hci_dev_lock(hdev);
1038
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001039 bacpy(&hdev->random_addr, sent);
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08001040
1041 hci_dev_unlock(hdev);
1042}
1043
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001044static void hci_cc_le_set_adv_enable(struct hci_dev *hdev, struct sk_buff *skb)
1045{
1046 __u8 *sent, status = *((__u8 *) skb->data);
1047
1048 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1049
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001050 if (status)
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001051 return;
1052
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001053 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADV_ENABLE);
1054 if (!sent)
Johan Hedberg3c857752014-03-25 10:30:49 +02001055 return;
1056
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001057 hci_dev_lock(hdev);
1058
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001059 /* If we're doing connection initiation as peripheral. Set a
Johan Hedberg3c857752014-03-25 10:30:49 +02001060 * timeout in case something goes wrong.
1061 */
1062 if (*sent) {
1063 struct hci_conn *conn;
1064
Marcel Holtmanna1536da2015-03-13 02:11:01 -07001065 hci_dev_set_flag(hdev, HCI_LE_ADV);
Johan Hedberg66c417c2014-07-08 15:07:47 +03001066
Jakub Pawlowskie7d9ab72015-08-07 20:22:52 +02001067 conn = hci_lookup_le_connect(hdev);
Johan Hedberg3c857752014-03-25 10:30:49 +02001068 if (conn)
1069 queue_delayed_work(hdev->workqueue,
1070 &conn->le_conn_timeout,
Johan Hedberg09ae2602014-07-06 13:41:15 +03001071 conn->conn_timeout);
Johan Hedberg66c417c2014-07-08 15:07:47 +03001072 } else {
Marcel Holtmanna358dc12015-03-13 02:11:02 -07001073 hci_dev_clear_flag(hdev, HCI_LE_ADV);
Johan Hedberg3c857752014-03-25 10:30:49 +02001074 }
1075
Johan Hedberg04b4edc2013-03-15 17:07:01 -05001076 hci_dev_unlock(hdev);
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001077}
1078
Marcel Holtmann533553f2014-03-21 12:18:10 -07001079static void hci_cc_le_set_scan_param(struct hci_dev *hdev, struct sk_buff *skb)
1080{
1081 struct hci_cp_le_set_scan_param *cp;
1082 __u8 status = *((__u8 *) skb->data);
1083
1084 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1085
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001086 if (status)
1087 return;
1088
Marcel Holtmann533553f2014-03-21 12:18:10 -07001089 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_PARAM);
1090 if (!cp)
1091 return;
1092
1093 hci_dev_lock(hdev);
1094
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001095 hdev->le_scan_type = cp->type;
Marcel Holtmann533553f2014-03-21 12:18:10 -07001096
1097 hci_dev_unlock(hdev);
1098}
1099
Johan Hedbergb9a63282014-03-25 10:51:52 +02001100static bool has_pending_adv_report(struct hci_dev *hdev)
1101{
1102 struct discovery_state *d = &hdev->discovery;
1103
1104 return bacmp(&d->last_adv_addr, BDADDR_ANY);
1105}
1106
1107static void clear_pending_adv_report(struct hci_dev *hdev)
1108{
1109 struct discovery_state *d = &hdev->discovery;
1110
1111 bacpy(&d->last_adv_addr, BDADDR_ANY);
1112 d->last_adv_data_len = 0;
1113}
1114
1115static void store_pending_adv_report(struct hci_dev *hdev, bdaddr_t *bdaddr,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001116 u8 bdaddr_type, s8 rssi, u32 flags,
1117 u8 *data, u8 len)
Johan Hedbergb9a63282014-03-25 10:51:52 +02001118{
1119 struct discovery_state *d = &hdev->discovery;
1120
1121 bacpy(&d->last_adv_addr, bdaddr);
1122 d->last_adv_addr_type = bdaddr_type;
Johan Hedbergff5cd292014-03-25 14:40:52 +02001123 d->last_adv_rssi = rssi;
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001124 d->last_adv_flags = flags;
Johan Hedbergb9a63282014-03-25 10:51:52 +02001125 memcpy(d->last_adv_data, data, len);
1126 d->last_adv_data_len = len;
1127}
1128
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001129static void hci_cc_le_set_scan_enable(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -03001130 struct sk_buff *skb)
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001131{
1132 struct hci_cp_le_set_scan_enable *cp;
1133 __u8 status = *((__u8 *) skb->data);
1134
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001135 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001136
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001137 if (status)
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001138 return;
1139
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001140 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_ENABLE);
1141 if (!cp)
Andre Guedes3fd319b2013-04-30 15:29:36 -03001142 return;
1143
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301144 hci_dev_lock(hdev);
1145
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001146 switch (cp->enable) {
Andre Guedes76a388b2013-04-04 20:21:02 -03001147 case LE_SCAN_ENABLE:
Marcel Holtmanna1536da2015-03-13 02:11:01 -07001148 hci_dev_set_flag(hdev, HCI_LE_SCAN);
Johan Hedbergb9a63282014-03-25 10:51:52 +02001149 if (hdev->le_scan_type == LE_SCAN_ACTIVE)
1150 clear_pending_adv_report(hdev);
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001151 break;
1152
Andre Guedes76a388b2013-04-04 20:21:02 -03001153 case LE_SCAN_DISABLE:
Johan Hedbergb9a63282014-03-25 10:51:52 +02001154 /* We do this here instead of when setting DISCOVERY_STOPPED
1155 * since the latter would potentially require waiting for
1156 * inquiry to stop too.
1157 */
1158 if (has_pending_adv_report(hdev)) {
1159 struct discovery_state *d = &hdev->discovery;
1160
1161 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergab0aa432014-03-26 14:17:12 +02001162 d->last_adv_addr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001163 d->last_adv_rssi, d->last_adv_flags,
Johan Hedbergab0aa432014-03-26 14:17:12 +02001164 d->last_adv_data,
Johan Hedbergb9a63282014-03-25 10:51:52 +02001165 d->last_adv_data_len, NULL, 0);
1166 }
1167
Johan Hedberg317ac8c2014-02-28 20:26:12 +02001168 /* Cancel this timer so that we don't try to disable scanning
1169 * when it's already disabled.
1170 */
1171 cancel_delayed_work(&hdev->le_scan_disable);
1172
Marcel Holtmanna358dc12015-03-13 02:11:02 -07001173 hci_dev_clear_flag(hdev, HCI_LE_SCAN);
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001174
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001175 /* The HCI_LE_SCAN_INTERRUPTED flag indicates that we
1176 * interrupted scanning due to a connect request. Mark
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001177 * therefore discovery as stopped. If this was not
1178 * because of a connect request advertising might have
1179 * been disabled because of active scanning, so
1180 * re-enable it again if necessary.
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001181 */
Marcel Holtmanna69d8922015-03-13 02:11:05 -07001182 if (hci_dev_test_and_clear_flag(hdev, HCI_LE_SCAN_INTERRUPTED))
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001183 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001184 else if (!hci_dev_test_flag(hdev, HCI_LE_ADV) &&
Johan Hedberg34722272014-07-08 16:05:05 +03001185 hdev->discovery.state == DISCOVERY_FINDING)
Johan Hedbergf2252572015-11-18 12:49:20 +02001186 hci_req_reenable_advertising(hdev);
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001187
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001188 break;
1189
1190 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001191 bt_dev_err(hdev, "use of reserved LE_Scan_Enable param %d",
1192 cp->enable);
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001193 break;
Andre Guedes35815082011-05-26 16:23:53 -03001194 }
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301195
1196 hci_dev_unlock(hdev);
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001197}
1198
Johan Hedbergcf1d0812013-01-22 14:02:00 +02001199static void hci_cc_le_read_white_list_size(struct hci_dev *hdev,
1200 struct sk_buff *skb)
1201{
1202 struct hci_rp_le_read_white_list_size *rp = (void *) skb->data;
1203
1204 BT_DBG("%s status 0x%2.2x size %u", hdev->name, rp->status, rp->size);
1205
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001206 if (rp->status)
1207 return;
1208
1209 hdev->le_white_list_size = rp->size;
Johan Hedbergcf1d0812013-01-22 14:02:00 +02001210}
1211
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001212static void hci_cc_le_clear_white_list(struct hci_dev *hdev,
1213 struct sk_buff *skb)
1214{
1215 __u8 status = *((__u8 *) skb->data);
1216
1217 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1218
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001219 if (status)
1220 return;
1221
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001222 hci_bdaddr_list_clear(&hdev->le_white_list);
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001223}
1224
1225static void hci_cc_le_add_to_white_list(struct hci_dev *hdev,
1226 struct sk_buff *skb)
1227{
1228 struct hci_cp_le_add_to_white_list *sent;
1229 __u8 status = *((__u8 *) skb->data);
1230
1231 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1232
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001233 if (status)
1234 return;
1235
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001236 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_ADD_TO_WHITE_LIST);
1237 if (!sent)
1238 return;
1239
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001240 hci_bdaddr_list_add(&hdev->le_white_list, &sent->bdaddr,
1241 sent->bdaddr_type);
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001242}
1243
1244static void hci_cc_le_del_from_white_list(struct hci_dev *hdev,
1245 struct sk_buff *skb)
1246{
1247 struct hci_cp_le_del_from_white_list *sent;
1248 __u8 status = *((__u8 *) skb->data);
1249
1250 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1251
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001252 if (status)
1253 return;
1254
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001255 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_DEL_FROM_WHITE_LIST);
1256 if (!sent)
1257 return;
1258
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001259 hci_bdaddr_list_del(&hdev->le_white_list, &sent->bdaddr,
1260 sent->bdaddr_type);
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001261}
1262
Johan Hedberg9b008c02013-01-22 14:02:01 +02001263static void hci_cc_le_read_supported_states(struct hci_dev *hdev,
1264 struct sk_buff *skb)
1265{
1266 struct hci_rp_le_read_supported_states *rp = (void *) skb->data;
1267
1268 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1269
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001270 if (rp->status)
1271 return;
1272
1273 memcpy(hdev->le_states, rp->le_states, 8);
Johan Hedberg9b008c02013-01-22 14:02:01 +02001274}
1275
Marcel Holtmanna8e1bfa2014-12-20 16:28:40 +01001276static void hci_cc_le_read_def_data_len(struct hci_dev *hdev,
1277 struct sk_buff *skb)
1278{
1279 struct hci_rp_le_read_def_data_len *rp = (void *) skb->data;
1280
1281 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1282
1283 if (rp->status)
1284 return;
1285
1286 hdev->le_def_tx_len = le16_to_cpu(rp->tx_len);
1287 hdev->le_def_tx_time = le16_to_cpu(rp->tx_time);
1288}
1289
1290static void hci_cc_le_write_def_data_len(struct hci_dev *hdev,
1291 struct sk_buff *skb)
1292{
1293 struct hci_cp_le_write_def_data_len *sent;
1294 __u8 status = *((__u8 *) skb->data);
1295
1296 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1297
1298 if (status)
1299 return;
1300
1301 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_WRITE_DEF_DATA_LEN);
1302 if (!sent)
1303 return;
1304
1305 hdev->le_def_tx_len = le16_to_cpu(sent->tx_len);
1306 hdev->le_def_tx_time = le16_to_cpu(sent->tx_time);
1307}
1308
1309static void hci_cc_le_read_max_data_len(struct hci_dev *hdev,
1310 struct sk_buff *skb)
1311{
1312 struct hci_rp_le_read_max_data_len *rp = (void *) skb->data;
1313
1314 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1315
1316 if (rp->status)
1317 return;
1318
1319 hdev->le_max_tx_len = le16_to_cpu(rp->tx_len);
1320 hdev->le_max_tx_time = le16_to_cpu(rp->tx_time);
1321 hdev->le_max_rx_len = le16_to_cpu(rp->rx_len);
1322 hdev->le_max_rx_time = le16_to_cpu(rp->rx_time);
1323}
1324
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001325static void hci_cc_write_le_host_supported(struct hci_dev *hdev,
1326 struct sk_buff *skb)
Andre Guedesf9b49302011-06-30 19:20:53 -03001327{
Johan Hedberg06199cf2012-02-22 16:37:11 +02001328 struct hci_cp_write_le_host_supported *sent;
Andre Guedesf9b49302011-06-30 19:20:53 -03001329 __u8 status = *((__u8 *) skb->data);
1330
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001331 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedesf9b49302011-06-30 19:20:53 -03001332
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001333 if (status)
1334 return;
1335
Johan Hedberg06199cf2012-02-22 16:37:11 +02001336 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LE_HOST_SUPPORTED);
Johan Hedberg8f984df2012-02-28 01:07:22 +02001337 if (!sent)
Andre Guedesf9b49302011-06-30 19:20:53 -03001338 return;
1339
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301340 hci_dev_lock(hdev);
1341
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001342 if (sent->le) {
1343 hdev->features[1][0] |= LMP_HOST_LE;
Marcel Holtmanna1536da2015-03-13 02:11:01 -07001344 hci_dev_set_flag(hdev, HCI_LE_ENABLED);
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001345 } else {
1346 hdev->features[1][0] &= ~LMP_HOST_LE;
Marcel Holtmanna358dc12015-03-13 02:11:02 -07001347 hci_dev_clear_flag(hdev, HCI_LE_ENABLED);
1348 hci_dev_clear_flag(hdev, HCI_ADVERTISING);
Johan Hedberg8f984df2012-02-28 01:07:22 +02001349 }
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001350
1351 if (sent->simul)
1352 hdev->features[1][0] |= LMP_HOST_LE_BREDR;
1353 else
1354 hdev->features[1][0] &= ~LMP_HOST_LE_BREDR;
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301355
1356 hci_dev_unlock(hdev);
Andre Guedesf9b49302011-06-30 19:20:53 -03001357}
1358
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02001359static void hci_cc_set_adv_param(struct hci_dev *hdev, struct sk_buff *skb)
1360{
1361 struct hci_cp_le_set_adv_param *cp;
1362 u8 status = *((u8 *) skb->data);
1363
1364 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1365
1366 if (status)
1367 return;
1368
1369 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADV_PARAM);
1370 if (!cp)
1371 return;
1372
1373 hci_dev_lock(hdev);
1374 hdev->adv_addr_type = cp->own_address_type;
1375 hci_dev_unlock(hdev);
1376}
1377
Andrzej Kaczmarek5ae76a92014-05-08 15:32:08 +02001378static void hci_cc_read_rssi(struct hci_dev *hdev, struct sk_buff *skb)
1379{
1380 struct hci_rp_read_rssi *rp = (void *) skb->data;
1381 struct hci_conn *conn;
1382
1383 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1384
1385 if (rp->status)
1386 return;
1387
1388 hci_dev_lock(hdev);
1389
1390 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
1391 if (conn)
1392 conn->rssi = rp->rssi;
1393
1394 hci_dev_unlock(hdev);
1395}
1396
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001397static void hci_cc_read_tx_power(struct hci_dev *hdev, struct sk_buff *skb)
1398{
1399 struct hci_cp_read_tx_power *sent;
1400 struct hci_rp_read_tx_power *rp = (void *) skb->data;
1401 struct hci_conn *conn;
1402
1403 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1404
1405 if (rp->status)
1406 return;
1407
1408 sent = hci_sent_cmd_data(hdev, HCI_OP_READ_TX_POWER);
1409 if (!sent)
1410 return;
1411
1412 hci_dev_lock(hdev);
1413
1414 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
Andrzej Kaczmarekd0455ed2014-05-14 13:43:05 +02001415 if (!conn)
1416 goto unlock;
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001417
Andrzej Kaczmarekd0455ed2014-05-14 13:43:05 +02001418 switch (sent->type) {
1419 case 0x00:
1420 conn->tx_power = rp->tx_power;
1421 break;
1422 case 0x01:
1423 conn->max_tx_power = rp->tx_power;
1424 break;
1425 }
1426
1427unlock:
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001428 hci_dev_unlock(hdev);
1429}
1430
Marcel Holtmannc50b33c2015-01-31 15:07:52 -08001431static void hci_cc_write_ssp_debug_mode(struct hci_dev *hdev, struct sk_buff *skb)
1432{
1433 u8 status = *((u8 *) skb->data);
1434 u8 *mode;
1435
1436 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1437
1438 if (status)
1439 return;
1440
1441 mode = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SSP_DEBUG_MODE);
1442 if (mode)
1443 hdev->ssp_debug_mode = *mode;
1444}
1445
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001446static void hci_cs_inquiry(struct hci_dev *hdev, __u8 status)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001447{
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001448 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001449
1450 if (status) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001451 hci_conn_check_pending(hdev);
Johan Hedberg314b2382011-04-27 10:29:57 -04001452 return;
1453 }
1454
Andre Guedes89352e72011-11-04 14:16:53 -03001455 set_bit(HCI_INQUIRY, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001456}
1457
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001458static void hci_cs_create_conn(struct hci_dev *hdev, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001459{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001460 struct hci_cp_create_conn *cp;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001461 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001462
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001463 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001464
1465 cp = hci_sent_cmd_data(hdev, HCI_OP_CREATE_CONN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001466 if (!cp)
1467 return;
1468
1469 hci_dev_lock(hdev);
1470
1471 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
1472
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03001473 BT_DBG("%s bdaddr %pMR hcon %p", hdev->name, &cp->bdaddr, conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001474
1475 if (status) {
1476 if (conn && conn->state == BT_CONNECT) {
Marcel Holtmann4c67bc72006-10-15 17:30:56 +02001477 if (status != 0x0c || conn->attempt > 2) {
1478 conn->state = BT_CLOSED;
Johan Hedberg539c4962015-02-18 14:53:57 +02001479 hci_connect_cfm(conn, status);
Marcel Holtmann4c67bc72006-10-15 17:30:56 +02001480 hci_conn_del(conn);
1481 } else
1482 conn->state = BT_CONNECT2;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001483 }
1484 } else {
1485 if (!conn) {
Johan Hedberga5c4e302014-07-16 11:56:07 +03001486 conn = hci_conn_add(hdev, ACL_LINK, &cp->bdaddr,
1487 HCI_ROLE_MASTER);
1488 if (!conn)
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001489 bt_dev_err(hdev, "no memory for new connection");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001490 }
1491 }
1492
1493 hci_dev_unlock(hdev);
1494}
1495
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001496static void hci_cs_add_sco(struct hci_dev *hdev, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001497{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001498 struct hci_cp_add_sco *cp;
1499 struct hci_conn *acl, *sco;
1500 __u16 handle;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001501
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001502 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001503
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001504 if (!status)
1505 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001506
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001507 cp = hci_sent_cmd_data(hdev, HCI_OP_ADD_SCO);
1508 if (!cp)
1509 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001510
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001511 handle = __le16_to_cpu(cp->handle);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001512
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001513 BT_DBG("%s handle 0x%4.4x", hdev->name, handle);
Marcel Holtmann6bd57412006-11-18 22:14:22 +01001514
1515 hci_dev_lock(hdev);
1516
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001517 acl = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001518 if (acl) {
1519 sco = acl->link;
1520 if (sco) {
1521 sco->state = BT_CLOSED;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001522
Johan Hedberg539c4962015-02-18 14:53:57 +02001523 hci_connect_cfm(sco, status);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001524 hci_conn_del(sco);
1525 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001526 }
Marcel Holtmann6bd57412006-11-18 22:14:22 +01001527
1528 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001529}
1530
Marcel Holtmannf8558552008-07-14 20:13:49 +02001531static void hci_cs_auth_requested(struct hci_dev *hdev, __u8 status)
1532{
1533 struct hci_cp_auth_requested *cp;
1534 struct hci_conn *conn;
1535
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001536 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001537
1538 if (!status)
1539 return;
1540
1541 cp = hci_sent_cmd_data(hdev, HCI_OP_AUTH_REQUESTED);
1542 if (!cp)
1543 return;
1544
1545 hci_dev_lock(hdev);
1546
1547 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1548 if (conn) {
1549 if (conn->state == BT_CONFIG) {
Johan Hedberg539c4962015-02-18 14:53:57 +02001550 hci_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001551 hci_conn_drop(conn);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001552 }
1553 }
1554
1555 hci_dev_unlock(hdev);
1556}
1557
1558static void hci_cs_set_conn_encrypt(struct hci_dev *hdev, __u8 status)
1559{
1560 struct hci_cp_set_conn_encrypt *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_SET_CONN_ENCRYPT);
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
Johan Hedberg127178d2010-11-18 22:22:29 +02001585static int hci_outgoing_auth_needed(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -03001586 struct hci_conn *conn)
Johan Hedberg392599b2010-11-18 22:22:28 +02001587{
Johan Hedberg392599b2010-11-18 22:22:28 +02001588 if (conn->state != BT_CONFIG || !conn->out)
1589 return 0;
1590
Johan Hedberg765c2a92011-01-19 12:06:52 +05301591 if (conn->pending_sec_level == BT_SECURITY_SDP)
Johan Hedberg392599b2010-11-18 22:22:28 +02001592 return 0;
1593
1594 /* Only request authentication for SSP connections or non-SSP
Johan Hedberg264b8b42014-01-08 16:40:39 +02001595 * devices with sec_level MEDIUM or HIGH or if MITM protection
1596 * is requested.
1597 */
Gustavo Padovan807deac2012-05-17 00:36:24 -03001598 if (!hci_conn_ssp_enabled(conn) && !(conn->auth_type & 0x01) &&
Johan Hedberg7e3691e2014-05-30 14:45:19 +03001599 conn->pending_sec_level != BT_SECURITY_FIPS &&
Johan Hedberg264b8b42014-01-08 16:40:39 +02001600 conn->pending_sec_level != BT_SECURITY_HIGH &&
1601 conn->pending_sec_level != BT_SECURITY_MEDIUM)
Johan Hedberg392599b2010-11-18 22:22:28 +02001602 return 0;
1603
Johan Hedberg392599b2010-11-18 22:22:28 +02001604 return 1;
1605}
1606
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001607static int hci_resolve_name(struct hci_dev *hdev,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001608 struct inquiry_entry *e)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001609{
1610 struct hci_cp_remote_name_req cp;
1611
1612 memset(&cp, 0, sizeof(cp));
1613
1614 bacpy(&cp.bdaddr, &e->data.bdaddr);
1615 cp.pscan_rep_mode = e->data.pscan_rep_mode;
1616 cp.pscan_mode = e->data.pscan_mode;
1617 cp.clock_offset = e->data.clock_offset;
1618
1619 return hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
1620}
1621
Johan Hedbergb644ba32012-01-17 21:48:47 +02001622static bool hci_resolve_next_name(struct hci_dev *hdev)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001623{
1624 struct discovery_state *discov = &hdev->discovery;
1625 struct inquiry_entry *e;
1626
Johan Hedbergb644ba32012-01-17 21:48:47 +02001627 if (list_empty(&discov->resolve))
1628 return false;
1629
1630 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
Ram Malovanyc8100892012-07-19 10:26:09 +03001631 if (!e)
1632 return false;
1633
Johan Hedbergb644ba32012-01-17 21:48:47 +02001634 if (hci_resolve_name(hdev, e) == 0) {
1635 e->name_state = NAME_PENDING;
1636 return true;
1637 }
1638
1639 return false;
1640}
1641
1642static void hci_check_pending_name(struct hci_dev *hdev, struct hci_conn *conn,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001643 bdaddr_t *bdaddr, u8 *name, u8 name_len)
Johan Hedbergb644ba32012-01-17 21:48:47 +02001644{
1645 struct discovery_state *discov = &hdev->discovery;
1646 struct inquiry_entry *e;
1647
Johan Hedberg60cb49d2014-11-11 11:33:24 +02001648 /* Update the mgmt connected state if necessary. Be careful with
1649 * conn objects that exist but are not (yet) connected however.
1650 * Only those in BT_CONFIG or BT_CONNECTED states can be
1651 * considered connected.
1652 */
1653 if (conn &&
1654 (conn->state == BT_CONFIG || conn->state == BT_CONNECTED) &&
Jaganath Kanakkasserycb77c3e2014-11-07 16:39:09 +05301655 !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00001656 mgmt_device_connected(hdev, conn, 0, name, name_len);
Johan Hedbergb644ba32012-01-17 21:48:47 +02001657
1658 if (discov->state == DISCOVERY_STOPPED)
1659 return;
1660
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001661 if (discov->state == DISCOVERY_STOPPING)
1662 goto discov_complete;
1663
1664 if (discov->state != DISCOVERY_RESOLVING)
1665 return;
1666
1667 e = hci_inquiry_cache_lookup_resolve(hdev, bdaddr, NAME_PENDING);
Ram Malovany7cc83802012-07-19 10:26:10 +03001668 /* If the device was not found in a list of found devices names of which
1669 * are pending. there is no need to continue resolving a next name as it
1670 * will be done upon receiving another Remote Name Request Complete
1671 * Event */
1672 if (!e)
1673 return;
1674
1675 list_del(&e->list);
1676 if (name) {
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001677 e->name_state = NAME_KNOWN;
Ram Malovany7cc83802012-07-19 10:26:10 +03001678 mgmt_remote_name(hdev, bdaddr, ACL_LINK, 0x00,
1679 e->data.rssi, name, name_len);
Ram Malovanyc3e7c0d2012-07-19 10:26:11 +03001680 } else {
1681 e->name_state = NAME_NOT_KNOWN;
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001682 }
1683
Johan Hedbergb644ba32012-01-17 21:48:47 +02001684 if (hci_resolve_next_name(hdev))
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001685 return;
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001686
1687discov_complete:
1688 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
1689}
1690
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001691static void hci_cs_remote_name_req(struct hci_dev *hdev, __u8 status)
1692{
Johan Hedberg127178d2010-11-18 22:22:29 +02001693 struct hci_cp_remote_name_req *cp;
1694 struct hci_conn *conn;
1695
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001696 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Johan Hedberg127178d2010-11-18 22:22:29 +02001697
1698 /* If successful wait for the name req complete event before
1699 * checking for the need to do authentication */
1700 if (!status)
1701 return;
1702
1703 cp = hci_sent_cmd_data(hdev, HCI_OP_REMOTE_NAME_REQ);
1704 if (!cp)
1705 return;
1706
1707 hci_dev_lock(hdev);
1708
1709 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02001710
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001711 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedbergb644ba32012-01-17 21:48:47 +02001712 hci_check_pending_name(hdev, conn, &cp->bdaddr, NULL, 0);
1713
Johan Hedberg79c6c702011-04-28 11:28:55 -07001714 if (!conn)
1715 goto unlock;
1716
1717 if (!hci_outgoing_auth_needed(hdev, conn))
1718 goto unlock;
1719
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001720 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02001721 struct hci_cp_auth_requested auth_cp;
1722
Johan Hedberg977f8fc2014-07-17 15:35:39 +03001723 set_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags);
1724
Johannes Bergc1f23a22013-10-07 18:19:16 +02001725 auth_cp.handle = __cpu_to_le16(conn->handle);
1726 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED,
1727 sizeof(auth_cp), &auth_cp);
Johan Hedberg127178d2010-11-18 22:22:29 +02001728 }
1729
Johan Hedberg79c6c702011-04-28 11:28:55 -07001730unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02001731 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001732}
1733
Marcel Holtmann769be972008-07-14 20:13:49 +02001734static void hci_cs_read_remote_features(struct hci_dev *hdev, __u8 status)
1735{
1736 struct hci_cp_read_remote_features *cp;
1737 struct hci_conn *conn;
1738
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001739 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann769be972008-07-14 20:13:49 +02001740
1741 if (!status)
1742 return;
1743
1744 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_REMOTE_FEATURES);
1745 if (!cp)
1746 return;
1747
1748 hci_dev_lock(hdev);
1749
1750 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1751 if (conn) {
1752 if (conn->state == BT_CONFIG) {
Johan Hedberg539c4962015-02-18 14:53:57 +02001753 hci_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001754 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02001755 }
1756 }
1757
1758 hci_dev_unlock(hdev);
1759}
1760
1761static void hci_cs_read_remote_ext_features(struct hci_dev *hdev, __u8 status)
1762{
1763 struct hci_cp_read_remote_ext_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_EXT_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
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001788static void hci_cs_setup_sync_conn(struct hci_dev *hdev, __u8 status)
1789{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001790 struct hci_cp_setup_sync_conn *cp;
1791 struct hci_conn *acl, *sco;
1792 __u16 handle;
1793
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001794 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001795
1796 if (!status)
1797 return;
1798
1799 cp = hci_sent_cmd_data(hdev, HCI_OP_SETUP_SYNC_CONN);
1800 if (!cp)
1801 return;
1802
1803 handle = __le16_to_cpu(cp->handle);
1804
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001805 BT_DBG("%s handle 0x%4.4x", hdev->name, handle);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001806
1807 hci_dev_lock(hdev);
1808
1809 acl = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001810 if (acl) {
1811 sco = acl->link;
1812 if (sco) {
1813 sco->state = BT_CLOSED;
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001814
Johan Hedberg539c4962015-02-18 14:53:57 +02001815 hci_connect_cfm(sco, status);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001816 hci_conn_del(sco);
1817 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001818 }
1819
1820 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001821}
1822
1823static void hci_cs_sniff_mode(struct hci_dev *hdev, __u8 status)
1824{
1825 struct hci_cp_sniff_mode *cp;
1826 struct hci_conn *conn;
1827
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001828 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001829
1830 if (!status)
1831 return;
1832
1833 cp = hci_sent_cmd_data(hdev, HCI_OP_SNIFF_MODE);
1834 if (!cp)
1835 return;
1836
1837 hci_dev_lock(hdev);
1838
1839 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001840 if (conn) {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001841 clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001842
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001843 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001844 hci_sco_setup(conn, status);
1845 }
1846
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001847 hci_dev_unlock(hdev);
1848}
1849
1850static void hci_cs_exit_sniff_mode(struct hci_dev *hdev, __u8 status)
1851{
1852 struct hci_cp_exit_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_EXIT_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
Johan Hedberg88c3df12012-02-09 14:27:38 +02001877static void hci_cs_disconnect(struct hci_dev *hdev, u8 status)
1878{
1879 struct hci_cp_disconnect *cp;
1880 struct hci_conn *conn;
1881
1882 if (!status)
1883 return;
1884
1885 cp = hci_sent_cmd_data(hdev, HCI_OP_DISCONNECT);
1886 if (!cp)
1887 return;
1888
1889 hci_dev_lock(hdev);
1890
1891 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1892 if (conn)
1893 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001894 conn->dst_type, status);
Johan Hedberg88c3df12012-02-09 14:27:38 +02001895
1896 hci_dev_unlock(hdev);
1897}
1898
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02001899static void hci_cs_le_create_conn(struct hci_dev *hdev, u8 status)
1900{
1901 struct hci_cp_le_create_conn *cp;
1902 struct hci_conn *conn;
1903
1904 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1905
1906 /* All connection failure handling is taken care of by the
1907 * hci_le_conn_failed function which is triggered by the HCI
1908 * request completion callbacks used for connecting.
1909 */
1910 if (status)
1911 return;
1912
1913 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_CREATE_CONN);
1914 if (!cp)
1915 return;
1916
1917 hci_dev_lock(hdev);
1918
Johan Hedberg9d4c1cc2015-10-21 18:03:01 +03001919 conn = hci_conn_hash_lookup_le(hdev, &cp->peer_addr,
1920 cp->peer_addr_type);
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02001921 if (!conn)
1922 goto unlock;
1923
1924 /* Store the initiator and responder address information which
1925 * is needed for SMP. These values will not change during the
1926 * lifetime of the connection.
1927 */
1928 conn->init_addr_type = cp->own_address_type;
1929 if (cp->own_address_type == ADDR_LE_DEV_RANDOM)
1930 bacpy(&conn->init_addr, &hdev->random_addr);
1931 else
1932 bacpy(&conn->init_addr, &hdev->bdaddr);
1933
1934 conn->resp_addr_type = cp->peer_addr_type;
1935 bacpy(&conn->resp_addr, &cp->peer_addr);
1936
Johan Hedberg9489eca2014-02-28 17:45:46 +02001937 /* We don't want the connection attempt to stick around
1938 * indefinitely since LE doesn't have a page timeout concept
1939 * like BR/EDR. Set a timer for any connection that doesn't use
1940 * the white list for connecting.
1941 */
1942 if (cp->filter_policy == HCI_LE_USE_PEER_ADDR)
1943 queue_delayed_work(conn->hdev->workqueue,
1944 &conn->le_conn_timeout,
Johan Hedberg09ae2602014-07-06 13:41:15 +03001945 conn->conn_timeout);
Johan Hedberg9489eca2014-02-28 17:45:46 +02001946
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02001947unlock:
1948 hci_dev_unlock(hdev);
1949}
1950
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07001951static void hci_cs_le_read_remote_features(struct hci_dev *hdev, u8 status)
1952{
1953 struct hci_cp_le_read_remote_features *cp;
1954 struct hci_conn *conn;
1955
1956 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1957
1958 if (!status)
1959 return;
1960
1961 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_READ_REMOTE_FEATURES);
1962 if (!cp)
1963 return;
1964
1965 hci_dev_lock(hdev);
1966
1967 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1968 if (conn) {
1969 if (conn->state == BT_CONFIG) {
1970 hci_connect_cfm(conn, status);
1971 hci_conn_drop(conn);
1972 }
1973 }
1974
1975 hci_dev_unlock(hdev);
1976}
1977
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02001978static void hci_cs_le_start_enc(struct hci_dev *hdev, u8 status)
1979{
1980 struct hci_cp_le_start_enc *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 hci_dev_lock(hdev);
1989
1990 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_START_ENC);
1991 if (!cp)
1992 goto unlock;
1993
1994 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1995 if (!conn)
1996 goto unlock;
1997
1998 if (conn->state != BT_CONNECTED)
1999 goto unlock;
2000
2001 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
2002 hci_conn_drop(conn);
2003
2004unlock:
2005 hci_dev_unlock(hdev);
2006}
2007
Kuba Pawlak50fc85f2014-11-06 19:36:52 +01002008static void hci_cs_switch_role(struct hci_dev *hdev, u8 status)
2009{
2010 struct hci_cp_switch_role *cp;
2011 struct hci_conn *conn;
2012
2013 BT_DBG("%s status 0x%2.2x", hdev->name, status);
2014
2015 if (!status)
2016 return;
2017
2018 cp = hci_sent_cmd_data(hdev, HCI_OP_SWITCH_ROLE);
2019 if (!cp)
2020 return;
2021
2022 hci_dev_lock(hdev);
2023
2024 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
2025 if (conn)
2026 clear_bit(HCI_CONN_RSWITCH_PEND, &conn->flags);
2027
2028 hci_dev_unlock(hdev);
2029}
2030
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002031static void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002032{
2033 __u8 status = *((__u8 *) skb->data);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002034 struct discovery_state *discov = &hdev->discovery;
2035 struct inquiry_entry *e;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002036
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002037 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002038
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002039 hci_conn_check_pending(hdev);
Andre Guedes89352e72011-11-04 14:16:53 -03002040
2041 if (!test_and_clear_bit(HCI_INQUIRY, &hdev->flags))
2042 return;
2043
Peter Zijlstra4e857c52014-03-17 18:06:10 +01002044 smp_mb__after_atomic(); /* wake_up_bit advises about this barrier */
Andre Guedes3e13fa12013-03-27 20:04:56 -03002045 wake_up_bit(&hdev->flags, HCI_INQUIRY);
2046
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002047 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002048 return;
2049
Johan Hedberg56e5cb82011-11-08 20:40:16 +02002050 hci_dev_lock(hdev);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002051
Andre Guedes343f9352012-02-17 20:39:37 -03002052 if (discov->state != DISCOVERY_FINDING)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002053 goto unlock;
2054
2055 if (list_empty(&discov->resolve)) {
Jakub Pawlowski07d23342015-03-17 09:04:14 -07002056 /* When BR/EDR inquiry is active and no LE scanning is in
2057 * progress, then change discovery state to indicate completion.
2058 *
2059 * When running LE scanning and BR/EDR inquiry simultaneously
2060 * and the LE scan already finished, then change the discovery
2061 * state to indicate completion.
2062 */
2063 if (!hci_dev_test_flag(hdev, HCI_LE_SCAN) ||
2064 !test_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks))
2065 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002066 goto unlock;
2067 }
2068
2069 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
2070 if (e && hci_resolve_name(hdev, e) == 0) {
2071 e->name_state = NAME_PENDING;
2072 hci_discovery_set_state(hdev, DISCOVERY_RESOLVING);
2073 } else {
Jakub Pawlowski07d23342015-03-17 09:04:14 -07002074 /* When BR/EDR inquiry is active and no LE scanning is in
2075 * progress, then change discovery state to indicate completion.
2076 *
2077 * When running LE scanning and BR/EDR inquiry simultaneously
2078 * and the LE scan already finished, then change the discovery
2079 * state to indicate completion.
2080 */
2081 if (!hci_dev_test_flag(hdev, HCI_LE_SCAN) ||
2082 !test_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks))
2083 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002084 }
2085
2086unlock:
Johan Hedberg56e5cb82011-11-08 20:40:16 +02002087 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002088}
2089
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002090static void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002091{
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002092 struct inquiry_data data;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002093 struct inquiry_info *info = (void *) (skb->data + 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002094 int num_rsp = *((__u8 *) skb->data);
2095
2096 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
2097
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002098 if (!num_rsp)
2099 return;
2100
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002101 if (hci_dev_test_flag(hdev, HCI_PERIODIC_INQ))
Andre Guedes1519cc12012-03-21 00:03:38 -03002102 return;
2103
Linus Torvalds1da177e2005-04-16 15:20:36 -07002104 hci_dev_lock(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002105
Johan Hedberge17acd42011-03-30 23:57:16 +03002106 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02002107 u32 flags;
Johan Hedberg31754052012-01-04 13:39:52 +02002108
Linus Torvalds1da177e2005-04-16 15:20:36 -07002109 bacpy(&data.bdaddr, &info->bdaddr);
2110 data.pscan_rep_mode = info->pscan_rep_mode;
2111 data.pscan_period_mode = info->pscan_period_mode;
2112 data.pscan_mode = info->pscan_mode;
2113 memcpy(data.dev_class, info->dev_class, 3);
2114 data.clock_offset = info->clock_offset;
Marcel Holtmannefb25132014-12-05 13:03:34 +01002115 data.rssi = HCI_RSSI_INVALID;
Marcel Holtmann41a96212008-07-14 20:13:48 +02002116 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02002117
Marcel Holtmannaf589252014-07-01 14:11:20 +02002118 flags = hci_inquiry_cache_update(hdev, &data, false);
2119
Johan Hedberg48264f02011-11-09 13:58:58 +02002120 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Marcel Holtmannefb25132014-12-05 13:03:34 +01002121 info->dev_class, HCI_RSSI_INVALID,
2122 flags, NULL, 0, NULL, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002123 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002124
Linus Torvalds1da177e2005-04-16 15:20:36 -07002125 hci_dev_unlock(hdev);
2126}
2127
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002128static void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002129{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002130 struct hci_ev_conn_complete *ev = (void *) skb->data;
2131 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002132
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002133 BT_DBG("%s", hdev->name);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002134
Linus Torvalds1da177e2005-04-16 15:20:36 -07002135 hci_dev_lock(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002136
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002137 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann94992372009-04-19 19:30:03 +02002138 if (!conn) {
2139 if (ev->link_type != SCO_LINK)
2140 goto unlock;
2141
2142 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
2143 if (!conn)
2144 goto unlock;
2145
2146 conn->type = SCO_LINK;
2147 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002148
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002149 if (!ev->status) {
2150 conn->handle = __le16_to_cpu(ev->handle);
Marcel Holtmann769be972008-07-14 20:13:49 +02002151
2152 if (conn->type == ACL_LINK) {
2153 conn->state = BT_CONFIG;
2154 hci_conn_hold(conn);
Szymon Janca9ea3ed2012-07-19 14:46:08 +02002155
2156 if (!conn->out && !hci_conn_ssp_enabled(conn) &&
2157 !hci_find_link_key(hdev, &ev->bdaddr))
2158 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
2159 else
2160 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
Marcel Holtmann769be972008-07-14 20:13:49 +02002161 } else
2162 conn->state = BT_CONNECTED;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002163
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01002164 hci_debugfs_create_conn(conn);
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02002165 hci_conn_add_sysfs(conn);
2166
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002167 if (test_bit(HCI_AUTH, &hdev->flags))
Johan Hedberg4dae2792014-06-24 17:03:50 +03002168 set_bit(HCI_CONN_AUTH, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002169
2170 if (test_bit(HCI_ENCRYPT, &hdev->flags))
Johan Hedberg4dae2792014-06-24 17:03:50 +03002171 set_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002172
2173 /* Get remote features */
2174 if (conn->type == ACL_LINK) {
2175 struct hci_cp_read_remote_features cp;
2176 cp.handle = ev->handle;
Marcel Holtmann769be972008-07-14 20:13:49 +02002177 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_FEATURES,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002178 sizeof(cp), &cp);
Johan Hedberg22f433d2014-08-01 11:13:32 +03002179
Johan Hedberg01b1cb82015-11-16 12:52:21 +02002180 hci_req_update_scan(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002181 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002182
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002183 /* Set packet type for incoming connection */
Andrei Emeltchenkod095c1e2011-12-01 14:33:27 +02002184 if (!conn->out && hdev->hci_ver < BLUETOOTH_VER_2_0) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002185 struct hci_cp_change_conn_ptype cp;
2186 cp.handle = ev->handle;
Marcel Holtmanna8746412008-07-14 20:13:46 +02002187 cp.pkt_type = cpu_to_le16(conn->pkt_type);
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002188 hci_send_cmd(hdev, HCI_OP_CHANGE_CONN_PTYPE, sizeof(cp),
2189 &cp);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002190 }
Johan Hedberg17d5c042011-01-22 06:09:08 +02002191 } else {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002192 conn->state = BT_CLOSED;
Johan Hedberg17d5c042011-01-22 06:09:08 +02002193 if (conn->type == ACL_LINK)
Marcel Holtmann64c7b772014-02-18 14:22:20 -08002194 mgmt_connect_failed(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002195 conn->dst_type, ev->status);
Johan Hedberg17d5c042011-01-22 06:09:08 +02002196 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002197
Marcel Holtmanne73439d2010-07-26 10:06:00 -04002198 if (conn->type == ACL_LINK)
2199 hci_sco_setup(conn, ev->status);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002200
Marcel Holtmann769be972008-07-14 20:13:49 +02002201 if (ev->status) {
Johan Hedberg539c4962015-02-18 14:53:57 +02002202 hci_connect_cfm(conn, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002203 hci_conn_del(conn);
Marcel Holtmannc89b6e62009-01-15 21:57:03 +01002204 } else if (ev->link_type != ACL_LINK)
Johan Hedberg539c4962015-02-18 14:53:57 +02002205 hci_connect_cfm(conn, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002206
2207unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002208 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002209
2210 hci_conn_check_pending(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002211}
2212
Johan Hedberg70c46422014-07-09 12:59:17 +03002213static void hci_reject_conn(struct hci_dev *hdev, bdaddr_t *bdaddr)
2214{
2215 struct hci_cp_reject_conn_req cp;
2216
2217 bacpy(&cp.bdaddr, bdaddr);
2218 cp.reason = HCI_ERROR_REJ_BAD_ADDR;
2219 hci_send_cmd(hdev, HCI_OP_REJECT_CONN_REQ, sizeof(cp), &cp);
2220}
2221
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002222static void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002223{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002224 struct hci_ev_conn_request *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002225 int mask = hdev->link_mode;
Johan Hedberg70c46422014-07-09 12:59:17 +03002226 struct inquiry_entry *ie;
2227 struct hci_conn *conn;
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002228 __u8 flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002229
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03002230 BT_DBG("%s bdaddr %pMR type 0x%x", hdev->name, &ev->bdaddr,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002231 ev->link_type);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002232
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002233 mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, ev->link_type,
2234 &flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002235
Johan Hedberg70c46422014-07-09 12:59:17 +03002236 if (!(mask & HCI_LM_ACCEPT)) {
2237 hci_reject_conn(hdev, &ev->bdaddr);
2238 return;
2239 }
2240
Johan Hedberg46c4c942014-07-16 16:19:21 +03002241 if (hci_bdaddr_list_lookup(&hdev->blacklist, &ev->bdaddr,
2242 BDADDR_BREDR)) {
2243 hci_reject_conn(hdev, &ev->bdaddr);
2244 return;
2245 }
2246
Johan Hedberg6a8fc952014-12-24 20:43:11 +02002247 /* Require HCI_CONNECTABLE or a whitelist entry to accept the
2248 * connection. These features are only touched through mgmt so
2249 * only do the checks if HCI_MGMT is set.
2250 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002251 if (hci_dev_test_flag(hdev, HCI_MGMT) &&
2252 !hci_dev_test_flag(hdev, HCI_CONNECTABLE) &&
Johan Hedberg46c4c942014-07-16 16:19:21 +03002253 !hci_bdaddr_list_lookup(&hdev->whitelist, &ev->bdaddr,
2254 BDADDR_BREDR)) {
2255 hci_reject_conn(hdev, &ev->bdaddr);
2256 return;
Johan Hedberg70c46422014-07-09 12:59:17 +03002257 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002258
Johan Hedberg70c46422014-07-09 12:59:17 +03002259 /* Connection accepted */
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002260
Johan Hedberg70c46422014-07-09 12:59:17 +03002261 hci_dev_lock(hdev);
Marcel Holtmannc7bdd502008-07-14 20:13:47 +02002262
Johan Hedberg70c46422014-07-09 12:59:17 +03002263 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
2264 if (ie)
2265 memcpy(ie->data.dev_class, ev->dev_class, 3);
2266
2267 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type,
2268 &ev->bdaddr);
2269 if (!conn) {
Johan Hedberga5c4e302014-07-16 11:56:07 +03002270 conn = hci_conn_add(hdev, ev->link_type, &ev->bdaddr,
2271 HCI_ROLE_SLAVE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002272 if (!conn) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002273 bt_dev_err(hdev, "no memory for new connection");
Johan Hedberg70c46422014-07-09 12:59:17 +03002274 hci_dev_unlock(hdev);
2275 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002276 }
Johan Hedberg70c46422014-07-09 12:59:17 +03002277 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002278
Johan Hedberg70c46422014-07-09 12:59:17 +03002279 memcpy(conn->dev_class, ev->dev_class, 3);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002280
Johan Hedberg70c46422014-07-09 12:59:17 +03002281 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002282
Johan Hedberg70c46422014-07-09 12:59:17 +03002283 if (ev->link_type == ACL_LINK ||
2284 (!(flags & HCI_PROTO_DEFER) && !lmp_esco_capable(hdev))) {
2285 struct hci_cp_accept_conn_req cp;
2286 conn->state = BT_CONNECT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002287
2288 bacpy(&cp.bdaddr, &ev->bdaddr);
Johan Hedberg70c46422014-07-09 12:59:17 +03002289
2290 if (lmp_rswitch_capable(hdev) && (mask & HCI_LM_MASTER))
2291 cp.role = 0x00; /* Become master */
2292 else
2293 cp.role = 0x01; /* Remain slave */
2294
2295 hci_send_cmd(hdev, HCI_OP_ACCEPT_CONN_REQ, sizeof(cp), &cp);
2296 } else if (!(flags & HCI_PROTO_DEFER)) {
2297 struct hci_cp_accept_sync_conn_req cp;
2298 conn->state = BT_CONNECT;
2299
2300 bacpy(&cp.bdaddr, &ev->bdaddr);
2301 cp.pkt_type = cpu_to_le16(conn->pkt_type);
2302
2303 cp.tx_bandwidth = cpu_to_le32(0x00001f40);
2304 cp.rx_bandwidth = cpu_to_le32(0x00001f40);
2305 cp.max_latency = cpu_to_le16(0xffff);
2306 cp.content_format = cpu_to_le16(hdev->voice_setting);
2307 cp.retrans_effort = 0xff;
2308
2309 hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ, sizeof(cp),
2310 &cp);
2311 } else {
2312 conn->state = BT_CONNECT2;
Johan Hedberg539c4962015-02-18 14:53:57 +02002313 hci_connect_cfm(conn, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002314 }
2315}
2316
Mikel Astizf0d6a0e2012-08-09 09:52:30 +02002317static u8 hci_to_mgmt_reason(u8 err)
2318{
2319 switch (err) {
2320 case HCI_ERROR_CONNECTION_TIMEOUT:
2321 return MGMT_DEV_DISCONN_TIMEOUT;
2322 case HCI_ERROR_REMOTE_USER_TERM:
2323 case HCI_ERROR_REMOTE_LOW_RESOURCES:
2324 case HCI_ERROR_REMOTE_POWER_OFF:
2325 return MGMT_DEV_DISCONN_REMOTE;
2326 case HCI_ERROR_LOCAL_HOST_TERM:
2327 return MGMT_DEV_DISCONN_LOCAL_HOST;
2328 default:
2329 return MGMT_DEV_DISCONN_UNKNOWN;
2330 }
2331}
2332
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002333static void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002334{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002335 struct hci_ev_disconn_complete *ev = (void *) skb->data;
Szymon Janc160b9252016-07-12 02:12:16 +02002336 u8 reason;
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002337 struct hci_conn_params *params;
Marcel Holtmann04837f62006-07-03 10:02:33 +02002338 struct hci_conn *conn;
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002339 bool mgmt_connected;
Andre Guedes38462202013-11-07 17:36:10 -03002340 u8 type;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002341
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002342 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002343
Linus Torvalds1da177e2005-04-16 15:20:36 -07002344 hci_dev_lock(hdev);
2345
Marcel Holtmann04837f62006-07-03 10:02:33 +02002346 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergf7520542011-01-20 12:34:39 +02002347 if (!conn)
2348 goto unlock;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02002349
Andre Guedesabf54a52013-11-07 17:36:09 -03002350 if (ev->status) {
2351 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
2352 conn->dst_type, ev->status);
2353 goto unlock;
Johan Hedberg37d9ef72011-11-10 15:54:39 +02002354 }
Johan Hedbergf7520542011-01-20 12:34:39 +02002355
Andre Guedes38462202013-11-07 17:36:10 -03002356 conn->state = BT_CLOSED;
2357
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002358 mgmt_connected = test_and_clear_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags);
Szymon Janc160b9252016-07-12 02:12:16 +02002359
2360 if (test_bit(HCI_CONN_AUTH_FAILURE, &conn->flags))
2361 reason = MGMT_DEV_DISCONN_AUTH_FAILURE;
2362 else
2363 reason = hci_to_mgmt_reason(ev->reason);
2364
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002365 mgmt_device_disconnected(hdev, &conn->dst, conn->type, conn->dst_type,
2366 reason, mgmt_connected);
Andre Guedesabf54a52013-11-07 17:36:09 -03002367
Johan Hedberg22f433d2014-08-01 11:13:32 +03002368 if (conn->type == ACL_LINK) {
2369 if (test_bit(HCI_CONN_FLUSH_KEY, &conn->flags))
2370 hci_remove_link_key(hdev, &conn->dst);
2371
Johan Hedberg01b1cb82015-11-16 12:52:21 +02002372 hci_req_update_scan(hdev);
Johan Hedberg22f433d2014-08-01 11:13:32 +03002373 }
Johan Hedberg22102462013-10-05 12:01:06 +02002374
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002375 params = hci_conn_params_lookup(hdev, &conn->dst, conn->dst_type);
2376 if (params) {
2377 switch (params->auto_connect) {
2378 case HCI_AUTO_CONN_LINK_LOSS:
2379 if (ev->reason != HCI_ERROR_CONNECTION_TIMEOUT)
2380 break;
2381 /* Fall through */
2382
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02002383 case HCI_AUTO_CONN_DIRECT:
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002384 case HCI_AUTO_CONN_ALWAYS:
Johan Hedberg418025d2014-07-04 12:37:24 +03002385 list_del_init(&params->action);
2386 list_add(&params->action, &hdev->pend_le_conns);
2387 hci_update_background_scan(hdev);
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002388 break;
2389
2390 default:
2391 break;
2392 }
2393 }
2394
Andre Guedes38462202013-11-07 17:36:10 -03002395 type = conn->type;
Johan Hedberg22102462013-10-05 12:01:06 +02002396
Johan Hedberg3a6d5762015-02-18 14:53:58 +02002397 hci_disconn_cfm(conn, ev->reason);
Andre Guedes38462202013-11-07 17:36:10 -03002398 hci_conn_del(conn);
2399
2400 /* Re-enable advertising if necessary, since it might
2401 * have been disabled by the connection. From the
2402 * HCI_LE_Set_Advertise_Enable command description in
2403 * the core specification (v4.0):
2404 * "The Controller shall continue advertising until the Host
2405 * issues an LE_Set_Advertise_Enable command with
2406 * Advertising_Enable set to 0x00 (Advertising is disabled)
2407 * or until a connection is created or until the Advertising
2408 * is timed out due to Directed Advertising."
2409 */
2410 if (type == LE_LINK)
Johan Hedbergf2252572015-11-18 12:49:20 +02002411 hci_req_reenable_advertising(hdev);
Johan Hedbergf7520542011-01-20 12:34:39 +02002412
2413unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002414 hci_dev_unlock(hdev);
2415}
2416
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002417static void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002418{
2419 struct hci_ev_auth_complete *ev = (void *) skb->data;
2420 struct hci_conn *conn;
2421
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002422 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002423
2424 hci_dev_lock(hdev);
2425
2426 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002427 if (!conn)
2428 goto unlock;
2429
2430 if (!ev->status) {
Szymon Janc160b9252016-07-12 02:12:16 +02002431 clear_bit(HCI_CONN_AUTH_FAILURE, &conn->flags);
2432
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002433 if (!hci_conn_ssp_enabled(conn) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03002434 test_bit(HCI_CONN_REAUTH_PEND, &conn->flags)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002435 bt_dev_info(hdev, "re-auth of legacy device is not possible.");
Johan Hedberg2a611692011-02-19 12:06:00 -03002436 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002437 set_bit(HCI_CONN_AUTH, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002438 conn->sec_level = conn->pending_sec_level;
Johan Hedberg2a611692011-02-19 12:06:00 -03002439 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002440 } else {
Szymon Janc160b9252016-07-12 02:12:16 +02002441 if (ev->status == HCI_ERROR_PIN_OR_KEY_MISSING)
2442 set_bit(HCI_CONN_AUTH_FAILURE, &conn->flags);
2443
Johan Hedberge1e930f2014-09-08 17:09:49 -07002444 mgmt_auth_failed(conn, ev->status);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002445 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002446
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002447 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
2448 clear_bit(HCI_CONN_REAUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002449
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002450 if (conn->state == BT_CONFIG) {
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002451 if (!ev->status && hci_conn_ssp_enabled(conn)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002452 struct hci_cp_set_conn_encrypt cp;
2453 cp.handle = ev->handle;
2454 cp.encrypt = 0x01;
2455 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002456 &cp);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002457 } else {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002458 conn->state = BT_CONNECTED;
Johan Hedberg539c4962015-02-18 14:53:57 +02002459 hci_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002460 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002461 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002462 } else {
2463 hci_auth_cfm(conn, ev->status);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002464
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002465 hci_conn_hold(conn);
2466 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02002467 hci_conn_drop(conn);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002468 }
2469
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002470 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002471 if (!ev->status) {
2472 struct hci_cp_set_conn_encrypt cp;
2473 cp.handle = ev->handle;
2474 cp.encrypt = 0x01;
2475 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002476 &cp);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002477 } else {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002478 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002479 hci_encrypt_cfm(conn, ev->status, 0x00);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002480 }
2481 }
2482
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002483unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002484 hci_dev_unlock(hdev);
2485}
2486
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002487static void hci_remote_name_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002488{
Johan Hedberg127178d2010-11-18 22:22:29 +02002489 struct hci_ev_remote_name *ev = (void *) skb->data;
2490 struct hci_conn *conn;
2491
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002492 BT_DBG("%s", hdev->name);
2493
2494 hci_conn_check_pending(hdev);
Johan Hedberg127178d2010-11-18 22:22:29 +02002495
2496 hci_dev_lock(hdev);
2497
2498 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002499
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002500 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedbergb644ba32012-01-17 21:48:47 +02002501 goto check_auth;
2502
2503 if (ev->status == 0)
2504 hci_check_pending_name(hdev, conn, &ev->bdaddr, ev->name,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002505 strnlen(ev->name, HCI_MAX_NAME_LENGTH));
Johan Hedbergb644ba32012-01-17 21:48:47 +02002506 else
2507 hci_check_pending_name(hdev, conn, &ev->bdaddr, NULL, 0);
2508
2509check_auth:
Johan Hedberg79c6c702011-04-28 11:28:55 -07002510 if (!conn)
2511 goto unlock;
2512
2513 if (!hci_outgoing_auth_needed(hdev, conn))
2514 goto unlock;
2515
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002516 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002517 struct hci_cp_auth_requested cp;
Johan Hedberg977f8fc2014-07-17 15:35:39 +03002518
2519 set_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags);
2520
Johan Hedberg127178d2010-11-18 22:22:29 +02002521 cp.handle = __cpu_to_le16(conn->handle);
2522 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED, sizeof(cp), &cp);
2523 }
2524
Johan Hedberg79c6c702011-04-28 11:28:55 -07002525unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02002526 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002527}
2528
Johan Hedberg821f3762015-06-11 13:52:29 +03002529static void read_enc_key_size_complete(struct hci_dev *hdev, u8 status,
2530 u16 opcode, struct sk_buff *skb)
2531{
2532 const struct hci_rp_read_enc_key_size *rp;
2533 struct hci_conn *conn;
2534 u16 handle;
2535
2536 BT_DBG("%s status 0x%02x", hdev->name, status);
2537
2538 if (!skb || skb->len < sizeof(*rp)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002539 bt_dev_err(hdev, "invalid read key size response");
Johan Hedberg821f3762015-06-11 13:52:29 +03002540 return;
2541 }
2542
2543 rp = (void *)skb->data;
2544 handle = le16_to_cpu(rp->handle);
2545
2546 hci_dev_lock(hdev);
2547
2548 conn = hci_conn_hash_lookup_handle(hdev, handle);
2549 if (!conn)
2550 goto unlock;
2551
2552 /* If we fail to read the encryption key size, assume maximum
2553 * (which is the same we do also when this HCI command isn't
2554 * supported.
2555 */
2556 if (rp->status) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002557 bt_dev_err(hdev, "failed to read key size for handle %u",
2558 handle);
Johan Hedberg821f3762015-06-11 13:52:29 +03002559 conn->enc_key_size = HCI_LINK_KEY_SIZE;
2560 } else {
2561 conn->enc_key_size = rp->key_size;
2562 }
2563
2564 if (conn->state == BT_CONFIG) {
2565 conn->state = BT_CONNECTED;
2566 hci_connect_cfm(conn, 0);
2567 hci_conn_drop(conn);
2568 } else {
2569 u8 encrypt;
2570
2571 if (!test_bit(HCI_CONN_ENCRYPT, &conn->flags))
2572 encrypt = 0x00;
Johan Hedberg5d667ef2015-06-12 13:04:47 +03002573 else if (test_bit(HCI_CONN_AES_CCM, &conn->flags))
Johan Hedberg821f3762015-06-11 13:52:29 +03002574 encrypt = 0x02;
2575 else
2576 encrypt = 0x01;
2577
2578 hci_encrypt_cfm(conn, 0, encrypt);
2579 }
2580
2581unlock:
2582 hci_dev_unlock(hdev);
2583}
2584
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002585static void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002586{
2587 struct hci_ev_encrypt_change *ev = (void *) skb->data;
2588 struct hci_conn *conn;
2589
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002590 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002591
2592 hci_dev_lock(hdev);
2593
2594 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002595 if (!conn)
2596 goto unlock;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002597
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002598 if (!ev->status) {
2599 if (ev->encrypt) {
2600 /* Encryption implies authentication */
Johan Hedberg4dae2792014-06-24 17:03:50 +03002601 set_bit(HCI_CONN_AUTH, &conn->flags);
2602 set_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002603 conn->sec_level = conn->pending_sec_level;
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002604
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002605 /* P-256 authentication key implies FIPS */
2606 if (conn->key_type == HCI_LK_AUTH_COMBINATION_P256)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002607 set_bit(HCI_CONN_FIPS, &conn->flags);
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002608
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002609 if ((conn->type == ACL_LINK && ev->encrypt == 0x02) ||
2610 conn->type == LE_LINK)
2611 set_bit(HCI_CONN_AES_CCM, &conn->flags);
2612 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002613 clear_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002614 clear_bit(HCI_CONN_AES_CCM, &conn->flags);
2615 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002616 }
2617
Johan Hedberg7ed3fa22014-09-10 22:16:35 -07002618 /* We should disregard the current RPA and generate a new one
2619 * whenever the encryption procedure fails.
2620 */
2621 if (ev->status && conn->type == LE_LINK)
Marcel Holtmanna1536da2015-03-13 02:11:01 -07002622 hci_dev_set_flag(hdev, HCI_RPA_EXPIRED);
Johan Hedberg7ed3fa22014-09-10 22:16:35 -07002623
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002624 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
2625
2626 if (ev->status && conn->state == BT_CONNECTED) {
Szymon Janc160b9252016-07-12 02:12:16 +02002627 if (ev->status == HCI_ERROR_PIN_OR_KEY_MISSING)
2628 set_bit(HCI_CONN_AUTH_FAILURE, &conn->flags);
2629
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002630 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
2631 hci_conn_drop(conn);
2632 goto unlock;
2633 }
2634
Johan Hedberg035ad622015-06-11 13:52:28 +03002635 /* In Secure Connections Only mode, do not allow any connections
2636 * that are not encrypted with AES-CCM using a P-256 authenticated
2637 * combination key.
2638 */
2639 if (hci_dev_test_flag(hdev, HCI_SC_ONLY) &&
2640 (!test_bit(HCI_CONN_AES_CCM, &conn->flags) ||
2641 conn->key_type != HCI_LK_AUTH_COMBINATION_P256)) {
2642 hci_connect_cfm(conn, HCI_ERROR_AUTH_FAILURE);
2643 hci_conn_drop(conn);
2644 goto unlock;
2645 }
2646
Johan Hedberg821f3762015-06-11 13:52:29 +03002647 /* Try reading the encryption key size for encrypted ACL links */
2648 if (!ev->status && ev->encrypt && conn->type == ACL_LINK) {
2649 struct hci_cp_read_enc_key_size cp;
2650 struct hci_request req;
2651
2652 /* Only send HCI_Read_Encryption_Key_Size if the
2653 * controller really supports it. If it doesn't, assume
2654 * the default size (16).
2655 */
2656 if (!(hdev->commands[20] & 0x10)) {
2657 conn->enc_key_size = HCI_LINK_KEY_SIZE;
2658 goto notify;
2659 }
2660
2661 hci_req_init(&req, hdev);
2662
2663 cp.handle = cpu_to_le16(conn->handle);
2664 hci_req_add(&req, HCI_OP_READ_ENC_KEY_SIZE, sizeof(cp), &cp);
2665
2666 if (hci_req_run_skb(&req, read_enc_key_size_complete)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002667 bt_dev_err(hdev, "sending read key size failed");
Johan Hedberg821f3762015-06-11 13:52:29 +03002668 conn->enc_key_size = HCI_LINK_KEY_SIZE;
2669 goto notify;
2670 }
2671
2672 goto unlock;
2673 }
2674
2675notify:
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002676 if (conn->state == BT_CONFIG) {
2677 if (!ev->status)
2678 conn->state = BT_CONNECTED;
2679
Johan Hedberg539c4962015-02-18 14:53:57 +02002680 hci_connect_cfm(conn, ev->status);
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002681 hci_conn_drop(conn);
2682 } else
2683 hci_encrypt_cfm(conn, ev->status, ev->encrypt);
2684
Gustavo Padovana7d77232012-05-13 03:20:07 -03002685unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002686 hci_dev_unlock(hdev);
2687}
2688
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002689static void hci_change_link_key_complete_evt(struct hci_dev *hdev,
2690 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002691{
2692 struct hci_ev_change_link_key_complete *ev = (void *) skb->data;
2693 struct hci_conn *conn;
2694
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002695 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002696
2697 hci_dev_lock(hdev);
2698
2699 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
2700 if (conn) {
2701 if (!ev->status)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002702 set_bit(HCI_CONN_SECURE, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002703
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002704 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002705
2706 hci_key_change_cfm(conn, ev->status);
2707 }
2708
2709 hci_dev_unlock(hdev);
2710}
2711
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002712static void hci_remote_features_evt(struct hci_dev *hdev,
2713 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002714{
2715 struct hci_ev_remote_features *ev = (void *) skb->data;
2716 struct hci_conn *conn;
2717
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002718 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002719
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002720 hci_dev_lock(hdev);
2721
2722 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02002723 if (!conn)
2724 goto unlock;
Marcel Holtmann769be972008-07-14 20:13:49 +02002725
Johan Hedbergccd556f2010-11-10 17:11:51 +02002726 if (!ev->status)
Johan Hedbergcad718e2013-04-17 15:00:51 +03002727 memcpy(conn->features[0], ev->features, 8);
Johan Hedbergccd556f2010-11-10 17:11:51 +02002728
2729 if (conn->state != BT_CONFIG)
2730 goto unlock;
2731
Szymon Jancac363cf2015-01-29 16:36:59 +01002732 if (!ev->status && lmp_ext_feat_capable(hdev) &&
2733 lmp_ext_feat_capable(conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02002734 struct hci_cp_read_remote_ext_features cp;
2735 cp.handle = ev->handle;
2736 cp.page = 0x01;
2737 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002738 sizeof(cp), &cp);
Johan Hedberg392599b2010-11-18 22:22:28 +02002739 goto unlock;
2740 }
2741
Johan Hedberg671267b2012-05-12 16:11:50 -03002742 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002743 struct hci_cp_remote_name_req cp;
2744 memset(&cp, 0, sizeof(cp));
2745 bacpy(&cp.bdaddr, &conn->dst);
2746 cp.pscan_rep_mode = 0x02;
2747 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002748 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00002749 mgmt_device_connected(hdev, conn, 0, NULL, 0);
Johan Hedberg392599b2010-11-18 22:22:28 +02002750
Johan Hedberg127178d2010-11-18 22:22:29 +02002751 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02002752 conn->state = BT_CONNECTED;
Johan Hedberg539c4962015-02-18 14:53:57 +02002753 hci_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002754 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02002755 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002756
Johan Hedbergccd556f2010-11-10 17:11:51 +02002757unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002758 hci_dev_unlock(hdev);
2759}
2760
Johan Hedberge62144872015-04-02 13:41:08 +03002761static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb,
2762 u16 *opcode, u8 *status,
2763 hci_req_complete_t *req_complete,
2764 hci_req_complete_skb_t *req_complete_skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002765{
2766 struct hci_ev_cmd_complete *ev = (void *) skb->data;
Johan Hedberge62144872015-04-02 13:41:08 +03002767
2768 *opcode = __le16_to_cpu(ev->opcode);
2769 *status = skb->data[sizeof(*ev)];
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002770
2771 skb_pull(skb, sizeof(*ev));
2772
Johan Hedberge62144872015-04-02 13:41:08 +03002773 switch (*opcode) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002774 case HCI_OP_INQUIRY_CANCEL:
2775 hci_cc_inquiry_cancel(hdev, skb);
2776 break;
2777
Andre Guedes4d934832012-03-21 00:03:35 -03002778 case HCI_OP_PERIODIC_INQ:
2779 hci_cc_periodic_inq(hdev, skb);
2780 break;
2781
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002782 case HCI_OP_EXIT_PERIODIC_INQ:
2783 hci_cc_exit_periodic_inq(hdev, skb);
2784 break;
2785
2786 case HCI_OP_REMOTE_NAME_REQ_CANCEL:
2787 hci_cc_remote_name_req_cancel(hdev, skb);
2788 break;
2789
2790 case HCI_OP_ROLE_DISCOVERY:
2791 hci_cc_role_discovery(hdev, skb);
2792 break;
2793
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002794 case HCI_OP_READ_LINK_POLICY:
2795 hci_cc_read_link_policy(hdev, skb);
2796 break;
2797
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002798 case HCI_OP_WRITE_LINK_POLICY:
2799 hci_cc_write_link_policy(hdev, skb);
2800 break;
2801
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002802 case HCI_OP_READ_DEF_LINK_POLICY:
2803 hci_cc_read_def_link_policy(hdev, skb);
2804 break;
2805
2806 case HCI_OP_WRITE_DEF_LINK_POLICY:
2807 hci_cc_write_def_link_policy(hdev, skb);
2808 break;
2809
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002810 case HCI_OP_RESET:
2811 hci_cc_reset(hdev, skb);
2812 break;
2813
Marcel Holtmannc2f0f972015-01-12 09:21:25 -08002814 case HCI_OP_READ_STORED_LINK_KEY:
2815 hci_cc_read_stored_link_key(hdev, skb);
2816 break;
2817
Marcel Holtmanna93661202015-01-12 09:21:28 -08002818 case HCI_OP_DELETE_STORED_LINK_KEY:
2819 hci_cc_delete_stored_link_key(hdev, skb);
2820 break;
2821
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002822 case HCI_OP_WRITE_LOCAL_NAME:
2823 hci_cc_write_local_name(hdev, skb);
2824 break;
2825
2826 case HCI_OP_READ_LOCAL_NAME:
2827 hci_cc_read_local_name(hdev, skb);
2828 break;
2829
2830 case HCI_OP_WRITE_AUTH_ENABLE:
2831 hci_cc_write_auth_enable(hdev, skb);
2832 break;
2833
2834 case HCI_OP_WRITE_ENCRYPT_MODE:
2835 hci_cc_write_encrypt_mode(hdev, skb);
2836 break;
2837
2838 case HCI_OP_WRITE_SCAN_ENABLE:
2839 hci_cc_write_scan_enable(hdev, skb);
2840 break;
2841
2842 case HCI_OP_READ_CLASS_OF_DEV:
2843 hci_cc_read_class_of_dev(hdev, skb);
2844 break;
2845
2846 case HCI_OP_WRITE_CLASS_OF_DEV:
2847 hci_cc_write_class_of_dev(hdev, skb);
2848 break;
2849
2850 case HCI_OP_READ_VOICE_SETTING:
2851 hci_cc_read_voice_setting(hdev, skb);
2852 break;
2853
2854 case HCI_OP_WRITE_VOICE_SETTING:
2855 hci_cc_write_voice_setting(hdev, skb);
2856 break;
2857
Marcel Holtmannb4cb9fb2013-10-14 13:56:16 -07002858 case HCI_OP_READ_NUM_SUPPORTED_IAC:
2859 hci_cc_read_num_supported_iac(hdev, skb);
2860 break;
2861
Marcel Holtmann333140b2008-07-14 20:13:48 +02002862 case HCI_OP_WRITE_SSP_MODE:
2863 hci_cc_write_ssp_mode(hdev, skb);
2864 break;
2865
Marcel Holtmanneac83dc2014-01-10 02:07:23 -08002866 case HCI_OP_WRITE_SC_SUPPORT:
2867 hci_cc_write_sc_support(hdev, skb);
2868 break;
2869
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002870 case HCI_OP_READ_LOCAL_VERSION:
2871 hci_cc_read_local_version(hdev, skb);
2872 break;
2873
2874 case HCI_OP_READ_LOCAL_COMMANDS:
2875 hci_cc_read_local_commands(hdev, skb);
2876 break;
2877
2878 case HCI_OP_READ_LOCAL_FEATURES:
2879 hci_cc_read_local_features(hdev, skb);
2880 break;
2881
Andre Guedes971e3a42011-06-30 19:20:52 -03002882 case HCI_OP_READ_LOCAL_EXT_FEATURES:
2883 hci_cc_read_local_ext_features(hdev, skb);
2884 break;
2885
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002886 case HCI_OP_READ_BUFFER_SIZE:
2887 hci_cc_read_buffer_size(hdev, skb);
2888 break;
2889
2890 case HCI_OP_READ_BD_ADDR:
2891 hci_cc_read_bd_addr(hdev, skb);
2892 break;
2893
Johan Hedbergf332ec62013-03-15 17:07:11 -05002894 case HCI_OP_READ_PAGE_SCAN_ACTIVITY:
2895 hci_cc_read_page_scan_activity(hdev, skb);
2896 break;
2897
Johan Hedberg4a3ee762013-03-15 17:07:12 -05002898 case HCI_OP_WRITE_PAGE_SCAN_ACTIVITY:
2899 hci_cc_write_page_scan_activity(hdev, skb);
2900 break;
2901
Johan Hedbergf332ec62013-03-15 17:07:11 -05002902 case HCI_OP_READ_PAGE_SCAN_TYPE:
2903 hci_cc_read_page_scan_type(hdev, skb);
2904 break;
2905
Johan Hedberg4a3ee762013-03-15 17:07:12 -05002906 case HCI_OP_WRITE_PAGE_SCAN_TYPE:
2907 hci_cc_write_page_scan_type(hdev, skb);
2908 break;
2909
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +02002910 case HCI_OP_READ_DATA_BLOCK_SIZE:
2911 hci_cc_read_data_block_size(hdev, skb);
2912 break;
2913
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +02002914 case HCI_OP_READ_FLOW_CONTROL_MODE:
2915 hci_cc_read_flow_control_mode(hdev, skb);
2916 break;
2917
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +03002918 case HCI_OP_READ_LOCAL_AMP_INFO:
2919 hci_cc_read_local_amp_info(hdev, skb);
2920 break;
2921
Johan Hedberg33f35722014-06-28 17:54:06 +03002922 case HCI_OP_READ_CLOCK:
2923 hci_cc_read_clock(hdev, skb);
2924 break;
2925
Johan Hedbergd5859e22011-01-25 01:19:58 +02002926 case HCI_OP_READ_INQ_RSP_TX_POWER:
2927 hci_cc_read_inq_rsp_tx_power(hdev, skb);
2928 break;
2929
Johan Hedberg980e1a52011-01-22 06:10:07 +02002930 case HCI_OP_PIN_CODE_REPLY:
2931 hci_cc_pin_code_reply(hdev, skb);
2932 break;
2933
2934 case HCI_OP_PIN_CODE_NEG_REPLY:
2935 hci_cc_pin_code_neg_reply(hdev, skb);
2936 break;
2937
Szymon Jancc35938b2011-03-22 13:12:21 +01002938 case HCI_OP_READ_LOCAL_OOB_DATA:
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08002939 hci_cc_read_local_oob_data(hdev, skb);
2940 break;
2941
2942 case HCI_OP_READ_LOCAL_OOB_EXT_DATA:
2943 hci_cc_read_local_oob_ext_data(hdev, skb);
Szymon Jancc35938b2011-03-22 13:12:21 +01002944 break;
2945
Ville Tervo6ed58ec2011-02-10 22:38:48 -03002946 case HCI_OP_LE_READ_BUFFER_SIZE:
2947 hci_cc_le_read_buffer_size(hdev, skb);
2948 break;
2949
Johan Hedberg60e77322013-01-22 14:01:59 +02002950 case HCI_OP_LE_READ_LOCAL_FEATURES:
2951 hci_cc_le_read_local_features(hdev, skb);
2952 break;
2953
Johan Hedberg8fa19092012-10-19 20:57:49 +03002954 case HCI_OP_LE_READ_ADV_TX_POWER:
2955 hci_cc_le_read_adv_tx_power(hdev, skb);
2956 break;
2957
Johan Hedberga5c29682011-02-19 12:05:57 -03002958 case HCI_OP_USER_CONFIRM_REPLY:
2959 hci_cc_user_confirm_reply(hdev, skb);
2960 break;
2961
2962 case HCI_OP_USER_CONFIRM_NEG_REPLY:
2963 hci_cc_user_confirm_neg_reply(hdev, skb);
2964 break;
2965
Brian Gix1143d452011-11-23 08:28:34 -08002966 case HCI_OP_USER_PASSKEY_REPLY:
2967 hci_cc_user_passkey_reply(hdev, skb);
2968 break;
2969
2970 case HCI_OP_USER_PASSKEY_NEG_REPLY:
2971 hci_cc_user_passkey_neg_reply(hdev, skb);
Szymon Janc16cde992012-04-13 12:32:42 +02002972 break;
Andre Guedes07f7fa52011-12-02 21:13:31 +09002973
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08002974 case HCI_OP_LE_SET_RANDOM_ADDR:
2975 hci_cc_le_set_random_addr(hdev, skb);
2976 break;
2977
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01002978 case HCI_OP_LE_SET_ADV_ENABLE:
2979 hci_cc_le_set_adv_enable(hdev, skb);
2980 break;
2981
Marcel Holtmann533553f2014-03-21 12:18:10 -07002982 case HCI_OP_LE_SET_SCAN_PARAM:
2983 hci_cc_le_set_scan_param(hdev, skb);
2984 break;
2985
Andre Guedeseb9d91f2011-05-26 16:23:52 -03002986 case HCI_OP_LE_SET_SCAN_ENABLE:
2987 hci_cc_le_set_scan_enable(hdev, skb);
2988 break;
2989
Johan Hedbergcf1d0812013-01-22 14:02:00 +02002990 case HCI_OP_LE_READ_WHITE_LIST_SIZE:
2991 hci_cc_le_read_white_list_size(hdev, skb);
2992 break;
2993
Marcel Holtmann0f36b582014-02-27 20:37:31 -08002994 case HCI_OP_LE_CLEAR_WHITE_LIST:
2995 hci_cc_le_clear_white_list(hdev, skb);
2996 break;
2997
2998 case HCI_OP_LE_ADD_TO_WHITE_LIST:
2999 hci_cc_le_add_to_white_list(hdev, skb);
3000 break;
3001
3002 case HCI_OP_LE_DEL_FROM_WHITE_LIST:
3003 hci_cc_le_del_from_white_list(hdev, skb);
3004 break;
3005
Johan Hedberg9b008c02013-01-22 14:02:01 +02003006 case HCI_OP_LE_READ_SUPPORTED_STATES:
3007 hci_cc_le_read_supported_states(hdev, skb);
3008 break;
3009
Marcel Holtmanna8e1bfa2014-12-20 16:28:40 +01003010 case HCI_OP_LE_READ_DEF_DATA_LEN:
3011 hci_cc_le_read_def_data_len(hdev, skb);
3012 break;
3013
3014 case HCI_OP_LE_WRITE_DEF_DATA_LEN:
3015 hci_cc_le_write_def_data_len(hdev, skb);
3016 break;
3017
3018 case HCI_OP_LE_READ_MAX_DATA_LEN:
3019 hci_cc_le_read_max_data_len(hdev, skb);
3020 break;
3021
Andre Guedesf9b49302011-06-30 19:20:53 -03003022 case HCI_OP_WRITE_LE_HOST_SUPPORTED:
3023 hci_cc_write_le_host_supported(hdev, skb);
3024 break;
3025
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02003026 case HCI_OP_LE_SET_ADV_PARAM:
3027 hci_cc_set_adv_param(hdev, skb);
3028 break;
3029
Andrzej Kaczmarek5ae76a92014-05-08 15:32:08 +02003030 case HCI_OP_READ_RSSI:
3031 hci_cc_read_rssi(hdev, skb);
3032 break;
3033
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02003034 case HCI_OP_READ_TX_POWER:
3035 hci_cc_read_tx_power(hdev, skb);
3036 break;
3037
Marcel Holtmannc50b33c2015-01-31 15:07:52 -08003038 case HCI_OP_WRITE_SSP_DEBUG_MODE:
3039 hci_cc_write_ssp_debug_mode(hdev, skb);
3040 break;
3041
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003042 default:
Johan Hedberge62144872015-04-02 13:41:08 +03003043 BT_DBG("%s opcode 0x%4.4x", hdev->name, *opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003044 break;
3045 }
3046
Johan Hedberge62144872015-04-02 13:41:08 +03003047 if (*opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02003048 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02003049
Johan Hedberg600b2152015-03-28 11:17:36 +02003050 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags))
3051 atomic_set(&hdev->cmd_cnt, 1);
3052
Johan Hedberge62144872015-04-02 13:41:08 +03003053 hci_req_cmd_complete(hdev, *opcode, *status, req_complete,
3054 req_complete_skb);
Johan Hedberg9238f362013-03-05 20:37:48 +02003055
Johan Hedberg600b2152015-03-28 11:17:36 +02003056 if (atomic_read(&hdev->cmd_cnt) && !skb_queue_empty(&hdev->cmd_q))
3057 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003058}
3059
Johan Hedberge62144872015-04-02 13:41:08 +03003060static void hci_cmd_status_evt(struct hci_dev *hdev, struct sk_buff *skb,
3061 u16 *opcode, u8 *status,
3062 hci_req_complete_t *req_complete,
3063 hci_req_complete_skb_t *req_complete_skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003064{
3065 struct hci_ev_cmd_status *ev = (void *) skb->data;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003066
3067 skb_pull(skb, sizeof(*ev));
3068
Johan Hedberge62144872015-04-02 13:41:08 +03003069 *opcode = __le16_to_cpu(ev->opcode);
3070 *status = ev->status;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003071
Johan Hedberge62144872015-04-02 13:41:08 +03003072 switch (*opcode) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003073 case HCI_OP_INQUIRY:
3074 hci_cs_inquiry(hdev, ev->status);
3075 break;
3076
3077 case HCI_OP_CREATE_CONN:
3078 hci_cs_create_conn(hdev, ev->status);
3079 break;
3080
Kuba Pawlak9645c762014-11-06 19:36:53 +01003081 case HCI_OP_DISCONNECT:
3082 hci_cs_disconnect(hdev, ev->status);
3083 break;
3084
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003085 case HCI_OP_ADD_SCO:
3086 hci_cs_add_sco(hdev, ev->status);
3087 break;
3088
Marcel Holtmannf8558552008-07-14 20:13:49 +02003089 case HCI_OP_AUTH_REQUESTED:
3090 hci_cs_auth_requested(hdev, ev->status);
3091 break;
3092
3093 case HCI_OP_SET_CONN_ENCRYPT:
3094 hci_cs_set_conn_encrypt(hdev, ev->status);
3095 break;
3096
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003097 case HCI_OP_REMOTE_NAME_REQ:
3098 hci_cs_remote_name_req(hdev, ev->status);
3099 break;
3100
Marcel Holtmann769be972008-07-14 20:13:49 +02003101 case HCI_OP_READ_REMOTE_FEATURES:
3102 hci_cs_read_remote_features(hdev, ev->status);
3103 break;
3104
3105 case HCI_OP_READ_REMOTE_EXT_FEATURES:
3106 hci_cs_read_remote_ext_features(hdev, ev->status);
3107 break;
3108
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003109 case HCI_OP_SETUP_SYNC_CONN:
3110 hci_cs_setup_sync_conn(hdev, ev->status);
3111 break;
3112
3113 case HCI_OP_SNIFF_MODE:
3114 hci_cs_sniff_mode(hdev, ev->status);
3115 break;
3116
3117 case HCI_OP_EXIT_SNIFF_MODE:
3118 hci_cs_exit_sniff_mode(hdev, ev->status);
3119 break;
3120
Kuba Pawlak50fc85f2014-11-06 19:36:52 +01003121 case HCI_OP_SWITCH_ROLE:
3122 hci_cs_switch_role(hdev, ev->status);
3123 break;
3124
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02003125 case HCI_OP_LE_CREATE_CONN:
3126 hci_cs_le_create_conn(hdev, ev->status);
3127 break;
3128
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07003129 case HCI_OP_LE_READ_REMOTE_FEATURES:
3130 hci_cs_le_read_remote_features(hdev, ev->status);
3131 break;
3132
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02003133 case HCI_OP_LE_START_ENC:
3134 hci_cs_le_start_enc(hdev, ev->status);
3135 break;
3136
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003137 default:
Johan Hedberge62144872015-04-02 13:41:08 +03003138 BT_DBG("%s opcode 0x%4.4x", hdev->name, *opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003139 break;
3140 }
3141
Johan Hedberge62144872015-04-02 13:41:08 +03003142 if (*opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02003143 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02003144
Johan Hedberg600b2152015-03-28 11:17:36 +02003145 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags))
3146 atomic_set(&hdev->cmd_cnt, 1);
3147
Johan Hedberg444c6dd2015-04-02 13:41:07 +03003148 /* Indicate request completion if the command failed. Also, if
3149 * we're not waiting for a special event and we get a success
3150 * command status we should try to flag the request as completed
3151 * (since for this kind of commands there will not be a command
3152 * complete event).
3153 */
Johan Hedberg02350a72013-04-03 21:50:29 +03003154 if (ev->status ||
Marcel Holtmann242c0eb2015-10-25 22:45:53 +01003155 (hdev->sent_cmd && !bt_cb(hdev->sent_cmd)->hci.req_event))
Johan Hedberge62144872015-04-02 13:41:08 +03003156 hci_req_cmd_complete(hdev, *opcode, ev->status, req_complete,
3157 req_complete_skb);
Johan Hedberg9238f362013-03-05 20:37:48 +02003158
Johan Hedberg600b2152015-03-28 11:17:36 +02003159 if (atomic_read(&hdev->cmd_cnt) && !skb_queue_empty(&hdev->cmd_q))
3160 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003161}
3162
Marcel Holtmann24dfa342014-11-02 02:56:41 +01003163static void hci_hardware_error_evt(struct hci_dev *hdev, struct sk_buff *skb)
3164{
3165 struct hci_ev_hardware_error *ev = (void *) skb->data;
3166
Marcel Holtmannc7741d12015-01-28 11:09:55 -08003167 hdev->hw_error_code = ev->code;
3168
3169 queue_work(hdev->req_workqueue, &hdev->error_reset);
Marcel Holtmann24dfa342014-11-02 02:56:41 +01003170}
3171
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003172static void hci_role_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003173{
3174 struct hci_ev_role_change *ev = (void *) skb->data;
3175 struct hci_conn *conn;
3176
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003177 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003178
3179 hci_dev_lock(hdev);
3180
3181 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3182 if (conn) {
Johan Hedberg40bef302014-07-16 11:42:27 +03003183 if (!ev->status)
3184 conn->role = ev->role;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003185
Johan Hedberg51a8efd2012-01-16 06:10:31 +02003186 clear_bit(HCI_CONN_RSWITCH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003187
3188 hci_role_switch_cfm(conn, ev->status, ev->role);
3189 }
3190
3191 hci_dev_unlock(hdev);
3192}
3193
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003194static void hci_num_comp_pkts_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003195{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003196 struct hci_ev_num_comp_pkts *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003197 int i;
3198
Andrei Emeltchenko32ac5b92011-12-19 16:31:29 +02003199 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_PACKET_BASED) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003200 bt_dev_err(hdev, "wrong event for mode %d", hdev->flow_ctl_mode);
Andrei Emeltchenko32ac5b92011-12-19 16:31:29 +02003201 return;
3202 }
3203
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02003204 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03003205 ev->num_hndl * sizeof(struct hci_comp_pkts_info)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003206 BT_DBG("%s bad parameters", hdev->name);
3207 return;
3208 }
3209
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02003210 BT_DBG("%s num_hndl %d", hdev->name, ev->num_hndl);
3211
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02003212 for (i = 0; i < ev->num_hndl; i++) {
3213 struct hci_comp_pkts_info *info = &ev->handles[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07003214 struct hci_conn *conn;
3215 __u16 handle, count;
3216
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02003217 handle = __le16_to_cpu(info->handle);
3218 count = __le16_to_cpu(info->count);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003219
3220 conn = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003221 if (!conn)
3222 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003223
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003224 conn->sent -= count;
3225
3226 switch (conn->type) {
3227 case ACL_LINK:
3228 hdev->acl_cnt += count;
3229 if (hdev->acl_cnt > hdev->acl_pkts)
3230 hdev->acl_cnt = hdev->acl_pkts;
3231 break;
3232
3233 case LE_LINK:
3234 if (hdev->le_pkts) {
3235 hdev->le_cnt += count;
3236 if (hdev->le_cnt > hdev->le_pkts)
3237 hdev->le_cnt = hdev->le_pkts;
3238 } else {
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02003239 hdev->acl_cnt += count;
3240 if (hdev->acl_cnt > hdev->acl_pkts)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003241 hdev->acl_cnt = hdev->acl_pkts;
3242 }
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003243 break;
3244
3245 case SCO_LINK:
3246 hdev->sco_cnt += count;
3247 if (hdev->sco_cnt > hdev->sco_pkts)
3248 hdev->sco_cnt = hdev->sco_pkts;
3249 break;
3250
3251 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003252 bt_dev_err(hdev, "unknown type %d conn %p",
3253 conn->type, conn);
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003254 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003255 }
3256 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003257
Gustavo F. Padovan3eff45e2011-12-15 00:50:02 -02003258 queue_work(hdev->workqueue, &hdev->tx_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003259}
3260
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003261static struct hci_conn *__hci_conn_lookup_handle(struct hci_dev *hdev,
3262 __u16 handle)
3263{
3264 struct hci_chan *chan;
3265
3266 switch (hdev->dev_type) {
Marcel Holtmannca8bee52016-07-05 14:30:14 +02003267 case HCI_PRIMARY:
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003268 return hci_conn_hash_lookup_handle(hdev, handle);
3269 case HCI_AMP:
3270 chan = hci_chan_lookup_handle(hdev, handle);
3271 if (chan)
3272 return chan->conn;
3273 break;
3274 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003275 bt_dev_err(hdev, "unknown dev_type %d", hdev->dev_type);
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003276 break;
3277 }
3278
3279 return NULL;
3280}
3281
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003282static void hci_num_comp_blocks_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003283{
3284 struct hci_ev_num_comp_blocks *ev = (void *) skb->data;
3285 int i;
3286
3287 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_BLOCK_BASED) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003288 bt_dev_err(hdev, "wrong event for mode %d", hdev->flow_ctl_mode);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003289 return;
3290 }
3291
3292 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03003293 ev->num_hndl * sizeof(struct hci_comp_blocks_info)) {
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003294 BT_DBG("%s bad parameters", hdev->name);
3295 return;
3296 }
3297
3298 BT_DBG("%s num_blocks %d num_hndl %d", hdev->name, ev->num_blocks,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003299 ev->num_hndl);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003300
3301 for (i = 0; i < ev->num_hndl; i++) {
3302 struct hci_comp_blocks_info *info = &ev->handles[i];
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003303 struct hci_conn *conn = NULL;
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003304 __u16 handle, block_count;
3305
3306 handle = __le16_to_cpu(info->handle);
3307 block_count = __le16_to_cpu(info->blocks);
3308
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003309 conn = __hci_conn_lookup_handle(hdev, handle);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003310 if (!conn)
3311 continue;
3312
3313 conn->sent -= block_count;
3314
3315 switch (conn->type) {
3316 case ACL_LINK:
Andrei Emeltchenkobd1eb662012-10-10 17:38:30 +03003317 case AMP_LINK:
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003318 hdev->block_cnt += block_count;
3319 if (hdev->block_cnt > hdev->num_blocks)
3320 hdev->block_cnt = hdev->num_blocks;
3321 break;
3322
3323 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003324 bt_dev_err(hdev, "unknown type %d conn %p",
3325 conn->type, conn);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003326 break;
3327 }
3328 }
3329
3330 queue_work(hdev->workqueue, &hdev->tx_work);
3331}
3332
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003333static void hci_mode_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003334{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003335 struct hci_ev_mode_change *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003336 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003337
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003338 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003339
3340 hci_dev_lock(hdev);
3341
Marcel Holtmann04837f62006-07-03 10:02:33 +02003342 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3343 if (conn) {
3344 conn->mode = ev->mode;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003345
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003346 if (!test_and_clear_bit(HCI_CONN_MODE_CHANGE_PEND,
3347 &conn->flags)) {
Marcel Holtmann04837f62006-07-03 10:02:33 +02003348 if (conn->mode == HCI_CM_ACTIVE)
Johan Hedberg58a681e2012-01-16 06:47:28 +02003349 set_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003350 else
Johan Hedberg58a681e2012-01-16 06:47:28 +02003351 clear_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003352 }
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003353
Johan Hedberg51a8efd2012-01-16 06:10:31 +02003354 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003355 hci_sco_setup(conn, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003356 }
3357
3358 hci_dev_unlock(hdev);
3359}
3360
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003361static void hci_pin_code_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003362{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003363 struct hci_ev_pin_code_req *ev = (void *) skb->data;
3364 struct hci_conn *conn;
3365
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003366 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003367
3368 hci_dev_lock(hdev);
3369
3370 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003371 if (!conn)
3372 goto unlock;
3373
3374 if (conn->state == BT_CONNECTED) {
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003375 hci_conn_hold(conn);
3376 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003377 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003378 }
3379
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003380 if (!hci_dev_test_flag(hdev, HCI_BONDABLE) &&
Johan Hedberg2f407f02014-07-17 15:35:40 +03003381 !test_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags)) {
Johan Hedberg03b555e2011-01-04 15:40:05 +02003382 hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003383 sizeof(ev->bdaddr), &ev->bdaddr);
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003384 } else if (hci_dev_test_flag(hdev, HCI_MGMT)) {
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003385 u8 secure;
3386
3387 if (conn->pending_sec_level == BT_SECURITY_HIGH)
3388 secure = 1;
3389 else
3390 secure = 0;
3391
Johan Hedberg744cf192011-11-08 20:40:14 +02003392 mgmt_pin_code_request(hdev, &ev->bdaddr, secure);
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003393 }
Johan Hedberg980e1a52011-01-22 06:10:07 +02003394
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003395unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003396 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003397}
3398
Johan Hedbergcb6f3f72014-11-19 14:53:04 +02003399static void conn_set_key(struct hci_conn *conn, u8 key_type, u8 pin_len)
3400{
3401 if (key_type == HCI_LK_CHANGED_COMBINATION)
3402 return;
3403
3404 conn->pin_length = pin_len;
3405 conn->key_type = key_type;
3406
3407 switch (key_type) {
3408 case HCI_LK_LOCAL_UNIT:
3409 case HCI_LK_REMOTE_UNIT:
3410 case HCI_LK_DEBUG_COMBINATION:
3411 return;
3412 case HCI_LK_COMBINATION:
3413 if (pin_len == 16)
3414 conn->pending_sec_level = BT_SECURITY_HIGH;
3415 else
3416 conn->pending_sec_level = BT_SECURITY_MEDIUM;
3417 break;
3418 case HCI_LK_UNAUTH_COMBINATION_P192:
3419 case HCI_LK_UNAUTH_COMBINATION_P256:
3420 conn->pending_sec_level = BT_SECURITY_MEDIUM;
3421 break;
3422 case HCI_LK_AUTH_COMBINATION_P192:
3423 conn->pending_sec_level = BT_SECURITY_HIGH;
3424 break;
3425 case HCI_LK_AUTH_COMBINATION_P256:
3426 conn->pending_sec_level = BT_SECURITY_FIPS;
3427 break;
3428 }
3429}
3430
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003431static void hci_link_key_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003432{
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003433 struct hci_ev_link_key_req *ev = (void *) skb->data;
3434 struct hci_cp_link_key_reply cp;
3435 struct hci_conn *conn;
3436 struct link_key *key;
3437
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003438 BT_DBG("%s", hdev->name);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003439
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003440 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003441 return;
3442
3443 hci_dev_lock(hdev);
3444
3445 key = hci_find_link_key(hdev, &ev->bdaddr);
3446 if (!key) {
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003447 BT_DBG("%s link key not found for %pMR", hdev->name,
3448 &ev->bdaddr);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003449 goto not_found;
3450 }
3451
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003452 BT_DBG("%s found key type %u for %pMR", hdev->name, key->type,
3453 &ev->bdaddr);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003454
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003455 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003456 if (conn) {
Johan Hedbergfe8bc5a2014-08-14 12:33:17 +03003457 clear_bit(HCI_CONN_NEW_LINK_KEY, &conn->flags);
3458
Marcel Holtmann66138ce2014-01-10 02:07:20 -08003459 if ((key->type == HCI_LK_UNAUTH_COMBINATION_P192 ||
3460 key->type == HCI_LK_UNAUTH_COMBINATION_P256) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03003461 conn->auth_type != 0xff && (conn->auth_type & 0x01)) {
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003462 BT_DBG("%s ignoring unauthenticated key", hdev->name);
3463 goto not_found;
3464 }
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003465
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003466 if (key->type == HCI_LK_COMBINATION && key->pin_len < 16 &&
Johan Hedbergf3fb0b52014-06-02 10:12:44 +03003467 (conn->pending_sec_level == BT_SECURITY_HIGH ||
3468 conn->pending_sec_level == BT_SECURITY_FIPS)) {
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003469 BT_DBG("%s ignoring key unauthenticated for high security",
3470 hdev->name);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003471 goto not_found;
3472 }
3473
Johan Hedbergcb6f3f72014-11-19 14:53:04 +02003474 conn_set_key(conn, key->type, key->pin_len);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003475 }
3476
3477 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9b3b4462012-05-23 11:31:20 +03003478 memcpy(cp.link_key, key->val, HCI_LINK_KEY_SIZE);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003479
3480 hci_send_cmd(hdev, HCI_OP_LINK_KEY_REPLY, sizeof(cp), &cp);
3481
3482 hci_dev_unlock(hdev);
3483
3484 return;
3485
3486not_found:
3487 hci_send_cmd(hdev, HCI_OP_LINK_KEY_NEG_REPLY, 6, &ev->bdaddr);
3488 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003489}
3490
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003491static void hci_link_key_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003492{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003493 struct hci_ev_link_key_notify *ev = (void *) skb->data;
3494 struct hci_conn *conn;
Johan Hedberg7652ff62014-06-24 13:15:49 +03003495 struct link_key *key;
3496 bool persistent;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003497 u8 pin_len = 0;
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003498
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003499 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003500
3501 hci_dev_lock(hdev);
3502
3503 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg82c13d42014-12-03 11:03:06 +02003504 if (!conn)
3505 goto unlock;
3506
3507 hci_conn_hold(conn);
3508 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
3509 hci_conn_drop(conn);
3510
Johan Hedbergfe8bc5a2014-08-14 12:33:17 +03003511 set_bit(HCI_CONN_NEW_LINK_KEY, &conn->flags);
Johan Hedberg82c13d42014-12-03 11:03:06 +02003512 conn_set_key(conn, ev->key_type, conn->pin_length);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003513
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003514 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg7652ff62014-06-24 13:15:49 +03003515 goto unlock;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003516
Johan Hedberg7652ff62014-06-24 13:15:49 +03003517 key = hci_add_link_key(hdev, conn, &ev->bdaddr, ev->link_key,
3518 ev->key_type, pin_len, &persistent);
3519 if (!key)
3520 goto unlock;
3521
Johan Hedbergcb6f3f72014-11-19 14:53:04 +02003522 /* Update connection information since adding the key will have
3523 * fixed up the type in the case of changed combination keys.
3524 */
3525 if (ev->key_type == HCI_LK_CHANGED_COMBINATION)
3526 conn_set_key(conn, key->type, key->pin_len);
3527
Johan Hedberg7652ff62014-06-24 13:15:49 +03003528 mgmt_new_link_key(hdev, key, persistent);
3529
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003530 /* Keep debug keys around only if the HCI_KEEP_DEBUG_KEYS flag
3531 * is set. If it's not set simply remove the key from the kernel
3532 * list (we've still notified user space about it but with
3533 * store_hint being 0).
3534 */
3535 if (key->type == HCI_LK_DEBUG_COMBINATION &&
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003536 !hci_dev_test_flag(hdev, HCI_KEEP_DEBUG_KEYS)) {
Johan Hedberg0378b592014-11-19 15:22:22 +02003537 list_del_rcu(&key->list);
3538 kfree_rcu(key, rcu);
Johan Hedberg82c13d42014-12-03 11:03:06 +02003539 goto unlock;
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003540 }
Johan Hedberg7652ff62014-06-24 13:15:49 +03003541
Johan Hedberg82c13d42014-12-03 11:03:06 +02003542 if (persistent)
3543 clear_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
3544 else
3545 set_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
3546
Johan Hedberg7652ff62014-06-24 13:15:49 +03003547unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003548 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003549}
3550
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003551static void hci_clock_offset_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04837f62006-07-03 10:02:33 +02003552{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003553 struct hci_ev_clock_offset *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003554 struct hci_conn *conn;
3555
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003556 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003557
3558 hci_dev_lock(hdev);
3559
3560 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003561 if (conn && !ev->status) {
3562 struct inquiry_entry *ie;
3563
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003564 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3565 if (ie) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003566 ie->data.clock_offset = ev->clock_offset;
3567 ie->timestamp = jiffies;
3568 }
3569 }
3570
3571 hci_dev_unlock(hdev);
3572}
3573
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003574static void hci_pkt_type_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna8746412008-07-14 20:13:46 +02003575{
3576 struct hci_ev_pkt_type_change *ev = (void *) skb->data;
3577 struct hci_conn *conn;
3578
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003579 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna8746412008-07-14 20:13:46 +02003580
3581 hci_dev_lock(hdev);
3582
3583 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3584 if (conn && !ev->status)
3585 conn->pkt_type = __le16_to_cpu(ev->pkt_type);
3586
3587 hci_dev_unlock(hdev);
3588}
3589
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003590static void hci_pscan_rep_mode_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003591{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003592 struct hci_ev_pscan_rep_mode *ev = (void *) skb->data;
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003593 struct inquiry_entry *ie;
3594
3595 BT_DBG("%s", hdev->name);
3596
3597 hci_dev_lock(hdev);
3598
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003599 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
3600 if (ie) {
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003601 ie->data.pscan_rep_mode = ev->pscan_rep_mode;
3602 ie->timestamp = jiffies;
3603 }
3604
3605 hci_dev_unlock(hdev);
3606}
3607
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003608static void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev,
3609 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003610{
3611 struct inquiry_data data;
3612 int num_rsp = *((__u8 *) skb->data);
3613
3614 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
3615
3616 if (!num_rsp)
3617 return;
3618
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003619 if (hci_dev_test_flag(hdev, HCI_PERIODIC_INQ))
Andre Guedes1519cc12012-03-21 00:03:38 -03003620 return;
3621
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003622 hci_dev_lock(hdev);
3623
3624 if ((skb->len - 1) / num_rsp != sizeof(struct inquiry_info_with_rssi)) {
Szymon Janc138d22e2011-02-17 16:44:23 +01003625 struct inquiry_info_with_rssi_and_pscan_mode *info;
3626 info = (void *) (skb->data + 1);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003627
Johan Hedberge17acd42011-03-30 23:57:16 +03003628 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003629 u32 flags;
3630
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003631 bacpy(&data.bdaddr, &info->bdaddr);
3632 data.pscan_rep_mode = info->pscan_rep_mode;
3633 data.pscan_period_mode = info->pscan_period_mode;
3634 data.pscan_mode = info->pscan_mode;
3635 memcpy(data.dev_class, info->dev_class, 3);
3636 data.clock_offset = info->clock_offset;
3637 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003638 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02003639
Marcel Holtmannaf589252014-07-01 14:11:20 +02003640 flags = hci_inquiry_cache_update(hdev, &data, false);
3641
Johan Hedberg48264f02011-11-09 13:58:58 +02003642 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003643 info->dev_class, info->rssi,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003644 flags, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003645 }
3646 } else {
3647 struct inquiry_info_with_rssi *info = (void *) (skb->data + 1);
3648
Johan Hedberge17acd42011-03-30 23:57:16 +03003649 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003650 u32 flags;
3651
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003652 bacpy(&data.bdaddr, &info->bdaddr);
3653 data.pscan_rep_mode = info->pscan_rep_mode;
3654 data.pscan_period_mode = info->pscan_period_mode;
3655 data.pscan_mode = 0x00;
3656 memcpy(data.dev_class, info->dev_class, 3);
3657 data.clock_offset = info->clock_offset;
3658 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003659 data.ssp_mode = 0x00;
Marcel Holtmannaf589252014-07-01 14:11:20 +02003660
3661 flags = hci_inquiry_cache_update(hdev, &data, false);
3662
Johan Hedberg48264f02011-11-09 13:58:58 +02003663 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003664 info->dev_class, info->rssi,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003665 flags, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003666 }
3667 }
3668
3669 hci_dev_unlock(hdev);
3670}
3671
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003672static void hci_remote_ext_features_evt(struct hci_dev *hdev,
3673 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003674{
Marcel Holtmann41a96212008-07-14 20:13:48 +02003675 struct hci_ev_remote_ext_features *ev = (void *) skb->data;
3676 struct hci_conn *conn;
3677
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003678 BT_DBG("%s", hdev->name);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003679
Marcel Holtmann41a96212008-07-14 20:13:48 +02003680 hci_dev_lock(hdev);
3681
3682 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02003683 if (!conn)
3684 goto unlock;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003685
Johan Hedbergcad718e2013-04-17 15:00:51 +03003686 if (ev->page < HCI_MAX_PAGES)
3687 memcpy(conn->features[ev->page], ev->features, 8);
3688
Johan Hedbergccd556f2010-11-10 17:11:51 +02003689 if (!ev->status && ev->page == 0x01) {
3690 struct inquiry_entry *ie;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003691
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003692 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3693 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02003694 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann769be972008-07-14 20:13:49 +02003695
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303696 if (ev->features[0] & LMP_HOST_SSP) {
Johan Hedberg58a681e2012-01-16 06:47:28 +02003697 set_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303698 } else {
3699 /* It is mandatory by the Bluetooth specification that
3700 * Extended Inquiry Results are only used when Secure
3701 * Simple Pairing is enabled, but some devices violate
3702 * this.
3703 *
3704 * To make these devices work, the internal SSP
3705 * enabled flag needs to be cleared if the remote host
3706 * features do not indicate SSP support */
3707 clear_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
3708 }
Marcel Holtmanneb9a8f32014-01-15 22:37:38 -08003709
3710 if (ev->features[0] & LMP_HOST_SC)
3711 set_bit(HCI_CONN_SC_ENABLED, &conn->flags);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003712 }
3713
Johan Hedbergccd556f2010-11-10 17:11:51 +02003714 if (conn->state != BT_CONFIG)
3715 goto unlock;
3716
Johan Hedberg671267b2012-05-12 16:11:50 -03003717 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02003718 struct hci_cp_remote_name_req cp;
3719 memset(&cp, 0, sizeof(cp));
3720 bacpy(&cp.bdaddr, &conn->dst);
3721 cp.pscan_rep_mode = 0x02;
3722 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02003723 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00003724 mgmt_device_connected(hdev, conn, 0, NULL, 0);
Johan Hedberg392599b2010-11-18 22:22:28 +02003725
Johan Hedberg127178d2010-11-18 22:22:29 +02003726 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02003727 conn->state = BT_CONNECTED;
Johan Hedberg539c4962015-02-18 14:53:57 +02003728 hci_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02003729 hci_conn_drop(conn);
Johan Hedbergccd556f2010-11-10 17:11:51 +02003730 }
3731
3732unlock:
Marcel Holtmann41a96212008-07-14 20:13:48 +02003733 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003734}
3735
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003736static void hci_sync_conn_complete_evt(struct hci_dev *hdev,
3737 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003738{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003739 struct hci_ev_sync_conn_complete *ev = (void *) skb->data;
3740 struct hci_conn *conn;
3741
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003742 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003743
3744 hci_dev_lock(hdev);
3745
3746 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann9dc0a3a2008-07-14 20:13:46 +02003747 if (!conn) {
3748 if (ev->link_type == ESCO_LINK)
3749 goto unlock;
3750
Kuba Pawlak618353b2015-08-28 13:05:22 +01003751 /* When the link type in the event indicates SCO connection
3752 * and lookup of the connection object fails, then check
3753 * if an eSCO connection object exists.
3754 *
3755 * The core limits the synchronous connections to either
3756 * SCO or eSCO. The eSCO connection is preferred and tried
3757 * to be setup first and until successfully established,
3758 * the link type will be hinted as eSCO.
3759 */
Marcel Holtmann9dc0a3a2008-07-14 20:13:46 +02003760 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
3761 if (!conn)
3762 goto unlock;
Marcel Holtmann9dc0a3a2008-07-14 20:13:46 +02003763 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003764
Marcel Holtmann732547f2009-04-19 19:14:14 +02003765 switch (ev->status) {
3766 case 0x00:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003767 conn->handle = __le16_to_cpu(ev->handle);
3768 conn->state = BT_CONNECTED;
Kuba Pawlak618353b2015-08-28 13:05:22 +01003769 conn->type = ev->link_type;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02003770
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01003771 hci_debugfs_create_conn(conn);
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02003772 hci_conn_add_sysfs(conn);
Marcel Holtmann732547f2009-04-19 19:14:14 +02003773 break;
3774
Nick Pelly81218d22014-06-30 11:25:01 +05303775 case 0x10: /* Connection Accept Timeout */
Frédéric Dalleau1a4c9582013-08-19 14:24:02 +02003776 case 0x0d: /* Connection Rejected due to Limited Resources */
Stephen Coe705e5712010-02-16 11:29:44 -05003777 case 0x11: /* Unsupported Feature or Parameter Value */
Marcel Holtmann732547f2009-04-19 19:14:14 +02003778 case 0x1c: /* SCO interval rejected */
Nick Pelly1038a002010-02-03 11:42:26 -08003779 case 0x1a: /* Unsupported Remote Feature */
Marcel Holtmann732547f2009-04-19 19:14:14 +02003780 case 0x1f: /* Unspecified error */
Andrew Earl27539bc2014-03-10 10:31:04 +00003781 case 0x20: /* Unsupported LMP Parameter value */
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02003782 if (conn->out) {
Marcel Holtmann732547f2009-04-19 19:14:14 +02003783 conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) |
3784 (hdev->esco_type & EDR_ESCO_MASK);
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02003785 if (hci_setup_sync(conn, conn->link->handle))
3786 goto unlock;
Marcel Holtmann732547f2009-04-19 19:14:14 +02003787 }
3788 /* fall through */
3789
3790 default:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003791 conn->state = BT_CLOSED;
Marcel Holtmann732547f2009-04-19 19:14:14 +02003792 break;
3793 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003794
Johan Hedberg539c4962015-02-18 14:53:57 +02003795 hci_connect_cfm(conn, ev->status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003796 if (ev->status)
3797 hci_conn_del(conn);
3798
3799unlock:
3800 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003801}
3802
Marcel Holtmannefdcf8e2013-10-15 10:31:12 -07003803static inline size_t eir_get_length(u8 *eir, size_t eir_len)
3804{
3805 size_t parsed = 0;
3806
3807 while (parsed < eir_len) {
3808 u8 field_len = eir[0];
3809
3810 if (field_len == 0)
3811 return parsed;
3812
3813 parsed += field_len + 1;
3814 eir += field_len + 1;
3815 }
3816
3817 return eir_len;
3818}
3819
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003820static void hci_extended_inquiry_result_evt(struct hci_dev *hdev,
3821 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003822{
3823 struct inquiry_data data;
3824 struct extended_inquiry_info *info = (void *) (skb->data + 1);
3825 int num_rsp = *((__u8 *) skb->data);
Vishal Agarwal9d939d92012-04-26 19:19:56 +05303826 size_t eir_len;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003827
3828 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
3829
3830 if (!num_rsp)
3831 return;
3832
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003833 if (hci_dev_test_flag(hdev, HCI_PERIODIC_INQ))
Andre Guedes1519cc12012-03-21 00:03:38 -03003834 return;
3835
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003836 hci_dev_lock(hdev);
3837
Johan Hedberge17acd42011-03-30 23:57:16 +03003838 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003839 u32 flags;
3840 bool name_known;
Johan Hedberg561aafb2012-01-04 13:31:59 +02003841
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003842 bacpy(&data.bdaddr, &info->bdaddr);
Szymon Janc138d22e2011-02-17 16:44:23 +01003843 data.pscan_rep_mode = info->pscan_rep_mode;
3844 data.pscan_period_mode = info->pscan_period_mode;
3845 data.pscan_mode = 0x00;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003846 memcpy(data.dev_class, info->dev_class, 3);
Szymon Janc138d22e2011-02-17 16:44:23 +01003847 data.clock_offset = info->clock_offset;
3848 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003849 data.ssp_mode = 0x01;
Johan Hedberg561aafb2012-01-04 13:31:59 +02003850
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003851 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg0d3b7f62016-01-05 13:19:31 +02003852 name_known = eir_get_data(info->data,
3853 sizeof(info->data),
3854 EIR_NAME_COMPLETE, NULL);
Johan Hedberg561aafb2012-01-04 13:31:59 +02003855 else
3856 name_known = true;
3857
Marcel Holtmannaf589252014-07-01 14:11:20 +02003858 flags = hci_inquiry_cache_update(hdev, &data, name_known);
3859
Vishal Agarwal9d939d92012-04-26 19:19:56 +05303860 eir_len = eir_get_length(info->data, sizeof(info->data));
Marcel Holtmannaf589252014-07-01 14:11:20 +02003861
Johan Hedberg48264f02011-11-09 13:58:58 +02003862 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003863 info->dev_class, info->rssi,
3864 flags, info->data, eir_len, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003865 }
3866
3867 hci_dev_unlock(hdev);
3868}
3869
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003870static void hci_key_refresh_complete_evt(struct hci_dev *hdev,
3871 struct sk_buff *skb)
3872{
3873 struct hci_ev_key_refresh_complete *ev = (void *) skb->data;
3874 struct hci_conn *conn;
3875
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003876 BT_DBG("%s status 0x%2.2x handle 0x%4.4x", hdev->name, ev->status,
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003877 __le16_to_cpu(ev->handle));
3878
3879 hci_dev_lock(hdev);
3880
3881 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3882 if (!conn)
3883 goto unlock;
3884
Johan Hedberg9eb1fbf2014-04-11 12:02:31 -07003885 /* For BR/EDR the necessary steps are taken through the
3886 * auth_complete event.
3887 */
3888 if (conn->type != LE_LINK)
3889 goto unlock;
3890
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003891 if (!ev->status)
3892 conn->sec_level = conn->pending_sec_level;
3893
3894 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
3895
3896 if (ev->status && conn->state == BT_CONNECTED) {
Andre Guedesbed71742013-01-30 11:50:56 -03003897 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
David Herrmann76a68ba2013-04-06 20:28:37 +02003898 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003899 goto unlock;
3900 }
3901
3902 if (conn->state == BT_CONFIG) {
3903 if (!ev->status)
3904 conn->state = BT_CONNECTED;
3905
Johan Hedberg539c4962015-02-18 14:53:57 +02003906 hci_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02003907 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003908 } else {
3909 hci_auth_cfm(conn, ev->status);
3910
3911 hci_conn_hold(conn);
3912 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003913 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003914 }
3915
3916unlock:
3917 hci_dev_unlock(hdev);
3918}
3919
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003920static u8 hci_get_auth_req(struct hci_conn *conn)
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003921{
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003922 /* If remote requests no-bonding follow that lead */
Mikel Astizacabae92013-06-28 10:56:28 +02003923 if (conn->remote_auth == HCI_AT_NO_BONDING ||
3924 conn->remote_auth == HCI_AT_NO_BONDING_MITM)
Waldemar Rymarkiewicz58797bf2011-04-28 12:07:58 +02003925 return conn->remote_auth | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003926
Mikel Astizb7f94c82014-04-08 14:21:31 +02003927 /* If both remote and local have enough IO capabilities, require
3928 * MITM protection
3929 */
3930 if (conn->remote_cap != HCI_IO_NO_INPUT_OUTPUT &&
3931 conn->io_capability != HCI_IO_NO_INPUT_OUTPUT)
3932 return conn->remote_auth | 0x01;
3933
Timo Mueller7e741702014-04-08 14:21:33 +02003934 /* No MITM protection possible so ignore remote requirement */
3935 return (conn->remote_auth & ~0x01) | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003936}
3937
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08003938static u8 bredr_oob_data_present(struct hci_conn *conn)
3939{
3940 struct hci_dev *hdev = conn->hdev;
3941 struct oob_data *data;
3942
3943 data = hci_find_remote_oob_data(hdev, &conn->dst, BDADDR_BREDR);
3944 if (!data)
3945 return 0x00;
3946
Marcel Holtmann455c2ff2015-03-15 16:42:53 -07003947 if (bredr_sc_enabled(hdev)) {
3948 /* When Secure Connections is enabled, then just
3949 * return the present value stored with the OOB
3950 * data. The stored value contains the right present
3951 * information. However it can only be trusted when
3952 * not in Secure Connection Only mode.
Marcel Holtmann659c7fb2015-01-30 23:20:56 -08003953 */
Marcel Holtmann455c2ff2015-03-15 16:42:53 -07003954 if (!hci_dev_test_flag(hdev, HCI_SC_ONLY))
3955 return data->present;
3956
3957 /* When Secure Connections Only mode is enabled, then
3958 * the P-256 values are required. If they are not
3959 * available, then do not declare that OOB data is
3960 * present.
3961 */
3962 if (!memcmp(data->rand256, ZERO_KEY, 16) ||
3963 !memcmp(data->hash256, ZERO_KEY, 16))
Marcel Holtmann659c7fb2015-01-30 23:20:56 -08003964 return 0x00;
3965
Marcel Holtmann455c2ff2015-03-15 16:42:53 -07003966 return 0x02;
Marcel Holtmann659c7fb2015-01-30 23:20:56 -08003967 }
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08003968
Marcel Holtmann455c2ff2015-03-15 16:42:53 -07003969 /* When Secure Connections is not enabled or actually
3970 * not supported by the hardware, then check that if
3971 * P-192 data values are present.
3972 */
3973 if (!memcmp(data->rand192, ZERO_KEY, 16) ||
3974 !memcmp(data->hash192, ZERO_KEY, 16))
3975 return 0x00;
3976
3977 return 0x01;
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08003978}
3979
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003980static void hci_io_capa_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02003981{
3982 struct hci_ev_io_capa_request *ev = (void *) skb->data;
3983 struct hci_conn *conn;
3984
3985 BT_DBG("%s", hdev->name);
3986
3987 hci_dev_lock(hdev);
3988
3989 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003990 if (!conn)
3991 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02003992
Johan Hedberg03b555e2011-01-04 15:40:05 +02003993 hci_conn_hold(conn);
3994
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003995 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg03b555e2011-01-04 15:40:05 +02003996 goto unlock;
3997
Johan Hedberg2f407f02014-07-17 15:35:40 +03003998 /* Allow pairing if we're pairable, the initiators of the
3999 * pairing or if the remote is not requesting bonding.
4000 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004001 if (hci_dev_test_flag(hdev, HCI_BONDABLE) ||
Johan Hedberg2f407f02014-07-17 15:35:40 +03004002 test_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags) ||
Gustavo Padovan807deac2012-05-17 00:36:24 -03004003 (conn->remote_auth & ~0x01) == HCI_AT_NO_BONDING) {
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004004 struct hci_cp_io_capability_reply cp;
4005
4006 bacpy(&cp.bdaddr, &ev->bdaddr);
Hemant Gupta7a7f1e72012-01-16 13:34:29 +05304007 /* Change the IO capability from KeyboardDisplay
4008 * to DisplayYesNo as it is not supported by BT spec. */
4009 cp.capability = (conn->io_capability == 0x04) ?
Mikel Astiza7676312013-06-28 10:56:29 +02004010 HCI_IO_DISPLAY_YESNO : conn->io_capability;
Mikel Astizb7f94c82014-04-08 14:21:31 +02004011
4012 /* If we are initiators, there is no remote information yet */
4013 if (conn->remote_auth == 0xff) {
Mikel Astizb16c6602014-04-08 14:21:34 +02004014 /* Request MITM protection if our IO caps allow it
Johan Hedberg4ad51a72014-06-09 14:41:25 +03004015 * except for the no-bonding case.
Mikel Astizb16c6602014-04-08 14:21:34 +02004016 */
Mikel Astiz6fd6b912014-04-08 14:21:32 +02004017 if (conn->io_capability != HCI_IO_NO_INPUT_OUTPUT &&
Johan Hedberg9f743d72014-07-17 11:56:33 +03004018 conn->auth_type != HCI_AT_NO_BONDING)
Johan Hedberg6c538232014-07-11 15:32:23 +03004019 conn->auth_type |= 0x01;
Mikel Astizb7f94c82014-04-08 14:21:31 +02004020 } else {
4021 conn->auth_type = hci_get_auth_req(conn);
Mikel Astizb7f94c82014-04-08 14:21:31 +02004022 }
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004023
Johan Hedberg82c295b2014-07-30 09:22:24 +03004024 /* If we're not bondable, force one of the non-bondable
4025 * authentication requirement values.
4026 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004027 if (!hci_dev_test_flag(hdev, HCI_BONDABLE))
Johan Hedberg82c295b2014-07-30 09:22:24 +03004028 conn->auth_type &= HCI_AT_NO_BONDING_MITM;
4029
4030 cp.authentication = conn->auth_type;
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08004031 cp.oob_data = bredr_oob_data_present(conn);
Szymon Jancce85ee12011-03-22 13:12:23 +01004032
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004033 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03004034 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02004035 } else {
4036 struct hci_cp_io_capability_neg_reply cp;
4037
4038 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02004039 cp.reason = HCI_ERROR_PAIRING_NOT_ALLOWED;
Johan Hedberg03b555e2011-01-04 15:40:05 +02004040
4041 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03004042 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02004043 }
4044
4045unlock:
4046 hci_dev_unlock(hdev);
4047}
4048
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004049static void hci_io_capa_reply_evt(struct hci_dev *hdev, struct sk_buff *skb)
Johan Hedberg03b555e2011-01-04 15:40:05 +02004050{
4051 struct hci_ev_io_capa_reply *ev = (void *) skb->data;
4052 struct hci_conn *conn;
4053
4054 BT_DBG("%s", hdev->name);
4055
4056 hci_dev_lock(hdev);
4057
4058 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4059 if (!conn)
4060 goto unlock;
4061
Johan Hedberg03b555e2011-01-04 15:40:05 +02004062 conn->remote_cap = ev->capability;
Johan Hedberg03b555e2011-01-04 15:40:05 +02004063 conn->remote_auth = ev->authentication;
4064
4065unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02004066 hci_dev_unlock(hdev);
4067}
4068
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004069static void hci_user_confirm_request_evt(struct hci_dev *hdev,
4070 struct sk_buff *skb)
Johan Hedberga5c29682011-02-19 12:05:57 -03004071{
4072 struct hci_ev_user_confirm_req *ev = (void *) skb->data;
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004073 int loc_mitm, rem_mitm, confirm_hint = 0;
Johan Hedberg7a828902011-04-28 11:28:53 -07004074 struct hci_conn *conn;
Johan Hedberga5c29682011-02-19 12:05:57 -03004075
4076 BT_DBG("%s", hdev->name);
4077
4078 hci_dev_lock(hdev);
4079
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004080 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg7a828902011-04-28 11:28:53 -07004081 goto unlock;
Johan Hedberga5c29682011-02-19 12:05:57 -03004082
Johan Hedberg7a828902011-04-28 11:28:53 -07004083 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4084 if (!conn)
4085 goto unlock;
4086
4087 loc_mitm = (conn->auth_type & 0x01);
4088 rem_mitm = (conn->remote_auth & 0x01);
4089
4090 /* If we require MITM but the remote device can't provide that
Johan Hedberg6c538232014-07-11 15:32:23 +03004091 * (it has NoInputNoOutput) then reject the confirmation
4092 * request. We check the security level here since it doesn't
4093 * necessarily match conn->auth_type.
Mikel Astiz6fd6b912014-04-08 14:21:32 +02004094 */
Johan Hedberg6c538232014-07-11 15:32:23 +03004095 if (conn->pending_sec_level > BT_SECURITY_MEDIUM &&
4096 conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) {
Johan Hedberg7a828902011-04-28 11:28:53 -07004097 BT_DBG("Rejecting request: remote device can't provide MITM");
4098 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03004099 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07004100 goto unlock;
4101 }
4102
4103 /* If no side requires MITM protection; auto-accept */
Mikel Astiza7676312013-06-28 10:56:29 +02004104 if ((!loc_mitm || conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) &&
4105 (!rem_mitm || conn->io_capability == HCI_IO_NO_INPUT_OUTPUT)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004106
4107 /* If we're not the initiators request authorization to
4108 * proceed from user space (mgmt_user_confirm with
Johan Hedbergba15a582014-06-09 13:58:14 +03004109 * confirm_hint set to 1). The exception is if neither
Johan Hedberg02f3e252014-07-16 15:09:13 +03004110 * side had MITM or if the local IO capability is
4111 * NoInputNoOutput, in which case we do auto-accept
Johan Hedbergba15a582014-06-09 13:58:14 +03004112 */
4113 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) &&
Johan Hedberg02f3e252014-07-16 15:09:13 +03004114 conn->io_capability != HCI_IO_NO_INPUT_OUTPUT &&
Johan Hedbergba15a582014-06-09 13:58:14 +03004115 (loc_mitm || rem_mitm)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004116 BT_DBG("Confirming auto-accept as acceptor");
4117 confirm_hint = 1;
4118 goto confirm;
4119 }
4120
Johan Hedberg9f616562011-04-28 11:28:54 -07004121 BT_DBG("Auto-accept of user confirmation with %ums delay",
Gustavo Padovan807deac2012-05-17 00:36:24 -03004122 hdev->auto_accept_delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07004123
4124 if (hdev->auto_accept_delay > 0) {
4125 int delay = msecs_to_jiffies(hdev->auto_accept_delay);
Johan Hedberg7bc18d92013-10-16 18:11:39 +03004126 queue_delayed_work(conn->hdev->workqueue,
4127 &conn->auto_accept_work, delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07004128 goto unlock;
4129 }
4130
Johan Hedberg7a828902011-04-28 11:28:53 -07004131 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03004132 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07004133 goto unlock;
4134 }
4135
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004136confirm:
Johan Hedberg39adbff2014-03-20 08:18:14 +02004137 mgmt_user_confirm_request(hdev, &ev->bdaddr, ACL_LINK, 0,
4138 le32_to_cpu(ev->passkey), confirm_hint);
Johan Hedberg7a828902011-04-28 11:28:53 -07004139
4140unlock:
Johan Hedberga5c29682011-02-19 12:05:57 -03004141 hci_dev_unlock(hdev);
4142}
4143
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004144static void hci_user_passkey_request_evt(struct hci_dev *hdev,
4145 struct sk_buff *skb)
Brian Gix1143d452011-11-23 08:28:34 -08004146{
4147 struct hci_ev_user_passkey_req *ev = (void *) skb->data;
4148
4149 BT_DBG("%s", hdev->name);
4150
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004151 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg272d90d2012-02-09 15:26:12 +02004152 mgmt_user_passkey_request(hdev, &ev->bdaddr, ACL_LINK, 0);
Brian Gix1143d452011-11-23 08:28:34 -08004153}
4154
Johan Hedberg92a25252012-09-06 18:39:26 +03004155static void hci_user_passkey_notify_evt(struct hci_dev *hdev,
4156 struct sk_buff *skb)
4157{
4158 struct hci_ev_user_passkey_notify *ev = (void *) skb->data;
4159 struct hci_conn *conn;
4160
4161 BT_DBG("%s", hdev->name);
4162
4163 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4164 if (!conn)
4165 return;
4166
4167 conn->passkey_notify = __le32_to_cpu(ev->passkey);
4168 conn->passkey_entered = 0;
4169
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004170 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg92a25252012-09-06 18:39:26 +03004171 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
4172 conn->dst_type, conn->passkey_notify,
4173 conn->passkey_entered);
4174}
4175
4176static void hci_keypress_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
4177{
4178 struct hci_ev_keypress_notify *ev = (void *) skb->data;
4179 struct hci_conn *conn;
4180
4181 BT_DBG("%s", hdev->name);
4182
4183 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4184 if (!conn)
4185 return;
4186
4187 switch (ev->type) {
4188 case HCI_KEYPRESS_STARTED:
4189 conn->passkey_entered = 0;
4190 return;
4191
4192 case HCI_KEYPRESS_ENTERED:
4193 conn->passkey_entered++;
4194 break;
4195
4196 case HCI_KEYPRESS_ERASED:
4197 conn->passkey_entered--;
4198 break;
4199
4200 case HCI_KEYPRESS_CLEARED:
4201 conn->passkey_entered = 0;
4202 break;
4203
4204 case HCI_KEYPRESS_COMPLETED:
4205 return;
4206 }
4207
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004208 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg92a25252012-09-06 18:39:26 +03004209 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
4210 conn->dst_type, conn->passkey_notify,
4211 conn->passkey_entered);
4212}
4213
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004214static void hci_simple_pair_complete_evt(struct hci_dev *hdev,
4215 struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02004216{
4217 struct hci_ev_simple_pair_complete *ev = (void *) skb->data;
4218 struct hci_conn *conn;
4219
4220 BT_DBG("%s", hdev->name);
4221
4222 hci_dev_lock(hdev);
4223
4224 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg2a611692011-02-19 12:06:00 -03004225 if (!conn)
4226 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02004227
Johan Hedbergc1d4fa72014-07-17 15:14:50 +03004228 /* Reset the authentication requirement to unknown */
4229 conn->remote_auth = 0xff;
4230
Johan Hedberg2a611692011-02-19 12:06:00 -03004231 /* To avoid duplicate auth_failed events to user space we check
4232 * the HCI_CONN_AUTH_PEND flag which will be set if we
4233 * initiated the authentication. A traditional auth_complete
4234 * event gets always produced as initiator and is also mapped to
4235 * the mgmt_auth_failed event */
Mikel Astizfa1bd912012-08-09 09:52:29 +02004236 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) && ev->status)
Johan Hedberge1e930f2014-09-08 17:09:49 -07004237 mgmt_auth_failed(conn, ev->status);
Johan Hedberg2a611692011-02-19 12:06:00 -03004238
David Herrmann76a68ba2013-04-06 20:28:37 +02004239 hci_conn_drop(conn);
Johan Hedberg2a611692011-02-19 12:06:00 -03004240
4241unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02004242 hci_dev_unlock(hdev);
4243}
4244
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004245static void hci_remote_host_features_evt(struct hci_dev *hdev,
4246 struct sk_buff *skb)
Marcel Holtmann41a96212008-07-14 20:13:48 +02004247{
4248 struct hci_ev_remote_host_features *ev = (void *) skb->data;
4249 struct inquiry_entry *ie;
Johan Hedbergcad718e2013-04-17 15:00:51 +03004250 struct hci_conn *conn;
Marcel Holtmann41a96212008-07-14 20:13:48 +02004251
4252 BT_DBG("%s", hdev->name);
4253
4254 hci_dev_lock(hdev);
4255
Johan Hedbergcad718e2013-04-17 15:00:51 +03004256 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4257 if (conn)
4258 memcpy(conn->features[1], ev->features, 8);
4259
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02004260 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
4261 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02004262 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann41a96212008-07-14 20:13:48 +02004263
4264 hci_dev_unlock(hdev);
4265}
4266
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004267static void hci_remote_oob_data_request_evt(struct hci_dev *hdev,
4268 struct sk_buff *skb)
Szymon Janc2763eda2011-03-22 13:12:22 +01004269{
4270 struct hci_ev_remote_oob_data_request *ev = (void *) skb->data;
4271 struct oob_data *data;
4272
4273 BT_DBG("%s", hdev->name);
4274
4275 hci_dev_lock(hdev);
4276
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004277 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Szymon Jance1ba1f12011-04-06 13:01:59 +02004278 goto unlock;
4279
Johan Hedberg6928a922014-10-26 20:46:09 +01004280 data = hci_find_remote_oob_data(hdev, &ev->bdaddr, BDADDR_BREDR);
Marcel Holtmann6665d052015-01-27 16:04:31 -08004281 if (!data) {
Szymon Janc2763eda2011-03-22 13:12:22 +01004282 struct hci_cp_remote_oob_data_neg_reply cp;
4283
4284 bacpy(&cp.bdaddr, &ev->bdaddr);
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08004285 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_NEG_REPLY,
4286 sizeof(cp), &cp);
Marcel Holtmann6665d052015-01-27 16:04:31 -08004287 goto unlock;
4288 }
4289
4290 if (bredr_sc_enabled(hdev)) {
4291 struct hci_cp_remote_oob_ext_data_reply cp;
4292
4293 bacpy(&cp.bdaddr, &ev->bdaddr);
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004294 if (hci_dev_test_flag(hdev, HCI_SC_ONLY)) {
Marcel Holtmann6665d052015-01-27 16:04:31 -08004295 memset(cp.hash192, 0, sizeof(cp.hash192));
4296 memset(cp.rand192, 0, sizeof(cp.rand192));
4297 } else {
4298 memcpy(cp.hash192, data->hash192, sizeof(cp.hash192));
4299 memcpy(cp.rand192, data->rand192, sizeof(cp.rand192));
4300 }
4301 memcpy(cp.hash256, data->hash256, sizeof(cp.hash256));
4302 memcpy(cp.rand256, data->rand256, sizeof(cp.rand256));
4303
4304 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_EXT_DATA_REPLY,
4305 sizeof(cp), &cp);
4306 } else {
4307 struct hci_cp_remote_oob_data_reply cp;
4308
4309 bacpy(&cp.bdaddr, &ev->bdaddr);
4310 memcpy(cp.hash, data->hash192, sizeof(cp.hash));
4311 memcpy(cp.rand, data->rand192, sizeof(cp.rand));
4312
4313 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_REPLY,
4314 sizeof(cp), &cp);
Szymon Janc2763eda2011-03-22 13:12:22 +01004315 }
4316
Szymon Jance1ba1f12011-04-06 13:01:59 +02004317unlock:
Szymon Janc2763eda2011-03-22 13:12:22 +01004318 hci_dev_unlock(hdev);
4319}
4320
Arron Wanga77a6a12015-07-24 17:13:15 +08004321#if IS_ENABLED(CONFIG_BT_HS)
4322static void hci_chan_selected_evt(struct hci_dev *hdev, struct sk_buff *skb)
4323{
4324 struct hci_ev_channel_selected *ev = (void *)skb->data;
4325 struct hci_conn *hcon;
4326
4327 BT_DBG("%s handle 0x%2.2x", hdev->name, ev->phy_handle);
4328
4329 skb_pull(skb, sizeof(*ev));
4330
4331 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4332 if (!hcon)
4333 return;
4334
4335 amp_read_loc_assoc_final_data(hdev, hcon);
4336}
4337
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004338static void hci_phy_link_complete_evt(struct hci_dev *hdev,
4339 struct sk_buff *skb)
4340{
4341 struct hci_ev_phy_link_complete *ev = (void *) skb->data;
4342 struct hci_conn *hcon, *bredr_hcon;
4343
4344 BT_DBG("%s handle 0x%2.2x status 0x%2.2x", hdev->name, ev->phy_handle,
4345 ev->status);
4346
4347 hci_dev_lock(hdev);
4348
4349 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4350 if (!hcon) {
4351 hci_dev_unlock(hdev);
4352 return;
4353 }
4354
4355 if (ev->status) {
4356 hci_conn_del(hcon);
4357 hci_dev_unlock(hdev);
4358 return;
4359 }
4360
4361 bredr_hcon = hcon->amp_mgr->l2cap_conn->hcon;
4362
4363 hcon->state = BT_CONNECTED;
4364 bacpy(&hcon->dst, &bredr_hcon->dst);
4365
4366 hci_conn_hold(hcon);
4367 hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02004368 hci_conn_drop(hcon);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004369
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01004370 hci_debugfs_create_conn(hcon);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004371 hci_conn_add_sysfs(hcon);
4372
Andrei Emeltchenkocf70ff22012-10-31 15:46:36 +02004373 amp_physical_cfm(bredr_hcon, hcon);
4374
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004375 hci_dev_unlock(hdev);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004376}
4377
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004378static void hci_loglink_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
4379{
4380 struct hci_ev_logical_link_complete *ev = (void *) skb->data;
4381 struct hci_conn *hcon;
4382 struct hci_chan *hchan;
4383 struct amp_mgr *mgr;
4384
4385 BT_DBG("%s log_handle 0x%4.4x phy_handle 0x%2.2x status 0x%2.2x",
4386 hdev->name, le16_to_cpu(ev->handle), ev->phy_handle,
4387 ev->status);
4388
4389 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4390 if (!hcon)
4391 return;
4392
4393 /* Create AMP hchan */
4394 hchan = hci_chan_create(hcon);
4395 if (!hchan)
4396 return;
4397
4398 hchan->handle = le16_to_cpu(ev->handle);
4399
4400 BT_DBG("hcon %p mgr %p hchan %p", hcon, hcon->amp_mgr, hchan);
4401
4402 mgr = hcon->amp_mgr;
4403 if (mgr && mgr->bredr_chan) {
4404 struct l2cap_chan *bredr_chan = mgr->bredr_chan;
4405
4406 l2cap_chan_lock(bredr_chan);
4407
4408 bredr_chan->conn->mtu = hdev->block_mtu;
4409 l2cap_logical_cfm(bredr_chan, hchan, 0);
4410 hci_conn_hold(hcon);
4411
4412 l2cap_chan_unlock(bredr_chan);
4413 }
4414}
4415
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02004416static void hci_disconn_loglink_complete_evt(struct hci_dev *hdev,
4417 struct sk_buff *skb)
4418{
4419 struct hci_ev_disconn_logical_link_complete *ev = (void *) skb->data;
4420 struct hci_chan *hchan;
4421
4422 BT_DBG("%s log handle 0x%4.4x status 0x%2.2x", hdev->name,
4423 le16_to_cpu(ev->handle), ev->status);
4424
4425 if (ev->status)
4426 return;
4427
4428 hci_dev_lock(hdev);
4429
4430 hchan = hci_chan_lookup_handle(hdev, le16_to_cpu(ev->handle));
4431 if (!hchan)
4432 goto unlock;
4433
4434 amp_destroy_logical_link(hchan, ev->reason);
4435
4436unlock:
4437 hci_dev_unlock(hdev);
4438}
4439
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02004440static void hci_disconn_phylink_complete_evt(struct hci_dev *hdev,
4441 struct sk_buff *skb)
4442{
4443 struct hci_ev_disconn_phy_link_complete *ev = (void *) skb->data;
4444 struct hci_conn *hcon;
4445
4446 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4447
4448 if (ev->status)
4449 return;
4450
4451 hci_dev_lock(hdev);
4452
4453 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4454 if (hcon) {
4455 hcon->state = BT_CLOSED;
4456 hci_conn_del(hcon);
4457 }
4458
4459 hci_dev_unlock(hdev);
4460}
Arron Wanga77a6a12015-07-24 17:13:15 +08004461#endif
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02004462
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004463static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03004464{
4465 struct hci_ev_le_conn_complete *ev = (void *) skb->data;
Johan Hedberg912b42e2014-07-03 19:33:49 +03004466 struct hci_conn_params *params;
Ville Tervofcd89c02011-02-10 22:38:47 -03004467 struct hci_conn *conn;
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004468 struct smp_irk *irk;
Johan Hedberg837d5022014-07-02 09:36:22 +03004469 u8 addr_type;
Ville Tervofcd89c02011-02-10 22:38:47 -03004470
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004471 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Ville Tervofcd89c02011-02-10 22:38:47 -03004472
4473 hci_dev_lock(hdev);
4474
Johan Hedbergfbd96c12014-07-08 17:21:51 +03004475 /* All controllers implicitly stop advertising in the event of a
4476 * connection, so ensure that the state bit is cleared.
4477 */
Marcel Holtmanna358dc12015-03-13 02:11:02 -07004478 hci_dev_clear_flag(hdev, HCI_LE_ADV);
Johan Hedbergfbd96c12014-07-08 17:21:51 +03004479
Jakub Pawlowskie7d9ab72015-08-07 20:22:52 +02004480 conn = hci_lookup_le_connect(hdev);
Ville Tervob62f3282011-02-10 22:38:50 -03004481 if (!conn) {
Johan Hedberga5c4e302014-07-16 11:56:07 +03004482 conn = hci_conn_add(hdev, LE_LINK, &ev->bdaddr, ev->role);
Ville Tervob62f3282011-02-10 22:38:50 -03004483 if (!conn) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01004484 bt_dev_err(hdev, "no memory for new connection");
Andre Guedes230fd162012-07-27 15:10:10 -03004485 goto unlock;
Ville Tervob62f3282011-02-10 22:38:50 -03004486 }
Andre Guedes29b79882011-05-31 14:20:54 -03004487
4488 conn->dst_type = ev->bdaddr_type;
Andre Guedesb9b343d2012-07-27 15:10:11 -03004489
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004490 /* If we didn't have a hci_conn object previously
4491 * but we're in master role this must be something
4492 * initiated using a white list. Since white list based
4493 * connections are not "first class citizens" we don't
4494 * have full tracking of them. Therefore, we go ahead
4495 * with a "best effort" approach of determining the
4496 * initiator address based on the HCI_PRIVACY flag.
4497 */
4498 if (conn->out) {
4499 conn->resp_addr_type = ev->bdaddr_type;
4500 bacpy(&conn->resp_addr, &ev->bdaddr);
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004501 if (hci_dev_test_flag(hdev, HCI_PRIVACY)) {
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004502 conn->init_addr_type = ADDR_LE_DEV_RANDOM;
4503 bacpy(&conn->init_addr, &hdev->rpa);
4504 } else {
4505 hci_copy_identity_address(hdev,
4506 &conn->init_addr,
4507 &conn->init_addr_type);
4508 }
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004509 }
Johan Hedberg9489eca2014-02-28 17:45:46 +02004510 } else {
4511 cancel_delayed_work(&conn->le_conn_timeout);
Ville Tervob62f3282011-02-10 22:38:50 -03004512 }
Ville Tervofcd89c02011-02-10 22:38:47 -03004513
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004514 if (!conn->out) {
4515 /* Set the responder (our side) address type based on
4516 * the advertising address type.
4517 */
4518 conn->resp_addr_type = hdev->adv_addr_type;
4519 if (hdev->adv_addr_type == ADDR_LE_DEV_RANDOM)
4520 bacpy(&conn->resp_addr, &hdev->random_addr);
4521 else
4522 bacpy(&conn->resp_addr, &hdev->bdaddr);
4523
4524 conn->init_addr_type = ev->bdaddr_type;
4525 bacpy(&conn->init_addr, &ev->bdaddr);
Marcel Holtmanna720d732014-06-23 12:14:51 +02004526
4527 /* For incoming connections, set the default minimum
4528 * and maximum connection interval. They will be used
4529 * to check if the parameters are in range and if not
4530 * trigger the connection update procedure.
4531 */
4532 conn->le_conn_min_interval = hdev->le_conn_min_interval;
4533 conn->le_conn_max_interval = hdev->le_conn_max_interval;
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004534 }
Johan Hedberg7be2edb2014-02-23 19:42:17 +02004535
Marcel Holtmannedb4b462014-02-18 15:13:43 -08004536 /* Lookup the identity address from the stored connection
4537 * address and address type.
4538 *
4539 * When establishing connections to an identity address, the
4540 * connection procedure will store the resolvable random
4541 * address first. Now if it can be converted back into the
4542 * identity address, start using the identity address from
4543 * now on.
4544 */
4545 irk = hci_get_irk(hdev, &conn->dst, conn->dst_type);
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004546 if (irk) {
4547 bacpy(&conn->dst, &irk->bdaddr);
4548 conn->dst_type = irk->addr_type;
4549 }
4550
Johan Hedberg2d3c2262014-07-15 11:51:28 +03004551 if (ev->status) {
4552 hci_le_conn_failed(conn, ev->status);
Johan Hedberg837d5022014-07-02 09:36:22 +03004553 goto unlock;
4554 }
4555
Johan Hedberg08853f12014-08-15 21:06:55 +03004556 if (conn->dst_type == ADDR_LE_DEV_PUBLIC)
4557 addr_type = BDADDR_LE_PUBLIC;
4558 else
4559 addr_type = BDADDR_LE_RANDOM;
4560
Johan Hedberg2d3c2262014-07-15 11:51:28 +03004561 /* Drop the connection if the device is blocked */
4562 if (hci_bdaddr_list_lookup(&hdev->blacklist, &conn->dst, addr_type)) {
4563 hci_conn_drop(conn);
Andre Guedescd17dec2012-07-27 15:10:16 -03004564 goto unlock;
4565 }
4566
Johan Hedbergb644ba32012-01-17 21:48:47 +02004567 if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00004568 mgmt_device_connected(hdev, conn, 0, NULL, 0);
Vinicius Costa Gomes83bc71b2011-05-06 18:41:43 -03004569
Vinicius Costa Gomes7b5c0d52011-06-09 18:50:50 -03004570 conn->sec_level = BT_SECURITY_LOW;
Ville Tervofcd89c02011-02-10 22:38:47 -03004571 conn->handle = __le16_to_cpu(ev->handle);
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07004572 conn->state = BT_CONFIG;
Ville Tervofcd89c02011-02-10 22:38:47 -03004573
Marcel Holtmanne04fde62014-06-23 11:40:04 +02004574 conn->le_conn_interval = le16_to_cpu(ev->interval);
4575 conn->le_conn_latency = le16_to_cpu(ev->latency);
4576 conn->le_supv_timeout = le16_to_cpu(ev->supervision_timeout);
4577
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01004578 hci_debugfs_create_conn(conn);
Ville Tervofcd89c02011-02-10 22:38:47 -03004579 hci_conn_add_sysfs(conn);
4580
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07004581 if (!ev->status) {
4582 /* The remote features procedure is defined for master
4583 * role only. So only in case of an initiated connection
4584 * request the remote features.
4585 *
4586 * If the local controller supports slave-initiated features
4587 * exchange, then requesting the remote features in slave
4588 * role is possible. Otherwise just transition into the
4589 * connected state without requesting the remote features.
4590 */
4591 if (conn->out ||
4592 (hdev->le_features[0] & HCI_LE_SLAVE_FEATURES)) {
4593 struct hci_cp_le_read_remote_features cp;
4594
4595 cp.handle = __cpu_to_le16(conn->handle);
4596
4597 hci_send_cmd(hdev, HCI_OP_LE_READ_REMOTE_FEATURES,
4598 sizeof(cp), &cp);
4599
4600 hci_conn_hold(conn);
4601 } else {
4602 conn->state = BT_CONNECTED;
4603 hci_connect_cfm(conn, ev->status);
4604 }
4605 } else {
4606 hci_connect_cfm(conn, ev->status);
4607 }
Ville Tervofcd89c02011-02-10 22:38:47 -03004608
Johan Hedberg54776102014-08-15 21:06:56 +03004609 params = hci_pend_le_action_lookup(&hdev->pend_le_conns, &conn->dst,
4610 conn->dst_type);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004611 if (params) {
Johan Hedberg95305ba2014-07-04 12:37:21 +03004612 list_del_init(&params->action);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004613 if (params->conn) {
4614 hci_conn_drop(params->conn);
Johan Hedbergf8aaf9b2014-08-17 23:28:57 +03004615 hci_conn_put(params->conn);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004616 params->conn = NULL;
4617 }
4618 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004619
Ville Tervofcd89c02011-02-10 22:38:47 -03004620unlock:
Johan Hedberg223683a2014-07-06 15:44:23 +03004621 hci_update_background_scan(hdev);
Ville Tervofcd89c02011-02-10 22:38:47 -03004622 hci_dev_unlock(hdev);
4623}
4624
Marcel Holtmann1855d922014-06-23 11:40:05 +02004625static void hci_le_conn_update_complete_evt(struct hci_dev *hdev,
4626 struct sk_buff *skb)
4627{
4628 struct hci_ev_le_conn_update_complete *ev = (void *) skb->data;
4629 struct hci_conn *conn;
4630
4631 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4632
4633 if (ev->status)
4634 return;
4635
4636 hci_dev_lock(hdev);
4637
4638 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
4639 if (conn) {
4640 conn->le_conn_interval = le16_to_cpu(ev->interval);
4641 conn->le_conn_latency = le16_to_cpu(ev->latency);
4642 conn->le_supv_timeout = le16_to_cpu(ev->supervision_timeout);
4643 }
4644
4645 hci_dev_unlock(hdev);
4646}
4647
Andre Guedesa4790db2014-02-26 20:21:47 -03004648/* This function requires the caller holds hdev->lock */
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004649static struct hci_conn *check_pending_le_conn(struct hci_dev *hdev,
4650 bdaddr_t *addr,
Szymon Janc082f2302018-04-03 13:40:06 +02004651 u8 addr_type, u8 adv_type,
4652 bdaddr_t *direct_rpa)
Andre Guedesa4790db2014-02-26 20:21:47 -03004653{
4654 struct hci_conn *conn;
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004655 struct hci_conn_params *params;
Andre Guedesa4790db2014-02-26 20:21:47 -03004656
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004657 /* If the event is not connectable don't proceed further */
4658 if (adv_type != LE_ADV_IND && adv_type != LE_ADV_DIRECT_IND)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004659 return NULL;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004660
4661 /* Ignore if the device is blocked */
Johan Hedbergdcc36c12014-07-09 12:59:13 +03004662 if (hci_bdaddr_list_lookup(&hdev->blacklist, addr, addr_type))
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004663 return NULL;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004664
Johan Hedbergf99353c2014-07-16 11:56:09 +03004665 /* Most controller will fail if we try to create new connections
4666 * while we have an existing one in slave role.
4667 */
4668 if (hdev->conn_hash.le_num_slave > 0)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004669 return NULL;
Johan Hedbergf99353c2014-07-16 11:56:09 +03004670
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004671 /* If we're not connectable only connect devices that we have in
4672 * our pend_le_conns list.
4673 */
Johan Hedberg49c50922015-10-16 10:07:51 +03004674 params = hci_pend_le_action_lookup(&hdev->pend_le_conns, addr,
4675 addr_type);
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004676 if (!params)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004677 return NULL;
Andre Guedesa4790db2014-02-26 20:21:47 -03004678
Jakub Pawlowski28a667c2015-08-07 20:22:54 +02004679 if (!params->explicit_connect) {
4680 switch (params->auto_connect) {
4681 case HCI_AUTO_CONN_DIRECT:
4682 /* Only devices advertising with ADV_DIRECT_IND are
4683 * triggering a connection attempt. This is allowing
4684 * incoming connections from slave devices.
4685 */
4686 if (adv_type != LE_ADV_DIRECT_IND)
4687 return NULL;
4688 break;
4689 case HCI_AUTO_CONN_ALWAYS:
4690 /* Devices advertising with ADV_IND or ADV_DIRECT_IND
4691 * are triggering a connection attempt. This means
4692 * that incoming connectioms from slave device are
4693 * accepted and also outgoing connections to slave
4694 * devices are established when found.
4695 */
4696 break;
4697 default:
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004698 return NULL;
Jakub Pawlowski28a667c2015-08-07 20:22:54 +02004699 }
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004700 }
4701
Andre Guedesa4790db2014-02-26 20:21:47 -03004702 conn = hci_connect_le(hdev, addr, addr_type, BT_SECURITY_LOW,
Szymon Janc082f2302018-04-03 13:40:06 +02004703 HCI_LE_AUTOCONN_TIMEOUT, HCI_ROLE_MASTER,
4704 direct_rpa);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004705 if (!IS_ERR(conn)) {
Jakub Pawlowski28a667c2015-08-07 20:22:54 +02004706 /* If HCI_AUTO_CONN_EXPLICIT is set, conn is already owned
4707 * by higher layer that tried to connect, if no then
4708 * store the pointer since we don't really have any
Johan Hedbergf161dd42014-08-15 21:06:54 +03004709 * other owner of the object besides the params that
4710 * triggered it. This way we can abort the connection if
4711 * the parameters get removed and keep the reference
4712 * count consistent once the connection is established.
4713 */
Jakub Pawlowski28a667c2015-08-07 20:22:54 +02004714
4715 if (!params->explicit_connect)
4716 params->conn = hci_conn_get(conn);
4717
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004718 return conn;
Johan Hedbergf161dd42014-08-15 21:06:54 +03004719 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004720
4721 switch (PTR_ERR(conn)) {
4722 case -EBUSY:
4723 /* If hci_connect() returns -EBUSY it means there is already
4724 * an LE connection attempt going on. Since controllers don't
4725 * support more than one connection attempt at the time, we
4726 * don't consider this an error case.
4727 */
4728 break;
4729 default:
4730 BT_DBG("Failed to connect: err %ld", PTR_ERR(conn));
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004731 return NULL;
Andre Guedesa4790db2014-02-26 20:21:47 -03004732 }
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004733
4734 return NULL;
Andre Guedesa4790db2014-02-26 20:21:47 -03004735}
4736
Johan Hedberg4af605d2014-03-24 10:48:00 +02004737static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr,
Marcel Holtmann2f010b52014-12-05 16:20:13 +01004738 u8 bdaddr_type, bdaddr_t *direct_addr,
4739 u8 direct_addr_type, s8 rssi, u8 *data, u8 len)
Johan Hedberg4af605d2014-03-24 10:48:00 +02004740{
Johan Hedbergb9a63282014-03-25 10:51:52 +02004741 struct discovery_state *d = &hdev->discovery;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004742 struct smp_irk *irk;
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004743 struct hci_conn *conn;
Johan Hedberg474ee062014-03-25 14:34:59 +02004744 bool match;
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004745 u32 flags;
Szymon Janc68183752015-09-16 20:21:54 +02004746 u8 *ptr, real_len;
4747
Johan Hedberg56b40fb2016-04-07 21:01:27 +03004748 switch (type) {
4749 case LE_ADV_IND:
4750 case LE_ADV_DIRECT_IND:
4751 case LE_ADV_SCAN_IND:
4752 case LE_ADV_NONCONN_IND:
4753 case LE_ADV_SCAN_RSP:
4754 break;
4755 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01004756 bt_dev_err_ratelimited(hdev, "unknown advertising packet "
4757 "type: 0x%02x", type);
Johan Hedberg56b40fb2016-04-07 21:01:27 +03004758 return;
4759 }
4760
Szymon Janc68183752015-09-16 20:21:54 +02004761 /* Find the end of the data in case the report contains padded zero
4762 * bytes at the end causing an invalid length value.
4763 *
4764 * When data is NULL, len is 0 so there is no need for extra ptr
4765 * check as 'ptr < data + 0' is already false in such case.
4766 */
4767 for (ptr = data; ptr < data + len && *ptr; ptr += *ptr + 1) {
4768 if (ptr + 1 + *ptr > data + len)
4769 break;
4770 }
4771
4772 real_len = ptr - data;
4773
4774 /* Adjust for actual length */
4775 if (len != real_len) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01004776 bt_dev_err_ratelimited(hdev, "advertising data len corrected");
Szymon Janc68183752015-09-16 20:21:54 +02004777 len = real_len;
4778 }
Johan Hedbergb9a63282014-03-25 10:51:52 +02004779
Marcel Holtmann2f010b52014-12-05 16:20:13 +01004780 /* If the direct address is present, then this report is from
4781 * a LE Direct Advertising Report event. In that case it is
4782 * important to see if the address is matching the local
4783 * controller address.
4784 */
4785 if (direct_addr) {
4786 /* Only resolvable random addresses are valid for these
4787 * kind of reports and others can be ignored.
4788 */
4789 if (!hci_bdaddr_is_rpa(direct_addr, direct_addr_type))
4790 return;
4791
4792 /* If the controller is not using resolvable random
4793 * addresses, then this report can be ignored.
4794 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004795 if (!hci_dev_test_flag(hdev, HCI_PRIVACY))
Marcel Holtmann2f010b52014-12-05 16:20:13 +01004796 return;
4797
4798 /* If the local IRK of the controller does not match
4799 * with the resolvable random address provided, then
4800 * this report can be ignored.
4801 */
4802 if (!smp_irk_matches(hdev, hdev->irk, direct_addr))
4803 return;
4804 }
4805
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004806 /* Check if we need to convert to identity address */
4807 irk = hci_get_irk(hdev, bdaddr, bdaddr_type);
4808 if (irk) {
4809 bdaddr = &irk->bdaddr;
4810 bdaddr_type = irk->addr_type;
4811 }
4812
Szymon Janc082f2302018-04-03 13:40:06 +02004813 /* Check if we have been requested to connect to this device.
4814 *
4815 * direct_addr is set only for directed advertising reports (it is NULL
4816 * for advertising reports) and is already verified to be RPA above.
4817 */
4818 conn = check_pending_le_conn(hdev, bdaddr, bdaddr_type, type,
4819 direct_addr);
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004820 if (conn && type == LE_ADV_IND) {
4821 /* Store report for later inclusion by
4822 * mgmt_device_connected
4823 */
4824 memcpy(conn->le_adv_data, data, len);
4825 conn->le_adv_data_len = len;
4826 }
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004827
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004828 /* Passive scanning shouldn't trigger any device found events,
4829 * except for devices marked as CONN_REPORT for which we do send
4830 * device found events.
4831 */
Johan Hedbergca5c4be2014-03-25 10:30:46 +02004832 if (hdev->le_scan_type == LE_SCAN_PASSIVE) {
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004833 if (type == LE_ADV_DIRECT_IND)
4834 return;
4835
Johan Hedberg3a19b6f2014-07-15 08:07:59 +03004836 if (!hci_pend_le_action_lookup(&hdev->pend_le_reports,
4837 bdaddr, bdaddr_type))
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004838 return;
4839
4840 if (type == LE_ADV_NONCONN_IND || type == LE_ADV_SCAN_IND)
4841 flags = MGMT_DEV_FOUND_NOT_CONNECTABLE;
4842 else
4843 flags = 0;
4844 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
4845 rssi, flags, data, len, NULL, 0);
Johan Hedberg97bf2e92014-07-04 12:37:16 +03004846 return;
Johan Hedbergca5c4be2014-03-25 10:30:46 +02004847 }
Johan Hedberg4af605d2014-03-24 10:48:00 +02004848
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004849 /* When receiving non-connectable or scannable undirected
4850 * advertising reports, this means that the remote device is
4851 * not connectable and then clearly indicate this in the
4852 * device found event.
4853 *
4854 * When receiving a scan response, then there is no way to
4855 * know if the remote device is connectable or not. However
4856 * since scan responses are merged with a previously seen
4857 * advertising report, the flags field from that report
4858 * will be used.
4859 *
4860 * In the really unlikely case that a controller get confused
4861 * and just sends a scan response event, then it is marked as
4862 * not connectable as well.
4863 */
4864 if (type == LE_ADV_NONCONN_IND || type == LE_ADV_SCAN_IND ||
4865 type == LE_ADV_SCAN_RSP)
4866 flags = MGMT_DEV_FOUND_NOT_CONNECTABLE;
4867 else
4868 flags = 0;
4869
Johan Hedbergb9a63282014-03-25 10:51:52 +02004870 /* If there's nothing pending either store the data from this
4871 * event or send an immediate device found event if the data
4872 * should not be stored for later.
4873 */
4874 if (!has_pending_adv_report(hdev)) {
4875 /* If the report will trigger a SCAN_REQ store it for
4876 * later merging.
4877 */
4878 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
4879 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004880 rssi, flags, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004881 return;
4882 }
4883
4884 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004885 rssi, flags, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004886 return;
4887 }
4888
Johan Hedberg474ee062014-03-25 14:34:59 +02004889 /* Check if the pending report is for the same device as the new one */
4890 match = (!bacmp(bdaddr, &d->last_adv_addr) &&
4891 bdaddr_type == d->last_adv_addr_type);
4892
Johan Hedbergb9a63282014-03-25 10:51:52 +02004893 /* If the pending data doesn't match this report or this isn't a
4894 * scan response (e.g. we got a duplicate ADV_IND) then force
4895 * sending of the pending data.
4896 */
Johan Hedberg474ee062014-03-25 14:34:59 +02004897 if (type != LE_ADV_SCAN_RSP || !match) {
4898 /* Send out whatever is in the cache, but skip duplicates */
4899 if (!match)
4900 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004901 d->last_adv_addr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004902 d->last_adv_rssi, d->last_adv_flags,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004903 d->last_adv_data,
Johan Hedberg474ee062014-03-25 14:34:59 +02004904 d->last_adv_data_len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004905
4906 /* If the new report will trigger a SCAN_REQ store it for
4907 * later merging.
4908 */
4909 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
4910 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004911 rssi, flags, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004912 return;
4913 }
4914
4915 /* The advertising reports cannot be merged, so clear
4916 * the pending report and send out a device found event.
4917 */
4918 clear_pending_adv_report(hdev);
Johan Hedberg5c5b93e2014-03-29 08:39:53 +02004919 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
4924 /* If we get here we've got a pending ADV_IND or ADV_SCAN_IND and
4925 * the new event is a SCAN_RSP. We can therefore proceed with
4926 * sending a merged device found event.
4927 */
4928 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004929 d->last_adv_addr_type, NULL, rssi, d->last_adv_flags,
Marcel Holtmann42bd6a52014-07-01 14:11:19 +02004930 d->last_adv_data, d->last_adv_data_len, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004931 clear_pending_adv_report(hdev);
Johan Hedberg4af605d2014-03-24 10:48:00 +02004932}
4933
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004934static void hci_le_adv_report_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andre Guedes9aa04c92011-05-26 16:23:51 -03004935{
Andre Guedese95beb42011-09-26 20:48:35 -03004936 u8 num_reports = skb->data[0];
4937 void *ptr = &skb->data[1];
Andre Guedes9aa04c92011-05-26 16:23:51 -03004938
Andre Guedesa4790db2014-02-26 20:21:47 -03004939 hci_dev_lock(hdev);
4940
Andre Guedese95beb42011-09-26 20:48:35 -03004941 while (num_reports--) {
4942 struct hci_ev_le_advertising_info *ev = ptr;
Johan Hedberg4af605d2014-03-24 10:48:00 +02004943 s8 rssi;
Andre Guedesa4790db2014-02-26 20:21:47 -03004944
Andre Guedes3c9e9192012-01-10 18:20:50 -03004945 rssi = ev->data[ev->length];
Johan Hedberg4af605d2014-03-24 10:48:00 +02004946 process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
Marcel Holtmann2f010b52014-12-05 16:20:13 +01004947 ev->bdaddr_type, NULL, 0, rssi,
4948 ev->data, ev->length);
Andre Guedes3c9e9192012-01-10 18:20:50 -03004949
Andre Guedese95beb42011-09-26 20:48:35 -03004950 ptr += sizeof(*ev) + ev->length + 1;
Andre Guedes9aa04c92011-05-26 16:23:51 -03004951 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004952
4953 hci_dev_unlock(hdev);
Andre Guedes9aa04c92011-05-26 16:23:51 -03004954}
4955
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07004956static void hci_le_remote_feat_complete_evt(struct hci_dev *hdev,
4957 struct sk_buff *skb)
4958{
4959 struct hci_ev_le_remote_feat_complete *ev = (void *)skb->data;
4960 struct hci_conn *conn;
4961
4962 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4963
4964 hci_dev_lock(hdev);
4965
4966 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
4967 if (conn) {
4968 if (!ev->status)
4969 memcpy(conn->features[0], ev->features, 8);
4970
4971 if (conn->state == BT_CONFIG) {
4972 __u8 status;
4973
4974 /* If the local controller supports slave-initiated
4975 * features exchange, but the remote controller does
4976 * not, then it is possible that the error code 0x1a
4977 * for unsupported remote feature gets returned.
4978 *
4979 * In this specific case, allow the connection to
4980 * transition into connected state and mark it as
4981 * successful.
4982 */
4983 if ((hdev->le_features[0] & HCI_LE_SLAVE_FEATURES) &&
4984 !conn->out && ev->status == 0x1a)
4985 status = 0x00;
4986 else
4987 status = ev->status;
4988
4989 conn->state = BT_CONNECTED;
4990 hci_connect_cfm(conn, status);
4991 hci_conn_drop(conn);
4992 }
4993 }
4994
4995 hci_dev_unlock(hdev);
4996}
4997
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004998static void hci_le_ltk_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004999{
5000 struct hci_ev_le_ltk_req *ev = (void *) skb->data;
5001 struct hci_cp_le_ltk_reply cp;
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03005002 struct hci_cp_le_ltk_neg_reply neg;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005003 struct hci_conn *conn;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03005004 struct smp_ltk *ltk;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005005
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03005006 BT_DBG("%s handle 0x%4.4x", hdev->name, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005007
5008 hci_dev_lock(hdev);
5009
5010 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03005011 if (conn == NULL)
5012 goto not_found;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005013
Johan Hedbergf3a73d92014-05-29 15:02:59 +03005014 ltk = hci_find_ltk(hdev, &conn->dst, conn->dst_type, conn->role);
Johan Hedberg5378bc52014-05-29 14:00:39 +03005015 if (!ltk)
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03005016 goto not_found;
5017
Johan Hedberg5378bc52014-05-29 14:00:39 +03005018 if (smp_ltk_is_sc(ltk)) {
5019 /* With SC both EDiv and Rand are set to zero */
5020 if (ev->ediv || ev->rand)
5021 goto not_found;
5022 } else {
5023 /* For non-SC keys check that EDiv and Rand match */
5024 if (ev->ediv != ltk->ediv || ev->rand != ltk->rand)
5025 goto not_found;
5026 }
5027
Johan Hedberg8b76ce32015-06-08 18:14:39 +03005028 memcpy(cp.ltk, ltk->val, ltk->enc_size);
5029 memset(cp.ltk + ltk->enc_size, 0, sizeof(cp.ltk) - ltk->enc_size);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005030 cp.handle = cpu_to_le16(conn->handle);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03005031
Johan Hedberga6f78332014-09-10 17:37:45 -07005032 conn->pending_sec_level = smp_ltk_sec_level(ltk);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005033
Andre Guedes89cbb4d2013-07-31 16:25:29 -03005034 conn->enc_key_size = ltk->enc_size;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005035
5036 hci_send_cmd(hdev, HCI_OP_LE_LTK_REPLY, sizeof(cp), &cp);
5037
Claudio Takahasi5981a882013-07-25 16:34:24 -03005038 /* Ref. Bluetooth Core SPEC pages 1975 and 2004. STK is a
5039 * temporary key used to encrypt a connection following
5040 * pairing. It is used during the Encrypted Session Setup to
5041 * distribute the keys. Later, security can be re-established
5042 * using a distributed LTK.
5043 */
Johan Hedberg2ceba532014-06-16 19:25:16 +03005044 if (ltk->type == SMP_STK) {
Johan Hedbergfe59a052014-07-01 19:14:12 +03005045 set_bit(HCI_CONN_STK_ENCRYPT, &conn->flags);
Johan Hedberg970d0f12014-11-13 14:37:47 +02005046 list_del_rcu(&ltk->list);
5047 kfree_rcu(ltk, rcu);
Johan Hedbergfe59a052014-07-01 19:14:12 +03005048 } else {
5049 clear_bit(HCI_CONN_STK_ENCRYPT, &conn->flags);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03005050 }
5051
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005052 hci_dev_unlock(hdev);
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03005053
5054 return;
5055
5056not_found:
5057 neg.handle = ev->handle;
5058 hci_send_cmd(hdev, HCI_OP_LE_LTK_NEG_REPLY, sizeof(neg), &neg);
5059 hci_dev_unlock(hdev);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005060}
5061
Andre Guedes8e75b462014-07-01 18:10:08 -03005062static void send_conn_param_neg_reply(struct hci_dev *hdev, u16 handle,
5063 u8 reason)
5064{
5065 struct hci_cp_le_conn_param_req_neg_reply cp;
5066
5067 cp.handle = cpu_to_le16(handle);
5068 cp.reason = reason;
5069
5070 hci_send_cmd(hdev, HCI_OP_LE_CONN_PARAM_REQ_NEG_REPLY, sizeof(cp),
5071 &cp);
5072}
5073
5074static void hci_le_remote_conn_param_req_evt(struct hci_dev *hdev,
5075 struct sk_buff *skb)
5076{
5077 struct hci_ev_le_remote_conn_param_req *ev = (void *) skb->data;
5078 struct hci_cp_le_conn_param_req_reply cp;
5079 struct hci_conn *hcon;
5080 u16 handle, min, max, latency, timeout;
5081
5082 handle = le16_to_cpu(ev->handle);
5083 min = le16_to_cpu(ev->interval_min);
5084 max = le16_to_cpu(ev->interval_max);
5085 latency = le16_to_cpu(ev->latency);
5086 timeout = le16_to_cpu(ev->timeout);
5087
5088 hcon = hci_conn_hash_lookup_handle(hdev, handle);
5089 if (!hcon || hcon->state != BT_CONNECTED)
5090 return send_conn_param_neg_reply(hdev, handle,
5091 HCI_ERROR_UNKNOWN_CONN_ID);
5092
5093 if (hci_check_conn_params(min, max, latency, timeout))
5094 return send_conn_param_neg_reply(hdev, handle,
5095 HCI_ERROR_INVALID_LL_PARAMS);
5096
Johan Hedberg40bef302014-07-16 11:42:27 +03005097 if (hcon->role == HCI_ROLE_MASTER) {
Johan Hedberg348d50b2014-07-02 17:37:30 +03005098 struct hci_conn_params *params;
Johan Hedbergf4869e22014-07-02 17:37:32 +03005099 u8 store_hint;
Johan Hedberg348d50b2014-07-02 17:37:30 +03005100
5101 hci_dev_lock(hdev);
5102
5103 params = hci_conn_params_lookup(hdev, &hcon->dst,
5104 hcon->dst_type);
5105 if (params) {
5106 params->conn_min_interval = min;
5107 params->conn_max_interval = max;
5108 params->conn_latency = latency;
5109 params->supervision_timeout = timeout;
Johan Hedbergf4869e22014-07-02 17:37:32 +03005110 store_hint = 0x01;
5111 } else{
5112 store_hint = 0x00;
Johan Hedberg348d50b2014-07-02 17:37:30 +03005113 }
5114
5115 hci_dev_unlock(hdev);
5116
Johan Hedbergf4869e22014-07-02 17:37:32 +03005117 mgmt_new_conn_param(hdev, &hcon->dst, hcon->dst_type,
5118 store_hint, min, max, latency, timeout);
Johan Hedberg348d50b2014-07-02 17:37:30 +03005119 }
Andre Guedesffb5a8272014-07-01 18:10:11 -03005120
Andre Guedes8e75b462014-07-01 18:10:08 -03005121 cp.handle = ev->handle;
5122 cp.interval_min = ev->interval_min;
5123 cp.interval_max = ev->interval_max;
5124 cp.latency = ev->latency;
5125 cp.timeout = ev->timeout;
5126 cp.min_ce_len = 0;
5127 cp.max_ce_len = 0;
5128
5129 hci_send_cmd(hdev, HCI_OP_LE_CONN_PARAM_REQ_REPLY, sizeof(cp), &cp);
5130}
5131
Marcel Holtmann2f010b52014-12-05 16:20:13 +01005132static void hci_le_direct_adv_report_evt(struct hci_dev *hdev,
5133 struct sk_buff *skb)
5134{
5135 u8 num_reports = skb->data[0];
5136 void *ptr = &skb->data[1];
5137
5138 hci_dev_lock(hdev);
5139
5140 while (num_reports--) {
5141 struct hci_ev_le_direct_adv_info *ev = ptr;
5142
5143 process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
5144 ev->bdaddr_type, &ev->direct_addr,
5145 ev->direct_addr_type, ev->rssi, NULL, 0);
5146
5147 ptr += sizeof(*ev);
5148 }
5149
5150 hci_dev_unlock(hdev);
5151}
5152
Gustavo Padovan6039aa72012-05-23 04:04:18 -03005153static void hci_le_meta_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03005154{
5155 struct hci_ev_le_meta *le_ev = (void *) skb->data;
5156
5157 skb_pull(skb, sizeof(*le_ev));
5158
5159 switch (le_ev->subevent) {
5160 case HCI_EV_LE_CONN_COMPLETE:
5161 hci_le_conn_complete_evt(hdev, skb);
5162 break;
5163
Marcel Holtmann1855d922014-06-23 11:40:05 +02005164 case HCI_EV_LE_CONN_UPDATE_COMPLETE:
5165 hci_le_conn_update_complete_evt(hdev, skb);
5166 break;
5167
Andre Guedes9aa04c92011-05-26 16:23:51 -03005168 case HCI_EV_LE_ADVERTISING_REPORT:
5169 hci_le_adv_report_evt(hdev, skb);
5170 break;
5171
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07005172 case HCI_EV_LE_REMOTE_FEAT_COMPLETE:
5173 hci_le_remote_feat_complete_evt(hdev, skb);
5174 break;
5175
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005176 case HCI_EV_LE_LTK_REQ:
5177 hci_le_ltk_request_evt(hdev, skb);
5178 break;
5179
Andre Guedes8e75b462014-07-01 18:10:08 -03005180 case HCI_EV_LE_REMOTE_CONN_PARAM_REQ:
5181 hci_le_remote_conn_param_req_evt(hdev, skb);
5182 break;
5183
Marcel Holtmann2f010b52014-12-05 16:20:13 +01005184 case HCI_EV_LE_DIRECT_ADV_REPORT:
5185 hci_le_direct_adv_report_evt(hdev, skb);
5186 break;
5187
Ville Tervofcd89c02011-02-10 22:38:47 -03005188 default:
5189 break;
5190 }
5191}
5192
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005193static bool hci_get_cmd_complete(struct hci_dev *hdev, u16 opcode,
5194 u8 event, struct sk_buff *skb)
5195{
5196 struct hci_ev_cmd_complete *ev;
5197 struct hci_event_hdr *hdr;
5198
5199 if (!skb)
5200 return false;
5201
5202 if (skb->len < sizeof(*hdr)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01005203 bt_dev_err(hdev, "too short HCI event");
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005204 return false;
5205 }
5206
5207 hdr = (void *) skb->data;
5208 skb_pull(skb, HCI_EVENT_HDR_SIZE);
5209
5210 if (event) {
5211 if (hdr->evt != event)
5212 return false;
5213 return true;
5214 }
5215
5216 if (hdr->evt != HCI_EV_CMD_COMPLETE) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01005217 bt_dev_err(hdev, "last event is not cmd complete (0x%2.2x)",
5218 hdr->evt);
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005219 return false;
5220 }
5221
5222 if (skb->len < sizeof(*ev)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01005223 bt_dev_err(hdev, "too short cmd_complete event");
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005224 return false;
5225 }
5226
5227 ev = (void *) skb->data;
5228 skb_pull(skb, sizeof(*ev));
5229
5230 if (opcode != __le16_to_cpu(ev->opcode)) {
5231 BT_DBG("opcode doesn't match (0x%2.2x != 0x%2.2x)", opcode,
5232 __le16_to_cpu(ev->opcode));
5233 return false;
5234 }
5235
5236 return true;
5237}
5238
Linus Torvalds1da177e2005-04-16 15:20:36 -07005239void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)
5240{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005241 struct hci_event_hdr *hdr = (void *) skb->data;
Johan Hedberge62144872015-04-02 13:41:08 +03005242 hci_req_complete_t req_complete = NULL;
5243 hci_req_complete_skb_t req_complete_skb = NULL;
5244 struct sk_buff *orig_skb = NULL;
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005245 u8 status = 0, event = hdr->evt, req_evt = 0;
Johan Hedberge62144872015-04-02 13:41:08 +03005246 u16 opcode = HCI_OP_NOP;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005247
Marcel Holtmann242c0eb2015-10-25 22:45:53 +01005248 if (hdev->sent_cmd && bt_cb(hdev->sent_cmd)->hci.req_event == event) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02005249 struct hci_command_hdr *cmd_hdr = (void *) hdev->sent_cmd->data;
Johan Hedberge62144872015-04-02 13:41:08 +03005250 opcode = __le16_to_cpu(cmd_hdr->opcode);
5251 hci_req_cmd_complete(hdev, opcode, status, &req_complete,
5252 &req_complete_skb);
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005253 req_evt = event;
Johan Hedberg02350a72013-04-03 21:50:29 +03005254 }
5255
Johan Hedberge62144872015-04-02 13:41:08 +03005256 /* If it looks like we might end up having to call
5257 * req_complete_skb, store a pristine copy of the skb since the
5258 * various handlers may modify the original one through
5259 * skb_pull() calls, etc.
5260 */
5261 if (req_complete_skb || event == HCI_EV_CMD_STATUS ||
5262 event == HCI_EV_CMD_COMPLETE)
5263 orig_skb = skb_clone(skb, GFP_KERNEL);
5264
5265 skb_pull(skb, HCI_EVENT_HDR_SIZE);
5266
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005267 switch (event) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005268 case HCI_EV_INQUIRY_COMPLETE:
5269 hci_inquiry_complete_evt(hdev, skb);
5270 break;
5271
5272 case HCI_EV_INQUIRY_RESULT:
5273 hci_inquiry_result_evt(hdev, skb);
5274 break;
5275
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005276 case HCI_EV_CONN_COMPLETE:
5277 hci_conn_complete_evt(hdev, skb);
Marcel Holtmann21d9e302005-09-13 01:32:25 +02005278 break;
5279
Linus Torvalds1da177e2005-04-16 15:20:36 -07005280 case HCI_EV_CONN_REQUEST:
5281 hci_conn_request_evt(hdev, skb);
5282 break;
5283
Linus Torvalds1da177e2005-04-16 15:20:36 -07005284 case HCI_EV_DISCONN_COMPLETE:
5285 hci_disconn_complete_evt(hdev, skb);
5286 break;
5287
Linus Torvalds1da177e2005-04-16 15:20:36 -07005288 case HCI_EV_AUTH_COMPLETE:
5289 hci_auth_complete_evt(hdev, skb);
5290 break;
5291
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005292 case HCI_EV_REMOTE_NAME:
5293 hci_remote_name_evt(hdev, skb);
5294 break;
5295
Linus Torvalds1da177e2005-04-16 15:20:36 -07005296 case HCI_EV_ENCRYPT_CHANGE:
5297 hci_encrypt_change_evt(hdev, skb);
5298 break;
5299
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005300 case HCI_EV_CHANGE_LINK_KEY_COMPLETE:
5301 hci_change_link_key_complete_evt(hdev, skb);
5302 break;
5303
5304 case HCI_EV_REMOTE_FEATURES:
5305 hci_remote_features_evt(hdev, skb);
5306 break;
5307
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005308 case HCI_EV_CMD_COMPLETE:
Johan Hedberge62144872015-04-02 13:41:08 +03005309 hci_cmd_complete_evt(hdev, skb, &opcode, &status,
5310 &req_complete, &req_complete_skb);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005311 break;
5312
5313 case HCI_EV_CMD_STATUS:
Johan Hedberge62144872015-04-02 13:41:08 +03005314 hci_cmd_status_evt(hdev, skb, &opcode, &status, &req_complete,
5315 &req_complete_skb);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005316 break;
5317
Marcel Holtmann24dfa342014-11-02 02:56:41 +01005318 case HCI_EV_HARDWARE_ERROR:
5319 hci_hardware_error_evt(hdev, skb);
5320 break;
5321
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005322 case HCI_EV_ROLE_CHANGE:
5323 hci_role_change_evt(hdev, skb);
5324 break;
5325
5326 case HCI_EV_NUM_COMP_PKTS:
5327 hci_num_comp_pkts_evt(hdev, skb);
5328 break;
5329
5330 case HCI_EV_MODE_CHANGE:
5331 hci_mode_change_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005332 break;
5333
5334 case HCI_EV_PIN_CODE_REQ:
5335 hci_pin_code_request_evt(hdev, skb);
5336 break;
5337
5338 case HCI_EV_LINK_KEY_REQ:
5339 hci_link_key_request_evt(hdev, skb);
5340 break;
5341
5342 case HCI_EV_LINK_KEY_NOTIFY:
5343 hci_link_key_notify_evt(hdev, skb);
5344 break;
5345
5346 case HCI_EV_CLOCK_OFFSET:
5347 hci_clock_offset_evt(hdev, skb);
5348 break;
5349
Marcel Holtmanna8746412008-07-14 20:13:46 +02005350 case HCI_EV_PKT_TYPE_CHANGE:
5351 hci_pkt_type_change_evt(hdev, skb);
5352 break;
5353
Marcel Holtmann85a1e932005-08-09 20:28:02 -07005354 case HCI_EV_PSCAN_REP_MODE:
5355 hci_pscan_rep_mode_evt(hdev, skb);
5356 break;
5357
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005358 case HCI_EV_INQUIRY_RESULT_WITH_RSSI:
5359 hci_inquiry_result_with_rssi_evt(hdev, skb);
5360 break;
5361
5362 case HCI_EV_REMOTE_EXT_FEATURES:
5363 hci_remote_ext_features_evt(hdev, skb);
5364 break;
5365
5366 case HCI_EV_SYNC_CONN_COMPLETE:
5367 hci_sync_conn_complete_evt(hdev, skb);
5368 break;
5369
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005370 case HCI_EV_EXTENDED_INQUIRY_RESULT:
5371 hci_extended_inquiry_result_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005372 break;
5373
Johan Hedberg1c2e0042012-06-08 23:31:13 +08005374 case HCI_EV_KEY_REFRESH_COMPLETE:
5375 hci_key_refresh_complete_evt(hdev, skb);
5376 break;
5377
Marcel Holtmann04936842008-07-14 20:13:48 +02005378 case HCI_EV_IO_CAPA_REQUEST:
5379 hci_io_capa_request_evt(hdev, skb);
5380 break;
5381
Johan Hedberg03b555e2011-01-04 15:40:05 +02005382 case HCI_EV_IO_CAPA_REPLY:
5383 hci_io_capa_reply_evt(hdev, skb);
5384 break;
5385
Johan Hedberga5c29682011-02-19 12:05:57 -03005386 case HCI_EV_USER_CONFIRM_REQUEST:
5387 hci_user_confirm_request_evt(hdev, skb);
5388 break;
5389
Brian Gix1143d452011-11-23 08:28:34 -08005390 case HCI_EV_USER_PASSKEY_REQUEST:
5391 hci_user_passkey_request_evt(hdev, skb);
5392 break;
5393
Johan Hedberg92a25252012-09-06 18:39:26 +03005394 case HCI_EV_USER_PASSKEY_NOTIFY:
5395 hci_user_passkey_notify_evt(hdev, skb);
5396 break;
5397
5398 case HCI_EV_KEYPRESS_NOTIFY:
5399 hci_keypress_notify_evt(hdev, skb);
5400 break;
5401
Marcel Holtmann04936842008-07-14 20:13:48 +02005402 case HCI_EV_SIMPLE_PAIR_COMPLETE:
5403 hci_simple_pair_complete_evt(hdev, skb);
5404 break;
5405
Marcel Holtmann41a96212008-07-14 20:13:48 +02005406 case HCI_EV_REMOTE_HOST_FEATURES:
5407 hci_remote_host_features_evt(hdev, skb);
5408 break;
5409
Ville Tervofcd89c02011-02-10 22:38:47 -03005410 case HCI_EV_LE_META:
5411 hci_le_meta_evt(hdev, skb);
5412 break;
5413
Szymon Janc2763eda2011-03-22 13:12:22 +01005414 case HCI_EV_REMOTE_OOB_DATA_REQUEST:
5415 hci_remote_oob_data_request_evt(hdev, skb);
5416 break;
5417
Arron Wanga77a6a12015-07-24 17:13:15 +08005418#if IS_ENABLED(CONFIG_BT_HS)
5419 case HCI_EV_CHANNEL_SELECTED:
5420 hci_chan_selected_evt(hdev, skb);
5421 break;
5422
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03005423 case HCI_EV_PHY_LINK_COMPLETE:
5424 hci_phy_link_complete_evt(hdev, skb);
5425 break;
5426
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03005427 case HCI_EV_LOGICAL_LINK_COMPLETE:
5428 hci_loglink_complete_evt(hdev, skb);
5429 break;
5430
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02005431 case HCI_EV_DISCONN_LOGICAL_LINK_COMPLETE:
5432 hci_disconn_loglink_complete_evt(hdev, skb);
5433 break;
5434
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02005435 case HCI_EV_DISCONN_PHY_LINK_COMPLETE:
5436 hci_disconn_phylink_complete_evt(hdev, skb);
5437 break;
Arron Wanga77a6a12015-07-24 17:13:15 +08005438#endif
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02005439
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02005440 case HCI_EV_NUM_COMP_BLOCKS:
5441 hci_num_comp_blocks_evt(hdev, skb);
5442 break;
5443
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005444 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03005445 BT_DBG("%s event 0x%2.2x", hdev->name, event);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005446 break;
5447 }
5448
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005449 if (req_complete) {
Johan Hedberge62144872015-04-02 13:41:08 +03005450 req_complete(hdev, status, opcode);
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005451 } else if (req_complete_skb) {
5452 if (!hci_get_cmd_complete(hdev, opcode, req_evt, orig_skb)) {
5453 kfree_skb(orig_skb);
5454 orig_skb = NULL;
5455 }
Johan Hedberge62144872015-04-02 13:41:08 +03005456 req_complete_skb(hdev, status, opcode, orig_skb);
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005457 }
Johan Hedberge62144872015-04-02 13:41:08 +03005458
5459 kfree_skb(orig_skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005460 kfree_skb(skb);
5461 hdev->stat.evt_rx++;
5462}