blob: 14e42e157de9f9779ff6573dfe4f172a46043ac8 [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
Jaganath Kanakkasserya2344b92018-07-06 17:05:28 +05301101static void hci_cc_le_set_ext_scan_param(struct hci_dev *hdev,
1102 struct sk_buff *skb)
1103{
1104 struct hci_cp_le_set_ext_scan_params *cp;
1105 __u8 status = *((__u8 *) skb->data);
1106 struct hci_cp_le_scan_phy_params *phy_param;
1107
1108 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1109
1110 if (status)
1111 return;
1112
1113 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_EXT_SCAN_PARAMS);
1114 if (!cp)
1115 return;
1116
1117 phy_param = (void *)cp->data;
1118
1119 hci_dev_lock(hdev);
1120
1121 hdev->le_scan_type = phy_param->type;
1122
1123 hci_dev_unlock(hdev);
1124}
1125
Johan Hedbergb9a63282014-03-25 10:51:52 +02001126static bool has_pending_adv_report(struct hci_dev *hdev)
1127{
1128 struct discovery_state *d = &hdev->discovery;
1129
1130 return bacmp(&d->last_adv_addr, BDADDR_ANY);
1131}
1132
1133static void clear_pending_adv_report(struct hci_dev *hdev)
1134{
1135 struct discovery_state *d = &hdev->discovery;
1136
1137 bacpy(&d->last_adv_addr, BDADDR_ANY);
1138 d->last_adv_data_len = 0;
1139}
1140
1141static void store_pending_adv_report(struct hci_dev *hdev, bdaddr_t *bdaddr,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001142 u8 bdaddr_type, s8 rssi, u32 flags,
1143 u8 *data, u8 len)
Johan Hedbergb9a63282014-03-25 10:51:52 +02001144{
1145 struct discovery_state *d = &hdev->discovery;
1146
1147 bacpy(&d->last_adv_addr, bdaddr);
1148 d->last_adv_addr_type = bdaddr_type;
Johan Hedbergff5cd292014-03-25 14:40:52 +02001149 d->last_adv_rssi = rssi;
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001150 d->last_adv_flags = flags;
Johan Hedbergb9a63282014-03-25 10:51:52 +02001151 memcpy(d->last_adv_data, data, len);
1152 d->last_adv_data_len = len;
1153}
1154
Jaganath Kanakkassery3baef812018-07-06 17:05:27 +05301155static void le_set_scan_enable_complete(struct hci_dev *hdev, u8 enable)
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001156{
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301157 hci_dev_lock(hdev);
1158
Jaganath Kanakkassery3baef812018-07-06 17:05:27 +05301159 switch (enable) {
Andre Guedes76a388b2013-04-04 20:21:02 -03001160 case LE_SCAN_ENABLE:
Marcel Holtmanna1536da2015-03-13 02:11:01 -07001161 hci_dev_set_flag(hdev, HCI_LE_SCAN);
Johan Hedbergb9a63282014-03-25 10:51:52 +02001162 if (hdev->le_scan_type == LE_SCAN_ACTIVE)
1163 clear_pending_adv_report(hdev);
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001164 break;
1165
Andre Guedes76a388b2013-04-04 20:21:02 -03001166 case LE_SCAN_DISABLE:
Johan Hedbergb9a63282014-03-25 10:51:52 +02001167 /* We do this here instead of when setting DISCOVERY_STOPPED
1168 * since the latter would potentially require waiting for
1169 * inquiry to stop too.
1170 */
1171 if (has_pending_adv_report(hdev)) {
1172 struct discovery_state *d = &hdev->discovery;
1173
1174 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergab0aa432014-03-26 14:17:12 +02001175 d->last_adv_addr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001176 d->last_adv_rssi, d->last_adv_flags,
Johan Hedbergab0aa432014-03-26 14:17:12 +02001177 d->last_adv_data,
Johan Hedbergb9a63282014-03-25 10:51:52 +02001178 d->last_adv_data_len, NULL, 0);
1179 }
1180
Johan Hedberg317ac8c2014-02-28 20:26:12 +02001181 /* Cancel this timer so that we don't try to disable scanning
1182 * when it's already disabled.
1183 */
1184 cancel_delayed_work(&hdev->le_scan_disable);
1185
Marcel Holtmanna358dc12015-03-13 02:11:02 -07001186 hci_dev_clear_flag(hdev, HCI_LE_SCAN);
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001187
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001188 /* The HCI_LE_SCAN_INTERRUPTED flag indicates that we
1189 * interrupted scanning due to a connect request. Mark
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001190 * therefore discovery as stopped. If this was not
1191 * because of a connect request advertising might have
1192 * been disabled because of active scanning, so
1193 * re-enable it again if necessary.
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001194 */
Marcel Holtmanna69d8922015-03-13 02:11:05 -07001195 if (hci_dev_test_and_clear_flag(hdev, HCI_LE_SCAN_INTERRUPTED))
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001196 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001197 else if (!hci_dev_test_flag(hdev, HCI_LE_ADV) &&
Johan Hedberg34722272014-07-08 16:05:05 +03001198 hdev->discovery.state == DISCOVERY_FINDING)
Johan Hedbergf2252572015-11-18 12:49:20 +02001199 hci_req_reenable_advertising(hdev);
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001200
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001201 break;
1202
1203 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001204 bt_dev_err(hdev, "use of reserved LE_Scan_Enable param %d",
Jaganath Kanakkassery3baef812018-07-06 17:05:27 +05301205 enable);
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001206 break;
Andre Guedes35815082011-05-26 16:23:53 -03001207 }
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301208
1209 hci_dev_unlock(hdev);
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001210}
1211
Jaganath Kanakkassery3baef812018-07-06 17:05:27 +05301212static void hci_cc_le_set_scan_enable(struct hci_dev *hdev,
1213 struct sk_buff *skb)
1214{
1215 struct hci_cp_le_set_scan_enable *cp;
1216 __u8 status = *((__u8 *) skb->data);
1217
1218 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1219
1220 if (status)
1221 return;
1222
1223 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_ENABLE);
1224 if (!cp)
1225 return;
1226
1227 le_set_scan_enable_complete(hdev, cp->enable);
1228}
1229
Jaganath Kanakkasserya2344b92018-07-06 17:05:28 +05301230static void hci_cc_le_set_ext_scan_enable(struct hci_dev *hdev,
1231 struct sk_buff *skb)
1232{
1233 struct hci_cp_le_set_ext_scan_enable *cp;
1234 __u8 status = *((__u8 *) skb->data);
1235
1236 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1237
1238 if (status)
1239 return;
1240
1241 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_EXT_SCAN_ENABLE);
1242 if (!cp)
1243 return;
1244
1245 le_set_scan_enable_complete(hdev, cp->enable);
1246}
1247
Johan Hedbergcf1d0812013-01-22 14:02:00 +02001248static void hci_cc_le_read_white_list_size(struct hci_dev *hdev,
1249 struct sk_buff *skb)
1250{
1251 struct hci_rp_le_read_white_list_size *rp = (void *) skb->data;
1252
1253 BT_DBG("%s status 0x%2.2x size %u", hdev->name, rp->status, rp->size);
1254
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001255 if (rp->status)
1256 return;
1257
1258 hdev->le_white_list_size = rp->size;
Johan Hedbergcf1d0812013-01-22 14:02:00 +02001259}
1260
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001261static void hci_cc_le_clear_white_list(struct hci_dev *hdev,
1262 struct sk_buff *skb)
1263{
1264 __u8 status = *((__u8 *) skb->data);
1265
1266 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1267
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001268 if (status)
1269 return;
1270
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001271 hci_bdaddr_list_clear(&hdev->le_white_list);
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001272}
1273
1274static void hci_cc_le_add_to_white_list(struct hci_dev *hdev,
1275 struct sk_buff *skb)
1276{
1277 struct hci_cp_le_add_to_white_list *sent;
1278 __u8 status = *((__u8 *) skb->data);
1279
1280 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1281
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001282 if (status)
1283 return;
1284
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001285 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_ADD_TO_WHITE_LIST);
1286 if (!sent)
1287 return;
1288
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001289 hci_bdaddr_list_add(&hdev->le_white_list, &sent->bdaddr,
1290 sent->bdaddr_type);
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001291}
1292
1293static void hci_cc_le_del_from_white_list(struct hci_dev *hdev,
1294 struct sk_buff *skb)
1295{
1296 struct hci_cp_le_del_from_white_list *sent;
1297 __u8 status = *((__u8 *) skb->data);
1298
1299 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1300
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001301 if (status)
1302 return;
1303
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001304 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_DEL_FROM_WHITE_LIST);
1305 if (!sent)
1306 return;
1307
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001308 hci_bdaddr_list_del(&hdev->le_white_list, &sent->bdaddr,
1309 sent->bdaddr_type);
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001310}
1311
Johan Hedberg9b008c02013-01-22 14:02:01 +02001312static void hci_cc_le_read_supported_states(struct hci_dev *hdev,
1313 struct sk_buff *skb)
1314{
1315 struct hci_rp_le_read_supported_states *rp = (void *) skb->data;
1316
1317 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1318
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001319 if (rp->status)
1320 return;
1321
1322 memcpy(hdev->le_states, rp->le_states, 8);
Johan Hedberg9b008c02013-01-22 14:02:01 +02001323}
1324
Marcel Holtmanna8e1bfa2014-12-20 16:28:40 +01001325static void hci_cc_le_read_def_data_len(struct hci_dev *hdev,
1326 struct sk_buff *skb)
1327{
1328 struct hci_rp_le_read_def_data_len *rp = (void *) skb->data;
1329
1330 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1331
1332 if (rp->status)
1333 return;
1334
1335 hdev->le_def_tx_len = le16_to_cpu(rp->tx_len);
1336 hdev->le_def_tx_time = le16_to_cpu(rp->tx_time);
1337}
1338
1339static void hci_cc_le_write_def_data_len(struct hci_dev *hdev,
1340 struct sk_buff *skb)
1341{
1342 struct hci_cp_le_write_def_data_len *sent;
1343 __u8 status = *((__u8 *) skb->data);
1344
1345 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1346
1347 if (status)
1348 return;
1349
1350 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_WRITE_DEF_DATA_LEN);
1351 if (!sent)
1352 return;
1353
1354 hdev->le_def_tx_len = le16_to_cpu(sent->tx_len);
1355 hdev->le_def_tx_time = le16_to_cpu(sent->tx_time);
1356}
1357
Ankit Navik545f2592018-06-29 12:13:20 +05301358static void hci_cc_le_clear_resolv_list(struct hci_dev *hdev,
1359 struct sk_buff *skb)
1360{
1361 __u8 status = *((__u8 *) skb->data);
1362
1363 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1364
1365 if (status)
1366 return;
1367
1368 hci_bdaddr_list_clear(&hdev->le_resolv_list);
1369}
1370
Ankit Navikcfdb0c22018-06-29 12:12:50 +05301371static void hci_cc_le_read_resolv_list_size(struct hci_dev *hdev,
1372 struct sk_buff *skb)
1373{
1374 struct hci_rp_le_read_resolv_list_size *rp = (void *) skb->data;
1375
1376 BT_DBG("%s status 0x%2.2x size %u", hdev->name, rp->status, rp->size);
1377
1378 if (rp->status)
1379 return;
1380
1381 hdev->le_resolv_list_size = rp->size;
1382}
1383
Marcel Holtmanna8e1bfa2014-12-20 16:28:40 +01001384static void hci_cc_le_read_max_data_len(struct hci_dev *hdev,
1385 struct sk_buff *skb)
1386{
1387 struct hci_rp_le_read_max_data_len *rp = (void *) skb->data;
1388
1389 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1390
1391 if (rp->status)
1392 return;
1393
1394 hdev->le_max_tx_len = le16_to_cpu(rp->tx_len);
1395 hdev->le_max_tx_time = le16_to_cpu(rp->tx_time);
1396 hdev->le_max_rx_len = le16_to_cpu(rp->rx_len);
1397 hdev->le_max_rx_time = le16_to_cpu(rp->rx_time);
1398}
1399
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001400static void hci_cc_write_le_host_supported(struct hci_dev *hdev,
1401 struct sk_buff *skb)
Andre Guedesf9b49302011-06-30 19:20:53 -03001402{
Johan Hedberg06199cf2012-02-22 16:37:11 +02001403 struct hci_cp_write_le_host_supported *sent;
Andre Guedesf9b49302011-06-30 19:20:53 -03001404 __u8 status = *((__u8 *) skb->data);
1405
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001406 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedesf9b49302011-06-30 19:20:53 -03001407
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001408 if (status)
1409 return;
1410
Johan Hedberg06199cf2012-02-22 16:37:11 +02001411 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LE_HOST_SUPPORTED);
Johan Hedberg8f984df2012-02-28 01:07:22 +02001412 if (!sent)
Andre Guedesf9b49302011-06-30 19:20:53 -03001413 return;
1414
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301415 hci_dev_lock(hdev);
1416
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001417 if (sent->le) {
1418 hdev->features[1][0] |= LMP_HOST_LE;
Marcel Holtmanna1536da2015-03-13 02:11:01 -07001419 hci_dev_set_flag(hdev, HCI_LE_ENABLED);
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001420 } else {
1421 hdev->features[1][0] &= ~LMP_HOST_LE;
Marcel Holtmanna358dc12015-03-13 02:11:02 -07001422 hci_dev_clear_flag(hdev, HCI_LE_ENABLED);
1423 hci_dev_clear_flag(hdev, HCI_ADVERTISING);
Johan Hedberg8f984df2012-02-28 01:07:22 +02001424 }
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001425
1426 if (sent->simul)
1427 hdev->features[1][0] |= LMP_HOST_LE_BREDR;
1428 else
1429 hdev->features[1][0] &= ~LMP_HOST_LE_BREDR;
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301430
1431 hci_dev_unlock(hdev);
Andre Guedesf9b49302011-06-30 19:20:53 -03001432}
1433
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02001434static void hci_cc_set_adv_param(struct hci_dev *hdev, struct sk_buff *skb)
1435{
1436 struct hci_cp_le_set_adv_param *cp;
1437 u8 status = *((u8 *) skb->data);
1438
1439 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1440
1441 if (status)
1442 return;
1443
1444 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADV_PARAM);
1445 if (!cp)
1446 return;
1447
1448 hci_dev_lock(hdev);
1449 hdev->adv_addr_type = cp->own_address_type;
1450 hci_dev_unlock(hdev);
1451}
1452
Andrzej Kaczmarek5ae76a92014-05-08 15:32:08 +02001453static void hci_cc_read_rssi(struct hci_dev *hdev, struct sk_buff *skb)
1454{
1455 struct hci_rp_read_rssi *rp = (void *) skb->data;
1456 struct hci_conn *conn;
1457
1458 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1459
1460 if (rp->status)
1461 return;
1462
1463 hci_dev_lock(hdev);
1464
1465 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
1466 if (conn)
1467 conn->rssi = rp->rssi;
1468
1469 hci_dev_unlock(hdev);
1470}
1471
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001472static void hci_cc_read_tx_power(struct hci_dev *hdev, struct sk_buff *skb)
1473{
1474 struct hci_cp_read_tx_power *sent;
1475 struct hci_rp_read_tx_power *rp = (void *) skb->data;
1476 struct hci_conn *conn;
1477
1478 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1479
1480 if (rp->status)
1481 return;
1482
1483 sent = hci_sent_cmd_data(hdev, HCI_OP_READ_TX_POWER);
1484 if (!sent)
1485 return;
1486
1487 hci_dev_lock(hdev);
1488
1489 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
Andrzej Kaczmarekd0455ed2014-05-14 13:43:05 +02001490 if (!conn)
1491 goto unlock;
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001492
Andrzej Kaczmarekd0455ed2014-05-14 13:43:05 +02001493 switch (sent->type) {
1494 case 0x00:
1495 conn->tx_power = rp->tx_power;
1496 break;
1497 case 0x01:
1498 conn->max_tx_power = rp->tx_power;
1499 break;
1500 }
1501
1502unlock:
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001503 hci_dev_unlock(hdev);
1504}
1505
Marcel Holtmannc50b33c2015-01-31 15:07:52 -08001506static void hci_cc_write_ssp_debug_mode(struct hci_dev *hdev, struct sk_buff *skb)
1507{
1508 u8 status = *((u8 *) skb->data);
1509 u8 *mode;
1510
1511 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1512
1513 if (status)
1514 return;
1515
1516 mode = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SSP_DEBUG_MODE);
1517 if (mode)
1518 hdev->ssp_debug_mode = *mode;
1519}
1520
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001521static void hci_cs_inquiry(struct hci_dev *hdev, __u8 status)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001522{
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001523 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001524
1525 if (status) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001526 hci_conn_check_pending(hdev);
Johan Hedberg314b2382011-04-27 10:29:57 -04001527 return;
1528 }
1529
Andre Guedes89352e72011-11-04 14:16:53 -03001530 set_bit(HCI_INQUIRY, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001531}
1532
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001533static void hci_cs_create_conn(struct hci_dev *hdev, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001534{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001535 struct hci_cp_create_conn *cp;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001536 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001537
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001538 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001539
1540 cp = hci_sent_cmd_data(hdev, HCI_OP_CREATE_CONN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001541 if (!cp)
1542 return;
1543
1544 hci_dev_lock(hdev);
1545
1546 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
1547
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03001548 BT_DBG("%s bdaddr %pMR hcon %p", hdev->name, &cp->bdaddr, conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001549
1550 if (status) {
1551 if (conn && conn->state == BT_CONNECT) {
Marcel Holtmann4c67bc72006-10-15 17:30:56 +02001552 if (status != 0x0c || conn->attempt > 2) {
1553 conn->state = BT_CLOSED;
Johan Hedberg539c4962015-02-18 14:53:57 +02001554 hci_connect_cfm(conn, status);
Marcel Holtmann4c67bc72006-10-15 17:30:56 +02001555 hci_conn_del(conn);
1556 } else
1557 conn->state = BT_CONNECT2;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001558 }
1559 } else {
1560 if (!conn) {
Johan Hedberga5c4e302014-07-16 11:56:07 +03001561 conn = hci_conn_add(hdev, ACL_LINK, &cp->bdaddr,
1562 HCI_ROLE_MASTER);
1563 if (!conn)
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001564 bt_dev_err(hdev, "no memory for new connection");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001565 }
1566 }
1567
1568 hci_dev_unlock(hdev);
1569}
1570
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001571static void hci_cs_add_sco(struct hci_dev *hdev, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001572{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001573 struct hci_cp_add_sco *cp;
1574 struct hci_conn *acl, *sco;
1575 __u16 handle;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001576
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001577 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001578
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001579 if (!status)
1580 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001581
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001582 cp = hci_sent_cmd_data(hdev, HCI_OP_ADD_SCO);
1583 if (!cp)
1584 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001585
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001586 handle = __le16_to_cpu(cp->handle);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001587
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001588 BT_DBG("%s handle 0x%4.4x", hdev->name, handle);
Marcel Holtmann6bd57412006-11-18 22:14:22 +01001589
1590 hci_dev_lock(hdev);
1591
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001592 acl = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001593 if (acl) {
1594 sco = acl->link;
1595 if (sco) {
1596 sco->state = BT_CLOSED;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001597
Johan Hedberg539c4962015-02-18 14:53:57 +02001598 hci_connect_cfm(sco, status);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001599 hci_conn_del(sco);
1600 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001601 }
Marcel Holtmann6bd57412006-11-18 22:14:22 +01001602
1603 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001604}
1605
Marcel Holtmannf8558552008-07-14 20:13:49 +02001606static void hci_cs_auth_requested(struct hci_dev *hdev, __u8 status)
1607{
1608 struct hci_cp_auth_requested *cp;
1609 struct hci_conn *conn;
1610
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001611 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001612
1613 if (!status)
1614 return;
1615
1616 cp = hci_sent_cmd_data(hdev, HCI_OP_AUTH_REQUESTED);
1617 if (!cp)
1618 return;
1619
1620 hci_dev_lock(hdev);
1621
1622 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1623 if (conn) {
1624 if (conn->state == BT_CONFIG) {
Johan Hedberg539c4962015-02-18 14:53:57 +02001625 hci_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001626 hci_conn_drop(conn);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001627 }
1628 }
1629
1630 hci_dev_unlock(hdev);
1631}
1632
1633static void hci_cs_set_conn_encrypt(struct hci_dev *hdev, __u8 status)
1634{
1635 struct hci_cp_set_conn_encrypt *cp;
1636 struct hci_conn *conn;
1637
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001638 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001639
1640 if (!status)
1641 return;
1642
1643 cp = hci_sent_cmd_data(hdev, HCI_OP_SET_CONN_ENCRYPT);
1644 if (!cp)
1645 return;
1646
1647 hci_dev_lock(hdev);
1648
1649 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1650 if (conn) {
1651 if (conn->state == BT_CONFIG) {
Johan Hedberg539c4962015-02-18 14:53:57 +02001652 hci_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001653 hci_conn_drop(conn);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001654 }
1655 }
1656
1657 hci_dev_unlock(hdev);
1658}
1659
Johan Hedberg127178d2010-11-18 22:22:29 +02001660static int hci_outgoing_auth_needed(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -03001661 struct hci_conn *conn)
Johan Hedberg392599b2010-11-18 22:22:28 +02001662{
Johan Hedberg392599b2010-11-18 22:22:28 +02001663 if (conn->state != BT_CONFIG || !conn->out)
1664 return 0;
1665
Johan Hedberg765c2a92011-01-19 12:06:52 +05301666 if (conn->pending_sec_level == BT_SECURITY_SDP)
Johan Hedberg392599b2010-11-18 22:22:28 +02001667 return 0;
1668
1669 /* Only request authentication for SSP connections or non-SSP
Johan Hedberg264b8b42014-01-08 16:40:39 +02001670 * devices with sec_level MEDIUM or HIGH or if MITM protection
1671 * is requested.
1672 */
Gustavo Padovan807deac2012-05-17 00:36:24 -03001673 if (!hci_conn_ssp_enabled(conn) && !(conn->auth_type & 0x01) &&
Johan Hedberg7e3691e2014-05-30 14:45:19 +03001674 conn->pending_sec_level != BT_SECURITY_FIPS &&
Johan Hedberg264b8b42014-01-08 16:40:39 +02001675 conn->pending_sec_level != BT_SECURITY_HIGH &&
1676 conn->pending_sec_level != BT_SECURITY_MEDIUM)
Johan Hedberg392599b2010-11-18 22:22:28 +02001677 return 0;
1678
Johan Hedberg392599b2010-11-18 22:22:28 +02001679 return 1;
1680}
1681
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001682static int hci_resolve_name(struct hci_dev *hdev,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001683 struct inquiry_entry *e)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001684{
1685 struct hci_cp_remote_name_req cp;
1686
1687 memset(&cp, 0, sizeof(cp));
1688
1689 bacpy(&cp.bdaddr, &e->data.bdaddr);
1690 cp.pscan_rep_mode = e->data.pscan_rep_mode;
1691 cp.pscan_mode = e->data.pscan_mode;
1692 cp.clock_offset = e->data.clock_offset;
1693
1694 return hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
1695}
1696
Johan Hedbergb644ba32012-01-17 21:48:47 +02001697static bool hci_resolve_next_name(struct hci_dev *hdev)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001698{
1699 struct discovery_state *discov = &hdev->discovery;
1700 struct inquiry_entry *e;
1701
Johan Hedbergb644ba32012-01-17 21:48:47 +02001702 if (list_empty(&discov->resolve))
1703 return false;
1704
1705 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
Ram Malovanyc8100892012-07-19 10:26:09 +03001706 if (!e)
1707 return false;
1708
Johan Hedbergb644ba32012-01-17 21:48:47 +02001709 if (hci_resolve_name(hdev, e) == 0) {
1710 e->name_state = NAME_PENDING;
1711 return true;
1712 }
1713
1714 return false;
1715}
1716
1717static void hci_check_pending_name(struct hci_dev *hdev, struct hci_conn *conn,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001718 bdaddr_t *bdaddr, u8 *name, u8 name_len)
Johan Hedbergb644ba32012-01-17 21:48:47 +02001719{
1720 struct discovery_state *discov = &hdev->discovery;
1721 struct inquiry_entry *e;
1722
Johan Hedberg60cb49d2014-11-11 11:33:24 +02001723 /* Update the mgmt connected state if necessary. Be careful with
1724 * conn objects that exist but are not (yet) connected however.
1725 * Only those in BT_CONFIG or BT_CONNECTED states can be
1726 * considered connected.
1727 */
1728 if (conn &&
1729 (conn->state == BT_CONFIG || conn->state == BT_CONNECTED) &&
Jaganath Kanakkasserycb77c3e2014-11-07 16:39:09 +05301730 !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00001731 mgmt_device_connected(hdev, conn, 0, name, name_len);
Johan Hedbergb644ba32012-01-17 21:48:47 +02001732
1733 if (discov->state == DISCOVERY_STOPPED)
1734 return;
1735
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001736 if (discov->state == DISCOVERY_STOPPING)
1737 goto discov_complete;
1738
1739 if (discov->state != DISCOVERY_RESOLVING)
1740 return;
1741
1742 e = hci_inquiry_cache_lookup_resolve(hdev, bdaddr, NAME_PENDING);
Ram Malovany7cc83802012-07-19 10:26:10 +03001743 /* If the device was not found in a list of found devices names of which
1744 * are pending. there is no need to continue resolving a next name as it
1745 * will be done upon receiving another Remote Name Request Complete
1746 * Event */
1747 if (!e)
1748 return;
1749
1750 list_del(&e->list);
1751 if (name) {
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001752 e->name_state = NAME_KNOWN;
Ram Malovany7cc83802012-07-19 10:26:10 +03001753 mgmt_remote_name(hdev, bdaddr, ACL_LINK, 0x00,
1754 e->data.rssi, name, name_len);
Ram Malovanyc3e7c0d2012-07-19 10:26:11 +03001755 } else {
1756 e->name_state = NAME_NOT_KNOWN;
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001757 }
1758
Johan Hedbergb644ba32012-01-17 21:48:47 +02001759 if (hci_resolve_next_name(hdev))
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001760 return;
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001761
1762discov_complete:
1763 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
1764}
1765
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001766static void hci_cs_remote_name_req(struct hci_dev *hdev, __u8 status)
1767{
Johan Hedberg127178d2010-11-18 22:22:29 +02001768 struct hci_cp_remote_name_req *cp;
1769 struct hci_conn *conn;
1770
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001771 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Johan Hedberg127178d2010-11-18 22:22:29 +02001772
1773 /* If successful wait for the name req complete event before
1774 * checking for the need to do authentication */
1775 if (!status)
1776 return;
1777
1778 cp = hci_sent_cmd_data(hdev, HCI_OP_REMOTE_NAME_REQ);
1779 if (!cp)
1780 return;
1781
1782 hci_dev_lock(hdev);
1783
1784 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02001785
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001786 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedbergb644ba32012-01-17 21:48:47 +02001787 hci_check_pending_name(hdev, conn, &cp->bdaddr, NULL, 0);
1788
Johan Hedberg79c6c702011-04-28 11:28:55 -07001789 if (!conn)
1790 goto unlock;
1791
1792 if (!hci_outgoing_auth_needed(hdev, conn))
1793 goto unlock;
1794
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001795 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02001796 struct hci_cp_auth_requested auth_cp;
1797
Johan Hedberg977f8fc2014-07-17 15:35:39 +03001798 set_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags);
1799
Johannes Bergc1f23a22013-10-07 18:19:16 +02001800 auth_cp.handle = __cpu_to_le16(conn->handle);
1801 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED,
1802 sizeof(auth_cp), &auth_cp);
Johan Hedberg127178d2010-11-18 22:22:29 +02001803 }
1804
Johan Hedberg79c6c702011-04-28 11:28:55 -07001805unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02001806 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001807}
1808
Marcel Holtmann769be972008-07-14 20:13:49 +02001809static void hci_cs_read_remote_features(struct hci_dev *hdev, __u8 status)
1810{
1811 struct hci_cp_read_remote_features *cp;
1812 struct hci_conn *conn;
1813
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001814 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann769be972008-07-14 20:13:49 +02001815
1816 if (!status)
1817 return;
1818
1819 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_REMOTE_FEATURES);
1820 if (!cp)
1821 return;
1822
1823 hci_dev_lock(hdev);
1824
1825 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1826 if (conn) {
1827 if (conn->state == BT_CONFIG) {
Johan Hedberg539c4962015-02-18 14:53:57 +02001828 hci_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001829 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02001830 }
1831 }
1832
1833 hci_dev_unlock(hdev);
1834}
1835
1836static void hci_cs_read_remote_ext_features(struct hci_dev *hdev, __u8 status)
1837{
1838 struct hci_cp_read_remote_ext_features *cp;
1839 struct hci_conn *conn;
1840
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001841 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann769be972008-07-14 20:13:49 +02001842
1843 if (!status)
1844 return;
1845
1846 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES);
1847 if (!cp)
1848 return;
1849
1850 hci_dev_lock(hdev);
1851
1852 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1853 if (conn) {
1854 if (conn->state == BT_CONFIG) {
Johan Hedberg539c4962015-02-18 14:53:57 +02001855 hci_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001856 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02001857 }
1858 }
1859
1860 hci_dev_unlock(hdev);
1861}
1862
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001863static void hci_cs_setup_sync_conn(struct hci_dev *hdev, __u8 status)
1864{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001865 struct hci_cp_setup_sync_conn *cp;
1866 struct hci_conn *acl, *sco;
1867 __u16 handle;
1868
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001869 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001870
1871 if (!status)
1872 return;
1873
1874 cp = hci_sent_cmd_data(hdev, HCI_OP_SETUP_SYNC_CONN);
1875 if (!cp)
1876 return;
1877
1878 handle = __le16_to_cpu(cp->handle);
1879
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001880 BT_DBG("%s handle 0x%4.4x", hdev->name, handle);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001881
1882 hci_dev_lock(hdev);
1883
1884 acl = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001885 if (acl) {
1886 sco = acl->link;
1887 if (sco) {
1888 sco->state = BT_CLOSED;
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001889
Johan Hedberg539c4962015-02-18 14:53:57 +02001890 hci_connect_cfm(sco, status);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001891 hci_conn_del(sco);
1892 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001893 }
1894
1895 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001896}
1897
1898static void hci_cs_sniff_mode(struct hci_dev *hdev, __u8 status)
1899{
1900 struct hci_cp_sniff_mode *cp;
1901 struct hci_conn *conn;
1902
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001903 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001904
1905 if (!status)
1906 return;
1907
1908 cp = hci_sent_cmd_data(hdev, HCI_OP_SNIFF_MODE);
1909 if (!cp)
1910 return;
1911
1912 hci_dev_lock(hdev);
1913
1914 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001915 if (conn) {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001916 clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001917
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001918 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001919 hci_sco_setup(conn, status);
1920 }
1921
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001922 hci_dev_unlock(hdev);
1923}
1924
1925static void hci_cs_exit_sniff_mode(struct hci_dev *hdev, __u8 status)
1926{
1927 struct hci_cp_exit_sniff_mode *cp;
1928 struct hci_conn *conn;
1929
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001930 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001931
1932 if (!status)
1933 return;
1934
1935 cp = hci_sent_cmd_data(hdev, HCI_OP_EXIT_SNIFF_MODE);
1936 if (!cp)
1937 return;
1938
1939 hci_dev_lock(hdev);
1940
1941 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001942 if (conn) {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001943 clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001944
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001945 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001946 hci_sco_setup(conn, status);
1947 }
1948
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001949 hci_dev_unlock(hdev);
1950}
1951
Johan Hedberg88c3df12012-02-09 14:27:38 +02001952static void hci_cs_disconnect(struct hci_dev *hdev, u8 status)
1953{
1954 struct hci_cp_disconnect *cp;
1955 struct hci_conn *conn;
1956
1957 if (!status)
1958 return;
1959
1960 cp = hci_sent_cmd_data(hdev, HCI_OP_DISCONNECT);
1961 if (!cp)
1962 return;
1963
1964 hci_dev_lock(hdev);
1965
1966 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1967 if (conn)
1968 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001969 conn->dst_type, status);
Johan Hedberg88c3df12012-02-09 14:27:38 +02001970
1971 hci_dev_unlock(hdev);
1972}
1973
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05301974static void cs_le_create_conn(struct hci_dev *hdev, bdaddr_t *peer_addr,
1975 u8 peer_addr_type, u8 own_address_type,
1976 u8 filter_policy)
1977{
1978 struct hci_conn *conn;
1979
1980 conn = hci_conn_hash_lookup_le(hdev, peer_addr,
1981 peer_addr_type);
1982 if (!conn)
1983 return;
1984
1985 /* Store the initiator and responder address information which
1986 * is needed for SMP. These values will not change during the
1987 * lifetime of the connection.
1988 */
1989 conn->init_addr_type = own_address_type;
1990 if (own_address_type == ADDR_LE_DEV_RANDOM)
1991 bacpy(&conn->init_addr, &hdev->random_addr);
1992 else
1993 bacpy(&conn->init_addr, &hdev->bdaddr);
1994
1995 conn->resp_addr_type = peer_addr_type;
1996 bacpy(&conn->resp_addr, peer_addr);
1997
1998 /* We don't want the connection attempt to stick around
1999 * indefinitely since LE doesn't have a page timeout concept
2000 * like BR/EDR. Set a timer for any connection that doesn't use
2001 * the white list for connecting.
2002 */
2003 if (filter_policy == HCI_LE_USE_PEER_ADDR)
2004 queue_delayed_work(conn->hdev->workqueue,
2005 &conn->le_conn_timeout,
2006 conn->conn_timeout);
2007}
2008
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02002009static void hci_cs_le_create_conn(struct hci_dev *hdev, u8 status)
2010{
2011 struct hci_cp_le_create_conn *cp;
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02002012
2013 BT_DBG("%s status 0x%2.2x", hdev->name, status);
2014
2015 /* All connection failure handling is taken care of by the
2016 * hci_le_conn_failed function which is triggered by the HCI
2017 * request completion callbacks used for connecting.
2018 */
2019 if (status)
2020 return;
2021
2022 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_CREATE_CONN);
2023 if (!cp)
2024 return;
2025
2026 hci_dev_lock(hdev);
2027
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05302028 cs_le_create_conn(hdev, &cp->peer_addr, cp->peer_addr_type,
2029 cp->own_address_type, cp->filter_policy);
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02002030
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02002031 hci_dev_unlock(hdev);
2032}
2033
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07002034static void hci_cs_le_read_remote_features(struct hci_dev *hdev, u8 status)
2035{
2036 struct hci_cp_le_read_remote_features *cp;
2037 struct hci_conn *conn;
2038
2039 BT_DBG("%s status 0x%2.2x", hdev->name, status);
2040
2041 if (!status)
2042 return;
2043
2044 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_READ_REMOTE_FEATURES);
2045 if (!cp)
2046 return;
2047
2048 hci_dev_lock(hdev);
2049
2050 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
2051 if (conn) {
2052 if (conn->state == BT_CONFIG) {
2053 hci_connect_cfm(conn, status);
2054 hci_conn_drop(conn);
2055 }
2056 }
2057
2058 hci_dev_unlock(hdev);
2059}
2060
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02002061static void hci_cs_le_start_enc(struct hci_dev *hdev, u8 status)
2062{
2063 struct hci_cp_le_start_enc *cp;
2064 struct hci_conn *conn;
2065
2066 BT_DBG("%s status 0x%2.2x", hdev->name, status);
2067
2068 if (!status)
2069 return;
2070
2071 hci_dev_lock(hdev);
2072
2073 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_START_ENC);
2074 if (!cp)
2075 goto unlock;
2076
2077 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
2078 if (!conn)
2079 goto unlock;
2080
2081 if (conn->state != BT_CONNECTED)
2082 goto unlock;
2083
2084 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
2085 hci_conn_drop(conn);
2086
2087unlock:
2088 hci_dev_unlock(hdev);
2089}
2090
Kuba Pawlak50fc85f2014-11-06 19:36:52 +01002091static void hci_cs_switch_role(struct hci_dev *hdev, u8 status)
2092{
2093 struct hci_cp_switch_role *cp;
2094 struct hci_conn *conn;
2095
2096 BT_DBG("%s status 0x%2.2x", hdev->name, status);
2097
2098 if (!status)
2099 return;
2100
2101 cp = hci_sent_cmd_data(hdev, HCI_OP_SWITCH_ROLE);
2102 if (!cp)
2103 return;
2104
2105 hci_dev_lock(hdev);
2106
2107 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
2108 if (conn)
2109 clear_bit(HCI_CONN_RSWITCH_PEND, &conn->flags);
2110
2111 hci_dev_unlock(hdev);
2112}
2113
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002114static void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002115{
2116 __u8 status = *((__u8 *) skb->data);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002117 struct discovery_state *discov = &hdev->discovery;
2118 struct inquiry_entry *e;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002119
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002120 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002121
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002122 hci_conn_check_pending(hdev);
Andre Guedes89352e72011-11-04 14:16:53 -03002123
2124 if (!test_and_clear_bit(HCI_INQUIRY, &hdev->flags))
2125 return;
2126
Peter Zijlstra4e857c52014-03-17 18:06:10 +01002127 smp_mb__after_atomic(); /* wake_up_bit advises about this barrier */
Andre Guedes3e13fa12013-03-27 20:04:56 -03002128 wake_up_bit(&hdev->flags, HCI_INQUIRY);
2129
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002130 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002131 return;
2132
Johan Hedberg56e5cb82011-11-08 20:40:16 +02002133 hci_dev_lock(hdev);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002134
Andre Guedes343f9352012-02-17 20:39:37 -03002135 if (discov->state != DISCOVERY_FINDING)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002136 goto unlock;
2137
2138 if (list_empty(&discov->resolve)) {
Jakub Pawlowski07d23342015-03-17 09:04:14 -07002139 /* When BR/EDR inquiry is active and no LE scanning is in
2140 * progress, then change discovery state to indicate completion.
2141 *
2142 * When running LE scanning and BR/EDR inquiry simultaneously
2143 * and the LE scan already finished, then change the discovery
2144 * state to indicate completion.
2145 */
2146 if (!hci_dev_test_flag(hdev, HCI_LE_SCAN) ||
2147 !test_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks))
2148 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002149 goto unlock;
2150 }
2151
2152 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
2153 if (e && hci_resolve_name(hdev, e) == 0) {
2154 e->name_state = NAME_PENDING;
2155 hci_discovery_set_state(hdev, DISCOVERY_RESOLVING);
2156 } else {
Jakub Pawlowski07d23342015-03-17 09:04:14 -07002157 /* When BR/EDR inquiry is active and no LE scanning is in
2158 * progress, then change discovery state to indicate completion.
2159 *
2160 * When running LE scanning and BR/EDR inquiry simultaneously
2161 * and the LE scan already finished, then change the discovery
2162 * state to indicate completion.
2163 */
2164 if (!hci_dev_test_flag(hdev, HCI_LE_SCAN) ||
2165 !test_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks))
2166 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002167 }
2168
2169unlock:
Johan Hedberg56e5cb82011-11-08 20:40:16 +02002170 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002171}
2172
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002173static void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002174{
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002175 struct inquiry_data data;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002176 struct inquiry_info *info = (void *) (skb->data + 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002177 int num_rsp = *((__u8 *) skb->data);
2178
2179 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
2180
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002181 if (!num_rsp)
2182 return;
2183
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002184 if (hci_dev_test_flag(hdev, HCI_PERIODIC_INQ))
Andre Guedes1519cc12012-03-21 00:03:38 -03002185 return;
2186
Linus Torvalds1da177e2005-04-16 15:20:36 -07002187 hci_dev_lock(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002188
Johan Hedberge17acd42011-03-30 23:57:16 +03002189 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02002190 u32 flags;
Johan Hedberg31754052012-01-04 13:39:52 +02002191
Linus Torvalds1da177e2005-04-16 15:20:36 -07002192 bacpy(&data.bdaddr, &info->bdaddr);
2193 data.pscan_rep_mode = info->pscan_rep_mode;
2194 data.pscan_period_mode = info->pscan_period_mode;
2195 data.pscan_mode = info->pscan_mode;
2196 memcpy(data.dev_class, info->dev_class, 3);
2197 data.clock_offset = info->clock_offset;
Marcel Holtmannefb25132014-12-05 13:03:34 +01002198 data.rssi = HCI_RSSI_INVALID;
Marcel Holtmann41a96212008-07-14 20:13:48 +02002199 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02002200
Marcel Holtmannaf589252014-07-01 14:11:20 +02002201 flags = hci_inquiry_cache_update(hdev, &data, false);
2202
Johan Hedberg48264f02011-11-09 13:58:58 +02002203 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Marcel Holtmannefb25132014-12-05 13:03:34 +01002204 info->dev_class, HCI_RSSI_INVALID,
2205 flags, NULL, 0, NULL, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002206 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002207
Linus Torvalds1da177e2005-04-16 15:20:36 -07002208 hci_dev_unlock(hdev);
2209}
2210
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002211static void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002212{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002213 struct hci_ev_conn_complete *ev = (void *) skb->data;
2214 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002215
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002216 BT_DBG("%s", hdev->name);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002217
Linus Torvalds1da177e2005-04-16 15:20:36 -07002218 hci_dev_lock(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002219
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002220 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann94992372009-04-19 19:30:03 +02002221 if (!conn) {
2222 if (ev->link_type != SCO_LINK)
2223 goto unlock;
2224
2225 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
2226 if (!conn)
2227 goto unlock;
2228
2229 conn->type = SCO_LINK;
2230 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002231
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002232 if (!ev->status) {
2233 conn->handle = __le16_to_cpu(ev->handle);
Marcel Holtmann769be972008-07-14 20:13:49 +02002234
2235 if (conn->type == ACL_LINK) {
2236 conn->state = BT_CONFIG;
2237 hci_conn_hold(conn);
Szymon Janca9ea3ed2012-07-19 14:46:08 +02002238
2239 if (!conn->out && !hci_conn_ssp_enabled(conn) &&
2240 !hci_find_link_key(hdev, &ev->bdaddr))
2241 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
2242 else
2243 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
Marcel Holtmann769be972008-07-14 20:13:49 +02002244 } else
2245 conn->state = BT_CONNECTED;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002246
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01002247 hci_debugfs_create_conn(conn);
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02002248 hci_conn_add_sysfs(conn);
2249
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002250 if (test_bit(HCI_AUTH, &hdev->flags))
Johan Hedberg4dae2792014-06-24 17:03:50 +03002251 set_bit(HCI_CONN_AUTH, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002252
2253 if (test_bit(HCI_ENCRYPT, &hdev->flags))
Johan Hedberg4dae2792014-06-24 17:03:50 +03002254 set_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002255
2256 /* Get remote features */
2257 if (conn->type == ACL_LINK) {
2258 struct hci_cp_read_remote_features cp;
2259 cp.handle = ev->handle;
Marcel Holtmann769be972008-07-14 20:13:49 +02002260 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_FEATURES,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002261 sizeof(cp), &cp);
Johan Hedberg22f433d2014-08-01 11:13:32 +03002262
Johan Hedberg01b1cb82015-11-16 12:52:21 +02002263 hci_req_update_scan(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002264 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002265
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002266 /* Set packet type for incoming connection */
Andrei Emeltchenkod095c1e2011-12-01 14:33:27 +02002267 if (!conn->out && hdev->hci_ver < BLUETOOTH_VER_2_0) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002268 struct hci_cp_change_conn_ptype cp;
2269 cp.handle = ev->handle;
Marcel Holtmanna8746412008-07-14 20:13:46 +02002270 cp.pkt_type = cpu_to_le16(conn->pkt_type);
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002271 hci_send_cmd(hdev, HCI_OP_CHANGE_CONN_PTYPE, sizeof(cp),
2272 &cp);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002273 }
Johan Hedberg17d5c042011-01-22 06:09:08 +02002274 } else {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002275 conn->state = BT_CLOSED;
Johan Hedberg17d5c042011-01-22 06:09:08 +02002276 if (conn->type == ACL_LINK)
Marcel Holtmann64c7b772014-02-18 14:22:20 -08002277 mgmt_connect_failed(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002278 conn->dst_type, ev->status);
Johan Hedberg17d5c042011-01-22 06:09:08 +02002279 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002280
Marcel Holtmanne73439d2010-07-26 10:06:00 -04002281 if (conn->type == ACL_LINK)
2282 hci_sco_setup(conn, ev->status);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002283
Marcel Holtmann769be972008-07-14 20:13:49 +02002284 if (ev->status) {
Johan Hedberg539c4962015-02-18 14:53:57 +02002285 hci_connect_cfm(conn, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002286 hci_conn_del(conn);
Marcel Holtmannc89b6e62009-01-15 21:57:03 +01002287 } else if (ev->link_type != ACL_LINK)
Johan Hedberg539c4962015-02-18 14:53:57 +02002288 hci_connect_cfm(conn, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002289
2290unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002291 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002292
2293 hci_conn_check_pending(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002294}
2295
Johan Hedberg70c46422014-07-09 12:59:17 +03002296static void hci_reject_conn(struct hci_dev *hdev, bdaddr_t *bdaddr)
2297{
2298 struct hci_cp_reject_conn_req cp;
2299
2300 bacpy(&cp.bdaddr, bdaddr);
2301 cp.reason = HCI_ERROR_REJ_BAD_ADDR;
2302 hci_send_cmd(hdev, HCI_OP_REJECT_CONN_REQ, sizeof(cp), &cp);
2303}
2304
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002305static void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002306{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002307 struct hci_ev_conn_request *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002308 int mask = hdev->link_mode;
Johan Hedberg70c46422014-07-09 12:59:17 +03002309 struct inquiry_entry *ie;
2310 struct hci_conn *conn;
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002311 __u8 flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002312
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03002313 BT_DBG("%s bdaddr %pMR type 0x%x", hdev->name, &ev->bdaddr,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002314 ev->link_type);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002315
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002316 mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, ev->link_type,
2317 &flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002318
Johan Hedberg70c46422014-07-09 12:59:17 +03002319 if (!(mask & HCI_LM_ACCEPT)) {
2320 hci_reject_conn(hdev, &ev->bdaddr);
2321 return;
2322 }
2323
Johan Hedberg46c4c942014-07-16 16:19:21 +03002324 if (hci_bdaddr_list_lookup(&hdev->blacklist, &ev->bdaddr,
2325 BDADDR_BREDR)) {
2326 hci_reject_conn(hdev, &ev->bdaddr);
2327 return;
2328 }
2329
Johan Hedberg6a8fc952014-12-24 20:43:11 +02002330 /* Require HCI_CONNECTABLE or a whitelist entry to accept the
2331 * connection. These features are only touched through mgmt so
2332 * only do the checks if HCI_MGMT is set.
2333 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002334 if (hci_dev_test_flag(hdev, HCI_MGMT) &&
2335 !hci_dev_test_flag(hdev, HCI_CONNECTABLE) &&
Johan Hedberg46c4c942014-07-16 16:19:21 +03002336 !hci_bdaddr_list_lookup(&hdev->whitelist, &ev->bdaddr,
2337 BDADDR_BREDR)) {
2338 hci_reject_conn(hdev, &ev->bdaddr);
2339 return;
Johan Hedberg70c46422014-07-09 12:59:17 +03002340 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002341
Johan Hedberg70c46422014-07-09 12:59:17 +03002342 /* Connection accepted */
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002343
Johan Hedberg70c46422014-07-09 12:59:17 +03002344 hci_dev_lock(hdev);
Marcel Holtmannc7bdd502008-07-14 20:13:47 +02002345
Johan Hedberg70c46422014-07-09 12:59:17 +03002346 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
2347 if (ie)
2348 memcpy(ie->data.dev_class, ev->dev_class, 3);
2349
2350 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type,
2351 &ev->bdaddr);
2352 if (!conn) {
Johan Hedberga5c4e302014-07-16 11:56:07 +03002353 conn = hci_conn_add(hdev, ev->link_type, &ev->bdaddr,
2354 HCI_ROLE_SLAVE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002355 if (!conn) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002356 bt_dev_err(hdev, "no memory for new connection");
Johan Hedberg70c46422014-07-09 12:59:17 +03002357 hci_dev_unlock(hdev);
2358 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002359 }
Johan Hedberg70c46422014-07-09 12:59:17 +03002360 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002361
Johan Hedberg70c46422014-07-09 12:59:17 +03002362 memcpy(conn->dev_class, ev->dev_class, 3);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002363
Johan Hedberg70c46422014-07-09 12:59:17 +03002364 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002365
Johan Hedberg70c46422014-07-09 12:59:17 +03002366 if (ev->link_type == ACL_LINK ||
2367 (!(flags & HCI_PROTO_DEFER) && !lmp_esco_capable(hdev))) {
2368 struct hci_cp_accept_conn_req cp;
2369 conn->state = BT_CONNECT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002370
2371 bacpy(&cp.bdaddr, &ev->bdaddr);
Johan Hedberg70c46422014-07-09 12:59:17 +03002372
2373 if (lmp_rswitch_capable(hdev) && (mask & HCI_LM_MASTER))
2374 cp.role = 0x00; /* Become master */
2375 else
2376 cp.role = 0x01; /* Remain slave */
2377
2378 hci_send_cmd(hdev, HCI_OP_ACCEPT_CONN_REQ, sizeof(cp), &cp);
2379 } else if (!(flags & HCI_PROTO_DEFER)) {
2380 struct hci_cp_accept_sync_conn_req cp;
2381 conn->state = BT_CONNECT;
2382
2383 bacpy(&cp.bdaddr, &ev->bdaddr);
2384 cp.pkt_type = cpu_to_le16(conn->pkt_type);
2385
2386 cp.tx_bandwidth = cpu_to_le32(0x00001f40);
2387 cp.rx_bandwidth = cpu_to_le32(0x00001f40);
2388 cp.max_latency = cpu_to_le16(0xffff);
2389 cp.content_format = cpu_to_le16(hdev->voice_setting);
2390 cp.retrans_effort = 0xff;
2391
2392 hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ, sizeof(cp),
2393 &cp);
2394 } else {
2395 conn->state = BT_CONNECT2;
Johan Hedberg539c4962015-02-18 14:53:57 +02002396 hci_connect_cfm(conn, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002397 }
2398}
2399
Mikel Astizf0d6a0e2012-08-09 09:52:30 +02002400static u8 hci_to_mgmt_reason(u8 err)
2401{
2402 switch (err) {
2403 case HCI_ERROR_CONNECTION_TIMEOUT:
2404 return MGMT_DEV_DISCONN_TIMEOUT;
2405 case HCI_ERROR_REMOTE_USER_TERM:
2406 case HCI_ERROR_REMOTE_LOW_RESOURCES:
2407 case HCI_ERROR_REMOTE_POWER_OFF:
2408 return MGMT_DEV_DISCONN_REMOTE;
2409 case HCI_ERROR_LOCAL_HOST_TERM:
2410 return MGMT_DEV_DISCONN_LOCAL_HOST;
2411 default:
2412 return MGMT_DEV_DISCONN_UNKNOWN;
2413 }
2414}
2415
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002416static void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002417{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002418 struct hci_ev_disconn_complete *ev = (void *) skb->data;
Szymon Janc160b9252016-07-12 02:12:16 +02002419 u8 reason;
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002420 struct hci_conn_params *params;
Marcel Holtmann04837f62006-07-03 10:02:33 +02002421 struct hci_conn *conn;
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002422 bool mgmt_connected;
Andre Guedes38462202013-11-07 17:36:10 -03002423 u8 type;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002424
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002425 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002426
Linus Torvalds1da177e2005-04-16 15:20:36 -07002427 hci_dev_lock(hdev);
2428
Marcel Holtmann04837f62006-07-03 10:02:33 +02002429 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergf7520542011-01-20 12:34:39 +02002430 if (!conn)
2431 goto unlock;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02002432
Andre Guedesabf54a52013-11-07 17:36:09 -03002433 if (ev->status) {
2434 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
2435 conn->dst_type, ev->status);
2436 goto unlock;
Johan Hedberg37d9ef72011-11-10 15:54:39 +02002437 }
Johan Hedbergf7520542011-01-20 12:34:39 +02002438
Andre Guedes38462202013-11-07 17:36:10 -03002439 conn->state = BT_CLOSED;
2440
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002441 mgmt_connected = test_and_clear_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags);
Szymon Janc160b9252016-07-12 02:12:16 +02002442
2443 if (test_bit(HCI_CONN_AUTH_FAILURE, &conn->flags))
2444 reason = MGMT_DEV_DISCONN_AUTH_FAILURE;
2445 else
2446 reason = hci_to_mgmt_reason(ev->reason);
2447
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002448 mgmt_device_disconnected(hdev, &conn->dst, conn->type, conn->dst_type,
2449 reason, mgmt_connected);
Andre Guedesabf54a52013-11-07 17:36:09 -03002450
Johan Hedberg22f433d2014-08-01 11:13:32 +03002451 if (conn->type == ACL_LINK) {
2452 if (test_bit(HCI_CONN_FLUSH_KEY, &conn->flags))
2453 hci_remove_link_key(hdev, &conn->dst);
2454
Johan Hedberg01b1cb82015-11-16 12:52:21 +02002455 hci_req_update_scan(hdev);
Johan Hedberg22f433d2014-08-01 11:13:32 +03002456 }
Johan Hedberg22102462013-10-05 12:01:06 +02002457
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002458 params = hci_conn_params_lookup(hdev, &conn->dst, conn->dst_type);
2459 if (params) {
2460 switch (params->auto_connect) {
2461 case HCI_AUTO_CONN_LINK_LOSS:
2462 if (ev->reason != HCI_ERROR_CONNECTION_TIMEOUT)
2463 break;
2464 /* Fall through */
2465
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02002466 case HCI_AUTO_CONN_DIRECT:
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002467 case HCI_AUTO_CONN_ALWAYS:
Johan Hedberg418025d2014-07-04 12:37:24 +03002468 list_del_init(&params->action);
2469 list_add(&params->action, &hdev->pend_le_conns);
2470 hci_update_background_scan(hdev);
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002471 break;
2472
2473 default:
2474 break;
2475 }
2476 }
2477
Andre Guedes38462202013-11-07 17:36:10 -03002478 type = conn->type;
Johan Hedberg22102462013-10-05 12:01:06 +02002479
Johan Hedberg3a6d5762015-02-18 14:53:58 +02002480 hci_disconn_cfm(conn, ev->reason);
Andre Guedes38462202013-11-07 17:36:10 -03002481 hci_conn_del(conn);
2482
2483 /* Re-enable advertising if necessary, since it might
2484 * have been disabled by the connection. From the
2485 * HCI_LE_Set_Advertise_Enable command description in
2486 * the core specification (v4.0):
2487 * "The Controller shall continue advertising until the Host
2488 * issues an LE_Set_Advertise_Enable command with
2489 * Advertising_Enable set to 0x00 (Advertising is disabled)
2490 * or until a connection is created or until the Advertising
2491 * is timed out due to Directed Advertising."
2492 */
2493 if (type == LE_LINK)
Johan Hedbergf2252572015-11-18 12:49:20 +02002494 hci_req_reenable_advertising(hdev);
Johan Hedbergf7520542011-01-20 12:34:39 +02002495
2496unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002497 hci_dev_unlock(hdev);
2498}
2499
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002500static void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002501{
2502 struct hci_ev_auth_complete *ev = (void *) skb->data;
2503 struct hci_conn *conn;
2504
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002505 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002506
2507 hci_dev_lock(hdev);
2508
2509 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002510 if (!conn)
2511 goto unlock;
2512
2513 if (!ev->status) {
Szymon Janc160b9252016-07-12 02:12:16 +02002514 clear_bit(HCI_CONN_AUTH_FAILURE, &conn->flags);
2515
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002516 if (!hci_conn_ssp_enabled(conn) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03002517 test_bit(HCI_CONN_REAUTH_PEND, &conn->flags)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002518 bt_dev_info(hdev, "re-auth of legacy device is not possible.");
Johan Hedberg2a611692011-02-19 12:06:00 -03002519 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002520 set_bit(HCI_CONN_AUTH, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002521 conn->sec_level = conn->pending_sec_level;
Johan Hedberg2a611692011-02-19 12:06:00 -03002522 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002523 } else {
Szymon Janc160b9252016-07-12 02:12:16 +02002524 if (ev->status == HCI_ERROR_PIN_OR_KEY_MISSING)
2525 set_bit(HCI_CONN_AUTH_FAILURE, &conn->flags);
2526
Johan Hedberge1e930f2014-09-08 17:09:49 -07002527 mgmt_auth_failed(conn, ev->status);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002528 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002529
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002530 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
2531 clear_bit(HCI_CONN_REAUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002532
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002533 if (conn->state == BT_CONFIG) {
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002534 if (!ev->status && hci_conn_ssp_enabled(conn)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002535 struct hci_cp_set_conn_encrypt cp;
2536 cp.handle = ev->handle;
2537 cp.encrypt = 0x01;
2538 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002539 &cp);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002540 } else {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002541 conn->state = BT_CONNECTED;
Johan Hedberg539c4962015-02-18 14:53:57 +02002542 hci_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002543 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002544 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002545 } else {
2546 hci_auth_cfm(conn, ev->status);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002547
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002548 hci_conn_hold(conn);
2549 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02002550 hci_conn_drop(conn);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002551 }
2552
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002553 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002554 if (!ev->status) {
2555 struct hci_cp_set_conn_encrypt cp;
2556 cp.handle = ev->handle;
2557 cp.encrypt = 0x01;
2558 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002559 &cp);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002560 } else {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002561 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002562 hci_encrypt_cfm(conn, ev->status, 0x00);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002563 }
2564 }
2565
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002566unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002567 hci_dev_unlock(hdev);
2568}
2569
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002570static void hci_remote_name_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002571{
Johan Hedberg127178d2010-11-18 22:22:29 +02002572 struct hci_ev_remote_name *ev = (void *) skb->data;
2573 struct hci_conn *conn;
2574
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002575 BT_DBG("%s", hdev->name);
2576
2577 hci_conn_check_pending(hdev);
Johan Hedberg127178d2010-11-18 22:22:29 +02002578
2579 hci_dev_lock(hdev);
2580
2581 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002582
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002583 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedbergb644ba32012-01-17 21:48:47 +02002584 goto check_auth;
2585
2586 if (ev->status == 0)
2587 hci_check_pending_name(hdev, conn, &ev->bdaddr, ev->name,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002588 strnlen(ev->name, HCI_MAX_NAME_LENGTH));
Johan Hedbergb644ba32012-01-17 21:48:47 +02002589 else
2590 hci_check_pending_name(hdev, conn, &ev->bdaddr, NULL, 0);
2591
2592check_auth:
Johan Hedberg79c6c702011-04-28 11:28:55 -07002593 if (!conn)
2594 goto unlock;
2595
2596 if (!hci_outgoing_auth_needed(hdev, conn))
2597 goto unlock;
2598
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002599 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002600 struct hci_cp_auth_requested cp;
Johan Hedberg977f8fc2014-07-17 15:35:39 +03002601
2602 set_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags);
2603
Johan Hedberg127178d2010-11-18 22:22:29 +02002604 cp.handle = __cpu_to_le16(conn->handle);
2605 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED, sizeof(cp), &cp);
2606 }
2607
Johan Hedberg79c6c702011-04-28 11:28:55 -07002608unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02002609 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002610}
2611
Johan Hedberg821f3762015-06-11 13:52:29 +03002612static void read_enc_key_size_complete(struct hci_dev *hdev, u8 status,
2613 u16 opcode, struct sk_buff *skb)
2614{
2615 const struct hci_rp_read_enc_key_size *rp;
2616 struct hci_conn *conn;
2617 u16 handle;
2618
2619 BT_DBG("%s status 0x%02x", hdev->name, status);
2620
2621 if (!skb || skb->len < sizeof(*rp)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002622 bt_dev_err(hdev, "invalid read key size response");
Johan Hedberg821f3762015-06-11 13:52:29 +03002623 return;
2624 }
2625
2626 rp = (void *)skb->data;
2627 handle = le16_to_cpu(rp->handle);
2628
2629 hci_dev_lock(hdev);
2630
2631 conn = hci_conn_hash_lookup_handle(hdev, handle);
2632 if (!conn)
2633 goto unlock;
2634
2635 /* If we fail to read the encryption key size, assume maximum
2636 * (which is the same we do also when this HCI command isn't
2637 * supported.
2638 */
2639 if (rp->status) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002640 bt_dev_err(hdev, "failed to read key size for handle %u",
2641 handle);
Johan Hedberg821f3762015-06-11 13:52:29 +03002642 conn->enc_key_size = HCI_LINK_KEY_SIZE;
2643 } else {
2644 conn->enc_key_size = rp->key_size;
2645 }
2646
2647 if (conn->state == BT_CONFIG) {
2648 conn->state = BT_CONNECTED;
2649 hci_connect_cfm(conn, 0);
2650 hci_conn_drop(conn);
2651 } else {
2652 u8 encrypt;
2653
2654 if (!test_bit(HCI_CONN_ENCRYPT, &conn->flags))
2655 encrypt = 0x00;
Johan Hedberg5d667ef2015-06-12 13:04:47 +03002656 else if (test_bit(HCI_CONN_AES_CCM, &conn->flags))
Johan Hedberg821f3762015-06-11 13:52:29 +03002657 encrypt = 0x02;
2658 else
2659 encrypt = 0x01;
2660
2661 hci_encrypt_cfm(conn, 0, encrypt);
2662 }
2663
2664unlock:
2665 hci_dev_unlock(hdev);
2666}
2667
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002668static void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002669{
2670 struct hci_ev_encrypt_change *ev = (void *) skb->data;
2671 struct hci_conn *conn;
2672
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002673 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002674
2675 hci_dev_lock(hdev);
2676
2677 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002678 if (!conn)
2679 goto unlock;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002680
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002681 if (!ev->status) {
2682 if (ev->encrypt) {
2683 /* Encryption implies authentication */
Johan Hedberg4dae2792014-06-24 17:03:50 +03002684 set_bit(HCI_CONN_AUTH, &conn->flags);
2685 set_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002686 conn->sec_level = conn->pending_sec_level;
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002687
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002688 /* P-256 authentication key implies FIPS */
2689 if (conn->key_type == HCI_LK_AUTH_COMBINATION_P256)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002690 set_bit(HCI_CONN_FIPS, &conn->flags);
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002691
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002692 if ((conn->type == ACL_LINK && ev->encrypt == 0x02) ||
2693 conn->type == LE_LINK)
2694 set_bit(HCI_CONN_AES_CCM, &conn->flags);
2695 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002696 clear_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002697 clear_bit(HCI_CONN_AES_CCM, &conn->flags);
2698 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002699 }
2700
Johan Hedberg7ed3fa22014-09-10 22:16:35 -07002701 /* We should disregard the current RPA and generate a new one
2702 * whenever the encryption procedure fails.
2703 */
2704 if (ev->status && conn->type == LE_LINK)
Marcel Holtmanna1536da2015-03-13 02:11:01 -07002705 hci_dev_set_flag(hdev, HCI_RPA_EXPIRED);
Johan Hedberg7ed3fa22014-09-10 22:16:35 -07002706
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002707 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
2708
2709 if (ev->status && conn->state == BT_CONNECTED) {
Szymon Janc160b9252016-07-12 02:12:16 +02002710 if (ev->status == HCI_ERROR_PIN_OR_KEY_MISSING)
2711 set_bit(HCI_CONN_AUTH_FAILURE, &conn->flags);
2712
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002713 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
2714 hci_conn_drop(conn);
2715 goto unlock;
2716 }
2717
Johan Hedberg035ad622015-06-11 13:52:28 +03002718 /* In Secure Connections Only mode, do not allow any connections
2719 * that are not encrypted with AES-CCM using a P-256 authenticated
2720 * combination key.
2721 */
2722 if (hci_dev_test_flag(hdev, HCI_SC_ONLY) &&
2723 (!test_bit(HCI_CONN_AES_CCM, &conn->flags) ||
2724 conn->key_type != HCI_LK_AUTH_COMBINATION_P256)) {
2725 hci_connect_cfm(conn, HCI_ERROR_AUTH_FAILURE);
2726 hci_conn_drop(conn);
2727 goto unlock;
2728 }
2729
Johan Hedberg821f3762015-06-11 13:52:29 +03002730 /* Try reading the encryption key size for encrypted ACL links */
2731 if (!ev->status && ev->encrypt && conn->type == ACL_LINK) {
2732 struct hci_cp_read_enc_key_size cp;
2733 struct hci_request req;
2734
2735 /* Only send HCI_Read_Encryption_Key_Size if the
2736 * controller really supports it. If it doesn't, assume
2737 * the default size (16).
2738 */
2739 if (!(hdev->commands[20] & 0x10)) {
2740 conn->enc_key_size = HCI_LINK_KEY_SIZE;
2741 goto notify;
2742 }
2743
2744 hci_req_init(&req, hdev);
2745
2746 cp.handle = cpu_to_le16(conn->handle);
2747 hci_req_add(&req, HCI_OP_READ_ENC_KEY_SIZE, sizeof(cp), &cp);
2748
2749 if (hci_req_run_skb(&req, read_enc_key_size_complete)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002750 bt_dev_err(hdev, "sending read key size failed");
Johan Hedberg821f3762015-06-11 13:52:29 +03002751 conn->enc_key_size = HCI_LINK_KEY_SIZE;
2752 goto notify;
2753 }
2754
2755 goto unlock;
2756 }
2757
2758notify:
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002759 if (conn->state == BT_CONFIG) {
2760 if (!ev->status)
2761 conn->state = BT_CONNECTED;
2762
Johan Hedberg539c4962015-02-18 14:53:57 +02002763 hci_connect_cfm(conn, ev->status);
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002764 hci_conn_drop(conn);
2765 } else
2766 hci_encrypt_cfm(conn, ev->status, ev->encrypt);
2767
Gustavo Padovana7d77232012-05-13 03:20:07 -03002768unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002769 hci_dev_unlock(hdev);
2770}
2771
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002772static void hci_change_link_key_complete_evt(struct hci_dev *hdev,
2773 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002774{
2775 struct hci_ev_change_link_key_complete *ev = (void *) skb->data;
2776 struct hci_conn *conn;
2777
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002778 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002779
2780 hci_dev_lock(hdev);
2781
2782 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
2783 if (conn) {
2784 if (!ev->status)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002785 set_bit(HCI_CONN_SECURE, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002786
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002787 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002788
2789 hci_key_change_cfm(conn, ev->status);
2790 }
2791
2792 hci_dev_unlock(hdev);
2793}
2794
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002795static void hci_remote_features_evt(struct hci_dev *hdev,
2796 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002797{
2798 struct hci_ev_remote_features *ev = (void *) skb->data;
2799 struct hci_conn *conn;
2800
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002801 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002802
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002803 hci_dev_lock(hdev);
2804
2805 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02002806 if (!conn)
2807 goto unlock;
Marcel Holtmann769be972008-07-14 20:13:49 +02002808
Johan Hedbergccd556f2010-11-10 17:11:51 +02002809 if (!ev->status)
Johan Hedbergcad718e2013-04-17 15:00:51 +03002810 memcpy(conn->features[0], ev->features, 8);
Johan Hedbergccd556f2010-11-10 17:11:51 +02002811
2812 if (conn->state != BT_CONFIG)
2813 goto unlock;
2814
Szymon Jancac363cf2015-01-29 16:36:59 +01002815 if (!ev->status && lmp_ext_feat_capable(hdev) &&
2816 lmp_ext_feat_capable(conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02002817 struct hci_cp_read_remote_ext_features cp;
2818 cp.handle = ev->handle;
2819 cp.page = 0x01;
2820 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002821 sizeof(cp), &cp);
Johan Hedberg392599b2010-11-18 22:22:28 +02002822 goto unlock;
2823 }
2824
Johan Hedberg671267b2012-05-12 16:11:50 -03002825 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002826 struct hci_cp_remote_name_req cp;
2827 memset(&cp, 0, sizeof(cp));
2828 bacpy(&cp.bdaddr, &conn->dst);
2829 cp.pscan_rep_mode = 0x02;
2830 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002831 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00002832 mgmt_device_connected(hdev, conn, 0, NULL, 0);
Johan Hedberg392599b2010-11-18 22:22:28 +02002833
Johan Hedberg127178d2010-11-18 22:22:29 +02002834 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02002835 conn->state = BT_CONNECTED;
Johan Hedberg539c4962015-02-18 14:53:57 +02002836 hci_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002837 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02002838 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002839
Johan Hedbergccd556f2010-11-10 17:11:51 +02002840unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002841 hci_dev_unlock(hdev);
2842}
2843
Johan Hedberge62144872015-04-02 13:41:08 +03002844static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb,
2845 u16 *opcode, u8 *status,
2846 hci_req_complete_t *req_complete,
2847 hci_req_complete_skb_t *req_complete_skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002848{
2849 struct hci_ev_cmd_complete *ev = (void *) skb->data;
Johan Hedberge62144872015-04-02 13:41:08 +03002850
2851 *opcode = __le16_to_cpu(ev->opcode);
2852 *status = skb->data[sizeof(*ev)];
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002853
2854 skb_pull(skb, sizeof(*ev));
2855
Johan Hedberge62144872015-04-02 13:41:08 +03002856 switch (*opcode) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002857 case HCI_OP_INQUIRY_CANCEL:
2858 hci_cc_inquiry_cancel(hdev, skb);
2859 break;
2860
Andre Guedes4d934832012-03-21 00:03:35 -03002861 case HCI_OP_PERIODIC_INQ:
2862 hci_cc_periodic_inq(hdev, skb);
2863 break;
2864
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002865 case HCI_OP_EXIT_PERIODIC_INQ:
2866 hci_cc_exit_periodic_inq(hdev, skb);
2867 break;
2868
2869 case HCI_OP_REMOTE_NAME_REQ_CANCEL:
2870 hci_cc_remote_name_req_cancel(hdev, skb);
2871 break;
2872
2873 case HCI_OP_ROLE_DISCOVERY:
2874 hci_cc_role_discovery(hdev, skb);
2875 break;
2876
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002877 case HCI_OP_READ_LINK_POLICY:
2878 hci_cc_read_link_policy(hdev, skb);
2879 break;
2880
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002881 case HCI_OP_WRITE_LINK_POLICY:
2882 hci_cc_write_link_policy(hdev, skb);
2883 break;
2884
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002885 case HCI_OP_READ_DEF_LINK_POLICY:
2886 hci_cc_read_def_link_policy(hdev, skb);
2887 break;
2888
2889 case HCI_OP_WRITE_DEF_LINK_POLICY:
2890 hci_cc_write_def_link_policy(hdev, skb);
2891 break;
2892
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002893 case HCI_OP_RESET:
2894 hci_cc_reset(hdev, skb);
2895 break;
2896
Marcel Holtmannc2f0f972015-01-12 09:21:25 -08002897 case HCI_OP_READ_STORED_LINK_KEY:
2898 hci_cc_read_stored_link_key(hdev, skb);
2899 break;
2900
Marcel Holtmanna93661202015-01-12 09:21:28 -08002901 case HCI_OP_DELETE_STORED_LINK_KEY:
2902 hci_cc_delete_stored_link_key(hdev, skb);
2903 break;
2904
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002905 case HCI_OP_WRITE_LOCAL_NAME:
2906 hci_cc_write_local_name(hdev, skb);
2907 break;
2908
2909 case HCI_OP_READ_LOCAL_NAME:
2910 hci_cc_read_local_name(hdev, skb);
2911 break;
2912
2913 case HCI_OP_WRITE_AUTH_ENABLE:
2914 hci_cc_write_auth_enable(hdev, skb);
2915 break;
2916
2917 case HCI_OP_WRITE_ENCRYPT_MODE:
2918 hci_cc_write_encrypt_mode(hdev, skb);
2919 break;
2920
2921 case HCI_OP_WRITE_SCAN_ENABLE:
2922 hci_cc_write_scan_enable(hdev, skb);
2923 break;
2924
2925 case HCI_OP_READ_CLASS_OF_DEV:
2926 hci_cc_read_class_of_dev(hdev, skb);
2927 break;
2928
2929 case HCI_OP_WRITE_CLASS_OF_DEV:
2930 hci_cc_write_class_of_dev(hdev, skb);
2931 break;
2932
2933 case HCI_OP_READ_VOICE_SETTING:
2934 hci_cc_read_voice_setting(hdev, skb);
2935 break;
2936
2937 case HCI_OP_WRITE_VOICE_SETTING:
2938 hci_cc_write_voice_setting(hdev, skb);
2939 break;
2940
Marcel Holtmannb4cb9fb2013-10-14 13:56:16 -07002941 case HCI_OP_READ_NUM_SUPPORTED_IAC:
2942 hci_cc_read_num_supported_iac(hdev, skb);
2943 break;
2944
Marcel Holtmann333140b2008-07-14 20:13:48 +02002945 case HCI_OP_WRITE_SSP_MODE:
2946 hci_cc_write_ssp_mode(hdev, skb);
2947 break;
2948
Marcel Holtmanneac83dc2014-01-10 02:07:23 -08002949 case HCI_OP_WRITE_SC_SUPPORT:
2950 hci_cc_write_sc_support(hdev, skb);
2951 break;
2952
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002953 case HCI_OP_READ_LOCAL_VERSION:
2954 hci_cc_read_local_version(hdev, skb);
2955 break;
2956
2957 case HCI_OP_READ_LOCAL_COMMANDS:
2958 hci_cc_read_local_commands(hdev, skb);
2959 break;
2960
2961 case HCI_OP_READ_LOCAL_FEATURES:
2962 hci_cc_read_local_features(hdev, skb);
2963 break;
2964
Andre Guedes971e3a42011-06-30 19:20:52 -03002965 case HCI_OP_READ_LOCAL_EXT_FEATURES:
2966 hci_cc_read_local_ext_features(hdev, skb);
2967 break;
2968
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002969 case HCI_OP_READ_BUFFER_SIZE:
2970 hci_cc_read_buffer_size(hdev, skb);
2971 break;
2972
2973 case HCI_OP_READ_BD_ADDR:
2974 hci_cc_read_bd_addr(hdev, skb);
2975 break;
2976
Johan Hedbergf332ec62013-03-15 17:07:11 -05002977 case HCI_OP_READ_PAGE_SCAN_ACTIVITY:
2978 hci_cc_read_page_scan_activity(hdev, skb);
2979 break;
2980
Johan Hedberg4a3ee762013-03-15 17:07:12 -05002981 case HCI_OP_WRITE_PAGE_SCAN_ACTIVITY:
2982 hci_cc_write_page_scan_activity(hdev, skb);
2983 break;
2984
Johan Hedbergf332ec62013-03-15 17:07:11 -05002985 case HCI_OP_READ_PAGE_SCAN_TYPE:
2986 hci_cc_read_page_scan_type(hdev, skb);
2987 break;
2988
Johan Hedberg4a3ee762013-03-15 17:07:12 -05002989 case HCI_OP_WRITE_PAGE_SCAN_TYPE:
2990 hci_cc_write_page_scan_type(hdev, skb);
2991 break;
2992
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +02002993 case HCI_OP_READ_DATA_BLOCK_SIZE:
2994 hci_cc_read_data_block_size(hdev, skb);
2995 break;
2996
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +02002997 case HCI_OP_READ_FLOW_CONTROL_MODE:
2998 hci_cc_read_flow_control_mode(hdev, skb);
2999 break;
3000
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +03003001 case HCI_OP_READ_LOCAL_AMP_INFO:
3002 hci_cc_read_local_amp_info(hdev, skb);
3003 break;
3004
Johan Hedberg33f35722014-06-28 17:54:06 +03003005 case HCI_OP_READ_CLOCK:
3006 hci_cc_read_clock(hdev, skb);
3007 break;
3008
Johan Hedbergd5859e22011-01-25 01:19:58 +02003009 case HCI_OP_READ_INQ_RSP_TX_POWER:
3010 hci_cc_read_inq_rsp_tx_power(hdev, skb);
3011 break;
3012
Johan Hedberg980e1a52011-01-22 06:10:07 +02003013 case HCI_OP_PIN_CODE_REPLY:
3014 hci_cc_pin_code_reply(hdev, skb);
3015 break;
3016
3017 case HCI_OP_PIN_CODE_NEG_REPLY:
3018 hci_cc_pin_code_neg_reply(hdev, skb);
3019 break;
3020
Szymon Jancc35938b2011-03-22 13:12:21 +01003021 case HCI_OP_READ_LOCAL_OOB_DATA:
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08003022 hci_cc_read_local_oob_data(hdev, skb);
3023 break;
3024
3025 case HCI_OP_READ_LOCAL_OOB_EXT_DATA:
3026 hci_cc_read_local_oob_ext_data(hdev, skb);
Szymon Jancc35938b2011-03-22 13:12:21 +01003027 break;
3028
Ville Tervo6ed58ec2011-02-10 22:38:48 -03003029 case HCI_OP_LE_READ_BUFFER_SIZE:
3030 hci_cc_le_read_buffer_size(hdev, skb);
3031 break;
3032
Johan Hedberg60e77322013-01-22 14:01:59 +02003033 case HCI_OP_LE_READ_LOCAL_FEATURES:
3034 hci_cc_le_read_local_features(hdev, skb);
3035 break;
3036
Johan Hedberg8fa19092012-10-19 20:57:49 +03003037 case HCI_OP_LE_READ_ADV_TX_POWER:
3038 hci_cc_le_read_adv_tx_power(hdev, skb);
3039 break;
3040
Johan Hedberga5c29682011-02-19 12:05:57 -03003041 case HCI_OP_USER_CONFIRM_REPLY:
3042 hci_cc_user_confirm_reply(hdev, skb);
3043 break;
3044
3045 case HCI_OP_USER_CONFIRM_NEG_REPLY:
3046 hci_cc_user_confirm_neg_reply(hdev, skb);
3047 break;
3048
Brian Gix1143d452011-11-23 08:28:34 -08003049 case HCI_OP_USER_PASSKEY_REPLY:
3050 hci_cc_user_passkey_reply(hdev, skb);
3051 break;
3052
3053 case HCI_OP_USER_PASSKEY_NEG_REPLY:
3054 hci_cc_user_passkey_neg_reply(hdev, skb);
Szymon Janc16cde992012-04-13 12:32:42 +02003055 break;
Andre Guedes07f7fa52011-12-02 21:13:31 +09003056
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08003057 case HCI_OP_LE_SET_RANDOM_ADDR:
3058 hci_cc_le_set_random_addr(hdev, skb);
3059 break;
3060
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01003061 case HCI_OP_LE_SET_ADV_ENABLE:
3062 hci_cc_le_set_adv_enable(hdev, skb);
3063 break;
3064
Marcel Holtmann533553f2014-03-21 12:18:10 -07003065 case HCI_OP_LE_SET_SCAN_PARAM:
3066 hci_cc_le_set_scan_param(hdev, skb);
3067 break;
3068
Andre Guedeseb9d91f2011-05-26 16:23:52 -03003069 case HCI_OP_LE_SET_SCAN_ENABLE:
3070 hci_cc_le_set_scan_enable(hdev, skb);
3071 break;
3072
Johan Hedbergcf1d0812013-01-22 14:02:00 +02003073 case HCI_OP_LE_READ_WHITE_LIST_SIZE:
3074 hci_cc_le_read_white_list_size(hdev, skb);
3075 break;
3076
Marcel Holtmann0f36b582014-02-27 20:37:31 -08003077 case HCI_OP_LE_CLEAR_WHITE_LIST:
3078 hci_cc_le_clear_white_list(hdev, skb);
3079 break;
3080
3081 case HCI_OP_LE_ADD_TO_WHITE_LIST:
3082 hci_cc_le_add_to_white_list(hdev, skb);
3083 break;
3084
3085 case HCI_OP_LE_DEL_FROM_WHITE_LIST:
3086 hci_cc_le_del_from_white_list(hdev, skb);
3087 break;
3088
Johan Hedberg9b008c02013-01-22 14:02:01 +02003089 case HCI_OP_LE_READ_SUPPORTED_STATES:
3090 hci_cc_le_read_supported_states(hdev, skb);
3091 break;
3092
Marcel Holtmanna8e1bfa2014-12-20 16:28:40 +01003093 case HCI_OP_LE_READ_DEF_DATA_LEN:
3094 hci_cc_le_read_def_data_len(hdev, skb);
3095 break;
3096
3097 case HCI_OP_LE_WRITE_DEF_DATA_LEN:
3098 hci_cc_le_write_def_data_len(hdev, skb);
3099 break;
3100
Ankit Navik545f2592018-06-29 12:13:20 +05303101 case HCI_OP_LE_CLEAR_RESOLV_LIST:
3102 hci_cc_le_clear_resolv_list(hdev, skb);
3103 break;
3104
Ankit Navikcfdb0c22018-06-29 12:12:50 +05303105 case HCI_OP_LE_READ_RESOLV_LIST_SIZE:
3106 hci_cc_le_read_resolv_list_size(hdev, skb);
3107 break;
3108
Marcel Holtmanna8e1bfa2014-12-20 16:28:40 +01003109 case HCI_OP_LE_READ_MAX_DATA_LEN:
3110 hci_cc_le_read_max_data_len(hdev, skb);
3111 break;
3112
Andre Guedesf9b49302011-06-30 19:20:53 -03003113 case HCI_OP_WRITE_LE_HOST_SUPPORTED:
3114 hci_cc_write_le_host_supported(hdev, skb);
3115 break;
3116
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02003117 case HCI_OP_LE_SET_ADV_PARAM:
3118 hci_cc_set_adv_param(hdev, skb);
3119 break;
3120
Andrzej Kaczmarek5ae76a92014-05-08 15:32:08 +02003121 case HCI_OP_READ_RSSI:
3122 hci_cc_read_rssi(hdev, skb);
3123 break;
3124
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02003125 case HCI_OP_READ_TX_POWER:
3126 hci_cc_read_tx_power(hdev, skb);
3127 break;
3128
Marcel Holtmannc50b33c2015-01-31 15:07:52 -08003129 case HCI_OP_WRITE_SSP_DEBUG_MODE:
3130 hci_cc_write_ssp_debug_mode(hdev, skb);
3131 break;
3132
Jaganath Kanakkasserya2344b92018-07-06 17:05:28 +05303133 case HCI_OP_LE_SET_EXT_SCAN_PARAMS:
3134 hci_cc_le_set_ext_scan_param(hdev, skb);
3135 break;
3136
3137 case HCI_OP_LE_SET_EXT_SCAN_ENABLE:
3138 hci_cc_le_set_ext_scan_enable(hdev, skb);
3139 break;
3140
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003141 default:
Johan Hedberge62144872015-04-02 13:41:08 +03003142 BT_DBG("%s opcode 0x%4.4x", hdev->name, *opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003143 break;
3144 }
3145
Johan Hedberge62144872015-04-02 13:41:08 +03003146 if (*opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02003147 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02003148
Johan Hedberg600b2152015-03-28 11:17:36 +02003149 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags))
3150 atomic_set(&hdev->cmd_cnt, 1);
3151
Johan Hedberge62144872015-04-02 13:41:08 +03003152 hci_req_cmd_complete(hdev, *opcode, *status, req_complete,
3153 req_complete_skb);
Johan Hedberg9238f362013-03-05 20:37:48 +02003154
Johan Hedberg600b2152015-03-28 11:17:36 +02003155 if (atomic_read(&hdev->cmd_cnt) && !skb_queue_empty(&hdev->cmd_q))
3156 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003157}
3158
Johan Hedberge62144872015-04-02 13:41:08 +03003159static void hci_cmd_status_evt(struct hci_dev *hdev, struct sk_buff *skb,
3160 u16 *opcode, u8 *status,
3161 hci_req_complete_t *req_complete,
3162 hci_req_complete_skb_t *req_complete_skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003163{
3164 struct hci_ev_cmd_status *ev = (void *) skb->data;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003165
3166 skb_pull(skb, sizeof(*ev));
3167
Johan Hedberge62144872015-04-02 13:41:08 +03003168 *opcode = __le16_to_cpu(ev->opcode);
3169 *status = ev->status;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003170
Johan Hedberge62144872015-04-02 13:41:08 +03003171 switch (*opcode) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003172 case HCI_OP_INQUIRY:
3173 hci_cs_inquiry(hdev, ev->status);
3174 break;
3175
3176 case HCI_OP_CREATE_CONN:
3177 hci_cs_create_conn(hdev, ev->status);
3178 break;
3179
Kuba Pawlak9645c762014-11-06 19:36:53 +01003180 case HCI_OP_DISCONNECT:
3181 hci_cs_disconnect(hdev, ev->status);
3182 break;
3183
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003184 case HCI_OP_ADD_SCO:
3185 hci_cs_add_sco(hdev, ev->status);
3186 break;
3187
Marcel Holtmannf8558552008-07-14 20:13:49 +02003188 case HCI_OP_AUTH_REQUESTED:
3189 hci_cs_auth_requested(hdev, ev->status);
3190 break;
3191
3192 case HCI_OP_SET_CONN_ENCRYPT:
3193 hci_cs_set_conn_encrypt(hdev, ev->status);
3194 break;
3195
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003196 case HCI_OP_REMOTE_NAME_REQ:
3197 hci_cs_remote_name_req(hdev, ev->status);
3198 break;
3199
Marcel Holtmann769be972008-07-14 20:13:49 +02003200 case HCI_OP_READ_REMOTE_FEATURES:
3201 hci_cs_read_remote_features(hdev, ev->status);
3202 break;
3203
3204 case HCI_OP_READ_REMOTE_EXT_FEATURES:
3205 hci_cs_read_remote_ext_features(hdev, ev->status);
3206 break;
3207
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003208 case HCI_OP_SETUP_SYNC_CONN:
3209 hci_cs_setup_sync_conn(hdev, ev->status);
3210 break;
3211
3212 case HCI_OP_SNIFF_MODE:
3213 hci_cs_sniff_mode(hdev, ev->status);
3214 break;
3215
3216 case HCI_OP_EXIT_SNIFF_MODE:
3217 hci_cs_exit_sniff_mode(hdev, ev->status);
3218 break;
3219
Kuba Pawlak50fc85f2014-11-06 19:36:52 +01003220 case HCI_OP_SWITCH_ROLE:
3221 hci_cs_switch_role(hdev, ev->status);
3222 break;
3223
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02003224 case HCI_OP_LE_CREATE_CONN:
3225 hci_cs_le_create_conn(hdev, ev->status);
3226 break;
3227
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07003228 case HCI_OP_LE_READ_REMOTE_FEATURES:
3229 hci_cs_le_read_remote_features(hdev, ev->status);
3230 break;
3231
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02003232 case HCI_OP_LE_START_ENC:
3233 hci_cs_le_start_enc(hdev, ev->status);
3234 break;
3235
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003236 default:
Johan Hedberge62144872015-04-02 13:41:08 +03003237 BT_DBG("%s opcode 0x%4.4x", hdev->name, *opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003238 break;
3239 }
3240
Johan Hedberge62144872015-04-02 13:41:08 +03003241 if (*opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02003242 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02003243
Johan Hedberg600b2152015-03-28 11:17:36 +02003244 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags))
3245 atomic_set(&hdev->cmd_cnt, 1);
3246
Johan Hedberg444c6dd2015-04-02 13:41:07 +03003247 /* Indicate request completion if the command failed. Also, if
3248 * we're not waiting for a special event and we get a success
3249 * command status we should try to flag the request as completed
3250 * (since for this kind of commands there will not be a command
3251 * complete event).
3252 */
Johan Hedberg02350a72013-04-03 21:50:29 +03003253 if (ev->status ||
Marcel Holtmann242c0eb2015-10-25 22:45:53 +01003254 (hdev->sent_cmd && !bt_cb(hdev->sent_cmd)->hci.req_event))
Johan Hedberge62144872015-04-02 13:41:08 +03003255 hci_req_cmd_complete(hdev, *opcode, ev->status, req_complete,
3256 req_complete_skb);
Johan Hedberg9238f362013-03-05 20:37:48 +02003257
Johan Hedberg600b2152015-03-28 11:17:36 +02003258 if (atomic_read(&hdev->cmd_cnt) && !skb_queue_empty(&hdev->cmd_q))
3259 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003260}
3261
Marcel Holtmann24dfa342014-11-02 02:56:41 +01003262static void hci_hardware_error_evt(struct hci_dev *hdev, struct sk_buff *skb)
3263{
3264 struct hci_ev_hardware_error *ev = (void *) skb->data;
3265
Marcel Holtmannc7741d12015-01-28 11:09:55 -08003266 hdev->hw_error_code = ev->code;
3267
3268 queue_work(hdev->req_workqueue, &hdev->error_reset);
Marcel Holtmann24dfa342014-11-02 02:56:41 +01003269}
3270
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003271static void hci_role_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003272{
3273 struct hci_ev_role_change *ev = (void *) skb->data;
3274 struct hci_conn *conn;
3275
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003276 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003277
3278 hci_dev_lock(hdev);
3279
3280 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3281 if (conn) {
Johan Hedberg40bef302014-07-16 11:42:27 +03003282 if (!ev->status)
3283 conn->role = ev->role;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003284
Johan Hedberg51a8efd2012-01-16 06:10:31 +02003285 clear_bit(HCI_CONN_RSWITCH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003286
3287 hci_role_switch_cfm(conn, ev->status, ev->role);
3288 }
3289
3290 hci_dev_unlock(hdev);
3291}
3292
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003293static void hci_num_comp_pkts_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003294{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003295 struct hci_ev_num_comp_pkts *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003296 int i;
3297
Andrei Emeltchenko32ac5b92011-12-19 16:31:29 +02003298 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_PACKET_BASED) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003299 bt_dev_err(hdev, "wrong event for mode %d", hdev->flow_ctl_mode);
Andrei Emeltchenko32ac5b92011-12-19 16:31:29 +02003300 return;
3301 }
3302
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02003303 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03003304 ev->num_hndl * sizeof(struct hci_comp_pkts_info)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003305 BT_DBG("%s bad parameters", hdev->name);
3306 return;
3307 }
3308
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02003309 BT_DBG("%s num_hndl %d", hdev->name, ev->num_hndl);
3310
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02003311 for (i = 0; i < ev->num_hndl; i++) {
3312 struct hci_comp_pkts_info *info = &ev->handles[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07003313 struct hci_conn *conn;
3314 __u16 handle, count;
3315
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02003316 handle = __le16_to_cpu(info->handle);
3317 count = __le16_to_cpu(info->count);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003318
3319 conn = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003320 if (!conn)
3321 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003322
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003323 conn->sent -= count;
3324
3325 switch (conn->type) {
3326 case ACL_LINK:
3327 hdev->acl_cnt += count;
3328 if (hdev->acl_cnt > hdev->acl_pkts)
3329 hdev->acl_cnt = hdev->acl_pkts;
3330 break;
3331
3332 case LE_LINK:
3333 if (hdev->le_pkts) {
3334 hdev->le_cnt += count;
3335 if (hdev->le_cnt > hdev->le_pkts)
3336 hdev->le_cnt = hdev->le_pkts;
3337 } else {
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02003338 hdev->acl_cnt += count;
3339 if (hdev->acl_cnt > hdev->acl_pkts)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003340 hdev->acl_cnt = hdev->acl_pkts;
3341 }
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003342 break;
3343
3344 case SCO_LINK:
3345 hdev->sco_cnt += count;
3346 if (hdev->sco_cnt > hdev->sco_pkts)
3347 hdev->sco_cnt = hdev->sco_pkts;
3348 break;
3349
3350 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003351 bt_dev_err(hdev, "unknown type %d conn %p",
3352 conn->type, conn);
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003353 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003354 }
3355 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003356
Gustavo F. Padovan3eff45e2011-12-15 00:50:02 -02003357 queue_work(hdev->workqueue, &hdev->tx_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003358}
3359
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003360static struct hci_conn *__hci_conn_lookup_handle(struct hci_dev *hdev,
3361 __u16 handle)
3362{
3363 struct hci_chan *chan;
3364
3365 switch (hdev->dev_type) {
Marcel Holtmannca8bee52016-07-05 14:30:14 +02003366 case HCI_PRIMARY:
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003367 return hci_conn_hash_lookup_handle(hdev, handle);
3368 case HCI_AMP:
3369 chan = hci_chan_lookup_handle(hdev, handle);
3370 if (chan)
3371 return chan->conn;
3372 break;
3373 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003374 bt_dev_err(hdev, "unknown dev_type %d", hdev->dev_type);
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003375 break;
3376 }
3377
3378 return NULL;
3379}
3380
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003381static void hci_num_comp_blocks_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003382{
3383 struct hci_ev_num_comp_blocks *ev = (void *) skb->data;
3384 int i;
3385
3386 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_BLOCK_BASED) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003387 bt_dev_err(hdev, "wrong event for mode %d", hdev->flow_ctl_mode);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003388 return;
3389 }
3390
3391 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03003392 ev->num_hndl * sizeof(struct hci_comp_blocks_info)) {
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003393 BT_DBG("%s bad parameters", hdev->name);
3394 return;
3395 }
3396
3397 BT_DBG("%s num_blocks %d num_hndl %d", hdev->name, ev->num_blocks,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003398 ev->num_hndl);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003399
3400 for (i = 0; i < ev->num_hndl; i++) {
3401 struct hci_comp_blocks_info *info = &ev->handles[i];
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003402 struct hci_conn *conn = NULL;
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003403 __u16 handle, block_count;
3404
3405 handle = __le16_to_cpu(info->handle);
3406 block_count = __le16_to_cpu(info->blocks);
3407
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003408 conn = __hci_conn_lookup_handle(hdev, handle);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003409 if (!conn)
3410 continue;
3411
3412 conn->sent -= block_count;
3413
3414 switch (conn->type) {
3415 case ACL_LINK:
Andrei Emeltchenkobd1eb662012-10-10 17:38:30 +03003416 case AMP_LINK:
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003417 hdev->block_cnt += block_count;
3418 if (hdev->block_cnt > hdev->num_blocks)
3419 hdev->block_cnt = hdev->num_blocks;
3420 break;
3421
3422 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003423 bt_dev_err(hdev, "unknown type %d conn %p",
3424 conn->type, conn);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003425 break;
3426 }
3427 }
3428
3429 queue_work(hdev->workqueue, &hdev->tx_work);
3430}
3431
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003432static void hci_mode_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003433{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003434 struct hci_ev_mode_change *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003435 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003436
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003437 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003438
3439 hci_dev_lock(hdev);
3440
Marcel Holtmann04837f62006-07-03 10:02:33 +02003441 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3442 if (conn) {
3443 conn->mode = ev->mode;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003444
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003445 if (!test_and_clear_bit(HCI_CONN_MODE_CHANGE_PEND,
3446 &conn->flags)) {
Marcel Holtmann04837f62006-07-03 10:02:33 +02003447 if (conn->mode == HCI_CM_ACTIVE)
Johan Hedberg58a681e2012-01-16 06:47:28 +02003448 set_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003449 else
Johan Hedberg58a681e2012-01-16 06:47:28 +02003450 clear_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003451 }
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003452
Johan Hedberg51a8efd2012-01-16 06:10:31 +02003453 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003454 hci_sco_setup(conn, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003455 }
3456
3457 hci_dev_unlock(hdev);
3458}
3459
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003460static void hci_pin_code_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003461{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003462 struct hci_ev_pin_code_req *ev = (void *) skb->data;
3463 struct hci_conn *conn;
3464
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003465 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003466
3467 hci_dev_lock(hdev);
3468
3469 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003470 if (!conn)
3471 goto unlock;
3472
3473 if (conn->state == BT_CONNECTED) {
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003474 hci_conn_hold(conn);
3475 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003476 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003477 }
3478
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003479 if (!hci_dev_test_flag(hdev, HCI_BONDABLE) &&
Johan Hedberg2f407f02014-07-17 15:35:40 +03003480 !test_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags)) {
Johan Hedberg03b555e2011-01-04 15:40:05 +02003481 hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003482 sizeof(ev->bdaddr), &ev->bdaddr);
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003483 } else if (hci_dev_test_flag(hdev, HCI_MGMT)) {
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003484 u8 secure;
3485
3486 if (conn->pending_sec_level == BT_SECURITY_HIGH)
3487 secure = 1;
3488 else
3489 secure = 0;
3490
Johan Hedberg744cf192011-11-08 20:40:14 +02003491 mgmt_pin_code_request(hdev, &ev->bdaddr, secure);
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003492 }
Johan Hedberg980e1a52011-01-22 06:10:07 +02003493
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003494unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003495 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003496}
3497
Johan Hedbergcb6f3f72014-11-19 14:53:04 +02003498static void conn_set_key(struct hci_conn *conn, u8 key_type, u8 pin_len)
3499{
3500 if (key_type == HCI_LK_CHANGED_COMBINATION)
3501 return;
3502
3503 conn->pin_length = pin_len;
3504 conn->key_type = key_type;
3505
3506 switch (key_type) {
3507 case HCI_LK_LOCAL_UNIT:
3508 case HCI_LK_REMOTE_UNIT:
3509 case HCI_LK_DEBUG_COMBINATION:
3510 return;
3511 case HCI_LK_COMBINATION:
3512 if (pin_len == 16)
3513 conn->pending_sec_level = BT_SECURITY_HIGH;
3514 else
3515 conn->pending_sec_level = BT_SECURITY_MEDIUM;
3516 break;
3517 case HCI_LK_UNAUTH_COMBINATION_P192:
3518 case HCI_LK_UNAUTH_COMBINATION_P256:
3519 conn->pending_sec_level = BT_SECURITY_MEDIUM;
3520 break;
3521 case HCI_LK_AUTH_COMBINATION_P192:
3522 conn->pending_sec_level = BT_SECURITY_HIGH;
3523 break;
3524 case HCI_LK_AUTH_COMBINATION_P256:
3525 conn->pending_sec_level = BT_SECURITY_FIPS;
3526 break;
3527 }
3528}
3529
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003530static void hci_link_key_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003531{
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003532 struct hci_ev_link_key_req *ev = (void *) skb->data;
3533 struct hci_cp_link_key_reply cp;
3534 struct hci_conn *conn;
3535 struct link_key *key;
3536
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003537 BT_DBG("%s", hdev->name);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003538
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003539 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003540 return;
3541
3542 hci_dev_lock(hdev);
3543
3544 key = hci_find_link_key(hdev, &ev->bdaddr);
3545 if (!key) {
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003546 BT_DBG("%s link key not found for %pMR", hdev->name,
3547 &ev->bdaddr);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003548 goto not_found;
3549 }
3550
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003551 BT_DBG("%s found key type %u for %pMR", hdev->name, key->type,
3552 &ev->bdaddr);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003553
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003554 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003555 if (conn) {
Johan Hedbergfe8bc5a2014-08-14 12:33:17 +03003556 clear_bit(HCI_CONN_NEW_LINK_KEY, &conn->flags);
3557
Marcel Holtmann66138ce2014-01-10 02:07:20 -08003558 if ((key->type == HCI_LK_UNAUTH_COMBINATION_P192 ||
3559 key->type == HCI_LK_UNAUTH_COMBINATION_P256) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03003560 conn->auth_type != 0xff && (conn->auth_type & 0x01)) {
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003561 BT_DBG("%s ignoring unauthenticated key", hdev->name);
3562 goto not_found;
3563 }
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003564
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003565 if (key->type == HCI_LK_COMBINATION && key->pin_len < 16 &&
Johan Hedbergf3fb0b52014-06-02 10:12:44 +03003566 (conn->pending_sec_level == BT_SECURITY_HIGH ||
3567 conn->pending_sec_level == BT_SECURITY_FIPS)) {
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003568 BT_DBG("%s ignoring key unauthenticated for high security",
3569 hdev->name);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003570 goto not_found;
3571 }
3572
Johan Hedbergcb6f3f72014-11-19 14:53:04 +02003573 conn_set_key(conn, key->type, key->pin_len);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003574 }
3575
3576 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9b3b4462012-05-23 11:31:20 +03003577 memcpy(cp.link_key, key->val, HCI_LINK_KEY_SIZE);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003578
3579 hci_send_cmd(hdev, HCI_OP_LINK_KEY_REPLY, sizeof(cp), &cp);
3580
3581 hci_dev_unlock(hdev);
3582
3583 return;
3584
3585not_found:
3586 hci_send_cmd(hdev, HCI_OP_LINK_KEY_NEG_REPLY, 6, &ev->bdaddr);
3587 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003588}
3589
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003590static void hci_link_key_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003591{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003592 struct hci_ev_link_key_notify *ev = (void *) skb->data;
3593 struct hci_conn *conn;
Johan Hedberg7652ff62014-06-24 13:15:49 +03003594 struct link_key *key;
3595 bool persistent;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003596 u8 pin_len = 0;
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003597
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003598 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003599
3600 hci_dev_lock(hdev);
3601
3602 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg82c13d42014-12-03 11:03:06 +02003603 if (!conn)
3604 goto unlock;
3605
3606 hci_conn_hold(conn);
3607 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
3608 hci_conn_drop(conn);
3609
Johan Hedbergfe8bc5a2014-08-14 12:33:17 +03003610 set_bit(HCI_CONN_NEW_LINK_KEY, &conn->flags);
Johan Hedberg82c13d42014-12-03 11:03:06 +02003611 conn_set_key(conn, ev->key_type, conn->pin_length);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003612
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003613 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg7652ff62014-06-24 13:15:49 +03003614 goto unlock;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003615
Johan Hedberg7652ff62014-06-24 13:15:49 +03003616 key = hci_add_link_key(hdev, conn, &ev->bdaddr, ev->link_key,
3617 ev->key_type, pin_len, &persistent);
3618 if (!key)
3619 goto unlock;
3620
Johan Hedbergcb6f3f72014-11-19 14:53:04 +02003621 /* Update connection information since adding the key will have
3622 * fixed up the type in the case of changed combination keys.
3623 */
3624 if (ev->key_type == HCI_LK_CHANGED_COMBINATION)
3625 conn_set_key(conn, key->type, key->pin_len);
3626
Johan Hedberg7652ff62014-06-24 13:15:49 +03003627 mgmt_new_link_key(hdev, key, persistent);
3628
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003629 /* Keep debug keys around only if the HCI_KEEP_DEBUG_KEYS flag
3630 * is set. If it's not set simply remove the key from the kernel
3631 * list (we've still notified user space about it but with
3632 * store_hint being 0).
3633 */
3634 if (key->type == HCI_LK_DEBUG_COMBINATION &&
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003635 !hci_dev_test_flag(hdev, HCI_KEEP_DEBUG_KEYS)) {
Johan Hedberg0378b592014-11-19 15:22:22 +02003636 list_del_rcu(&key->list);
3637 kfree_rcu(key, rcu);
Johan Hedberg82c13d42014-12-03 11:03:06 +02003638 goto unlock;
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003639 }
Johan Hedberg7652ff62014-06-24 13:15:49 +03003640
Johan Hedberg82c13d42014-12-03 11:03:06 +02003641 if (persistent)
3642 clear_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
3643 else
3644 set_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
3645
Johan Hedberg7652ff62014-06-24 13:15:49 +03003646unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003647 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003648}
3649
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003650static void hci_clock_offset_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04837f62006-07-03 10:02:33 +02003651{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003652 struct hci_ev_clock_offset *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003653 struct hci_conn *conn;
3654
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003655 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003656
3657 hci_dev_lock(hdev);
3658
3659 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003660 if (conn && !ev->status) {
3661 struct inquiry_entry *ie;
3662
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003663 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3664 if (ie) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003665 ie->data.clock_offset = ev->clock_offset;
3666 ie->timestamp = jiffies;
3667 }
3668 }
3669
3670 hci_dev_unlock(hdev);
3671}
3672
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003673static void hci_pkt_type_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna8746412008-07-14 20:13:46 +02003674{
3675 struct hci_ev_pkt_type_change *ev = (void *) skb->data;
3676 struct hci_conn *conn;
3677
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003678 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna8746412008-07-14 20:13:46 +02003679
3680 hci_dev_lock(hdev);
3681
3682 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3683 if (conn && !ev->status)
3684 conn->pkt_type = __le16_to_cpu(ev->pkt_type);
3685
3686 hci_dev_unlock(hdev);
3687}
3688
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003689static void hci_pscan_rep_mode_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003690{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003691 struct hci_ev_pscan_rep_mode *ev = (void *) skb->data;
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003692 struct inquiry_entry *ie;
3693
3694 BT_DBG("%s", hdev->name);
3695
3696 hci_dev_lock(hdev);
3697
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003698 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
3699 if (ie) {
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003700 ie->data.pscan_rep_mode = ev->pscan_rep_mode;
3701 ie->timestamp = jiffies;
3702 }
3703
3704 hci_dev_unlock(hdev);
3705}
3706
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003707static void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev,
3708 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003709{
3710 struct inquiry_data data;
3711 int num_rsp = *((__u8 *) skb->data);
3712
3713 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
3714
3715 if (!num_rsp)
3716 return;
3717
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003718 if (hci_dev_test_flag(hdev, HCI_PERIODIC_INQ))
Andre Guedes1519cc12012-03-21 00:03:38 -03003719 return;
3720
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003721 hci_dev_lock(hdev);
3722
3723 if ((skb->len - 1) / num_rsp != sizeof(struct inquiry_info_with_rssi)) {
Szymon Janc138d22e2011-02-17 16:44:23 +01003724 struct inquiry_info_with_rssi_and_pscan_mode *info;
3725 info = (void *) (skb->data + 1);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003726
Johan Hedberge17acd42011-03-30 23:57:16 +03003727 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003728 u32 flags;
3729
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003730 bacpy(&data.bdaddr, &info->bdaddr);
3731 data.pscan_rep_mode = info->pscan_rep_mode;
3732 data.pscan_period_mode = info->pscan_period_mode;
3733 data.pscan_mode = info->pscan_mode;
3734 memcpy(data.dev_class, info->dev_class, 3);
3735 data.clock_offset = info->clock_offset;
3736 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003737 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02003738
Marcel Holtmannaf589252014-07-01 14:11:20 +02003739 flags = hci_inquiry_cache_update(hdev, &data, false);
3740
Johan Hedberg48264f02011-11-09 13:58:58 +02003741 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003742 info->dev_class, info->rssi,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003743 flags, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003744 }
3745 } else {
3746 struct inquiry_info_with_rssi *info = (void *) (skb->data + 1);
3747
Johan Hedberge17acd42011-03-30 23:57:16 +03003748 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003749 u32 flags;
3750
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003751 bacpy(&data.bdaddr, &info->bdaddr);
3752 data.pscan_rep_mode = info->pscan_rep_mode;
3753 data.pscan_period_mode = info->pscan_period_mode;
3754 data.pscan_mode = 0x00;
3755 memcpy(data.dev_class, info->dev_class, 3);
3756 data.clock_offset = info->clock_offset;
3757 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003758 data.ssp_mode = 0x00;
Marcel Holtmannaf589252014-07-01 14:11:20 +02003759
3760 flags = hci_inquiry_cache_update(hdev, &data, false);
3761
Johan Hedberg48264f02011-11-09 13:58:58 +02003762 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003763 info->dev_class, info->rssi,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003764 flags, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003765 }
3766 }
3767
3768 hci_dev_unlock(hdev);
3769}
3770
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003771static void hci_remote_ext_features_evt(struct hci_dev *hdev,
3772 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003773{
Marcel Holtmann41a96212008-07-14 20:13:48 +02003774 struct hci_ev_remote_ext_features *ev = (void *) skb->data;
3775 struct hci_conn *conn;
3776
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003777 BT_DBG("%s", hdev->name);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003778
Marcel Holtmann41a96212008-07-14 20:13:48 +02003779 hci_dev_lock(hdev);
3780
3781 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02003782 if (!conn)
3783 goto unlock;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003784
Johan Hedbergcad718e2013-04-17 15:00:51 +03003785 if (ev->page < HCI_MAX_PAGES)
3786 memcpy(conn->features[ev->page], ev->features, 8);
3787
Johan Hedbergccd556f2010-11-10 17:11:51 +02003788 if (!ev->status && ev->page == 0x01) {
3789 struct inquiry_entry *ie;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003790
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003791 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3792 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02003793 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann769be972008-07-14 20:13:49 +02003794
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303795 if (ev->features[0] & LMP_HOST_SSP) {
Johan Hedberg58a681e2012-01-16 06:47:28 +02003796 set_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303797 } else {
3798 /* It is mandatory by the Bluetooth specification that
3799 * Extended Inquiry Results are only used when Secure
3800 * Simple Pairing is enabled, but some devices violate
3801 * this.
3802 *
3803 * To make these devices work, the internal SSP
3804 * enabled flag needs to be cleared if the remote host
3805 * features do not indicate SSP support */
3806 clear_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
3807 }
Marcel Holtmanneb9a8f32014-01-15 22:37:38 -08003808
3809 if (ev->features[0] & LMP_HOST_SC)
3810 set_bit(HCI_CONN_SC_ENABLED, &conn->flags);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003811 }
3812
Johan Hedbergccd556f2010-11-10 17:11:51 +02003813 if (conn->state != BT_CONFIG)
3814 goto unlock;
3815
Johan Hedberg671267b2012-05-12 16:11:50 -03003816 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02003817 struct hci_cp_remote_name_req cp;
3818 memset(&cp, 0, sizeof(cp));
3819 bacpy(&cp.bdaddr, &conn->dst);
3820 cp.pscan_rep_mode = 0x02;
3821 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02003822 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00003823 mgmt_device_connected(hdev, conn, 0, NULL, 0);
Johan Hedberg392599b2010-11-18 22:22:28 +02003824
Johan Hedberg127178d2010-11-18 22:22:29 +02003825 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02003826 conn->state = BT_CONNECTED;
Johan Hedberg539c4962015-02-18 14:53:57 +02003827 hci_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02003828 hci_conn_drop(conn);
Johan Hedbergccd556f2010-11-10 17:11:51 +02003829 }
3830
3831unlock:
Marcel Holtmann41a96212008-07-14 20:13:48 +02003832 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003833}
3834
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003835static void hci_sync_conn_complete_evt(struct hci_dev *hdev,
3836 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003837{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003838 struct hci_ev_sync_conn_complete *ev = (void *) skb->data;
3839 struct hci_conn *conn;
3840
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003841 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003842
3843 hci_dev_lock(hdev);
3844
3845 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann9dc0a3a2008-07-14 20:13:46 +02003846 if (!conn) {
3847 if (ev->link_type == ESCO_LINK)
3848 goto unlock;
3849
Kuba Pawlak618353b2015-08-28 13:05:22 +01003850 /* When the link type in the event indicates SCO connection
3851 * and lookup of the connection object fails, then check
3852 * if an eSCO connection object exists.
3853 *
3854 * The core limits the synchronous connections to either
3855 * SCO or eSCO. The eSCO connection is preferred and tried
3856 * to be setup first and until successfully established,
3857 * the link type will be hinted as eSCO.
3858 */
Marcel Holtmann9dc0a3a2008-07-14 20:13:46 +02003859 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
3860 if (!conn)
3861 goto unlock;
Marcel Holtmann9dc0a3a2008-07-14 20:13:46 +02003862 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003863
Marcel Holtmann732547f2009-04-19 19:14:14 +02003864 switch (ev->status) {
3865 case 0x00:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003866 conn->handle = __le16_to_cpu(ev->handle);
3867 conn->state = BT_CONNECTED;
Kuba Pawlak618353b2015-08-28 13:05:22 +01003868 conn->type = ev->link_type;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02003869
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01003870 hci_debugfs_create_conn(conn);
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02003871 hci_conn_add_sysfs(conn);
Marcel Holtmann732547f2009-04-19 19:14:14 +02003872 break;
3873
Nick Pelly81218d22014-06-30 11:25:01 +05303874 case 0x10: /* Connection Accept Timeout */
Frédéric Dalleau1a4c9582013-08-19 14:24:02 +02003875 case 0x0d: /* Connection Rejected due to Limited Resources */
Stephen Coe705e5712010-02-16 11:29:44 -05003876 case 0x11: /* Unsupported Feature or Parameter Value */
Marcel Holtmann732547f2009-04-19 19:14:14 +02003877 case 0x1c: /* SCO interval rejected */
Nick Pelly1038a002010-02-03 11:42:26 -08003878 case 0x1a: /* Unsupported Remote Feature */
Marcel Holtmann732547f2009-04-19 19:14:14 +02003879 case 0x1f: /* Unspecified error */
Andrew Earl27539bc2014-03-10 10:31:04 +00003880 case 0x20: /* Unsupported LMP Parameter value */
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02003881 if (conn->out) {
Marcel Holtmann732547f2009-04-19 19:14:14 +02003882 conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) |
3883 (hdev->esco_type & EDR_ESCO_MASK);
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02003884 if (hci_setup_sync(conn, conn->link->handle))
3885 goto unlock;
Marcel Holtmann732547f2009-04-19 19:14:14 +02003886 }
3887 /* fall through */
3888
3889 default:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003890 conn->state = BT_CLOSED;
Marcel Holtmann732547f2009-04-19 19:14:14 +02003891 break;
3892 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003893
Johan Hedberg539c4962015-02-18 14:53:57 +02003894 hci_connect_cfm(conn, ev->status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003895 if (ev->status)
3896 hci_conn_del(conn);
3897
3898unlock:
3899 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003900}
3901
Marcel Holtmannefdcf8e2013-10-15 10:31:12 -07003902static inline size_t eir_get_length(u8 *eir, size_t eir_len)
3903{
3904 size_t parsed = 0;
3905
3906 while (parsed < eir_len) {
3907 u8 field_len = eir[0];
3908
3909 if (field_len == 0)
3910 return parsed;
3911
3912 parsed += field_len + 1;
3913 eir += field_len + 1;
3914 }
3915
3916 return eir_len;
3917}
3918
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003919static void hci_extended_inquiry_result_evt(struct hci_dev *hdev,
3920 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003921{
3922 struct inquiry_data data;
3923 struct extended_inquiry_info *info = (void *) (skb->data + 1);
3924 int num_rsp = *((__u8 *) skb->data);
Vishal Agarwal9d939d92012-04-26 19:19:56 +05303925 size_t eir_len;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003926
3927 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
3928
3929 if (!num_rsp)
3930 return;
3931
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003932 if (hci_dev_test_flag(hdev, HCI_PERIODIC_INQ))
Andre Guedes1519cc12012-03-21 00:03:38 -03003933 return;
3934
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003935 hci_dev_lock(hdev);
3936
Johan Hedberge17acd42011-03-30 23:57:16 +03003937 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003938 u32 flags;
3939 bool name_known;
Johan Hedberg561aafb2012-01-04 13:31:59 +02003940
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003941 bacpy(&data.bdaddr, &info->bdaddr);
Szymon Janc138d22e2011-02-17 16:44:23 +01003942 data.pscan_rep_mode = info->pscan_rep_mode;
3943 data.pscan_period_mode = info->pscan_period_mode;
3944 data.pscan_mode = 0x00;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003945 memcpy(data.dev_class, info->dev_class, 3);
Szymon Janc138d22e2011-02-17 16:44:23 +01003946 data.clock_offset = info->clock_offset;
3947 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003948 data.ssp_mode = 0x01;
Johan Hedberg561aafb2012-01-04 13:31:59 +02003949
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003950 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg0d3b7f62016-01-05 13:19:31 +02003951 name_known = eir_get_data(info->data,
3952 sizeof(info->data),
3953 EIR_NAME_COMPLETE, NULL);
Johan Hedberg561aafb2012-01-04 13:31:59 +02003954 else
3955 name_known = true;
3956
Marcel Holtmannaf589252014-07-01 14:11:20 +02003957 flags = hci_inquiry_cache_update(hdev, &data, name_known);
3958
Vishal Agarwal9d939d92012-04-26 19:19:56 +05303959 eir_len = eir_get_length(info->data, sizeof(info->data));
Marcel Holtmannaf589252014-07-01 14:11:20 +02003960
Johan Hedberg48264f02011-11-09 13:58:58 +02003961 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003962 info->dev_class, info->rssi,
3963 flags, info->data, eir_len, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003964 }
3965
3966 hci_dev_unlock(hdev);
3967}
3968
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003969static void hci_key_refresh_complete_evt(struct hci_dev *hdev,
3970 struct sk_buff *skb)
3971{
3972 struct hci_ev_key_refresh_complete *ev = (void *) skb->data;
3973 struct hci_conn *conn;
3974
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003975 BT_DBG("%s status 0x%2.2x handle 0x%4.4x", hdev->name, ev->status,
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003976 __le16_to_cpu(ev->handle));
3977
3978 hci_dev_lock(hdev);
3979
3980 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3981 if (!conn)
3982 goto unlock;
3983
Johan Hedberg9eb1fbf2014-04-11 12:02:31 -07003984 /* For BR/EDR the necessary steps are taken through the
3985 * auth_complete event.
3986 */
3987 if (conn->type != LE_LINK)
3988 goto unlock;
3989
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003990 if (!ev->status)
3991 conn->sec_level = conn->pending_sec_level;
3992
3993 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
3994
3995 if (ev->status && conn->state == BT_CONNECTED) {
Andre Guedesbed71742013-01-30 11:50:56 -03003996 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
David Herrmann76a68ba2013-04-06 20:28:37 +02003997 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003998 goto unlock;
3999 }
4000
4001 if (conn->state == BT_CONFIG) {
4002 if (!ev->status)
4003 conn->state = BT_CONNECTED;
4004
Johan Hedberg539c4962015-02-18 14:53:57 +02004005 hci_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02004006 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08004007 } else {
4008 hci_auth_cfm(conn, ev->status);
4009
4010 hci_conn_hold(conn);
4011 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02004012 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08004013 }
4014
4015unlock:
4016 hci_dev_unlock(hdev);
4017}
4018
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004019static u8 hci_get_auth_req(struct hci_conn *conn)
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004020{
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004021 /* If remote requests no-bonding follow that lead */
Mikel Astizacabae92013-06-28 10:56:28 +02004022 if (conn->remote_auth == HCI_AT_NO_BONDING ||
4023 conn->remote_auth == HCI_AT_NO_BONDING_MITM)
Waldemar Rymarkiewicz58797bf2011-04-28 12:07:58 +02004024 return conn->remote_auth | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004025
Mikel Astizb7f94c82014-04-08 14:21:31 +02004026 /* If both remote and local have enough IO capabilities, require
4027 * MITM protection
4028 */
4029 if (conn->remote_cap != HCI_IO_NO_INPUT_OUTPUT &&
4030 conn->io_capability != HCI_IO_NO_INPUT_OUTPUT)
4031 return conn->remote_auth | 0x01;
4032
Timo Mueller7e741702014-04-08 14:21:33 +02004033 /* No MITM protection possible so ignore remote requirement */
4034 return (conn->remote_auth & ~0x01) | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004035}
4036
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08004037static u8 bredr_oob_data_present(struct hci_conn *conn)
4038{
4039 struct hci_dev *hdev = conn->hdev;
4040 struct oob_data *data;
4041
4042 data = hci_find_remote_oob_data(hdev, &conn->dst, BDADDR_BREDR);
4043 if (!data)
4044 return 0x00;
4045
Marcel Holtmann455c2ff2015-03-15 16:42:53 -07004046 if (bredr_sc_enabled(hdev)) {
4047 /* When Secure Connections is enabled, then just
4048 * return the present value stored with the OOB
4049 * data. The stored value contains the right present
4050 * information. However it can only be trusted when
4051 * not in Secure Connection Only mode.
Marcel Holtmann659c7fb2015-01-30 23:20:56 -08004052 */
Marcel Holtmann455c2ff2015-03-15 16:42:53 -07004053 if (!hci_dev_test_flag(hdev, HCI_SC_ONLY))
4054 return data->present;
4055
4056 /* When Secure Connections Only mode is enabled, then
4057 * the P-256 values are required. If they are not
4058 * available, then do not declare that OOB data is
4059 * present.
4060 */
4061 if (!memcmp(data->rand256, ZERO_KEY, 16) ||
4062 !memcmp(data->hash256, ZERO_KEY, 16))
Marcel Holtmann659c7fb2015-01-30 23:20:56 -08004063 return 0x00;
4064
Marcel Holtmann455c2ff2015-03-15 16:42:53 -07004065 return 0x02;
Marcel Holtmann659c7fb2015-01-30 23:20:56 -08004066 }
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08004067
Marcel Holtmann455c2ff2015-03-15 16:42:53 -07004068 /* When Secure Connections is not enabled or actually
4069 * not supported by the hardware, then check that if
4070 * P-192 data values are present.
4071 */
4072 if (!memcmp(data->rand192, ZERO_KEY, 16) ||
4073 !memcmp(data->hash192, ZERO_KEY, 16))
4074 return 0x00;
4075
4076 return 0x01;
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08004077}
4078
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004079static void hci_io_capa_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02004080{
4081 struct hci_ev_io_capa_request *ev = (void *) skb->data;
4082 struct hci_conn *conn;
4083
4084 BT_DBG("%s", hdev->name);
4085
4086 hci_dev_lock(hdev);
4087
4088 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg03b555e2011-01-04 15:40:05 +02004089 if (!conn)
4090 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02004091
Johan Hedberg03b555e2011-01-04 15:40:05 +02004092 hci_conn_hold(conn);
4093
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004094 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg03b555e2011-01-04 15:40:05 +02004095 goto unlock;
4096
Johan Hedberg2f407f02014-07-17 15:35:40 +03004097 /* Allow pairing if we're pairable, the initiators of the
4098 * pairing or if the remote is not requesting bonding.
4099 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004100 if (hci_dev_test_flag(hdev, HCI_BONDABLE) ||
Johan Hedberg2f407f02014-07-17 15:35:40 +03004101 test_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags) ||
Gustavo Padovan807deac2012-05-17 00:36:24 -03004102 (conn->remote_auth & ~0x01) == HCI_AT_NO_BONDING) {
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004103 struct hci_cp_io_capability_reply cp;
4104
4105 bacpy(&cp.bdaddr, &ev->bdaddr);
Hemant Gupta7a7f1e72012-01-16 13:34:29 +05304106 /* Change the IO capability from KeyboardDisplay
4107 * to DisplayYesNo as it is not supported by BT spec. */
4108 cp.capability = (conn->io_capability == 0x04) ?
Mikel Astiza7676312013-06-28 10:56:29 +02004109 HCI_IO_DISPLAY_YESNO : conn->io_capability;
Mikel Astizb7f94c82014-04-08 14:21:31 +02004110
4111 /* If we are initiators, there is no remote information yet */
4112 if (conn->remote_auth == 0xff) {
Mikel Astizb16c6602014-04-08 14:21:34 +02004113 /* Request MITM protection if our IO caps allow it
Johan Hedberg4ad51a72014-06-09 14:41:25 +03004114 * except for the no-bonding case.
Mikel Astizb16c6602014-04-08 14:21:34 +02004115 */
Mikel Astiz6fd6b912014-04-08 14:21:32 +02004116 if (conn->io_capability != HCI_IO_NO_INPUT_OUTPUT &&
Johan Hedberg9f743d72014-07-17 11:56:33 +03004117 conn->auth_type != HCI_AT_NO_BONDING)
Johan Hedberg6c538232014-07-11 15:32:23 +03004118 conn->auth_type |= 0x01;
Mikel Astizb7f94c82014-04-08 14:21:31 +02004119 } else {
4120 conn->auth_type = hci_get_auth_req(conn);
Mikel Astizb7f94c82014-04-08 14:21:31 +02004121 }
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004122
Johan Hedberg82c295b2014-07-30 09:22:24 +03004123 /* If we're not bondable, force one of the non-bondable
4124 * authentication requirement values.
4125 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004126 if (!hci_dev_test_flag(hdev, HCI_BONDABLE))
Johan Hedberg82c295b2014-07-30 09:22:24 +03004127 conn->auth_type &= HCI_AT_NO_BONDING_MITM;
4128
4129 cp.authentication = conn->auth_type;
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08004130 cp.oob_data = bredr_oob_data_present(conn);
Szymon Jancce85ee12011-03-22 13:12:23 +01004131
Johan Hedberg17fa4b92011-01-25 13:28:33 +02004132 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03004133 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02004134 } else {
4135 struct hci_cp_io_capability_neg_reply cp;
4136
4137 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02004138 cp.reason = HCI_ERROR_PAIRING_NOT_ALLOWED;
Johan Hedberg03b555e2011-01-04 15:40:05 +02004139
4140 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03004141 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02004142 }
4143
4144unlock:
4145 hci_dev_unlock(hdev);
4146}
4147
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004148static void hci_io_capa_reply_evt(struct hci_dev *hdev, struct sk_buff *skb)
Johan Hedberg03b555e2011-01-04 15:40:05 +02004149{
4150 struct hci_ev_io_capa_reply *ev = (void *) skb->data;
4151 struct hci_conn *conn;
4152
4153 BT_DBG("%s", hdev->name);
4154
4155 hci_dev_lock(hdev);
4156
4157 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4158 if (!conn)
4159 goto unlock;
4160
Johan Hedberg03b555e2011-01-04 15:40:05 +02004161 conn->remote_cap = ev->capability;
Johan Hedberg03b555e2011-01-04 15:40:05 +02004162 conn->remote_auth = ev->authentication;
4163
4164unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02004165 hci_dev_unlock(hdev);
4166}
4167
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004168static void hci_user_confirm_request_evt(struct hci_dev *hdev,
4169 struct sk_buff *skb)
Johan Hedberga5c29682011-02-19 12:05:57 -03004170{
4171 struct hci_ev_user_confirm_req *ev = (void *) skb->data;
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004172 int loc_mitm, rem_mitm, confirm_hint = 0;
Johan Hedberg7a828902011-04-28 11:28:53 -07004173 struct hci_conn *conn;
Johan Hedberga5c29682011-02-19 12:05:57 -03004174
4175 BT_DBG("%s", hdev->name);
4176
4177 hci_dev_lock(hdev);
4178
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004179 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg7a828902011-04-28 11:28:53 -07004180 goto unlock;
Johan Hedberga5c29682011-02-19 12:05:57 -03004181
Johan Hedberg7a828902011-04-28 11:28:53 -07004182 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4183 if (!conn)
4184 goto unlock;
4185
4186 loc_mitm = (conn->auth_type & 0x01);
4187 rem_mitm = (conn->remote_auth & 0x01);
4188
4189 /* If we require MITM but the remote device can't provide that
Johan Hedberg6c538232014-07-11 15:32:23 +03004190 * (it has NoInputNoOutput) then reject the confirmation
4191 * request. We check the security level here since it doesn't
4192 * necessarily match conn->auth_type.
Mikel Astiz6fd6b912014-04-08 14:21:32 +02004193 */
Johan Hedberg6c538232014-07-11 15:32:23 +03004194 if (conn->pending_sec_level > BT_SECURITY_MEDIUM &&
4195 conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) {
Johan Hedberg7a828902011-04-28 11:28:53 -07004196 BT_DBG("Rejecting request: remote device can't provide MITM");
4197 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03004198 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07004199 goto unlock;
4200 }
4201
4202 /* If no side requires MITM protection; auto-accept */
Mikel Astiza7676312013-06-28 10:56:29 +02004203 if ((!loc_mitm || conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) &&
4204 (!rem_mitm || conn->io_capability == HCI_IO_NO_INPUT_OUTPUT)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004205
4206 /* If we're not the initiators request authorization to
4207 * proceed from user space (mgmt_user_confirm with
Johan Hedbergba15a582014-06-09 13:58:14 +03004208 * confirm_hint set to 1). The exception is if neither
Johan Hedberg02f3e252014-07-16 15:09:13 +03004209 * side had MITM or if the local IO capability is
4210 * NoInputNoOutput, in which case we do auto-accept
Johan Hedbergba15a582014-06-09 13:58:14 +03004211 */
4212 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) &&
Johan Hedberg02f3e252014-07-16 15:09:13 +03004213 conn->io_capability != HCI_IO_NO_INPUT_OUTPUT &&
Johan Hedbergba15a582014-06-09 13:58:14 +03004214 (loc_mitm || rem_mitm)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004215 BT_DBG("Confirming auto-accept as acceptor");
4216 confirm_hint = 1;
4217 goto confirm;
4218 }
4219
Johan Hedberg9f616562011-04-28 11:28:54 -07004220 BT_DBG("Auto-accept of user confirmation with %ums delay",
Gustavo Padovan807deac2012-05-17 00:36:24 -03004221 hdev->auto_accept_delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07004222
4223 if (hdev->auto_accept_delay > 0) {
4224 int delay = msecs_to_jiffies(hdev->auto_accept_delay);
Johan Hedberg7bc18d92013-10-16 18:11:39 +03004225 queue_delayed_work(conn->hdev->workqueue,
4226 &conn->auto_accept_work, delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07004227 goto unlock;
4228 }
4229
Johan Hedberg7a828902011-04-28 11:28:53 -07004230 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03004231 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07004232 goto unlock;
4233 }
4234
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004235confirm:
Johan Hedberg39adbff2014-03-20 08:18:14 +02004236 mgmt_user_confirm_request(hdev, &ev->bdaddr, ACL_LINK, 0,
4237 le32_to_cpu(ev->passkey), confirm_hint);
Johan Hedberg7a828902011-04-28 11:28:53 -07004238
4239unlock:
Johan Hedberga5c29682011-02-19 12:05:57 -03004240 hci_dev_unlock(hdev);
4241}
4242
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004243static void hci_user_passkey_request_evt(struct hci_dev *hdev,
4244 struct sk_buff *skb)
Brian Gix1143d452011-11-23 08:28:34 -08004245{
4246 struct hci_ev_user_passkey_req *ev = (void *) skb->data;
4247
4248 BT_DBG("%s", hdev->name);
4249
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004250 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg272d90d2012-02-09 15:26:12 +02004251 mgmt_user_passkey_request(hdev, &ev->bdaddr, ACL_LINK, 0);
Brian Gix1143d452011-11-23 08:28:34 -08004252}
4253
Johan Hedberg92a25252012-09-06 18:39:26 +03004254static void hci_user_passkey_notify_evt(struct hci_dev *hdev,
4255 struct sk_buff *skb)
4256{
4257 struct hci_ev_user_passkey_notify *ev = (void *) skb->data;
4258 struct hci_conn *conn;
4259
4260 BT_DBG("%s", hdev->name);
4261
4262 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4263 if (!conn)
4264 return;
4265
4266 conn->passkey_notify = __le32_to_cpu(ev->passkey);
4267 conn->passkey_entered = 0;
4268
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004269 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg92a25252012-09-06 18:39:26 +03004270 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
4271 conn->dst_type, conn->passkey_notify,
4272 conn->passkey_entered);
4273}
4274
4275static void hci_keypress_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
4276{
4277 struct hci_ev_keypress_notify *ev = (void *) skb->data;
4278 struct hci_conn *conn;
4279
4280 BT_DBG("%s", hdev->name);
4281
4282 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4283 if (!conn)
4284 return;
4285
4286 switch (ev->type) {
4287 case HCI_KEYPRESS_STARTED:
4288 conn->passkey_entered = 0;
4289 return;
4290
4291 case HCI_KEYPRESS_ENTERED:
4292 conn->passkey_entered++;
4293 break;
4294
4295 case HCI_KEYPRESS_ERASED:
4296 conn->passkey_entered--;
4297 break;
4298
4299 case HCI_KEYPRESS_CLEARED:
4300 conn->passkey_entered = 0;
4301 break;
4302
4303 case HCI_KEYPRESS_COMPLETED:
4304 return;
4305 }
4306
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004307 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg92a25252012-09-06 18:39:26 +03004308 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
4309 conn->dst_type, conn->passkey_notify,
4310 conn->passkey_entered);
4311}
4312
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004313static void hci_simple_pair_complete_evt(struct hci_dev *hdev,
4314 struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02004315{
4316 struct hci_ev_simple_pair_complete *ev = (void *) skb->data;
4317 struct hci_conn *conn;
4318
4319 BT_DBG("%s", hdev->name);
4320
4321 hci_dev_lock(hdev);
4322
4323 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg2a611692011-02-19 12:06:00 -03004324 if (!conn)
4325 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02004326
Johan Hedbergc1d4fa72014-07-17 15:14:50 +03004327 /* Reset the authentication requirement to unknown */
4328 conn->remote_auth = 0xff;
4329
Johan Hedberg2a611692011-02-19 12:06:00 -03004330 /* To avoid duplicate auth_failed events to user space we check
4331 * the HCI_CONN_AUTH_PEND flag which will be set if we
4332 * initiated the authentication. A traditional auth_complete
4333 * event gets always produced as initiator and is also mapped to
4334 * the mgmt_auth_failed event */
Mikel Astizfa1bd912012-08-09 09:52:29 +02004335 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) && ev->status)
Johan Hedberge1e930f2014-09-08 17:09:49 -07004336 mgmt_auth_failed(conn, ev->status);
Johan Hedberg2a611692011-02-19 12:06:00 -03004337
David Herrmann76a68ba2013-04-06 20:28:37 +02004338 hci_conn_drop(conn);
Johan Hedberg2a611692011-02-19 12:06:00 -03004339
4340unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02004341 hci_dev_unlock(hdev);
4342}
4343
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004344static void hci_remote_host_features_evt(struct hci_dev *hdev,
4345 struct sk_buff *skb)
Marcel Holtmann41a96212008-07-14 20:13:48 +02004346{
4347 struct hci_ev_remote_host_features *ev = (void *) skb->data;
4348 struct inquiry_entry *ie;
Johan Hedbergcad718e2013-04-17 15:00:51 +03004349 struct hci_conn *conn;
Marcel Holtmann41a96212008-07-14 20:13:48 +02004350
4351 BT_DBG("%s", hdev->name);
4352
4353 hci_dev_lock(hdev);
4354
Johan Hedbergcad718e2013-04-17 15:00:51 +03004355 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4356 if (conn)
4357 memcpy(conn->features[1], ev->features, 8);
4358
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02004359 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
4360 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02004361 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann41a96212008-07-14 20:13:48 +02004362
4363 hci_dev_unlock(hdev);
4364}
4365
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004366static void hci_remote_oob_data_request_evt(struct hci_dev *hdev,
4367 struct sk_buff *skb)
Szymon Janc2763eda2011-03-22 13:12:22 +01004368{
4369 struct hci_ev_remote_oob_data_request *ev = (void *) skb->data;
4370 struct oob_data *data;
4371
4372 BT_DBG("%s", hdev->name);
4373
4374 hci_dev_lock(hdev);
4375
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004376 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Szymon Jance1ba1f12011-04-06 13:01:59 +02004377 goto unlock;
4378
Johan Hedberg6928a922014-10-26 20:46:09 +01004379 data = hci_find_remote_oob_data(hdev, &ev->bdaddr, BDADDR_BREDR);
Marcel Holtmann6665d052015-01-27 16:04:31 -08004380 if (!data) {
Szymon Janc2763eda2011-03-22 13:12:22 +01004381 struct hci_cp_remote_oob_data_neg_reply cp;
4382
4383 bacpy(&cp.bdaddr, &ev->bdaddr);
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08004384 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_NEG_REPLY,
4385 sizeof(cp), &cp);
Marcel Holtmann6665d052015-01-27 16:04:31 -08004386 goto unlock;
4387 }
4388
4389 if (bredr_sc_enabled(hdev)) {
4390 struct hci_cp_remote_oob_ext_data_reply cp;
4391
4392 bacpy(&cp.bdaddr, &ev->bdaddr);
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004393 if (hci_dev_test_flag(hdev, HCI_SC_ONLY)) {
Marcel Holtmann6665d052015-01-27 16:04:31 -08004394 memset(cp.hash192, 0, sizeof(cp.hash192));
4395 memset(cp.rand192, 0, sizeof(cp.rand192));
4396 } else {
4397 memcpy(cp.hash192, data->hash192, sizeof(cp.hash192));
4398 memcpy(cp.rand192, data->rand192, sizeof(cp.rand192));
4399 }
4400 memcpy(cp.hash256, data->hash256, sizeof(cp.hash256));
4401 memcpy(cp.rand256, data->rand256, sizeof(cp.rand256));
4402
4403 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_EXT_DATA_REPLY,
4404 sizeof(cp), &cp);
4405 } else {
4406 struct hci_cp_remote_oob_data_reply cp;
4407
4408 bacpy(&cp.bdaddr, &ev->bdaddr);
4409 memcpy(cp.hash, data->hash192, sizeof(cp.hash));
4410 memcpy(cp.rand, data->rand192, sizeof(cp.rand));
4411
4412 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_REPLY,
4413 sizeof(cp), &cp);
Szymon Janc2763eda2011-03-22 13:12:22 +01004414 }
4415
Szymon Jance1ba1f12011-04-06 13:01:59 +02004416unlock:
Szymon Janc2763eda2011-03-22 13:12:22 +01004417 hci_dev_unlock(hdev);
4418}
4419
Arron Wanga77a6a12015-07-24 17:13:15 +08004420#if IS_ENABLED(CONFIG_BT_HS)
4421static void hci_chan_selected_evt(struct hci_dev *hdev, struct sk_buff *skb)
4422{
4423 struct hci_ev_channel_selected *ev = (void *)skb->data;
4424 struct hci_conn *hcon;
4425
4426 BT_DBG("%s handle 0x%2.2x", hdev->name, ev->phy_handle);
4427
4428 skb_pull(skb, sizeof(*ev));
4429
4430 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4431 if (!hcon)
4432 return;
4433
4434 amp_read_loc_assoc_final_data(hdev, hcon);
4435}
4436
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004437static void hci_phy_link_complete_evt(struct hci_dev *hdev,
4438 struct sk_buff *skb)
4439{
4440 struct hci_ev_phy_link_complete *ev = (void *) skb->data;
4441 struct hci_conn *hcon, *bredr_hcon;
4442
4443 BT_DBG("%s handle 0x%2.2x status 0x%2.2x", hdev->name, ev->phy_handle,
4444 ev->status);
4445
4446 hci_dev_lock(hdev);
4447
4448 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4449 if (!hcon) {
4450 hci_dev_unlock(hdev);
4451 return;
4452 }
4453
4454 if (ev->status) {
4455 hci_conn_del(hcon);
4456 hci_dev_unlock(hdev);
4457 return;
4458 }
4459
4460 bredr_hcon = hcon->amp_mgr->l2cap_conn->hcon;
4461
4462 hcon->state = BT_CONNECTED;
4463 bacpy(&hcon->dst, &bredr_hcon->dst);
4464
4465 hci_conn_hold(hcon);
4466 hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02004467 hci_conn_drop(hcon);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004468
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01004469 hci_debugfs_create_conn(hcon);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004470 hci_conn_add_sysfs(hcon);
4471
Andrei Emeltchenkocf70ff22012-10-31 15:46:36 +02004472 amp_physical_cfm(bredr_hcon, hcon);
4473
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004474 hci_dev_unlock(hdev);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004475}
4476
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004477static void hci_loglink_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
4478{
4479 struct hci_ev_logical_link_complete *ev = (void *) skb->data;
4480 struct hci_conn *hcon;
4481 struct hci_chan *hchan;
4482 struct amp_mgr *mgr;
4483
4484 BT_DBG("%s log_handle 0x%4.4x phy_handle 0x%2.2x status 0x%2.2x",
4485 hdev->name, le16_to_cpu(ev->handle), ev->phy_handle,
4486 ev->status);
4487
4488 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4489 if (!hcon)
4490 return;
4491
4492 /* Create AMP hchan */
4493 hchan = hci_chan_create(hcon);
4494 if (!hchan)
4495 return;
4496
4497 hchan->handle = le16_to_cpu(ev->handle);
4498
4499 BT_DBG("hcon %p mgr %p hchan %p", hcon, hcon->amp_mgr, hchan);
4500
4501 mgr = hcon->amp_mgr;
4502 if (mgr && mgr->bredr_chan) {
4503 struct l2cap_chan *bredr_chan = mgr->bredr_chan;
4504
4505 l2cap_chan_lock(bredr_chan);
4506
4507 bredr_chan->conn->mtu = hdev->block_mtu;
4508 l2cap_logical_cfm(bredr_chan, hchan, 0);
4509 hci_conn_hold(hcon);
4510
4511 l2cap_chan_unlock(bredr_chan);
4512 }
4513}
4514
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02004515static void hci_disconn_loglink_complete_evt(struct hci_dev *hdev,
4516 struct sk_buff *skb)
4517{
4518 struct hci_ev_disconn_logical_link_complete *ev = (void *) skb->data;
4519 struct hci_chan *hchan;
4520
4521 BT_DBG("%s log handle 0x%4.4x status 0x%2.2x", hdev->name,
4522 le16_to_cpu(ev->handle), ev->status);
4523
4524 if (ev->status)
4525 return;
4526
4527 hci_dev_lock(hdev);
4528
4529 hchan = hci_chan_lookup_handle(hdev, le16_to_cpu(ev->handle));
4530 if (!hchan)
4531 goto unlock;
4532
4533 amp_destroy_logical_link(hchan, ev->reason);
4534
4535unlock:
4536 hci_dev_unlock(hdev);
4537}
4538
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02004539static void hci_disconn_phylink_complete_evt(struct hci_dev *hdev,
4540 struct sk_buff *skb)
4541{
4542 struct hci_ev_disconn_phy_link_complete *ev = (void *) skb->data;
4543 struct hci_conn *hcon;
4544
4545 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4546
4547 if (ev->status)
4548 return;
4549
4550 hci_dev_lock(hdev);
4551
4552 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4553 if (hcon) {
4554 hcon->state = BT_CLOSED;
4555 hci_conn_del(hcon);
4556 }
4557
4558 hci_dev_unlock(hdev);
4559}
Arron Wanga77a6a12015-07-24 17:13:15 +08004560#endif
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02004561
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304562static void le_conn_complete_evt(struct hci_dev *hdev, u8 status,
4563 bdaddr_t *bdaddr, u8 bdaddr_type, u8 role, u16 handle,
4564 u16 interval, u16 latency, u16 supervision_timeout)
Ville Tervofcd89c02011-02-10 22:38:47 -03004565{
Johan Hedberg912b42e2014-07-03 19:33:49 +03004566 struct hci_conn_params *params;
Ville Tervofcd89c02011-02-10 22:38:47 -03004567 struct hci_conn *conn;
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004568 struct smp_irk *irk;
Johan Hedberg837d5022014-07-02 09:36:22 +03004569 u8 addr_type;
Ville Tervofcd89c02011-02-10 22:38:47 -03004570
Ville Tervofcd89c02011-02-10 22:38:47 -03004571 hci_dev_lock(hdev);
4572
Johan Hedbergfbd96c12014-07-08 17:21:51 +03004573 /* All controllers implicitly stop advertising in the event of a
4574 * connection, so ensure that the state bit is cleared.
4575 */
Marcel Holtmanna358dc12015-03-13 02:11:02 -07004576 hci_dev_clear_flag(hdev, HCI_LE_ADV);
Johan Hedbergfbd96c12014-07-08 17:21:51 +03004577
Jakub Pawlowskie7d9ab72015-08-07 20:22:52 +02004578 conn = hci_lookup_le_connect(hdev);
Ville Tervob62f3282011-02-10 22:38:50 -03004579 if (!conn) {
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304580 conn = hci_conn_add(hdev, LE_LINK, bdaddr, role);
Ville Tervob62f3282011-02-10 22:38:50 -03004581 if (!conn) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01004582 bt_dev_err(hdev, "no memory for new connection");
Andre Guedes230fd162012-07-27 15:10:10 -03004583 goto unlock;
Ville Tervob62f3282011-02-10 22:38:50 -03004584 }
Andre Guedes29b79882011-05-31 14:20:54 -03004585
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304586 conn->dst_type = bdaddr_type;
Andre Guedesb9b343d2012-07-27 15:10:11 -03004587
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004588 /* If we didn't have a hci_conn object previously
4589 * but we're in master role this must be something
4590 * initiated using a white list. Since white list based
4591 * connections are not "first class citizens" we don't
4592 * have full tracking of them. Therefore, we go ahead
4593 * with a "best effort" approach of determining the
4594 * initiator address based on the HCI_PRIVACY flag.
4595 */
4596 if (conn->out) {
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304597 conn->resp_addr_type = bdaddr_type;
4598 bacpy(&conn->resp_addr, bdaddr);
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004599 if (hci_dev_test_flag(hdev, HCI_PRIVACY)) {
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004600 conn->init_addr_type = ADDR_LE_DEV_RANDOM;
4601 bacpy(&conn->init_addr, &hdev->rpa);
4602 } else {
4603 hci_copy_identity_address(hdev,
4604 &conn->init_addr,
4605 &conn->init_addr_type);
4606 }
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004607 }
Johan Hedberg9489eca2014-02-28 17:45:46 +02004608 } else {
4609 cancel_delayed_work(&conn->le_conn_timeout);
Ville Tervob62f3282011-02-10 22:38:50 -03004610 }
Ville Tervofcd89c02011-02-10 22:38:47 -03004611
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004612 if (!conn->out) {
4613 /* Set the responder (our side) address type based on
4614 * the advertising address type.
4615 */
4616 conn->resp_addr_type = hdev->adv_addr_type;
4617 if (hdev->adv_addr_type == ADDR_LE_DEV_RANDOM)
4618 bacpy(&conn->resp_addr, &hdev->random_addr);
4619 else
4620 bacpy(&conn->resp_addr, &hdev->bdaddr);
4621
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304622 conn->init_addr_type = bdaddr_type;
4623 bacpy(&conn->init_addr, bdaddr);
Marcel Holtmanna720d732014-06-23 12:14:51 +02004624
4625 /* For incoming connections, set the default minimum
4626 * and maximum connection interval. They will be used
4627 * to check if the parameters are in range and if not
4628 * trigger the connection update procedure.
4629 */
4630 conn->le_conn_min_interval = hdev->le_conn_min_interval;
4631 conn->le_conn_max_interval = hdev->le_conn_max_interval;
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004632 }
Johan Hedberg7be2edb2014-02-23 19:42:17 +02004633
Marcel Holtmannedb4b462014-02-18 15:13:43 -08004634 /* Lookup the identity address from the stored connection
4635 * address and address type.
4636 *
4637 * When establishing connections to an identity address, the
4638 * connection procedure will store the resolvable random
4639 * address first. Now if it can be converted back into the
4640 * identity address, start using the identity address from
4641 * now on.
4642 */
4643 irk = hci_get_irk(hdev, &conn->dst, conn->dst_type);
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004644 if (irk) {
4645 bacpy(&conn->dst, &irk->bdaddr);
4646 conn->dst_type = irk->addr_type;
4647 }
4648
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304649 if (status) {
4650 hci_le_conn_failed(conn, status);
Johan Hedberg837d5022014-07-02 09:36:22 +03004651 goto unlock;
4652 }
4653
Johan Hedberg08853f12014-08-15 21:06:55 +03004654 if (conn->dst_type == ADDR_LE_DEV_PUBLIC)
4655 addr_type = BDADDR_LE_PUBLIC;
4656 else
4657 addr_type = BDADDR_LE_RANDOM;
4658
Johan Hedberg2d3c2262014-07-15 11:51:28 +03004659 /* Drop the connection if the device is blocked */
4660 if (hci_bdaddr_list_lookup(&hdev->blacklist, &conn->dst, addr_type)) {
4661 hci_conn_drop(conn);
Andre Guedescd17dec2012-07-27 15:10:16 -03004662 goto unlock;
4663 }
4664
Johan Hedbergb644ba32012-01-17 21:48:47 +02004665 if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00004666 mgmt_device_connected(hdev, conn, 0, NULL, 0);
Vinicius Costa Gomes83bc71b2011-05-06 18:41:43 -03004667
Vinicius Costa Gomes7b5c0d52011-06-09 18:50:50 -03004668 conn->sec_level = BT_SECURITY_LOW;
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304669 conn->handle = handle;
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07004670 conn->state = BT_CONFIG;
Ville Tervofcd89c02011-02-10 22:38:47 -03004671
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304672 conn->le_conn_interval = interval;
4673 conn->le_conn_latency = latency;
4674 conn->le_supv_timeout = supervision_timeout;
Marcel Holtmanne04fde62014-06-23 11:40:04 +02004675
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01004676 hci_debugfs_create_conn(conn);
Ville Tervofcd89c02011-02-10 22:38:47 -03004677 hci_conn_add_sysfs(conn);
4678
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304679 if (!status) {
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07004680 /* The remote features procedure is defined for master
4681 * role only. So only in case of an initiated connection
4682 * request the remote features.
4683 *
4684 * If the local controller supports slave-initiated features
4685 * exchange, then requesting the remote features in slave
4686 * role is possible. Otherwise just transition into the
4687 * connected state without requesting the remote features.
4688 */
4689 if (conn->out ||
4690 (hdev->le_features[0] & HCI_LE_SLAVE_FEATURES)) {
4691 struct hci_cp_le_read_remote_features cp;
4692
4693 cp.handle = __cpu_to_le16(conn->handle);
4694
4695 hci_send_cmd(hdev, HCI_OP_LE_READ_REMOTE_FEATURES,
4696 sizeof(cp), &cp);
4697
4698 hci_conn_hold(conn);
4699 } else {
4700 conn->state = BT_CONNECTED;
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304701 hci_connect_cfm(conn, status);
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07004702 }
4703 } else {
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304704 hci_connect_cfm(conn, status);
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07004705 }
Ville Tervofcd89c02011-02-10 22:38:47 -03004706
Johan Hedberg54776102014-08-15 21:06:56 +03004707 params = hci_pend_le_action_lookup(&hdev->pend_le_conns, &conn->dst,
4708 conn->dst_type);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004709 if (params) {
Johan Hedberg95305ba2014-07-04 12:37:21 +03004710 list_del_init(&params->action);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004711 if (params->conn) {
4712 hci_conn_drop(params->conn);
Johan Hedbergf8aaf9b2014-08-17 23:28:57 +03004713 hci_conn_put(params->conn);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004714 params->conn = NULL;
4715 }
4716 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004717
Ville Tervofcd89c02011-02-10 22:38:47 -03004718unlock:
Johan Hedberg223683a2014-07-06 15:44:23 +03004719 hci_update_background_scan(hdev);
Ville Tervofcd89c02011-02-10 22:38:47 -03004720 hci_dev_unlock(hdev);
4721}
4722
Jaganath Kanakkasseryd12fb052018-07-06 17:05:30 +05304723static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
4724{
4725 struct hci_ev_le_conn_complete *ev = (void *) skb->data;
4726
4727 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4728
4729 le_conn_complete_evt(hdev, ev->status, &ev->bdaddr, ev->bdaddr_type,
4730 ev->role, le16_to_cpu(ev->handle),
4731 le16_to_cpu(ev->interval),
4732 le16_to_cpu(ev->latency),
4733 le16_to_cpu(ev->supervision_timeout));
4734}
4735
Marcel Holtmann1855d922014-06-23 11:40:05 +02004736static void hci_le_conn_update_complete_evt(struct hci_dev *hdev,
4737 struct sk_buff *skb)
4738{
4739 struct hci_ev_le_conn_update_complete *ev = (void *) skb->data;
4740 struct hci_conn *conn;
4741
4742 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4743
4744 if (ev->status)
4745 return;
4746
4747 hci_dev_lock(hdev);
4748
4749 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
4750 if (conn) {
4751 conn->le_conn_interval = le16_to_cpu(ev->interval);
4752 conn->le_conn_latency = le16_to_cpu(ev->latency);
4753 conn->le_supv_timeout = le16_to_cpu(ev->supervision_timeout);
4754 }
4755
4756 hci_dev_unlock(hdev);
4757}
4758
Andre Guedesa4790db2014-02-26 20:21:47 -03004759/* This function requires the caller holds hdev->lock */
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004760static struct hci_conn *check_pending_le_conn(struct hci_dev *hdev,
4761 bdaddr_t *addr,
Szymon Janc082f2302018-04-03 13:40:06 +02004762 u8 addr_type, u8 adv_type,
4763 bdaddr_t *direct_rpa)
Andre Guedesa4790db2014-02-26 20:21:47 -03004764{
4765 struct hci_conn *conn;
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004766 struct hci_conn_params *params;
Andre Guedesa4790db2014-02-26 20:21:47 -03004767
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004768 /* If the event is not connectable don't proceed further */
4769 if (adv_type != LE_ADV_IND && adv_type != LE_ADV_DIRECT_IND)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004770 return NULL;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004771
4772 /* Ignore if the device is blocked */
Johan Hedbergdcc36c12014-07-09 12:59:13 +03004773 if (hci_bdaddr_list_lookup(&hdev->blacklist, addr, addr_type))
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004774 return NULL;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004775
Johan Hedbergf99353c2014-07-16 11:56:09 +03004776 /* Most controller will fail if we try to create new connections
4777 * while we have an existing one in slave role.
4778 */
4779 if (hdev->conn_hash.le_num_slave > 0)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004780 return NULL;
Johan Hedbergf99353c2014-07-16 11:56:09 +03004781
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004782 /* If we're not connectable only connect devices that we have in
4783 * our pend_le_conns list.
4784 */
Johan Hedberg49c50922015-10-16 10:07:51 +03004785 params = hci_pend_le_action_lookup(&hdev->pend_le_conns, addr,
4786 addr_type);
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004787 if (!params)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004788 return NULL;
Andre Guedesa4790db2014-02-26 20:21:47 -03004789
Jakub Pawlowski28a667c2015-08-07 20:22:54 +02004790 if (!params->explicit_connect) {
4791 switch (params->auto_connect) {
4792 case HCI_AUTO_CONN_DIRECT:
4793 /* Only devices advertising with ADV_DIRECT_IND are
4794 * triggering a connection attempt. This is allowing
4795 * incoming connections from slave devices.
4796 */
4797 if (adv_type != LE_ADV_DIRECT_IND)
4798 return NULL;
4799 break;
4800 case HCI_AUTO_CONN_ALWAYS:
4801 /* Devices advertising with ADV_IND or ADV_DIRECT_IND
4802 * are triggering a connection attempt. This means
4803 * that incoming connectioms from slave device are
4804 * accepted and also outgoing connections to slave
4805 * devices are established when found.
4806 */
4807 break;
4808 default:
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004809 return NULL;
Jakub Pawlowski28a667c2015-08-07 20:22:54 +02004810 }
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004811 }
4812
Andre Guedesa4790db2014-02-26 20:21:47 -03004813 conn = hci_connect_le(hdev, addr, addr_type, BT_SECURITY_LOW,
Szymon Janc082f2302018-04-03 13:40:06 +02004814 HCI_LE_AUTOCONN_TIMEOUT, HCI_ROLE_MASTER,
4815 direct_rpa);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004816 if (!IS_ERR(conn)) {
Jakub Pawlowski28a667c2015-08-07 20:22:54 +02004817 /* If HCI_AUTO_CONN_EXPLICIT is set, conn is already owned
4818 * by higher layer that tried to connect, if no then
4819 * store the pointer since we don't really have any
Johan Hedbergf161dd42014-08-15 21:06:54 +03004820 * other owner of the object besides the params that
4821 * triggered it. This way we can abort the connection if
4822 * the parameters get removed and keep the reference
4823 * count consistent once the connection is established.
4824 */
Jakub Pawlowski28a667c2015-08-07 20:22:54 +02004825
4826 if (!params->explicit_connect)
4827 params->conn = hci_conn_get(conn);
4828
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004829 return conn;
Johan Hedbergf161dd42014-08-15 21:06:54 +03004830 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004831
4832 switch (PTR_ERR(conn)) {
4833 case -EBUSY:
4834 /* If hci_connect() returns -EBUSY it means there is already
4835 * an LE connection attempt going on. Since controllers don't
4836 * support more than one connection attempt at the time, we
4837 * don't consider this an error case.
4838 */
4839 break;
4840 default:
4841 BT_DBG("Failed to connect: err %ld", PTR_ERR(conn));
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004842 return NULL;
Andre Guedesa4790db2014-02-26 20:21:47 -03004843 }
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004844
4845 return NULL;
Andre Guedesa4790db2014-02-26 20:21:47 -03004846}
4847
Johan Hedberg4af605d2014-03-24 10:48:00 +02004848static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr,
Marcel Holtmann2f010b52014-12-05 16:20:13 +01004849 u8 bdaddr_type, bdaddr_t *direct_addr,
4850 u8 direct_addr_type, s8 rssi, u8 *data, u8 len)
Johan Hedberg4af605d2014-03-24 10:48:00 +02004851{
Johan Hedbergb9a63282014-03-25 10:51:52 +02004852 struct discovery_state *d = &hdev->discovery;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004853 struct smp_irk *irk;
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004854 struct hci_conn *conn;
Johan Hedberg474ee062014-03-25 14:34:59 +02004855 bool match;
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004856 u32 flags;
Szymon Janc68183752015-09-16 20:21:54 +02004857 u8 *ptr, real_len;
4858
Johan Hedberg56b40fb2016-04-07 21:01:27 +03004859 switch (type) {
4860 case LE_ADV_IND:
4861 case LE_ADV_DIRECT_IND:
4862 case LE_ADV_SCAN_IND:
4863 case LE_ADV_NONCONN_IND:
4864 case LE_ADV_SCAN_RSP:
4865 break;
4866 default:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01004867 bt_dev_err_ratelimited(hdev, "unknown advertising packet "
4868 "type: 0x%02x", type);
Johan Hedberg56b40fb2016-04-07 21:01:27 +03004869 return;
4870 }
4871
Szymon Janc68183752015-09-16 20:21:54 +02004872 /* Find the end of the data in case the report contains padded zero
4873 * bytes at the end causing an invalid length value.
4874 *
4875 * When data is NULL, len is 0 so there is no need for extra ptr
4876 * check as 'ptr < data + 0' is already false in such case.
4877 */
4878 for (ptr = data; ptr < data + len && *ptr; ptr += *ptr + 1) {
4879 if (ptr + 1 + *ptr > data + len)
4880 break;
4881 }
4882
4883 real_len = ptr - data;
4884
4885 /* Adjust for actual length */
4886 if (len != real_len) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01004887 bt_dev_err_ratelimited(hdev, "advertising data len corrected");
Szymon Janc68183752015-09-16 20:21:54 +02004888 len = real_len;
4889 }
Johan Hedbergb9a63282014-03-25 10:51:52 +02004890
Marcel Holtmann2f010b52014-12-05 16:20:13 +01004891 /* If the direct address is present, then this report is from
4892 * a LE Direct Advertising Report event. In that case it is
4893 * important to see if the address is matching the local
4894 * controller address.
4895 */
4896 if (direct_addr) {
4897 /* Only resolvable random addresses are valid for these
4898 * kind of reports and others can be ignored.
4899 */
4900 if (!hci_bdaddr_is_rpa(direct_addr, direct_addr_type))
4901 return;
4902
4903 /* If the controller is not using resolvable random
4904 * addresses, then this report can be ignored.
4905 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004906 if (!hci_dev_test_flag(hdev, HCI_PRIVACY))
Marcel Holtmann2f010b52014-12-05 16:20:13 +01004907 return;
4908
4909 /* If the local IRK of the controller does not match
4910 * with the resolvable random address provided, then
4911 * this report can be ignored.
4912 */
4913 if (!smp_irk_matches(hdev, hdev->irk, direct_addr))
4914 return;
4915 }
4916
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004917 /* Check if we need to convert to identity address */
4918 irk = hci_get_irk(hdev, bdaddr, bdaddr_type);
4919 if (irk) {
4920 bdaddr = &irk->bdaddr;
4921 bdaddr_type = irk->addr_type;
4922 }
4923
Szymon Janc082f2302018-04-03 13:40:06 +02004924 /* Check if we have been requested to connect to this device.
4925 *
4926 * direct_addr is set only for directed advertising reports (it is NULL
4927 * for advertising reports) and is already verified to be RPA above.
4928 */
4929 conn = check_pending_le_conn(hdev, bdaddr, bdaddr_type, type,
4930 direct_addr);
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004931 if (conn && type == LE_ADV_IND) {
4932 /* Store report for later inclusion by
4933 * mgmt_device_connected
4934 */
4935 memcpy(conn->le_adv_data, data, len);
4936 conn->le_adv_data_len = len;
4937 }
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004938
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004939 /* Passive scanning shouldn't trigger any device found events,
4940 * except for devices marked as CONN_REPORT for which we do send
4941 * device found events.
4942 */
Johan Hedbergca5c4be2014-03-25 10:30:46 +02004943 if (hdev->le_scan_type == LE_SCAN_PASSIVE) {
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004944 if (type == LE_ADV_DIRECT_IND)
4945 return;
4946
Johan Hedberg3a19b6f2014-07-15 08:07:59 +03004947 if (!hci_pend_le_action_lookup(&hdev->pend_le_reports,
4948 bdaddr, bdaddr_type))
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004949 return;
4950
4951 if (type == LE_ADV_NONCONN_IND || type == LE_ADV_SCAN_IND)
4952 flags = MGMT_DEV_FOUND_NOT_CONNECTABLE;
4953 else
4954 flags = 0;
4955 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
4956 rssi, flags, data, len, NULL, 0);
Johan Hedberg97bf2e92014-07-04 12:37:16 +03004957 return;
Johan Hedbergca5c4be2014-03-25 10:30:46 +02004958 }
Johan Hedberg4af605d2014-03-24 10:48:00 +02004959
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004960 /* When receiving non-connectable or scannable undirected
4961 * advertising reports, this means that the remote device is
4962 * not connectable and then clearly indicate this in the
4963 * device found event.
4964 *
4965 * When receiving a scan response, then there is no way to
4966 * know if the remote device is connectable or not. However
4967 * since scan responses are merged with a previously seen
4968 * advertising report, the flags field from that report
4969 * will be used.
4970 *
4971 * In the really unlikely case that a controller get confused
4972 * and just sends a scan response event, then it is marked as
4973 * not connectable as well.
4974 */
4975 if (type == LE_ADV_NONCONN_IND || type == LE_ADV_SCAN_IND ||
4976 type == LE_ADV_SCAN_RSP)
4977 flags = MGMT_DEV_FOUND_NOT_CONNECTABLE;
4978 else
4979 flags = 0;
4980
Johan Hedbergb9a63282014-03-25 10:51:52 +02004981 /* If there's nothing pending either store the data from this
4982 * event or send an immediate device found event if the data
4983 * should not be stored for later.
4984 */
4985 if (!has_pending_adv_report(hdev)) {
4986 /* If the report will trigger a SCAN_REQ store it for
4987 * later merging.
4988 */
4989 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
4990 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004991 rssi, flags, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004992 return;
4993 }
4994
4995 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004996 rssi, flags, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004997 return;
4998 }
4999
Johan Hedberg474ee062014-03-25 14:34:59 +02005000 /* Check if the pending report is for the same device as the new one */
5001 match = (!bacmp(bdaddr, &d->last_adv_addr) &&
5002 bdaddr_type == d->last_adv_addr_type);
5003
Johan Hedbergb9a63282014-03-25 10:51:52 +02005004 /* If the pending data doesn't match this report or this isn't a
5005 * scan response (e.g. we got a duplicate ADV_IND) then force
5006 * sending of the pending data.
5007 */
Johan Hedberg474ee062014-03-25 14:34:59 +02005008 if (type != LE_ADV_SCAN_RSP || !match) {
5009 /* Send out whatever is in the cache, but skip duplicates */
5010 if (!match)
5011 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergff5cd292014-03-25 14:40:52 +02005012 d->last_adv_addr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02005013 d->last_adv_rssi, d->last_adv_flags,
Johan Hedbergff5cd292014-03-25 14:40:52 +02005014 d->last_adv_data,
Johan Hedberg474ee062014-03-25 14:34:59 +02005015 d->last_adv_data_len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02005016
5017 /* If the new report will trigger a SCAN_REQ store it for
5018 * later merging.
5019 */
5020 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
5021 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02005022 rssi, flags, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02005023 return;
5024 }
5025
5026 /* The advertising reports cannot be merged, so clear
5027 * the pending report and send out a device found event.
5028 */
5029 clear_pending_adv_report(hdev);
Johan Hedberg5c5b93e2014-03-29 08:39:53 +02005030 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02005031 rssi, flags, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02005032 return;
5033 }
5034
5035 /* If we get here we've got a pending ADV_IND or ADV_SCAN_IND and
5036 * the new event is a SCAN_RSP. We can therefore proceed with
5037 * sending a merged device found event.
5038 */
5039 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02005040 d->last_adv_addr_type, NULL, rssi, d->last_adv_flags,
Marcel Holtmann42bd6a52014-07-01 14:11:19 +02005041 d->last_adv_data, d->last_adv_data_len, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02005042 clear_pending_adv_report(hdev);
Johan Hedberg4af605d2014-03-24 10:48:00 +02005043}
5044
Gustavo Padovan6039aa72012-05-23 04:04:18 -03005045static void hci_le_adv_report_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andre Guedes9aa04c92011-05-26 16:23:51 -03005046{
Andre Guedese95beb42011-09-26 20:48:35 -03005047 u8 num_reports = skb->data[0];
5048 void *ptr = &skb->data[1];
Andre Guedes9aa04c92011-05-26 16:23:51 -03005049
Andre Guedesa4790db2014-02-26 20:21:47 -03005050 hci_dev_lock(hdev);
5051
Andre Guedese95beb42011-09-26 20:48:35 -03005052 while (num_reports--) {
5053 struct hci_ev_le_advertising_info *ev = ptr;
Johan Hedberg4af605d2014-03-24 10:48:00 +02005054 s8 rssi;
Andre Guedesa4790db2014-02-26 20:21:47 -03005055
Chriz Chowee649342018-04-20 15:46:24 +08005056 if (ev->length <= HCI_MAX_AD_LENGTH) {
5057 rssi = ev->data[ev->length];
5058 process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
5059 ev->bdaddr_type, NULL, 0, rssi,
5060 ev->data, ev->length);
5061 } else {
5062 bt_dev_err(hdev, "Dropping invalid advertising data");
5063 }
Andre Guedes3c9e9192012-01-10 18:20:50 -03005064
Andre Guedese95beb42011-09-26 20:48:35 -03005065 ptr += sizeof(*ev) + ev->length + 1;
Andre Guedes9aa04c92011-05-26 16:23:51 -03005066 }
Andre Guedesa4790db2014-02-26 20:21:47 -03005067
5068 hci_dev_unlock(hdev);
Andre Guedes9aa04c92011-05-26 16:23:51 -03005069}
5070
Jaganath Kanakkasseryc215e932018-07-06 17:05:29 +05305071static u8 convert_legacy_evt_type(u16 evt_type)
5072{
5073 switch (evt_type) {
5074 case LE_LEGACY_ADV_IND:
5075 return LE_ADV_IND;
5076 case LE_LEGACY_ADV_DIRECT_IND:
5077 return LE_ADV_DIRECT_IND;
5078 case LE_LEGACY_ADV_SCAN_IND:
5079 return LE_ADV_SCAN_IND;
5080 case LE_LEGACY_NONCONN_IND:
5081 return LE_ADV_NONCONN_IND;
5082 case LE_LEGACY_SCAN_RSP_ADV:
5083 case LE_LEGACY_SCAN_RSP_ADV_SCAN:
5084 return LE_ADV_SCAN_RSP;
5085 }
5086
5087 BT_ERR_RATELIMITED("Unknown advertising packet type: 0x%02x",
5088 evt_type);
5089
5090 return LE_ADV_INVALID;
5091}
5092
5093static void hci_le_ext_adv_report_evt(struct hci_dev *hdev, struct sk_buff *skb)
5094{
5095 u8 num_reports = skb->data[0];
5096 void *ptr = &skb->data[1];
5097
5098 hci_dev_lock(hdev);
5099
5100 while (num_reports--) {
5101 struct hci_ev_le_ext_adv_report *ev = ptr;
5102 u8 legacy_evt_type;
5103 u16 evt_type;
5104
5105 evt_type = __le16_to_cpu(ev->evt_type);
5106 legacy_evt_type = convert_legacy_evt_type(evt_type);
5107 if (legacy_evt_type != LE_ADV_INVALID) {
5108 process_adv_report(hdev, legacy_evt_type, &ev->bdaddr,
5109 ev->bdaddr_type, NULL, 0, ev->rssi,
5110 ev->data, ev->length);
5111 }
5112
5113 ptr += sizeof(*ev) + ev->length + 1;
5114 }
5115
5116 hci_dev_unlock(hdev);
5117}
5118
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07005119static void hci_le_remote_feat_complete_evt(struct hci_dev *hdev,
5120 struct sk_buff *skb)
5121{
5122 struct hci_ev_le_remote_feat_complete *ev = (void *)skb->data;
5123 struct hci_conn *conn;
5124
5125 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
5126
5127 hci_dev_lock(hdev);
5128
5129 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
5130 if (conn) {
5131 if (!ev->status)
5132 memcpy(conn->features[0], ev->features, 8);
5133
5134 if (conn->state == BT_CONFIG) {
5135 __u8 status;
5136
5137 /* If the local controller supports slave-initiated
5138 * features exchange, but the remote controller does
5139 * not, then it is possible that the error code 0x1a
5140 * for unsupported remote feature gets returned.
5141 *
5142 * In this specific case, allow the connection to
5143 * transition into connected state and mark it as
5144 * successful.
5145 */
5146 if ((hdev->le_features[0] & HCI_LE_SLAVE_FEATURES) &&
5147 !conn->out && ev->status == 0x1a)
5148 status = 0x00;
5149 else
5150 status = ev->status;
5151
5152 conn->state = BT_CONNECTED;
5153 hci_connect_cfm(conn, status);
5154 hci_conn_drop(conn);
5155 }
5156 }
5157
5158 hci_dev_unlock(hdev);
5159}
5160
Gustavo Padovan6039aa72012-05-23 04:04:18 -03005161static void hci_le_ltk_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005162{
5163 struct hci_ev_le_ltk_req *ev = (void *) skb->data;
5164 struct hci_cp_le_ltk_reply cp;
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03005165 struct hci_cp_le_ltk_neg_reply neg;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005166 struct hci_conn *conn;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03005167 struct smp_ltk *ltk;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005168
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03005169 BT_DBG("%s handle 0x%4.4x", hdev->name, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005170
5171 hci_dev_lock(hdev);
5172
5173 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03005174 if (conn == NULL)
5175 goto not_found;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005176
Johan Hedbergf3a73d92014-05-29 15:02:59 +03005177 ltk = hci_find_ltk(hdev, &conn->dst, conn->dst_type, conn->role);
Johan Hedberg5378bc52014-05-29 14:00:39 +03005178 if (!ltk)
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03005179 goto not_found;
5180
Johan Hedberg5378bc52014-05-29 14:00:39 +03005181 if (smp_ltk_is_sc(ltk)) {
5182 /* With SC both EDiv and Rand are set to zero */
5183 if (ev->ediv || ev->rand)
5184 goto not_found;
5185 } else {
5186 /* For non-SC keys check that EDiv and Rand match */
5187 if (ev->ediv != ltk->ediv || ev->rand != ltk->rand)
5188 goto not_found;
5189 }
5190
Johan Hedberg8b76ce32015-06-08 18:14:39 +03005191 memcpy(cp.ltk, ltk->val, ltk->enc_size);
5192 memset(cp.ltk + ltk->enc_size, 0, sizeof(cp.ltk) - ltk->enc_size);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005193 cp.handle = cpu_to_le16(conn->handle);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03005194
Johan Hedberga6f78332014-09-10 17:37:45 -07005195 conn->pending_sec_level = smp_ltk_sec_level(ltk);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005196
Andre Guedes89cbb4d2013-07-31 16:25:29 -03005197 conn->enc_key_size = ltk->enc_size;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005198
5199 hci_send_cmd(hdev, HCI_OP_LE_LTK_REPLY, sizeof(cp), &cp);
5200
Claudio Takahasi5981a882013-07-25 16:34:24 -03005201 /* Ref. Bluetooth Core SPEC pages 1975 and 2004. STK is a
5202 * temporary key used to encrypt a connection following
5203 * pairing. It is used during the Encrypted Session Setup to
5204 * distribute the keys. Later, security can be re-established
5205 * using a distributed LTK.
5206 */
Johan Hedberg2ceba532014-06-16 19:25:16 +03005207 if (ltk->type == SMP_STK) {
Johan Hedbergfe59a052014-07-01 19:14:12 +03005208 set_bit(HCI_CONN_STK_ENCRYPT, &conn->flags);
Johan Hedberg970d0f12014-11-13 14:37:47 +02005209 list_del_rcu(&ltk->list);
5210 kfree_rcu(ltk, rcu);
Johan Hedbergfe59a052014-07-01 19:14:12 +03005211 } else {
5212 clear_bit(HCI_CONN_STK_ENCRYPT, &conn->flags);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03005213 }
5214
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005215 hci_dev_unlock(hdev);
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03005216
5217 return;
5218
5219not_found:
5220 neg.handle = ev->handle;
5221 hci_send_cmd(hdev, HCI_OP_LE_LTK_NEG_REPLY, sizeof(neg), &neg);
5222 hci_dev_unlock(hdev);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005223}
5224
Andre Guedes8e75b462014-07-01 18:10:08 -03005225static void send_conn_param_neg_reply(struct hci_dev *hdev, u16 handle,
5226 u8 reason)
5227{
5228 struct hci_cp_le_conn_param_req_neg_reply cp;
5229
5230 cp.handle = cpu_to_le16(handle);
5231 cp.reason = reason;
5232
5233 hci_send_cmd(hdev, HCI_OP_LE_CONN_PARAM_REQ_NEG_REPLY, sizeof(cp),
5234 &cp);
5235}
5236
5237static void hci_le_remote_conn_param_req_evt(struct hci_dev *hdev,
5238 struct sk_buff *skb)
5239{
5240 struct hci_ev_le_remote_conn_param_req *ev = (void *) skb->data;
5241 struct hci_cp_le_conn_param_req_reply cp;
5242 struct hci_conn *hcon;
5243 u16 handle, min, max, latency, timeout;
5244
5245 handle = le16_to_cpu(ev->handle);
5246 min = le16_to_cpu(ev->interval_min);
5247 max = le16_to_cpu(ev->interval_max);
5248 latency = le16_to_cpu(ev->latency);
5249 timeout = le16_to_cpu(ev->timeout);
5250
5251 hcon = hci_conn_hash_lookup_handle(hdev, handle);
5252 if (!hcon || hcon->state != BT_CONNECTED)
5253 return send_conn_param_neg_reply(hdev, handle,
5254 HCI_ERROR_UNKNOWN_CONN_ID);
5255
5256 if (hci_check_conn_params(min, max, latency, timeout))
5257 return send_conn_param_neg_reply(hdev, handle,
5258 HCI_ERROR_INVALID_LL_PARAMS);
5259
Johan Hedberg40bef302014-07-16 11:42:27 +03005260 if (hcon->role == HCI_ROLE_MASTER) {
Johan Hedberg348d50b2014-07-02 17:37:30 +03005261 struct hci_conn_params *params;
Johan Hedbergf4869e22014-07-02 17:37:32 +03005262 u8 store_hint;
Johan Hedberg348d50b2014-07-02 17:37:30 +03005263
5264 hci_dev_lock(hdev);
5265
5266 params = hci_conn_params_lookup(hdev, &hcon->dst,
5267 hcon->dst_type);
5268 if (params) {
5269 params->conn_min_interval = min;
5270 params->conn_max_interval = max;
5271 params->conn_latency = latency;
5272 params->supervision_timeout = timeout;
Johan Hedbergf4869e22014-07-02 17:37:32 +03005273 store_hint = 0x01;
5274 } else{
5275 store_hint = 0x00;
Johan Hedberg348d50b2014-07-02 17:37:30 +03005276 }
5277
5278 hci_dev_unlock(hdev);
5279
Johan Hedbergf4869e22014-07-02 17:37:32 +03005280 mgmt_new_conn_param(hdev, &hcon->dst, hcon->dst_type,
5281 store_hint, min, max, latency, timeout);
Johan Hedberg348d50b2014-07-02 17:37:30 +03005282 }
Andre Guedesffb5a8272014-07-01 18:10:11 -03005283
Andre Guedes8e75b462014-07-01 18:10:08 -03005284 cp.handle = ev->handle;
5285 cp.interval_min = ev->interval_min;
5286 cp.interval_max = ev->interval_max;
5287 cp.latency = ev->latency;
5288 cp.timeout = ev->timeout;
5289 cp.min_ce_len = 0;
5290 cp.max_ce_len = 0;
5291
5292 hci_send_cmd(hdev, HCI_OP_LE_CONN_PARAM_REQ_REPLY, sizeof(cp), &cp);
5293}
5294
Marcel Holtmann2f010b52014-12-05 16:20:13 +01005295static void hci_le_direct_adv_report_evt(struct hci_dev *hdev,
5296 struct sk_buff *skb)
5297{
5298 u8 num_reports = skb->data[0];
5299 void *ptr = &skb->data[1];
5300
5301 hci_dev_lock(hdev);
5302
5303 while (num_reports--) {
5304 struct hci_ev_le_direct_adv_info *ev = ptr;
5305
5306 process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
5307 ev->bdaddr_type, &ev->direct_addr,
5308 ev->direct_addr_type, ev->rssi, NULL, 0);
5309
5310 ptr += sizeof(*ev);
5311 }
5312
5313 hci_dev_unlock(hdev);
5314}
5315
Gustavo Padovan6039aa72012-05-23 04:04:18 -03005316static void hci_le_meta_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03005317{
5318 struct hci_ev_le_meta *le_ev = (void *) skb->data;
5319
5320 skb_pull(skb, sizeof(*le_ev));
5321
5322 switch (le_ev->subevent) {
5323 case HCI_EV_LE_CONN_COMPLETE:
5324 hci_le_conn_complete_evt(hdev, skb);
5325 break;
5326
Marcel Holtmann1855d922014-06-23 11:40:05 +02005327 case HCI_EV_LE_CONN_UPDATE_COMPLETE:
5328 hci_le_conn_update_complete_evt(hdev, skb);
5329 break;
5330
Andre Guedes9aa04c92011-05-26 16:23:51 -03005331 case HCI_EV_LE_ADVERTISING_REPORT:
5332 hci_le_adv_report_evt(hdev, skb);
5333 break;
5334
Marcel Holtmann0fe29fd2015-04-08 09:05:27 -07005335 case HCI_EV_LE_REMOTE_FEAT_COMPLETE:
5336 hci_le_remote_feat_complete_evt(hdev, skb);
5337 break;
5338
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005339 case HCI_EV_LE_LTK_REQ:
5340 hci_le_ltk_request_evt(hdev, skb);
5341 break;
5342
Andre Guedes8e75b462014-07-01 18:10:08 -03005343 case HCI_EV_LE_REMOTE_CONN_PARAM_REQ:
5344 hci_le_remote_conn_param_req_evt(hdev, skb);
5345 break;
5346
Marcel Holtmann2f010b52014-12-05 16:20:13 +01005347 case HCI_EV_LE_DIRECT_ADV_REPORT:
5348 hci_le_direct_adv_report_evt(hdev, skb);
5349 break;
5350
Jaganath Kanakkasseryc215e932018-07-06 17:05:29 +05305351 case HCI_EV_LE_EXT_ADV_REPORT:
5352 hci_le_ext_adv_report_evt(hdev, skb);
5353 break;
5354
Ville Tervofcd89c02011-02-10 22:38:47 -03005355 default:
5356 break;
5357 }
5358}
5359
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005360static bool hci_get_cmd_complete(struct hci_dev *hdev, u16 opcode,
5361 u8 event, struct sk_buff *skb)
5362{
5363 struct hci_ev_cmd_complete *ev;
5364 struct hci_event_hdr *hdr;
5365
5366 if (!skb)
5367 return false;
5368
5369 if (skb->len < sizeof(*hdr)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01005370 bt_dev_err(hdev, "too short HCI event");
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005371 return false;
5372 }
5373
5374 hdr = (void *) skb->data;
5375 skb_pull(skb, HCI_EVENT_HDR_SIZE);
5376
5377 if (event) {
5378 if (hdr->evt != event)
5379 return false;
5380 return true;
5381 }
5382
5383 if (hdr->evt != HCI_EV_CMD_COMPLETE) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01005384 bt_dev_err(hdev, "last event is not cmd complete (0x%2.2x)",
5385 hdr->evt);
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005386 return false;
5387 }
5388
5389 if (skb->len < sizeof(*ev)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01005390 bt_dev_err(hdev, "too short cmd_complete event");
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005391 return false;
5392 }
5393
5394 ev = (void *) skb->data;
5395 skb_pull(skb, sizeof(*ev));
5396
5397 if (opcode != __le16_to_cpu(ev->opcode)) {
5398 BT_DBG("opcode doesn't match (0x%2.2x != 0x%2.2x)", opcode,
5399 __le16_to_cpu(ev->opcode));
5400 return false;
5401 }
5402
5403 return true;
5404}
5405
Linus Torvalds1da177e2005-04-16 15:20:36 -07005406void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)
5407{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005408 struct hci_event_hdr *hdr = (void *) skb->data;
Johan Hedberge62144872015-04-02 13:41:08 +03005409 hci_req_complete_t req_complete = NULL;
5410 hci_req_complete_skb_t req_complete_skb = NULL;
5411 struct sk_buff *orig_skb = NULL;
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005412 u8 status = 0, event = hdr->evt, req_evt = 0;
Johan Hedberge62144872015-04-02 13:41:08 +03005413 u16 opcode = HCI_OP_NOP;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005414
Marcel Holtmann242c0eb2015-10-25 22:45:53 +01005415 if (hdev->sent_cmd && bt_cb(hdev->sent_cmd)->hci.req_event == event) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02005416 struct hci_command_hdr *cmd_hdr = (void *) hdev->sent_cmd->data;
Johan Hedberge62144872015-04-02 13:41:08 +03005417 opcode = __le16_to_cpu(cmd_hdr->opcode);
5418 hci_req_cmd_complete(hdev, opcode, status, &req_complete,
5419 &req_complete_skb);
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005420 req_evt = event;
Johan Hedberg02350a72013-04-03 21:50:29 +03005421 }
5422
Johan Hedberge62144872015-04-02 13:41:08 +03005423 /* If it looks like we might end up having to call
5424 * req_complete_skb, store a pristine copy of the skb since the
5425 * various handlers may modify the original one through
5426 * skb_pull() calls, etc.
5427 */
5428 if (req_complete_skb || event == HCI_EV_CMD_STATUS ||
5429 event == HCI_EV_CMD_COMPLETE)
5430 orig_skb = skb_clone(skb, GFP_KERNEL);
5431
5432 skb_pull(skb, HCI_EVENT_HDR_SIZE);
5433
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005434 switch (event) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005435 case HCI_EV_INQUIRY_COMPLETE:
5436 hci_inquiry_complete_evt(hdev, skb);
5437 break;
5438
5439 case HCI_EV_INQUIRY_RESULT:
5440 hci_inquiry_result_evt(hdev, skb);
5441 break;
5442
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005443 case HCI_EV_CONN_COMPLETE:
5444 hci_conn_complete_evt(hdev, skb);
Marcel Holtmann21d9e302005-09-13 01:32:25 +02005445 break;
5446
Linus Torvalds1da177e2005-04-16 15:20:36 -07005447 case HCI_EV_CONN_REQUEST:
5448 hci_conn_request_evt(hdev, skb);
5449 break;
5450
Linus Torvalds1da177e2005-04-16 15:20:36 -07005451 case HCI_EV_DISCONN_COMPLETE:
5452 hci_disconn_complete_evt(hdev, skb);
5453 break;
5454
Linus Torvalds1da177e2005-04-16 15:20:36 -07005455 case HCI_EV_AUTH_COMPLETE:
5456 hci_auth_complete_evt(hdev, skb);
5457 break;
5458
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005459 case HCI_EV_REMOTE_NAME:
5460 hci_remote_name_evt(hdev, skb);
5461 break;
5462
Linus Torvalds1da177e2005-04-16 15:20:36 -07005463 case HCI_EV_ENCRYPT_CHANGE:
5464 hci_encrypt_change_evt(hdev, skb);
5465 break;
5466
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005467 case HCI_EV_CHANGE_LINK_KEY_COMPLETE:
5468 hci_change_link_key_complete_evt(hdev, skb);
5469 break;
5470
5471 case HCI_EV_REMOTE_FEATURES:
5472 hci_remote_features_evt(hdev, skb);
5473 break;
5474
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005475 case HCI_EV_CMD_COMPLETE:
Johan Hedberge62144872015-04-02 13:41:08 +03005476 hci_cmd_complete_evt(hdev, skb, &opcode, &status,
5477 &req_complete, &req_complete_skb);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005478 break;
5479
5480 case HCI_EV_CMD_STATUS:
Johan Hedberge62144872015-04-02 13:41:08 +03005481 hci_cmd_status_evt(hdev, skb, &opcode, &status, &req_complete,
5482 &req_complete_skb);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005483 break;
5484
Marcel Holtmann24dfa342014-11-02 02:56:41 +01005485 case HCI_EV_HARDWARE_ERROR:
5486 hci_hardware_error_evt(hdev, skb);
5487 break;
5488
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005489 case HCI_EV_ROLE_CHANGE:
5490 hci_role_change_evt(hdev, skb);
5491 break;
5492
5493 case HCI_EV_NUM_COMP_PKTS:
5494 hci_num_comp_pkts_evt(hdev, skb);
5495 break;
5496
5497 case HCI_EV_MODE_CHANGE:
5498 hci_mode_change_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005499 break;
5500
5501 case HCI_EV_PIN_CODE_REQ:
5502 hci_pin_code_request_evt(hdev, skb);
5503 break;
5504
5505 case HCI_EV_LINK_KEY_REQ:
5506 hci_link_key_request_evt(hdev, skb);
5507 break;
5508
5509 case HCI_EV_LINK_KEY_NOTIFY:
5510 hci_link_key_notify_evt(hdev, skb);
5511 break;
5512
5513 case HCI_EV_CLOCK_OFFSET:
5514 hci_clock_offset_evt(hdev, skb);
5515 break;
5516
Marcel Holtmanna8746412008-07-14 20:13:46 +02005517 case HCI_EV_PKT_TYPE_CHANGE:
5518 hci_pkt_type_change_evt(hdev, skb);
5519 break;
5520
Marcel Holtmann85a1e932005-08-09 20:28:02 -07005521 case HCI_EV_PSCAN_REP_MODE:
5522 hci_pscan_rep_mode_evt(hdev, skb);
5523 break;
5524
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005525 case HCI_EV_INQUIRY_RESULT_WITH_RSSI:
5526 hci_inquiry_result_with_rssi_evt(hdev, skb);
5527 break;
5528
5529 case HCI_EV_REMOTE_EXT_FEATURES:
5530 hci_remote_ext_features_evt(hdev, skb);
5531 break;
5532
5533 case HCI_EV_SYNC_CONN_COMPLETE:
5534 hci_sync_conn_complete_evt(hdev, skb);
5535 break;
5536
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005537 case HCI_EV_EXTENDED_INQUIRY_RESULT:
5538 hci_extended_inquiry_result_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005539 break;
5540
Johan Hedberg1c2e0042012-06-08 23:31:13 +08005541 case HCI_EV_KEY_REFRESH_COMPLETE:
5542 hci_key_refresh_complete_evt(hdev, skb);
5543 break;
5544
Marcel Holtmann04936842008-07-14 20:13:48 +02005545 case HCI_EV_IO_CAPA_REQUEST:
5546 hci_io_capa_request_evt(hdev, skb);
5547 break;
5548
Johan Hedberg03b555e2011-01-04 15:40:05 +02005549 case HCI_EV_IO_CAPA_REPLY:
5550 hci_io_capa_reply_evt(hdev, skb);
5551 break;
5552
Johan Hedberga5c29682011-02-19 12:05:57 -03005553 case HCI_EV_USER_CONFIRM_REQUEST:
5554 hci_user_confirm_request_evt(hdev, skb);
5555 break;
5556
Brian Gix1143d452011-11-23 08:28:34 -08005557 case HCI_EV_USER_PASSKEY_REQUEST:
5558 hci_user_passkey_request_evt(hdev, skb);
5559 break;
5560
Johan Hedberg92a25252012-09-06 18:39:26 +03005561 case HCI_EV_USER_PASSKEY_NOTIFY:
5562 hci_user_passkey_notify_evt(hdev, skb);
5563 break;
5564
5565 case HCI_EV_KEYPRESS_NOTIFY:
5566 hci_keypress_notify_evt(hdev, skb);
5567 break;
5568
Marcel Holtmann04936842008-07-14 20:13:48 +02005569 case HCI_EV_SIMPLE_PAIR_COMPLETE:
5570 hci_simple_pair_complete_evt(hdev, skb);
5571 break;
5572
Marcel Holtmann41a96212008-07-14 20:13:48 +02005573 case HCI_EV_REMOTE_HOST_FEATURES:
5574 hci_remote_host_features_evt(hdev, skb);
5575 break;
5576
Ville Tervofcd89c02011-02-10 22:38:47 -03005577 case HCI_EV_LE_META:
5578 hci_le_meta_evt(hdev, skb);
5579 break;
5580
Szymon Janc2763eda2011-03-22 13:12:22 +01005581 case HCI_EV_REMOTE_OOB_DATA_REQUEST:
5582 hci_remote_oob_data_request_evt(hdev, skb);
5583 break;
5584
Arron Wanga77a6a12015-07-24 17:13:15 +08005585#if IS_ENABLED(CONFIG_BT_HS)
5586 case HCI_EV_CHANNEL_SELECTED:
5587 hci_chan_selected_evt(hdev, skb);
5588 break;
5589
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03005590 case HCI_EV_PHY_LINK_COMPLETE:
5591 hci_phy_link_complete_evt(hdev, skb);
5592 break;
5593
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03005594 case HCI_EV_LOGICAL_LINK_COMPLETE:
5595 hci_loglink_complete_evt(hdev, skb);
5596 break;
5597
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02005598 case HCI_EV_DISCONN_LOGICAL_LINK_COMPLETE:
5599 hci_disconn_loglink_complete_evt(hdev, skb);
5600 break;
5601
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02005602 case HCI_EV_DISCONN_PHY_LINK_COMPLETE:
5603 hci_disconn_phylink_complete_evt(hdev, skb);
5604 break;
Arron Wanga77a6a12015-07-24 17:13:15 +08005605#endif
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02005606
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02005607 case HCI_EV_NUM_COMP_BLOCKS:
5608 hci_num_comp_blocks_evt(hdev, skb);
5609 break;
5610
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005611 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03005612 BT_DBG("%s event 0x%2.2x", hdev->name, event);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005613 break;
5614 }
5615
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005616 if (req_complete) {
Johan Hedberge62144872015-04-02 13:41:08 +03005617 req_complete(hdev, status, opcode);
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005618 } else if (req_complete_skb) {
5619 if (!hci_get_cmd_complete(hdev, opcode, req_evt, orig_skb)) {
5620 kfree_skb(orig_skb);
5621 orig_skb = NULL;
5622 }
Johan Hedberge62144872015-04-02 13:41:08 +03005623 req_complete_skb(hdev, status, opcode, orig_skb);
Johan Hedberg757aa0b2015-04-02 13:41:12 +03005624 }
Johan Hedberge62144872015-04-02 13:41:08 +03005625
5626 kfree_skb(orig_skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005627 kfree_skb(skb);
5628 hdev->stat.evt_rx++;
5629}