blob: 6ee69a79258f1068313e2b76a6416c590f643b2e [file] [log] [blame]
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 BlueZ - Bluetooth protocol stack for Linux
Ron Shaffer2d0a0342010-05-28 11:53:46 -04003 Copyright (c) 2000-2001, 2010, Code Aurora Forum. All rights reserved.
Linus Torvalds1da177e2005-04-16 15:20:36 -07004
5 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License version 2 as
9 published by the Free Software Foundation;
10
11 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
12 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
14 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090015 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
16 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
Linus Torvalds1da177e2005-04-16 15:20:36 -070018 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090020 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
Linus Torvalds1da177e2005-04-16 15:20:36 -070022 SOFTWARE IS DISCLAIMED.
23*/
24
25/* Bluetooth HCI event handling. */
26
Linus Torvalds1da177e2005-04-16 15:20:36 -070027#include <asm/unaligned.h>
28
29#include <net/bluetooth/bluetooth.h>
30#include <net/bluetooth/hci_core.h>
Mikel Astizf0d6a0e2012-08-09 09:52:30 +020031#include <net/bluetooth/mgmt.h>
Marcel Holtmann7ef9fbf2013-10-10 14:54:14 -070032
Johan Hedberg0857dd32014-12-19 13:40:20 +020033#include "hci_request.h"
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +010034#include "hci_debugfs.h"
Marcel Holtmann70247282013-10-10 14:54:15 -070035#include "a2mp.h"
Marcel Holtmann7ef9fbf2013-10-10 14:54:14 -070036#include "amp.h"
Johan Hedberg2ceba532014-06-16 19:25:16 +030037#include "smp.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070038
Marcel Holtmannaa5b0342015-01-27 16:04:33 -080039#define ZERO_KEY "\x00\x00\x00\x00\x00\x00\x00\x00" \
40 "\x00\x00\x00\x00\x00\x00\x00\x00"
41
Linus Torvalds1da177e2005-04-16 15:20:36 -070042/* Handle HCI Event packets */
43
Marcel Holtmanna9de9242007-10-20 13:33:56 +020044static void hci_cc_inquiry_cancel(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -070045{
Marcel Holtmanna9de9242007-10-20 13:33:56 +020046 __u8 status = *((__u8 *) skb->data);
Linus Torvalds1da177e2005-04-16 15:20:36 -070047
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030048 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -070049
Andre Guedes82f47852013-04-30 15:29:34 -030050 if (status)
Marcel Holtmanna9de9242007-10-20 13:33:56 +020051 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -070052
Andre Guedes89352e72011-11-04 14:16:53 -030053 clear_bit(HCI_INQUIRY, &hdev->flags);
Peter Zijlstra4e857c52014-03-17 18:06:10 +010054 smp_mb__after_atomic(); /* wake_up_bit advises about this barrier */
Andre Guedes3e13fa12013-03-27 20:04:56 -030055 wake_up_bit(&hdev->flags, HCI_INQUIRY);
Andre Guedes89352e72011-11-04 14:16:53 -030056
Johan Hedberg50143a42014-06-10 14:05:57 +030057 hci_dev_lock(hdev);
Jakub Pawlowski168b8a22015-10-16 10:07:49 +030058 /* Set discovery state to stopped if we're not doing LE active
59 * scanning.
60 */
61 if (!hci_dev_test_flag(hdev, HCI_LE_SCAN) ||
62 hdev->le_scan_type != LE_SCAN_ACTIVE)
63 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Johan Hedberg50143a42014-06-10 14:05:57 +030064 hci_dev_unlock(hdev);
65
Marcel Holtmanna9de9242007-10-20 13:33:56 +020066 hci_conn_check_pending(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -070067}
68
Andre Guedes4d934832012-03-21 00:03:35 -030069static void hci_cc_periodic_inq(struct hci_dev *hdev, struct sk_buff *skb)
70{
71 __u8 status = *((__u8 *) skb->data);
72
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030073 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedesae854a72012-03-21 00:03:36 -030074
75 if (status)
76 return;
77
Marcel Holtmanna1536da2015-03-13 02:11:01 -070078 hci_dev_set_flag(hdev, HCI_PERIODIC_INQ);
Andre Guedes4d934832012-03-21 00:03:35 -030079}
80
Marcel Holtmanna9de9242007-10-20 13:33:56 +020081static void hci_cc_exit_periodic_inq(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -070082{
Marcel Holtmanna9de9242007-10-20 13:33:56 +020083 __u8 status = *((__u8 *) skb->data);
84
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030085 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +020086
87 if (status)
88 return;
89
Marcel Holtmanna358dc12015-03-13 02:11:02 -070090 hci_dev_clear_flag(hdev, HCI_PERIODIC_INQ);
Andre Guedesae854a72012-03-21 00:03:36 -030091
Marcel Holtmanna9de9242007-10-20 13:33:56 +020092 hci_conn_check_pending(hdev);
93}
94
Gustavo Padovan807deac2012-05-17 00:36:24 -030095static void hci_cc_remote_name_req_cancel(struct hci_dev *hdev,
96 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +020097{
98 BT_DBG("%s", hdev->name);
99}
100
101static void hci_cc_role_discovery(struct hci_dev *hdev, struct sk_buff *skb)
102{
103 struct hci_rp_role_discovery *rp = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700104 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700105
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300106 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700107
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200108 if (rp->status)
109 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700110
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200111 hci_dev_lock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700112
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200113 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
Johan Hedberg40bef302014-07-16 11:42:27 +0300114 if (conn)
115 conn->role = rp->role;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200116
117 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700118}
119
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200120static void hci_cc_read_link_policy(struct hci_dev *hdev, struct sk_buff *skb)
121{
122 struct hci_rp_read_link_policy *rp = (void *) skb->data;
123 struct hci_conn *conn;
124
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300125 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200126
127 if (rp->status)
128 return;
129
130 hci_dev_lock(hdev);
131
132 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
133 if (conn)
134 conn->link_policy = __le16_to_cpu(rp->policy);
135
136 hci_dev_unlock(hdev);
137}
138
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200139static void hci_cc_write_link_policy(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700140{
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200141 struct hci_rp_write_link_policy *rp = (void *) skb->data;
142 struct hci_conn *conn;
143 void *sent;
144
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300145 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200146
147 if (rp->status)
148 return;
149
150 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LINK_POLICY);
151 if (!sent)
152 return;
153
154 hci_dev_lock(hdev);
155
156 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200157 if (conn)
Harvey Harrison83985312008-05-02 16:25:46 -0700158 conn->link_policy = get_unaligned_le16(sent + 2);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200159
160 hci_dev_unlock(hdev);
161}
162
Gustavo Padovan807deac2012-05-17 00:36:24 -0300163static void hci_cc_read_def_link_policy(struct hci_dev *hdev,
164 struct sk_buff *skb)
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200165{
166 struct hci_rp_read_def_link_policy *rp = (void *) skb->data;
167
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300168 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200169
170 if (rp->status)
171 return;
172
173 hdev->link_policy = __le16_to_cpu(rp->policy);
174}
175
Gustavo Padovan807deac2012-05-17 00:36:24 -0300176static void hci_cc_write_def_link_policy(struct hci_dev *hdev,
177 struct sk_buff *skb)
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200178{
179 __u8 status = *((__u8 *) skb->data);
180 void *sent;
181
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300182 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200183
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200184 if (status)
185 return;
186
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200187 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_DEF_LINK_POLICY);
188 if (!sent)
189 return;
190
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200191 hdev->link_policy = get_unaligned_le16(sent);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200192}
193
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200194static void hci_cc_reset(struct hci_dev *hdev, struct sk_buff *skb)
195{
196 __u8 status = *((__u8 *) skb->data);
197
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300198 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200199
Gustavo F. Padovan10572132011-03-16 15:36:29 -0300200 clear_bit(HCI_RESET, &hdev->flags);
201
Marcel Holtmann8761f9d2014-11-02 02:45:58 +0100202 if (status)
203 return;
204
Johan Hedberga297e972012-02-21 17:55:47 +0200205 /* Reset all non-persistent flags */
Marcel Holtmanneacb44d2015-03-13 09:04:17 -0700206 hci_dev_clear_volatile_flags(hdev);
Andre Guedes69775ff2012-02-23 16:50:05 +0200207
Johan Hedberg39c5d972015-01-28 19:56:01 +0200208 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
209
Johan Hedbergbbaf4442012-11-08 01:22:59 +0100210 hdev->inq_tx_power = HCI_TX_POWER_INVALID;
211 hdev->adv_tx_power = HCI_TX_POWER_INVALID;
Johan Hedberg3f0f5242012-11-08 01:23:00 +0100212
213 memset(hdev->adv_data, 0, sizeof(hdev->adv_data));
214 hdev->adv_data_len = 0;
Marcel Holtmannf8e808b2013-10-16 00:16:47 -0700215
216 memset(hdev->scan_rsp_data, 0, sizeof(hdev->scan_rsp_data));
217 hdev->scan_rsp_data_len = 0;
Marcel Holtmann06f5b772013-10-19 07:09:11 -0700218
Marcel Holtmann533553f2014-03-21 12:18:10 -0700219 hdev->le_scan_type = LE_SCAN_PASSIVE;
220
Marcel Holtmann06f5b772013-10-19 07:09:11 -0700221 hdev->ssp_debug_mode = 0;
Marcel Holtmanna4d55042014-10-29 23:37:53 +0100222
223 hci_bdaddr_list_clear(&hdev->le_white_list);
Ankit Navikcfdb0c22018-06-29 12:12:50 +0530224 hci_bdaddr_list_clear(&hdev->le_resolv_list);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200225}
226
Marcel Holtmannc2f0f972015-01-12 09:21:25 -0800227static void hci_cc_read_stored_link_key(struct hci_dev *hdev,
228 struct sk_buff *skb)
229{
230 struct hci_rp_read_stored_link_key *rp = (void *)skb->data;
231 struct hci_cp_read_stored_link_key *sent;
232
233 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
234
235 sent = hci_sent_cmd_data(hdev, HCI_OP_READ_STORED_LINK_KEY);
236 if (!sent)
237 return;
238
239 if (!rp->status && sent->read_all == 0x01) {
240 hdev->stored_max_keys = rp->max_keys;
241 hdev->stored_num_keys = rp->num_keys;
242 }
243}
244
Marcel Holtmanna93661202015-01-12 09:21:28 -0800245static void hci_cc_delete_stored_link_key(struct hci_dev *hdev,
246 struct sk_buff *skb)
247{
248 struct hci_rp_delete_stored_link_key *rp = (void *)skb->data;
249
250 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
251
252 if (rp->status)
253 return;
254
255 if (rp->num_keys <= hdev->stored_num_keys)
256 hdev->stored_num_keys -= rp->num_keys;
257 else
258 hdev->stored_num_keys = 0;
259}
260
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200261static void hci_cc_write_local_name(struct hci_dev *hdev, struct sk_buff *skb)
262{
263 __u8 status = *((__u8 *) skb->data);
264 void *sent;
265
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300266 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200267
268 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LOCAL_NAME);
269 if (!sent)
270 return;
271
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200272 hci_dev_lock(hdev);
273
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700274 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedbergf51d5b22012-02-22 18:17:32 +0200275 mgmt_set_local_name_complete(hdev, sent, status);
Johan Hedberg28cc7bd2012-02-22 21:06:55 +0200276 else if (!status)
277 memcpy(hdev->dev_name, sent, HCI_MAX_NAME_LENGTH);
Johan Hedbergf51d5b22012-02-22 18:17:32 +0200278
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200279 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200280}
281
282static void hci_cc_read_local_name(struct hci_dev *hdev, struct sk_buff *skb)
283{
284 struct hci_rp_read_local_name *rp = (void *) skb->data;
285
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300286 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200287
288 if (rp->status)
289 return;
290
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700291 if (hci_dev_test_flag(hdev, HCI_SETUP) ||
292 hci_dev_test_flag(hdev, HCI_CONFIG))
Johan Hedbergdb99b5f2012-02-22 20:14:22 +0200293 memcpy(hdev->dev_name, rp->name, HCI_MAX_NAME_LENGTH);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200294}
295
296static void hci_cc_write_auth_enable(struct hci_dev *hdev, struct sk_buff *skb)
297{
298 __u8 status = *((__u8 *) skb->data);
299 void *sent;
300
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300301 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200302
303 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_AUTH_ENABLE);
304 if (!sent)
305 return;
306
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530307 hci_dev_lock(hdev);
308
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200309 if (!status) {
310 __u8 param = *((__u8 *) sent);
311
312 if (param == AUTH_ENABLED)
313 set_bit(HCI_AUTH, &hdev->flags);
314 else
315 clear_bit(HCI_AUTH, &hdev->flags);
316 }
317
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700318 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg33ef95e2012-02-16 23:56:27 +0200319 mgmt_auth_enable_complete(hdev, status);
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530320
321 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200322}
323
324static void hci_cc_write_encrypt_mode(struct hci_dev *hdev, struct sk_buff *skb)
325{
326 __u8 status = *((__u8 *) skb->data);
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200327 __u8 param;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200328 void *sent;
329
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300330 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200331
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200332 if (status)
333 return;
334
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200335 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_ENCRYPT_MODE);
336 if (!sent)
337 return;
338
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200339 param = *((__u8 *) sent);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200340
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200341 if (param)
342 set_bit(HCI_ENCRYPT, &hdev->flags);
343 else
344 clear_bit(HCI_ENCRYPT, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200345}
346
347static void hci_cc_write_scan_enable(struct hci_dev *hdev, struct sk_buff *skb)
348{
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200349 __u8 status = *((__u8 *) skb->data);
350 __u8 param;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200351 void *sent;
352
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300353 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200354
355 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SCAN_ENABLE);
356 if (!sent)
357 return;
358
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200359 param = *((__u8 *) sent);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200360
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200361 hci_dev_lock(hdev);
362
Mikel Astizfa1bd912012-08-09 09:52:29 +0200363 if (status) {
Johan Hedberg2d7cee52011-11-07 22:16:03 +0200364 hdev->discov_timeout = 0;
365 goto done;
366 }
367
Johan Hedbergbc6d2d02014-07-10 12:09:08 +0300368 if (param & SCAN_INQUIRY)
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200369 set_bit(HCI_ISCAN, &hdev->flags);
Johan Hedbergbc6d2d02014-07-10 12:09:08 +0300370 else
371 clear_bit(HCI_ISCAN, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200372
Johan Hedberg031547d2014-07-10 12:09:06 +0300373 if (param & SCAN_PAGE)
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200374 set_bit(HCI_PSCAN, &hdev->flags);
Johan Hedbergbc6d2d02014-07-10 12:09:08 +0300375 else
Johan Hedberg204e3992014-07-28 15:45:31 +0300376 clear_bit(HCI_PSCAN, &hdev->flags);
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200377
378done:
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200379 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200380}
381
382static void hci_cc_read_class_of_dev(struct hci_dev *hdev, struct sk_buff *skb)
383{
384 struct hci_rp_read_class_of_dev *rp = (void *) skb->data;
385
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300386 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200387
388 if (rp->status)
389 return;
390
391 memcpy(hdev->dev_class, rp->dev_class, 3);
392
393 BT_DBG("%s class 0x%.2x%.2x%.2x", hdev->name,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300394 hdev->dev_class[2], hdev->dev_class[1], hdev->dev_class[0]);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200395}
396
397static void hci_cc_write_class_of_dev(struct hci_dev *hdev, struct sk_buff *skb)
398{
399 __u8 status = *((__u8 *) skb->data);
400 void *sent;
401
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300402 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200403
404 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_CLASS_OF_DEV);
405 if (!sent)
406 return;
407
Marcel Holtmann7f9a9032012-02-22 18:38:01 +0100408 hci_dev_lock(hdev);
409
410 if (status == 0)
411 memcpy(hdev->dev_class, sent, 3);
412
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700413 if (hci_dev_test_flag(hdev, HCI_MGMT))
Marcel Holtmann7f9a9032012-02-22 18:38:01 +0100414 mgmt_set_class_of_dev_complete(hdev, sent, status);
415
416 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200417}
418
419static void hci_cc_read_voice_setting(struct hci_dev *hdev, struct sk_buff *skb)
420{
421 struct hci_rp_read_voice_setting *rp = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700422 __u16 setting;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200423
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300424 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200425
426 if (rp->status)
427 return;
428
429 setting = __le16_to_cpu(rp->voice_setting);
430
Marcel Holtmannf383f272008-07-14 20:13:47 +0200431 if (hdev->voice_setting == setting)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200432 return;
433
434 hdev->voice_setting = setting;
435
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300436 BT_DBG("%s voice setting 0x%4.4x", hdev->name, setting);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200437
Gustavo F. Padovan3c547112011-12-14 22:58:44 -0200438 if (hdev->notify)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200439 hdev->notify(hdev, HCI_NOTIFY_VOICE_SETTING);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200440}
441
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300442static void hci_cc_write_voice_setting(struct hci_dev *hdev,
443 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200444{
445 __u8 status = *((__u8 *) skb->data);
Marcel Holtmannf383f272008-07-14 20:13:47 +0200446 __u16 setting;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700447 void *sent;
448
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300449 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700450
Marcel Holtmannf383f272008-07-14 20:13:47 +0200451 if (status)
452 return;
453
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200454 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_VOICE_SETTING);
455 if (!sent)
456 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700457
Marcel Holtmannf383f272008-07-14 20:13:47 +0200458 setting = get_unaligned_le16(sent);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700459
Marcel Holtmannf383f272008-07-14 20:13:47 +0200460 if (hdev->voice_setting == setting)
461 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700462
Marcel Holtmannf383f272008-07-14 20:13:47 +0200463 hdev->voice_setting = setting;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700464
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300465 BT_DBG("%s voice setting 0x%4.4x", hdev->name, setting);
Marcel Holtmannf383f272008-07-14 20:13:47 +0200466
Gustavo F. Padovan3c547112011-12-14 22:58:44 -0200467 if (hdev->notify)
Marcel Holtmannf383f272008-07-14 20:13:47 +0200468 hdev->notify(hdev, HCI_NOTIFY_VOICE_SETTING);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700469}
470
Marcel Holtmannb4cb9fb2013-10-14 13:56:16 -0700471static void hci_cc_read_num_supported_iac(struct hci_dev *hdev,
472 struct sk_buff *skb)
473{
474 struct hci_rp_read_num_supported_iac *rp = (void *) skb->data;
475
476 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
477
478 if (rp->status)
479 return;
480
481 hdev->num_iac = rp->num_iac;
482
483 BT_DBG("%s num iac %d", hdev->name, hdev->num_iac);
484}
485
Marcel Holtmann333140b2008-07-14 20:13:48 +0200486static void hci_cc_write_ssp_mode(struct hci_dev *hdev, struct sk_buff *skb)
487{
488 __u8 status = *((__u8 *) skb->data);
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300489 struct hci_cp_write_ssp_mode *sent;
Marcel Holtmann333140b2008-07-14 20:13:48 +0200490
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300491 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann333140b2008-07-14 20:13:48 +0200492
Marcel Holtmann333140b2008-07-14 20:13:48 +0200493 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SSP_MODE);
494 if (!sent)
495 return;
496
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530497 hci_dev_lock(hdev);
498
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300499 if (!status) {
500 if (sent->mode)
Johan Hedbergcad718e2013-04-17 15:00:51 +0300501 hdev->features[1][0] |= LMP_HOST_SSP;
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300502 else
Johan Hedbergcad718e2013-04-17 15:00:51 +0300503 hdev->features[1][0] &= ~LMP_HOST_SSP;
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300504 }
505
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700506 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300507 mgmt_ssp_enable_complete(hdev, sent->mode, status);
Johan Hedbergc0ecddc2012-02-22 12:38:31 +0200508 else if (!status) {
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300509 if (sent->mode)
Marcel Holtmanna1536da2015-03-13 02:11:01 -0700510 hci_dev_set_flag(hdev, HCI_SSP_ENABLED);
Johan Hedbergc0ecddc2012-02-22 12:38:31 +0200511 else
Marcel Holtmanna358dc12015-03-13 02:11:02 -0700512 hci_dev_clear_flag(hdev, HCI_SSP_ENABLED);
Johan Hedbergc0ecddc2012-02-22 12:38:31 +0200513 }
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530514
515 hci_dev_unlock(hdev);
Marcel Holtmann333140b2008-07-14 20:13:48 +0200516}
517
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800518static void hci_cc_write_sc_support(struct hci_dev *hdev, struct sk_buff *skb)
519{
520 u8 status = *((u8 *) skb->data);
521 struct hci_cp_write_sc_support *sent;
522
523 BT_DBG("%s status 0x%2.2x", hdev->name, status);
524
525 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SC_SUPPORT);
526 if (!sent)
527 return;
528
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530529 hci_dev_lock(hdev);
530
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800531 if (!status) {
532 if (sent->support)
533 hdev->features[1][0] |= LMP_HOST_SC;
534 else
535 hdev->features[1][0] &= ~LMP_HOST_SC;
536 }
537
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700538 if (!hci_dev_test_flag(hdev, HCI_MGMT) && !status) {
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800539 if (sent->support)
Marcel Holtmanna1536da2015-03-13 02:11:01 -0700540 hci_dev_set_flag(hdev, HCI_SC_ENABLED);
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800541 else
Marcel Holtmanna358dc12015-03-13 02:11:02 -0700542 hci_dev_clear_flag(hdev, HCI_SC_ENABLED);
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800543 }
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530544
545 hci_dev_unlock(hdev);
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800546}
547
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200548static void hci_cc_read_local_version(struct hci_dev *hdev, struct sk_buff *skb)
549{
550 struct hci_rp_read_local_version *rp = (void *) skb->data;
551
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300552 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200553
554 if (rp->status)
Johan Hedberg42c6b122013-03-05 20:37:49 +0200555 return;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200556
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700557 if (hci_dev_test_flag(hdev, HCI_SETUP) ||
558 hci_dev_test_flag(hdev, HCI_CONFIG)) {
Marcel Holtmann0d5551f2013-10-18 12:04:50 -0700559 hdev->hci_ver = rp->hci_ver;
560 hdev->hci_rev = __le16_to_cpu(rp->hci_rev);
561 hdev->lmp_ver = rp->lmp_ver;
562 hdev->manufacturer = __le16_to_cpu(rp->manufacturer);
563 hdev->lmp_subver = __le16_to_cpu(rp->lmp_subver);
564 }
Johan Hedbergd5859e22011-01-25 01:19:58 +0200565}
566
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300567static void hci_cc_read_local_commands(struct hci_dev *hdev,
568 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200569{
570 struct hci_rp_read_local_commands *rp = (void *) skb->data;
571
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300572 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200573
Marcel Holtmann6a070e62013-10-31 04:54:33 -0700574 if (rp->status)
575 return;
576
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700577 if (hci_dev_test_flag(hdev, HCI_SETUP) ||
578 hci_dev_test_flag(hdev, HCI_CONFIG))
Johan Hedberg2177bab2013-03-05 20:37:43 +0200579 memcpy(hdev->commands, rp->commands, sizeof(hdev->commands));
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200580}
581
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300582static void hci_cc_read_local_features(struct hci_dev *hdev,
583 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200584{
585 struct hci_rp_read_local_features *rp = (void *) skb->data;
586
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300587 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200588
589 if (rp->status)
590 return;
591
592 memcpy(hdev->features, rp->features, 8);
593
594 /* Adjust default settings according to features
595 * supported by device. */
596
Johan Hedbergcad718e2013-04-17 15:00:51 +0300597 if (hdev->features[0][0] & LMP_3SLOT)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200598 hdev->pkt_type |= (HCI_DM3 | HCI_DH3);
599
Johan Hedbergcad718e2013-04-17 15:00:51 +0300600 if (hdev->features[0][0] & LMP_5SLOT)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200601 hdev->pkt_type |= (HCI_DM5 | HCI_DH5);
602
Johan Hedbergcad718e2013-04-17 15:00:51 +0300603 if (hdev->features[0][1] & LMP_HV2) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200604 hdev->pkt_type |= (HCI_HV2);
605 hdev->esco_type |= (ESCO_HV2);
606 }
607
Johan Hedbergcad718e2013-04-17 15:00:51 +0300608 if (hdev->features[0][1] & LMP_HV3) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200609 hdev->pkt_type |= (HCI_HV3);
610 hdev->esco_type |= (ESCO_HV3);
611 }
612
Andre Guedes45db810f2012-07-24 15:03:49 -0300613 if (lmp_esco_capable(hdev))
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200614 hdev->esco_type |= (ESCO_EV3);
615
Johan Hedbergcad718e2013-04-17 15:00:51 +0300616 if (hdev->features[0][4] & LMP_EV4)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200617 hdev->esco_type |= (ESCO_EV4);
618
Johan Hedbergcad718e2013-04-17 15:00:51 +0300619 if (hdev->features[0][4] & LMP_EV5)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200620 hdev->esco_type |= (ESCO_EV5);
621
Johan Hedbergcad718e2013-04-17 15:00:51 +0300622 if (hdev->features[0][5] & LMP_EDR_ESCO_2M)
Marcel Holtmannefc76882009-02-06 09:13:37 +0100623 hdev->esco_type |= (ESCO_2EV3);
624
Johan Hedbergcad718e2013-04-17 15:00:51 +0300625 if (hdev->features[0][5] & LMP_EDR_ESCO_3M)
Marcel Holtmannefc76882009-02-06 09:13:37 +0100626 hdev->esco_type |= (ESCO_3EV3);
627
Johan Hedbergcad718e2013-04-17 15:00:51 +0300628 if (hdev->features[0][5] & LMP_EDR_3S_ESCO)
Marcel Holtmannefc76882009-02-06 09:13:37 +0100629 hdev->esco_type |= (ESCO_2EV5 | ESCO_3EV5);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200630}
631
Andre Guedes971e3a42011-06-30 19:20:52 -0300632static void hci_cc_read_local_ext_features(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300633 struct sk_buff *skb)
Andre Guedes971e3a42011-06-30 19:20:52 -0300634{
635 struct hci_rp_read_local_ext_features *rp = (void *) skb->data;
636
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300637 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andre Guedes971e3a42011-06-30 19:20:52 -0300638
639 if (rp->status)
Johan Hedberg42c6b122013-03-05 20:37:49 +0200640 return;
Andre Guedes971e3a42011-06-30 19:20:52 -0300641
Marcel Holtmann57af75a2013-10-18 12:04:47 -0700642 if (hdev->max_page < rp->max_page)
643 hdev->max_page = rp->max_page;
Johan Hedbergd2c5d772013-04-17 15:00:52 +0300644
Johan Hedbergcad718e2013-04-17 15:00:51 +0300645 if (rp->page < HCI_MAX_PAGES)
646 memcpy(hdev->features[rp->page], rp->features, 8);
Andre Guedes971e3a42011-06-30 19:20:52 -0300647}
648
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200649static void hci_cc_read_flow_control_mode(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300650 struct sk_buff *skb)
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200651{
652 struct hci_rp_read_flow_control_mode *rp = (void *) skb->data;
653
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300654 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200655
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200656 if (rp->status)
657 return;
658
659 hdev->flow_ctl_mode = rp->mode;
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200660}
661
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200662static void hci_cc_read_buffer_size(struct hci_dev *hdev, struct sk_buff *skb)
663{
664 struct hci_rp_read_buffer_size *rp = (void *) skb->data;
665
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300666 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200667
668 if (rp->status)
669 return;
670
671 hdev->acl_mtu = __le16_to_cpu(rp->acl_mtu);
672 hdev->sco_mtu = rp->sco_mtu;
673 hdev->acl_pkts = __le16_to_cpu(rp->acl_max_pkt);
674 hdev->sco_pkts = __le16_to_cpu(rp->sco_max_pkt);
675
676 if (test_bit(HCI_QUIRK_FIXUP_BUFFER_SIZE, &hdev->quirks)) {
677 hdev->sco_mtu = 64;
678 hdev->sco_pkts = 8;
679 }
680
681 hdev->acl_cnt = hdev->acl_pkts;
682 hdev->sco_cnt = hdev->sco_pkts;
683
Gustavo Padovan807deac2012-05-17 00:36:24 -0300684 BT_DBG("%s acl mtu %d:%d sco mtu %d:%d", hdev->name, hdev->acl_mtu,
685 hdev->acl_pkts, hdev->sco_mtu, hdev->sco_pkts);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200686}
687
688static void hci_cc_read_bd_addr(struct hci_dev *hdev, struct sk_buff *skb)
689{
690 struct hci_rp_read_bd_addr *rp = (void *) skb->data;
691
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300692 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200693
Marcel Holtmanne30d3f52014-07-05 10:48:03 +0200694 if (rp->status)
695 return;
696
697 if (test_bit(HCI_INIT, &hdev->flags))
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200698 bacpy(&hdev->bdaddr, &rp->bdaddr);
Marcel Holtmanne30d3f52014-07-05 10:48:03 +0200699
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700700 if (hci_dev_test_flag(hdev, HCI_SETUP))
Marcel Holtmanne30d3f52014-07-05 10:48:03 +0200701 bacpy(&hdev->setup_addr, &rp->bdaddr);
Johan Hedberg23bb5762010-12-21 23:01:27 +0200702}
703
Johan Hedbergf332ec62013-03-15 17:07:11 -0500704static void hci_cc_read_page_scan_activity(struct hci_dev *hdev,
705 struct sk_buff *skb)
706{
707 struct hci_rp_read_page_scan_activity *rp = (void *) skb->data;
708
709 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
710
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200711 if (rp->status)
712 return;
713
714 if (test_bit(HCI_INIT, &hdev->flags)) {
Johan Hedbergf332ec62013-03-15 17:07:11 -0500715 hdev->page_scan_interval = __le16_to_cpu(rp->interval);
716 hdev->page_scan_window = __le16_to_cpu(rp->window);
717 }
718}
719
Johan Hedberg4a3ee762013-03-15 17:07:12 -0500720static void hci_cc_write_page_scan_activity(struct hci_dev *hdev,
721 struct sk_buff *skb)
722{
723 u8 status = *((u8 *) skb->data);
724 struct hci_cp_write_page_scan_activity *sent;
725
726 BT_DBG("%s status 0x%2.2x", hdev->name, status);
727
728 if (status)
729 return;
730
731 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY);
732 if (!sent)
733 return;
734
735 hdev->page_scan_interval = __le16_to_cpu(sent->interval);
736 hdev->page_scan_window = __le16_to_cpu(sent->window);
737}
738
Johan Hedbergf332ec62013-03-15 17:07:11 -0500739static void hci_cc_read_page_scan_type(struct hci_dev *hdev,
740 struct sk_buff *skb)
741{
742 struct hci_rp_read_page_scan_type *rp = (void *) skb->data;
743
744 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
745
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200746 if (rp->status)
747 return;
748
749 if (test_bit(HCI_INIT, &hdev->flags))
Johan Hedbergf332ec62013-03-15 17:07:11 -0500750 hdev->page_scan_type = rp->type;
751}
752
Johan Hedberg4a3ee762013-03-15 17:07:12 -0500753static void hci_cc_write_page_scan_type(struct hci_dev *hdev,
754 struct sk_buff *skb)
755{
756 u8 status = *((u8 *) skb->data);
757 u8 *type;
758
759 BT_DBG("%s status 0x%2.2x", hdev->name, status);
760
761 if (status)
762 return;
763
764 type = hci_sent_cmd_data(hdev, HCI_OP_WRITE_PAGE_SCAN_TYPE);
765 if (type)
766 hdev->page_scan_type = *type;
767}
768
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200769static void hci_cc_read_data_block_size(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300770 struct sk_buff *skb)
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200771{
772 struct hci_rp_read_data_block_size *rp = (void *) skb->data;
773
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300774 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200775
776 if (rp->status)
777 return;
778
779 hdev->block_mtu = __le16_to_cpu(rp->max_acl_len);
780 hdev->block_len = __le16_to_cpu(rp->block_len);
781 hdev->num_blocks = __le16_to_cpu(rp->num_blocks);
782
783 hdev->block_cnt = hdev->num_blocks;
784
785 BT_DBG("%s blk mtu %d cnt %d len %d", hdev->name, hdev->block_mtu,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300786 hdev->block_cnt, hdev->block_len);
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200787}
788
Johan Hedberg33f35722014-06-28 17:54:06 +0300789static void hci_cc_read_clock(struct hci_dev *hdev, struct sk_buff *skb)
790{
791 struct hci_rp_read_clock *rp = (void *) skb->data;
792 struct hci_cp_read_clock *cp;
793 struct hci_conn *conn;
794
795 BT_DBG("%s", hdev->name);
796
797 if (skb->len < sizeof(*rp))
798 return;
799
800 if (rp->status)
801 return;
802
803 hci_dev_lock(hdev);
804
805 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_CLOCK);
806 if (!cp)
807 goto unlock;
808
809 if (cp->which == 0x00) {
810 hdev->clock = le32_to_cpu(rp->clock);
811 goto unlock;
812 }
813
814 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
815 if (conn) {
816 conn->clock = le32_to_cpu(rp->clock);
817 conn->clock_accuracy = le16_to_cpu(rp->accuracy);
818 }
819
820unlock:
821 hci_dev_unlock(hdev);
822}
823
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300824static void hci_cc_read_local_amp_info(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300825 struct sk_buff *skb)
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300826{
827 struct hci_rp_read_local_amp_info *rp = (void *) skb->data;
828
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300829 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300830
831 if (rp->status)
Arron Wang83927882015-07-24 17:10:16 +0800832 return;
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300833
834 hdev->amp_status = rp->amp_status;
835 hdev->amp_total_bw = __le32_to_cpu(rp->total_bw);
836 hdev->amp_max_bw = __le32_to_cpu(rp->max_bw);
837 hdev->amp_min_latency = __le32_to_cpu(rp->min_latency);
838 hdev->amp_max_pdu = __le32_to_cpu(rp->max_pdu);
839 hdev->amp_type = rp->amp_type;
840 hdev->amp_pal_cap = __le16_to_cpu(rp->pal_cap);
841 hdev->amp_assoc_size = __le16_to_cpu(rp->max_assoc_size);
842 hdev->amp_be_flush_to = __le32_to_cpu(rp->be_flush_to);
843 hdev->amp_max_flush_to = __le32_to_cpu(rp->max_flush_to);
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300844}
845
Johan Hedbergd5859e22011-01-25 01:19:58 +0200846static void hci_cc_read_inq_rsp_tx_power(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300847 struct sk_buff *skb)
Johan Hedbergd5859e22011-01-25 01:19:58 +0200848{
Marcel Holtmann91c4e9b2012-03-11 19:27:21 -0700849 struct hci_rp_read_inq_rsp_tx_power *rp = (void *) skb->data;
Johan Hedbergd5859e22011-01-25 01:19:58 +0200850
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300851 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedbergd5859e22011-01-25 01:19:58 +0200852
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200853 if (rp->status)
854 return;
855
856 hdev->inq_tx_power = rp->tx_power;
Johan Hedbergd5859e22011-01-25 01:19:58 +0200857}
858
Johan Hedberg980e1a52011-01-22 06:10:07 +0200859static void hci_cc_pin_code_reply(struct hci_dev *hdev, struct sk_buff *skb)
860{
861 struct hci_rp_pin_code_reply *rp = (void *) skb->data;
862 struct hci_cp_pin_code_reply *cp;
863 struct hci_conn *conn;
864
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300865 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200866
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200867 hci_dev_lock(hdev);
868
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700869 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg744cf192011-11-08 20:40:14 +0200870 mgmt_pin_code_reply_complete(hdev, &rp->bdaddr, rp->status);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200871
Mikel Astizfa1bd912012-08-09 09:52:29 +0200872 if (rp->status)
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200873 goto unlock;
Johan Hedberg980e1a52011-01-22 06:10:07 +0200874
875 cp = hci_sent_cmd_data(hdev, HCI_OP_PIN_CODE_REPLY);
876 if (!cp)
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200877 goto unlock;
Johan Hedberg980e1a52011-01-22 06:10:07 +0200878
879 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
880 if (conn)
881 conn->pin_length = cp->pin_len;
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200882
883unlock:
884 hci_dev_unlock(hdev);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200885}
886
887static void hci_cc_pin_code_neg_reply(struct hci_dev *hdev, struct sk_buff *skb)
888{
889 struct hci_rp_pin_code_neg_reply *rp = (void *) skb->data;
890
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300891 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200892
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200893 hci_dev_lock(hdev);
894
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700895 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg744cf192011-11-08 20:40:14 +0200896 mgmt_pin_code_neg_reply_complete(hdev, &rp->bdaddr,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300897 rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200898
899 hci_dev_unlock(hdev);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200900}
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200901
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300902static void hci_cc_le_read_buffer_size(struct hci_dev *hdev,
903 struct sk_buff *skb)
904{
905 struct hci_rp_le_read_buffer_size *rp = (void *) skb->data;
906
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300907 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300908
909 if (rp->status)
910 return;
911
912 hdev->le_mtu = __le16_to_cpu(rp->le_mtu);
913 hdev->le_pkts = rp->le_max_pkt;
914
915 hdev->le_cnt = hdev->le_pkts;
916
917 BT_DBG("%s le mtu %d:%d", hdev->name, hdev->le_mtu, hdev->le_pkts);
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300918}
Johan Hedberg980e1a52011-01-22 06:10:07 +0200919
Johan Hedberg60e77322013-01-22 14:01:59 +0200920static void hci_cc_le_read_local_features(struct hci_dev *hdev,
921 struct sk_buff *skb)
922{
923 struct hci_rp_le_read_local_features *rp = (void *) skb->data;
924
925 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
926
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200927 if (rp->status)
928 return;
929
930 memcpy(hdev->le_features, rp->features, 8);
Johan Hedberg60e77322013-01-22 14:01:59 +0200931}
932
Johan Hedberg8fa19092012-10-19 20:57:49 +0300933static void hci_cc_le_read_adv_tx_power(struct hci_dev *hdev,
934 struct sk_buff *skb)
935{
936 struct hci_rp_le_read_adv_tx_power *rp = (void *) skb->data;
937
938 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
939
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200940 if (rp->status)
941 return;
942
943 hdev->adv_tx_power = rp->tx_power;
Johan Hedberg8fa19092012-10-19 20:57:49 +0300944}
945
Johan Hedberga5c29682011-02-19 12:05:57 -0300946static void hci_cc_user_confirm_reply(struct hci_dev *hdev, struct sk_buff *skb)
947{
948 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
949
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300950 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberga5c29682011-02-19 12:05:57 -0300951
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200952 hci_dev_lock(hdev);
953
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700954 if (hci_dev_test_flag(hdev, HCI_MGMT))
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300955 mgmt_user_confirm_reply_complete(hdev, &rp->bdaddr, ACL_LINK, 0,
956 rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200957
958 hci_dev_unlock(hdev);
Johan Hedberga5c29682011-02-19 12:05:57 -0300959}
960
961static void hci_cc_user_confirm_neg_reply(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300962 struct sk_buff *skb)
Johan Hedberga5c29682011-02-19 12:05:57 -0300963{
964 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
965
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300966 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberga5c29682011-02-19 12:05:57 -0300967
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200968 hci_dev_lock(hdev);
969
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700970 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg744cf192011-11-08 20:40:14 +0200971 mgmt_user_confirm_neg_reply_complete(hdev, &rp->bdaddr,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300972 ACL_LINK, 0, rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200973
974 hci_dev_unlock(hdev);
Johan Hedberga5c29682011-02-19 12:05:57 -0300975}
976
Brian Gix1143d452011-11-23 08:28:34 -0800977static void hci_cc_user_passkey_reply(struct hci_dev *hdev, struct sk_buff *skb)
978{
979 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
980
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300981 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -0800982
983 hci_dev_lock(hdev);
984
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700985 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg272d90d2012-02-09 15:26:12 +0200986 mgmt_user_passkey_reply_complete(hdev, &rp->bdaddr, ACL_LINK,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300987 0, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -0800988
989 hci_dev_unlock(hdev);
990}
991
992static void hci_cc_user_passkey_neg_reply(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300993 struct sk_buff *skb)
Brian Gix1143d452011-11-23 08:28:34 -0800994{
995 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
996
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300997 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -0800998
999 hci_dev_lock(hdev);
1000
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001001 if (hci_dev_test_flag(hdev, HCI_MGMT))
Brian Gix1143d452011-11-23 08:28:34 -08001002 mgmt_user_passkey_neg_reply_complete(hdev, &rp->bdaddr,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001003 ACL_LINK, 0, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -08001004
1005 hci_dev_unlock(hdev);
1006}
1007
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08001008static void hci_cc_read_local_oob_data(struct hci_dev *hdev,
1009 struct sk_buff *skb)
Szymon Jancc35938b2011-03-22 13:12:21 +01001010{
1011 struct hci_rp_read_local_oob_data *rp = (void *) skb->data;
1012
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001013 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08001014}
1015
1016static void hci_cc_read_local_oob_ext_data(struct hci_dev *hdev,
1017 struct sk_buff *skb)
1018{
1019 struct hci_rp_read_local_oob_ext_data *rp = (void *) skb->data;
1020
1021 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Szymon Jancc35938b2011-03-22 13:12:21 +01001022}
1023
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08001024static void hci_cc_le_set_random_addr(struct hci_dev *hdev, struct sk_buff *skb)
1025{
1026 __u8 status = *((__u8 *) skb->data);
1027 bdaddr_t *sent;
1028
1029 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1030
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001031 if (status)
1032 return;
1033
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08001034 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_RANDOM_ADDR);
1035 if (!sent)
1036 return;
1037
1038 hci_dev_lock(hdev);
1039
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001040 bacpy(&hdev->random_addr, sent);
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08001041
1042 hci_dev_unlock(hdev);
1043}
1044
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001045static void hci_cc_le_set_adv_enable(struct hci_dev *hdev, struct sk_buff *skb)
1046{
1047 __u8 *sent, status = *((__u8 *) skb->data);
1048
1049 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1050
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001051 if (status)
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001052 return;
1053
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001054 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADV_ENABLE);
1055 if (!sent)
Johan Hedberg3c857752014-03-25 10:30:49 +02001056 return;
1057
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001058 hci_dev_lock(hdev);
1059
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001060 /* If we're doing connection initiation as peripheral. Set a
Johan Hedberg3c857752014-03-25 10:30:49 +02001061 * timeout in case something goes wrong.
1062 */
1063 if (*sent) {
1064 struct hci_conn *conn;
1065
Marcel Holtmanna1536da2015-03-13 02:11:01 -07001066 hci_dev_set_flag(hdev, HCI_LE_ADV);
Johan Hedberg66c417c2014-07-08 15:07:47 +03001067
Jakub Pawlowskie7d9ab72015-08-07 20:22:52 +02001068 conn = hci_lookup_le_connect(hdev);
Johan Hedberg3c857752014-03-25 10:30:49 +02001069 if (conn)
1070 queue_delayed_work(hdev->workqueue,
1071 &conn->le_conn_timeout,
Johan Hedberg09ae2602014-07-06 13:41:15 +03001072 conn->conn_timeout);
Johan Hedberg66c417c2014-07-08 15:07:47 +03001073 } else {
Marcel Holtmanna358dc12015-03-13 02:11:02 -07001074 hci_dev_clear_flag(hdev, HCI_LE_ADV);
Johan Hedberg3c857752014-03-25 10:30:49 +02001075 }
1076
Johan Hedberg04b4edc2013-03-15 17:07:01 -05001077 hci_dev_unlock(hdev);
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001078}
1079
Marcel Holtmann533553f2014-03-21 12:18:10 -07001080static void hci_cc_le_set_scan_param(struct hci_dev *hdev, struct sk_buff *skb)
1081{
1082 struct hci_cp_le_set_scan_param *cp;
1083 __u8 status = *((__u8 *) skb->data);
1084
1085 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1086
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001087 if (status)
1088 return;
1089
Marcel Holtmann533553f2014-03-21 12:18:10 -07001090 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_PARAM);
1091 if (!cp)
1092 return;
1093
1094 hci_dev_lock(hdev);
1095
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001096 hdev->le_scan_type = cp->type;
Marcel Holtmann533553f2014-03-21 12:18:10 -07001097
1098 hci_dev_unlock(hdev);
1099}
1100
Johan Hedbergb9a63282014-03-25 10:51:52 +02001101static bool has_pending_adv_report(struct hci_dev *hdev)
1102{
1103 struct discovery_state *d = &hdev->discovery;
1104
1105 return bacmp(&d->last_adv_addr, BDADDR_ANY);
1106}
1107
1108static void clear_pending_adv_report(struct hci_dev *hdev)
1109{
1110 struct discovery_state *d = &hdev->discovery;
1111
1112 bacpy(&d->last_adv_addr, BDADDR_ANY);
1113 d->last_adv_data_len = 0;
1114}
1115
1116static void store_pending_adv_report(struct hci_dev *hdev, bdaddr_t *bdaddr,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001117 u8 bdaddr_type, s8 rssi, u32 flags,
1118 u8 *data, u8 len)
Johan Hedbergb9a63282014-03-25 10:51:52 +02001119{
1120 struct discovery_state *d = &hdev->discovery;
1121
1122 bacpy(&d->last_adv_addr, bdaddr);
1123 d->last_adv_addr_type = bdaddr_type;
Johan Hedbergff5cd292014-03-25 14:40:52 +02001124 d->last_adv_rssi = rssi;
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001125 d->last_adv_flags = flags;
Johan Hedbergb9a63282014-03-25 10:51:52 +02001126 memcpy(d->last_adv_data, data, len);
1127 d->last_adv_data_len = len;
1128}
1129
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001130static void hci_cc_le_set_scan_enable(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -03001131 struct sk_buff *skb)
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001132{
1133 struct hci_cp_le_set_scan_enable *cp;
1134 __u8 status = *((__u8 *) skb->data);
1135
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001136 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001137
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001138 if (status)
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001139 return;
1140
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001141 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_ENABLE);
1142 if (!cp)
Andre Guedes3fd319b2013-04-30 15:29:36 -03001143 return;
1144
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301145 hci_dev_lock(hdev);
1146
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001147 switch (cp->enable) {
Andre Guedes76a388b2013-04-04 20:21:02 -03001148 case LE_SCAN_ENABLE:
Marcel Holtmanna1536da2015-03-13 02:11:01 -07001149 hci_dev_set_flag(hdev, HCI_LE_SCAN);
Johan Hedbergb9a63282014-03-25 10:51:52 +02001150 if (hdev->le_scan_type == LE_SCAN_ACTIVE)
1151 clear_pending_adv_report(hdev);
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001152 break;
1153
Andre Guedes76a388b2013-04-04 20:21:02 -03001154 case LE_SCAN_DISABLE:
Johan Hedbergb9a63282014-03-25 10:51:52 +02001155 /* We do this here instead of when setting DISCOVERY_STOPPED
1156 * since the latter would potentially require waiting for
1157 * inquiry to stop too.
1158 */
1159 if (has_pending_adv_report(hdev)) {
1160 struct discovery_state *d = &hdev->discovery;
1161
1162 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergab0aa432014-03-26 14:17:12 +02001163 d->last_adv_addr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001164 d->last_adv_rssi, d->last_adv_flags,
Johan Hedbergab0aa432014-03-26 14:17:12 +02001165 d->last_adv_data,
Johan Hedbergb9a63282014-03-25 10:51:52 +02001166 d->last_adv_data_len, NULL, 0);
1167 }
1168
Johan Hedberg317ac8c2014-02-28 20:26:12 +02001169 /* Cancel this timer so that we don't try to disable scanning
1170 * when it's already disabled.
1171 */
1172 cancel_delayed_work(&hdev->le_scan_disable);
1173
Marcel Holtmanna358dc12015-03-13 02:11:02 -07001174 hci_dev_clear_flag(hdev, HCI_LE_SCAN);
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001175
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001176 /* The HCI_LE_SCAN_INTERRUPTED flag indicates that we
1177 * interrupted scanning due to a connect request. Mark
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001178 * therefore discovery as stopped. If this was not
1179 * because of a connect request advertising might have
1180 * been disabled because of active scanning, so
1181 * re-enable it again if necessary.
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001182 */
Marcel Holtmanna69d8922015-03-13 02:11:05 -07001183 if (hci_dev_test_and_clear_flag(hdev, HCI_LE_SCAN_INTERRUPTED))
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001184 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001185 else if (!hci_dev_test_flag(hdev, HCI_LE_ADV) &&
Johan Hedberg34722272014-07-08 16:05:05 +03001186 hdev->discovery.state == DISCOVERY_FINDING)
Johan Hedbergf2252572015-11-18 12:49:20 +02001187 hci_req_reenable_advertising(hdev);
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001188
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001189 break;
1190
1191 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001192 bt_dev_err(hdev, "use of reserved LE_Scan_Enable param %d",
1193 cp->enable);
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001194 break;
Andre Guedes35815082011-05-26 16:23:53 -03001195 }
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301196
1197 hci_dev_unlock(hdev);
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001198}
1199
Johan Hedbergcf1d0812013-01-22 14:02:00 +02001200static void hci_cc_le_read_white_list_size(struct hci_dev *hdev,
1201 struct sk_buff *skb)
1202{
1203 struct hci_rp_le_read_white_list_size *rp = (void *) skb->data;
1204
1205 BT_DBG("%s status 0x%2.2x size %u", hdev->name, rp->status, rp->size);
1206
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001207 if (rp->status)
1208 return;
1209
1210 hdev->le_white_list_size = rp->size;
Johan Hedbergcf1d0812013-01-22 14:02:00 +02001211}
1212
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001213static void hci_cc_le_clear_white_list(struct hci_dev *hdev,
1214 struct sk_buff *skb)
1215{
1216 __u8 status = *((__u8 *) skb->data);
1217
1218 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1219
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001220 if (status)
1221 return;
1222
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001223 hci_bdaddr_list_clear(&hdev->le_white_list);
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001224}
1225
1226static void hci_cc_le_add_to_white_list(struct hci_dev *hdev,
1227 struct sk_buff *skb)
1228{
1229 struct hci_cp_le_add_to_white_list *sent;
1230 __u8 status = *((__u8 *) skb->data);
1231
1232 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1233
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001234 if (status)
1235 return;
1236
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001237 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_ADD_TO_WHITE_LIST);
1238 if (!sent)
1239 return;
1240
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001241 hci_bdaddr_list_add(&hdev->le_white_list, &sent->bdaddr,
1242 sent->bdaddr_type);
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001243}
1244
1245static void hci_cc_le_del_from_white_list(struct hci_dev *hdev,
1246 struct sk_buff *skb)
1247{
1248 struct hci_cp_le_del_from_white_list *sent;
1249 __u8 status = *((__u8 *) skb->data);
1250
1251 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1252
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001253 if (status)
1254 return;
1255
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001256 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_DEL_FROM_WHITE_LIST);
1257 if (!sent)
1258 return;
1259
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001260 hci_bdaddr_list_del(&hdev->le_white_list, &sent->bdaddr,
1261 sent->bdaddr_type);
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001262}
1263
Johan Hedberg9b008c02013-01-22 14:02:01 +02001264static void hci_cc_le_read_supported_states(struct hci_dev *hdev,
1265 struct sk_buff *skb)
1266{
1267 struct hci_rp_le_read_supported_states *rp = (void *) skb->data;
1268
1269 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1270
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001271 if (rp->status)
1272 return;
1273
1274 memcpy(hdev->le_states, rp->le_states, 8);
Johan Hedberg9b008c02013-01-22 14:02:01 +02001275}
1276
Marcel Holtmanna8e1bfa2014-12-20 16:28:40 +01001277static void hci_cc_le_read_def_data_len(struct hci_dev *hdev,
1278 struct sk_buff *skb)
1279{
1280 struct hci_rp_le_read_def_data_len *rp = (void *) skb->data;
1281
1282 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1283
1284 if (rp->status)
1285 return;
1286
1287 hdev->le_def_tx_len = le16_to_cpu(rp->tx_len);
1288 hdev->le_def_tx_time = le16_to_cpu(rp->tx_time);
1289}
1290
1291static void hci_cc_le_write_def_data_len(struct hci_dev *hdev,
1292 struct sk_buff *skb)
1293{
1294 struct hci_cp_le_write_def_data_len *sent;
1295 __u8 status = *((__u8 *) skb->data);
1296
1297 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1298
1299 if (status)
1300 return;
1301
1302 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_WRITE_DEF_DATA_LEN);
1303 if (!sent)
1304 return;
1305
1306 hdev->le_def_tx_len = le16_to_cpu(sent->tx_len);
1307 hdev->le_def_tx_time = le16_to_cpu(sent->tx_time);
1308}
1309
Ankit Navikcfdb0c22018-06-29 12:12:50 +05301310static void hci_cc_le_read_resolv_list_size(struct hci_dev *hdev,
1311 struct sk_buff *skb)
1312{
1313 struct hci_rp_le_read_resolv_list_size *rp = (void *) skb->data;
1314
1315 BT_DBG("%s status 0x%2.2x size %u", hdev->name, rp->status, rp->size);
1316
1317 if (rp->status)
1318 return;
1319
1320 hdev->le_resolv_list_size = rp->size;
1321}
1322
Marcel Holtmanna8e1bfa2014-12-20 16:28:40 +01001323static void hci_cc_le_read_max_data_len(struct hci_dev *hdev,
1324 struct sk_buff *skb)
1325{
1326 struct hci_rp_le_read_max_data_len *rp = (void *) skb->data;
1327
1328 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1329
1330 if (rp->status)
1331 return;
1332
1333 hdev->le_max_tx_len = le16_to_cpu(rp->tx_len);
1334 hdev->le_max_tx_time = le16_to_cpu(rp->tx_time);
1335 hdev->le_max_rx_len = le16_to_cpu(rp->rx_len);
1336 hdev->le_max_rx_time = le16_to_cpu(rp->rx_time);
1337}
1338
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001339static void hci_cc_write_le_host_supported(struct hci_dev *hdev,
1340 struct sk_buff *skb)
Andre Guedesf9b49302011-06-30 19:20:53 -03001341{
Johan Hedberg06199cf2012-02-22 16:37:11 +02001342 struct hci_cp_write_le_host_supported *sent;
Andre Guedesf9b49302011-06-30 19:20:53 -03001343 __u8 status = *((__u8 *) skb->data);
1344
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001345 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedesf9b49302011-06-30 19:20:53 -03001346
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001347 if (status)
1348 return;
1349
Johan Hedberg06199cf2012-02-22 16:37:11 +02001350 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LE_HOST_SUPPORTED);
Johan Hedberg8f984df2012-02-28 01:07:22 +02001351 if (!sent)
Andre Guedesf9b49302011-06-30 19:20:53 -03001352 return;
1353
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301354 hci_dev_lock(hdev);
1355
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001356 if (sent->le) {
1357 hdev->features[1][0] |= LMP_HOST_LE;
Marcel Holtmanna1536da2015-03-13 02:11:01 -07001358 hci_dev_set_flag(hdev, HCI_LE_ENABLED);
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001359 } else {
1360 hdev->features[1][0] &= ~LMP_HOST_LE;
Marcel Holtmanna358dc12015-03-13 02:11:02 -07001361 hci_dev_clear_flag(hdev, HCI_LE_ENABLED);
1362 hci_dev_clear_flag(hdev, HCI_ADVERTISING);
Johan Hedberg8f984df2012-02-28 01:07:22 +02001363 }
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001364
1365 if (sent->simul)
1366 hdev->features[1][0] |= LMP_HOST_LE_BREDR;
1367 else
1368 hdev->features[1][0] &= ~LMP_HOST_LE_BREDR;
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301369
1370 hci_dev_unlock(hdev);
Andre Guedesf9b49302011-06-30 19:20:53 -03001371}
1372
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02001373static void hci_cc_set_adv_param(struct hci_dev *hdev, struct sk_buff *skb)
1374{
1375 struct hci_cp_le_set_adv_param *cp;
1376 u8 status = *((u8 *) skb->data);
1377
1378 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1379
1380 if (status)
1381 return;
1382
1383 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADV_PARAM);
1384 if (!cp)
1385 return;
1386
1387 hci_dev_lock(hdev);
1388 hdev->adv_addr_type = cp->own_address_type;
1389 hci_dev_unlock(hdev);
1390}
1391
Andrzej Kaczmarek5ae76a92014-05-08 15:32:08 +02001392static void hci_cc_read_rssi(struct hci_dev *hdev, struct sk_buff *skb)
1393{
1394 struct hci_rp_read_rssi *rp = (void *) skb->data;
1395 struct hci_conn *conn;
1396
1397 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1398
1399 if (rp->status)
1400 return;
1401
1402 hci_dev_lock(hdev);
1403
1404 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
1405 if (conn)
1406 conn->rssi = rp->rssi;
1407
1408 hci_dev_unlock(hdev);
1409}
1410
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001411static void hci_cc_read_tx_power(struct hci_dev *hdev, struct sk_buff *skb)
1412{
1413 struct hci_cp_read_tx_power *sent;
1414 struct hci_rp_read_tx_power *rp = (void *) skb->data;
1415 struct hci_conn *conn;
1416
1417 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1418
1419 if (rp->status)
1420 return;
1421
1422 sent = hci_sent_cmd_data(hdev, HCI_OP_READ_TX_POWER);
1423 if (!sent)
1424 return;
1425
1426 hci_dev_lock(hdev);
1427
1428 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
Andrzej Kaczmarekd0455ed2014-05-14 13:43:05 +02001429 if (!conn)
1430 goto unlock;
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001431
Andrzej Kaczmarekd0455ed2014-05-14 13:43:05 +02001432 switch (sent->type) {
1433 case 0x00:
1434 conn->tx_power = rp->tx_power;
1435 break;
1436 case 0x01:
1437 conn->max_tx_power = rp->tx_power;
1438 break;
1439 }
1440
1441unlock:
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001442 hci_dev_unlock(hdev);
1443}
1444
Marcel Holtmannc50b33c2015-01-31 15:07:52 -08001445static void hci_cc_write_ssp_debug_mode(struct hci_dev *hdev, struct sk_buff *skb)
1446{
1447 u8 status = *((u8 *) skb->data);
1448 u8 *mode;
1449
1450 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1451
1452 if (status)
1453 return;
1454
1455 mode = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SSP_DEBUG_MODE);
1456 if (mode)
1457 hdev->ssp_debug_mode = *mode;
1458}
1459
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001460static void hci_cs_inquiry(struct hci_dev *hdev, __u8 status)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001461{
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001462 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001463
1464 if (status) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001465 hci_conn_check_pending(hdev);
Johan Hedberg314b2382011-04-27 10:29:57 -04001466 return;
1467 }
1468
Andre Guedes89352e72011-11-04 14:16:53 -03001469 set_bit(HCI_INQUIRY, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001470}
1471
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001472static void hci_cs_create_conn(struct hci_dev *hdev, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001473{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001474 struct hci_cp_create_conn *cp;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001475 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001476
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001477 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001478
1479 cp = hci_sent_cmd_data(hdev, HCI_OP_CREATE_CONN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001480 if (!cp)
1481 return;
1482
1483 hci_dev_lock(hdev);
1484
1485 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
1486
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03001487 BT_DBG("%s bdaddr %pMR hcon %p", hdev->name, &cp->bdaddr, conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001488
1489 if (status) {
1490 if (conn && conn->state == BT_CONNECT) {
Marcel Holtmann4c67bc72006-10-15 17:30:56 +02001491 if (status != 0x0c || conn->attempt > 2) {
1492 conn->state = BT_CLOSED;
Johan Hedberg539c4962015-02-18 14:53:57 +02001493 hci_connect_cfm(conn, status);
Marcel Holtmann4c67bc72006-10-15 17:30:56 +02001494 hci_conn_del(conn);
1495 } else
1496 conn->state = BT_CONNECT2;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001497 }
1498 } else {
1499 if (!conn) {
Johan Hedberga5c4e302014-07-16 11:56:07 +03001500 conn = hci_conn_add(hdev, ACL_LINK, &cp->bdaddr,
1501 HCI_ROLE_MASTER);
1502 if (!conn)
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001503 bt_dev_err(hdev, "no memory for new connection");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001504 }
1505 }
1506
1507 hci_dev_unlock(hdev);
1508}
1509
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001510static void hci_cs_add_sco(struct hci_dev *hdev, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001511{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001512 struct hci_cp_add_sco *cp;
1513 struct hci_conn *acl, *sco;
1514 __u16 handle;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001515
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001516 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001517
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001518 if (!status)
1519 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001520
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001521 cp = hci_sent_cmd_data(hdev, HCI_OP_ADD_SCO);
1522 if (!cp)
1523 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001524
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001525 handle = __le16_to_cpu(cp->handle);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001526
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001527 BT_DBG("%s handle 0x%4.4x", hdev->name, handle);
Marcel Holtmann6bd57412006-11-18 22:14:22 +01001528
1529 hci_dev_lock(hdev);
1530
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001531 acl = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001532 if (acl) {
1533 sco = acl->link;
1534 if (sco) {
1535 sco->state = BT_CLOSED;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001536
Johan Hedberg539c4962015-02-18 14:53:57 +02001537 hci_connect_cfm(sco, status);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001538 hci_conn_del(sco);
1539 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001540 }
Marcel Holtmann6bd57412006-11-18 22:14:22 +01001541
1542 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001543}
1544
Marcel Holtmannf8558552008-07-14 20:13:49 +02001545static void hci_cs_auth_requested(struct hci_dev *hdev, __u8 status)
1546{
1547 struct hci_cp_auth_requested *cp;
1548 struct hci_conn *conn;
1549
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001550 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001551
1552 if (!status)
1553 return;
1554
1555 cp = hci_sent_cmd_data(hdev, HCI_OP_AUTH_REQUESTED);
1556 if (!cp)
1557 return;
1558
1559 hci_dev_lock(hdev);
1560
1561 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1562 if (conn) {
1563 if (conn->state == BT_CONFIG) {
Johan Hedberg539c4962015-02-18 14:53:57 +02001564 hci_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001565 hci_conn_drop(conn);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001566 }
1567 }
1568
1569 hci_dev_unlock(hdev);
1570}
1571
1572static void hci_cs_set_conn_encrypt(struct hci_dev *hdev, __u8 status)
1573{
1574 struct hci_cp_set_conn_encrypt *cp;
1575 struct hci_conn *conn;
1576
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001577 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001578
1579 if (!status)
1580 return;
1581
1582 cp = hci_sent_cmd_data(hdev, HCI_OP_SET_CONN_ENCRYPT);
1583 if (!cp)
1584 return;
1585
1586 hci_dev_lock(hdev);
1587
1588 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1589 if (conn) {
1590 if (conn->state == BT_CONFIG) {
Johan Hedberg539c4962015-02-18 14:53:57 +02001591 hci_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001592 hci_conn_drop(conn);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001593 }
1594 }
1595
1596 hci_dev_unlock(hdev);
1597}
1598
Johan Hedberg127178d2010-11-18 22:22:29 +02001599static int hci_outgoing_auth_needed(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -03001600 struct hci_conn *conn)
Johan Hedberg392599b2010-11-18 22:22:28 +02001601{
Johan Hedberg392599b2010-11-18 22:22:28 +02001602 if (conn->state != BT_CONFIG || !conn->out)
1603 return 0;
1604
Johan Hedberg765c2a92011-01-19 12:06:52 +05301605 if (conn->pending_sec_level == BT_SECURITY_SDP)
Johan Hedberg392599b2010-11-18 22:22:28 +02001606 return 0;
1607
1608 /* Only request authentication for SSP connections or non-SSP
Johan Hedberg264b8b42014-01-08 16:40:39 +02001609 * devices with sec_level MEDIUM or HIGH or if MITM protection
1610 * is requested.
1611 */
Gustavo Padovan807deac2012-05-17 00:36:24 -03001612 if (!hci_conn_ssp_enabled(conn) && !(conn->auth_type & 0x01) &&
Johan Hedberg7e3691e2014-05-30 14:45:19 +03001613 conn->pending_sec_level != BT_SECURITY_FIPS &&
Johan Hedberg264b8b42014-01-08 16:40:39 +02001614 conn->pending_sec_level != BT_SECURITY_HIGH &&
1615 conn->pending_sec_level != BT_SECURITY_MEDIUM)
Johan Hedberg392599b2010-11-18 22:22:28 +02001616 return 0;
1617
Johan Hedberg392599b2010-11-18 22:22:28 +02001618 return 1;
1619}
1620
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001621static int hci_resolve_name(struct hci_dev *hdev,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001622 struct inquiry_entry *e)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001623{
1624 struct hci_cp_remote_name_req cp;
1625
1626 memset(&cp, 0, sizeof(cp));
1627
1628 bacpy(&cp.bdaddr, &e->data.bdaddr);
1629 cp.pscan_rep_mode = e->data.pscan_rep_mode;
1630 cp.pscan_mode = e->data.pscan_mode;
1631 cp.clock_offset = e->data.clock_offset;
1632
1633 return hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
1634}
1635
Johan Hedbergb644ba32012-01-17 21:48:47 +02001636static bool hci_resolve_next_name(struct hci_dev *hdev)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001637{
1638 struct discovery_state *discov = &hdev->discovery;
1639 struct inquiry_entry *e;
1640
Johan Hedbergb644ba32012-01-17 21:48:47 +02001641 if (list_empty(&discov->resolve))
1642 return false;
1643
1644 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
Ram Malovanyc8100892012-07-19 10:26:09 +03001645 if (!e)
1646 return false;
1647
Johan Hedbergb644ba32012-01-17 21:48:47 +02001648 if (hci_resolve_name(hdev, e) == 0) {
1649 e->name_state = NAME_PENDING;
1650 return true;
1651 }
1652
1653 return false;
1654}
1655
1656static void hci_check_pending_name(struct hci_dev *hdev, struct hci_conn *conn,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001657 bdaddr_t *bdaddr, u8 *name, u8 name_len)
Johan Hedbergb644ba32012-01-17 21:48:47 +02001658{
1659 struct discovery_state *discov = &hdev->discovery;
1660 struct inquiry_entry *e;
1661
Johan Hedberg60cb49d2014-11-11 11:33:24 +02001662 /* Update the mgmt connected state if necessary. Be careful with
1663 * conn objects that exist but are not (yet) connected however.
1664 * Only those in BT_CONFIG or BT_CONNECTED states can be
1665 * considered connected.
1666 */
1667 if (conn &&
1668 (conn->state == BT_CONFIG || conn->state == BT_CONNECTED) &&
Jaganath Kanakkasserycb77c3e2014-11-07 16:39:09 +05301669 !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00001670 mgmt_device_connected(hdev, conn, 0, name, name_len);
Johan Hedbergb644ba32012-01-17 21:48:47 +02001671
1672 if (discov->state == DISCOVERY_STOPPED)
1673 return;
1674
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001675 if (discov->state == DISCOVERY_STOPPING)
1676 goto discov_complete;
1677
1678 if (discov->state != DISCOVERY_RESOLVING)
1679 return;
1680
1681 e = hci_inquiry_cache_lookup_resolve(hdev, bdaddr, NAME_PENDING);
Ram Malovany7cc83802012-07-19 10:26:10 +03001682 /* If the device was not found in a list of found devices names of which
1683 * are pending. there is no need to continue resolving a next name as it
1684 * will be done upon receiving another Remote Name Request Complete
1685 * Event */
1686 if (!e)
1687 return;
1688
1689 list_del(&e->list);
1690 if (name) {
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001691 e->name_state = NAME_KNOWN;
Ram Malovany7cc83802012-07-19 10:26:10 +03001692 mgmt_remote_name(hdev, bdaddr, ACL_LINK, 0x00,
1693 e->data.rssi, name, name_len);
Ram Malovanyc3e7c0d2012-07-19 10:26:11 +03001694 } else {
1695 e->name_state = NAME_NOT_KNOWN;
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001696 }
1697
Johan Hedbergb644ba32012-01-17 21:48:47 +02001698 if (hci_resolve_next_name(hdev))
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001699 return;
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001700
1701discov_complete:
1702 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
1703}
1704
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001705static void hci_cs_remote_name_req(struct hci_dev *hdev, __u8 status)
1706{
Johan Hedberg127178d2010-11-18 22:22:29 +02001707 struct hci_cp_remote_name_req *cp;
1708 struct hci_conn *conn;
1709
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001710 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Johan Hedberg127178d2010-11-18 22:22:29 +02001711
1712 /* If successful wait for the name req complete event before
1713 * checking for the need to do authentication */
1714 if (!status)
1715 return;
1716
1717 cp = hci_sent_cmd_data(hdev, HCI_OP_REMOTE_NAME_REQ);
1718 if (!cp)
1719 return;
1720
1721 hci_dev_lock(hdev);
1722
1723 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02001724
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001725 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedbergb644ba32012-01-17 21:48:47 +02001726 hci_check_pending_name(hdev, conn, &cp->bdaddr, NULL, 0);
1727
Johan Hedberg79c6c702011-04-28 11:28:55 -07001728 if (!conn)
1729 goto unlock;
1730
1731 if (!hci_outgoing_auth_needed(hdev, conn))
1732 goto unlock;
1733
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001734 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02001735 struct hci_cp_auth_requested auth_cp;
1736
Johan Hedberg977f8fc2014-07-17 15:35:39 +03001737 set_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags);
1738
Johannes Bergc1f23a22013-10-07 18:19:16 +02001739 auth_cp.handle = __cpu_to_le16(conn->handle);
1740 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED,
1741 sizeof(auth_cp), &auth_cp);
Johan Hedberg127178d2010-11-18 22:22:29 +02001742 }
1743
Johan Hedberg79c6c702011-04-28 11:28:55 -07001744unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02001745 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001746}
1747
Marcel Holtmann769be972008-07-14 20:13:49 +02001748static void hci_cs_read_remote_features(struct hci_dev *hdev, __u8 status)
1749{
1750 struct hci_cp_read_remote_features *cp;
1751 struct hci_conn *conn;
1752
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001753 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann769be972008-07-14 20:13:49 +02001754
1755 if (!status)
1756 return;
1757
1758 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_REMOTE_FEATURES);
1759 if (!cp)
1760 return;
1761
1762 hci_dev_lock(hdev);
1763
1764 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1765 if (conn) {
1766 if (conn->state == BT_CONFIG) {
Johan Hedberg539c4962015-02-18 14:53:57 +02001767 hci_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001768 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02001769 }
1770 }
1771
1772 hci_dev_unlock(hdev);
1773}
1774
1775static void hci_cs_read_remote_ext_features(struct hci_dev *hdev, __u8 status)
1776{
1777 struct hci_cp_read_remote_ext_features *cp;
1778 struct hci_conn *conn;
1779
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001780 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann769be972008-07-14 20:13:49 +02001781
1782 if (!status)
1783 return;
1784
1785 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES);
1786 if (!cp)
1787 return;
1788
1789 hci_dev_lock(hdev);
1790
1791 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1792 if (conn) {
1793 if (conn->state == BT_CONFIG) {
Johan Hedberg539c4962015-02-18 14:53:57 +02001794 hci_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001795 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02001796 }
1797 }
1798
1799 hci_dev_unlock(hdev);
1800}
1801
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001802static void hci_cs_setup_sync_conn(struct hci_dev *hdev, __u8 status)
1803{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001804 struct hci_cp_setup_sync_conn *cp;
1805 struct hci_conn *acl, *sco;
1806 __u16 handle;
1807
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001808 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001809
1810 if (!status)
1811 return;
1812
1813 cp = hci_sent_cmd_data(hdev, HCI_OP_SETUP_SYNC_CONN);
1814 if (!cp)
1815 return;
1816
1817 handle = __le16_to_cpu(cp->handle);
1818
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001819 BT_DBG("%s handle 0x%4.4x", hdev->name, handle);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001820
1821 hci_dev_lock(hdev);
1822
1823 acl = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001824 if (acl) {
1825 sco = acl->link;
1826 if (sco) {
1827 sco->state = BT_CLOSED;
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001828
Johan Hedberg539c4962015-02-18 14:53:57 +02001829 hci_connect_cfm(sco, status);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001830 hci_conn_del(sco);
1831 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001832 }
1833
1834 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001835}
1836
1837static void hci_cs_sniff_mode(struct hci_dev *hdev, __u8 status)
1838{
1839 struct hci_cp_sniff_mode *cp;
1840 struct hci_conn *conn;
1841
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001842 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001843
1844 if (!status)
1845 return;
1846
1847 cp = hci_sent_cmd_data(hdev, HCI_OP_SNIFF_MODE);
1848 if (!cp)
1849 return;
1850
1851 hci_dev_lock(hdev);
1852
1853 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001854 if (conn) {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001855 clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001856
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001857 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001858 hci_sco_setup(conn, status);
1859 }
1860
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001861 hci_dev_unlock(hdev);
1862}
1863
1864static void hci_cs_exit_sniff_mode(struct hci_dev *hdev, __u8 status)
1865{
1866 struct hci_cp_exit_sniff_mode *cp;
1867 struct hci_conn *conn;
1868
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001869 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001870
1871 if (!status)
1872 return;
1873
1874 cp = hci_sent_cmd_data(hdev, HCI_OP_EXIT_SNIFF_MODE);
1875 if (!cp)
1876 return;
1877
1878 hci_dev_lock(hdev);
1879
1880 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001881 if (conn) {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001882 clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001883
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001884 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001885 hci_sco_setup(conn, status);
1886 }
1887
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001888 hci_dev_unlock(hdev);
1889}
1890
Johan Hedberg88c3df12012-02-09 14:27:38 +02001891static void hci_cs_disconnect(struct hci_dev *hdev, u8 status)
1892{
1893 struct hci_cp_disconnect *cp;
1894 struct hci_conn *conn;
1895
1896 if (!status)
1897 return;
1898
1899 cp = hci_sent_cmd_data(hdev, HCI_OP_DISCONNECT);
1900 if (!cp)
1901 return;
1902
1903 hci_dev_lock(hdev);
1904
1905 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1906 if (conn)
1907 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001908 conn->dst_type, status);
Johan Hedberg88c3df12012-02-09 14:27:38 +02001909
1910 hci_dev_unlock(hdev);
1911}
1912
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02001913static void hci_cs_le_create_conn(struct hci_dev *hdev, u8 status)
1914{
1915 struct hci_cp_le_create_conn *cp;
1916 struct hci_conn *conn;
1917
1918 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1919
1920 /* All connection failure handling is taken care of by the
1921 * hci_le_conn_failed function which is triggered by the HCI
1922 * request completion callbacks used for connecting.
1923 */
1924 if (status)
1925 return;
1926
1927 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_CREATE_CONN);
1928 if (!cp)
1929 return;
1930
1931 hci_dev_lock(hdev);
1932
Johan Hedberg9d4c1cc2015-10-21 18:03:01 +03001933 conn = hci_conn_hash_lookup_le(hdev, &cp->peer_addr,
1934 cp->peer_addr_type);
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02001935 if (!conn)
1936 goto unlock;
1937
1938 /* Store the initiator and responder address information which
1939 * is needed for SMP. These values will not change during the
1940 * lifetime of the connection.
1941 */
1942 conn->init_addr_type = cp->own_address_type;
1943 if (cp->own_address_type == ADDR_LE_DEV_RANDOM)
1944 bacpy(&conn->init_addr, &hdev->random_addr);
1945 else
1946 bacpy(&conn->init_addr, &hdev->bdaddr);
1947
1948 conn->resp_addr_type = cp->peer_addr_type;
1949 bacpy(&conn->resp_addr, &cp->peer_addr);
1950
Johan Hedberg9489eca2014-02-28 17:45:46 +02001951 /* We don't want the connection attempt to stick around
1952 * indefinitely since LE doesn't have a page timeout concept
1953 * like BR/EDR. Set a timer for any connection that doesn't use
1954 * the white list for connecting.
1955 */
1956 if (cp->filter_policy == HCI_LE_USE_PEER_ADDR)
1957 queue_delayed_work(conn->hdev->workqueue,
1958 &conn->le_conn_timeout,
Johan Hedberg09ae2602014-07-06 13:41:15 +03001959 conn->conn_timeout);
Johan Hedberg9489eca2014-02-28 17:45:46 +02001960
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02001961unlock:
1962 hci_dev_unlock(hdev);
1963}
1964
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07001965static void hci_cs_le_read_remote_features(struct hci_dev *hdev, u8 status)
1966{
1967 struct hci_cp_le_read_remote_features *cp;
1968 struct hci_conn *conn;
1969
1970 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1971
1972 if (!status)
1973 return;
1974
1975 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_READ_REMOTE_FEATURES);
1976 if (!cp)
1977 return;
1978
1979 hci_dev_lock(hdev);
1980
1981 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1982 if (conn) {
1983 if (conn->state == BT_CONFIG) {
1984 hci_connect_cfm(conn, status);
1985 hci_conn_drop(conn);
1986 }
1987 }
1988
1989 hci_dev_unlock(hdev);
1990}
1991
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02001992static void hci_cs_le_start_enc(struct hci_dev *hdev, u8 status)
1993{
1994 struct hci_cp_le_start_enc *cp;
1995 struct hci_conn *conn;
1996
1997 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1998
1999 if (!status)
2000 return;
2001
2002 hci_dev_lock(hdev);
2003
2004 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_START_ENC);
2005 if (!cp)
2006 goto unlock;
2007
2008 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
2009 if (!conn)
2010 goto unlock;
2011
2012 if (conn->state != BT_CONNECTED)
2013 goto unlock;
2014
2015 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
2016 hci_conn_drop(conn);
2017
2018unlock:
2019 hci_dev_unlock(hdev);
2020}
2021
Kuba Pawlak50fc85f2014-11-06 19:36:52 +01002022static void hci_cs_switch_role(struct hci_dev *hdev, u8 status)
2023{
2024 struct hci_cp_switch_role *cp;
2025 struct hci_conn *conn;
2026
2027 BT_DBG("%s status 0x%2.2x", hdev->name, status);
2028
2029 if (!status)
2030 return;
2031
2032 cp = hci_sent_cmd_data(hdev, HCI_OP_SWITCH_ROLE);
2033 if (!cp)
2034 return;
2035
2036 hci_dev_lock(hdev);
2037
2038 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
2039 if (conn)
2040 clear_bit(HCI_CONN_RSWITCH_PEND, &conn->flags);
2041
2042 hci_dev_unlock(hdev);
2043}
2044
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002045static void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002046{
2047 __u8 status = *((__u8 *) skb->data);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002048 struct discovery_state *discov = &hdev->discovery;
2049 struct inquiry_entry *e;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002050
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002051 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002052
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002053 hci_conn_check_pending(hdev);
Andre Guedes89352e72011-11-04 14:16:53 -03002054
2055 if (!test_and_clear_bit(HCI_INQUIRY, &hdev->flags))
2056 return;
2057
Peter Zijlstra4e857c52014-03-17 18:06:10 +01002058 smp_mb__after_atomic(); /* wake_up_bit advises about this barrier */
Andre Guedes3e13fa12013-03-27 20:04:56 -03002059 wake_up_bit(&hdev->flags, HCI_INQUIRY);
2060
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002061 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002062 return;
2063
Johan Hedberg56e5cb82011-11-08 20:40:16 +02002064 hci_dev_lock(hdev);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002065
Andre Guedes343f9352012-02-17 20:39:37 -03002066 if (discov->state != DISCOVERY_FINDING)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002067 goto unlock;
2068
2069 if (list_empty(&discov->resolve)) {
Jakub Pawlowski07d23342015-03-17 09:04:14 -07002070 /* When BR/EDR inquiry is active and no LE scanning is in
2071 * progress, then change discovery state to indicate completion.
2072 *
2073 * When running LE scanning and BR/EDR inquiry simultaneously
2074 * and the LE scan already finished, then change the discovery
2075 * state to indicate completion.
2076 */
2077 if (!hci_dev_test_flag(hdev, HCI_LE_SCAN) ||
2078 !test_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks))
2079 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002080 goto unlock;
2081 }
2082
2083 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
2084 if (e && hci_resolve_name(hdev, e) == 0) {
2085 e->name_state = NAME_PENDING;
2086 hci_discovery_set_state(hdev, DISCOVERY_RESOLVING);
2087 } else {
Jakub Pawlowski07d23342015-03-17 09:04:14 -07002088 /* When BR/EDR inquiry is active and no LE scanning is in
2089 * progress, then change discovery state to indicate completion.
2090 *
2091 * When running LE scanning and BR/EDR inquiry simultaneously
2092 * and the LE scan already finished, then change the discovery
2093 * state to indicate completion.
2094 */
2095 if (!hci_dev_test_flag(hdev, HCI_LE_SCAN) ||
2096 !test_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks))
2097 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002098 }
2099
2100unlock:
Johan Hedberg56e5cb82011-11-08 20:40:16 +02002101 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002102}
2103
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002104static void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002105{
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002106 struct inquiry_data data;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002107 struct inquiry_info *info = (void *) (skb->data + 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002108 int num_rsp = *((__u8 *) skb->data);
2109
2110 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
2111
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002112 if (!num_rsp)
2113 return;
2114
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002115 if (hci_dev_test_flag(hdev, HCI_PERIODIC_INQ))
Andre Guedes1519cc12012-03-21 00:03:38 -03002116 return;
2117
Linus Torvalds1da177e2005-04-16 15:20:36 -07002118 hci_dev_lock(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002119
Johan Hedberge17acd42011-03-30 23:57:16 +03002120 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02002121 u32 flags;
Johan Hedberg31754052012-01-04 13:39:52 +02002122
Linus Torvalds1da177e2005-04-16 15:20:36 -07002123 bacpy(&data.bdaddr, &info->bdaddr);
2124 data.pscan_rep_mode = info->pscan_rep_mode;
2125 data.pscan_period_mode = info->pscan_period_mode;
2126 data.pscan_mode = info->pscan_mode;
2127 memcpy(data.dev_class, info->dev_class, 3);
2128 data.clock_offset = info->clock_offset;
Marcel Holtmannefb25132014-12-05 13:03:34 +01002129 data.rssi = HCI_RSSI_INVALID;
Marcel Holtmann41a96212008-07-14 20:13:48 +02002130 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02002131
Marcel Holtmannaf589252014-07-01 14:11:20 +02002132 flags = hci_inquiry_cache_update(hdev, &data, false);
2133
Johan Hedberg48264f02011-11-09 13:58:58 +02002134 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Marcel Holtmannefb25132014-12-05 13:03:34 +01002135 info->dev_class, HCI_RSSI_INVALID,
2136 flags, NULL, 0, NULL, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002137 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002138
Linus Torvalds1da177e2005-04-16 15:20:36 -07002139 hci_dev_unlock(hdev);
2140}
2141
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002142static void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002143{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002144 struct hci_ev_conn_complete *ev = (void *) skb->data;
2145 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002146
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002147 BT_DBG("%s", hdev->name);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002148
Linus Torvalds1da177e2005-04-16 15:20:36 -07002149 hci_dev_lock(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002150
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002151 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann94992372009-04-19 19:30:03 +02002152 if (!conn) {
2153 if (ev->link_type != SCO_LINK)
2154 goto unlock;
2155
2156 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
2157 if (!conn)
2158 goto unlock;
2159
2160 conn->type = SCO_LINK;
2161 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002162
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002163 if (!ev->status) {
2164 conn->handle = __le16_to_cpu(ev->handle);
Marcel Holtmann769be972008-07-14 20:13:49 +02002165
2166 if (conn->type == ACL_LINK) {
2167 conn->state = BT_CONFIG;
2168 hci_conn_hold(conn);
Szymon Janca9ea3ed2012-07-19 14:46:08 +02002169
2170 if (!conn->out && !hci_conn_ssp_enabled(conn) &&
2171 !hci_find_link_key(hdev, &ev->bdaddr))
2172 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
2173 else
2174 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
Marcel Holtmann769be972008-07-14 20:13:49 +02002175 } else
2176 conn->state = BT_CONNECTED;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002177
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01002178 hci_debugfs_create_conn(conn);
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02002179 hci_conn_add_sysfs(conn);
2180
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002181 if (test_bit(HCI_AUTH, &hdev->flags))
Johan Hedberg4dae2792014-06-24 17:03:50 +03002182 set_bit(HCI_CONN_AUTH, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002183
2184 if (test_bit(HCI_ENCRYPT, &hdev->flags))
Johan Hedberg4dae2792014-06-24 17:03:50 +03002185 set_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002186
2187 /* Get remote features */
2188 if (conn->type == ACL_LINK) {
2189 struct hci_cp_read_remote_features cp;
2190 cp.handle = ev->handle;
Marcel Holtmann769be972008-07-14 20:13:49 +02002191 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_FEATURES,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002192 sizeof(cp), &cp);
Johan Hedberg22f433d2014-08-01 11:13:32 +03002193
Johan Hedberg01b1cb82015-11-16 12:52:21 +02002194 hci_req_update_scan(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002195 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002196
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002197 /* Set packet type for incoming connection */
Andrei Emeltchenkod095c1e2011-12-01 14:33:27 +02002198 if (!conn->out && hdev->hci_ver < BLUETOOTH_VER_2_0) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002199 struct hci_cp_change_conn_ptype cp;
2200 cp.handle = ev->handle;
Marcel Holtmanna8746412008-07-14 20:13:46 +02002201 cp.pkt_type = cpu_to_le16(conn->pkt_type);
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002202 hci_send_cmd(hdev, HCI_OP_CHANGE_CONN_PTYPE, sizeof(cp),
2203 &cp);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002204 }
Johan Hedberg17d5c042011-01-22 06:09:08 +02002205 } else {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002206 conn->state = BT_CLOSED;
Johan Hedberg17d5c042011-01-22 06:09:08 +02002207 if (conn->type == ACL_LINK)
Marcel Holtmann64c7b772014-02-18 14:22:20 -08002208 mgmt_connect_failed(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002209 conn->dst_type, ev->status);
Johan Hedberg17d5c042011-01-22 06:09:08 +02002210 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002211
Marcel Holtmanne73439d2010-07-26 10:06:00 -04002212 if (conn->type == ACL_LINK)
2213 hci_sco_setup(conn, ev->status);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002214
Marcel Holtmann769be972008-07-14 20:13:49 +02002215 if (ev->status) {
Johan Hedberg539c4962015-02-18 14:53:57 +02002216 hci_connect_cfm(conn, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002217 hci_conn_del(conn);
Marcel Holtmannc89b6e62009-01-15 21:57:03 +01002218 } else if (ev->link_type != ACL_LINK)
Johan Hedberg539c4962015-02-18 14:53:57 +02002219 hci_connect_cfm(conn, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002220
2221unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002222 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002223
2224 hci_conn_check_pending(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002225}
2226
Johan Hedberg70c46422014-07-09 12:59:17 +03002227static void hci_reject_conn(struct hci_dev *hdev, bdaddr_t *bdaddr)
2228{
2229 struct hci_cp_reject_conn_req cp;
2230
2231 bacpy(&cp.bdaddr, bdaddr);
2232 cp.reason = HCI_ERROR_REJ_BAD_ADDR;
2233 hci_send_cmd(hdev, HCI_OP_REJECT_CONN_REQ, sizeof(cp), &cp);
2234}
2235
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002236static void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002237{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002238 struct hci_ev_conn_request *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002239 int mask = hdev->link_mode;
Johan Hedberg70c46422014-07-09 12:59:17 +03002240 struct inquiry_entry *ie;
2241 struct hci_conn *conn;
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002242 __u8 flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002243
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03002244 BT_DBG("%s bdaddr %pMR type 0x%x", hdev->name, &ev->bdaddr,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002245 ev->link_type);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002246
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002247 mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, ev->link_type,
2248 &flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002249
Johan Hedberg70c46422014-07-09 12:59:17 +03002250 if (!(mask & HCI_LM_ACCEPT)) {
2251 hci_reject_conn(hdev, &ev->bdaddr);
2252 return;
2253 }
2254
Johan Hedberg46c4c942014-07-16 16:19:21 +03002255 if (hci_bdaddr_list_lookup(&hdev->blacklist, &ev->bdaddr,
2256 BDADDR_BREDR)) {
2257 hci_reject_conn(hdev, &ev->bdaddr);
2258 return;
2259 }
2260
Johan Hedberg6a8fc952014-12-24 20:43:11 +02002261 /* Require HCI_CONNECTABLE or a whitelist entry to accept the
2262 * connection. These features are only touched through mgmt so
2263 * only do the checks if HCI_MGMT is set.
2264 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002265 if (hci_dev_test_flag(hdev, HCI_MGMT) &&
2266 !hci_dev_test_flag(hdev, HCI_CONNECTABLE) &&
Johan Hedberg46c4c942014-07-16 16:19:21 +03002267 !hci_bdaddr_list_lookup(&hdev->whitelist, &ev->bdaddr,
2268 BDADDR_BREDR)) {
2269 hci_reject_conn(hdev, &ev->bdaddr);
2270 return;
Johan Hedberg70c46422014-07-09 12:59:17 +03002271 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002272
Johan Hedberg70c46422014-07-09 12:59:17 +03002273 /* Connection accepted */
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002274
Johan Hedberg70c46422014-07-09 12:59:17 +03002275 hci_dev_lock(hdev);
Marcel Holtmannc7bdd502008-07-14 20:13:47 +02002276
Johan Hedberg70c46422014-07-09 12:59:17 +03002277 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
2278 if (ie)
2279 memcpy(ie->data.dev_class, ev->dev_class, 3);
2280
2281 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type,
2282 &ev->bdaddr);
2283 if (!conn) {
Johan Hedberga5c4e302014-07-16 11:56:07 +03002284 conn = hci_conn_add(hdev, ev->link_type, &ev->bdaddr,
2285 HCI_ROLE_SLAVE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002286 if (!conn) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002287 bt_dev_err(hdev, "no memory for new connection");
Johan Hedberg70c46422014-07-09 12:59:17 +03002288 hci_dev_unlock(hdev);
2289 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002290 }
Johan Hedberg70c46422014-07-09 12:59:17 +03002291 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002292
Johan Hedberg70c46422014-07-09 12:59:17 +03002293 memcpy(conn->dev_class, ev->dev_class, 3);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002294
Johan Hedberg70c46422014-07-09 12:59:17 +03002295 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002296
Johan Hedberg70c46422014-07-09 12:59:17 +03002297 if (ev->link_type == ACL_LINK ||
2298 (!(flags & HCI_PROTO_DEFER) && !lmp_esco_capable(hdev))) {
2299 struct hci_cp_accept_conn_req cp;
2300 conn->state = BT_CONNECT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002301
2302 bacpy(&cp.bdaddr, &ev->bdaddr);
Johan Hedberg70c46422014-07-09 12:59:17 +03002303
2304 if (lmp_rswitch_capable(hdev) && (mask & HCI_LM_MASTER))
2305 cp.role = 0x00; /* Become master */
2306 else
2307 cp.role = 0x01; /* Remain slave */
2308
2309 hci_send_cmd(hdev, HCI_OP_ACCEPT_CONN_REQ, sizeof(cp), &cp);
2310 } else if (!(flags & HCI_PROTO_DEFER)) {
2311 struct hci_cp_accept_sync_conn_req cp;
2312 conn->state = BT_CONNECT;
2313
2314 bacpy(&cp.bdaddr, &ev->bdaddr);
2315 cp.pkt_type = cpu_to_le16(conn->pkt_type);
2316
2317 cp.tx_bandwidth = cpu_to_le32(0x00001f40);
2318 cp.rx_bandwidth = cpu_to_le32(0x00001f40);
2319 cp.max_latency = cpu_to_le16(0xffff);
2320 cp.content_format = cpu_to_le16(hdev->voice_setting);
2321 cp.retrans_effort = 0xff;
2322
2323 hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ, sizeof(cp),
2324 &cp);
2325 } else {
2326 conn->state = BT_CONNECT2;
Johan Hedberg539c4962015-02-18 14:53:57 +02002327 hci_connect_cfm(conn, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002328 }
2329}
2330
Mikel Astizf0d6a0e2012-08-09 09:52:30 +02002331static u8 hci_to_mgmt_reason(u8 err)
2332{
2333 switch (err) {
2334 case HCI_ERROR_CONNECTION_TIMEOUT:
2335 return MGMT_DEV_DISCONN_TIMEOUT;
2336 case HCI_ERROR_REMOTE_USER_TERM:
2337 case HCI_ERROR_REMOTE_LOW_RESOURCES:
2338 case HCI_ERROR_REMOTE_POWER_OFF:
2339 return MGMT_DEV_DISCONN_REMOTE;
2340 case HCI_ERROR_LOCAL_HOST_TERM:
2341 return MGMT_DEV_DISCONN_LOCAL_HOST;
2342 default:
2343 return MGMT_DEV_DISCONN_UNKNOWN;
2344 }
2345}
2346
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002347static void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002348{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002349 struct hci_ev_disconn_complete *ev = (void *) skb->data;
Szymon Janc160b9252016-07-12 02:12:16 +02002350 u8 reason;
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002351 struct hci_conn_params *params;
Marcel Holtmann04837f62006-07-03 10:02:33 +02002352 struct hci_conn *conn;
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002353 bool mgmt_connected;
Andre Guedes38462202013-11-07 17:36:10 -03002354 u8 type;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002355
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002356 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002357
Linus Torvalds1da177e2005-04-16 15:20:36 -07002358 hci_dev_lock(hdev);
2359
Marcel Holtmann04837f62006-07-03 10:02:33 +02002360 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergf7520542011-01-20 12:34:39 +02002361 if (!conn)
2362 goto unlock;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02002363
Andre Guedesabf54a52013-11-07 17:36:09 -03002364 if (ev->status) {
2365 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
2366 conn->dst_type, ev->status);
2367 goto unlock;
Johan Hedberg37d9ef72011-11-10 15:54:39 +02002368 }
Johan Hedbergf7520542011-01-20 12:34:39 +02002369
Andre Guedes38462202013-11-07 17:36:10 -03002370 conn->state = BT_CLOSED;
2371
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002372 mgmt_connected = test_and_clear_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags);
Szymon Janc160b9252016-07-12 02:12:16 +02002373
2374 if (test_bit(HCI_CONN_AUTH_FAILURE, &conn->flags))
2375 reason = MGMT_DEV_DISCONN_AUTH_FAILURE;
2376 else
2377 reason = hci_to_mgmt_reason(ev->reason);
2378
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002379 mgmt_device_disconnected(hdev, &conn->dst, conn->type, conn->dst_type,
2380 reason, mgmt_connected);
Andre Guedesabf54a52013-11-07 17:36:09 -03002381
Johan Hedberg22f433d2014-08-01 11:13:32 +03002382 if (conn->type == ACL_LINK) {
2383 if (test_bit(HCI_CONN_FLUSH_KEY, &conn->flags))
2384 hci_remove_link_key(hdev, &conn->dst);
2385
Johan Hedberg01b1cb82015-11-16 12:52:21 +02002386 hci_req_update_scan(hdev);
Johan Hedberg22f433d2014-08-01 11:13:32 +03002387 }
Johan Hedberg22102462013-10-05 12:01:06 +02002388
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002389 params = hci_conn_params_lookup(hdev, &conn->dst, conn->dst_type);
2390 if (params) {
2391 switch (params->auto_connect) {
2392 case HCI_AUTO_CONN_LINK_LOSS:
2393 if (ev->reason != HCI_ERROR_CONNECTION_TIMEOUT)
2394 break;
2395 /* Fall through */
2396
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02002397 case HCI_AUTO_CONN_DIRECT:
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002398 case HCI_AUTO_CONN_ALWAYS:
Johan Hedberg418025d2014-07-04 12:37:24 +03002399 list_del_init(&params->action);
2400 list_add(&params->action, &hdev->pend_le_conns);
2401 hci_update_background_scan(hdev);
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002402 break;
2403
2404 default:
2405 break;
2406 }
2407 }
2408
Andre Guedes38462202013-11-07 17:36:10 -03002409 type = conn->type;
Johan Hedberg22102462013-10-05 12:01:06 +02002410
Johan Hedberg3a6d5762015-02-18 14:53:58 +02002411 hci_disconn_cfm(conn, ev->reason);
Andre Guedes38462202013-11-07 17:36:10 -03002412 hci_conn_del(conn);
2413
2414 /* Re-enable advertising if necessary, since it might
2415 * have been disabled by the connection. From the
2416 * HCI_LE_Set_Advertise_Enable command description in
2417 * the core specification (v4.0):
2418 * "The Controller shall continue advertising until the Host
2419 * issues an LE_Set_Advertise_Enable command with
2420 * Advertising_Enable set to 0x00 (Advertising is disabled)
2421 * or until a connection is created or until the Advertising
2422 * is timed out due to Directed Advertising."
2423 */
2424 if (type == LE_LINK)
Johan Hedbergf2252572015-11-18 12:49:20 +02002425 hci_req_reenable_advertising(hdev);
Johan Hedbergf7520542011-01-20 12:34:39 +02002426
2427unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002428 hci_dev_unlock(hdev);
2429}
2430
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002431static void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002432{
2433 struct hci_ev_auth_complete *ev = (void *) skb->data;
2434 struct hci_conn *conn;
2435
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002436 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002437
2438 hci_dev_lock(hdev);
2439
2440 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002441 if (!conn)
2442 goto unlock;
2443
2444 if (!ev->status) {
Szymon Janc160b9252016-07-12 02:12:16 +02002445 clear_bit(HCI_CONN_AUTH_FAILURE, &conn->flags);
2446
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002447 if (!hci_conn_ssp_enabled(conn) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03002448 test_bit(HCI_CONN_REAUTH_PEND, &conn->flags)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002449 bt_dev_info(hdev, "re-auth of legacy device is not possible.");
Johan Hedberg2a611692011-02-19 12:06:00 -03002450 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002451 set_bit(HCI_CONN_AUTH, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002452 conn->sec_level = conn->pending_sec_level;
Johan Hedberg2a611692011-02-19 12:06:00 -03002453 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002454 } else {
Szymon Janc160b9252016-07-12 02:12:16 +02002455 if (ev->status == HCI_ERROR_PIN_OR_KEY_MISSING)
2456 set_bit(HCI_CONN_AUTH_FAILURE, &conn->flags);
2457
Johan Hedberge1e930f2014-09-08 17:09:49 -07002458 mgmt_auth_failed(conn, ev->status);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002459 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002460
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002461 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
2462 clear_bit(HCI_CONN_REAUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002463
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002464 if (conn->state == BT_CONFIG) {
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002465 if (!ev->status && hci_conn_ssp_enabled(conn)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002466 struct hci_cp_set_conn_encrypt cp;
2467 cp.handle = ev->handle;
2468 cp.encrypt = 0x01;
2469 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002470 &cp);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002471 } else {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002472 conn->state = BT_CONNECTED;
Johan Hedberg539c4962015-02-18 14:53:57 +02002473 hci_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002474 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002475 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002476 } else {
2477 hci_auth_cfm(conn, ev->status);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002478
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002479 hci_conn_hold(conn);
2480 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02002481 hci_conn_drop(conn);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002482 }
2483
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002484 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002485 if (!ev->status) {
2486 struct hci_cp_set_conn_encrypt cp;
2487 cp.handle = ev->handle;
2488 cp.encrypt = 0x01;
2489 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002490 &cp);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002491 } else {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002492 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002493 hci_encrypt_cfm(conn, ev->status, 0x00);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002494 }
2495 }
2496
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002497unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002498 hci_dev_unlock(hdev);
2499}
2500
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002501static void hci_remote_name_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002502{
Johan Hedberg127178d2010-11-18 22:22:29 +02002503 struct hci_ev_remote_name *ev = (void *) skb->data;
2504 struct hci_conn *conn;
2505
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002506 BT_DBG("%s", hdev->name);
2507
2508 hci_conn_check_pending(hdev);
Johan Hedberg127178d2010-11-18 22:22:29 +02002509
2510 hci_dev_lock(hdev);
2511
2512 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002513
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002514 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedbergb644ba32012-01-17 21:48:47 +02002515 goto check_auth;
2516
2517 if (ev->status == 0)
2518 hci_check_pending_name(hdev, conn, &ev->bdaddr, ev->name,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002519 strnlen(ev->name, HCI_MAX_NAME_LENGTH));
Johan Hedbergb644ba32012-01-17 21:48:47 +02002520 else
2521 hci_check_pending_name(hdev, conn, &ev->bdaddr, NULL, 0);
2522
2523check_auth:
Johan Hedberg79c6c702011-04-28 11:28:55 -07002524 if (!conn)
2525 goto unlock;
2526
2527 if (!hci_outgoing_auth_needed(hdev, conn))
2528 goto unlock;
2529
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002530 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002531 struct hci_cp_auth_requested cp;
Johan Hedberg977f8fc2014-07-17 15:35:39 +03002532
2533 set_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags);
2534
Johan Hedberg127178d2010-11-18 22:22:29 +02002535 cp.handle = __cpu_to_le16(conn->handle);
2536 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED, sizeof(cp), &cp);
2537 }
2538
Johan Hedberg79c6c702011-04-28 11:28:55 -07002539unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02002540 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002541}
2542
Johan Hedberg821f3762015-06-11 13:52:29 +03002543static void read_enc_key_size_complete(struct hci_dev *hdev, u8 status,
2544 u16 opcode, struct sk_buff *skb)
2545{
2546 const struct hci_rp_read_enc_key_size *rp;
2547 struct hci_conn *conn;
2548 u16 handle;
2549
2550 BT_DBG("%s status 0x%02x", hdev->name, status);
2551
2552 if (!skb || skb->len < sizeof(*rp)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002553 bt_dev_err(hdev, "invalid read key size response");
Johan Hedberg821f3762015-06-11 13:52:29 +03002554 return;
2555 }
2556
2557 rp = (void *)skb->data;
2558 handle = le16_to_cpu(rp->handle);
2559
2560 hci_dev_lock(hdev);
2561
2562 conn = hci_conn_hash_lookup_handle(hdev, handle);
2563 if (!conn)
2564 goto unlock;
2565
2566 /* If we fail to read the encryption key size, assume maximum
2567 * (which is the same we do also when this HCI command isn't
2568 * supported.
2569 */
2570 if (rp->status) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002571 bt_dev_err(hdev, "failed to read key size for handle %u",
2572 handle);
Johan Hedberg821f3762015-06-11 13:52:29 +03002573 conn->enc_key_size = HCI_LINK_KEY_SIZE;
2574 } else {
2575 conn->enc_key_size = rp->key_size;
2576 }
2577
2578 if (conn->state == BT_CONFIG) {
2579 conn->state = BT_CONNECTED;
2580 hci_connect_cfm(conn, 0);
2581 hci_conn_drop(conn);
2582 } else {
2583 u8 encrypt;
2584
2585 if (!test_bit(HCI_CONN_ENCRYPT, &conn->flags))
2586 encrypt = 0x00;
Johan Hedberg5d667ef2015-06-12 13:04:47 +03002587 else if (test_bit(HCI_CONN_AES_CCM, &conn->flags))
Johan Hedberg821f3762015-06-11 13:52:29 +03002588 encrypt = 0x02;
2589 else
2590 encrypt = 0x01;
2591
2592 hci_encrypt_cfm(conn, 0, encrypt);
2593 }
2594
2595unlock:
2596 hci_dev_unlock(hdev);
2597}
2598
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002599static void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002600{
2601 struct hci_ev_encrypt_change *ev = (void *) skb->data;
2602 struct hci_conn *conn;
2603
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002604 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002605
2606 hci_dev_lock(hdev);
2607
2608 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002609 if (!conn)
2610 goto unlock;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002611
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002612 if (!ev->status) {
2613 if (ev->encrypt) {
2614 /* Encryption implies authentication */
Johan Hedberg4dae2792014-06-24 17:03:50 +03002615 set_bit(HCI_CONN_AUTH, &conn->flags);
2616 set_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002617 conn->sec_level = conn->pending_sec_level;
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002618
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002619 /* P-256 authentication key implies FIPS */
2620 if (conn->key_type == HCI_LK_AUTH_COMBINATION_P256)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002621 set_bit(HCI_CONN_FIPS, &conn->flags);
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002622
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002623 if ((conn->type == ACL_LINK && ev->encrypt == 0x02) ||
2624 conn->type == LE_LINK)
2625 set_bit(HCI_CONN_AES_CCM, &conn->flags);
2626 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002627 clear_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002628 clear_bit(HCI_CONN_AES_CCM, &conn->flags);
2629 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002630 }
2631
Johan Hedberg7ed3fa22014-09-10 22:16:35 -07002632 /* We should disregard the current RPA and generate a new one
2633 * whenever the encryption procedure fails.
2634 */
2635 if (ev->status && conn->type == LE_LINK)
Marcel Holtmanna1536da2015-03-13 02:11:01 -07002636 hci_dev_set_flag(hdev, HCI_RPA_EXPIRED);
Johan Hedberg7ed3fa22014-09-10 22:16:35 -07002637
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002638 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
2639
2640 if (ev->status && conn->state == BT_CONNECTED) {
Szymon Janc160b9252016-07-12 02:12:16 +02002641 if (ev->status == HCI_ERROR_PIN_OR_KEY_MISSING)
2642 set_bit(HCI_CONN_AUTH_FAILURE, &conn->flags);
2643
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002644 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
2645 hci_conn_drop(conn);
2646 goto unlock;
2647 }
2648
Johan Hedberg035ad622015-06-11 13:52:28 +03002649 /* In Secure Connections Only mode, do not allow any connections
2650 * that are not encrypted with AES-CCM using a P-256 authenticated
2651 * combination key.
2652 */
2653 if (hci_dev_test_flag(hdev, HCI_SC_ONLY) &&
2654 (!test_bit(HCI_CONN_AES_CCM, &conn->flags) ||
2655 conn->key_type != HCI_LK_AUTH_COMBINATION_P256)) {
2656 hci_connect_cfm(conn, HCI_ERROR_AUTH_FAILURE);
2657 hci_conn_drop(conn);
2658 goto unlock;
2659 }
2660
Johan Hedberg821f3762015-06-11 13:52:29 +03002661 /* Try reading the encryption key size for encrypted ACL links */
2662 if (!ev->status && ev->encrypt && conn->type == ACL_LINK) {
2663 struct hci_cp_read_enc_key_size cp;
2664 struct hci_request req;
2665
2666 /* Only send HCI_Read_Encryption_Key_Size if the
2667 * controller really supports it. If it doesn't, assume
2668 * the default size (16).
2669 */
2670 if (!(hdev->commands[20] & 0x10)) {
2671 conn->enc_key_size = HCI_LINK_KEY_SIZE;
2672 goto notify;
2673 }
2674
2675 hci_req_init(&req, hdev);
2676
2677 cp.handle = cpu_to_le16(conn->handle);
2678 hci_req_add(&req, HCI_OP_READ_ENC_KEY_SIZE, sizeof(cp), &cp);
2679
2680 if (hci_req_run_skb(&req, read_enc_key_size_complete)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002681 bt_dev_err(hdev, "sending read key size failed");
Johan Hedberg821f3762015-06-11 13:52:29 +03002682 conn->enc_key_size = HCI_LINK_KEY_SIZE;
2683 goto notify;
2684 }
2685
2686 goto unlock;
2687 }
2688
2689notify:
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002690 if (conn->state == BT_CONFIG) {
2691 if (!ev->status)
2692 conn->state = BT_CONNECTED;
2693
Johan Hedberg539c4962015-02-18 14:53:57 +02002694 hci_connect_cfm(conn, ev->status);
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002695 hci_conn_drop(conn);
2696 } else
2697 hci_encrypt_cfm(conn, ev->status, ev->encrypt);
2698
Gustavo Padovana7d77232012-05-13 03:20:07 -03002699unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002700 hci_dev_unlock(hdev);
2701}
2702
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002703static void hci_change_link_key_complete_evt(struct hci_dev *hdev,
2704 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002705{
2706 struct hci_ev_change_link_key_complete *ev = (void *) skb->data;
2707 struct hci_conn *conn;
2708
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002709 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002710
2711 hci_dev_lock(hdev);
2712
2713 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
2714 if (conn) {
2715 if (!ev->status)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002716 set_bit(HCI_CONN_SECURE, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002717
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002718 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002719
2720 hci_key_change_cfm(conn, ev->status);
2721 }
2722
2723 hci_dev_unlock(hdev);
2724}
2725
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002726static void hci_remote_features_evt(struct hci_dev *hdev,
2727 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002728{
2729 struct hci_ev_remote_features *ev = (void *) skb->data;
2730 struct hci_conn *conn;
2731
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002732 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002733
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002734 hci_dev_lock(hdev);
2735
2736 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02002737 if (!conn)
2738 goto unlock;
Marcel Holtmann769be972008-07-14 20:13:49 +02002739
Johan Hedbergccd556f2010-11-10 17:11:51 +02002740 if (!ev->status)
Johan Hedbergcad718e2013-04-17 15:00:51 +03002741 memcpy(conn->features[0], ev->features, 8);
Johan Hedbergccd556f2010-11-10 17:11:51 +02002742
2743 if (conn->state != BT_CONFIG)
2744 goto unlock;
2745
Szymon Jancac363cf2015-01-29 16:36:59 +01002746 if (!ev->status && lmp_ext_feat_capable(hdev) &&
2747 lmp_ext_feat_capable(conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02002748 struct hci_cp_read_remote_ext_features cp;
2749 cp.handle = ev->handle;
2750 cp.page = 0x01;
2751 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002752 sizeof(cp), &cp);
Johan Hedberg392599b2010-11-18 22:22:28 +02002753 goto unlock;
2754 }
2755
Johan Hedberg671267b2012-05-12 16:11:50 -03002756 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002757 struct hci_cp_remote_name_req cp;
2758 memset(&cp, 0, sizeof(cp));
2759 bacpy(&cp.bdaddr, &conn->dst);
2760 cp.pscan_rep_mode = 0x02;
2761 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002762 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00002763 mgmt_device_connected(hdev, conn, 0, NULL, 0);
Johan Hedberg392599b2010-11-18 22:22:28 +02002764
Johan Hedberg127178d2010-11-18 22:22:29 +02002765 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02002766 conn->state = BT_CONNECTED;
Johan Hedberg539c4962015-02-18 14:53:57 +02002767 hci_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002768 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02002769 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002770
Johan Hedbergccd556f2010-11-10 17:11:51 +02002771unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002772 hci_dev_unlock(hdev);
2773}
2774
Johan Hedberge62144872015-04-02 13:41:08 +03002775static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb,
2776 u16 *opcode, u8 *status,
2777 hci_req_complete_t *req_complete,
2778 hci_req_complete_skb_t *req_complete_skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002779{
2780 struct hci_ev_cmd_complete *ev = (void *) skb->data;
Johan Hedberge62144872015-04-02 13:41:08 +03002781
2782 *opcode = __le16_to_cpu(ev->opcode);
2783 *status = skb->data[sizeof(*ev)];
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002784
2785 skb_pull(skb, sizeof(*ev));
2786
Johan Hedberge62144872015-04-02 13:41:08 +03002787 switch (*opcode) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002788 case HCI_OP_INQUIRY_CANCEL:
2789 hci_cc_inquiry_cancel(hdev, skb);
2790 break;
2791
Andre Guedes4d934832012-03-21 00:03:35 -03002792 case HCI_OP_PERIODIC_INQ:
2793 hci_cc_periodic_inq(hdev, skb);
2794 break;
2795
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002796 case HCI_OP_EXIT_PERIODIC_INQ:
2797 hci_cc_exit_periodic_inq(hdev, skb);
2798 break;
2799
2800 case HCI_OP_REMOTE_NAME_REQ_CANCEL:
2801 hci_cc_remote_name_req_cancel(hdev, skb);
2802 break;
2803
2804 case HCI_OP_ROLE_DISCOVERY:
2805 hci_cc_role_discovery(hdev, skb);
2806 break;
2807
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002808 case HCI_OP_READ_LINK_POLICY:
2809 hci_cc_read_link_policy(hdev, skb);
2810 break;
2811
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002812 case HCI_OP_WRITE_LINK_POLICY:
2813 hci_cc_write_link_policy(hdev, skb);
2814 break;
2815
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002816 case HCI_OP_READ_DEF_LINK_POLICY:
2817 hci_cc_read_def_link_policy(hdev, skb);
2818 break;
2819
2820 case HCI_OP_WRITE_DEF_LINK_POLICY:
2821 hci_cc_write_def_link_policy(hdev, skb);
2822 break;
2823
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002824 case HCI_OP_RESET:
2825 hci_cc_reset(hdev, skb);
2826 break;
2827
Marcel Holtmannc2f0f972015-01-12 09:21:25 -08002828 case HCI_OP_READ_STORED_LINK_KEY:
2829 hci_cc_read_stored_link_key(hdev, skb);
2830 break;
2831
Marcel Holtmanna93661202015-01-12 09:21:28 -08002832 case HCI_OP_DELETE_STORED_LINK_KEY:
2833 hci_cc_delete_stored_link_key(hdev, skb);
2834 break;
2835
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002836 case HCI_OP_WRITE_LOCAL_NAME:
2837 hci_cc_write_local_name(hdev, skb);
2838 break;
2839
2840 case HCI_OP_READ_LOCAL_NAME:
2841 hci_cc_read_local_name(hdev, skb);
2842 break;
2843
2844 case HCI_OP_WRITE_AUTH_ENABLE:
2845 hci_cc_write_auth_enable(hdev, skb);
2846 break;
2847
2848 case HCI_OP_WRITE_ENCRYPT_MODE:
2849 hci_cc_write_encrypt_mode(hdev, skb);
2850 break;
2851
2852 case HCI_OP_WRITE_SCAN_ENABLE:
2853 hci_cc_write_scan_enable(hdev, skb);
2854 break;
2855
2856 case HCI_OP_READ_CLASS_OF_DEV:
2857 hci_cc_read_class_of_dev(hdev, skb);
2858 break;
2859
2860 case HCI_OP_WRITE_CLASS_OF_DEV:
2861 hci_cc_write_class_of_dev(hdev, skb);
2862 break;
2863
2864 case HCI_OP_READ_VOICE_SETTING:
2865 hci_cc_read_voice_setting(hdev, skb);
2866 break;
2867
2868 case HCI_OP_WRITE_VOICE_SETTING:
2869 hci_cc_write_voice_setting(hdev, skb);
2870 break;
2871
Marcel Holtmannb4cb9fb2013-10-14 13:56:16 -07002872 case HCI_OP_READ_NUM_SUPPORTED_IAC:
2873 hci_cc_read_num_supported_iac(hdev, skb);
2874 break;
2875
Marcel Holtmann333140b2008-07-14 20:13:48 +02002876 case HCI_OP_WRITE_SSP_MODE:
2877 hci_cc_write_ssp_mode(hdev, skb);
2878 break;
2879
Marcel Holtmanneac83dc2014-01-10 02:07:23 -08002880 case HCI_OP_WRITE_SC_SUPPORT:
2881 hci_cc_write_sc_support(hdev, skb);
2882 break;
2883
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002884 case HCI_OP_READ_LOCAL_VERSION:
2885 hci_cc_read_local_version(hdev, skb);
2886 break;
2887
2888 case HCI_OP_READ_LOCAL_COMMANDS:
2889 hci_cc_read_local_commands(hdev, skb);
2890 break;
2891
2892 case HCI_OP_READ_LOCAL_FEATURES:
2893 hci_cc_read_local_features(hdev, skb);
2894 break;
2895
Andre Guedes971e3a42011-06-30 19:20:52 -03002896 case HCI_OP_READ_LOCAL_EXT_FEATURES:
2897 hci_cc_read_local_ext_features(hdev, skb);
2898 break;
2899
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002900 case HCI_OP_READ_BUFFER_SIZE:
2901 hci_cc_read_buffer_size(hdev, skb);
2902 break;
2903
2904 case HCI_OP_READ_BD_ADDR:
2905 hci_cc_read_bd_addr(hdev, skb);
2906 break;
2907
Johan Hedbergf332ec62013-03-15 17:07:11 -05002908 case HCI_OP_READ_PAGE_SCAN_ACTIVITY:
2909 hci_cc_read_page_scan_activity(hdev, skb);
2910 break;
2911
Johan Hedberg4a3ee762013-03-15 17:07:12 -05002912 case HCI_OP_WRITE_PAGE_SCAN_ACTIVITY:
2913 hci_cc_write_page_scan_activity(hdev, skb);
2914 break;
2915
Johan Hedbergf332ec62013-03-15 17:07:11 -05002916 case HCI_OP_READ_PAGE_SCAN_TYPE:
2917 hci_cc_read_page_scan_type(hdev, skb);
2918 break;
2919
Johan Hedberg4a3ee762013-03-15 17:07:12 -05002920 case HCI_OP_WRITE_PAGE_SCAN_TYPE:
2921 hci_cc_write_page_scan_type(hdev, skb);
2922 break;
2923
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +02002924 case HCI_OP_READ_DATA_BLOCK_SIZE:
2925 hci_cc_read_data_block_size(hdev, skb);
2926 break;
2927
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +02002928 case HCI_OP_READ_FLOW_CONTROL_MODE:
2929 hci_cc_read_flow_control_mode(hdev, skb);
2930 break;
2931
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +03002932 case HCI_OP_READ_LOCAL_AMP_INFO:
2933 hci_cc_read_local_amp_info(hdev, skb);
2934 break;
2935
Johan Hedberg33f35722014-06-28 17:54:06 +03002936 case HCI_OP_READ_CLOCK:
2937 hci_cc_read_clock(hdev, skb);
2938 break;
2939
Johan Hedbergd5859e22011-01-25 01:19:58 +02002940 case HCI_OP_READ_INQ_RSP_TX_POWER:
2941 hci_cc_read_inq_rsp_tx_power(hdev, skb);
2942 break;
2943
Johan Hedberg980e1a52011-01-22 06:10:07 +02002944 case HCI_OP_PIN_CODE_REPLY:
2945 hci_cc_pin_code_reply(hdev, skb);
2946 break;
2947
2948 case HCI_OP_PIN_CODE_NEG_REPLY:
2949 hci_cc_pin_code_neg_reply(hdev, skb);
2950 break;
2951
Szymon Jancc35938b2011-03-22 13:12:21 +01002952 case HCI_OP_READ_LOCAL_OOB_DATA:
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08002953 hci_cc_read_local_oob_data(hdev, skb);
2954 break;
2955
2956 case HCI_OP_READ_LOCAL_OOB_EXT_DATA:
2957 hci_cc_read_local_oob_ext_data(hdev, skb);
Szymon Jancc35938b2011-03-22 13:12:21 +01002958 break;
2959
Ville Tervo6ed58ec2011-02-10 22:38:48 -03002960 case HCI_OP_LE_READ_BUFFER_SIZE:
2961 hci_cc_le_read_buffer_size(hdev, skb);
2962 break;
2963
Johan Hedberg60e77322013-01-22 14:01:59 +02002964 case HCI_OP_LE_READ_LOCAL_FEATURES:
2965 hci_cc_le_read_local_features(hdev, skb);
2966 break;
2967
Johan Hedberg8fa19092012-10-19 20:57:49 +03002968 case HCI_OP_LE_READ_ADV_TX_POWER:
2969 hci_cc_le_read_adv_tx_power(hdev, skb);
2970 break;
2971
Johan Hedberga5c29682011-02-19 12:05:57 -03002972 case HCI_OP_USER_CONFIRM_REPLY:
2973 hci_cc_user_confirm_reply(hdev, skb);
2974 break;
2975
2976 case HCI_OP_USER_CONFIRM_NEG_REPLY:
2977 hci_cc_user_confirm_neg_reply(hdev, skb);
2978 break;
2979
Brian Gix1143d452011-11-23 08:28:34 -08002980 case HCI_OP_USER_PASSKEY_REPLY:
2981 hci_cc_user_passkey_reply(hdev, skb);
2982 break;
2983
2984 case HCI_OP_USER_PASSKEY_NEG_REPLY:
2985 hci_cc_user_passkey_neg_reply(hdev, skb);
Szymon Janc16cde992012-04-13 12:32:42 +02002986 break;
Andre Guedes07f7fa52011-12-02 21:13:31 +09002987
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08002988 case HCI_OP_LE_SET_RANDOM_ADDR:
2989 hci_cc_le_set_random_addr(hdev, skb);
2990 break;
2991
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01002992 case HCI_OP_LE_SET_ADV_ENABLE:
2993 hci_cc_le_set_adv_enable(hdev, skb);
2994 break;
2995
Marcel Holtmann533553f2014-03-21 12:18:10 -07002996 case HCI_OP_LE_SET_SCAN_PARAM:
2997 hci_cc_le_set_scan_param(hdev, skb);
2998 break;
2999
Andre Guedeseb9d91f2011-05-26 16:23:52 -03003000 case HCI_OP_LE_SET_SCAN_ENABLE:
3001 hci_cc_le_set_scan_enable(hdev, skb);
3002 break;
3003
Johan Hedbergcf1d0812013-01-22 14:02:00 +02003004 case HCI_OP_LE_READ_WHITE_LIST_SIZE:
3005 hci_cc_le_read_white_list_size(hdev, skb);
3006 break;
3007
Marcel Holtmann0f36b582014-02-27 20:37:31 -08003008 case HCI_OP_LE_CLEAR_WHITE_LIST:
3009 hci_cc_le_clear_white_list(hdev, skb);
3010 break;
3011
3012 case HCI_OP_LE_ADD_TO_WHITE_LIST:
3013 hci_cc_le_add_to_white_list(hdev, skb);
3014 break;
3015
3016 case HCI_OP_LE_DEL_FROM_WHITE_LIST:
3017 hci_cc_le_del_from_white_list(hdev, skb);
3018 break;
3019
Johan Hedberg9b008c02013-01-22 14:02:01 +02003020 case HCI_OP_LE_READ_SUPPORTED_STATES:
3021 hci_cc_le_read_supported_states(hdev, skb);
3022 break;
3023
Marcel Holtmanna8e1bfa2014-12-20 16:28:40 +01003024 case HCI_OP_LE_READ_DEF_DATA_LEN:
3025 hci_cc_le_read_def_data_len(hdev, skb);
3026 break;
3027
3028 case HCI_OP_LE_WRITE_DEF_DATA_LEN:
3029 hci_cc_le_write_def_data_len(hdev, skb);
3030 break;
3031
Ankit Navikcfdb0c22018-06-29 12:12:50 +05303032 case HCI_OP_LE_READ_RESOLV_LIST_SIZE:
3033 hci_cc_le_read_resolv_list_size(hdev, skb);
3034 break;
3035
Marcel Holtmanna8e1bfa2014-12-20 16:28:40 +01003036 case HCI_OP_LE_READ_MAX_DATA_LEN:
3037 hci_cc_le_read_max_data_len(hdev, skb);
3038 break;
3039
Andre Guedesf9b49302011-06-30 19:20:53 -03003040 case HCI_OP_WRITE_LE_HOST_SUPPORTED:
3041 hci_cc_write_le_host_supported(hdev, skb);
3042 break;
3043
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02003044 case HCI_OP_LE_SET_ADV_PARAM:
3045 hci_cc_set_adv_param(hdev, skb);
3046 break;
3047
Andrzej Kaczmarek5ae76a92014-05-08 15:32:08 +02003048 case HCI_OP_READ_RSSI:
3049 hci_cc_read_rssi(hdev, skb);
3050 break;
3051
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02003052 case HCI_OP_READ_TX_POWER:
3053 hci_cc_read_tx_power(hdev, skb);
3054 break;
3055
Marcel Holtmannc50b33c2015-01-31 15:07:52 -08003056 case HCI_OP_WRITE_SSP_DEBUG_MODE:
3057 hci_cc_write_ssp_debug_mode(hdev, skb);
3058 break;
3059
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003060 default:
Johan Hedberge62144872015-04-02 13:41:08 +03003061 BT_DBG("%s opcode 0x%4.4x", hdev->name, *opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003062 break;
3063 }
3064
Johan Hedberge62144872015-04-02 13:41:08 +03003065 if (*opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02003066 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02003067
Johan Hedberg600b2152015-03-28 11:17:36 +02003068 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags))
3069 atomic_set(&hdev->cmd_cnt, 1);
3070
Johan Hedberge62144872015-04-02 13:41:08 +03003071 hci_req_cmd_complete(hdev, *opcode, *status, req_complete,
3072 req_complete_skb);
Johan Hedberg9238f362013-03-05 20:37:48 +02003073
Johan Hedberg600b2152015-03-28 11:17:36 +02003074 if (atomic_read(&hdev->cmd_cnt) && !skb_queue_empty(&hdev->cmd_q))
3075 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003076}
3077
Johan Hedberge62144872015-04-02 13:41:08 +03003078static void hci_cmd_status_evt(struct hci_dev *hdev, struct sk_buff *skb,
3079 u16 *opcode, u8 *status,
3080 hci_req_complete_t *req_complete,
3081 hci_req_complete_skb_t *req_complete_skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003082{
3083 struct hci_ev_cmd_status *ev = (void *) skb->data;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003084
3085 skb_pull(skb, sizeof(*ev));
3086
Johan Hedberge62144872015-04-02 13:41:08 +03003087 *opcode = __le16_to_cpu(ev->opcode);
3088 *status = ev->status;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003089
Johan Hedberge62144872015-04-02 13:41:08 +03003090 switch (*opcode) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003091 case HCI_OP_INQUIRY:
3092 hci_cs_inquiry(hdev, ev->status);
3093 break;
3094
3095 case HCI_OP_CREATE_CONN:
3096 hci_cs_create_conn(hdev, ev->status);
3097 break;
3098
Kuba Pawlak9645c762014-11-06 19:36:53 +01003099 case HCI_OP_DISCONNECT:
3100 hci_cs_disconnect(hdev, ev->status);
3101 break;
3102
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003103 case HCI_OP_ADD_SCO:
3104 hci_cs_add_sco(hdev, ev->status);
3105 break;
3106
Marcel Holtmannf8558552008-07-14 20:13:49 +02003107 case HCI_OP_AUTH_REQUESTED:
3108 hci_cs_auth_requested(hdev, ev->status);
3109 break;
3110
3111 case HCI_OP_SET_CONN_ENCRYPT:
3112 hci_cs_set_conn_encrypt(hdev, ev->status);
3113 break;
3114
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003115 case HCI_OP_REMOTE_NAME_REQ:
3116 hci_cs_remote_name_req(hdev, ev->status);
3117 break;
3118
Marcel Holtmann769be972008-07-14 20:13:49 +02003119 case HCI_OP_READ_REMOTE_FEATURES:
3120 hci_cs_read_remote_features(hdev, ev->status);
3121 break;
3122
3123 case HCI_OP_READ_REMOTE_EXT_FEATURES:
3124 hci_cs_read_remote_ext_features(hdev, ev->status);
3125 break;
3126
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003127 case HCI_OP_SETUP_SYNC_CONN:
3128 hci_cs_setup_sync_conn(hdev, ev->status);
3129 break;
3130
3131 case HCI_OP_SNIFF_MODE:
3132 hci_cs_sniff_mode(hdev, ev->status);
3133 break;
3134
3135 case HCI_OP_EXIT_SNIFF_MODE:
3136 hci_cs_exit_sniff_mode(hdev, ev->status);
3137 break;
3138
Kuba Pawlak50fc85f2014-11-06 19:36:52 +01003139 case HCI_OP_SWITCH_ROLE:
3140 hci_cs_switch_role(hdev, ev->status);
3141 break;
3142
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02003143 case HCI_OP_LE_CREATE_CONN:
3144 hci_cs_le_create_conn(hdev, ev->status);
3145 break;
3146
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07003147 case HCI_OP_LE_READ_REMOTE_FEATURES:
3148 hci_cs_le_read_remote_features(hdev, ev->status);
3149 break;
3150
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02003151 case HCI_OP_LE_START_ENC:
3152 hci_cs_le_start_enc(hdev, ev->status);
3153 break;
3154
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003155 default:
Johan Hedberge62144872015-04-02 13:41:08 +03003156 BT_DBG("%s opcode 0x%4.4x", hdev->name, *opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003157 break;
3158 }
3159
Johan Hedberge62144872015-04-02 13:41:08 +03003160 if (*opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02003161 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02003162
Johan Hedberg600b2152015-03-28 11:17:36 +02003163 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags))
3164 atomic_set(&hdev->cmd_cnt, 1);
3165
Johan Hedberg444c6dd2015-04-02 13:41:07 +03003166 /* Indicate request completion if the command failed. Also, if
3167 * we're not waiting for a special event and we get a success
3168 * command status we should try to flag the request as completed
3169 * (since for this kind of commands there will not be a command
3170 * complete event).
3171 */
Johan Hedberg02350a72013-04-03 21:50:29 +03003172 if (ev->status ||
Marcel Holtmann242c0eb2015-10-25 22:45:53 +01003173 (hdev->sent_cmd && !bt_cb(hdev->sent_cmd)->hci.req_event))
Johan Hedberge62144872015-04-02 13:41:08 +03003174 hci_req_cmd_complete(hdev, *opcode, ev->status, req_complete,
3175 req_complete_skb);
Johan Hedberg9238f362013-03-05 20:37:48 +02003176
Johan Hedberg600b2152015-03-28 11:17:36 +02003177 if (atomic_read(&hdev->cmd_cnt) && !skb_queue_empty(&hdev->cmd_q))
3178 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003179}
3180
Marcel Holtmann24dfa342014-11-02 02:56:41 +01003181static void hci_hardware_error_evt(struct hci_dev *hdev, struct sk_buff *skb)
3182{
3183 struct hci_ev_hardware_error *ev = (void *) skb->data;
3184
Marcel Holtmannc7741d12015-01-28 11:09:55 -08003185 hdev->hw_error_code = ev->code;
3186
3187 queue_work(hdev->req_workqueue, &hdev->error_reset);
Marcel Holtmann24dfa342014-11-02 02:56:41 +01003188}
3189
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003190static void hci_role_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003191{
3192 struct hci_ev_role_change *ev = (void *) skb->data;
3193 struct hci_conn *conn;
3194
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003195 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003196
3197 hci_dev_lock(hdev);
3198
3199 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3200 if (conn) {
Johan Hedberg40bef302014-07-16 11:42:27 +03003201 if (!ev->status)
3202 conn->role = ev->role;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003203
Johan Hedberg51a8efd2012-01-16 06:10:31 +02003204 clear_bit(HCI_CONN_RSWITCH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003205
3206 hci_role_switch_cfm(conn, ev->status, ev->role);
3207 }
3208
3209 hci_dev_unlock(hdev);
3210}
3211
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003212static void hci_num_comp_pkts_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003213{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003214 struct hci_ev_num_comp_pkts *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003215 int i;
3216
Andrei Emeltchenko32ac5b92011-12-19 16:31:29 +02003217 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_PACKET_BASED) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003218 bt_dev_err(hdev, "wrong event for mode %d", hdev->flow_ctl_mode);
Andrei Emeltchenko32ac5b92011-12-19 16:31:29 +02003219 return;
3220 }
3221
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02003222 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03003223 ev->num_hndl * sizeof(struct hci_comp_pkts_info)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003224 BT_DBG("%s bad parameters", hdev->name);
3225 return;
3226 }
3227
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02003228 BT_DBG("%s num_hndl %d", hdev->name, ev->num_hndl);
3229
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02003230 for (i = 0; i < ev->num_hndl; i++) {
3231 struct hci_comp_pkts_info *info = &ev->handles[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07003232 struct hci_conn *conn;
3233 __u16 handle, count;
3234
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02003235 handle = __le16_to_cpu(info->handle);
3236 count = __le16_to_cpu(info->count);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003237
3238 conn = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003239 if (!conn)
3240 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003241
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003242 conn->sent -= count;
3243
3244 switch (conn->type) {
3245 case ACL_LINK:
3246 hdev->acl_cnt += count;
3247 if (hdev->acl_cnt > hdev->acl_pkts)
3248 hdev->acl_cnt = hdev->acl_pkts;
3249 break;
3250
3251 case LE_LINK:
3252 if (hdev->le_pkts) {
3253 hdev->le_cnt += count;
3254 if (hdev->le_cnt > hdev->le_pkts)
3255 hdev->le_cnt = hdev->le_pkts;
3256 } else {
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02003257 hdev->acl_cnt += count;
3258 if (hdev->acl_cnt > hdev->acl_pkts)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003259 hdev->acl_cnt = hdev->acl_pkts;
3260 }
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003261 break;
3262
3263 case SCO_LINK:
3264 hdev->sco_cnt += count;
3265 if (hdev->sco_cnt > hdev->sco_pkts)
3266 hdev->sco_cnt = hdev->sco_pkts;
3267 break;
3268
3269 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003270 bt_dev_err(hdev, "unknown type %d conn %p",
3271 conn->type, conn);
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003272 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003273 }
3274 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003275
Gustavo F. Padovan3eff45e2011-12-15 00:50:02 -02003276 queue_work(hdev->workqueue, &hdev->tx_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003277}
3278
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003279static struct hci_conn *__hci_conn_lookup_handle(struct hci_dev *hdev,
3280 __u16 handle)
3281{
3282 struct hci_chan *chan;
3283
3284 switch (hdev->dev_type) {
Marcel Holtmannca8bee52016-07-05 14:30:14 +02003285 case HCI_PRIMARY:
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003286 return hci_conn_hash_lookup_handle(hdev, handle);
3287 case HCI_AMP:
3288 chan = hci_chan_lookup_handle(hdev, handle);
3289 if (chan)
3290 return chan->conn;
3291 break;
3292 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003293 bt_dev_err(hdev, "unknown dev_type %d", hdev->dev_type);
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003294 break;
3295 }
3296
3297 return NULL;
3298}
3299
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003300static void hci_num_comp_blocks_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003301{
3302 struct hci_ev_num_comp_blocks *ev = (void *) skb->data;
3303 int i;
3304
3305 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_BLOCK_BASED) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003306 bt_dev_err(hdev, "wrong event for mode %d", hdev->flow_ctl_mode);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003307 return;
3308 }
3309
3310 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03003311 ev->num_hndl * sizeof(struct hci_comp_blocks_info)) {
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003312 BT_DBG("%s bad parameters", hdev->name);
3313 return;
3314 }
3315
3316 BT_DBG("%s num_blocks %d num_hndl %d", hdev->name, ev->num_blocks,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003317 ev->num_hndl);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003318
3319 for (i = 0; i < ev->num_hndl; i++) {
3320 struct hci_comp_blocks_info *info = &ev->handles[i];
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003321 struct hci_conn *conn = NULL;
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003322 __u16 handle, block_count;
3323
3324 handle = __le16_to_cpu(info->handle);
3325 block_count = __le16_to_cpu(info->blocks);
3326
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003327 conn = __hci_conn_lookup_handle(hdev, handle);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003328 if (!conn)
3329 continue;
3330
3331 conn->sent -= block_count;
3332
3333 switch (conn->type) {
3334 case ACL_LINK:
Andrei Emeltchenkobd1eb662012-10-10 17:38:30 +03003335 case AMP_LINK:
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003336 hdev->block_cnt += block_count;
3337 if (hdev->block_cnt > hdev->num_blocks)
3338 hdev->block_cnt = hdev->num_blocks;
3339 break;
3340
3341 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003342 bt_dev_err(hdev, "unknown type %d conn %p",
3343 conn->type, conn);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003344 break;
3345 }
3346 }
3347
3348 queue_work(hdev->workqueue, &hdev->tx_work);
3349}
3350
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003351static void hci_mode_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003352{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003353 struct hci_ev_mode_change *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003354 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003355
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003356 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003357
3358 hci_dev_lock(hdev);
3359
Marcel Holtmann04837f62006-07-03 10:02:33 +02003360 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3361 if (conn) {
3362 conn->mode = ev->mode;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003363
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003364 if (!test_and_clear_bit(HCI_CONN_MODE_CHANGE_PEND,
3365 &conn->flags)) {
Marcel Holtmann04837f62006-07-03 10:02:33 +02003366 if (conn->mode == HCI_CM_ACTIVE)
Johan Hedberg58a681e2012-01-16 06:47:28 +02003367 set_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003368 else
Johan Hedberg58a681e2012-01-16 06:47:28 +02003369 clear_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003370 }
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003371
Johan Hedberg51a8efd2012-01-16 06:10:31 +02003372 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003373 hci_sco_setup(conn, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003374 }
3375
3376 hci_dev_unlock(hdev);
3377}
3378
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003379static void hci_pin_code_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003380{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003381 struct hci_ev_pin_code_req *ev = (void *) skb->data;
3382 struct hci_conn *conn;
3383
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003384 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003385
3386 hci_dev_lock(hdev);
3387
3388 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003389 if (!conn)
3390 goto unlock;
3391
3392 if (conn->state == BT_CONNECTED) {
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003393 hci_conn_hold(conn);
3394 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003395 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003396 }
3397
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003398 if (!hci_dev_test_flag(hdev, HCI_BONDABLE) &&
Johan Hedberg2f407f02014-07-17 15:35:40 +03003399 !test_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags)) {
Johan Hedberg03b555e2011-01-04 15:40:05 +02003400 hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003401 sizeof(ev->bdaddr), &ev->bdaddr);
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003402 } else if (hci_dev_test_flag(hdev, HCI_MGMT)) {
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003403 u8 secure;
3404
3405 if (conn->pending_sec_level == BT_SECURITY_HIGH)
3406 secure = 1;
3407 else
3408 secure = 0;
3409
Johan Hedberg744cf192011-11-08 20:40:14 +02003410 mgmt_pin_code_request(hdev, &ev->bdaddr, secure);
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003411 }
Johan Hedberg980e1a52011-01-22 06:10:07 +02003412
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003413unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003414 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003415}
3416
Johan Hedbergcb6f3f72014-11-19 14:53:04 +02003417static void conn_set_key(struct hci_conn *conn, u8 key_type, u8 pin_len)
3418{
3419 if (key_type == HCI_LK_CHANGED_COMBINATION)
3420 return;
3421
3422 conn->pin_length = pin_len;
3423 conn->key_type = key_type;
3424
3425 switch (key_type) {
3426 case HCI_LK_LOCAL_UNIT:
3427 case HCI_LK_REMOTE_UNIT:
3428 case HCI_LK_DEBUG_COMBINATION:
3429 return;
3430 case HCI_LK_COMBINATION:
3431 if (pin_len == 16)
3432 conn->pending_sec_level = BT_SECURITY_HIGH;
3433 else
3434 conn->pending_sec_level = BT_SECURITY_MEDIUM;
3435 break;
3436 case HCI_LK_UNAUTH_COMBINATION_P192:
3437 case HCI_LK_UNAUTH_COMBINATION_P256:
3438 conn->pending_sec_level = BT_SECURITY_MEDIUM;
3439 break;
3440 case HCI_LK_AUTH_COMBINATION_P192:
3441 conn->pending_sec_level = BT_SECURITY_HIGH;
3442 break;
3443 case HCI_LK_AUTH_COMBINATION_P256:
3444 conn->pending_sec_level = BT_SECURITY_FIPS;
3445 break;
3446 }
3447}
3448
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003449static void hci_link_key_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003450{
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003451 struct hci_ev_link_key_req *ev = (void *) skb->data;
3452 struct hci_cp_link_key_reply cp;
3453 struct hci_conn *conn;
3454 struct link_key *key;
3455
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003456 BT_DBG("%s", hdev->name);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003457
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003458 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003459 return;
3460
3461 hci_dev_lock(hdev);
3462
3463 key = hci_find_link_key(hdev, &ev->bdaddr);
3464 if (!key) {
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003465 BT_DBG("%s link key not found for %pMR", hdev->name,
3466 &ev->bdaddr);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003467 goto not_found;
3468 }
3469
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003470 BT_DBG("%s found key type %u for %pMR", hdev->name, key->type,
3471 &ev->bdaddr);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003472
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003473 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003474 if (conn) {
Johan Hedbergfe8bc5a2014-08-14 12:33:17 +03003475 clear_bit(HCI_CONN_NEW_LINK_KEY, &conn->flags);
3476
Marcel Holtmann66138ce2014-01-10 02:07:20 -08003477 if ((key->type == HCI_LK_UNAUTH_COMBINATION_P192 ||
3478 key->type == HCI_LK_UNAUTH_COMBINATION_P256) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03003479 conn->auth_type != 0xff && (conn->auth_type & 0x01)) {
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003480 BT_DBG("%s ignoring unauthenticated key", hdev->name);
3481 goto not_found;
3482 }
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003483
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003484 if (key->type == HCI_LK_COMBINATION && key->pin_len < 16 &&
Johan Hedbergf3fb0b52014-06-02 10:12:44 +03003485 (conn->pending_sec_level == BT_SECURITY_HIGH ||
3486 conn->pending_sec_level == BT_SECURITY_FIPS)) {
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003487 BT_DBG("%s ignoring key unauthenticated for high security",
3488 hdev->name);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003489 goto not_found;
3490 }
3491
Johan Hedbergcb6f3f72014-11-19 14:53:04 +02003492 conn_set_key(conn, key->type, key->pin_len);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003493 }
3494
3495 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9b3b4462012-05-23 11:31:20 +03003496 memcpy(cp.link_key, key->val, HCI_LINK_KEY_SIZE);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003497
3498 hci_send_cmd(hdev, HCI_OP_LINK_KEY_REPLY, sizeof(cp), &cp);
3499
3500 hci_dev_unlock(hdev);
3501
3502 return;
3503
3504not_found:
3505 hci_send_cmd(hdev, HCI_OP_LINK_KEY_NEG_REPLY, 6, &ev->bdaddr);
3506 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003507}
3508
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003509static void hci_link_key_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003510{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003511 struct hci_ev_link_key_notify *ev = (void *) skb->data;
3512 struct hci_conn *conn;
Johan Hedberg7652ff62014-06-24 13:15:49 +03003513 struct link_key *key;
3514 bool persistent;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003515 u8 pin_len = 0;
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003516
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003517 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003518
3519 hci_dev_lock(hdev);
3520
3521 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg82c13d42014-12-03 11:03:06 +02003522 if (!conn)
3523 goto unlock;
3524
3525 hci_conn_hold(conn);
3526 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
3527 hci_conn_drop(conn);
3528
Johan Hedbergfe8bc5a2014-08-14 12:33:17 +03003529 set_bit(HCI_CONN_NEW_LINK_KEY, &conn->flags);
Johan Hedberg82c13d42014-12-03 11:03:06 +02003530 conn_set_key(conn, ev->key_type, conn->pin_length);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003531
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003532 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg7652ff62014-06-24 13:15:49 +03003533 goto unlock;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003534
Johan Hedberg7652ff62014-06-24 13:15:49 +03003535 key = hci_add_link_key(hdev, conn, &ev->bdaddr, ev->link_key,
3536 ev->key_type, pin_len, &persistent);
3537 if (!key)
3538 goto unlock;
3539
Johan Hedbergcb6f3f72014-11-19 14:53:04 +02003540 /* Update connection information since adding the key will have
3541 * fixed up the type in the case of changed combination keys.
3542 */
3543 if (ev->key_type == HCI_LK_CHANGED_COMBINATION)
3544 conn_set_key(conn, key->type, key->pin_len);
3545
Johan Hedberg7652ff62014-06-24 13:15:49 +03003546 mgmt_new_link_key(hdev, key, persistent);
3547
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003548 /* Keep debug keys around only if the HCI_KEEP_DEBUG_KEYS flag
3549 * is set. If it's not set simply remove the key from the kernel
3550 * list (we've still notified user space about it but with
3551 * store_hint being 0).
3552 */
3553 if (key->type == HCI_LK_DEBUG_COMBINATION &&
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003554 !hci_dev_test_flag(hdev, HCI_KEEP_DEBUG_KEYS)) {
Johan Hedberg0378b592014-11-19 15:22:22 +02003555 list_del_rcu(&key->list);
3556 kfree_rcu(key, rcu);
Johan Hedberg82c13d42014-12-03 11:03:06 +02003557 goto unlock;
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003558 }
Johan Hedberg7652ff62014-06-24 13:15:49 +03003559
Johan Hedberg82c13d42014-12-03 11:03:06 +02003560 if (persistent)
3561 clear_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
3562 else
3563 set_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
3564
Johan Hedberg7652ff62014-06-24 13:15:49 +03003565unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003566 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003567}
3568
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003569static void hci_clock_offset_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04837f62006-07-03 10:02:33 +02003570{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003571 struct hci_ev_clock_offset *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003572 struct hci_conn *conn;
3573
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003574 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003575
3576 hci_dev_lock(hdev);
3577
3578 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003579 if (conn && !ev->status) {
3580 struct inquiry_entry *ie;
3581
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003582 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3583 if (ie) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003584 ie->data.clock_offset = ev->clock_offset;
3585 ie->timestamp = jiffies;
3586 }
3587 }
3588
3589 hci_dev_unlock(hdev);
3590}
3591
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003592static void hci_pkt_type_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna8746412008-07-14 20:13:46 +02003593{
3594 struct hci_ev_pkt_type_change *ev = (void *) skb->data;
3595 struct hci_conn *conn;
3596
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003597 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna8746412008-07-14 20:13:46 +02003598
3599 hci_dev_lock(hdev);
3600
3601 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3602 if (conn && !ev->status)
3603 conn->pkt_type = __le16_to_cpu(ev->pkt_type);
3604
3605 hci_dev_unlock(hdev);
3606}
3607
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003608static void hci_pscan_rep_mode_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003609{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003610 struct hci_ev_pscan_rep_mode *ev = (void *) skb->data;
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003611 struct inquiry_entry *ie;
3612
3613 BT_DBG("%s", hdev->name);
3614
3615 hci_dev_lock(hdev);
3616
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003617 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
3618 if (ie) {
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003619 ie->data.pscan_rep_mode = ev->pscan_rep_mode;
3620 ie->timestamp = jiffies;
3621 }
3622
3623 hci_dev_unlock(hdev);
3624}
3625
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003626static void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev,
3627 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003628{
3629 struct inquiry_data data;
3630 int num_rsp = *((__u8 *) skb->data);
3631
3632 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
3633
3634 if (!num_rsp)
3635 return;
3636
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003637 if (hci_dev_test_flag(hdev, HCI_PERIODIC_INQ))
Andre Guedes1519cc12012-03-21 00:03:38 -03003638 return;
3639
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003640 hci_dev_lock(hdev);
3641
3642 if ((skb->len - 1) / num_rsp != sizeof(struct inquiry_info_with_rssi)) {
Szymon Janc138d22e2011-02-17 16:44:23 +01003643 struct inquiry_info_with_rssi_and_pscan_mode *info;
3644 info = (void *) (skb->data + 1);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003645
Johan Hedberge17acd42011-03-30 23:57:16 +03003646 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003647 u32 flags;
3648
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003649 bacpy(&data.bdaddr, &info->bdaddr);
3650 data.pscan_rep_mode = info->pscan_rep_mode;
3651 data.pscan_period_mode = info->pscan_period_mode;
3652 data.pscan_mode = info->pscan_mode;
3653 memcpy(data.dev_class, info->dev_class, 3);
3654 data.clock_offset = info->clock_offset;
3655 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003656 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02003657
Marcel Holtmannaf589252014-07-01 14:11:20 +02003658 flags = hci_inquiry_cache_update(hdev, &data, false);
3659
Johan Hedberg48264f02011-11-09 13:58:58 +02003660 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003661 info->dev_class, info->rssi,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003662 flags, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003663 }
3664 } else {
3665 struct inquiry_info_with_rssi *info = (void *) (skb->data + 1);
3666
Johan Hedberge17acd42011-03-30 23:57:16 +03003667 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003668 u32 flags;
3669
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003670 bacpy(&data.bdaddr, &info->bdaddr);
3671 data.pscan_rep_mode = info->pscan_rep_mode;
3672 data.pscan_period_mode = info->pscan_period_mode;
3673 data.pscan_mode = 0x00;
3674 memcpy(data.dev_class, info->dev_class, 3);
3675 data.clock_offset = info->clock_offset;
3676 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003677 data.ssp_mode = 0x00;
Marcel Holtmannaf589252014-07-01 14:11:20 +02003678
3679 flags = hci_inquiry_cache_update(hdev, &data, false);
3680
Johan Hedberg48264f02011-11-09 13:58:58 +02003681 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003682 info->dev_class, info->rssi,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003683 flags, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003684 }
3685 }
3686
3687 hci_dev_unlock(hdev);
3688}
3689
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003690static void hci_remote_ext_features_evt(struct hci_dev *hdev,
3691 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003692{
Marcel Holtmann41a96212008-07-14 20:13:48 +02003693 struct hci_ev_remote_ext_features *ev = (void *) skb->data;
3694 struct hci_conn *conn;
3695
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003696 BT_DBG("%s", hdev->name);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003697
Marcel Holtmann41a96212008-07-14 20:13:48 +02003698 hci_dev_lock(hdev);
3699
3700 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02003701 if (!conn)
3702 goto unlock;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003703
Johan Hedbergcad718e2013-04-17 15:00:51 +03003704 if (ev->page < HCI_MAX_PAGES)
3705 memcpy(conn->features[ev->page], ev->features, 8);
3706
Johan Hedbergccd556f2010-11-10 17:11:51 +02003707 if (!ev->status && ev->page == 0x01) {
3708 struct inquiry_entry *ie;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003709
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003710 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3711 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02003712 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann769be972008-07-14 20:13:49 +02003713
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303714 if (ev->features[0] & LMP_HOST_SSP) {
Johan Hedberg58a681e2012-01-16 06:47:28 +02003715 set_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303716 } else {
3717 /* It is mandatory by the Bluetooth specification that
3718 * Extended Inquiry Results are only used when Secure
3719 * Simple Pairing is enabled, but some devices violate
3720 * this.
3721 *
3722 * To make these devices work, the internal SSP
3723 * enabled flag needs to be cleared if the remote host
3724 * features do not indicate SSP support */
3725 clear_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
3726 }
Marcel Holtmanneb9a8f32014-01-15 22:37:38 -08003727
3728 if (ev->features[0] & LMP_HOST_SC)
3729 set_bit(HCI_CONN_SC_ENABLED, &conn->flags);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003730 }
3731
Johan Hedbergccd556f2010-11-10 17:11:51 +02003732 if (conn->state != BT_CONFIG)
3733 goto unlock;
3734
Johan Hedberg671267b2012-05-12 16:11:50 -03003735 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02003736 struct hci_cp_remote_name_req cp;
3737 memset(&cp, 0, sizeof(cp));
3738 bacpy(&cp.bdaddr, &conn->dst);
3739 cp.pscan_rep_mode = 0x02;
3740 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02003741 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00003742 mgmt_device_connected(hdev, conn, 0, NULL, 0);
Johan Hedberg392599b2010-11-18 22:22:28 +02003743
Johan Hedberg127178d2010-11-18 22:22:29 +02003744 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02003745 conn->state = BT_CONNECTED;
Johan Hedberg539c4962015-02-18 14:53:57 +02003746 hci_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02003747 hci_conn_drop(conn);
Johan Hedbergccd556f2010-11-10 17:11:51 +02003748 }
3749
3750unlock:
Marcel Holtmann41a96212008-07-14 20:13:48 +02003751 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003752}
3753
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003754static void hci_sync_conn_complete_evt(struct hci_dev *hdev,
3755 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003756{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003757 struct hci_ev_sync_conn_complete *ev = (void *) skb->data;
3758 struct hci_conn *conn;
3759
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003760 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003761
3762 hci_dev_lock(hdev);
3763
3764 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann9dc0a3a2008-07-14 20:13:46 +02003765 if (!conn) {
3766 if (ev->link_type == ESCO_LINK)
3767 goto unlock;
3768
Kuba Pawlak618353b2015-08-28 13:05:22 +01003769 /* When the link type in the event indicates SCO connection
3770 * and lookup of the connection object fails, then check
3771 * if an eSCO connection object exists.
3772 *
3773 * The core limits the synchronous connections to either
3774 * SCO or eSCO. The eSCO connection is preferred and tried
3775 * to be setup first and until successfully established,
3776 * the link type will be hinted as eSCO.
3777 */
Marcel Holtmann9dc0a3a2008-07-14 20:13:46 +02003778 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
3779 if (!conn)
3780 goto unlock;
Marcel Holtmann9dc0a3a2008-07-14 20:13:46 +02003781 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003782
Marcel Holtmann732547f2009-04-19 19:14:14 +02003783 switch (ev->status) {
3784 case 0x00:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003785 conn->handle = __le16_to_cpu(ev->handle);
3786 conn->state = BT_CONNECTED;
Kuba Pawlak618353b2015-08-28 13:05:22 +01003787 conn->type = ev->link_type;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02003788
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01003789 hci_debugfs_create_conn(conn);
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02003790 hci_conn_add_sysfs(conn);
Marcel Holtmann732547f2009-04-19 19:14:14 +02003791 break;
3792
Nick Pelly81218d22014-06-30 11:25:01 +05303793 case 0x10: /* Connection Accept Timeout */
Frédéric Dalleau1a4c9582013-08-19 14:24:02 +02003794 case 0x0d: /* Connection Rejected due to Limited Resources */
Stephen Coe705e5712010-02-16 11:29:44 -05003795 case 0x11: /* Unsupported Feature or Parameter Value */
Marcel Holtmann732547f2009-04-19 19:14:14 +02003796 case 0x1c: /* SCO interval rejected */
Nick Pelly1038a002010-02-03 11:42:26 -08003797 case 0x1a: /* Unsupported Remote Feature */
Marcel Holtmann732547f2009-04-19 19:14:14 +02003798 case 0x1f: /* Unspecified error */
Andrew Earl27539bc2014-03-10 10:31:04 +00003799 case 0x20: /* Unsupported LMP Parameter value */
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02003800 if (conn->out) {
Marcel Holtmann732547f2009-04-19 19:14:14 +02003801 conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) |
3802 (hdev->esco_type & EDR_ESCO_MASK);
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02003803 if (hci_setup_sync(conn, conn->link->handle))
3804 goto unlock;
Marcel Holtmann732547f2009-04-19 19:14:14 +02003805 }
3806 /* fall through */
3807
3808 default:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003809 conn->state = BT_CLOSED;
Marcel Holtmann732547f2009-04-19 19:14:14 +02003810 break;
3811 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003812
Johan Hedberg539c4962015-02-18 14:53:57 +02003813 hci_connect_cfm(conn, ev->status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003814 if (ev->status)
3815 hci_conn_del(conn);
3816
3817unlock:
3818 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003819}
3820
Marcel Holtmannefdcf8e2013-10-15 10:31:12 -07003821static inline size_t eir_get_length(u8 *eir, size_t eir_len)
3822{
3823 size_t parsed = 0;
3824
3825 while (parsed < eir_len) {
3826 u8 field_len = eir[0];
3827
3828 if (field_len == 0)
3829 return parsed;
3830
3831 parsed += field_len + 1;
3832 eir += field_len + 1;
3833 }
3834
3835 return eir_len;
3836}
3837
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003838static void hci_extended_inquiry_result_evt(struct hci_dev *hdev,
3839 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003840{
3841 struct inquiry_data data;
3842 struct extended_inquiry_info *info = (void *) (skb->data + 1);
3843 int num_rsp = *((__u8 *) skb->data);
Vishal Agarwal9d939d92012-04-26 19:19:56 +05303844 size_t eir_len;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003845
3846 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
3847
3848 if (!num_rsp)
3849 return;
3850
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003851 if (hci_dev_test_flag(hdev, HCI_PERIODIC_INQ))
Andre Guedes1519cc12012-03-21 00:03:38 -03003852 return;
3853
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003854 hci_dev_lock(hdev);
3855
Johan Hedberge17acd42011-03-30 23:57:16 +03003856 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003857 u32 flags;
3858 bool name_known;
Johan Hedberg561aafb2012-01-04 13:31:59 +02003859
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003860 bacpy(&data.bdaddr, &info->bdaddr);
Szymon Janc138d22e2011-02-17 16:44:23 +01003861 data.pscan_rep_mode = info->pscan_rep_mode;
3862 data.pscan_period_mode = info->pscan_period_mode;
3863 data.pscan_mode = 0x00;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003864 memcpy(data.dev_class, info->dev_class, 3);
Szymon Janc138d22e2011-02-17 16:44:23 +01003865 data.clock_offset = info->clock_offset;
3866 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003867 data.ssp_mode = 0x01;
Johan Hedberg561aafb2012-01-04 13:31:59 +02003868
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003869 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg0d3b7f62016-01-05 13:19:31 +02003870 name_known = eir_get_data(info->data,
3871 sizeof(info->data),
3872 EIR_NAME_COMPLETE, NULL);
Johan Hedberg561aafb2012-01-04 13:31:59 +02003873 else
3874 name_known = true;
3875
Marcel Holtmannaf589252014-07-01 14:11:20 +02003876 flags = hci_inquiry_cache_update(hdev, &data, name_known);
3877
Vishal Agarwal9d939d92012-04-26 19:19:56 +05303878 eir_len = eir_get_length(info->data, sizeof(info->data));
Marcel Holtmannaf589252014-07-01 14:11:20 +02003879
Johan Hedberg48264f02011-11-09 13:58:58 +02003880 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003881 info->dev_class, info->rssi,
3882 flags, info->data, eir_len, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003883 }
3884
3885 hci_dev_unlock(hdev);
3886}
3887
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003888static void hci_key_refresh_complete_evt(struct hci_dev *hdev,
3889 struct sk_buff *skb)
3890{
3891 struct hci_ev_key_refresh_complete *ev = (void *) skb->data;
3892 struct hci_conn *conn;
3893
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003894 BT_DBG("%s status 0x%2.2x handle 0x%4.4x", hdev->name, ev->status,
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003895 __le16_to_cpu(ev->handle));
3896
3897 hci_dev_lock(hdev);
3898
3899 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3900 if (!conn)
3901 goto unlock;
3902
Johan Hedberg9eb1fbf2014-04-11 12:02:31 -07003903 /* For BR/EDR the necessary steps are taken through the
3904 * auth_complete event.
3905 */
3906 if (conn->type != LE_LINK)
3907 goto unlock;
3908
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003909 if (!ev->status)
3910 conn->sec_level = conn->pending_sec_level;
3911
3912 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
3913
3914 if (ev->status && conn->state == BT_CONNECTED) {
Andre Guedesbed71742013-01-30 11:50:56 -03003915 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
David Herrmann76a68ba2013-04-06 20:28:37 +02003916 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003917 goto unlock;
3918 }
3919
3920 if (conn->state == BT_CONFIG) {
3921 if (!ev->status)
3922 conn->state = BT_CONNECTED;
3923
Johan Hedberg539c4962015-02-18 14:53:57 +02003924 hci_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02003925 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003926 } else {
3927 hci_auth_cfm(conn, ev->status);
3928
3929 hci_conn_hold(conn);
3930 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003931 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003932 }
3933
3934unlock:
3935 hci_dev_unlock(hdev);
3936}
3937
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003938static u8 hci_get_auth_req(struct hci_conn *conn)
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003939{
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003940 /* If remote requests no-bonding follow that lead */
Mikel Astizacabae92013-06-28 10:56:28 +02003941 if (conn->remote_auth == HCI_AT_NO_BONDING ||
3942 conn->remote_auth == HCI_AT_NO_BONDING_MITM)
Waldemar Rymarkiewicz58797bf2011-04-28 12:07:58 +02003943 return conn->remote_auth | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003944
Mikel Astizb7f94c82014-04-08 14:21:31 +02003945 /* If both remote and local have enough IO capabilities, require
3946 * MITM protection
3947 */
3948 if (conn->remote_cap != HCI_IO_NO_INPUT_OUTPUT &&
3949 conn->io_capability != HCI_IO_NO_INPUT_OUTPUT)
3950 return conn->remote_auth | 0x01;
3951
Timo Mueller7e741702014-04-08 14:21:33 +02003952 /* No MITM protection possible so ignore remote requirement */
3953 return (conn->remote_auth & ~0x01) | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003954}
3955
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08003956static u8 bredr_oob_data_present(struct hci_conn *conn)
3957{
3958 struct hci_dev *hdev = conn->hdev;
3959 struct oob_data *data;
3960
3961 data = hci_find_remote_oob_data(hdev, &conn->dst, BDADDR_BREDR);
3962 if (!data)
3963 return 0x00;
3964
Marcel Holtmann455c2ff2015-03-15 16:42:53 -07003965 if (bredr_sc_enabled(hdev)) {
3966 /* When Secure Connections is enabled, then just
3967 * return the present value stored with the OOB
3968 * data. The stored value contains the right present
3969 * information. However it can only be trusted when
3970 * not in Secure Connection Only mode.
Marcel Holtmann659c7fb2015-01-30 23:20:56 -08003971 */
Marcel Holtmann455c2ff2015-03-15 16:42:53 -07003972 if (!hci_dev_test_flag(hdev, HCI_SC_ONLY))
3973 return data->present;
3974
3975 /* When Secure Connections Only mode is enabled, then
3976 * the P-256 values are required. If they are not
3977 * available, then do not declare that OOB data is
3978 * present.
3979 */
3980 if (!memcmp(data->rand256, ZERO_KEY, 16) ||
3981 !memcmp(data->hash256, ZERO_KEY, 16))
Marcel Holtmann659c7fb2015-01-30 23:20:56 -08003982 return 0x00;
3983
Marcel Holtmann455c2ff2015-03-15 16:42:53 -07003984 return 0x02;
Marcel Holtmann659c7fb2015-01-30 23:20:56 -08003985 }
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08003986
Marcel Holtmann455c2ff2015-03-15 16:42:53 -07003987 /* When Secure Connections is not enabled or actually
3988 * not supported by the hardware, then check that if
3989 * P-192 data values are present.
3990 */
3991 if (!memcmp(data->rand192, ZERO_KEY, 16) ||
3992 !memcmp(data->hash192, ZERO_KEY, 16))
3993 return 0x00;
3994
3995 return 0x01;
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08003996}
3997
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003998static void hci_io_capa_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02003999{
4000 struct hci_ev_io_capa_request *ev = (void *) skb->data;
4001 struct hci_conn *conn;
4002
4003 BT_DBG("%s", hdev->name);
4004
4005 hci_dev_lock(hdev);
4006
4007 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg03b555e2011-01-04 15:40:05 +02004008 if (!conn)
4009 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02004010
Johan Hedberg03b555e2011-01-04 15:40:05 +02004011 hci_conn_hold(conn);
4012
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004013 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg03b555e2011-01-04 15:40:05 +02004014 goto unlock;
4015
Johan Hedberg2f407f02014-07-17 15:35:40 +03004016 /* Allow pairing if we're pairable, the initiators of the
4017 * pairing or if the remote is not requesting bonding.
4018 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004019 if (hci_dev_test_flag(hdev, HCI_BONDABLE) ||
Johan Hedberg2f407f02014-07-17 15:35:40 +03004020 test_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags) ||
Gustavo Padovan807deac2012-05-17 00:36:24 -03004021 (conn->remote_auth & ~0x01) == HCI_AT_NO_BONDING) {
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004022 struct hci_cp_io_capability_reply cp;
4023
4024 bacpy(&cp.bdaddr, &ev->bdaddr);
Hemant Gupta7a7f1e72012-01-16 13:34:29 +05304025 /* Change the IO capability from KeyboardDisplay
4026 * to DisplayYesNo as it is not supported by BT spec. */
4027 cp.capability = (conn->io_capability == 0x04) ?
Mikel Astiza7676312013-06-28 10:56:29 +02004028 HCI_IO_DISPLAY_YESNO : conn->io_capability;
Mikel Astizb7f94c82014-04-08 14:21:31 +02004029
4030 /* If we are initiators, there is no remote information yet */
4031 if (conn->remote_auth == 0xff) {
Mikel Astizb16c6602014-04-08 14:21:34 +02004032 /* Request MITM protection if our IO caps allow it
Johan Hedberg4ad51a72014-06-09 14:41:25 +03004033 * except for the no-bonding case.
Mikel Astizb16c6602014-04-08 14:21:34 +02004034 */
Mikel Astiz6fd6b912014-04-08 14:21:32 +02004035 if (conn->io_capability != HCI_IO_NO_INPUT_OUTPUT &&
Johan Hedberg9f743d72014-07-17 11:56:33 +03004036 conn->auth_type != HCI_AT_NO_BONDING)
Johan Hedberg6c538232014-07-11 15:32:23 +03004037 conn->auth_type |= 0x01;
Mikel Astizb7f94c82014-04-08 14:21:31 +02004038 } else {
4039 conn->auth_type = hci_get_auth_req(conn);
Mikel Astizb7f94c82014-04-08 14:21:31 +02004040 }
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004041
Johan Hedberg82c295b2014-07-30 09:22:24 +03004042 /* If we're not bondable, force one of the non-bondable
4043 * authentication requirement values.
4044 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004045 if (!hci_dev_test_flag(hdev, HCI_BONDABLE))
Johan Hedberg82c295b2014-07-30 09:22:24 +03004046 conn->auth_type &= HCI_AT_NO_BONDING_MITM;
4047
4048 cp.authentication = conn->auth_type;
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08004049 cp.oob_data = bredr_oob_data_present(conn);
Szymon Jancce85ee12011-03-22 13:12:23 +01004050
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004051 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03004052 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02004053 } else {
4054 struct hci_cp_io_capability_neg_reply cp;
4055
4056 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02004057 cp.reason = HCI_ERROR_PAIRING_NOT_ALLOWED;
Johan Hedberg03b555e2011-01-04 15:40:05 +02004058
4059 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03004060 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02004061 }
4062
4063unlock:
4064 hci_dev_unlock(hdev);
4065}
4066
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004067static void hci_io_capa_reply_evt(struct hci_dev *hdev, struct sk_buff *skb)
Johan Hedberg03b555e2011-01-04 15:40:05 +02004068{
4069 struct hci_ev_io_capa_reply *ev = (void *) skb->data;
4070 struct hci_conn *conn;
4071
4072 BT_DBG("%s", hdev->name);
4073
4074 hci_dev_lock(hdev);
4075
4076 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4077 if (!conn)
4078 goto unlock;
4079
Johan Hedberg03b555e2011-01-04 15:40:05 +02004080 conn->remote_cap = ev->capability;
Johan Hedberg03b555e2011-01-04 15:40:05 +02004081 conn->remote_auth = ev->authentication;
4082
4083unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02004084 hci_dev_unlock(hdev);
4085}
4086
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004087static void hci_user_confirm_request_evt(struct hci_dev *hdev,
4088 struct sk_buff *skb)
Johan Hedberga5c29682011-02-19 12:05:57 -03004089{
4090 struct hci_ev_user_confirm_req *ev = (void *) skb->data;
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004091 int loc_mitm, rem_mitm, confirm_hint = 0;
Johan Hedberg7a828902011-04-28 11:28:53 -07004092 struct hci_conn *conn;
Johan Hedberga5c29682011-02-19 12:05:57 -03004093
4094 BT_DBG("%s", hdev->name);
4095
4096 hci_dev_lock(hdev);
4097
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004098 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg7a828902011-04-28 11:28:53 -07004099 goto unlock;
Johan Hedberga5c29682011-02-19 12:05:57 -03004100
Johan Hedberg7a828902011-04-28 11:28:53 -07004101 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4102 if (!conn)
4103 goto unlock;
4104
4105 loc_mitm = (conn->auth_type & 0x01);
4106 rem_mitm = (conn->remote_auth & 0x01);
4107
4108 /* If we require MITM but the remote device can't provide that
Johan Hedberg6c538232014-07-11 15:32:23 +03004109 * (it has NoInputNoOutput) then reject the confirmation
4110 * request. We check the security level here since it doesn't
4111 * necessarily match conn->auth_type.
Mikel Astiz6fd6b912014-04-08 14:21:32 +02004112 */
Johan Hedberg6c538232014-07-11 15:32:23 +03004113 if (conn->pending_sec_level > BT_SECURITY_MEDIUM &&
4114 conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) {
Johan Hedberg7a828902011-04-28 11:28:53 -07004115 BT_DBG("Rejecting request: remote device can't provide MITM");
4116 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03004117 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07004118 goto unlock;
4119 }
4120
4121 /* If no side requires MITM protection; auto-accept */
Mikel Astiza7676312013-06-28 10:56:29 +02004122 if ((!loc_mitm || conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) &&
4123 (!rem_mitm || conn->io_capability == HCI_IO_NO_INPUT_OUTPUT)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004124
4125 /* If we're not the initiators request authorization to
4126 * proceed from user space (mgmt_user_confirm with
Johan Hedbergba15a582014-06-09 13:58:14 +03004127 * confirm_hint set to 1). The exception is if neither
Johan Hedberg02f3e252014-07-16 15:09:13 +03004128 * side had MITM or if the local IO capability is
4129 * NoInputNoOutput, in which case we do auto-accept
Johan Hedbergba15a582014-06-09 13:58:14 +03004130 */
4131 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) &&
Johan Hedberg02f3e252014-07-16 15:09:13 +03004132 conn->io_capability != HCI_IO_NO_INPUT_OUTPUT &&
Johan Hedbergba15a582014-06-09 13:58:14 +03004133 (loc_mitm || rem_mitm)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004134 BT_DBG("Confirming auto-accept as acceptor");
4135 confirm_hint = 1;
4136 goto confirm;
4137 }
4138
Johan Hedberg9f616562011-04-28 11:28:54 -07004139 BT_DBG("Auto-accept of user confirmation with %ums delay",
Gustavo Padovan807deac2012-05-17 00:36:24 -03004140 hdev->auto_accept_delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07004141
4142 if (hdev->auto_accept_delay > 0) {
4143 int delay = msecs_to_jiffies(hdev->auto_accept_delay);
Johan Hedberg7bc18d92013-10-16 18:11:39 +03004144 queue_delayed_work(conn->hdev->workqueue,
4145 &conn->auto_accept_work, delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07004146 goto unlock;
4147 }
4148
Johan Hedberg7a828902011-04-28 11:28:53 -07004149 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03004150 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07004151 goto unlock;
4152 }
4153
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004154confirm:
Johan Hedberg39adbff2014-03-20 08:18:14 +02004155 mgmt_user_confirm_request(hdev, &ev->bdaddr, ACL_LINK, 0,
4156 le32_to_cpu(ev->passkey), confirm_hint);
Johan Hedberg7a828902011-04-28 11:28:53 -07004157
4158unlock:
Johan Hedberga5c29682011-02-19 12:05:57 -03004159 hci_dev_unlock(hdev);
4160}
4161
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004162static void hci_user_passkey_request_evt(struct hci_dev *hdev,
4163 struct sk_buff *skb)
Brian Gix1143d452011-11-23 08:28:34 -08004164{
4165 struct hci_ev_user_passkey_req *ev = (void *) skb->data;
4166
4167 BT_DBG("%s", hdev->name);
4168
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004169 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg272d90d2012-02-09 15:26:12 +02004170 mgmt_user_passkey_request(hdev, &ev->bdaddr, ACL_LINK, 0);
Brian Gix1143d452011-11-23 08:28:34 -08004171}
4172
Johan Hedberg92a25252012-09-06 18:39:26 +03004173static void hci_user_passkey_notify_evt(struct hci_dev *hdev,
4174 struct sk_buff *skb)
4175{
4176 struct hci_ev_user_passkey_notify *ev = (void *) skb->data;
4177 struct hci_conn *conn;
4178
4179 BT_DBG("%s", hdev->name);
4180
4181 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4182 if (!conn)
4183 return;
4184
4185 conn->passkey_notify = __le32_to_cpu(ev->passkey);
4186 conn->passkey_entered = 0;
4187
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004188 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg92a25252012-09-06 18:39:26 +03004189 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
4190 conn->dst_type, conn->passkey_notify,
4191 conn->passkey_entered);
4192}
4193
4194static void hci_keypress_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
4195{
4196 struct hci_ev_keypress_notify *ev = (void *) skb->data;
4197 struct hci_conn *conn;
4198
4199 BT_DBG("%s", hdev->name);
4200
4201 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4202 if (!conn)
4203 return;
4204
4205 switch (ev->type) {
4206 case HCI_KEYPRESS_STARTED:
4207 conn->passkey_entered = 0;
4208 return;
4209
4210 case HCI_KEYPRESS_ENTERED:
4211 conn->passkey_entered++;
4212 break;
4213
4214 case HCI_KEYPRESS_ERASED:
4215 conn->passkey_entered--;
4216 break;
4217
4218 case HCI_KEYPRESS_CLEARED:
4219 conn->passkey_entered = 0;
4220 break;
4221
4222 case HCI_KEYPRESS_COMPLETED:
4223 return;
4224 }
4225
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004226 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg92a25252012-09-06 18:39:26 +03004227 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
4228 conn->dst_type, conn->passkey_notify,
4229 conn->passkey_entered);
4230}
4231
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004232static void hci_simple_pair_complete_evt(struct hci_dev *hdev,
4233 struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02004234{
4235 struct hci_ev_simple_pair_complete *ev = (void *) skb->data;
4236 struct hci_conn *conn;
4237
4238 BT_DBG("%s", hdev->name);
4239
4240 hci_dev_lock(hdev);
4241
4242 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg2a611692011-02-19 12:06:00 -03004243 if (!conn)
4244 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02004245
Johan Hedbergc1d4fa72014-07-17 15:14:50 +03004246 /* Reset the authentication requirement to unknown */
4247 conn->remote_auth = 0xff;
4248
Johan Hedberg2a611692011-02-19 12:06:00 -03004249 /* To avoid duplicate auth_failed events to user space we check
4250 * the HCI_CONN_AUTH_PEND flag which will be set if we
4251 * initiated the authentication. A traditional auth_complete
4252 * event gets always produced as initiator and is also mapped to
4253 * the mgmt_auth_failed event */
Mikel Astizfa1bd912012-08-09 09:52:29 +02004254 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) && ev->status)
Johan Hedberge1e930f2014-09-08 17:09:49 -07004255 mgmt_auth_failed(conn, ev->status);
Johan Hedberg2a611692011-02-19 12:06:00 -03004256
David Herrmann76a68ba2013-04-06 20:28:37 +02004257 hci_conn_drop(conn);
Johan Hedberg2a611692011-02-19 12:06:00 -03004258
4259unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02004260 hci_dev_unlock(hdev);
4261}
4262
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004263static void hci_remote_host_features_evt(struct hci_dev *hdev,
4264 struct sk_buff *skb)
Marcel Holtmann41a96212008-07-14 20:13:48 +02004265{
4266 struct hci_ev_remote_host_features *ev = (void *) skb->data;
4267 struct inquiry_entry *ie;
Johan Hedbergcad718e2013-04-17 15:00:51 +03004268 struct hci_conn *conn;
Marcel Holtmann41a96212008-07-14 20:13:48 +02004269
4270 BT_DBG("%s", hdev->name);
4271
4272 hci_dev_lock(hdev);
4273
Johan Hedbergcad718e2013-04-17 15:00:51 +03004274 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4275 if (conn)
4276 memcpy(conn->features[1], ev->features, 8);
4277
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02004278 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
4279 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02004280 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann41a96212008-07-14 20:13:48 +02004281
4282 hci_dev_unlock(hdev);
4283}
4284
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004285static void hci_remote_oob_data_request_evt(struct hci_dev *hdev,
4286 struct sk_buff *skb)
Szymon Janc2763eda2011-03-22 13:12:22 +01004287{
4288 struct hci_ev_remote_oob_data_request *ev = (void *) skb->data;
4289 struct oob_data *data;
4290
4291 BT_DBG("%s", hdev->name);
4292
4293 hci_dev_lock(hdev);
4294
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004295 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Szymon Jance1ba1f12011-04-06 13:01:59 +02004296 goto unlock;
4297
Johan Hedberg6928a922014-10-26 20:46:09 +01004298 data = hci_find_remote_oob_data(hdev, &ev->bdaddr, BDADDR_BREDR);
Marcel Holtmann6665d052015-01-27 16:04:31 -08004299 if (!data) {
Szymon Janc2763eda2011-03-22 13:12:22 +01004300 struct hci_cp_remote_oob_data_neg_reply cp;
4301
4302 bacpy(&cp.bdaddr, &ev->bdaddr);
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08004303 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_NEG_REPLY,
4304 sizeof(cp), &cp);
Marcel Holtmann6665d052015-01-27 16:04:31 -08004305 goto unlock;
4306 }
4307
4308 if (bredr_sc_enabled(hdev)) {
4309 struct hci_cp_remote_oob_ext_data_reply cp;
4310
4311 bacpy(&cp.bdaddr, &ev->bdaddr);
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004312 if (hci_dev_test_flag(hdev, HCI_SC_ONLY)) {
Marcel Holtmann6665d052015-01-27 16:04:31 -08004313 memset(cp.hash192, 0, sizeof(cp.hash192));
4314 memset(cp.rand192, 0, sizeof(cp.rand192));
4315 } else {
4316 memcpy(cp.hash192, data->hash192, sizeof(cp.hash192));
4317 memcpy(cp.rand192, data->rand192, sizeof(cp.rand192));
4318 }
4319 memcpy(cp.hash256, data->hash256, sizeof(cp.hash256));
4320 memcpy(cp.rand256, data->rand256, sizeof(cp.rand256));
4321
4322 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_EXT_DATA_REPLY,
4323 sizeof(cp), &cp);
4324 } else {
4325 struct hci_cp_remote_oob_data_reply cp;
4326
4327 bacpy(&cp.bdaddr, &ev->bdaddr);
4328 memcpy(cp.hash, data->hash192, sizeof(cp.hash));
4329 memcpy(cp.rand, data->rand192, sizeof(cp.rand));
4330
4331 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_REPLY,
4332 sizeof(cp), &cp);
Szymon Janc2763eda2011-03-22 13:12:22 +01004333 }
4334
Szymon Jance1ba1f12011-04-06 13:01:59 +02004335unlock:
Szymon Janc2763eda2011-03-22 13:12:22 +01004336 hci_dev_unlock(hdev);
4337}
4338
Arron Wanga77a6a12015-07-24 17:13:15 +08004339#if IS_ENABLED(CONFIG_BT_HS)
4340static void hci_chan_selected_evt(struct hci_dev *hdev, struct sk_buff *skb)
4341{
4342 struct hci_ev_channel_selected *ev = (void *)skb->data;
4343 struct hci_conn *hcon;
4344
4345 BT_DBG("%s handle 0x%2.2x", hdev->name, ev->phy_handle);
4346
4347 skb_pull(skb, sizeof(*ev));
4348
4349 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4350 if (!hcon)
4351 return;
4352
4353 amp_read_loc_assoc_final_data(hdev, hcon);
4354}
4355
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004356static void hci_phy_link_complete_evt(struct hci_dev *hdev,
4357 struct sk_buff *skb)
4358{
4359 struct hci_ev_phy_link_complete *ev = (void *) skb->data;
4360 struct hci_conn *hcon, *bredr_hcon;
4361
4362 BT_DBG("%s handle 0x%2.2x status 0x%2.2x", hdev->name, ev->phy_handle,
4363 ev->status);
4364
4365 hci_dev_lock(hdev);
4366
4367 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4368 if (!hcon) {
4369 hci_dev_unlock(hdev);
4370 return;
4371 }
4372
4373 if (ev->status) {
4374 hci_conn_del(hcon);
4375 hci_dev_unlock(hdev);
4376 return;
4377 }
4378
4379 bredr_hcon = hcon->amp_mgr->l2cap_conn->hcon;
4380
4381 hcon->state = BT_CONNECTED;
4382 bacpy(&hcon->dst, &bredr_hcon->dst);
4383
4384 hci_conn_hold(hcon);
4385 hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02004386 hci_conn_drop(hcon);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004387
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01004388 hci_debugfs_create_conn(hcon);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004389 hci_conn_add_sysfs(hcon);
4390
Andrei Emeltchenkocf70ff22012-10-31 15:46:36 +02004391 amp_physical_cfm(bredr_hcon, hcon);
4392
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004393 hci_dev_unlock(hdev);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004394}
4395
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004396static void hci_loglink_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
4397{
4398 struct hci_ev_logical_link_complete *ev = (void *) skb->data;
4399 struct hci_conn *hcon;
4400 struct hci_chan *hchan;
4401 struct amp_mgr *mgr;
4402
4403 BT_DBG("%s log_handle 0x%4.4x phy_handle 0x%2.2x status 0x%2.2x",
4404 hdev->name, le16_to_cpu(ev->handle), ev->phy_handle,
4405 ev->status);
4406
4407 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4408 if (!hcon)
4409 return;
4410
4411 /* Create AMP hchan */
4412 hchan = hci_chan_create(hcon);
4413 if (!hchan)
4414 return;
4415
4416 hchan->handle = le16_to_cpu(ev->handle);
4417
4418 BT_DBG("hcon %p mgr %p hchan %p", hcon, hcon->amp_mgr, hchan);
4419
4420 mgr = hcon->amp_mgr;
4421 if (mgr && mgr->bredr_chan) {
4422 struct l2cap_chan *bredr_chan = mgr->bredr_chan;
4423
4424 l2cap_chan_lock(bredr_chan);
4425
4426 bredr_chan->conn->mtu = hdev->block_mtu;
4427 l2cap_logical_cfm(bredr_chan, hchan, 0);
4428 hci_conn_hold(hcon);
4429
4430 l2cap_chan_unlock(bredr_chan);
4431 }
4432}
4433
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02004434static void hci_disconn_loglink_complete_evt(struct hci_dev *hdev,
4435 struct sk_buff *skb)
4436{
4437 struct hci_ev_disconn_logical_link_complete *ev = (void *) skb->data;
4438 struct hci_chan *hchan;
4439
4440 BT_DBG("%s log handle 0x%4.4x status 0x%2.2x", hdev->name,
4441 le16_to_cpu(ev->handle), ev->status);
4442
4443 if (ev->status)
4444 return;
4445
4446 hci_dev_lock(hdev);
4447
4448 hchan = hci_chan_lookup_handle(hdev, le16_to_cpu(ev->handle));
4449 if (!hchan)
4450 goto unlock;
4451
4452 amp_destroy_logical_link(hchan, ev->reason);
4453
4454unlock:
4455 hci_dev_unlock(hdev);
4456}
4457
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02004458static void hci_disconn_phylink_complete_evt(struct hci_dev *hdev,
4459 struct sk_buff *skb)
4460{
4461 struct hci_ev_disconn_phy_link_complete *ev = (void *) skb->data;
4462 struct hci_conn *hcon;
4463
4464 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4465
4466 if (ev->status)
4467 return;
4468
4469 hci_dev_lock(hdev);
4470
4471 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4472 if (hcon) {
4473 hcon->state = BT_CLOSED;
4474 hci_conn_del(hcon);
4475 }
4476
4477 hci_dev_unlock(hdev);
4478}
Arron Wanga77a6a12015-07-24 17:13:15 +08004479#endif
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02004480
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004481static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03004482{
4483 struct hci_ev_le_conn_complete *ev = (void *) skb->data;
Johan Hedberg912b42e2014-07-03 19:33:49 +03004484 struct hci_conn_params *params;
Ville Tervofcd89c02011-02-10 22:38:47 -03004485 struct hci_conn *conn;
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004486 struct smp_irk *irk;
Johan Hedberg837d5022014-07-02 09:36:22 +03004487 u8 addr_type;
Ville Tervofcd89c02011-02-10 22:38:47 -03004488
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004489 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Ville Tervofcd89c02011-02-10 22:38:47 -03004490
4491 hci_dev_lock(hdev);
4492
Johan Hedbergfbd96c12014-07-08 17:21:51 +03004493 /* All controllers implicitly stop advertising in the event of a
4494 * connection, so ensure that the state bit is cleared.
4495 */
Marcel Holtmanna358dc12015-03-13 02:11:02 -07004496 hci_dev_clear_flag(hdev, HCI_LE_ADV);
Johan Hedbergfbd96c12014-07-08 17:21:51 +03004497
Jakub Pawlowskie7d9ab72015-08-07 20:22:52 +02004498 conn = hci_lookup_le_connect(hdev);
Ville Tervob62f3282011-02-10 22:38:50 -03004499 if (!conn) {
Johan Hedberga5c4e302014-07-16 11:56:07 +03004500 conn = hci_conn_add(hdev, LE_LINK, &ev->bdaddr, ev->role);
Ville Tervob62f3282011-02-10 22:38:50 -03004501 if (!conn) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01004502 bt_dev_err(hdev, "no memory for new connection");
Andre Guedes230fd162012-07-27 15:10:10 -03004503 goto unlock;
Ville Tervob62f3282011-02-10 22:38:50 -03004504 }
Andre Guedes29b79882011-05-31 14:20:54 -03004505
4506 conn->dst_type = ev->bdaddr_type;
Andre Guedesb9b343d2012-07-27 15:10:11 -03004507
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004508 /* If we didn't have a hci_conn object previously
4509 * but we're in master role this must be something
4510 * initiated using a white list. Since white list based
4511 * connections are not "first class citizens" we don't
4512 * have full tracking of them. Therefore, we go ahead
4513 * with a "best effort" approach of determining the
4514 * initiator address based on the HCI_PRIVACY flag.
4515 */
4516 if (conn->out) {
4517 conn->resp_addr_type = ev->bdaddr_type;
4518 bacpy(&conn->resp_addr, &ev->bdaddr);
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004519 if (hci_dev_test_flag(hdev, HCI_PRIVACY)) {
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004520 conn->init_addr_type = ADDR_LE_DEV_RANDOM;
4521 bacpy(&conn->init_addr, &hdev->rpa);
4522 } else {
4523 hci_copy_identity_address(hdev,
4524 &conn->init_addr,
4525 &conn->init_addr_type);
4526 }
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004527 }
Johan Hedberg9489eca2014-02-28 17:45:46 +02004528 } else {
4529 cancel_delayed_work(&conn->le_conn_timeout);
Ville Tervob62f3282011-02-10 22:38:50 -03004530 }
Ville Tervofcd89c02011-02-10 22:38:47 -03004531
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004532 if (!conn->out) {
4533 /* Set the responder (our side) address type based on
4534 * the advertising address type.
4535 */
4536 conn->resp_addr_type = hdev->adv_addr_type;
4537 if (hdev->adv_addr_type == ADDR_LE_DEV_RANDOM)
4538 bacpy(&conn->resp_addr, &hdev->random_addr);
4539 else
4540 bacpy(&conn->resp_addr, &hdev->bdaddr);
4541
4542 conn->init_addr_type = ev->bdaddr_type;
4543 bacpy(&conn->init_addr, &ev->bdaddr);
Marcel Holtmanna720d732014-06-23 12:14:51 +02004544
4545 /* For incoming connections, set the default minimum
4546 * and maximum connection interval. They will be used
4547 * to check if the parameters are in range and if not
4548 * trigger the connection update procedure.
4549 */
4550 conn->le_conn_min_interval = hdev->le_conn_min_interval;
4551 conn->le_conn_max_interval = hdev->le_conn_max_interval;
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004552 }
Johan Hedberg7be2edb2014-02-23 19:42:17 +02004553
Marcel Holtmannedb4b462014-02-18 15:13:43 -08004554 /* Lookup the identity address from the stored connection
4555 * address and address type.
4556 *
4557 * When establishing connections to an identity address, the
4558 * connection procedure will store the resolvable random
4559 * address first. Now if it can be converted back into the
4560 * identity address, start using the identity address from
4561 * now on.
4562 */
4563 irk = hci_get_irk(hdev, &conn->dst, conn->dst_type);
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004564 if (irk) {
4565 bacpy(&conn->dst, &irk->bdaddr);
4566 conn->dst_type = irk->addr_type;
4567 }
4568
Johan Hedberg2d3c2262014-07-15 11:51:28 +03004569 if (ev->status) {
4570 hci_le_conn_failed(conn, ev->status);
Johan Hedberg837d5022014-07-02 09:36:22 +03004571 goto unlock;
4572 }
4573
Johan Hedberg08853f12014-08-15 21:06:55 +03004574 if (conn->dst_type == ADDR_LE_DEV_PUBLIC)
4575 addr_type = BDADDR_LE_PUBLIC;
4576 else
4577 addr_type = BDADDR_LE_RANDOM;
4578
Johan Hedberg2d3c2262014-07-15 11:51:28 +03004579 /* Drop the connection if the device is blocked */
4580 if (hci_bdaddr_list_lookup(&hdev->blacklist, &conn->dst, addr_type)) {
4581 hci_conn_drop(conn);
Andre Guedescd17dec2012-07-27 15:10:16 -03004582 goto unlock;
4583 }
4584
Johan Hedbergb644ba32012-01-17 21:48:47 +02004585 if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00004586 mgmt_device_connected(hdev, conn, 0, NULL, 0);
Vinicius Costa Gomes83bc71b2011-05-06 18:41:43 -03004587
Vinicius Costa Gomes7b5c0d52011-06-09 18:50:50 -03004588 conn->sec_level = BT_SECURITY_LOW;
Ville Tervofcd89c02011-02-10 22:38:47 -03004589 conn->handle = __le16_to_cpu(ev->handle);
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07004590 conn->state = BT_CONFIG;
Ville Tervofcd89c02011-02-10 22:38:47 -03004591
Marcel Holtmanne04fde62014-06-23 11:40:04 +02004592 conn->le_conn_interval = le16_to_cpu(ev->interval);
4593 conn->le_conn_latency = le16_to_cpu(ev->latency);
4594 conn->le_supv_timeout = le16_to_cpu(ev->supervision_timeout);
4595
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01004596 hci_debugfs_create_conn(conn);
Ville Tervofcd89c02011-02-10 22:38:47 -03004597 hci_conn_add_sysfs(conn);
4598
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07004599 if (!ev->status) {
4600 /* The remote features procedure is defined for master
4601 * role only. So only in case of an initiated connection
4602 * request the remote features.
4603 *
4604 * If the local controller supports slave-initiated features
4605 * exchange, then requesting the remote features in slave
4606 * role is possible. Otherwise just transition into the
4607 * connected state without requesting the remote features.
4608 */
4609 if (conn->out ||
4610 (hdev->le_features[0] & HCI_LE_SLAVE_FEATURES)) {
4611 struct hci_cp_le_read_remote_features cp;
4612
4613 cp.handle = __cpu_to_le16(conn->handle);
4614
4615 hci_send_cmd(hdev, HCI_OP_LE_READ_REMOTE_FEATURES,
4616 sizeof(cp), &cp);
4617
4618 hci_conn_hold(conn);
4619 } else {
4620 conn->state = BT_CONNECTED;
4621 hci_connect_cfm(conn, ev->status);
4622 }
4623 } else {
4624 hci_connect_cfm(conn, ev->status);
4625 }
Ville Tervofcd89c02011-02-10 22:38:47 -03004626
Johan Hedberg54776102014-08-15 21:06:56 +03004627 params = hci_pend_le_action_lookup(&hdev->pend_le_conns, &conn->dst,
4628 conn->dst_type);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004629 if (params) {
Johan Hedberg95305ba2014-07-04 12:37:21 +03004630 list_del_init(&params->action);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004631 if (params->conn) {
4632 hci_conn_drop(params->conn);
Johan Hedbergf8aaf9b2014-08-17 23:28:57 +03004633 hci_conn_put(params->conn);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004634 params->conn = NULL;
4635 }
4636 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004637
Ville Tervofcd89c02011-02-10 22:38:47 -03004638unlock:
Johan Hedberg223683a2014-07-06 15:44:23 +03004639 hci_update_background_scan(hdev);
Ville Tervofcd89c02011-02-10 22:38:47 -03004640 hci_dev_unlock(hdev);
4641}
4642
Marcel Holtmann1855d922014-06-23 11:40:05 +02004643static void hci_le_conn_update_complete_evt(struct hci_dev *hdev,
4644 struct sk_buff *skb)
4645{
4646 struct hci_ev_le_conn_update_complete *ev = (void *) skb->data;
4647 struct hci_conn *conn;
4648
4649 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4650
4651 if (ev->status)
4652 return;
4653
4654 hci_dev_lock(hdev);
4655
4656 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
4657 if (conn) {
4658 conn->le_conn_interval = le16_to_cpu(ev->interval);
4659 conn->le_conn_latency = le16_to_cpu(ev->latency);
4660 conn->le_supv_timeout = le16_to_cpu(ev->supervision_timeout);
4661 }
4662
4663 hci_dev_unlock(hdev);
4664}
4665
Andre Guedesa4790db2014-02-26 20:21:47 -03004666/* This function requires the caller holds hdev->lock */
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004667static struct hci_conn *check_pending_le_conn(struct hci_dev *hdev,
4668 bdaddr_t *addr,
Szymon Janc082f2302018-04-03 13:40:06 +02004669 u8 addr_type, u8 adv_type,
4670 bdaddr_t *direct_rpa)
Andre Guedesa4790db2014-02-26 20:21:47 -03004671{
4672 struct hci_conn *conn;
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004673 struct hci_conn_params *params;
Andre Guedesa4790db2014-02-26 20:21:47 -03004674
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004675 /* If the event is not connectable don't proceed further */
4676 if (adv_type != LE_ADV_IND && adv_type != LE_ADV_DIRECT_IND)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004677 return NULL;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004678
4679 /* Ignore if the device is blocked */
Johan Hedbergdcc36c12014-07-09 12:59:13 +03004680 if (hci_bdaddr_list_lookup(&hdev->blacklist, addr, addr_type))
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004681 return NULL;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004682
Johan Hedbergf99353c2014-07-16 11:56:09 +03004683 /* Most controller will fail if we try to create new connections
4684 * while we have an existing one in slave role.
4685 */
4686 if (hdev->conn_hash.le_num_slave > 0)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004687 return NULL;
Johan Hedbergf99353c2014-07-16 11:56:09 +03004688
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004689 /* If we're not connectable only connect devices that we have in
4690 * our pend_le_conns list.
4691 */
Johan Hedberg49c50922015-10-16 10:07:51 +03004692 params = hci_pend_le_action_lookup(&hdev->pend_le_conns, addr,
4693 addr_type);
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004694 if (!params)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004695 return NULL;
Andre Guedesa4790db2014-02-26 20:21:47 -03004696
Jakub Pawlowski28a667c2015-08-07 20:22:54 +02004697 if (!params->explicit_connect) {
4698 switch (params->auto_connect) {
4699 case HCI_AUTO_CONN_DIRECT:
4700 /* Only devices advertising with ADV_DIRECT_IND are
4701 * triggering a connection attempt. This is allowing
4702 * incoming connections from slave devices.
4703 */
4704 if (adv_type != LE_ADV_DIRECT_IND)
4705 return NULL;
4706 break;
4707 case HCI_AUTO_CONN_ALWAYS:
4708 /* Devices advertising with ADV_IND or ADV_DIRECT_IND
4709 * are triggering a connection attempt. This means
4710 * that incoming connectioms from slave device are
4711 * accepted and also outgoing connections to slave
4712 * devices are established when found.
4713 */
4714 break;
4715 default:
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004716 return NULL;
Jakub Pawlowski28a667c2015-08-07 20:22:54 +02004717 }
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004718 }
4719
Andre Guedesa4790db2014-02-26 20:21:47 -03004720 conn = hci_connect_le(hdev, addr, addr_type, BT_SECURITY_LOW,
Szymon Janc082f2302018-04-03 13:40:06 +02004721 HCI_LE_AUTOCONN_TIMEOUT, HCI_ROLE_MASTER,
4722 direct_rpa);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004723 if (!IS_ERR(conn)) {
Jakub Pawlowski28a667c2015-08-07 20:22:54 +02004724 /* If HCI_AUTO_CONN_EXPLICIT is set, conn is already owned
4725 * by higher layer that tried to connect, if no then
4726 * store the pointer since we don't really have any
Johan Hedbergf161dd42014-08-15 21:06:54 +03004727 * other owner of the object besides the params that
4728 * triggered it. This way we can abort the connection if
4729 * the parameters get removed and keep the reference
4730 * count consistent once the connection is established.
4731 */
Jakub Pawlowski28a667c2015-08-07 20:22:54 +02004732
4733 if (!params->explicit_connect)
4734 params->conn = hci_conn_get(conn);
4735
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004736 return conn;
Johan Hedbergf161dd42014-08-15 21:06:54 +03004737 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004738
4739 switch (PTR_ERR(conn)) {
4740 case -EBUSY:
4741 /* If hci_connect() returns -EBUSY it means there is already
4742 * an LE connection attempt going on. Since controllers don't
4743 * support more than one connection attempt at the time, we
4744 * don't consider this an error case.
4745 */
4746 break;
4747 default:
4748 BT_DBG("Failed to connect: err %ld", PTR_ERR(conn));
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004749 return NULL;
Andre Guedesa4790db2014-02-26 20:21:47 -03004750 }
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004751
4752 return NULL;
Andre Guedesa4790db2014-02-26 20:21:47 -03004753}
4754
Johan Hedberg4af605d2014-03-24 10:48:00 +02004755static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr,
Marcel Holtmann2f010b52014-12-05 16:20:13 +01004756 u8 bdaddr_type, bdaddr_t *direct_addr,
4757 u8 direct_addr_type, s8 rssi, u8 *data, u8 len)
Johan Hedberg4af605d2014-03-24 10:48:00 +02004758{
Johan Hedbergb9a63282014-03-25 10:51:52 +02004759 struct discovery_state *d = &hdev->discovery;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004760 struct smp_irk *irk;
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004761 struct hci_conn *conn;
Johan Hedberg474ee062014-03-25 14:34:59 +02004762 bool match;
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004763 u32 flags;
Szymon Janc68183752015-09-16 20:21:54 +02004764 u8 *ptr, real_len;
4765
Johan Hedberg56b40fb2016-04-07 21:01:27 +03004766 switch (type) {
4767 case LE_ADV_IND:
4768 case LE_ADV_DIRECT_IND:
4769 case LE_ADV_SCAN_IND:
4770 case LE_ADV_NONCONN_IND:
4771 case LE_ADV_SCAN_RSP:
4772 break;
4773 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01004774 bt_dev_err_ratelimited(hdev, "unknown advertising packet "
4775 "type: 0x%02x", type);
Johan Hedberg56b40fb2016-04-07 21:01:27 +03004776 return;
4777 }
4778
Szymon Janc68183752015-09-16 20:21:54 +02004779 /* Find the end of the data in case the report contains padded zero
4780 * bytes at the end causing an invalid length value.
4781 *
4782 * When data is NULL, len is 0 so there is no need for extra ptr
4783 * check as 'ptr < data + 0' is already false in such case.
4784 */
4785 for (ptr = data; ptr < data + len && *ptr; ptr += *ptr + 1) {
4786 if (ptr + 1 + *ptr > data + len)
4787 break;
4788 }
4789
4790 real_len = ptr - data;
4791
4792 /* Adjust for actual length */
4793 if (len != real_len) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01004794 bt_dev_err_ratelimited(hdev, "advertising data len corrected");
Szymon Janc68183752015-09-16 20:21:54 +02004795 len = real_len;
4796 }
Johan Hedbergb9a63282014-03-25 10:51:52 +02004797
Marcel Holtmann2f010b52014-12-05 16:20:13 +01004798 /* If the direct address is present, then this report is from
4799 * a LE Direct Advertising Report event. In that case it is
4800 * important to see if the address is matching the local
4801 * controller address.
4802 */
4803 if (direct_addr) {
4804 /* Only resolvable random addresses are valid for these
4805 * kind of reports and others can be ignored.
4806 */
4807 if (!hci_bdaddr_is_rpa(direct_addr, direct_addr_type))
4808 return;
4809
4810 /* If the controller is not using resolvable random
4811 * addresses, then this report can be ignored.
4812 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004813 if (!hci_dev_test_flag(hdev, HCI_PRIVACY))
Marcel Holtmann2f010b52014-12-05 16:20:13 +01004814 return;
4815
4816 /* If the local IRK of the controller does not match
4817 * with the resolvable random address provided, then
4818 * this report can be ignored.
4819 */
4820 if (!smp_irk_matches(hdev, hdev->irk, direct_addr))
4821 return;
4822 }
4823
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004824 /* Check if we need to convert to identity address */
4825 irk = hci_get_irk(hdev, bdaddr, bdaddr_type);
4826 if (irk) {
4827 bdaddr = &irk->bdaddr;
4828 bdaddr_type = irk->addr_type;
4829 }
4830
Szymon Janc082f2302018-04-03 13:40:06 +02004831 /* Check if we have been requested to connect to this device.
4832 *
4833 * direct_addr is set only for directed advertising reports (it is NULL
4834 * for advertising reports) and is already verified to be RPA above.
4835 */
4836 conn = check_pending_le_conn(hdev, bdaddr, bdaddr_type, type,
4837 direct_addr);
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004838 if (conn && type == LE_ADV_IND) {
4839 /* Store report for later inclusion by
4840 * mgmt_device_connected
4841 */
4842 memcpy(conn->le_adv_data, data, len);
4843 conn->le_adv_data_len = len;
4844 }
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004845
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004846 /* Passive scanning shouldn't trigger any device found events,
4847 * except for devices marked as CONN_REPORT for which we do send
4848 * device found events.
4849 */
Johan Hedbergca5c4be2014-03-25 10:30:46 +02004850 if (hdev->le_scan_type == LE_SCAN_PASSIVE) {
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004851 if (type == LE_ADV_DIRECT_IND)
4852 return;
4853
Johan Hedberg3a19b6f2014-07-15 08:07:59 +03004854 if (!hci_pend_le_action_lookup(&hdev->pend_le_reports,
4855 bdaddr, bdaddr_type))
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004856 return;
4857
4858 if (type == LE_ADV_NONCONN_IND || type == LE_ADV_SCAN_IND)
4859 flags = MGMT_DEV_FOUND_NOT_CONNECTABLE;
4860 else
4861 flags = 0;
4862 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
4863 rssi, flags, data, len, NULL, 0);
Johan Hedberg97bf2e92014-07-04 12:37:16 +03004864 return;
Johan Hedbergca5c4be2014-03-25 10:30:46 +02004865 }
Johan Hedberg4af605d2014-03-24 10:48:00 +02004866
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004867 /* When receiving non-connectable or scannable undirected
4868 * advertising reports, this means that the remote device is
4869 * not connectable and then clearly indicate this in the
4870 * device found event.
4871 *
4872 * When receiving a scan response, then there is no way to
4873 * know if the remote device is connectable or not. However
4874 * since scan responses are merged with a previously seen
4875 * advertising report, the flags field from that report
4876 * will be used.
4877 *
4878 * In the really unlikely case that a controller get confused
4879 * and just sends a scan response event, then it is marked as
4880 * not connectable as well.
4881 */
4882 if (type == LE_ADV_NONCONN_IND || type == LE_ADV_SCAN_IND ||
4883 type == LE_ADV_SCAN_RSP)
4884 flags = MGMT_DEV_FOUND_NOT_CONNECTABLE;
4885 else
4886 flags = 0;
4887
Johan Hedbergb9a63282014-03-25 10:51:52 +02004888 /* If there's nothing pending either store the data from this
4889 * event or send an immediate device found event if the data
4890 * should not be stored for later.
4891 */
4892 if (!has_pending_adv_report(hdev)) {
4893 /* If the report will trigger a SCAN_REQ store it for
4894 * later merging.
4895 */
4896 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
4897 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004898 rssi, flags, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004899 return;
4900 }
4901
4902 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004903 rssi, flags, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004904 return;
4905 }
4906
Johan Hedberg474ee062014-03-25 14:34:59 +02004907 /* Check if the pending report is for the same device as the new one */
4908 match = (!bacmp(bdaddr, &d->last_adv_addr) &&
4909 bdaddr_type == d->last_adv_addr_type);
4910
Johan Hedbergb9a63282014-03-25 10:51:52 +02004911 /* If the pending data doesn't match this report or this isn't a
4912 * scan response (e.g. we got a duplicate ADV_IND) then force
4913 * sending of the pending data.
4914 */
Johan Hedberg474ee062014-03-25 14:34:59 +02004915 if (type != LE_ADV_SCAN_RSP || !match) {
4916 /* Send out whatever is in the cache, but skip duplicates */
4917 if (!match)
4918 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004919 d->last_adv_addr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004920 d->last_adv_rssi, d->last_adv_flags,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004921 d->last_adv_data,
Johan Hedberg474ee062014-03-25 14:34:59 +02004922 d->last_adv_data_len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004923
4924 /* If the new report will trigger a SCAN_REQ store it for
4925 * later merging.
4926 */
4927 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
4928 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004929 rssi, flags, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004930 return;
4931 }
4932
4933 /* The advertising reports cannot be merged, so clear
4934 * the pending report and send out a device found event.
4935 */
4936 clear_pending_adv_report(hdev);
Johan Hedberg5c5b93e2014-03-29 08:39:53 +02004937 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004938 rssi, flags, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004939 return;
4940 }
4941
4942 /* If we get here we've got a pending ADV_IND or ADV_SCAN_IND and
4943 * the new event is a SCAN_RSP. We can therefore proceed with
4944 * sending a merged device found event.
4945 */
4946 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004947 d->last_adv_addr_type, NULL, rssi, d->last_adv_flags,
Marcel Holtmann42bd6a52014-07-01 14:11:19 +02004948 d->last_adv_data, d->last_adv_data_len, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004949 clear_pending_adv_report(hdev);
Johan Hedberg4af605d2014-03-24 10:48:00 +02004950}
4951
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004952static void hci_le_adv_report_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andre Guedes9aa04c92011-05-26 16:23:51 -03004953{
Andre Guedese95beb42011-09-26 20:48:35 -03004954 u8 num_reports = skb->data[0];
4955 void *ptr = &skb->data[1];
Andre Guedes9aa04c92011-05-26 16:23:51 -03004956
Andre Guedesa4790db2014-02-26 20:21:47 -03004957 hci_dev_lock(hdev);
4958
Andre Guedese95beb42011-09-26 20:48:35 -03004959 while (num_reports--) {
4960 struct hci_ev_le_advertising_info *ev = ptr;
Johan Hedberg4af605d2014-03-24 10:48:00 +02004961 s8 rssi;
Andre Guedesa4790db2014-02-26 20:21:47 -03004962
Chriz Chowee649342018-04-20 15:46:24 +08004963 if (ev->length <= HCI_MAX_AD_LENGTH) {
4964 rssi = ev->data[ev->length];
4965 process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
4966 ev->bdaddr_type, NULL, 0, rssi,
4967 ev->data, ev->length);
4968 } else {
4969 bt_dev_err(hdev, "Dropping invalid advertising data");
4970 }
Andre Guedes3c9e9192012-01-10 18:20:50 -03004971
Andre Guedese95beb42011-09-26 20:48:35 -03004972 ptr += sizeof(*ev) + ev->length + 1;
Andre Guedes9aa04c92011-05-26 16:23:51 -03004973 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004974
4975 hci_dev_unlock(hdev);
Andre Guedes9aa04c92011-05-26 16:23:51 -03004976}
4977
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07004978static void hci_le_remote_feat_complete_evt(struct hci_dev *hdev,
4979 struct sk_buff *skb)
4980{
4981 struct hci_ev_le_remote_feat_complete *ev = (void *)skb->data;
4982 struct hci_conn *conn;
4983
4984 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4985
4986 hci_dev_lock(hdev);
4987
4988 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
4989 if (conn) {
4990 if (!ev->status)
4991 memcpy(conn->features[0], ev->features, 8);
4992
4993 if (conn->state == BT_CONFIG) {
4994 __u8 status;
4995
4996 /* If the local controller supports slave-initiated
4997 * features exchange, but the remote controller does
4998 * not, then it is possible that the error code 0x1a
4999 * for unsupported remote feature gets returned.
5000 *
5001 * In this specific case, allow the connection to
5002 * transition into connected state and mark it as
5003 * successful.
5004 */
5005 if ((hdev->le_features[0] & HCI_LE_SLAVE_FEATURES) &&
5006 !conn->out && ev->status == 0x1a)
5007 status = 0x00;
5008 else
5009 status = ev->status;
5010
5011 conn->state = BT_CONNECTED;
5012 hci_connect_cfm(conn, status);
5013 hci_conn_drop(conn);
5014 }
5015 }
5016
5017 hci_dev_unlock(hdev);
5018}
5019
Gustavo Padovan6039aa72012-05-23 04:04:18 -03005020static void hci_le_ltk_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005021{
5022 struct hci_ev_le_ltk_req *ev = (void *) skb->data;
5023 struct hci_cp_le_ltk_reply cp;
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03005024 struct hci_cp_le_ltk_neg_reply neg;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005025 struct hci_conn *conn;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03005026 struct smp_ltk *ltk;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005027
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03005028 BT_DBG("%s handle 0x%4.4x", hdev->name, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005029
5030 hci_dev_lock(hdev);
5031
5032 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03005033 if (conn == NULL)
5034 goto not_found;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005035
Johan Hedbergf3a73d92014-05-29 15:02:59 +03005036 ltk = hci_find_ltk(hdev, &conn->dst, conn->dst_type, conn->role);
Johan Hedberg5378bc52014-05-29 14:00:39 +03005037 if (!ltk)
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03005038 goto not_found;
5039
Johan Hedberg5378bc52014-05-29 14:00:39 +03005040 if (smp_ltk_is_sc(ltk)) {
5041 /* With SC both EDiv and Rand are set to zero */
5042 if (ev->ediv || ev->rand)
5043 goto not_found;
5044 } else {
5045 /* For non-SC keys check that EDiv and Rand match */
5046 if (ev->ediv != ltk->ediv || ev->rand != ltk->rand)
5047 goto not_found;
5048 }
5049
Johan Hedberg8b76ce32015-06-08 18:14:39 +03005050 memcpy(cp.ltk, ltk->val, ltk->enc_size);
5051 memset(cp.ltk + ltk->enc_size, 0, sizeof(cp.ltk) - ltk->enc_size);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005052 cp.handle = cpu_to_le16(conn->handle);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03005053
Johan Hedberga6f78332014-09-10 17:37:45 -07005054 conn->pending_sec_level = smp_ltk_sec_level(ltk);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005055
Andre Guedes89cbb4d2013-07-31 16:25:29 -03005056 conn->enc_key_size = ltk->enc_size;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005057
5058 hci_send_cmd(hdev, HCI_OP_LE_LTK_REPLY, sizeof(cp), &cp);
5059
Claudio Takahasi5981a882013-07-25 16:34:24 -03005060 /* Ref. Bluetooth Core SPEC pages 1975 and 2004. STK is a
5061 * temporary key used to encrypt a connection following
5062 * pairing. It is used during the Encrypted Session Setup to
5063 * distribute the keys. Later, security can be re-established
5064 * using a distributed LTK.
5065 */
Johan Hedberg2ceba532014-06-16 19:25:16 +03005066 if (ltk->type == SMP_STK) {
Johan Hedbergfe59a052014-07-01 19:14:12 +03005067 set_bit(HCI_CONN_STK_ENCRYPT, &conn->flags);
Johan Hedberg970d0f12014-11-13 14:37:47 +02005068 list_del_rcu(&ltk->list);
5069 kfree_rcu(ltk, rcu);
Johan Hedbergfe59a052014-07-01 19:14:12 +03005070 } else {
5071 clear_bit(HCI_CONN_STK_ENCRYPT, &conn->flags);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03005072 }
5073
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005074 hci_dev_unlock(hdev);
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03005075
5076 return;
5077
5078not_found:
5079 neg.handle = ev->handle;
5080 hci_send_cmd(hdev, HCI_OP_LE_LTK_NEG_REPLY, sizeof(neg), &neg);
5081 hci_dev_unlock(hdev);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005082}
5083
Andre Guedes8e75b462014-07-01 18:10:08 -03005084static void send_conn_param_neg_reply(struct hci_dev *hdev, u16 handle,
5085 u8 reason)
5086{
5087 struct hci_cp_le_conn_param_req_neg_reply cp;
5088
5089 cp.handle = cpu_to_le16(handle);
5090 cp.reason = reason;
5091
5092 hci_send_cmd(hdev, HCI_OP_LE_CONN_PARAM_REQ_NEG_REPLY, sizeof(cp),
5093 &cp);
5094}
5095
5096static void hci_le_remote_conn_param_req_evt(struct hci_dev *hdev,
5097 struct sk_buff *skb)
5098{
5099 struct hci_ev_le_remote_conn_param_req *ev = (void *) skb->data;
5100 struct hci_cp_le_conn_param_req_reply cp;
5101 struct hci_conn *hcon;
5102 u16 handle, min, max, latency, timeout;
5103
5104 handle = le16_to_cpu(ev->handle);
5105 min = le16_to_cpu(ev->interval_min);
5106 max = le16_to_cpu(ev->interval_max);
5107 latency = le16_to_cpu(ev->latency);
5108 timeout = le16_to_cpu(ev->timeout);
5109
5110 hcon = hci_conn_hash_lookup_handle(hdev, handle);
5111 if (!hcon || hcon->state != BT_CONNECTED)
5112 return send_conn_param_neg_reply(hdev, handle,
5113 HCI_ERROR_UNKNOWN_CONN_ID);
5114
5115 if (hci_check_conn_params(min, max, latency, timeout))
5116 return send_conn_param_neg_reply(hdev, handle,
5117 HCI_ERROR_INVALID_LL_PARAMS);
5118
Johan Hedberg40bef302014-07-16 11:42:27 +03005119 if (hcon->role == HCI_ROLE_MASTER) {
Johan Hedberg348d50b2014-07-02 17:37:30 +03005120 struct hci_conn_params *params;
Johan Hedbergf4869e22014-07-02 17:37:32 +03005121 u8 store_hint;
Johan Hedberg348d50b2014-07-02 17:37:30 +03005122
5123 hci_dev_lock(hdev);
5124
5125 params = hci_conn_params_lookup(hdev, &hcon->dst,
5126 hcon->dst_type);
5127 if (params) {
5128 params->conn_min_interval = min;
5129 params->conn_max_interval = max;
5130 params->conn_latency = latency;
5131 params->supervision_timeout = timeout;
Johan Hedbergf4869e22014-07-02 17:37:32 +03005132 store_hint = 0x01;
5133 } else{
5134 store_hint = 0x00;
Johan Hedberg348d50b2014-07-02 17:37:30 +03005135 }
5136
5137 hci_dev_unlock(hdev);
5138
Johan Hedbergf4869e22014-07-02 17:37:32 +03005139 mgmt_new_conn_param(hdev, &hcon->dst, hcon->dst_type,
5140 store_hint, min, max, latency, timeout);
Johan Hedberg348d50b2014-07-02 17:37:30 +03005141 }
Andre Guedesffb5a8272014-07-01 18:10:11 -03005142
Andre Guedes8e75b462014-07-01 18:10:08 -03005143 cp.handle = ev->handle;
5144 cp.interval_min = ev->interval_min;
5145 cp.interval_max = ev->interval_max;
5146 cp.latency = ev->latency;
5147 cp.timeout = ev->timeout;
5148 cp.min_ce_len = 0;
5149 cp.max_ce_len = 0;
5150
5151 hci_send_cmd(hdev, HCI_OP_LE_CONN_PARAM_REQ_REPLY, sizeof(cp), &cp);
5152}
5153
Marcel Holtmann2f010b52014-12-05 16:20:13 +01005154static void hci_le_direct_adv_report_evt(struct hci_dev *hdev,
5155 struct sk_buff *skb)
5156{
5157 u8 num_reports = skb->data[0];
5158 void *ptr = &skb->data[1];
5159
5160 hci_dev_lock(hdev);
5161
5162 while (num_reports--) {
5163 struct hci_ev_le_direct_adv_info *ev = ptr;
5164
5165 process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
5166 ev->bdaddr_type, &ev->direct_addr,
5167 ev->direct_addr_type, ev->rssi, NULL, 0);
5168
5169 ptr += sizeof(*ev);
5170 }
5171
5172 hci_dev_unlock(hdev);
5173}
5174
Gustavo Padovan6039aa72012-05-23 04:04:18 -03005175static void hci_le_meta_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03005176{
5177 struct hci_ev_le_meta *le_ev = (void *) skb->data;
5178
5179 skb_pull(skb, sizeof(*le_ev));
5180
5181 switch (le_ev->subevent) {
5182 case HCI_EV_LE_CONN_COMPLETE:
5183 hci_le_conn_complete_evt(hdev, skb);
5184 break;
5185
Marcel Holtmann1855d922014-06-23 11:40:05 +02005186 case HCI_EV_LE_CONN_UPDATE_COMPLETE:
5187 hci_le_conn_update_complete_evt(hdev, skb);
5188 break;
5189
Andre Guedes9aa04c92011-05-26 16:23:51 -03005190 case HCI_EV_LE_ADVERTISING_REPORT:
5191 hci_le_adv_report_evt(hdev, skb);
5192 break;
5193
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07005194 case HCI_EV_LE_REMOTE_FEAT_COMPLETE:
5195 hci_le_remote_feat_complete_evt(hdev, skb);
5196 break;
5197
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005198 case HCI_EV_LE_LTK_REQ:
5199 hci_le_ltk_request_evt(hdev, skb);
5200 break;
5201
Andre Guedes8e75b462014-07-01 18:10:08 -03005202 case HCI_EV_LE_REMOTE_CONN_PARAM_REQ:
5203 hci_le_remote_conn_param_req_evt(hdev, skb);
5204 break;
5205
Marcel Holtmann2f010b52014-12-05 16:20:13 +01005206 case HCI_EV_LE_DIRECT_ADV_REPORT:
5207 hci_le_direct_adv_report_evt(hdev, skb);
5208 break;
5209
Ville Tervofcd89c02011-02-10 22:38:47 -03005210 default:
5211 break;
5212 }
5213}
5214
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005215static bool hci_get_cmd_complete(struct hci_dev *hdev, u16 opcode,
5216 u8 event, struct sk_buff *skb)
5217{
5218 struct hci_ev_cmd_complete *ev;
5219 struct hci_event_hdr *hdr;
5220
5221 if (!skb)
5222 return false;
5223
5224 if (skb->len < sizeof(*hdr)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01005225 bt_dev_err(hdev, "too short HCI event");
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005226 return false;
5227 }
5228
5229 hdr = (void *) skb->data;
5230 skb_pull(skb, HCI_EVENT_HDR_SIZE);
5231
5232 if (event) {
5233 if (hdr->evt != event)
5234 return false;
5235 return true;
5236 }
5237
5238 if (hdr->evt != HCI_EV_CMD_COMPLETE) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01005239 bt_dev_err(hdev, "last event is not cmd complete (0x%2.2x)",
5240 hdr->evt);
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005241 return false;
5242 }
5243
5244 if (skb->len < sizeof(*ev)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01005245 bt_dev_err(hdev, "too short cmd_complete event");
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005246 return false;
5247 }
5248
5249 ev = (void *) skb->data;
5250 skb_pull(skb, sizeof(*ev));
5251
5252 if (opcode != __le16_to_cpu(ev->opcode)) {
5253 BT_DBG("opcode doesn't match (0x%2.2x != 0x%2.2x)", opcode,
5254 __le16_to_cpu(ev->opcode));
5255 return false;
5256 }
5257
5258 return true;
5259}
5260
Linus Torvalds1da177e2005-04-16 15:20:36 -07005261void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)
5262{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005263 struct hci_event_hdr *hdr = (void *) skb->data;
Johan Hedberge62144872015-04-02 13:41:08 +03005264 hci_req_complete_t req_complete = NULL;
5265 hci_req_complete_skb_t req_complete_skb = NULL;
5266 struct sk_buff *orig_skb = NULL;
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005267 u8 status = 0, event = hdr->evt, req_evt = 0;
Johan Hedberge62144872015-04-02 13:41:08 +03005268 u16 opcode = HCI_OP_NOP;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005269
Marcel Holtmann242c0eb2015-10-25 22:45:53 +01005270 if (hdev->sent_cmd && bt_cb(hdev->sent_cmd)->hci.req_event == event) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02005271 struct hci_command_hdr *cmd_hdr = (void *) hdev->sent_cmd->data;
Johan Hedberge62144872015-04-02 13:41:08 +03005272 opcode = __le16_to_cpu(cmd_hdr->opcode);
5273 hci_req_cmd_complete(hdev, opcode, status, &req_complete,
5274 &req_complete_skb);
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005275 req_evt = event;
Johan Hedberg02350a72013-04-03 21:50:29 +03005276 }
5277
Johan Hedberge62144872015-04-02 13:41:08 +03005278 /* If it looks like we might end up having to call
5279 * req_complete_skb, store a pristine copy of the skb since the
5280 * various handlers may modify the original one through
5281 * skb_pull() calls, etc.
5282 */
5283 if (req_complete_skb || event == HCI_EV_CMD_STATUS ||
5284 event == HCI_EV_CMD_COMPLETE)
5285 orig_skb = skb_clone(skb, GFP_KERNEL);
5286
5287 skb_pull(skb, HCI_EVENT_HDR_SIZE);
5288
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005289 switch (event) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005290 case HCI_EV_INQUIRY_COMPLETE:
5291 hci_inquiry_complete_evt(hdev, skb);
5292 break;
5293
5294 case HCI_EV_INQUIRY_RESULT:
5295 hci_inquiry_result_evt(hdev, skb);
5296 break;
5297
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005298 case HCI_EV_CONN_COMPLETE:
5299 hci_conn_complete_evt(hdev, skb);
Marcel Holtmann21d9e302005-09-13 01:32:25 +02005300 break;
5301
Linus Torvalds1da177e2005-04-16 15:20:36 -07005302 case HCI_EV_CONN_REQUEST:
5303 hci_conn_request_evt(hdev, skb);
5304 break;
5305
Linus Torvalds1da177e2005-04-16 15:20:36 -07005306 case HCI_EV_DISCONN_COMPLETE:
5307 hci_disconn_complete_evt(hdev, skb);
5308 break;
5309
Linus Torvalds1da177e2005-04-16 15:20:36 -07005310 case HCI_EV_AUTH_COMPLETE:
5311 hci_auth_complete_evt(hdev, skb);
5312 break;
5313
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005314 case HCI_EV_REMOTE_NAME:
5315 hci_remote_name_evt(hdev, skb);
5316 break;
5317
Linus Torvalds1da177e2005-04-16 15:20:36 -07005318 case HCI_EV_ENCRYPT_CHANGE:
5319 hci_encrypt_change_evt(hdev, skb);
5320 break;
5321
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005322 case HCI_EV_CHANGE_LINK_KEY_COMPLETE:
5323 hci_change_link_key_complete_evt(hdev, skb);
5324 break;
5325
5326 case HCI_EV_REMOTE_FEATURES:
5327 hci_remote_features_evt(hdev, skb);
5328 break;
5329
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005330 case HCI_EV_CMD_COMPLETE:
Johan Hedberge62144872015-04-02 13:41:08 +03005331 hci_cmd_complete_evt(hdev, skb, &opcode, &status,
5332 &req_complete, &req_complete_skb);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005333 break;
5334
5335 case HCI_EV_CMD_STATUS:
Johan Hedberge62144872015-04-02 13:41:08 +03005336 hci_cmd_status_evt(hdev, skb, &opcode, &status, &req_complete,
5337 &req_complete_skb);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005338 break;
5339
Marcel Holtmann24dfa342014-11-02 02:56:41 +01005340 case HCI_EV_HARDWARE_ERROR:
5341 hci_hardware_error_evt(hdev, skb);
5342 break;
5343
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005344 case HCI_EV_ROLE_CHANGE:
5345 hci_role_change_evt(hdev, skb);
5346 break;
5347
5348 case HCI_EV_NUM_COMP_PKTS:
5349 hci_num_comp_pkts_evt(hdev, skb);
5350 break;
5351
5352 case HCI_EV_MODE_CHANGE:
5353 hci_mode_change_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005354 break;
5355
5356 case HCI_EV_PIN_CODE_REQ:
5357 hci_pin_code_request_evt(hdev, skb);
5358 break;
5359
5360 case HCI_EV_LINK_KEY_REQ:
5361 hci_link_key_request_evt(hdev, skb);
5362 break;
5363
5364 case HCI_EV_LINK_KEY_NOTIFY:
5365 hci_link_key_notify_evt(hdev, skb);
5366 break;
5367
5368 case HCI_EV_CLOCK_OFFSET:
5369 hci_clock_offset_evt(hdev, skb);
5370 break;
5371
Marcel Holtmanna8746412008-07-14 20:13:46 +02005372 case HCI_EV_PKT_TYPE_CHANGE:
5373 hci_pkt_type_change_evt(hdev, skb);
5374 break;
5375
Marcel Holtmann85a1e932005-08-09 20:28:02 -07005376 case HCI_EV_PSCAN_REP_MODE:
5377 hci_pscan_rep_mode_evt(hdev, skb);
5378 break;
5379
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005380 case HCI_EV_INQUIRY_RESULT_WITH_RSSI:
5381 hci_inquiry_result_with_rssi_evt(hdev, skb);
5382 break;
5383
5384 case HCI_EV_REMOTE_EXT_FEATURES:
5385 hci_remote_ext_features_evt(hdev, skb);
5386 break;
5387
5388 case HCI_EV_SYNC_CONN_COMPLETE:
5389 hci_sync_conn_complete_evt(hdev, skb);
5390 break;
5391
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005392 case HCI_EV_EXTENDED_INQUIRY_RESULT:
5393 hci_extended_inquiry_result_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005394 break;
5395
Johan Hedberg1c2e0042012-06-08 23:31:13 +08005396 case HCI_EV_KEY_REFRESH_COMPLETE:
5397 hci_key_refresh_complete_evt(hdev, skb);
5398 break;
5399
Marcel Holtmann04936842008-07-14 20:13:48 +02005400 case HCI_EV_IO_CAPA_REQUEST:
5401 hci_io_capa_request_evt(hdev, skb);
5402 break;
5403
Johan Hedberg03b555e2011-01-04 15:40:05 +02005404 case HCI_EV_IO_CAPA_REPLY:
5405 hci_io_capa_reply_evt(hdev, skb);
5406 break;
5407
Johan Hedberga5c29682011-02-19 12:05:57 -03005408 case HCI_EV_USER_CONFIRM_REQUEST:
5409 hci_user_confirm_request_evt(hdev, skb);
5410 break;
5411
Brian Gix1143d452011-11-23 08:28:34 -08005412 case HCI_EV_USER_PASSKEY_REQUEST:
5413 hci_user_passkey_request_evt(hdev, skb);
5414 break;
5415
Johan Hedberg92a25252012-09-06 18:39:26 +03005416 case HCI_EV_USER_PASSKEY_NOTIFY:
5417 hci_user_passkey_notify_evt(hdev, skb);
5418 break;
5419
5420 case HCI_EV_KEYPRESS_NOTIFY:
5421 hci_keypress_notify_evt(hdev, skb);
5422 break;
5423
Marcel Holtmann04936842008-07-14 20:13:48 +02005424 case HCI_EV_SIMPLE_PAIR_COMPLETE:
5425 hci_simple_pair_complete_evt(hdev, skb);
5426 break;
5427
Marcel Holtmann41a96212008-07-14 20:13:48 +02005428 case HCI_EV_REMOTE_HOST_FEATURES:
5429 hci_remote_host_features_evt(hdev, skb);
5430 break;
5431
Ville Tervofcd89c02011-02-10 22:38:47 -03005432 case HCI_EV_LE_META:
5433 hci_le_meta_evt(hdev, skb);
5434 break;
5435
Szymon Janc2763eda2011-03-22 13:12:22 +01005436 case HCI_EV_REMOTE_OOB_DATA_REQUEST:
5437 hci_remote_oob_data_request_evt(hdev, skb);
5438 break;
5439
Arron Wanga77a6a12015-07-24 17:13:15 +08005440#if IS_ENABLED(CONFIG_BT_HS)
5441 case HCI_EV_CHANNEL_SELECTED:
5442 hci_chan_selected_evt(hdev, skb);
5443 break;
5444
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03005445 case HCI_EV_PHY_LINK_COMPLETE:
5446 hci_phy_link_complete_evt(hdev, skb);
5447 break;
5448
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03005449 case HCI_EV_LOGICAL_LINK_COMPLETE:
5450 hci_loglink_complete_evt(hdev, skb);
5451 break;
5452
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02005453 case HCI_EV_DISCONN_LOGICAL_LINK_COMPLETE:
5454 hci_disconn_loglink_complete_evt(hdev, skb);
5455 break;
5456
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02005457 case HCI_EV_DISCONN_PHY_LINK_COMPLETE:
5458 hci_disconn_phylink_complete_evt(hdev, skb);
5459 break;
Arron Wanga77a6a12015-07-24 17:13:15 +08005460#endif
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02005461
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02005462 case HCI_EV_NUM_COMP_BLOCKS:
5463 hci_num_comp_blocks_evt(hdev, skb);
5464 break;
5465
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005466 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03005467 BT_DBG("%s event 0x%2.2x", hdev->name, event);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005468 break;
5469 }
5470
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005471 if (req_complete) {
Johan Hedberge62144872015-04-02 13:41:08 +03005472 req_complete(hdev, status, opcode);
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005473 } else if (req_complete_skb) {
5474 if (!hci_get_cmd_complete(hdev, opcode, req_evt, orig_skb)) {
5475 kfree_skb(orig_skb);
5476 orig_skb = NULL;
5477 }
Johan Hedberge62144872015-04-02 13:41:08 +03005478 req_complete_skb(hdev, status, opcode, orig_skb);
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005479 }
Johan Hedberge62144872015-04-02 13:41:08 +03005480
5481 kfree_skb(orig_skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005482 kfree_skb(skb);
5483 hdev->stat.evt_rx++;
5484}