blob: 62f92a50896120d72ed77cd677768acdce6ba36e [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);
58 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
59 hci_dev_unlock(hdev);
60
Marcel Holtmanna9de9242007-10-20 13:33:56 +020061 hci_conn_check_pending(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -070062}
63
Andre Guedes4d934832012-03-21 00:03:35 -030064static void hci_cc_periodic_inq(struct hci_dev *hdev, struct sk_buff *skb)
65{
66 __u8 status = *((__u8 *) skb->data);
67
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030068 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedesae854a72012-03-21 00:03:36 -030069
70 if (status)
71 return;
72
Marcel Holtmanna1536da2015-03-13 02:11:01 -070073 hci_dev_set_flag(hdev, HCI_PERIODIC_INQ);
Andre Guedes4d934832012-03-21 00:03:35 -030074}
75
Marcel Holtmanna9de9242007-10-20 13:33:56 +020076static void hci_cc_exit_periodic_inq(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -070077{
Marcel Holtmanna9de9242007-10-20 13:33:56 +020078 __u8 status = *((__u8 *) skb->data);
79
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030080 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +020081
82 if (status)
83 return;
84
Marcel Holtmanna358dc12015-03-13 02:11:02 -070085 hci_dev_clear_flag(hdev, HCI_PERIODIC_INQ);
Andre Guedesae854a72012-03-21 00:03:36 -030086
Marcel Holtmanna9de9242007-10-20 13:33:56 +020087 hci_conn_check_pending(hdev);
88}
89
Gustavo Padovan807deac2012-05-17 00:36:24 -030090static void hci_cc_remote_name_req_cancel(struct hci_dev *hdev,
91 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +020092{
93 BT_DBG("%s", hdev->name);
94}
95
96static void hci_cc_role_discovery(struct hci_dev *hdev, struct sk_buff *skb)
97{
98 struct hci_rp_role_discovery *rp = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -070099 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700100
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300101 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700102
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200103 if (rp->status)
104 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700105
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200106 hci_dev_lock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700107
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200108 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
Johan Hedberg40bef302014-07-16 11:42:27 +0300109 if (conn)
110 conn->role = rp->role;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200111
112 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700113}
114
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200115static void hci_cc_read_link_policy(struct hci_dev *hdev, struct sk_buff *skb)
116{
117 struct hci_rp_read_link_policy *rp = (void *) skb->data;
118 struct hci_conn *conn;
119
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300120 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200121
122 if (rp->status)
123 return;
124
125 hci_dev_lock(hdev);
126
127 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
128 if (conn)
129 conn->link_policy = __le16_to_cpu(rp->policy);
130
131 hci_dev_unlock(hdev);
132}
133
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200134static void hci_cc_write_link_policy(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700135{
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200136 struct hci_rp_write_link_policy *rp = (void *) skb->data;
137 struct hci_conn *conn;
138 void *sent;
139
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300140 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200141
142 if (rp->status)
143 return;
144
145 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LINK_POLICY);
146 if (!sent)
147 return;
148
149 hci_dev_lock(hdev);
150
151 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200152 if (conn)
Harvey Harrison83985312008-05-02 16:25:46 -0700153 conn->link_policy = get_unaligned_le16(sent + 2);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200154
155 hci_dev_unlock(hdev);
156}
157
Gustavo Padovan807deac2012-05-17 00:36:24 -0300158static void hci_cc_read_def_link_policy(struct hci_dev *hdev,
159 struct sk_buff *skb)
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200160{
161 struct hci_rp_read_def_link_policy *rp = (void *) skb->data;
162
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300163 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200164
165 if (rp->status)
166 return;
167
168 hdev->link_policy = __le16_to_cpu(rp->policy);
169}
170
Gustavo Padovan807deac2012-05-17 00:36:24 -0300171static void hci_cc_write_def_link_policy(struct hci_dev *hdev,
172 struct sk_buff *skb)
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200173{
174 __u8 status = *((__u8 *) skb->data);
175 void *sent;
176
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300177 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200178
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200179 if (status)
180 return;
181
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200182 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_DEF_LINK_POLICY);
183 if (!sent)
184 return;
185
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200186 hdev->link_policy = get_unaligned_le16(sent);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200187}
188
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200189static void hci_cc_reset(struct hci_dev *hdev, struct sk_buff *skb)
190{
191 __u8 status = *((__u8 *) skb->data);
192
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300193 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200194
Gustavo F. Padovan10572132011-03-16 15:36:29 -0300195 clear_bit(HCI_RESET, &hdev->flags);
196
Marcel Holtmann8761f9d2014-11-02 02:45:58 +0100197 if (status)
198 return;
199
Johan Hedberga297e972012-02-21 17:55:47 +0200200 /* Reset all non-persistent flags */
Marcel Holtmanneacb44d2015-03-13 09:04:17 -0700201 hci_dev_clear_volatile_flags(hdev);
Andre Guedes69775ff2012-02-23 16:50:05 +0200202
Johan Hedberg39c5d972015-01-28 19:56:01 +0200203 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
204
Johan Hedbergbbaf4442012-11-08 01:22:59 +0100205 hdev->inq_tx_power = HCI_TX_POWER_INVALID;
206 hdev->adv_tx_power = HCI_TX_POWER_INVALID;
Johan Hedberg3f0f5242012-11-08 01:23:00 +0100207
208 memset(hdev->adv_data, 0, sizeof(hdev->adv_data));
209 hdev->adv_data_len = 0;
Marcel Holtmannf8e808b2013-10-16 00:16:47 -0700210
211 memset(hdev->scan_rsp_data, 0, sizeof(hdev->scan_rsp_data));
212 hdev->scan_rsp_data_len = 0;
Marcel Holtmann06f5b772013-10-19 07:09:11 -0700213
Marcel Holtmann533553f2014-03-21 12:18:10 -0700214 hdev->le_scan_type = LE_SCAN_PASSIVE;
215
Marcel Holtmann06f5b772013-10-19 07:09:11 -0700216 hdev->ssp_debug_mode = 0;
Marcel Holtmanna4d55042014-10-29 23:37:53 +0100217
218 hci_bdaddr_list_clear(&hdev->le_white_list);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200219}
220
Marcel Holtmannc2f0f972015-01-12 09:21:25 -0800221static void hci_cc_read_stored_link_key(struct hci_dev *hdev,
222 struct sk_buff *skb)
223{
224 struct hci_rp_read_stored_link_key *rp = (void *)skb->data;
225 struct hci_cp_read_stored_link_key *sent;
226
227 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
228
229 sent = hci_sent_cmd_data(hdev, HCI_OP_READ_STORED_LINK_KEY);
230 if (!sent)
231 return;
232
233 if (!rp->status && sent->read_all == 0x01) {
234 hdev->stored_max_keys = rp->max_keys;
235 hdev->stored_num_keys = rp->num_keys;
236 }
237}
238
Marcel Holtmanna93661202015-01-12 09:21:28 -0800239static void hci_cc_delete_stored_link_key(struct hci_dev *hdev,
240 struct sk_buff *skb)
241{
242 struct hci_rp_delete_stored_link_key *rp = (void *)skb->data;
243
244 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
245
246 if (rp->status)
247 return;
248
249 if (rp->num_keys <= hdev->stored_num_keys)
250 hdev->stored_num_keys -= rp->num_keys;
251 else
252 hdev->stored_num_keys = 0;
253}
254
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200255static void hci_cc_write_local_name(struct hci_dev *hdev, struct sk_buff *skb)
256{
257 __u8 status = *((__u8 *) skb->data);
258 void *sent;
259
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300260 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200261
262 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LOCAL_NAME);
263 if (!sent)
264 return;
265
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200266 hci_dev_lock(hdev);
267
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700268 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedbergf51d5b22012-02-22 18:17:32 +0200269 mgmt_set_local_name_complete(hdev, sent, status);
Johan Hedberg28cc7bd2012-02-22 21:06:55 +0200270 else if (!status)
271 memcpy(hdev->dev_name, sent, HCI_MAX_NAME_LENGTH);
Johan Hedbergf51d5b22012-02-22 18:17:32 +0200272
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200273 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200274}
275
276static void hci_cc_read_local_name(struct hci_dev *hdev, struct sk_buff *skb)
277{
278 struct hci_rp_read_local_name *rp = (void *) skb->data;
279
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300280 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200281
282 if (rp->status)
283 return;
284
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700285 if (hci_dev_test_flag(hdev, HCI_SETUP) ||
286 hci_dev_test_flag(hdev, HCI_CONFIG))
Johan Hedbergdb99b5f2012-02-22 20:14:22 +0200287 memcpy(hdev->dev_name, rp->name, HCI_MAX_NAME_LENGTH);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200288}
289
290static void hci_cc_write_auth_enable(struct hci_dev *hdev, struct sk_buff *skb)
291{
292 __u8 status = *((__u8 *) skb->data);
293 void *sent;
294
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300295 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200296
297 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_AUTH_ENABLE);
298 if (!sent)
299 return;
300
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530301 hci_dev_lock(hdev);
302
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200303 if (!status) {
304 __u8 param = *((__u8 *) sent);
305
306 if (param == AUTH_ENABLED)
307 set_bit(HCI_AUTH, &hdev->flags);
308 else
309 clear_bit(HCI_AUTH, &hdev->flags);
310 }
311
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700312 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg33ef95e2012-02-16 23:56:27 +0200313 mgmt_auth_enable_complete(hdev, status);
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530314
315 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200316}
317
318static void hci_cc_write_encrypt_mode(struct hci_dev *hdev, struct sk_buff *skb)
319{
320 __u8 status = *((__u8 *) skb->data);
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200321 __u8 param;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200322 void *sent;
323
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300324 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200325
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200326 if (status)
327 return;
328
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200329 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_ENCRYPT_MODE);
330 if (!sent)
331 return;
332
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200333 param = *((__u8 *) sent);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200334
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200335 if (param)
336 set_bit(HCI_ENCRYPT, &hdev->flags);
337 else
338 clear_bit(HCI_ENCRYPT, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200339}
340
341static void hci_cc_write_scan_enable(struct hci_dev *hdev, struct sk_buff *skb)
342{
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200343 __u8 status = *((__u8 *) skb->data);
344 __u8 param;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200345 void *sent;
346
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300347 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200348
349 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SCAN_ENABLE);
350 if (!sent)
351 return;
352
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200353 param = *((__u8 *) sent);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200354
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200355 hci_dev_lock(hdev);
356
Mikel Astizfa1bd912012-08-09 09:52:29 +0200357 if (status) {
Johan Hedberg2d7cee52011-11-07 22:16:03 +0200358 hdev->discov_timeout = 0;
359 goto done;
360 }
361
Johan Hedbergbc6d2d02014-07-10 12:09:08 +0300362 if (param & SCAN_INQUIRY)
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200363 set_bit(HCI_ISCAN, &hdev->flags);
Johan Hedbergbc6d2d02014-07-10 12:09:08 +0300364 else
365 clear_bit(HCI_ISCAN, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200366
Johan Hedberg031547d2014-07-10 12:09:06 +0300367 if (param & SCAN_PAGE)
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200368 set_bit(HCI_PSCAN, &hdev->flags);
Johan Hedbergbc6d2d02014-07-10 12:09:08 +0300369 else
Johan Hedberg204e3992014-07-28 15:45:31 +0300370 clear_bit(HCI_PSCAN, &hdev->flags);
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200371
372done:
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200373 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200374}
375
376static void hci_cc_read_class_of_dev(struct hci_dev *hdev, struct sk_buff *skb)
377{
378 struct hci_rp_read_class_of_dev *rp = (void *) skb->data;
379
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300380 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200381
382 if (rp->status)
383 return;
384
385 memcpy(hdev->dev_class, rp->dev_class, 3);
386
387 BT_DBG("%s class 0x%.2x%.2x%.2x", hdev->name,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300388 hdev->dev_class[2], hdev->dev_class[1], hdev->dev_class[0]);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200389}
390
391static void hci_cc_write_class_of_dev(struct hci_dev *hdev, struct sk_buff *skb)
392{
393 __u8 status = *((__u8 *) skb->data);
394 void *sent;
395
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300396 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200397
398 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_CLASS_OF_DEV);
399 if (!sent)
400 return;
401
Marcel Holtmann7f9a9032012-02-22 18:38:01 +0100402 hci_dev_lock(hdev);
403
404 if (status == 0)
405 memcpy(hdev->dev_class, sent, 3);
406
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700407 if (hci_dev_test_flag(hdev, HCI_MGMT))
Marcel Holtmann7f9a9032012-02-22 18:38:01 +0100408 mgmt_set_class_of_dev_complete(hdev, sent, status);
409
410 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200411}
412
413static void hci_cc_read_voice_setting(struct hci_dev *hdev, struct sk_buff *skb)
414{
415 struct hci_rp_read_voice_setting *rp = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700416 __u16 setting;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200417
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300418 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200419
420 if (rp->status)
421 return;
422
423 setting = __le16_to_cpu(rp->voice_setting);
424
Marcel Holtmannf383f272008-07-14 20:13:47 +0200425 if (hdev->voice_setting == setting)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200426 return;
427
428 hdev->voice_setting = setting;
429
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300430 BT_DBG("%s voice setting 0x%4.4x", hdev->name, setting);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200431
Gustavo F. Padovan3c547112011-12-14 22:58:44 -0200432 if (hdev->notify)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200433 hdev->notify(hdev, HCI_NOTIFY_VOICE_SETTING);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200434}
435
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300436static void hci_cc_write_voice_setting(struct hci_dev *hdev,
437 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200438{
439 __u8 status = *((__u8 *) skb->data);
Marcel Holtmannf383f272008-07-14 20:13:47 +0200440 __u16 setting;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700441 void *sent;
442
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300443 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700444
Marcel Holtmannf383f272008-07-14 20:13:47 +0200445 if (status)
446 return;
447
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200448 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_VOICE_SETTING);
449 if (!sent)
450 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700451
Marcel Holtmannf383f272008-07-14 20:13:47 +0200452 setting = get_unaligned_le16(sent);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700453
Marcel Holtmannf383f272008-07-14 20:13:47 +0200454 if (hdev->voice_setting == setting)
455 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700456
Marcel Holtmannf383f272008-07-14 20:13:47 +0200457 hdev->voice_setting = setting;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700458
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300459 BT_DBG("%s voice setting 0x%4.4x", hdev->name, setting);
Marcel Holtmannf383f272008-07-14 20:13:47 +0200460
Gustavo F. Padovan3c547112011-12-14 22:58:44 -0200461 if (hdev->notify)
Marcel Holtmannf383f272008-07-14 20:13:47 +0200462 hdev->notify(hdev, HCI_NOTIFY_VOICE_SETTING);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700463}
464
Marcel Holtmannb4cb9fb2013-10-14 13:56:16 -0700465static void hci_cc_read_num_supported_iac(struct hci_dev *hdev,
466 struct sk_buff *skb)
467{
468 struct hci_rp_read_num_supported_iac *rp = (void *) skb->data;
469
470 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
471
472 if (rp->status)
473 return;
474
475 hdev->num_iac = rp->num_iac;
476
477 BT_DBG("%s num iac %d", hdev->name, hdev->num_iac);
478}
479
Marcel Holtmann333140b2008-07-14 20:13:48 +0200480static void hci_cc_write_ssp_mode(struct hci_dev *hdev, struct sk_buff *skb)
481{
482 __u8 status = *((__u8 *) skb->data);
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300483 struct hci_cp_write_ssp_mode *sent;
Marcel Holtmann333140b2008-07-14 20:13:48 +0200484
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300485 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann333140b2008-07-14 20:13:48 +0200486
Marcel Holtmann333140b2008-07-14 20:13:48 +0200487 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SSP_MODE);
488 if (!sent)
489 return;
490
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530491 hci_dev_lock(hdev);
492
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300493 if (!status) {
494 if (sent->mode)
Johan Hedbergcad718e2013-04-17 15:00:51 +0300495 hdev->features[1][0] |= LMP_HOST_SSP;
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300496 else
Johan Hedbergcad718e2013-04-17 15:00:51 +0300497 hdev->features[1][0] &= ~LMP_HOST_SSP;
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300498 }
499
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700500 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300501 mgmt_ssp_enable_complete(hdev, sent->mode, status);
Johan Hedbergc0ecddc2012-02-22 12:38:31 +0200502 else if (!status) {
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300503 if (sent->mode)
Marcel Holtmanna1536da2015-03-13 02:11:01 -0700504 hci_dev_set_flag(hdev, HCI_SSP_ENABLED);
Johan Hedbergc0ecddc2012-02-22 12:38:31 +0200505 else
Marcel Holtmanna358dc12015-03-13 02:11:02 -0700506 hci_dev_clear_flag(hdev, HCI_SSP_ENABLED);
Johan Hedbergc0ecddc2012-02-22 12:38:31 +0200507 }
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530508
509 hci_dev_unlock(hdev);
Marcel Holtmann333140b2008-07-14 20:13:48 +0200510}
511
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800512static void hci_cc_write_sc_support(struct hci_dev *hdev, struct sk_buff *skb)
513{
514 u8 status = *((u8 *) skb->data);
515 struct hci_cp_write_sc_support *sent;
516
517 BT_DBG("%s status 0x%2.2x", hdev->name, status);
518
519 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SC_SUPPORT);
520 if (!sent)
521 return;
522
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530523 hci_dev_lock(hdev);
524
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800525 if (!status) {
526 if (sent->support)
527 hdev->features[1][0] |= LMP_HOST_SC;
528 else
529 hdev->features[1][0] &= ~LMP_HOST_SC;
530 }
531
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700532 if (!hci_dev_test_flag(hdev, HCI_MGMT) && !status) {
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800533 if (sent->support)
Marcel Holtmanna1536da2015-03-13 02:11:01 -0700534 hci_dev_set_flag(hdev, HCI_SC_ENABLED);
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800535 else
Marcel Holtmanna358dc12015-03-13 02:11:02 -0700536 hci_dev_clear_flag(hdev, HCI_SC_ENABLED);
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800537 }
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530538
539 hci_dev_unlock(hdev);
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800540}
541
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200542static void hci_cc_read_local_version(struct hci_dev *hdev, struct sk_buff *skb)
543{
544 struct hci_rp_read_local_version *rp = (void *) skb->data;
545
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300546 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200547
548 if (rp->status)
Johan Hedberg42c6b122013-03-05 20:37:49 +0200549 return;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200550
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700551 if (hci_dev_test_flag(hdev, HCI_SETUP) ||
552 hci_dev_test_flag(hdev, HCI_CONFIG)) {
Marcel Holtmann0d5551f2013-10-18 12:04:50 -0700553 hdev->hci_ver = rp->hci_ver;
554 hdev->hci_rev = __le16_to_cpu(rp->hci_rev);
555 hdev->lmp_ver = rp->lmp_ver;
556 hdev->manufacturer = __le16_to_cpu(rp->manufacturer);
557 hdev->lmp_subver = __le16_to_cpu(rp->lmp_subver);
558 }
Johan Hedbergd5859e22011-01-25 01:19:58 +0200559}
560
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300561static void hci_cc_read_local_commands(struct hci_dev *hdev,
562 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200563{
564 struct hci_rp_read_local_commands *rp = (void *) skb->data;
565
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300566 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200567
Marcel Holtmann6a070e62013-10-31 04:54:33 -0700568 if (rp->status)
569 return;
570
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700571 if (hci_dev_test_flag(hdev, HCI_SETUP) ||
572 hci_dev_test_flag(hdev, HCI_CONFIG))
Johan Hedberg2177bab2013-03-05 20:37:43 +0200573 memcpy(hdev->commands, rp->commands, sizeof(hdev->commands));
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200574}
575
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300576static void hci_cc_read_local_features(struct hci_dev *hdev,
577 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200578{
579 struct hci_rp_read_local_features *rp = (void *) skb->data;
580
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300581 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200582
583 if (rp->status)
584 return;
585
586 memcpy(hdev->features, rp->features, 8);
587
588 /* Adjust default settings according to features
589 * supported by device. */
590
Johan Hedbergcad718e2013-04-17 15:00:51 +0300591 if (hdev->features[0][0] & LMP_3SLOT)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200592 hdev->pkt_type |= (HCI_DM3 | HCI_DH3);
593
Johan Hedbergcad718e2013-04-17 15:00:51 +0300594 if (hdev->features[0][0] & LMP_5SLOT)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200595 hdev->pkt_type |= (HCI_DM5 | HCI_DH5);
596
Johan Hedbergcad718e2013-04-17 15:00:51 +0300597 if (hdev->features[0][1] & LMP_HV2) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200598 hdev->pkt_type |= (HCI_HV2);
599 hdev->esco_type |= (ESCO_HV2);
600 }
601
Johan Hedbergcad718e2013-04-17 15:00:51 +0300602 if (hdev->features[0][1] & LMP_HV3) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200603 hdev->pkt_type |= (HCI_HV3);
604 hdev->esco_type |= (ESCO_HV3);
605 }
606
Andre Guedes45db810f2012-07-24 15:03:49 -0300607 if (lmp_esco_capable(hdev))
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200608 hdev->esco_type |= (ESCO_EV3);
609
Johan Hedbergcad718e2013-04-17 15:00:51 +0300610 if (hdev->features[0][4] & LMP_EV4)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200611 hdev->esco_type |= (ESCO_EV4);
612
Johan Hedbergcad718e2013-04-17 15:00:51 +0300613 if (hdev->features[0][4] & LMP_EV5)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200614 hdev->esco_type |= (ESCO_EV5);
615
Johan Hedbergcad718e2013-04-17 15:00:51 +0300616 if (hdev->features[0][5] & LMP_EDR_ESCO_2M)
Marcel Holtmannefc76882009-02-06 09:13:37 +0100617 hdev->esco_type |= (ESCO_2EV3);
618
Johan Hedbergcad718e2013-04-17 15:00:51 +0300619 if (hdev->features[0][5] & LMP_EDR_ESCO_3M)
Marcel Holtmannefc76882009-02-06 09:13:37 +0100620 hdev->esco_type |= (ESCO_3EV3);
621
Johan Hedbergcad718e2013-04-17 15:00:51 +0300622 if (hdev->features[0][5] & LMP_EDR_3S_ESCO)
Marcel Holtmannefc76882009-02-06 09:13:37 +0100623 hdev->esco_type |= (ESCO_2EV5 | ESCO_3EV5);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200624}
625
Andre Guedes971e3a42011-06-30 19:20:52 -0300626static void hci_cc_read_local_ext_features(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300627 struct sk_buff *skb)
Andre Guedes971e3a42011-06-30 19:20:52 -0300628{
629 struct hci_rp_read_local_ext_features *rp = (void *) skb->data;
630
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300631 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andre Guedes971e3a42011-06-30 19:20:52 -0300632
633 if (rp->status)
Johan Hedberg42c6b122013-03-05 20:37:49 +0200634 return;
Andre Guedes971e3a42011-06-30 19:20:52 -0300635
Marcel Holtmann57af75a2013-10-18 12:04:47 -0700636 if (hdev->max_page < rp->max_page)
637 hdev->max_page = rp->max_page;
Johan Hedbergd2c5d772013-04-17 15:00:52 +0300638
Johan Hedbergcad718e2013-04-17 15:00:51 +0300639 if (rp->page < HCI_MAX_PAGES)
640 memcpy(hdev->features[rp->page], rp->features, 8);
Andre Guedes971e3a42011-06-30 19:20:52 -0300641}
642
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200643static void hci_cc_read_flow_control_mode(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300644 struct sk_buff *skb)
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200645{
646 struct hci_rp_read_flow_control_mode *rp = (void *) skb->data;
647
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300648 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200649
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200650 if (rp->status)
651 return;
652
653 hdev->flow_ctl_mode = rp->mode;
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200654}
655
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200656static void hci_cc_read_buffer_size(struct hci_dev *hdev, struct sk_buff *skb)
657{
658 struct hci_rp_read_buffer_size *rp = (void *) skb->data;
659
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300660 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200661
662 if (rp->status)
663 return;
664
665 hdev->acl_mtu = __le16_to_cpu(rp->acl_mtu);
666 hdev->sco_mtu = rp->sco_mtu;
667 hdev->acl_pkts = __le16_to_cpu(rp->acl_max_pkt);
668 hdev->sco_pkts = __le16_to_cpu(rp->sco_max_pkt);
669
670 if (test_bit(HCI_QUIRK_FIXUP_BUFFER_SIZE, &hdev->quirks)) {
671 hdev->sco_mtu = 64;
672 hdev->sco_pkts = 8;
673 }
674
675 hdev->acl_cnt = hdev->acl_pkts;
676 hdev->sco_cnt = hdev->sco_pkts;
677
Gustavo Padovan807deac2012-05-17 00:36:24 -0300678 BT_DBG("%s acl mtu %d:%d sco mtu %d:%d", hdev->name, hdev->acl_mtu,
679 hdev->acl_pkts, hdev->sco_mtu, hdev->sco_pkts);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200680}
681
682static void hci_cc_read_bd_addr(struct hci_dev *hdev, struct sk_buff *skb)
683{
684 struct hci_rp_read_bd_addr *rp = (void *) skb->data;
685
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300686 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200687
Marcel Holtmanne30d3f52014-07-05 10:48:03 +0200688 if (rp->status)
689 return;
690
691 if (test_bit(HCI_INIT, &hdev->flags))
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200692 bacpy(&hdev->bdaddr, &rp->bdaddr);
Marcel Holtmanne30d3f52014-07-05 10:48:03 +0200693
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700694 if (hci_dev_test_flag(hdev, HCI_SETUP))
Marcel Holtmanne30d3f52014-07-05 10:48:03 +0200695 bacpy(&hdev->setup_addr, &rp->bdaddr);
Johan Hedberg23bb5762010-12-21 23:01:27 +0200696}
697
Johan Hedbergf332ec62013-03-15 17:07:11 -0500698static void hci_cc_read_page_scan_activity(struct hci_dev *hdev,
699 struct sk_buff *skb)
700{
701 struct hci_rp_read_page_scan_activity *rp = (void *) skb->data;
702
703 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
704
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200705 if (rp->status)
706 return;
707
708 if (test_bit(HCI_INIT, &hdev->flags)) {
Johan Hedbergf332ec62013-03-15 17:07:11 -0500709 hdev->page_scan_interval = __le16_to_cpu(rp->interval);
710 hdev->page_scan_window = __le16_to_cpu(rp->window);
711 }
712}
713
Johan Hedberg4a3ee762013-03-15 17:07:12 -0500714static void hci_cc_write_page_scan_activity(struct hci_dev *hdev,
715 struct sk_buff *skb)
716{
717 u8 status = *((u8 *) skb->data);
718 struct hci_cp_write_page_scan_activity *sent;
719
720 BT_DBG("%s status 0x%2.2x", hdev->name, status);
721
722 if (status)
723 return;
724
725 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY);
726 if (!sent)
727 return;
728
729 hdev->page_scan_interval = __le16_to_cpu(sent->interval);
730 hdev->page_scan_window = __le16_to_cpu(sent->window);
731}
732
Johan Hedbergf332ec62013-03-15 17:07:11 -0500733static void hci_cc_read_page_scan_type(struct hci_dev *hdev,
734 struct sk_buff *skb)
735{
736 struct hci_rp_read_page_scan_type *rp = (void *) skb->data;
737
738 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
739
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200740 if (rp->status)
741 return;
742
743 if (test_bit(HCI_INIT, &hdev->flags))
Johan Hedbergf332ec62013-03-15 17:07:11 -0500744 hdev->page_scan_type = rp->type;
745}
746
Johan Hedberg4a3ee762013-03-15 17:07:12 -0500747static void hci_cc_write_page_scan_type(struct hci_dev *hdev,
748 struct sk_buff *skb)
749{
750 u8 status = *((u8 *) skb->data);
751 u8 *type;
752
753 BT_DBG("%s status 0x%2.2x", hdev->name, status);
754
755 if (status)
756 return;
757
758 type = hci_sent_cmd_data(hdev, HCI_OP_WRITE_PAGE_SCAN_TYPE);
759 if (type)
760 hdev->page_scan_type = *type;
761}
762
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200763static void hci_cc_read_data_block_size(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300764 struct sk_buff *skb)
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200765{
766 struct hci_rp_read_data_block_size *rp = (void *) skb->data;
767
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300768 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200769
770 if (rp->status)
771 return;
772
773 hdev->block_mtu = __le16_to_cpu(rp->max_acl_len);
774 hdev->block_len = __le16_to_cpu(rp->block_len);
775 hdev->num_blocks = __le16_to_cpu(rp->num_blocks);
776
777 hdev->block_cnt = hdev->num_blocks;
778
779 BT_DBG("%s blk mtu %d cnt %d len %d", hdev->name, hdev->block_mtu,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300780 hdev->block_cnt, hdev->block_len);
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200781}
782
Johan Hedberg33f35722014-06-28 17:54:06 +0300783static void hci_cc_read_clock(struct hci_dev *hdev, struct sk_buff *skb)
784{
785 struct hci_rp_read_clock *rp = (void *) skb->data;
786 struct hci_cp_read_clock *cp;
787 struct hci_conn *conn;
788
789 BT_DBG("%s", hdev->name);
790
791 if (skb->len < sizeof(*rp))
792 return;
793
794 if (rp->status)
795 return;
796
797 hci_dev_lock(hdev);
798
799 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_CLOCK);
800 if (!cp)
801 goto unlock;
802
803 if (cp->which == 0x00) {
804 hdev->clock = le32_to_cpu(rp->clock);
805 goto unlock;
806 }
807
808 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
809 if (conn) {
810 conn->clock = le32_to_cpu(rp->clock);
811 conn->clock_accuracy = le16_to_cpu(rp->accuracy);
812 }
813
814unlock:
815 hci_dev_unlock(hdev);
816}
817
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300818static void hci_cc_read_local_amp_info(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300819 struct sk_buff *skb)
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300820{
821 struct hci_rp_read_local_amp_info *rp = (void *) skb->data;
822
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300823 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300824
825 if (rp->status)
Andrei Emeltchenko8e2a0d92012-09-27 17:26:08 +0300826 goto a2mp_rsp;
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300827
828 hdev->amp_status = rp->amp_status;
829 hdev->amp_total_bw = __le32_to_cpu(rp->total_bw);
830 hdev->amp_max_bw = __le32_to_cpu(rp->max_bw);
831 hdev->amp_min_latency = __le32_to_cpu(rp->min_latency);
832 hdev->amp_max_pdu = __le32_to_cpu(rp->max_pdu);
833 hdev->amp_type = rp->amp_type;
834 hdev->amp_pal_cap = __le16_to_cpu(rp->pal_cap);
835 hdev->amp_assoc_size = __le16_to_cpu(rp->max_assoc_size);
836 hdev->amp_be_flush_to = __le32_to_cpu(rp->be_flush_to);
837 hdev->amp_max_flush_to = __le32_to_cpu(rp->max_flush_to);
838
Andrei Emeltchenko8e2a0d92012-09-27 17:26:08 +0300839a2mp_rsp:
840 a2mp_send_getinfo_rsp(hdev);
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300841}
842
Andrei Emeltchenko903e4542012-09-27 17:26:09 +0300843static void hci_cc_read_local_amp_assoc(struct hci_dev *hdev,
844 struct sk_buff *skb)
845{
846 struct hci_rp_read_local_amp_assoc *rp = (void *) skb->data;
847 struct amp_assoc *assoc = &hdev->loc_assoc;
848 size_t rem_len, frag_len;
849
850 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
851
852 if (rp->status)
853 goto a2mp_rsp;
854
855 frag_len = skb->len - sizeof(*rp);
856 rem_len = __le16_to_cpu(rp->rem_len);
857
858 if (rem_len > frag_len) {
Andrei Emeltchenko2e430be32012-09-28 14:44:23 +0300859 BT_DBG("frag_len %zu rem_len %zu", frag_len, rem_len);
Andrei Emeltchenko903e4542012-09-27 17:26:09 +0300860
861 memcpy(assoc->data + assoc->offset, rp->frag, frag_len);
862 assoc->offset += frag_len;
863
864 /* Read other fragments */
865 amp_read_loc_assoc_frag(hdev, rp->phy_handle);
866
867 return;
868 }
869
870 memcpy(assoc->data + assoc->offset, rp->frag, rem_len);
871 assoc->len = assoc->offset + rem_len;
872 assoc->offset = 0;
873
874a2mp_rsp:
875 /* Send A2MP Rsp when all fragments are received */
876 a2mp_send_getampassoc_rsp(hdev, rp->status);
Andrei Emeltchenko9495b2e2012-09-27 17:26:22 +0300877 a2mp_send_create_phy_link_req(hdev, rp->status);
Andrei Emeltchenko903e4542012-09-27 17:26:09 +0300878}
879
Johan Hedbergd5859e22011-01-25 01:19:58 +0200880static void hci_cc_read_inq_rsp_tx_power(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300881 struct sk_buff *skb)
Johan Hedbergd5859e22011-01-25 01:19:58 +0200882{
Marcel Holtmann91c4e9b2012-03-11 19:27:21 -0700883 struct hci_rp_read_inq_rsp_tx_power *rp = (void *) skb->data;
Johan Hedbergd5859e22011-01-25 01:19:58 +0200884
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300885 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedbergd5859e22011-01-25 01:19:58 +0200886
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200887 if (rp->status)
888 return;
889
890 hdev->inq_tx_power = rp->tx_power;
Johan Hedbergd5859e22011-01-25 01:19:58 +0200891}
892
Johan Hedberg980e1a52011-01-22 06:10:07 +0200893static void hci_cc_pin_code_reply(struct hci_dev *hdev, struct sk_buff *skb)
894{
895 struct hci_rp_pin_code_reply *rp = (void *) skb->data;
896 struct hci_cp_pin_code_reply *cp;
897 struct hci_conn *conn;
898
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300899 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200900
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200901 hci_dev_lock(hdev);
902
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700903 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg744cf192011-11-08 20:40:14 +0200904 mgmt_pin_code_reply_complete(hdev, &rp->bdaddr, rp->status);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200905
Mikel Astizfa1bd912012-08-09 09:52:29 +0200906 if (rp->status)
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200907 goto unlock;
Johan Hedberg980e1a52011-01-22 06:10:07 +0200908
909 cp = hci_sent_cmd_data(hdev, HCI_OP_PIN_CODE_REPLY);
910 if (!cp)
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200911 goto unlock;
Johan Hedberg980e1a52011-01-22 06:10:07 +0200912
913 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
914 if (conn)
915 conn->pin_length = cp->pin_len;
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200916
917unlock:
918 hci_dev_unlock(hdev);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200919}
920
921static void hci_cc_pin_code_neg_reply(struct hci_dev *hdev, struct sk_buff *skb)
922{
923 struct hci_rp_pin_code_neg_reply *rp = (void *) skb->data;
924
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300925 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200926
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200927 hci_dev_lock(hdev);
928
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700929 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg744cf192011-11-08 20:40:14 +0200930 mgmt_pin_code_neg_reply_complete(hdev, &rp->bdaddr,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300931 rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200932
933 hci_dev_unlock(hdev);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200934}
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200935
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300936static void hci_cc_le_read_buffer_size(struct hci_dev *hdev,
937 struct sk_buff *skb)
938{
939 struct hci_rp_le_read_buffer_size *rp = (void *) skb->data;
940
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300941 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300942
943 if (rp->status)
944 return;
945
946 hdev->le_mtu = __le16_to_cpu(rp->le_mtu);
947 hdev->le_pkts = rp->le_max_pkt;
948
949 hdev->le_cnt = hdev->le_pkts;
950
951 BT_DBG("%s le mtu %d:%d", hdev->name, hdev->le_mtu, hdev->le_pkts);
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300952}
Johan Hedberg980e1a52011-01-22 06:10:07 +0200953
Johan Hedberg60e77322013-01-22 14:01:59 +0200954static void hci_cc_le_read_local_features(struct hci_dev *hdev,
955 struct sk_buff *skb)
956{
957 struct hci_rp_le_read_local_features *rp = (void *) skb->data;
958
959 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
960
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200961 if (rp->status)
962 return;
963
964 memcpy(hdev->le_features, rp->features, 8);
Johan Hedberg60e77322013-01-22 14:01:59 +0200965}
966
Johan Hedberg8fa19092012-10-19 20:57:49 +0300967static void hci_cc_le_read_adv_tx_power(struct hci_dev *hdev,
968 struct sk_buff *skb)
969{
970 struct hci_rp_le_read_adv_tx_power *rp = (void *) skb->data;
971
972 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
973
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200974 if (rp->status)
975 return;
976
977 hdev->adv_tx_power = rp->tx_power;
Johan Hedberg8fa19092012-10-19 20:57:49 +0300978}
979
Johan Hedberga5c29682011-02-19 12:05:57 -0300980static void hci_cc_user_confirm_reply(struct hci_dev *hdev, struct sk_buff *skb)
981{
982 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
983
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300984 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberga5c29682011-02-19 12:05:57 -0300985
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200986 hci_dev_lock(hdev);
987
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700988 if (hci_dev_test_flag(hdev, HCI_MGMT))
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300989 mgmt_user_confirm_reply_complete(hdev, &rp->bdaddr, ACL_LINK, 0,
990 rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200991
992 hci_dev_unlock(hdev);
Johan Hedberga5c29682011-02-19 12:05:57 -0300993}
994
995static void hci_cc_user_confirm_neg_reply(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300996 struct sk_buff *skb)
Johan Hedberga5c29682011-02-19 12:05:57 -0300997{
998 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
999
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001000 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberga5c29682011-02-19 12:05:57 -03001001
Johan Hedberg56e5cb82011-11-08 20:40:16 +02001002 hci_dev_lock(hdev);
1003
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001004 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg744cf192011-11-08 20:40:14 +02001005 mgmt_user_confirm_neg_reply_complete(hdev, &rp->bdaddr,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001006 ACL_LINK, 0, rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +02001007
1008 hci_dev_unlock(hdev);
Johan Hedberga5c29682011-02-19 12:05:57 -03001009}
1010
Brian Gix1143d452011-11-23 08:28:34 -08001011static void hci_cc_user_passkey_reply(struct hci_dev *hdev, struct sk_buff *skb)
1012{
1013 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
1014
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001015 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -08001016
1017 hci_dev_lock(hdev);
1018
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001019 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg272d90d2012-02-09 15:26:12 +02001020 mgmt_user_passkey_reply_complete(hdev, &rp->bdaddr, ACL_LINK,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001021 0, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -08001022
1023 hci_dev_unlock(hdev);
1024}
1025
1026static void hci_cc_user_passkey_neg_reply(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -03001027 struct sk_buff *skb)
Brian Gix1143d452011-11-23 08:28:34 -08001028{
1029 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
1030
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001031 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -08001032
1033 hci_dev_lock(hdev);
1034
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001035 if (hci_dev_test_flag(hdev, HCI_MGMT))
Brian Gix1143d452011-11-23 08:28:34 -08001036 mgmt_user_passkey_neg_reply_complete(hdev, &rp->bdaddr,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001037 ACL_LINK, 0, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -08001038
1039 hci_dev_unlock(hdev);
1040}
1041
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08001042static void hci_cc_read_local_oob_data(struct hci_dev *hdev,
1043 struct sk_buff *skb)
Szymon Jancc35938b2011-03-22 13:12:21 +01001044{
1045 struct hci_rp_read_local_oob_data *rp = (void *) skb->data;
1046
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001047 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Szymon Jancc35938b2011-03-22 13:12:21 +01001048
Johan Hedberg56e5cb82011-11-08 20:40:16 +02001049 hci_dev_lock(hdev);
Johan Hedberg38da1702014-11-17 20:52:20 +02001050 mgmt_read_local_oob_data_complete(hdev, rp->hash, rp->rand, NULL, NULL,
1051 rp->status);
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08001052 hci_dev_unlock(hdev);
1053}
1054
1055static void hci_cc_read_local_oob_ext_data(struct hci_dev *hdev,
1056 struct sk_buff *skb)
1057{
1058 struct hci_rp_read_local_oob_ext_data *rp = (void *) skb->data;
1059
1060 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1061
1062 hci_dev_lock(hdev);
Johan Hedberg38da1702014-11-17 20:52:20 +02001063 mgmt_read_local_oob_data_complete(hdev, rp->hash192, rp->rand192,
1064 rp->hash256, rp->rand256,
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08001065 rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +02001066 hci_dev_unlock(hdev);
Szymon Jancc35938b2011-03-22 13:12:21 +01001067}
1068
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08001069
1070static void hci_cc_le_set_random_addr(struct hci_dev *hdev, struct sk_buff *skb)
1071{
1072 __u8 status = *((__u8 *) skb->data);
1073 bdaddr_t *sent;
1074
1075 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1076
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001077 if (status)
1078 return;
1079
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08001080 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_RANDOM_ADDR);
1081 if (!sent)
1082 return;
1083
1084 hci_dev_lock(hdev);
1085
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001086 bacpy(&hdev->random_addr, sent);
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08001087
1088 hci_dev_unlock(hdev);
1089}
1090
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001091static void hci_cc_le_set_adv_enable(struct hci_dev *hdev, struct sk_buff *skb)
1092{
1093 __u8 *sent, status = *((__u8 *) skb->data);
1094
1095 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1096
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001097 if (status)
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001098 return;
1099
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001100 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADV_ENABLE);
1101 if (!sent)
Johan Hedberg3c857752014-03-25 10:30:49 +02001102 return;
1103
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001104 hci_dev_lock(hdev);
1105
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001106 /* If we're doing connection initiation as peripheral. Set a
Johan Hedberg3c857752014-03-25 10:30:49 +02001107 * timeout in case something goes wrong.
1108 */
1109 if (*sent) {
1110 struct hci_conn *conn;
1111
Marcel Holtmanna1536da2015-03-13 02:11:01 -07001112 hci_dev_set_flag(hdev, HCI_LE_ADV);
Johan Hedberg66c417c2014-07-08 15:07:47 +03001113
Johan Hedberg3c857752014-03-25 10:30:49 +02001114 conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
1115 if (conn)
1116 queue_delayed_work(hdev->workqueue,
1117 &conn->le_conn_timeout,
Johan Hedberg09ae2602014-07-06 13:41:15 +03001118 conn->conn_timeout);
Johan Hedberg66c417c2014-07-08 15:07:47 +03001119 } else {
Marcel Holtmanna358dc12015-03-13 02:11:02 -07001120 hci_dev_clear_flag(hdev, HCI_LE_ADV);
Johan Hedberg3c857752014-03-25 10:30:49 +02001121 }
1122
Johan Hedberg04b4edc2013-03-15 17:07:01 -05001123 hci_dev_unlock(hdev);
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001124}
1125
Marcel Holtmann533553f2014-03-21 12:18:10 -07001126static void hci_cc_le_set_scan_param(struct hci_dev *hdev, struct sk_buff *skb)
1127{
1128 struct hci_cp_le_set_scan_param *cp;
1129 __u8 status = *((__u8 *) skb->data);
1130
1131 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1132
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001133 if (status)
1134 return;
1135
Marcel Holtmann533553f2014-03-21 12:18:10 -07001136 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_PARAM);
1137 if (!cp)
1138 return;
1139
1140 hci_dev_lock(hdev);
1141
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001142 hdev->le_scan_type = cp->type;
Marcel Holtmann533553f2014-03-21 12:18:10 -07001143
1144 hci_dev_unlock(hdev);
1145}
1146
Johan Hedbergb9a63282014-03-25 10:51:52 +02001147static bool has_pending_adv_report(struct hci_dev *hdev)
1148{
1149 struct discovery_state *d = &hdev->discovery;
1150
1151 return bacmp(&d->last_adv_addr, BDADDR_ANY);
1152}
1153
1154static void clear_pending_adv_report(struct hci_dev *hdev)
1155{
1156 struct discovery_state *d = &hdev->discovery;
1157
1158 bacpy(&d->last_adv_addr, BDADDR_ANY);
1159 d->last_adv_data_len = 0;
1160}
1161
1162static void store_pending_adv_report(struct hci_dev *hdev, bdaddr_t *bdaddr,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001163 u8 bdaddr_type, s8 rssi, u32 flags,
1164 u8 *data, u8 len)
Johan Hedbergb9a63282014-03-25 10:51:52 +02001165{
1166 struct discovery_state *d = &hdev->discovery;
1167
1168 bacpy(&d->last_adv_addr, bdaddr);
1169 d->last_adv_addr_type = bdaddr_type;
Johan Hedbergff5cd292014-03-25 14:40:52 +02001170 d->last_adv_rssi = rssi;
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001171 d->last_adv_flags = flags;
Johan Hedbergb9a63282014-03-25 10:51:52 +02001172 memcpy(d->last_adv_data, data, len);
1173 d->last_adv_data_len = len;
1174}
1175
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001176static void hci_cc_le_set_scan_enable(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -03001177 struct sk_buff *skb)
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001178{
1179 struct hci_cp_le_set_scan_enable *cp;
1180 __u8 status = *((__u8 *) skb->data);
1181
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001182 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001183
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001184 if (status)
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001185 return;
1186
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001187 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_ENABLE);
1188 if (!cp)
Andre Guedes3fd319b2013-04-30 15:29:36 -03001189 return;
1190
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301191 hci_dev_lock(hdev);
1192
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001193 switch (cp->enable) {
Andre Guedes76a388be2013-04-04 20:21:02 -03001194 case LE_SCAN_ENABLE:
Marcel Holtmanna1536da2015-03-13 02:11:01 -07001195 hci_dev_set_flag(hdev, HCI_LE_SCAN);
Johan Hedbergb9a63282014-03-25 10:51:52 +02001196 if (hdev->le_scan_type == LE_SCAN_ACTIVE)
1197 clear_pending_adv_report(hdev);
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001198 break;
1199
Andre Guedes76a388be2013-04-04 20:21:02 -03001200 case LE_SCAN_DISABLE:
Johan Hedbergb9a63282014-03-25 10:51:52 +02001201 /* We do this here instead of when setting DISCOVERY_STOPPED
1202 * since the latter would potentially require waiting for
1203 * inquiry to stop too.
1204 */
1205 if (has_pending_adv_report(hdev)) {
1206 struct discovery_state *d = &hdev->discovery;
1207
1208 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergab0aa432014-03-26 14:17:12 +02001209 d->last_adv_addr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001210 d->last_adv_rssi, d->last_adv_flags,
Johan Hedbergab0aa432014-03-26 14:17:12 +02001211 d->last_adv_data,
Johan Hedbergb9a63282014-03-25 10:51:52 +02001212 d->last_adv_data_len, NULL, 0);
1213 }
1214
Johan Hedberg317ac8c2014-02-28 20:26:12 +02001215 /* Cancel this timer so that we don't try to disable scanning
1216 * when it's already disabled.
1217 */
1218 cancel_delayed_work(&hdev->le_scan_disable);
1219
Marcel Holtmanna358dc12015-03-13 02:11:02 -07001220 hci_dev_clear_flag(hdev, HCI_LE_SCAN);
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001221
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001222 /* The HCI_LE_SCAN_INTERRUPTED flag indicates that we
1223 * interrupted scanning due to a connect request. Mark
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001224 * therefore discovery as stopped. If this was not
1225 * because of a connect request advertising might have
1226 * been disabled because of active scanning, so
1227 * re-enable it again if necessary.
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001228 */
Marcel Holtmanna69d8922015-03-13 02:11:05 -07001229 if (hci_dev_test_and_clear_flag(hdev, HCI_LE_SCAN_INTERRUPTED))
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001230 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001231 else if (!hci_dev_test_flag(hdev, HCI_LE_ADV) &&
Johan Hedberg34722272014-07-08 16:05:05 +03001232 hdev->discovery.state == DISCOVERY_FINDING)
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001233 mgmt_reenable_advertising(hdev);
1234
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001235 break;
1236
1237 default:
1238 BT_ERR("Used reserved LE_Scan_Enable param %d", cp->enable);
1239 break;
Andre Guedes35815082011-05-26 16:23:53 -03001240 }
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301241
1242 hci_dev_unlock(hdev);
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001243}
1244
Johan Hedbergcf1d0812013-01-22 14:02:00 +02001245static void hci_cc_le_read_white_list_size(struct hci_dev *hdev,
1246 struct sk_buff *skb)
1247{
1248 struct hci_rp_le_read_white_list_size *rp = (void *) skb->data;
1249
1250 BT_DBG("%s status 0x%2.2x size %u", hdev->name, rp->status, rp->size);
1251
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001252 if (rp->status)
1253 return;
1254
1255 hdev->le_white_list_size = rp->size;
Johan Hedbergcf1d0812013-01-22 14:02:00 +02001256}
1257
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001258static void hci_cc_le_clear_white_list(struct hci_dev *hdev,
1259 struct sk_buff *skb)
1260{
1261 __u8 status = *((__u8 *) skb->data);
1262
1263 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1264
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001265 if (status)
1266 return;
1267
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001268 hci_bdaddr_list_clear(&hdev->le_white_list);
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001269}
1270
1271static void hci_cc_le_add_to_white_list(struct hci_dev *hdev,
1272 struct sk_buff *skb)
1273{
1274 struct hci_cp_le_add_to_white_list *sent;
1275 __u8 status = *((__u8 *) skb->data);
1276
1277 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1278
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001279 if (status)
1280 return;
1281
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001282 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_ADD_TO_WHITE_LIST);
1283 if (!sent)
1284 return;
1285
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001286 hci_bdaddr_list_add(&hdev->le_white_list, &sent->bdaddr,
1287 sent->bdaddr_type);
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001288}
1289
1290static void hci_cc_le_del_from_white_list(struct hci_dev *hdev,
1291 struct sk_buff *skb)
1292{
1293 struct hci_cp_le_del_from_white_list *sent;
1294 __u8 status = *((__u8 *) skb->data);
1295
1296 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1297
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001298 if (status)
1299 return;
1300
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001301 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_DEL_FROM_WHITE_LIST);
1302 if (!sent)
1303 return;
1304
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001305 hci_bdaddr_list_del(&hdev->le_white_list, &sent->bdaddr,
1306 sent->bdaddr_type);
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001307}
1308
Johan Hedberg9b008c02013-01-22 14:02:01 +02001309static void hci_cc_le_read_supported_states(struct hci_dev *hdev,
1310 struct sk_buff *skb)
1311{
1312 struct hci_rp_le_read_supported_states *rp = (void *) skb->data;
1313
1314 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1315
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001316 if (rp->status)
1317 return;
1318
1319 memcpy(hdev->le_states, rp->le_states, 8);
Johan Hedberg9b008c02013-01-22 14:02:01 +02001320}
1321
Marcel Holtmanna8e1bfa2014-12-20 16:28:40 +01001322static void hci_cc_le_read_def_data_len(struct hci_dev *hdev,
1323 struct sk_buff *skb)
1324{
1325 struct hci_rp_le_read_def_data_len *rp = (void *) skb->data;
1326
1327 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1328
1329 if (rp->status)
1330 return;
1331
1332 hdev->le_def_tx_len = le16_to_cpu(rp->tx_len);
1333 hdev->le_def_tx_time = le16_to_cpu(rp->tx_time);
1334}
1335
1336static void hci_cc_le_write_def_data_len(struct hci_dev *hdev,
1337 struct sk_buff *skb)
1338{
1339 struct hci_cp_le_write_def_data_len *sent;
1340 __u8 status = *((__u8 *) skb->data);
1341
1342 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1343
1344 if (status)
1345 return;
1346
1347 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_WRITE_DEF_DATA_LEN);
1348 if (!sent)
1349 return;
1350
1351 hdev->le_def_tx_len = le16_to_cpu(sent->tx_len);
1352 hdev->le_def_tx_time = le16_to_cpu(sent->tx_time);
1353}
1354
1355static void hci_cc_le_read_max_data_len(struct hci_dev *hdev,
1356 struct sk_buff *skb)
1357{
1358 struct hci_rp_le_read_max_data_len *rp = (void *) skb->data;
1359
1360 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1361
1362 if (rp->status)
1363 return;
1364
1365 hdev->le_max_tx_len = le16_to_cpu(rp->tx_len);
1366 hdev->le_max_tx_time = le16_to_cpu(rp->tx_time);
1367 hdev->le_max_rx_len = le16_to_cpu(rp->rx_len);
1368 hdev->le_max_rx_time = le16_to_cpu(rp->rx_time);
1369}
1370
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001371static void hci_cc_write_le_host_supported(struct hci_dev *hdev,
1372 struct sk_buff *skb)
Andre Guedesf9b49302011-06-30 19:20:53 -03001373{
Johan Hedberg06199cf2012-02-22 16:37:11 +02001374 struct hci_cp_write_le_host_supported *sent;
Andre Guedesf9b49302011-06-30 19:20:53 -03001375 __u8 status = *((__u8 *) skb->data);
1376
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001377 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedesf9b49302011-06-30 19:20:53 -03001378
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001379 if (status)
1380 return;
1381
Johan Hedberg06199cf2012-02-22 16:37:11 +02001382 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LE_HOST_SUPPORTED);
Johan Hedberg8f984df2012-02-28 01:07:22 +02001383 if (!sent)
Andre Guedesf9b49302011-06-30 19:20:53 -03001384 return;
1385
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301386 hci_dev_lock(hdev);
1387
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001388 if (sent->le) {
1389 hdev->features[1][0] |= LMP_HOST_LE;
Marcel Holtmanna1536da2015-03-13 02:11:01 -07001390 hci_dev_set_flag(hdev, HCI_LE_ENABLED);
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001391 } else {
1392 hdev->features[1][0] &= ~LMP_HOST_LE;
Marcel Holtmanna358dc12015-03-13 02:11:02 -07001393 hci_dev_clear_flag(hdev, HCI_LE_ENABLED);
1394 hci_dev_clear_flag(hdev, HCI_ADVERTISING);
Johan Hedberg8f984df2012-02-28 01:07:22 +02001395 }
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001396
1397 if (sent->simul)
1398 hdev->features[1][0] |= LMP_HOST_LE_BREDR;
1399 else
1400 hdev->features[1][0] &= ~LMP_HOST_LE_BREDR;
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301401
1402 hci_dev_unlock(hdev);
Andre Guedesf9b49302011-06-30 19:20:53 -03001403}
1404
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02001405static void hci_cc_set_adv_param(struct hci_dev *hdev, struct sk_buff *skb)
1406{
1407 struct hci_cp_le_set_adv_param *cp;
1408 u8 status = *((u8 *) skb->data);
1409
1410 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1411
1412 if (status)
1413 return;
1414
1415 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADV_PARAM);
1416 if (!cp)
1417 return;
1418
1419 hci_dev_lock(hdev);
1420 hdev->adv_addr_type = cp->own_address_type;
1421 hci_dev_unlock(hdev);
1422}
1423
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001424static void hci_cc_write_remote_amp_assoc(struct hci_dev *hdev,
1425 struct sk_buff *skb)
1426{
1427 struct hci_rp_write_remote_amp_assoc *rp = (void *) skb->data;
1428
1429 BT_DBG("%s status 0x%2.2x phy_handle 0x%2.2x",
1430 hdev->name, rp->status, rp->phy_handle);
1431
1432 if (rp->status)
1433 return;
1434
1435 amp_write_rem_assoc_continue(hdev, rp->phy_handle);
1436}
1437
Andrzej Kaczmarek5ae76a92014-05-08 15:32:08 +02001438static void hci_cc_read_rssi(struct hci_dev *hdev, struct sk_buff *skb)
1439{
1440 struct hci_rp_read_rssi *rp = (void *) skb->data;
1441 struct hci_conn *conn;
1442
1443 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1444
1445 if (rp->status)
1446 return;
1447
1448 hci_dev_lock(hdev);
1449
1450 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
1451 if (conn)
1452 conn->rssi = rp->rssi;
1453
1454 hci_dev_unlock(hdev);
1455}
1456
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001457static void hci_cc_read_tx_power(struct hci_dev *hdev, struct sk_buff *skb)
1458{
1459 struct hci_cp_read_tx_power *sent;
1460 struct hci_rp_read_tx_power *rp = (void *) skb->data;
1461 struct hci_conn *conn;
1462
1463 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1464
1465 if (rp->status)
1466 return;
1467
1468 sent = hci_sent_cmd_data(hdev, HCI_OP_READ_TX_POWER);
1469 if (!sent)
1470 return;
1471
1472 hci_dev_lock(hdev);
1473
1474 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
Andrzej Kaczmarekd0455ed2014-05-14 13:43:05 +02001475 if (!conn)
1476 goto unlock;
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001477
Andrzej Kaczmarekd0455ed2014-05-14 13:43:05 +02001478 switch (sent->type) {
1479 case 0x00:
1480 conn->tx_power = rp->tx_power;
1481 break;
1482 case 0x01:
1483 conn->max_tx_power = rp->tx_power;
1484 break;
1485 }
1486
1487unlock:
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001488 hci_dev_unlock(hdev);
1489}
1490
Marcel Holtmannc50b33c2015-01-31 15:07:52 -08001491static void hci_cc_write_ssp_debug_mode(struct hci_dev *hdev, struct sk_buff *skb)
1492{
1493 u8 status = *((u8 *) skb->data);
1494 u8 *mode;
1495
1496 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1497
1498 if (status)
1499 return;
1500
1501 mode = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SSP_DEBUG_MODE);
1502 if (mode)
1503 hdev->ssp_debug_mode = *mode;
1504}
1505
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001506static void hci_cs_inquiry(struct hci_dev *hdev, __u8 status)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001507{
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001508 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001509
1510 if (status) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001511 hci_conn_check_pending(hdev);
Johan Hedberg314b2382011-04-27 10:29:57 -04001512 return;
1513 }
1514
Andre Guedes89352e72011-11-04 14:16:53 -03001515 set_bit(HCI_INQUIRY, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001516}
1517
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001518static void hci_cs_create_conn(struct hci_dev *hdev, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001519{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001520 struct hci_cp_create_conn *cp;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001521 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001522
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 cp = hci_sent_cmd_data(hdev, HCI_OP_CREATE_CONN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001526 if (!cp)
1527 return;
1528
1529 hci_dev_lock(hdev);
1530
1531 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
1532
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03001533 BT_DBG("%s bdaddr %pMR hcon %p", hdev->name, &cp->bdaddr, conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001534
1535 if (status) {
1536 if (conn && conn->state == BT_CONNECT) {
Marcel Holtmann4c67bc72006-10-15 17:30:56 +02001537 if (status != 0x0c || conn->attempt > 2) {
1538 conn->state = BT_CLOSED;
Johan Hedberg539c4962015-02-18 14:53:57 +02001539 hci_connect_cfm(conn, status);
Marcel Holtmann4c67bc72006-10-15 17:30:56 +02001540 hci_conn_del(conn);
1541 } else
1542 conn->state = BT_CONNECT2;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001543 }
1544 } else {
1545 if (!conn) {
Johan Hedberga5c4e302014-07-16 11:56:07 +03001546 conn = hci_conn_add(hdev, ACL_LINK, &cp->bdaddr,
1547 HCI_ROLE_MASTER);
1548 if (!conn)
Gustavo F. Padovan893ef972010-07-18 15:13:37 -03001549 BT_ERR("No memory for new connection");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001550 }
1551 }
1552
1553 hci_dev_unlock(hdev);
1554}
1555
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001556static void hci_cs_add_sco(struct hci_dev *hdev, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001557{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001558 struct hci_cp_add_sco *cp;
1559 struct hci_conn *acl, *sco;
1560 __u16 handle;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001561
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001562 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001563
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001564 if (!status)
1565 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001566
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001567 cp = hci_sent_cmd_data(hdev, HCI_OP_ADD_SCO);
1568 if (!cp)
1569 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001570
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001571 handle = __le16_to_cpu(cp->handle);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001572
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001573 BT_DBG("%s handle 0x%4.4x", hdev->name, handle);
Marcel Holtmann6bd57412006-11-18 22:14:22 +01001574
1575 hci_dev_lock(hdev);
1576
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001577 acl = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001578 if (acl) {
1579 sco = acl->link;
1580 if (sco) {
1581 sco->state = BT_CLOSED;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001582
Johan Hedberg539c4962015-02-18 14:53:57 +02001583 hci_connect_cfm(sco, status);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001584 hci_conn_del(sco);
1585 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001586 }
Marcel Holtmann6bd57412006-11-18 22:14:22 +01001587
1588 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001589}
1590
Marcel Holtmannf8558552008-07-14 20:13:49 +02001591static void hci_cs_auth_requested(struct hci_dev *hdev, __u8 status)
1592{
1593 struct hci_cp_auth_requested *cp;
1594 struct hci_conn *conn;
1595
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001596 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001597
1598 if (!status)
1599 return;
1600
1601 cp = hci_sent_cmd_data(hdev, HCI_OP_AUTH_REQUESTED);
1602 if (!cp)
1603 return;
1604
1605 hci_dev_lock(hdev);
1606
1607 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1608 if (conn) {
1609 if (conn->state == BT_CONFIG) {
Johan Hedberg539c4962015-02-18 14:53:57 +02001610 hci_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001611 hci_conn_drop(conn);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001612 }
1613 }
1614
1615 hci_dev_unlock(hdev);
1616}
1617
1618static void hci_cs_set_conn_encrypt(struct hci_dev *hdev, __u8 status)
1619{
1620 struct hci_cp_set_conn_encrypt *cp;
1621 struct hci_conn *conn;
1622
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001623 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001624
1625 if (!status)
1626 return;
1627
1628 cp = hci_sent_cmd_data(hdev, HCI_OP_SET_CONN_ENCRYPT);
1629 if (!cp)
1630 return;
1631
1632 hci_dev_lock(hdev);
1633
1634 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1635 if (conn) {
1636 if (conn->state == BT_CONFIG) {
Johan Hedberg539c4962015-02-18 14:53:57 +02001637 hci_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001638 hci_conn_drop(conn);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001639 }
1640 }
1641
1642 hci_dev_unlock(hdev);
1643}
1644
Johan Hedberg127178d2010-11-18 22:22:29 +02001645static int hci_outgoing_auth_needed(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -03001646 struct hci_conn *conn)
Johan Hedberg392599b2010-11-18 22:22:28 +02001647{
Johan Hedberg392599b2010-11-18 22:22:28 +02001648 if (conn->state != BT_CONFIG || !conn->out)
1649 return 0;
1650
Johan Hedberg765c2a92011-01-19 12:06:52 +05301651 if (conn->pending_sec_level == BT_SECURITY_SDP)
Johan Hedberg392599b2010-11-18 22:22:28 +02001652 return 0;
1653
1654 /* Only request authentication for SSP connections or non-SSP
Johan Hedberg264b8b42014-01-08 16:40:39 +02001655 * devices with sec_level MEDIUM or HIGH or if MITM protection
1656 * is requested.
1657 */
Gustavo Padovan807deac2012-05-17 00:36:24 -03001658 if (!hci_conn_ssp_enabled(conn) && !(conn->auth_type & 0x01) &&
Johan Hedberg7e3691e2014-05-30 14:45:19 +03001659 conn->pending_sec_level != BT_SECURITY_FIPS &&
Johan Hedberg264b8b42014-01-08 16:40:39 +02001660 conn->pending_sec_level != BT_SECURITY_HIGH &&
1661 conn->pending_sec_level != BT_SECURITY_MEDIUM)
Johan Hedberg392599b2010-11-18 22:22:28 +02001662 return 0;
1663
Johan Hedberg392599b2010-11-18 22:22:28 +02001664 return 1;
1665}
1666
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001667static int hci_resolve_name(struct hci_dev *hdev,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001668 struct inquiry_entry *e)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001669{
1670 struct hci_cp_remote_name_req cp;
1671
1672 memset(&cp, 0, sizeof(cp));
1673
1674 bacpy(&cp.bdaddr, &e->data.bdaddr);
1675 cp.pscan_rep_mode = e->data.pscan_rep_mode;
1676 cp.pscan_mode = e->data.pscan_mode;
1677 cp.clock_offset = e->data.clock_offset;
1678
1679 return hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
1680}
1681
Johan Hedbergb644ba32012-01-17 21:48:47 +02001682static bool hci_resolve_next_name(struct hci_dev *hdev)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001683{
1684 struct discovery_state *discov = &hdev->discovery;
1685 struct inquiry_entry *e;
1686
Johan Hedbergb644ba32012-01-17 21:48:47 +02001687 if (list_empty(&discov->resolve))
1688 return false;
1689
1690 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
Ram Malovanyc8100892012-07-19 10:26:09 +03001691 if (!e)
1692 return false;
1693
Johan Hedbergb644ba32012-01-17 21:48:47 +02001694 if (hci_resolve_name(hdev, e) == 0) {
1695 e->name_state = NAME_PENDING;
1696 return true;
1697 }
1698
1699 return false;
1700}
1701
1702static void hci_check_pending_name(struct hci_dev *hdev, struct hci_conn *conn,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001703 bdaddr_t *bdaddr, u8 *name, u8 name_len)
Johan Hedbergb644ba32012-01-17 21:48:47 +02001704{
1705 struct discovery_state *discov = &hdev->discovery;
1706 struct inquiry_entry *e;
1707
Johan Hedberg60cb49d2014-11-11 11:33:24 +02001708 /* Update the mgmt connected state if necessary. Be careful with
1709 * conn objects that exist but are not (yet) connected however.
1710 * Only those in BT_CONFIG or BT_CONNECTED states can be
1711 * considered connected.
1712 */
1713 if (conn &&
1714 (conn->state == BT_CONFIG || conn->state == BT_CONNECTED) &&
Jaganath Kanakkasserycb77c3e2014-11-07 16:39:09 +05301715 !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00001716 mgmt_device_connected(hdev, conn, 0, name, name_len);
Johan Hedbergb644ba32012-01-17 21:48:47 +02001717
1718 if (discov->state == DISCOVERY_STOPPED)
1719 return;
1720
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001721 if (discov->state == DISCOVERY_STOPPING)
1722 goto discov_complete;
1723
1724 if (discov->state != DISCOVERY_RESOLVING)
1725 return;
1726
1727 e = hci_inquiry_cache_lookup_resolve(hdev, bdaddr, NAME_PENDING);
Ram Malovany7cc83802012-07-19 10:26:10 +03001728 /* If the device was not found in a list of found devices names of which
1729 * are pending. there is no need to continue resolving a next name as it
1730 * will be done upon receiving another Remote Name Request Complete
1731 * Event */
1732 if (!e)
1733 return;
1734
1735 list_del(&e->list);
1736 if (name) {
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001737 e->name_state = NAME_KNOWN;
Ram Malovany7cc83802012-07-19 10:26:10 +03001738 mgmt_remote_name(hdev, bdaddr, ACL_LINK, 0x00,
1739 e->data.rssi, name, name_len);
Ram Malovanyc3e7c0d2012-07-19 10:26:11 +03001740 } else {
1741 e->name_state = NAME_NOT_KNOWN;
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001742 }
1743
Johan Hedbergb644ba32012-01-17 21:48:47 +02001744 if (hci_resolve_next_name(hdev))
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001745 return;
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001746
1747discov_complete:
1748 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
1749}
1750
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001751static void hci_cs_remote_name_req(struct hci_dev *hdev, __u8 status)
1752{
Johan Hedberg127178d2010-11-18 22:22:29 +02001753 struct hci_cp_remote_name_req *cp;
1754 struct hci_conn *conn;
1755
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001756 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Johan Hedberg127178d2010-11-18 22:22:29 +02001757
1758 /* If successful wait for the name req complete event before
1759 * checking for the need to do authentication */
1760 if (!status)
1761 return;
1762
1763 cp = hci_sent_cmd_data(hdev, HCI_OP_REMOTE_NAME_REQ);
1764 if (!cp)
1765 return;
1766
1767 hci_dev_lock(hdev);
1768
1769 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02001770
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001771 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedbergb644ba32012-01-17 21:48:47 +02001772 hci_check_pending_name(hdev, conn, &cp->bdaddr, NULL, 0);
1773
Johan Hedberg79c6c702011-04-28 11:28:55 -07001774 if (!conn)
1775 goto unlock;
1776
1777 if (!hci_outgoing_auth_needed(hdev, conn))
1778 goto unlock;
1779
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001780 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02001781 struct hci_cp_auth_requested auth_cp;
1782
Johan Hedberg977f8fc2014-07-17 15:35:39 +03001783 set_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags);
1784
Johannes Bergc1f23a22013-10-07 18:19:16 +02001785 auth_cp.handle = __cpu_to_le16(conn->handle);
1786 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED,
1787 sizeof(auth_cp), &auth_cp);
Johan Hedberg127178d2010-11-18 22:22:29 +02001788 }
1789
Johan Hedberg79c6c702011-04-28 11:28:55 -07001790unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02001791 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001792}
1793
Marcel Holtmann769be972008-07-14 20:13:49 +02001794static void hci_cs_read_remote_features(struct hci_dev *hdev, __u8 status)
1795{
1796 struct hci_cp_read_remote_features *cp;
1797 struct hci_conn *conn;
1798
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001799 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann769be972008-07-14 20:13:49 +02001800
1801 if (!status)
1802 return;
1803
1804 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_REMOTE_FEATURES);
1805 if (!cp)
1806 return;
1807
1808 hci_dev_lock(hdev);
1809
1810 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1811 if (conn) {
1812 if (conn->state == BT_CONFIG) {
Johan Hedberg539c4962015-02-18 14:53:57 +02001813 hci_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001814 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02001815 }
1816 }
1817
1818 hci_dev_unlock(hdev);
1819}
1820
1821static void hci_cs_read_remote_ext_features(struct hci_dev *hdev, __u8 status)
1822{
1823 struct hci_cp_read_remote_ext_features *cp;
1824 struct hci_conn *conn;
1825
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001826 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann769be972008-07-14 20:13:49 +02001827
1828 if (!status)
1829 return;
1830
1831 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES);
1832 if (!cp)
1833 return;
1834
1835 hci_dev_lock(hdev);
1836
1837 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1838 if (conn) {
1839 if (conn->state == BT_CONFIG) {
Johan Hedberg539c4962015-02-18 14:53:57 +02001840 hci_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001841 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02001842 }
1843 }
1844
1845 hci_dev_unlock(hdev);
1846}
1847
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001848static void hci_cs_setup_sync_conn(struct hci_dev *hdev, __u8 status)
1849{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001850 struct hci_cp_setup_sync_conn *cp;
1851 struct hci_conn *acl, *sco;
1852 __u16 handle;
1853
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001854 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001855
1856 if (!status)
1857 return;
1858
1859 cp = hci_sent_cmd_data(hdev, HCI_OP_SETUP_SYNC_CONN);
1860 if (!cp)
1861 return;
1862
1863 handle = __le16_to_cpu(cp->handle);
1864
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001865 BT_DBG("%s handle 0x%4.4x", hdev->name, handle);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001866
1867 hci_dev_lock(hdev);
1868
1869 acl = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001870 if (acl) {
1871 sco = acl->link;
1872 if (sco) {
1873 sco->state = BT_CLOSED;
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001874
Johan Hedberg539c4962015-02-18 14:53:57 +02001875 hci_connect_cfm(sco, status);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001876 hci_conn_del(sco);
1877 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001878 }
1879
1880 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001881}
1882
1883static void hci_cs_sniff_mode(struct hci_dev *hdev, __u8 status)
1884{
1885 struct hci_cp_sniff_mode *cp;
1886 struct hci_conn *conn;
1887
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001888 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001889
1890 if (!status)
1891 return;
1892
1893 cp = hci_sent_cmd_data(hdev, HCI_OP_SNIFF_MODE);
1894 if (!cp)
1895 return;
1896
1897 hci_dev_lock(hdev);
1898
1899 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001900 if (conn) {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001901 clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001902
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001903 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001904 hci_sco_setup(conn, status);
1905 }
1906
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001907 hci_dev_unlock(hdev);
1908}
1909
1910static void hci_cs_exit_sniff_mode(struct hci_dev *hdev, __u8 status)
1911{
1912 struct hci_cp_exit_sniff_mode *cp;
1913 struct hci_conn *conn;
1914
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001915 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001916
1917 if (!status)
1918 return;
1919
1920 cp = hci_sent_cmd_data(hdev, HCI_OP_EXIT_SNIFF_MODE);
1921 if (!cp)
1922 return;
1923
1924 hci_dev_lock(hdev);
1925
1926 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001927 if (conn) {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001928 clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001929
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001930 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001931 hci_sco_setup(conn, status);
1932 }
1933
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001934 hci_dev_unlock(hdev);
1935}
1936
Johan Hedberg88c3df12012-02-09 14:27:38 +02001937static void hci_cs_disconnect(struct hci_dev *hdev, u8 status)
1938{
1939 struct hci_cp_disconnect *cp;
1940 struct hci_conn *conn;
1941
1942 if (!status)
1943 return;
1944
1945 cp = hci_sent_cmd_data(hdev, HCI_OP_DISCONNECT);
1946 if (!cp)
1947 return;
1948
1949 hci_dev_lock(hdev);
1950
1951 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1952 if (conn)
1953 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001954 conn->dst_type, status);
Johan Hedberg88c3df12012-02-09 14:27:38 +02001955
1956 hci_dev_unlock(hdev);
1957}
1958
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03001959static void hci_cs_create_phylink(struct hci_dev *hdev, u8 status)
1960{
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001961 struct hci_cp_create_phy_link *cp;
1962
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03001963 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001964
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001965 cp = hci_sent_cmd_data(hdev, HCI_OP_CREATE_PHY_LINK);
1966 if (!cp)
1967 return;
1968
Andrei Emeltchenkoe58917b2012-10-31 15:46:33 +02001969 hci_dev_lock(hdev);
1970
1971 if (status) {
1972 struct hci_conn *hcon;
1973
1974 hcon = hci_conn_hash_lookup_handle(hdev, cp->phy_handle);
1975 if (hcon)
1976 hci_conn_del(hcon);
1977 } else {
1978 amp_write_remote_assoc(hdev, cp->phy_handle);
1979 }
1980
1981 hci_dev_unlock(hdev);
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03001982}
1983
Andrei Emeltchenko0b26ab92012-09-27 17:26:24 +03001984static void hci_cs_accept_phylink(struct hci_dev *hdev, u8 status)
1985{
1986 struct hci_cp_accept_phy_link *cp;
1987
1988 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1989
1990 if (status)
1991 return;
1992
1993 cp = hci_sent_cmd_data(hdev, HCI_OP_ACCEPT_PHY_LINK);
1994 if (!cp)
1995 return;
1996
1997 amp_write_remote_assoc(hdev, cp->phy_handle);
1998}
1999
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02002000static void hci_cs_le_create_conn(struct hci_dev *hdev, u8 status)
2001{
2002 struct hci_cp_le_create_conn *cp;
2003 struct hci_conn *conn;
2004
2005 BT_DBG("%s status 0x%2.2x", hdev->name, status);
2006
2007 /* All connection failure handling is taken care of by the
2008 * hci_le_conn_failed function which is triggered by the HCI
2009 * request completion callbacks used for connecting.
2010 */
2011 if (status)
2012 return;
2013
2014 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_CREATE_CONN);
2015 if (!cp)
2016 return;
2017
2018 hci_dev_lock(hdev);
2019
2020 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->peer_addr);
2021 if (!conn)
2022 goto unlock;
2023
2024 /* Store the initiator and responder address information which
2025 * is needed for SMP. These values will not change during the
2026 * lifetime of the connection.
2027 */
2028 conn->init_addr_type = cp->own_address_type;
2029 if (cp->own_address_type == ADDR_LE_DEV_RANDOM)
2030 bacpy(&conn->init_addr, &hdev->random_addr);
2031 else
2032 bacpy(&conn->init_addr, &hdev->bdaddr);
2033
2034 conn->resp_addr_type = cp->peer_addr_type;
2035 bacpy(&conn->resp_addr, &cp->peer_addr);
2036
Johan Hedberg9489eca2014-02-28 17:45:46 +02002037 /* We don't want the connection attempt to stick around
2038 * indefinitely since LE doesn't have a page timeout concept
2039 * like BR/EDR. Set a timer for any connection that doesn't use
2040 * the white list for connecting.
2041 */
2042 if (cp->filter_policy == HCI_LE_USE_PEER_ADDR)
2043 queue_delayed_work(conn->hdev->workqueue,
2044 &conn->le_conn_timeout,
Johan Hedberg09ae2602014-07-06 13:41:15 +03002045 conn->conn_timeout);
Johan Hedberg9489eca2014-02-28 17:45:46 +02002046
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02002047unlock:
2048 hci_dev_unlock(hdev);
2049}
2050
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02002051static void hci_cs_le_start_enc(struct hci_dev *hdev, u8 status)
2052{
2053 struct hci_cp_le_start_enc *cp;
2054 struct hci_conn *conn;
2055
2056 BT_DBG("%s status 0x%2.2x", hdev->name, status);
2057
2058 if (!status)
2059 return;
2060
2061 hci_dev_lock(hdev);
2062
2063 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_START_ENC);
2064 if (!cp)
2065 goto unlock;
2066
2067 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
2068 if (!conn)
2069 goto unlock;
2070
2071 if (conn->state != BT_CONNECTED)
2072 goto unlock;
2073
2074 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
2075 hci_conn_drop(conn);
2076
2077unlock:
2078 hci_dev_unlock(hdev);
2079}
2080
Kuba Pawlak50fc85f2014-11-06 19:36:52 +01002081static void hci_cs_switch_role(struct hci_dev *hdev, u8 status)
2082{
2083 struct hci_cp_switch_role *cp;
2084 struct hci_conn *conn;
2085
2086 BT_DBG("%s status 0x%2.2x", hdev->name, status);
2087
2088 if (!status)
2089 return;
2090
2091 cp = hci_sent_cmd_data(hdev, HCI_OP_SWITCH_ROLE);
2092 if (!cp)
2093 return;
2094
2095 hci_dev_lock(hdev);
2096
2097 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
2098 if (conn)
2099 clear_bit(HCI_CONN_RSWITCH_PEND, &conn->flags);
2100
2101 hci_dev_unlock(hdev);
2102}
2103
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002104static void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002105{
2106 __u8 status = *((__u8 *) skb->data);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002107 struct discovery_state *discov = &hdev->discovery;
2108 struct inquiry_entry *e;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002109
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002110 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002111
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002112 hci_conn_check_pending(hdev);
Andre Guedes89352e72011-11-04 14:16:53 -03002113
2114 if (!test_and_clear_bit(HCI_INQUIRY, &hdev->flags))
2115 return;
2116
Peter Zijlstra4e857c52014-03-17 18:06:10 +01002117 smp_mb__after_atomic(); /* wake_up_bit advises about this barrier */
Andre Guedes3e13fa12013-03-27 20:04:56 -03002118 wake_up_bit(&hdev->flags, HCI_INQUIRY);
2119
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002120 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002121 return;
2122
Johan Hedberg56e5cb82011-11-08 20:40:16 +02002123 hci_dev_lock(hdev);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002124
Andre Guedes343f9352012-02-17 20:39:37 -03002125 if (discov->state != DISCOVERY_FINDING)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002126 goto unlock;
2127
2128 if (list_empty(&discov->resolve)) {
Jakub Pawlowski07d23342015-03-17 09:04:14 -07002129 /* When BR/EDR inquiry is active and no LE scanning is in
2130 * progress, then change discovery state to indicate completion.
2131 *
2132 * When running LE scanning and BR/EDR inquiry simultaneously
2133 * and the LE scan already finished, then change the discovery
2134 * state to indicate completion.
2135 */
2136 if (!hci_dev_test_flag(hdev, HCI_LE_SCAN) ||
2137 !test_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks))
2138 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002139 goto unlock;
2140 }
2141
2142 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
2143 if (e && hci_resolve_name(hdev, e) == 0) {
2144 e->name_state = NAME_PENDING;
2145 hci_discovery_set_state(hdev, DISCOVERY_RESOLVING);
2146 } else {
Jakub Pawlowski07d23342015-03-17 09:04:14 -07002147 /* When BR/EDR inquiry is active and no LE scanning is in
2148 * progress, then change discovery state to indicate completion.
2149 *
2150 * When running LE scanning and BR/EDR inquiry simultaneously
2151 * and the LE scan already finished, then change the discovery
2152 * state to indicate completion.
2153 */
2154 if (!hci_dev_test_flag(hdev, HCI_LE_SCAN) ||
2155 !test_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks))
2156 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002157 }
2158
2159unlock:
Johan Hedberg56e5cb82011-11-08 20:40:16 +02002160 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002161}
2162
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002163static void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002164{
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002165 struct inquiry_data data;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002166 struct inquiry_info *info = (void *) (skb->data + 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002167 int num_rsp = *((__u8 *) skb->data);
2168
2169 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
2170
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002171 if (!num_rsp)
2172 return;
2173
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002174 if (hci_dev_test_flag(hdev, HCI_PERIODIC_INQ))
Andre Guedes1519cc12012-03-21 00:03:38 -03002175 return;
2176
Linus Torvalds1da177e2005-04-16 15:20:36 -07002177 hci_dev_lock(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002178
Johan Hedberge17acd42011-03-30 23:57:16 +03002179 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02002180 u32 flags;
Johan Hedberg31754052012-01-04 13:39:52 +02002181
Linus Torvalds1da177e2005-04-16 15:20:36 -07002182 bacpy(&data.bdaddr, &info->bdaddr);
2183 data.pscan_rep_mode = info->pscan_rep_mode;
2184 data.pscan_period_mode = info->pscan_period_mode;
2185 data.pscan_mode = info->pscan_mode;
2186 memcpy(data.dev_class, info->dev_class, 3);
2187 data.clock_offset = info->clock_offset;
Marcel Holtmannefb25132014-12-05 13:03:34 +01002188 data.rssi = HCI_RSSI_INVALID;
Marcel Holtmann41a96212008-07-14 20:13:48 +02002189 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02002190
Marcel Holtmannaf589252014-07-01 14:11:20 +02002191 flags = hci_inquiry_cache_update(hdev, &data, false);
2192
Johan Hedberg48264f02011-11-09 13:58:58 +02002193 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Marcel Holtmannefb25132014-12-05 13:03:34 +01002194 info->dev_class, HCI_RSSI_INVALID,
2195 flags, NULL, 0, NULL, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002196 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002197
Linus Torvalds1da177e2005-04-16 15:20:36 -07002198 hci_dev_unlock(hdev);
2199}
2200
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002201static void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002202{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002203 struct hci_ev_conn_complete *ev = (void *) skb->data;
2204 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002205
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002206 BT_DBG("%s", hdev->name);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002207
Linus Torvalds1da177e2005-04-16 15:20:36 -07002208 hci_dev_lock(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002209
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002210 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann94992372009-04-19 19:30:03 +02002211 if (!conn) {
2212 if (ev->link_type != SCO_LINK)
2213 goto unlock;
2214
2215 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
2216 if (!conn)
2217 goto unlock;
2218
2219 conn->type = SCO_LINK;
2220 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002221
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002222 if (!ev->status) {
2223 conn->handle = __le16_to_cpu(ev->handle);
Marcel Holtmann769be972008-07-14 20:13:49 +02002224
2225 if (conn->type == ACL_LINK) {
2226 conn->state = BT_CONFIG;
2227 hci_conn_hold(conn);
Szymon Janca9ea3ed2012-07-19 14:46:08 +02002228
2229 if (!conn->out && !hci_conn_ssp_enabled(conn) &&
2230 !hci_find_link_key(hdev, &ev->bdaddr))
2231 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
2232 else
2233 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
Marcel Holtmann769be972008-07-14 20:13:49 +02002234 } else
2235 conn->state = BT_CONNECTED;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002236
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01002237 hci_debugfs_create_conn(conn);
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02002238 hci_conn_add_sysfs(conn);
2239
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002240 if (test_bit(HCI_AUTH, &hdev->flags))
Johan Hedberg4dae2792014-06-24 17:03:50 +03002241 set_bit(HCI_CONN_AUTH, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002242
2243 if (test_bit(HCI_ENCRYPT, &hdev->flags))
Johan Hedberg4dae2792014-06-24 17:03:50 +03002244 set_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002245
2246 /* Get remote features */
2247 if (conn->type == ACL_LINK) {
2248 struct hci_cp_read_remote_features cp;
2249 cp.handle = ev->handle;
Marcel Holtmann769be972008-07-14 20:13:49 +02002250 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_FEATURES,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002251 sizeof(cp), &cp);
Johan Hedberg22f433d2014-08-01 11:13:32 +03002252
Johan Hedberg1d2dc5b2014-12-19 13:40:19 +02002253 hci_update_page_scan(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002254 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002255
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002256 /* Set packet type for incoming connection */
Andrei Emeltchenkod095c1e2011-12-01 14:33:27 +02002257 if (!conn->out && hdev->hci_ver < BLUETOOTH_VER_2_0) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002258 struct hci_cp_change_conn_ptype cp;
2259 cp.handle = ev->handle;
Marcel Holtmanna8746412008-07-14 20:13:46 +02002260 cp.pkt_type = cpu_to_le16(conn->pkt_type);
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002261 hci_send_cmd(hdev, HCI_OP_CHANGE_CONN_PTYPE, sizeof(cp),
2262 &cp);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002263 }
Johan Hedberg17d5c042011-01-22 06:09:08 +02002264 } else {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002265 conn->state = BT_CLOSED;
Johan Hedberg17d5c042011-01-22 06:09:08 +02002266 if (conn->type == ACL_LINK)
Marcel Holtmann64c7b772014-02-18 14:22:20 -08002267 mgmt_connect_failed(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002268 conn->dst_type, ev->status);
Johan Hedberg17d5c042011-01-22 06:09:08 +02002269 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002270
Marcel Holtmanne73439d2010-07-26 10:06:00 -04002271 if (conn->type == ACL_LINK)
2272 hci_sco_setup(conn, ev->status);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002273
Marcel Holtmann769be972008-07-14 20:13:49 +02002274 if (ev->status) {
Johan Hedberg539c4962015-02-18 14:53:57 +02002275 hci_connect_cfm(conn, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002276 hci_conn_del(conn);
Marcel Holtmannc89b6e62009-01-15 21:57:03 +01002277 } else if (ev->link_type != ACL_LINK)
Johan Hedberg539c4962015-02-18 14:53:57 +02002278 hci_connect_cfm(conn, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002279
2280unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002281 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002282
2283 hci_conn_check_pending(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002284}
2285
Johan Hedberg70c46422014-07-09 12:59:17 +03002286static void hci_reject_conn(struct hci_dev *hdev, bdaddr_t *bdaddr)
2287{
2288 struct hci_cp_reject_conn_req cp;
2289
2290 bacpy(&cp.bdaddr, bdaddr);
2291 cp.reason = HCI_ERROR_REJ_BAD_ADDR;
2292 hci_send_cmd(hdev, HCI_OP_REJECT_CONN_REQ, sizeof(cp), &cp);
2293}
2294
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002295static void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002296{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002297 struct hci_ev_conn_request *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002298 int mask = hdev->link_mode;
Johan Hedberg70c46422014-07-09 12:59:17 +03002299 struct inquiry_entry *ie;
2300 struct hci_conn *conn;
Frédéric Dalleau20714bfe2012-11-21 10:51:12 +01002301 __u8 flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002302
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03002303 BT_DBG("%s bdaddr %pMR type 0x%x", hdev->name, &ev->bdaddr,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002304 ev->link_type);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002305
Frédéric Dalleau20714bfe2012-11-21 10:51:12 +01002306 mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, ev->link_type,
2307 &flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002308
Johan Hedberg70c46422014-07-09 12:59:17 +03002309 if (!(mask & HCI_LM_ACCEPT)) {
2310 hci_reject_conn(hdev, &ev->bdaddr);
2311 return;
2312 }
2313
Johan Hedberg46c4c942014-07-16 16:19:21 +03002314 if (hci_bdaddr_list_lookup(&hdev->blacklist, &ev->bdaddr,
2315 BDADDR_BREDR)) {
2316 hci_reject_conn(hdev, &ev->bdaddr);
2317 return;
2318 }
2319
Johan Hedberg6a8fc952014-12-24 20:43:11 +02002320 /* Require HCI_CONNECTABLE or a whitelist entry to accept the
2321 * connection. These features are only touched through mgmt so
2322 * only do the checks if HCI_MGMT is set.
2323 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002324 if (hci_dev_test_flag(hdev, HCI_MGMT) &&
2325 !hci_dev_test_flag(hdev, HCI_CONNECTABLE) &&
Johan Hedberg46c4c942014-07-16 16:19:21 +03002326 !hci_bdaddr_list_lookup(&hdev->whitelist, &ev->bdaddr,
2327 BDADDR_BREDR)) {
2328 hci_reject_conn(hdev, &ev->bdaddr);
2329 return;
Johan Hedberg70c46422014-07-09 12:59:17 +03002330 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002331
Johan Hedberg70c46422014-07-09 12:59:17 +03002332 /* Connection accepted */
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002333
Johan Hedberg70c46422014-07-09 12:59:17 +03002334 hci_dev_lock(hdev);
Marcel Holtmannc7bdd502008-07-14 20:13:47 +02002335
Johan Hedberg70c46422014-07-09 12:59:17 +03002336 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
2337 if (ie)
2338 memcpy(ie->data.dev_class, ev->dev_class, 3);
2339
2340 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type,
2341 &ev->bdaddr);
2342 if (!conn) {
Johan Hedberga5c4e302014-07-16 11:56:07 +03002343 conn = hci_conn_add(hdev, ev->link_type, &ev->bdaddr,
2344 HCI_ROLE_SLAVE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002345 if (!conn) {
Johan Hedberg70c46422014-07-09 12:59:17 +03002346 BT_ERR("No memory for new connection");
2347 hci_dev_unlock(hdev);
2348 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002349 }
Johan Hedberg70c46422014-07-09 12:59:17 +03002350 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002351
Johan Hedberg70c46422014-07-09 12:59:17 +03002352 memcpy(conn->dev_class, ev->dev_class, 3);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002353
Johan Hedberg70c46422014-07-09 12:59:17 +03002354 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002355
Johan Hedberg70c46422014-07-09 12:59:17 +03002356 if (ev->link_type == ACL_LINK ||
2357 (!(flags & HCI_PROTO_DEFER) && !lmp_esco_capable(hdev))) {
2358 struct hci_cp_accept_conn_req cp;
2359 conn->state = BT_CONNECT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002360
2361 bacpy(&cp.bdaddr, &ev->bdaddr);
Johan Hedberg70c46422014-07-09 12:59:17 +03002362
2363 if (lmp_rswitch_capable(hdev) && (mask & HCI_LM_MASTER))
2364 cp.role = 0x00; /* Become master */
2365 else
2366 cp.role = 0x01; /* Remain slave */
2367
2368 hci_send_cmd(hdev, HCI_OP_ACCEPT_CONN_REQ, sizeof(cp), &cp);
2369 } else if (!(flags & HCI_PROTO_DEFER)) {
2370 struct hci_cp_accept_sync_conn_req cp;
2371 conn->state = BT_CONNECT;
2372
2373 bacpy(&cp.bdaddr, &ev->bdaddr);
2374 cp.pkt_type = cpu_to_le16(conn->pkt_type);
2375
2376 cp.tx_bandwidth = cpu_to_le32(0x00001f40);
2377 cp.rx_bandwidth = cpu_to_le32(0x00001f40);
2378 cp.max_latency = cpu_to_le16(0xffff);
2379 cp.content_format = cpu_to_le16(hdev->voice_setting);
2380 cp.retrans_effort = 0xff;
2381
2382 hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ, sizeof(cp),
2383 &cp);
2384 } else {
2385 conn->state = BT_CONNECT2;
Johan Hedberg539c4962015-02-18 14:53:57 +02002386 hci_connect_cfm(conn, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002387 }
2388}
2389
Mikel Astizf0d6a0e2012-08-09 09:52:30 +02002390static u8 hci_to_mgmt_reason(u8 err)
2391{
2392 switch (err) {
2393 case HCI_ERROR_CONNECTION_TIMEOUT:
2394 return MGMT_DEV_DISCONN_TIMEOUT;
2395 case HCI_ERROR_REMOTE_USER_TERM:
2396 case HCI_ERROR_REMOTE_LOW_RESOURCES:
2397 case HCI_ERROR_REMOTE_POWER_OFF:
2398 return MGMT_DEV_DISCONN_REMOTE;
2399 case HCI_ERROR_LOCAL_HOST_TERM:
2400 return MGMT_DEV_DISCONN_LOCAL_HOST;
2401 default:
2402 return MGMT_DEV_DISCONN_UNKNOWN;
2403 }
2404}
2405
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002406static void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002407{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002408 struct hci_ev_disconn_complete *ev = (void *) skb->data;
Andre Guedesabf54a52013-11-07 17:36:09 -03002409 u8 reason = hci_to_mgmt_reason(ev->reason);
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002410 struct hci_conn_params *params;
Marcel Holtmann04837f62006-07-03 10:02:33 +02002411 struct hci_conn *conn;
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002412 bool mgmt_connected;
Andre Guedes38462202013-11-07 17:36:10 -03002413 u8 type;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002414
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002415 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002416
Linus Torvalds1da177e2005-04-16 15:20:36 -07002417 hci_dev_lock(hdev);
2418
Marcel Holtmann04837f62006-07-03 10:02:33 +02002419 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergf7520542011-01-20 12:34:39 +02002420 if (!conn)
2421 goto unlock;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02002422
Andre Guedesabf54a52013-11-07 17:36:09 -03002423 if (ev->status) {
2424 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
2425 conn->dst_type, ev->status);
2426 goto unlock;
Johan Hedberg37d9ef72011-11-10 15:54:39 +02002427 }
Johan Hedbergf7520542011-01-20 12:34:39 +02002428
Andre Guedes38462202013-11-07 17:36:10 -03002429 conn->state = BT_CLOSED;
2430
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002431 mgmt_connected = test_and_clear_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags);
2432 mgmt_device_disconnected(hdev, &conn->dst, conn->type, conn->dst_type,
2433 reason, mgmt_connected);
Andre Guedesabf54a52013-11-07 17:36:09 -03002434
Johan Hedberg22f433d2014-08-01 11:13:32 +03002435 if (conn->type == ACL_LINK) {
2436 if (test_bit(HCI_CONN_FLUSH_KEY, &conn->flags))
2437 hci_remove_link_key(hdev, &conn->dst);
2438
Johan Hedberg1d2dc5b2014-12-19 13:40:19 +02002439 hci_update_page_scan(hdev);
Johan Hedberg22f433d2014-08-01 11:13:32 +03002440 }
Johan Hedberg22102462013-10-05 12:01:06 +02002441
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002442 params = hci_conn_params_lookup(hdev, &conn->dst, conn->dst_type);
2443 if (params) {
2444 switch (params->auto_connect) {
2445 case HCI_AUTO_CONN_LINK_LOSS:
2446 if (ev->reason != HCI_ERROR_CONNECTION_TIMEOUT)
2447 break;
2448 /* Fall through */
2449
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02002450 case HCI_AUTO_CONN_DIRECT:
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002451 case HCI_AUTO_CONN_ALWAYS:
Johan Hedberg418025d2014-07-04 12:37:24 +03002452 list_del_init(&params->action);
2453 list_add(&params->action, &hdev->pend_le_conns);
2454 hci_update_background_scan(hdev);
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002455 break;
2456
2457 default:
2458 break;
2459 }
2460 }
2461
Andre Guedes38462202013-11-07 17:36:10 -03002462 type = conn->type;
Johan Hedberg22102462013-10-05 12:01:06 +02002463
Johan Hedberg3a6d5762015-02-18 14:53:58 +02002464 hci_disconn_cfm(conn, ev->reason);
Andre Guedes38462202013-11-07 17:36:10 -03002465 hci_conn_del(conn);
2466
2467 /* Re-enable advertising if necessary, since it might
2468 * have been disabled by the connection. From the
2469 * HCI_LE_Set_Advertise_Enable command description in
2470 * the core specification (v4.0):
2471 * "The Controller shall continue advertising until the Host
2472 * issues an LE_Set_Advertise_Enable command with
2473 * Advertising_Enable set to 0x00 (Advertising is disabled)
2474 * or until a connection is created or until the Advertising
2475 * is timed out due to Directed Advertising."
2476 */
2477 if (type == LE_LINK)
2478 mgmt_reenable_advertising(hdev);
Johan Hedbergf7520542011-01-20 12:34:39 +02002479
2480unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002481 hci_dev_unlock(hdev);
2482}
2483
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002484static void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002485{
2486 struct hci_ev_auth_complete *ev = (void *) skb->data;
2487 struct hci_conn *conn;
2488
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002489 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002490
2491 hci_dev_lock(hdev);
2492
2493 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002494 if (!conn)
2495 goto unlock;
2496
2497 if (!ev->status) {
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002498 if (!hci_conn_ssp_enabled(conn) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03002499 test_bit(HCI_CONN_REAUTH_PEND, &conn->flags)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002500 BT_INFO("re-auth of legacy device is not possible.");
Johan Hedberg2a611692011-02-19 12:06:00 -03002501 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002502 set_bit(HCI_CONN_AUTH, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002503 conn->sec_level = conn->pending_sec_level;
Johan Hedberg2a611692011-02-19 12:06:00 -03002504 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002505 } else {
Johan Hedberge1e930f2014-09-08 17:09:49 -07002506 mgmt_auth_failed(conn, ev->status);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002507 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002508
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002509 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
2510 clear_bit(HCI_CONN_REAUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002511
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002512 if (conn->state == BT_CONFIG) {
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002513 if (!ev->status && hci_conn_ssp_enabled(conn)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002514 struct hci_cp_set_conn_encrypt cp;
2515 cp.handle = ev->handle;
2516 cp.encrypt = 0x01;
2517 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002518 &cp);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002519 } else {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002520 conn->state = BT_CONNECTED;
Johan Hedberg539c4962015-02-18 14:53:57 +02002521 hci_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002522 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002523 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002524 } else {
2525 hci_auth_cfm(conn, ev->status);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002526
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002527 hci_conn_hold(conn);
2528 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02002529 hci_conn_drop(conn);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002530 }
2531
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002532 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002533 if (!ev->status) {
2534 struct hci_cp_set_conn_encrypt cp;
2535 cp.handle = ev->handle;
2536 cp.encrypt = 0x01;
2537 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002538 &cp);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002539 } else {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002540 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002541 hci_encrypt_cfm(conn, ev->status, 0x00);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002542 }
2543 }
2544
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002545unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002546 hci_dev_unlock(hdev);
2547}
2548
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002549static void hci_remote_name_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002550{
Johan Hedberg127178d2010-11-18 22:22:29 +02002551 struct hci_ev_remote_name *ev = (void *) skb->data;
2552 struct hci_conn *conn;
2553
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002554 BT_DBG("%s", hdev->name);
2555
2556 hci_conn_check_pending(hdev);
Johan Hedberg127178d2010-11-18 22:22:29 +02002557
2558 hci_dev_lock(hdev);
2559
2560 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002561
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002562 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedbergb644ba32012-01-17 21:48:47 +02002563 goto check_auth;
2564
2565 if (ev->status == 0)
2566 hci_check_pending_name(hdev, conn, &ev->bdaddr, ev->name,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002567 strnlen(ev->name, HCI_MAX_NAME_LENGTH));
Johan Hedbergb644ba32012-01-17 21:48:47 +02002568 else
2569 hci_check_pending_name(hdev, conn, &ev->bdaddr, NULL, 0);
2570
2571check_auth:
Johan Hedberg79c6c702011-04-28 11:28:55 -07002572 if (!conn)
2573 goto unlock;
2574
2575 if (!hci_outgoing_auth_needed(hdev, conn))
2576 goto unlock;
2577
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002578 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002579 struct hci_cp_auth_requested cp;
Johan Hedberg977f8fc2014-07-17 15:35:39 +03002580
2581 set_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags);
2582
Johan Hedberg127178d2010-11-18 22:22:29 +02002583 cp.handle = __cpu_to_le16(conn->handle);
2584 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED, sizeof(cp), &cp);
2585 }
2586
Johan Hedberg79c6c702011-04-28 11:28:55 -07002587unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02002588 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002589}
2590
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002591static void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002592{
2593 struct hci_ev_encrypt_change *ev = (void *) skb->data;
2594 struct hci_conn *conn;
2595
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002596 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002597
2598 hci_dev_lock(hdev);
2599
2600 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002601 if (!conn)
2602 goto unlock;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002603
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002604 if (!ev->status) {
2605 if (ev->encrypt) {
2606 /* Encryption implies authentication */
Johan Hedberg4dae2792014-06-24 17:03:50 +03002607 set_bit(HCI_CONN_AUTH, &conn->flags);
2608 set_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002609 conn->sec_level = conn->pending_sec_level;
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002610
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002611 /* P-256 authentication key implies FIPS */
2612 if (conn->key_type == HCI_LK_AUTH_COMBINATION_P256)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002613 set_bit(HCI_CONN_FIPS, &conn->flags);
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002614
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002615 if ((conn->type == ACL_LINK && ev->encrypt == 0x02) ||
2616 conn->type == LE_LINK)
2617 set_bit(HCI_CONN_AES_CCM, &conn->flags);
2618 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002619 clear_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002620 clear_bit(HCI_CONN_AES_CCM, &conn->flags);
2621 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002622 }
2623
Johan Hedberg7ed3fa22014-09-10 22:16:35 -07002624 /* We should disregard the current RPA and generate a new one
2625 * whenever the encryption procedure fails.
2626 */
2627 if (ev->status && conn->type == LE_LINK)
Marcel Holtmanna1536da2015-03-13 02:11:01 -07002628 hci_dev_set_flag(hdev, HCI_RPA_EXPIRED);
Johan Hedberg7ed3fa22014-09-10 22:16:35 -07002629
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002630 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
2631
2632 if (ev->status && conn->state == BT_CONNECTED) {
2633 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
2634 hci_conn_drop(conn);
2635 goto unlock;
2636 }
2637
2638 if (conn->state == BT_CONFIG) {
2639 if (!ev->status)
2640 conn->state = BT_CONNECTED;
2641
Marcel Holtmann40b552a2014-03-19 14:10:25 -07002642 /* In Secure Connections Only mode, do not allow any
2643 * connections that are not encrypted with AES-CCM
2644 * using a P-256 authenticated combination key.
2645 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002646 if (hci_dev_test_flag(hdev, HCI_SC_ONLY) &&
Marcel Holtmann40b552a2014-03-19 14:10:25 -07002647 (!test_bit(HCI_CONN_AES_CCM, &conn->flags) ||
2648 conn->key_type != HCI_LK_AUTH_COMBINATION_P256)) {
Johan Hedberg539c4962015-02-18 14:53:57 +02002649 hci_connect_cfm(conn, HCI_ERROR_AUTH_FAILURE);
Marcel Holtmann40b552a2014-03-19 14:10:25 -07002650 hci_conn_drop(conn);
2651 goto unlock;
2652 }
2653
Johan Hedberg539c4962015-02-18 14:53:57 +02002654 hci_connect_cfm(conn, ev->status);
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002655 hci_conn_drop(conn);
2656 } else
2657 hci_encrypt_cfm(conn, ev->status, ev->encrypt);
2658
Gustavo Padovana7d77232012-05-13 03:20:07 -03002659unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002660 hci_dev_unlock(hdev);
2661}
2662
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002663static void hci_change_link_key_complete_evt(struct hci_dev *hdev,
2664 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002665{
2666 struct hci_ev_change_link_key_complete *ev = (void *) skb->data;
2667 struct hci_conn *conn;
2668
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002669 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002670
2671 hci_dev_lock(hdev);
2672
2673 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
2674 if (conn) {
2675 if (!ev->status)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002676 set_bit(HCI_CONN_SECURE, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002677
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002678 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002679
2680 hci_key_change_cfm(conn, ev->status);
2681 }
2682
2683 hci_dev_unlock(hdev);
2684}
2685
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002686static void hci_remote_features_evt(struct hci_dev *hdev,
2687 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002688{
2689 struct hci_ev_remote_features *ev = (void *) skb->data;
2690 struct hci_conn *conn;
2691
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002692 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002693
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002694 hci_dev_lock(hdev);
2695
2696 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02002697 if (!conn)
2698 goto unlock;
Marcel Holtmann769be972008-07-14 20:13:49 +02002699
Johan Hedbergccd556f2010-11-10 17:11:51 +02002700 if (!ev->status)
Johan Hedbergcad718e2013-04-17 15:00:51 +03002701 memcpy(conn->features[0], ev->features, 8);
Johan Hedbergccd556f2010-11-10 17:11:51 +02002702
2703 if (conn->state != BT_CONFIG)
2704 goto unlock;
2705
Szymon Jancac363cf2015-01-29 16:36:59 +01002706 if (!ev->status && lmp_ext_feat_capable(hdev) &&
2707 lmp_ext_feat_capable(conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02002708 struct hci_cp_read_remote_ext_features cp;
2709 cp.handle = ev->handle;
2710 cp.page = 0x01;
2711 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002712 sizeof(cp), &cp);
Johan Hedberg392599b2010-11-18 22:22:28 +02002713 goto unlock;
2714 }
2715
Johan Hedberg671267b2012-05-12 16:11:50 -03002716 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002717 struct hci_cp_remote_name_req cp;
2718 memset(&cp, 0, sizeof(cp));
2719 bacpy(&cp.bdaddr, &conn->dst);
2720 cp.pscan_rep_mode = 0x02;
2721 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002722 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00002723 mgmt_device_connected(hdev, conn, 0, NULL, 0);
Johan Hedberg392599b2010-11-18 22:22:28 +02002724
Johan Hedberg127178d2010-11-18 22:22:29 +02002725 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02002726 conn->state = BT_CONNECTED;
Johan Hedberg539c4962015-02-18 14:53:57 +02002727 hci_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002728 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02002729 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002730
Johan Hedbergccd556f2010-11-10 17:11:51 +02002731unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002732 hci_dev_unlock(hdev);
2733}
2734
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002735static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002736{
2737 struct hci_ev_cmd_complete *ev = (void *) skb->data;
Johan Hedberg9238f362013-03-05 20:37:48 +02002738 u8 status = skb->data[sizeof(*ev)];
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002739 __u16 opcode;
2740
2741 skb_pull(skb, sizeof(*ev));
2742
2743 opcode = __le16_to_cpu(ev->opcode);
2744
2745 switch (opcode) {
2746 case HCI_OP_INQUIRY_CANCEL:
2747 hci_cc_inquiry_cancel(hdev, skb);
2748 break;
2749
Andre Guedes4d934832012-03-21 00:03:35 -03002750 case HCI_OP_PERIODIC_INQ:
2751 hci_cc_periodic_inq(hdev, skb);
2752 break;
2753
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002754 case HCI_OP_EXIT_PERIODIC_INQ:
2755 hci_cc_exit_periodic_inq(hdev, skb);
2756 break;
2757
2758 case HCI_OP_REMOTE_NAME_REQ_CANCEL:
2759 hci_cc_remote_name_req_cancel(hdev, skb);
2760 break;
2761
2762 case HCI_OP_ROLE_DISCOVERY:
2763 hci_cc_role_discovery(hdev, skb);
2764 break;
2765
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002766 case HCI_OP_READ_LINK_POLICY:
2767 hci_cc_read_link_policy(hdev, skb);
2768 break;
2769
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002770 case HCI_OP_WRITE_LINK_POLICY:
2771 hci_cc_write_link_policy(hdev, skb);
2772 break;
2773
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002774 case HCI_OP_READ_DEF_LINK_POLICY:
2775 hci_cc_read_def_link_policy(hdev, skb);
2776 break;
2777
2778 case HCI_OP_WRITE_DEF_LINK_POLICY:
2779 hci_cc_write_def_link_policy(hdev, skb);
2780 break;
2781
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002782 case HCI_OP_RESET:
2783 hci_cc_reset(hdev, skb);
2784 break;
2785
Marcel Holtmannc2f0f972015-01-12 09:21:25 -08002786 case HCI_OP_READ_STORED_LINK_KEY:
2787 hci_cc_read_stored_link_key(hdev, skb);
2788 break;
2789
Marcel Holtmanna93661202015-01-12 09:21:28 -08002790 case HCI_OP_DELETE_STORED_LINK_KEY:
2791 hci_cc_delete_stored_link_key(hdev, skb);
2792 break;
2793
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002794 case HCI_OP_WRITE_LOCAL_NAME:
2795 hci_cc_write_local_name(hdev, skb);
2796 break;
2797
2798 case HCI_OP_READ_LOCAL_NAME:
2799 hci_cc_read_local_name(hdev, skb);
2800 break;
2801
2802 case HCI_OP_WRITE_AUTH_ENABLE:
2803 hci_cc_write_auth_enable(hdev, skb);
2804 break;
2805
2806 case HCI_OP_WRITE_ENCRYPT_MODE:
2807 hci_cc_write_encrypt_mode(hdev, skb);
2808 break;
2809
2810 case HCI_OP_WRITE_SCAN_ENABLE:
2811 hci_cc_write_scan_enable(hdev, skb);
2812 break;
2813
2814 case HCI_OP_READ_CLASS_OF_DEV:
2815 hci_cc_read_class_of_dev(hdev, skb);
2816 break;
2817
2818 case HCI_OP_WRITE_CLASS_OF_DEV:
2819 hci_cc_write_class_of_dev(hdev, skb);
2820 break;
2821
2822 case HCI_OP_READ_VOICE_SETTING:
2823 hci_cc_read_voice_setting(hdev, skb);
2824 break;
2825
2826 case HCI_OP_WRITE_VOICE_SETTING:
2827 hci_cc_write_voice_setting(hdev, skb);
2828 break;
2829
Marcel Holtmannb4cb9fb2013-10-14 13:56:16 -07002830 case HCI_OP_READ_NUM_SUPPORTED_IAC:
2831 hci_cc_read_num_supported_iac(hdev, skb);
2832 break;
2833
Marcel Holtmann333140b2008-07-14 20:13:48 +02002834 case HCI_OP_WRITE_SSP_MODE:
2835 hci_cc_write_ssp_mode(hdev, skb);
2836 break;
2837
Marcel Holtmanneac83dc2014-01-10 02:07:23 -08002838 case HCI_OP_WRITE_SC_SUPPORT:
2839 hci_cc_write_sc_support(hdev, skb);
2840 break;
2841
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002842 case HCI_OP_READ_LOCAL_VERSION:
2843 hci_cc_read_local_version(hdev, skb);
2844 break;
2845
2846 case HCI_OP_READ_LOCAL_COMMANDS:
2847 hci_cc_read_local_commands(hdev, skb);
2848 break;
2849
2850 case HCI_OP_READ_LOCAL_FEATURES:
2851 hci_cc_read_local_features(hdev, skb);
2852 break;
2853
Andre Guedes971e3a42011-06-30 19:20:52 -03002854 case HCI_OP_READ_LOCAL_EXT_FEATURES:
2855 hci_cc_read_local_ext_features(hdev, skb);
2856 break;
2857
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002858 case HCI_OP_READ_BUFFER_SIZE:
2859 hci_cc_read_buffer_size(hdev, skb);
2860 break;
2861
2862 case HCI_OP_READ_BD_ADDR:
2863 hci_cc_read_bd_addr(hdev, skb);
2864 break;
2865
Johan Hedbergf332ec62013-03-15 17:07:11 -05002866 case HCI_OP_READ_PAGE_SCAN_ACTIVITY:
2867 hci_cc_read_page_scan_activity(hdev, skb);
2868 break;
2869
Johan Hedberg4a3ee762013-03-15 17:07:12 -05002870 case HCI_OP_WRITE_PAGE_SCAN_ACTIVITY:
2871 hci_cc_write_page_scan_activity(hdev, skb);
2872 break;
2873
Johan Hedbergf332ec62013-03-15 17:07:11 -05002874 case HCI_OP_READ_PAGE_SCAN_TYPE:
2875 hci_cc_read_page_scan_type(hdev, skb);
2876 break;
2877
Johan Hedberg4a3ee762013-03-15 17:07:12 -05002878 case HCI_OP_WRITE_PAGE_SCAN_TYPE:
2879 hci_cc_write_page_scan_type(hdev, skb);
2880 break;
2881
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +02002882 case HCI_OP_READ_DATA_BLOCK_SIZE:
2883 hci_cc_read_data_block_size(hdev, skb);
2884 break;
2885
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +02002886 case HCI_OP_READ_FLOW_CONTROL_MODE:
2887 hci_cc_read_flow_control_mode(hdev, skb);
2888 break;
2889
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +03002890 case HCI_OP_READ_LOCAL_AMP_INFO:
2891 hci_cc_read_local_amp_info(hdev, skb);
2892 break;
2893
Johan Hedberg33f35722014-06-28 17:54:06 +03002894 case HCI_OP_READ_CLOCK:
2895 hci_cc_read_clock(hdev, skb);
2896 break;
2897
Andrei Emeltchenko903e4542012-09-27 17:26:09 +03002898 case HCI_OP_READ_LOCAL_AMP_ASSOC:
2899 hci_cc_read_local_amp_assoc(hdev, skb);
2900 break;
2901
Johan Hedbergd5859e22011-01-25 01:19:58 +02002902 case HCI_OP_READ_INQ_RSP_TX_POWER:
2903 hci_cc_read_inq_rsp_tx_power(hdev, skb);
2904 break;
2905
Johan Hedberg980e1a52011-01-22 06:10:07 +02002906 case HCI_OP_PIN_CODE_REPLY:
2907 hci_cc_pin_code_reply(hdev, skb);
2908 break;
2909
2910 case HCI_OP_PIN_CODE_NEG_REPLY:
2911 hci_cc_pin_code_neg_reply(hdev, skb);
2912 break;
2913
Szymon Jancc35938b2011-03-22 13:12:21 +01002914 case HCI_OP_READ_LOCAL_OOB_DATA:
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08002915 hci_cc_read_local_oob_data(hdev, skb);
2916 break;
2917
2918 case HCI_OP_READ_LOCAL_OOB_EXT_DATA:
2919 hci_cc_read_local_oob_ext_data(hdev, skb);
Szymon Jancc35938b2011-03-22 13:12:21 +01002920 break;
2921
Ville Tervo6ed58ec2011-02-10 22:38:48 -03002922 case HCI_OP_LE_READ_BUFFER_SIZE:
2923 hci_cc_le_read_buffer_size(hdev, skb);
2924 break;
2925
Johan Hedberg60e77322013-01-22 14:01:59 +02002926 case HCI_OP_LE_READ_LOCAL_FEATURES:
2927 hci_cc_le_read_local_features(hdev, skb);
2928 break;
2929
Johan Hedberg8fa19092012-10-19 20:57:49 +03002930 case HCI_OP_LE_READ_ADV_TX_POWER:
2931 hci_cc_le_read_adv_tx_power(hdev, skb);
2932 break;
2933
Johan Hedberga5c29682011-02-19 12:05:57 -03002934 case HCI_OP_USER_CONFIRM_REPLY:
2935 hci_cc_user_confirm_reply(hdev, skb);
2936 break;
2937
2938 case HCI_OP_USER_CONFIRM_NEG_REPLY:
2939 hci_cc_user_confirm_neg_reply(hdev, skb);
2940 break;
2941
Brian Gix1143d452011-11-23 08:28:34 -08002942 case HCI_OP_USER_PASSKEY_REPLY:
2943 hci_cc_user_passkey_reply(hdev, skb);
2944 break;
2945
2946 case HCI_OP_USER_PASSKEY_NEG_REPLY:
2947 hci_cc_user_passkey_neg_reply(hdev, skb);
Szymon Janc16cde992012-04-13 12:32:42 +02002948 break;
Andre Guedes07f7fa52011-12-02 21:13:31 +09002949
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08002950 case HCI_OP_LE_SET_RANDOM_ADDR:
2951 hci_cc_le_set_random_addr(hdev, skb);
2952 break;
2953
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01002954 case HCI_OP_LE_SET_ADV_ENABLE:
2955 hci_cc_le_set_adv_enable(hdev, skb);
2956 break;
2957
Marcel Holtmann533553f2014-03-21 12:18:10 -07002958 case HCI_OP_LE_SET_SCAN_PARAM:
2959 hci_cc_le_set_scan_param(hdev, skb);
2960 break;
2961
Andre Guedeseb9d91f2011-05-26 16:23:52 -03002962 case HCI_OP_LE_SET_SCAN_ENABLE:
2963 hci_cc_le_set_scan_enable(hdev, skb);
2964 break;
2965
Johan Hedbergcf1d0812013-01-22 14:02:00 +02002966 case HCI_OP_LE_READ_WHITE_LIST_SIZE:
2967 hci_cc_le_read_white_list_size(hdev, skb);
2968 break;
2969
Marcel Holtmann0f36b582014-02-27 20:37:31 -08002970 case HCI_OP_LE_CLEAR_WHITE_LIST:
2971 hci_cc_le_clear_white_list(hdev, skb);
2972 break;
2973
2974 case HCI_OP_LE_ADD_TO_WHITE_LIST:
2975 hci_cc_le_add_to_white_list(hdev, skb);
2976 break;
2977
2978 case HCI_OP_LE_DEL_FROM_WHITE_LIST:
2979 hci_cc_le_del_from_white_list(hdev, skb);
2980 break;
2981
Johan Hedberg9b008c02013-01-22 14:02:01 +02002982 case HCI_OP_LE_READ_SUPPORTED_STATES:
2983 hci_cc_le_read_supported_states(hdev, skb);
2984 break;
2985
Marcel Holtmanna8e1bfa2014-12-20 16:28:40 +01002986 case HCI_OP_LE_READ_DEF_DATA_LEN:
2987 hci_cc_le_read_def_data_len(hdev, skb);
2988 break;
2989
2990 case HCI_OP_LE_WRITE_DEF_DATA_LEN:
2991 hci_cc_le_write_def_data_len(hdev, skb);
2992 break;
2993
2994 case HCI_OP_LE_READ_MAX_DATA_LEN:
2995 hci_cc_le_read_max_data_len(hdev, skb);
2996 break;
2997
Andre Guedesf9b49302011-06-30 19:20:53 -03002998 case HCI_OP_WRITE_LE_HOST_SUPPORTED:
2999 hci_cc_write_le_host_supported(hdev, skb);
3000 break;
3001
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02003002 case HCI_OP_LE_SET_ADV_PARAM:
3003 hci_cc_set_adv_param(hdev, skb);
3004 break;
3005
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03003006 case HCI_OP_WRITE_REMOTE_AMP_ASSOC:
3007 hci_cc_write_remote_amp_assoc(hdev, skb);
3008 break;
3009
Andrzej Kaczmarek5ae76a92014-05-08 15:32:08 +02003010 case HCI_OP_READ_RSSI:
3011 hci_cc_read_rssi(hdev, skb);
3012 break;
3013
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02003014 case HCI_OP_READ_TX_POWER:
3015 hci_cc_read_tx_power(hdev, skb);
3016 break;
3017
Marcel Holtmannc50b33c2015-01-31 15:07:52 -08003018 case HCI_OP_WRITE_SSP_DEBUG_MODE:
3019 hci_cc_write_ssp_debug_mode(hdev, skb);
3020 break;
3021
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003022 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003023 BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003024 break;
3025 }
3026
Johan Hedbergad82cdd2013-03-09 09:53:50 +02003027 if (opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02003028 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02003029
Johan Hedbergad82cdd2013-03-09 09:53:50 +02003030 hci_req_cmd_complete(hdev, opcode, status);
Johan Hedberg9238f362013-03-05 20:37:48 +02003031
Szymon Jancdbccd792012-12-11 08:51:19 +01003032 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags)) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003033 atomic_set(&hdev->cmd_cnt, 1);
3034 if (!skb_queue_empty(&hdev->cmd_q))
Gustavo F. Padovanc347b762011-12-14 23:53:47 -02003035 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003036 }
3037}
3038
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003039static void hci_cmd_status_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003040{
3041 struct hci_ev_cmd_status *ev = (void *) skb->data;
3042 __u16 opcode;
3043
3044 skb_pull(skb, sizeof(*ev));
3045
3046 opcode = __le16_to_cpu(ev->opcode);
3047
3048 switch (opcode) {
3049 case HCI_OP_INQUIRY:
3050 hci_cs_inquiry(hdev, ev->status);
3051 break;
3052
3053 case HCI_OP_CREATE_CONN:
3054 hci_cs_create_conn(hdev, ev->status);
3055 break;
3056
Kuba Pawlak9645c762014-11-06 19:36:53 +01003057 case HCI_OP_DISCONNECT:
3058 hci_cs_disconnect(hdev, ev->status);
3059 break;
3060
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003061 case HCI_OP_ADD_SCO:
3062 hci_cs_add_sco(hdev, ev->status);
3063 break;
3064
Marcel Holtmannf8558552008-07-14 20:13:49 +02003065 case HCI_OP_AUTH_REQUESTED:
3066 hci_cs_auth_requested(hdev, ev->status);
3067 break;
3068
3069 case HCI_OP_SET_CONN_ENCRYPT:
3070 hci_cs_set_conn_encrypt(hdev, ev->status);
3071 break;
3072
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003073 case HCI_OP_REMOTE_NAME_REQ:
3074 hci_cs_remote_name_req(hdev, ev->status);
3075 break;
3076
Marcel Holtmann769be972008-07-14 20:13:49 +02003077 case HCI_OP_READ_REMOTE_FEATURES:
3078 hci_cs_read_remote_features(hdev, ev->status);
3079 break;
3080
3081 case HCI_OP_READ_REMOTE_EXT_FEATURES:
3082 hci_cs_read_remote_ext_features(hdev, ev->status);
3083 break;
3084
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003085 case HCI_OP_SETUP_SYNC_CONN:
3086 hci_cs_setup_sync_conn(hdev, ev->status);
3087 break;
3088
Kuba Pawlak9645c762014-11-06 19:36:53 +01003089 case HCI_OP_CREATE_PHY_LINK:
3090 hci_cs_create_phylink(hdev, ev->status);
3091 break;
3092
3093 case HCI_OP_ACCEPT_PHY_LINK:
3094 hci_cs_accept_phylink(hdev, ev->status);
3095 break;
3096
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003097 case HCI_OP_SNIFF_MODE:
3098 hci_cs_sniff_mode(hdev, ev->status);
3099 break;
3100
3101 case HCI_OP_EXIT_SNIFF_MODE:
3102 hci_cs_exit_sniff_mode(hdev, ev->status);
3103 break;
3104
Kuba Pawlak50fc85f2014-11-06 19:36:52 +01003105 case HCI_OP_SWITCH_ROLE:
3106 hci_cs_switch_role(hdev, ev->status);
3107 break;
3108
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02003109 case HCI_OP_LE_CREATE_CONN:
3110 hci_cs_le_create_conn(hdev, ev->status);
3111 break;
3112
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02003113 case HCI_OP_LE_START_ENC:
3114 hci_cs_le_start_enc(hdev, ev->status);
3115 break;
3116
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003117 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003118 BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003119 break;
3120 }
3121
Johan Hedbergad82cdd2013-03-09 09:53:50 +02003122 if (opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02003123 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02003124
Johan Hedberg02350a72013-04-03 21:50:29 +03003125 if (ev->status ||
Eyal Birger49a6fe02015-03-01 14:58:25 +02003126 (hdev->sent_cmd && !bt_cb(hdev->sent_cmd)->req_event))
Johan Hedberg02350a72013-04-03 21:50:29 +03003127 hci_req_cmd_complete(hdev, opcode, ev->status);
Johan Hedberg9238f362013-03-05 20:37:48 +02003128
Gustavo F. Padovan10572132011-03-16 15:36:29 -03003129 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags)) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003130 atomic_set(&hdev->cmd_cnt, 1);
3131 if (!skb_queue_empty(&hdev->cmd_q))
Gustavo F. Padovanc347b762011-12-14 23:53:47 -02003132 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003133 }
3134}
3135
Marcel Holtmann24dfa342014-11-02 02:56:41 +01003136static void hci_hardware_error_evt(struct hci_dev *hdev, struct sk_buff *skb)
3137{
3138 struct hci_ev_hardware_error *ev = (void *) skb->data;
3139
Marcel Holtmannc7741d12015-01-28 11:09:55 -08003140 hdev->hw_error_code = ev->code;
3141
3142 queue_work(hdev->req_workqueue, &hdev->error_reset);
Marcel Holtmann24dfa342014-11-02 02:56:41 +01003143}
3144
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003145static void hci_role_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003146{
3147 struct hci_ev_role_change *ev = (void *) skb->data;
3148 struct hci_conn *conn;
3149
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003150 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003151
3152 hci_dev_lock(hdev);
3153
3154 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3155 if (conn) {
Johan Hedberg40bef302014-07-16 11:42:27 +03003156 if (!ev->status)
3157 conn->role = ev->role;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003158
Johan Hedberg51a8efd2012-01-16 06:10:31 +02003159 clear_bit(HCI_CONN_RSWITCH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003160
3161 hci_role_switch_cfm(conn, ev->status, ev->role);
3162 }
3163
3164 hci_dev_unlock(hdev);
3165}
3166
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003167static void hci_num_comp_pkts_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003168{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003169 struct hci_ev_num_comp_pkts *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003170 int i;
3171
Andrei Emeltchenko32ac5b92011-12-19 16:31:29 +02003172 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_PACKET_BASED) {
3173 BT_ERR("Wrong event for mode %d", hdev->flow_ctl_mode);
3174 return;
3175 }
3176
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02003177 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03003178 ev->num_hndl * sizeof(struct hci_comp_pkts_info)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003179 BT_DBG("%s bad parameters", hdev->name);
3180 return;
3181 }
3182
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02003183 BT_DBG("%s num_hndl %d", hdev->name, ev->num_hndl);
3184
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02003185 for (i = 0; i < ev->num_hndl; i++) {
3186 struct hci_comp_pkts_info *info = &ev->handles[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07003187 struct hci_conn *conn;
3188 __u16 handle, count;
3189
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02003190 handle = __le16_to_cpu(info->handle);
3191 count = __le16_to_cpu(info->count);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003192
3193 conn = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003194 if (!conn)
3195 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003196
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003197 conn->sent -= count;
3198
3199 switch (conn->type) {
3200 case ACL_LINK:
3201 hdev->acl_cnt += count;
3202 if (hdev->acl_cnt > hdev->acl_pkts)
3203 hdev->acl_cnt = hdev->acl_pkts;
3204 break;
3205
3206 case LE_LINK:
3207 if (hdev->le_pkts) {
3208 hdev->le_cnt += count;
3209 if (hdev->le_cnt > hdev->le_pkts)
3210 hdev->le_cnt = hdev->le_pkts;
3211 } else {
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02003212 hdev->acl_cnt += count;
3213 if (hdev->acl_cnt > hdev->acl_pkts)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003214 hdev->acl_cnt = hdev->acl_pkts;
3215 }
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003216 break;
3217
3218 case SCO_LINK:
3219 hdev->sco_cnt += count;
3220 if (hdev->sco_cnt > hdev->sco_pkts)
3221 hdev->sco_cnt = hdev->sco_pkts;
3222 break;
3223
3224 default:
3225 BT_ERR("Unknown type %d conn %p", conn->type, conn);
3226 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003227 }
3228 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003229
Gustavo F. Padovan3eff45e2011-12-15 00:50:02 -02003230 queue_work(hdev->workqueue, &hdev->tx_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003231}
3232
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003233static struct hci_conn *__hci_conn_lookup_handle(struct hci_dev *hdev,
3234 __u16 handle)
3235{
3236 struct hci_chan *chan;
3237
3238 switch (hdev->dev_type) {
3239 case HCI_BREDR:
3240 return hci_conn_hash_lookup_handle(hdev, handle);
3241 case HCI_AMP:
3242 chan = hci_chan_lookup_handle(hdev, handle);
3243 if (chan)
3244 return chan->conn;
3245 break;
3246 default:
3247 BT_ERR("%s unknown dev_type %d", hdev->name, hdev->dev_type);
3248 break;
3249 }
3250
3251 return NULL;
3252}
3253
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003254static void hci_num_comp_blocks_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003255{
3256 struct hci_ev_num_comp_blocks *ev = (void *) skb->data;
3257 int i;
3258
3259 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_BLOCK_BASED) {
3260 BT_ERR("Wrong event for mode %d", hdev->flow_ctl_mode);
3261 return;
3262 }
3263
3264 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03003265 ev->num_hndl * sizeof(struct hci_comp_blocks_info)) {
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003266 BT_DBG("%s bad parameters", hdev->name);
3267 return;
3268 }
3269
3270 BT_DBG("%s num_blocks %d num_hndl %d", hdev->name, ev->num_blocks,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003271 ev->num_hndl);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003272
3273 for (i = 0; i < ev->num_hndl; i++) {
3274 struct hci_comp_blocks_info *info = &ev->handles[i];
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003275 struct hci_conn *conn = NULL;
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003276 __u16 handle, block_count;
3277
3278 handle = __le16_to_cpu(info->handle);
3279 block_count = __le16_to_cpu(info->blocks);
3280
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003281 conn = __hci_conn_lookup_handle(hdev, handle);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003282 if (!conn)
3283 continue;
3284
3285 conn->sent -= block_count;
3286
3287 switch (conn->type) {
3288 case ACL_LINK:
Andrei Emeltchenkobd1eb662012-10-10 17:38:30 +03003289 case AMP_LINK:
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003290 hdev->block_cnt += block_count;
3291 if (hdev->block_cnt > hdev->num_blocks)
3292 hdev->block_cnt = hdev->num_blocks;
3293 break;
3294
3295 default:
3296 BT_ERR("Unknown type %d conn %p", conn->type, conn);
3297 break;
3298 }
3299 }
3300
3301 queue_work(hdev->workqueue, &hdev->tx_work);
3302}
3303
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003304static void hci_mode_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003305{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003306 struct hci_ev_mode_change *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003307 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003308
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003309 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003310
3311 hci_dev_lock(hdev);
3312
Marcel Holtmann04837f62006-07-03 10:02:33 +02003313 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3314 if (conn) {
3315 conn->mode = ev->mode;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003316
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003317 if (!test_and_clear_bit(HCI_CONN_MODE_CHANGE_PEND,
3318 &conn->flags)) {
Marcel Holtmann04837f62006-07-03 10:02:33 +02003319 if (conn->mode == HCI_CM_ACTIVE)
Johan Hedberg58a681e2012-01-16 06:47:28 +02003320 set_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003321 else
Johan Hedberg58a681e2012-01-16 06:47:28 +02003322 clear_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003323 }
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003324
Johan Hedberg51a8efd2012-01-16 06:10:31 +02003325 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003326 hci_sco_setup(conn, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003327 }
3328
3329 hci_dev_unlock(hdev);
3330}
3331
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003332static void hci_pin_code_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003333{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003334 struct hci_ev_pin_code_req *ev = (void *) skb->data;
3335 struct hci_conn *conn;
3336
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003337 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003338
3339 hci_dev_lock(hdev);
3340
3341 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003342 if (!conn)
3343 goto unlock;
3344
3345 if (conn->state == BT_CONNECTED) {
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003346 hci_conn_hold(conn);
3347 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003348 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003349 }
3350
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003351 if (!hci_dev_test_flag(hdev, HCI_BONDABLE) &&
Johan Hedberg2f407f02014-07-17 15:35:40 +03003352 !test_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags)) {
Johan Hedberg03b555e2011-01-04 15:40:05 +02003353 hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003354 sizeof(ev->bdaddr), &ev->bdaddr);
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003355 } else if (hci_dev_test_flag(hdev, HCI_MGMT)) {
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003356 u8 secure;
3357
3358 if (conn->pending_sec_level == BT_SECURITY_HIGH)
3359 secure = 1;
3360 else
3361 secure = 0;
3362
Johan Hedberg744cf192011-11-08 20:40:14 +02003363 mgmt_pin_code_request(hdev, &ev->bdaddr, secure);
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003364 }
Johan Hedberg980e1a52011-01-22 06:10:07 +02003365
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003366unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003367 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003368}
3369
Johan Hedbergcb6f3f72014-11-19 14:53:04 +02003370static void conn_set_key(struct hci_conn *conn, u8 key_type, u8 pin_len)
3371{
3372 if (key_type == HCI_LK_CHANGED_COMBINATION)
3373 return;
3374
3375 conn->pin_length = pin_len;
3376 conn->key_type = key_type;
3377
3378 switch (key_type) {
3379 case HCI_LK_LOCAL_UNIT:
3380 case HCI_LK_REMOTE_UNIT:
3381 case HCI_LK_DEBUG_COMBINATION:
3382 return;
3383 case HCI_LK_COMBINATION:
3384 if (pin_len == 16)
3385 conn->pending_sec_level = BT_SECURITY_HIGH;
3386 else
3387 conn->pending_sec_level = BT_SECURITY_MEDIUM;
3388 break;
3389 case HCI_LK_UNAUTH_COMBINATION_P192:
3390 case HCI_LK_UNAUTH_COMBINATION_P256:
3391 conn->pending_sec_level = BT_SECURITY_MEDIUM;
3392 break;
3393 case HCI_LK_AUTH_COMBINATION_P192:
3394 conn->pending_sec_level = BT_SECURITY_HIGH;
3395 break;
3396 case HCI_LK_AUTH_COMBINATION_P256:
3397 conn->pending_sec_level = BT_SECURITY_FIPS;
3398 break;
3399 }
3400}
3401
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003402static void hci_link_key_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003403{
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003404 struct hci_ev_link_key_req *ev = (void *) skb->data;
3405 struct hci_cp_link_key_reply cp;
3406 struct hci_conn *conn;
3407 struct link_key *key;
3408
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003409 BT_DBG("%s", hdev->name);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003410
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003411 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003412 return;
3413
3414 hci_dev_lock(hdev);
3415
3416 key = hci_find_link_key(hdev, &ev->bdaddr);
3417 if (!key) {
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003418 BT_DBG("%s link key not found for %pMR", hdev->name,
3419 &ev->bdaddr);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003420 goto not_found;
3421 }
3422
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003423 BT_DBG("%s found key type %u for %pMR", hdev->name, key->type,
3424 &ev->bdaddr);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003425
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003426 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003427 if (conn) {
Johan Hedbergfe8bc5a2014-08-14 12:33:17 +03003428 clear_bit(HCI_CONN_NEW_LINK_KEY, &conn->flags);
3429
Marcel Holtmann66138ce2014-01-10 02:07:20 -08003430 if ((key->type == HCI_LK_UNAUTH_COMBINATION_P192 ||
3431 key->type == HCI_LK_UNAUTH_COMBINATION_P256) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03003432 conn->auth_type != 0xff && (conn->auth_type & 0x01)) {
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003433 BT_DBG("%s ignoring unauthenticated key", hdev->name);
3434 goto not_found;
3435 }
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003436
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003437 if (key->type == HCI_LK_COMBINATION && key->pin_len < 16 &&
Johan Hedbergf3fb0b52014-06-02 10:12:44 +03003438 (conn->pending_sec_level == BT_SECURITY_HIGH ||
3439 conn->pending_sec_level == BT_SECURITY_FIPS)) {
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003440 BT_DBG("%s ignoring key unauthenticated for high security",
3441 hdev->name);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003442 goto not_found;
3443 }
3444
Johan Hedbergcb6f3f72014-11-19 14:53:04 +02003445 conn_set_key(conn, key->type, key->pin_len);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003446 }
3447
3448 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9b3b4462012-05-23 11:31:20 +03003449 memcpy(cp.link_key, key->val, HCI_LINK_KEY_SIZE);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003450
3451 hci_send_cmd(hdev, HCI_OP_LINK_KEY_REPLY, sizeof(cp), &cp);
3452
3453 hci_dev_unlock(hdev);
3454
3455 return;
3456
3457not_found:
3458 hci_send_cmd(hdev, HCI_OP_LINK_KEY_NEG_REPLY, 6, &ev->bdaddr);
3459 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003460}
3461
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003462static void hci_link_key_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003463{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003464 struct hci_ev_link_key_notify *ev = (void *) skb->data;
3465 struct hci_conn *conn;
Johan Hedberg7652ff62014-06-24 13:15:49 +03003466 struct link_key *key;
3467 bool persistent;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003468 u8 pin_len = 0;
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003469
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003470 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003471
3472 hci_dev_lock(hdev);
3473
3474 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg82c13d42014-12-03 11:03:06 +02003475 if (!conn)
3476 goto unlock;
3477
3478 hci_conn_hold(conn);
3479 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
3480 hci_conn_drop(conn);
3481
Johan Hedbergfe8bc5a2014-08-14 12:33:17 +03003482 set_bit(HCI_CONN_NEW_LINK_KEY, &conn->flags);
Johan Hedberg82c13d42014-12-03 11:03:06 +02003483 conn_set_key(conn, ev->key_type, conn->pin_length);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003484
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003485 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg7652ff62014-06-24 13:15:49 +03003486 goto unlock;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003487
Johan Hedberg7652ff62014-06-24 13:15:49 +03003488 key = hci_add_link_key(hdev, conn, &ev->bdaddr, ev->link_key,
3489 ev->key_type, pin_len, &persistent);
3490 if (!key)
3491 goto unlock;
3492
Johan Hedbergcb6f3f72014-11-19 14:53:04 +02003493 /* Update connection information since adding the key will have
3494 * fixed up the type in the case of changed combination keys.
3495 */
3496 if (ev->key_type == HCI_LK_CHANGED_COMBINATION)
3497 conn_set_key(conn, key->type, key->pin_len);
3498
Johan Hedberg7652ff62014-06-24 13:15:49 +03003499 mgmt_new_link_key(hdev, key, persistent);
3500
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003501 /* Keep debug keys around only if the HCI_KEEP_DEBUG_KEYS flag
3502 * is set. If it's not set simply remove the key from the kernel
3503 * list (we've still notified user space about it but with
3504 * store_hint being 0).
3505 */
3506 if (key->type == HCI_LK_DEBUG_COMBINATION &&
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003507 !hci_dev_test_flag(hdev, HCI_KEEP_DEBUG_KEYS)) {
Johan Hedberg0378b592014-11-19 15:22:22 +02003508 list_del_rcu(&key->list);
3509 kfree_rcu(key, rcu);
Johan Hedberg82c13d42014-12-03 11:03:06 +02003510 goto unlock;
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003511 }
Johan Hedberg7652ff62014-06-24 13:15:49 +03003512
Johan Hedberg82c13d42014-12-03 11:03:06 +02003513 if (persistent)
3514 clear_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
3515 else
3516 set_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
3517
Johan Hedberg7652ff62014-06-24 13:15:49 +03003518unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003519 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003520}
3521
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003522static void hci_clock_offset_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04837f62006-07-03 10:02:33 +02003523{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003524 struct hci_ev_clock_offset *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003525 struct hci_conn *conn;
3526
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003527 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003528
3529 hci_dev_lock(hdev);
3530
3531 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003532 if (conn && !ev->status) {
3533 struct inquiry_entry *ie;
3534
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003535 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3536 if (ie) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003537 ie->data.clock_offset = ev->clock_offset;
3538 ie->timestamp = jiffies;
3539 }
3540 }
3541
3542 hci_dev_unlock(hdev);
3543}
3544
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003545static void hci_pkt_type_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna8746412008-07-14 20:13:46 +02003546{
3547 struct hci_ev_pkt_type_change *ev = (void *) skb->data;
3548 struct hci_conn *conn;
3549
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003550 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna8746412008-07-14 20:13:46 +02003551
3552 hci_dev_lock(hdev);
3553
3554 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3555 if (conn && !ev->status)
3556 conn->pkt_type = __le16_to_cpu(ev->pkt_type);
3557
3558 hci_dev_unlock(hdev);
3559}
3560
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003561static void hci_pscan_rep_mode_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003562{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003563 struct hci_ev_pscan_rep_mode *ev = (void *) skb->data;
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003564 struct inquiry_entry *ie;
3565
3566 BT_DBG("%s", hdev->name);
3567
3568 hci_dev_lock(hdev);
3569
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003570 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
3571 if (ie) {
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003572 ie->data.pscan_rep_mode = ev->pscan_rep_mode;
3573 ie->timestamp = jiffies;
3574 }
3575
3576 hci_dev_unlock(hdev);
3577}
3578
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003579static void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev,
3580 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003581{
3582 struct inquiry_data data;
3583 int num_rsp = *((__u8 *) skb->data);
3584
3585 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
3586
3587 if (!num_rsp)
3588 return;
3589
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003590 if (hci_dev_test_flag(hdev, HCI_PERIODIC_INQ))
Andre Guedes1519cc12012-03-21 00:03:38 -03003591 return;
3592
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003593 hci_dev_lock(hdev);
3594
3595 if ((skb->len - 1) / num_rsp != sizeof(struct inquiry_info_with_rssi)) {
Szymon Janc138d22e2011-02-17 16:44:23 +01003596 struct inquiry_info_with_rssi_and_pscan_mode *info;
3597 info = (void *) (skb->data + 1);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003598
Johan Hedberge17acd42011-03-30 23:57:16 +03003599 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003600 u32 flags;
3601
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003602 bacpy(&data.bdaddr, &info->bdaddr);
3603 data.pscan_rep_mode = info->pscan_rep_mode;
3604 data.pscan_period_mode = info->pscan_period_mode;
3605 data.pscan_mode = info->pscan_mode;
3606 memcpy(data.dev_class, info->dev_class, 3);
3607 data.clock_offset = info->clock_offset;
3608 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003609 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02003610
Marcel Holtmannaf589252014-07-01 14:11:20 +02003611 flags = hci_inquiry_cache_update(hdev, &data, false);
3612
Johan Hedberg48264f02011-11-09 13:58:58 +02003613 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003614 info->dev_class, info->rssi,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003615 flags, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003616 }
3617 } else {
3618 struct inquiry_info_with_rssi *info = (void *) (skb->data + 1);
3619
Johan Hedberge17acd42011-03-30 23:57:16 +03003620 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003621 u32 flags;
3622
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003623 bacpy(&data.bdaddr, &info->bdaddr);
3624 data.pscan_rep_mode = info->pscan_rep_mode;
3625 data.pscan_period_mode = info->pscan_period_mode;
3626 data.pscan_mode = 0x00;
3627 memcpy(data.dev_class, info->dev_class, 3);
3628 data.clock_offset = info->clock_offset;
3629 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003630 data.ssp_mode = 0x00;
Marcel Holtmannaf589252014-07-01 14:11:20 +02003631
3632 flags = hci_inquiry_cache_update(hdev, &data, false);
3633
Johan Hedberg48264f02011-11-09 13:58:58 +02003634 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003635 info->dev_class, info->rssi,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003636 flags, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003637 }
3638 }
3639
3640 hci_dev_unlock(hdev);
3641}
3642
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003643static void hci_remote_ext_features_evt(struct hci_dev *hdev,
3644 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003645{
Marcel Holtmann41a96212008-07-14 20:13:48 +02003646 struct hci_ev_remote_ext_features *ev = (void *) skb->data;
3647 struct hci_conn *conn;
3648
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003649 BT_DBG("%s", hdev->name);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003650
Marcel Holtmann41a96212008-07-14 20:13:48 +02003651 hci_dev_lock(hdev);
3652
3653 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02003654 if (!conn)
3655 goto unlock;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003656
Johan Hedbergcad718e2013-04-17 15:00:51 +03003657 if (ev->page < HCI_MAX_PAGES)
3658 memcpy(conn->features[ev->page], ev->features, 8);
3659
Johan Hedbergccd556f2010-11-10 17:11:51 +02003660 if (!ev->status && ev->page == 0x01) {
3661 struct inquiry_entry *ie;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003662
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003663 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3664 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02003665 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann769be972008-07-14 20:13:49 +02003666
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303667 if (ev->features[0] & LMP_HOST_SSP) {
Johan Hedberg58a681e2012-01-16 06:47:28 +02003668 set_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303669 } else {
3670 /* It is mandatory by the Bluetooth specification that
3671 * Extended Inquiry Results are only used when Secure
3672 * Simple Pairing is enabled, but some devices violate
3673 * this.
3674 *
3675 * To make these devices work, the internal SSP
3676 * enabled flag needs to be cleared if the remote host
3677 * features do not indicate SSP support */
3678 clear_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
3679 }
Marcel Holtmanneb9a8f32014-01-15 22:37:38 -08003680
3681 if (ev->features[0] & LMP_HOST_SC)
3682 set_bit(HCI_CONN_SC_ENABLED, &conn->flags);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003683 }
3684
Johan Hedbergccd556f2010-11-10 17:11:51 +02003685 if (conn->state != BT_CONFIG)
3686 goto unlock;
3687
Johan Hedberg671267b2012-05-12 16:11:50 -03003688 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02003689 struct hci_cp_remote_name_req cp;
3690 memset(&cp, 0, sizeof(cp));
3691 bacpy(&cp.bdaddr, &conn->dst);
3692 cp.pscan_rep_mode = 0x02;
3693 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02003694 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00003695 mgmt_device_connected(hdev, conn, 0, NULL, 0);
Johan Hedberg392599b2010-11-18 22:22:28 +02003696
Johan Hedberg127178d2010-11-18 22:22:29 +02003697 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02003698 conn->state = BT_CONNECTED;
Johan Hedberg539c4962015-02-18 14:53:57 +02003699 hci_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02003700 hci_conn_drop(conn);
Johan Hedbergccd556f2010-11-10 17:11:51 +02003701 }
3702
3703unlock:
Marcel Holtmann41a96212008-07-14 20:13:48 +02003704 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003705}
3706
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003707static void hci_sync_conn_complete_evt(struct hci_dev *hdev,
3708 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003709{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003710 struct hci_ev_sync_conn_complete *ev = (void *) skb->data;
3711 struct hci_conn *conn;
3712
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003713 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003714
3715 hci_dev_lock(hdev);
3716
3717 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann9dc0a3a2008-07-14 20:13:46 +02003718 if (!conn) {
3719 if (ev->link_type == ESCO_LINK)
3720 goto unlock;
3721
3722 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
3723 if (!conn)
3724 goto unlock;
3725
3726 conn->type = SCO_LINK;
3727 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003728
Marcel Holtmann732547f2009-04-19 19:14:14 +02003729 switch (ev->status) {
3730 case 0x00:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003731 conn->handle = __le16_to_cpu(ev->handle);
3732 conn->state = BT_CONNECTED;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02003733
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01003734 hci_debugfs_create_conn(conn);
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02003735 hci_conn_add_sysfs(conn);
Marcel Holtmann732547f2009-04-19 19:14:14 +02003736 break;
3737
Nick Pelly81218d22014-06-30 11:25:01 +05303738 case 0x10: /* Connection Accept Timeout */
Frédéric Dalleau1a4c9582013-08-19 14:24:02 +02003739 case 0x0d: /* Connection Rejected due to Limited Resources */
Stephen Coe705e5712010-02-16 11:29:44 -05003740 case 0x11: /* Unsupported Feature or Parameter Value */
Marcel Holtmann732547f2009-04-19 19:14:14 +02003741 case 0x1c: /* SCO interval rejected */
Nick Pelly1038a002010-02-03 11:42:26 -08003742 case 0x1a: /* Unsupported Remote Feature */
Marcel Holtmann732547f2009-04-19 19:14:14 +02003743 case 0x1f: /* Unspecified error */
Andrew Earl27539bc2014-03-10 10:31:04 +00003744 case 0x20: /* Unsupported LMP Parameter value */
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02003745 if (conn->out) {
Marcel Holtmann732547f2009-04-19 19:14:14 +02003746 conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) |
3747 (hdev->esco_type & EDR_ESCO_MASK);
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02003748 if (hci_setup_sync(conn, conn->link->handle))
3749 goto unlock;
Marcel Holtmann732547f2009-04-19 19:14:14 +02003750 }
3751 /* fall through */
3752
3753 default:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003754 conn->state = BT_CLOSED;
Marcel Holtmann732547f2009-04-19 19:14:14 +02003755 break;
3756 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003757
Johan Hedberg539c4962015-02-18 14:53:57 +02003758 hci_connect_cfm(conn, ev->status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003759 if (ev->status)
3760 hci_conn_del(conn);
3761
3762unlock:
3763 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003764}
3765
Marcel Holtmannefdcf8e2013-10-15 10:31:12 -07003766static inline size_t eir_get_length(u8 *eir, size_t eir_len)
3767{
3768 size_t parsed = 0;
3769
3770 while (parsed < eir_len) {
3771 u8 field_len = eir[0];
3772
3773 if (field_len == 0)
3774 return parsed;
3775
3776 parsed += field_len + 1;
3777 eir += field_len + 1;
3778 }
3779
3780 return eir_len;
3781}
3782
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003783static void hci_extended_inquiry_result_evt(struct hci_dev *hdev,
3784 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003785{
3786 struct inquiry_data data;
3787 struct extended_inquiry_info *info = (void *) (skb->data + 1);
3788 int num_rsp = *((__u8 *) skb->data);
Vishal Agarwal9d939d92012-04-26 19:19:56 +05303789 size_t eir_len;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003790
3791 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
3792
3793 if (!num_rsp)
3794 return;
3795
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003796 if (hci_dev_test_flag(hdev, HCI_PERIODIC_INQ))
Andre Guedes1519cc12012-03-21 00:03:38 -03003797 return;
3798
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003799 hci_dev_lock(hdev);
3800
Johan Hedberge17acd42011-03-30 23:57:16 +03003801 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003802 u32 flags;
3803 bool name_known;
Johan Hedberg561aafb2012-01-04 13:31:59 +02003804
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003805 bacpy(&data.bdaddr, &info->bdaddr);
Szymon Janc138d22e2011-02-17 16:44:23 +01003806 data.pscan_rep_mode = info->pscan_rep_mode;
3807 data.pscan_period_mode = info->pscan_period_mode;
3808 data.pscan_mode = 0x00;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003809 memcpy(data.dev_class, info->dev_class, 3);
Szymon Janc138d22e2011-02-17 16:44:23 +01003810 data.clock_offset = info->clock_offset;
3811 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003812 data.ssp_mode = 0x01;
Johan Hedberg561aafb2012-01-04 13:31:59 +02003813
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003814 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg4ddb1932012-01-15 20:04:43 +02003815 name_known = eir_has_data_type(info->data,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003816 sizeof(info->data),
3817 EIR_NAME_COMPLETE);
Johan Hedberg561aafb2012-01-04 13:31:59 +02003818 else
3819 name_known = true;
3820
Marcel Holtmannaf589252014-07-01 14:11:20 +02003821 flags = hci_inquiry_cache_update(hdev, &data, name_known);
3822
Vishal Agarwal9d939d92012-04-26 19:19:56 +05303823 eir_len = eir_get_length(info->data, sizeof(info->data));
Marcel Holtmannaf589252014-07-01 14:11:20 +02003824
Johan Hedberg48264f02011-11-09 13:58:58 +02003825 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003826 info->dev_class, info->rssi,
3827 flags, info->data, eir_len, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003828 }
3829
3830 hci_dev_unlock(hdev);
3831}
3832
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003833static void hci_key_refresh_complete_evt(struct hci_dev *hdev,
3834 struct sk_buff *skb)
3835{
3836 struct hci_ev_key_refresh_complete *ev = (void *) skb->data;
3837 struct hci_conn *conn;
3838
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003839 BT_DBG("%s status 0x%2.2x handle 0x%4.4x", hdev->name, ev->status,
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003840 __le16_to_cpu(ev->handle));
3841
3842 hci_dev_lock(hdev);
3843
3844 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3845 if (!conn)
3846 goto unlock;
3847
Johan Hedberg9eb1fbf2014-04-11 12:02:31 -07003848 /* For BR/EDR the necessary steps are taken through the
3849 * auth_complete event.
3850 */
3851 if (conn->type != LE_LINK)
3852 goto unlock;
3853
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003854 if (!ev->status)
3855 conn->sec_level = conn->pending_sec_level;
3856
3857 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
3858
3859 if (ev->status && conn->state == BT_CONNECTED) {
Andre Guedesbed71742013-01-30 11:50:56 -03003860 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
David Herrmann76a68ba2013-04-06 20:28:37 +02003861 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003862 goto unlock;
3863 }
3864
3865 if (conn->state == BT_CONFIG) {
3866 if (!ev->status)
3867 conn->state = BT_CONNECTED;
3868
Johan Hedberg539c4962015-02-18 14:53:57 +02003869 hci_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02003870 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003871 } else {
3872 hci_auth_cfm(conn, ev->status);
3873
3874 hci_conn_hold(conn);
3875 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003876 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003877 }
3878
3879unlock:
3880 hci_dev_unlock(hdev);
3881}
3882
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003883static u8 hci_get_auth_req(struct hci_conn *conn)
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003884{
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003885 /* If remote requests no-bonding follow that lead */
Mikel Astizacabae92013-06-28 10:56:28 +02003886 if (conn->remote_auth == HCI_AT_NO_BONDING ||
3887 conn->remote_auth == HCI_AT_NO_BONDING_MITM)
Waldemar Rymarkiewicz58797bf2011-04-28 12:07:58 +02003888 return conn->remote_auth | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003889
Mikel Astizb7f94c82014-04-08 14:21:31 +02003890 /* If both remote and local have enough IO capabilities, require
3891 * MITM protection
3892 */
3893 if (conn->remote_cap != HCI_IO_NO_INPUT_OUTPUT &&
3894 conn->io_capability != HCI_IO_NO_INPUT_OUTPUT)
3895 return conn->remote_auth | 0x01;
3896
Timo Mueller7e741702014-04-08 14:21:33 +02003897 /* No MITM protection possible so ignore remote requirement */
3898 return (conn->remote_auth & ~0x01) | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003899}
3900
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08003901static u8 bredr_oob_data_present(struct hci_conn *conn)
3902{
3903 struct hci_dev *hdev = conn->hdev;
3904 struct oob_data *data;
3905
3906 data = hci_find_remote_oob_data(hdev, &conn->dst, BDADDR_BREDR);
3907 if (!data)
3908 return 0x00;
3909
Marcel Holtmann455c2ff2015-03-15 16:42:53 -07003910 if (bredr_sc_enabled(hdev)) {
3911 /* When Secure Connections is enabled, then just
3912 * return the present value stored with the OOB
3913 * data. The stored value contains the right present
3914 * information. However it can only be trusted when
3915 * not in Secure Connection Only mode.
Marcel Holtmann659c7fb2015-01-30 23:20:56 -08003916 */
Marcel Holtmann455c2ff2015-03-15 16:42:53 -07003917 if (!hci_dev_test_flag(hdev, HCI_SC_ONLY))
3918 return data->present;
3919
3920 /* When Secure Connections Only mode is enabled, then
3921 * the P-256 values are required. If they are not
3922 * available, then do not declare that OOB data is
3923 * present.
3924 */
3925 if (!memcmp(data->rand256, ZERO_KEY, 16) ||
3926 !memcmp(data->hash256, ZERO_KEY, 16))
Marcel Holtmann659c7fb2015-01-30 23:20:56 -08003927 return 0x00;
3928
Marcel Holtmann455c2ff2015-03-15 16:42:53 -07003929 return 0x02;
Marcel Holtmann659c7fb2015-01-30 23:20:56 -08003930 }
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08003931
Marcel Holtmann455c2ff2015-03-15 16:42:53 -07003932 /* When Secure Connections is not enabled or actually
3933 * not supported by the hardware, then check that if
3934 * P-192 data values are present.
3935 */
3936 if (!memcmp(data->rand192, ZERO_KEY, 16) ||
3937 !memcmp(data->hash192, ZERO_KEY, 16))
3938 return 0x00;
3939
3940 return 0x01;
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08003941}
3942
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003943static void hci_io_capa_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02003944{
3945 struct hci_ev_io_capa_request *ev = (void *) skb->data;
3946 struct hci_conn *conn;
3947
3948 BT_DBG("%s", hdev->name);
3949
3950 hci_dev_lock(hdev);
3951
3952 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003953 if (!conn)
3954 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02003955
Johan Hedberg03b555e2011-01-04 15:40:05 +02003956 hci_conn_hold(conn);
3957
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003958 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg03b555e2011-01-04 15:40:05 +02003959 goto unlock;
3960
Johan Hedberg2f407f02014-07-17 15:35:40 +03003961 /* Allow pairing if we're pairable, the initiators of the
3962 * pairing or if the remote is not requesting bonding.
3963 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003964 if (hci_dev_test_flag(hdev, HCI_BONDABLE) ||
Johan Hedberg2f407f02014-07-17 15:35:40 +03003965 test_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags) ||
Gustavo Padovan807deac2012-05-17 00:36:24 -03003966 (conn->remote_auth & ~0x01) == HCI_AT_NO_BONDING) {
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003967 struct hci_cp_io_capability_reply cp;
3968
3969 bacpy(&cp.bdaddr, &ev->bdaddr);
Hemant Gupta7a7f1e72012-01-16 13:34:29 +05303970 /* Change the IO capability from KeyboardDisplay
3971 * to DisplayYesNo as it is not supported by BT spec. */
3972 cp.capability = (conn->io_capability == 0x04) ?
Mikel Astiza7676312013-06-28 10:56:29 +02003973 HCI_IO_DISPLAY_YESNO : conn->io_capability;
Mikel Astizb7f94c82014-04-08 14:21:31 +02003974
3975 /* If we are initiators, there is no remote information yet */
3976 if (conn->remote_auth == 0xff) {
Mikel Astizb16c6602014-04-08 14:21:34 +02003977 /* Request MITM protection if our IO caps allow it
Johan Hedberg4ad51a72014-06-09 14:41:25 +03003978 * except for the no-bonding case.
Mikel Astizb16c6602014-04-08 14:21:34 +02003979 */
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003980 if (conn->io_capability != HCI_IO_NO_INPUT_OUTPUT &&
Johan Hedberg9f743d72014-07-17 11:56:33 +03003981 conn->auth_type != HCI_AT_NO_BONDING)
Johan Hedberg6c538232014-07-11 15:32:23 +03003982 conn->auth_type |= 0x01;
Mikel Astizb7f94c82014-04-08 14:21:31 +02003983 } else {
3984 conn->auth_type = hci_get_auth_req(conn);
Mikel Astizb7f94c82014-04-08 14:21:31 +02003985 }
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003986
Johan Hedberg82c295b2014-07-30 09:22:24 +03003987 /* If we're not bondable, force one of the non-bondable
3988 * authentication requirement values.
3989 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003990 if (!hci_dev_test_flag(hdev, HCI_BONDABLE))
Johan Hedberg82c295b2014-07-30 09:22:24 +03003991 conn->auth_type &= HCI_AT_NO_BONDING_MITM;
3992
3993 cp.authentication = conn->auth_type;
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08003994 cp.oob_data = bredr_oob_data_present(conn);
Szymon Jancce85ee12011-03-22 13:12:23 +01003995
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003996 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003997 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003998 } else {
3999 struct hci_cp_io_capability_neg_reply cp;
4000
4001 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02004002 cp.reason = HCI_ERROR_PAIRING_NOT_ALLOWED;
Johan Hedberg03b555e2011-01-04 15:40:05 +02004003
4004 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03004005 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02004006 }
4007
4008unlock:
4009 hci_dev_unlock(hdev);
4010}
4011
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004012static void hci_io_capa_reply_evt(struct hci_dev *hdev, struct sk_buff *skb)
Johan Hedberg03b555e2011-01-04 15:40:05 +02004013{
4014 struct hci_ev_io_capa_reply *ev = (void *) skb->data;
4015 struct hci_conn *conn;
4016
4017 BT_DBG("%s", hdev->name);
4018
4019 hci_dev_lock(hdev);
4020
4021 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4022 if (!conn)
4023 goto unlock;
4024
Johan Hedberg03b555e2011-01-04 15:40:05 +02004025 conn->remote_cap = ev->capability;
Johan Hedberg03b555e2011-01-04 15:40:05 +02004026 conn->remote_auth = ev->authentication;
4027
4028unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02004029 hci_dev_unlock(hdev);
4030}
4031
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004032static void hci_user_confirm_request_evt(struct hci_dev *hdev,
4033 struct sk_buff *skb)
Johan Hedberga5c29682011-02-19 12:05:57 -03004034{
4035 struct hci_ev_user_confirm_req *ev = (void *) skb->data;
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004036 int loc_mitm, rem_mitm, confirm_hint = 0;
Johan Hedberg7a828902011-04-28 11:28:53 -07004037 struct hci_conn *conn;
Johan Hedberga5c29682011-02-19 12:05:57 -03004038
4039 BT_DBG("%s", hdev->name);
4040
4041 hci_dev_lock(hdev);
4042
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004043 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg7a828902011-04-28 11:28:53 -07004044 goto unlock;
Johan Hedberga5c29682011-02-19 12:05:57 -03004045
Johan Hedberg7a828902011-04-28 11:28:53 -07004046 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4047 if (!conn)
4048 goto unlock;
4049
4050 loc_mitm = (conn->auth_type & 0x01);
4051 rem_mitm = (conn->remote_auth & 0x01);
4052
4053 /* If we require MITM but the remote device can't provide that
Johan Hedberg6c538232014-07-11 15:32:23 +03004054 * (it has NoInputNoOutput) then reject the confirmation
4055 * request. We check the security level here since it doesn't
4056 * necessarily match conn->auth_type.
Mikel Astiz6fd6b912014-04-08 14:21:32 +02004057 */
Johan Hedberg6c538232014-07-11 15:32:23 +03004058 if (conn->pending_sec_level > BT_SECURITY_MEDIUM &&
4059 conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) {
Johan Hedberg7a828902011-04-28 11:28:53 -07004060 BT_DBG("Rejecting request: remote device can't provide MITM");
4061 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03004062 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07004063 goto unlock;
4064 }
4065
4066 /* If no side requires MITM protection; auto-accept */
Mikel Astiza7676312013-06-28 10:56:29 +02004067 if ((!loc_mitm || conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) &&
4068 (!rem_mitm || conn->io_capability == HCI_IO_NO_INPUT_OUTPUT)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004069
4070 /* If we're not the initiators request authorization to
4071 * proceed from user space (mgmt_user_confirm with
Johan Hedbergba15a582014-06-09 13:58:14 +03004072 * confirm_hint set to 1). The exception is if neither
Johan Hedberg02f3e252014-07-16 15:09:13 +03004073 * side had MITM or if the local IO capability is
4074 * NoInputNoOutput, in which case we do auto-accept
Johan Hedbergba15a582014-06-09 13:58:14 +03004075 */
4076 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) &&
Johan Hedberg02f3e252014-07-16 15:09:13 +03004077 conn->io_capability != HCI_IO_NO_INPUT_OUTPUT &&
Johan Hedbergba15a582014-06-09 13:58:14 +03004078 (loc_mitm || rem_mitm)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004079 BT_DBG("Confirming auto-accept as acceptor");
4080 confirm_hint = 1;
4081 goto confirm;
4082 }
4083
Johan Hedberg9f616562011-04-28 11:28:54 -07004084 BT_DBG("Auto-accept of user confirmation with %ums delay",
Gustavo Padovan807deac2012-05-17 00:36:24 -03004085 hdev->auto_accept_delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07004086
4087 if (hdev->auto_accept_delay > 0) {
4088 int delay = msecs_to_jiffies(hdev->auto_accept_delay);
Johan Hedberg7bc18d92013-10-16 18:11:39 +03004089 queue_delayed_work(conn->hdev->workqueue,
4090 &conn->auto_accept_work, delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07004091 goto unlock;
4092 }
4093
Johan Hedberg7a828902011-04-28 11:28:53 -07004094 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03004095 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07004096 goto unlock;
4097 }
4098
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004099confirm:
Johan Hedberg39adbff2014-03-20 08:18:14 +02004100 mgmt_user_confirm_request(hdev, &ev->bdaddr, ACL_LINK, 0,
4101 le32_to_cpu(ev->passkey), confirm_hint);
Johan Hedberg7a828902011-04-28 11:28:53 -07004102
4103unlock:
Johan Hedberga5c29682011-02-19 12:05:57 -03004104 hci_dev_unlock(hdev);
4105}
4106
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004107static void hci_user_passkey_request_evt(struct hci_dev *hdev,
4108 struct sk_buff *skb)
Brian Gix1143d452011-11-23 08:28:34 -08004109{
4110 struct hci_ev_user_passkey_req *ev = (void *) skb->data;
4111
4112 BT_DBG("%s", hdev->name);
4113
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004114 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg272d90d2012-02-09 15:26:12 +02004115 mgmt_user_passkey_request(hdev, &ev->bdaddr, ACL_LINK, 0);
Brian Gix1143d452011-11-23 08:28:34 -08004116}
4117
Johan Hedberg92a25252012-09-06 18:39:26 +03004118static void hci_user_passkey_notify_evt(struct hci_dev *hdev,
4119 struct sk_buff *skb)
4120{
4121 struct hci_ev_user_passkey_notify *ev = (void *) skb->data;
4122 struct hci_conn *conn;
4123
4124 BT_DBG("%s", hdev->name);
4125
4126 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4127 if (!conn)
4128 return;
4129
4130 conn->passkey_notify = __le32_to_cpu(ev->passkey);
4131 conn->passkey_entered = 0;
4132
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004133 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg92a25252012-09-06 18:39:26 +03004134 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
4135 conn->dst_type, conn->passkey_notify,
4136 conn->passkey_entered);
4137}
4138
4139static void hci_keypress_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
4140{
4141 struct hci_ev_keypress_notify *ev = (void *) skb->data;
4142 struct hci_conn *conn;
4143
4144 BT_DBG("%s", hdev->name);
4145
4146 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4147 if (!conn)
4148 return;
4149
4150 switch (ev->type) {
4151 case HCI_KEYPRESS_STARTED:
4152 conn->passkey_entered = 0;
4153 return;
4154
4155 case HCI_KEYPRESS_ENTERED:
4156 conn->passkey_entered++;
4157 break;
4158
4159 case HCI_KEYPRESS_ERASED:
4160 conn->passkey_entered--;
4161 break;
4162
4163 case HCI_KEYPRESS_CLEARED:
4164 conn->passkey_entered = 0;
4165 break;
4166
4167 case HCI_KEYPRESS_COMPLETED:
4168 return;
4169 }
4170
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004171 if (hci_dev_test_flag(hdev, HCI_MGMT))
Johan Hedberg92a25252012-09-06 18:39:26 +03004172 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
4173 conn->dst_type, conn->passkey_notify,
4174 conn->passkey_entered);
4175}
4176
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004177static void hci_simple_pair_complete_evt(struct hci_dev *hdev,
4178 struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02004179{
4180 struct hci_ev_simple_pair_complete *ev = (void *) skb->data;
4181 struct hci_conn *conn;
4182
4183 BT_DBG("%s", hdev->name);
4184
4185 hci_dev_lock(hdev);
4186
4187 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg2a611692011-02-19 12:06:00 -03004188 if (!conn)
4189 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02004190
Johan Hedbergc1d4fa72014-07-17 15:14:50 +03004191 /* Reset the authentication requirement to unknown */
4192 conn->remote_auth = 0xff;
4193
Johan Hedberg2a611692011-02-19 12:06:00 -03004194 /* To avoid duplicate auth_failed events to user space we check
4195 * the HCI_CONN_AUTH_PEND flag which will be set if we
4196 * initiated the authentication. A traditional auth_complete
4197 * event gets always produced as initiator and is also mapped to
4198 * the mgmt_auth_failed event */
Mikel Astizfa1bd912012-08-09 09:52:29 +02004199 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) && ev->status)
Johan Hedberge1e930f2014-09-08 17:09:49 -07004200 mgmt_auth_failed(conn, ev->status);
Johan Hedberg2a611692011-02-19 12:06:00 -03004201
David Herrmann76a68ba2013-04-06 20:28:37 +02004202 hci_conn_drop(conn);
Johan Hedberg2a611692011-02-19 12:06:00 -03004203
4204unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02004205 hci_dev_unlock(hdev);
4206}
4207
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004208static void hci_remote_host_features_evt(struct hci_dev *hdev,
4209 struct sk_buff *skb)
Marcel Holtmann41a96212008-07-14 20:13:48 +02004210{
4211 struct hci_ev_remote_host_features *ev = (void *) skb->data;
4212 struct inquiry_entry *ie;
Johan Hedbergcad718e2013-04-17 15:00:51 +03004213 struct hci_conn *conn;
Marcel Holtmann41a96212008-07-14 20:13:48 +02004214
4215 BT_DBG("%s", hdev->name);
4216
4217 hci_dev_lock(hdev);
4218
Johan Hedbergcad718e2013-04-17 15:00:51 +03004219 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4220 if (conn)
4221 memcpy(conn->features[1], ev->features, 8);
4222
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02004223 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
4224 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02004225 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann41a96212008-07-14 20:13:48 +02004226
4227 hci_dev_unlock(hdev);
4228}
4229
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004230static void hci_remote_oob_data_request_evt(struct hci_dev *hdev,
4231 struct sk_buff *skb)
Szymon Janc2763eda2011-03-22 13:12:22 +01004232{
4233 struct hci_ev_remote_oob_data_request *ev = (void *) skb->data;
4234 struct oob_data *data;
4235
4236 BT_DBG("%s", hdev->name);
4237
4238 hci_dev_lock(hdev);
4239
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004240 if (!hci_dev_test_flag(hdev, HCI_MGMT))
Szymon Jance1ba1f12011-04-06 13:01:59 +02004241 goto unlock;
4242
Johan Hedberg6928a922014-10-26 20:46:09 +01004243 data = hci_find_remote_oob_data(hdev, &ev->bdaddr, BDADDR_BREDR);
Marcel Holtmann6665d052015-01-27 16:04:31 -08004244 if (!data) {
Szymon Janc2763eda2011-03-22 13:12:22 +01004245 struct hci_cp_remote_oob_data_neg_reply cp;
4246
4247 bacpy(&cp.bdaddr, &ev->bdaddr);
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08004248 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_NEG_REPLY,
4249 sizeof(cp), &cp);
Marcel Holtmann6665d052015-01-27 16:04:31 -08004250 goto unlock;
4251 }
4252
4253 if (bredr_sc_enabled(hdev)) {
4254 struct hci_cp_remote_oob_ext_data_reply cp;
4255
4256 bacpy(&cp.bdaddr, &ev->bdaddr);
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004257 if (hci_dev_test_flag(hdev, HCI_SC_ONLY)) {
Marcel Holtmann6665d052015-01-27 16:04:31 -08004258 memset(cp.hash192, 0, sizeof(cp.hash192));
4259 memset(cp.rand192, 0, sizeof(cp.rand192));
4260 } else {
4261 memcpy(cp.hash192, data->hash192, sizeof(cp.hash192));
4262 memcpy(cp.rand192, data->rand192, sizeof(cp.rand192));
4263 }
4264 memcpy(cp.hash256, data->hash256, sizeof(cp.hash256));
4265 memcpy(cp.rand256, data->rand256, sizeof(cp.rand256));
4266
4267 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_EXT_DATA_REPLY,
4268 sizeof(cp), &cp);
4269 } else {
4270 struct hci_cp_remote_oob_data_reply cp;
4271
4272 bacpy(&cp.bdaddr, &ev->bdaddr);
4273 memcpy(cp.hash, data->hash192, sizeof(cp.hash));
4274 memcpy(cp.rand, data->rand192, sizeof(cp.rand));
4275
4276 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_REPLY,
4277 sizeof(cp), &cp);
Szymon Janc2763eda2011-03-22 13:12:22 +01004278 }
4279
Szymon Jance1ba1f12011-04-06 13:01:59 +02004280unlock:
Szymon Janc2763eda2011-03-22 13:12:22 +01004281 hci_dev_unlock(hdev);
4282}
4283
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004284static void hci_phy_link_complete_evt(struct hci_dev *hdev,
4285 struct sk_buff *skb)
4286{
4287 struct hci_ev_phy_link_complete *ev = (void *) skb->data;
4288 struct hci_conn *hcon, *bredr_hcon;
4289
4290 BT_DBG("%s handle 0x%2.2x status 0x%2.2x", hdev->name, ev->phy_handle,
4291 ev->status);
4292
4293 hci_dev_lock(hdev);
4294
4295 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4296 if (!hcon) {
4297 hci_dev_unlock(hdev);
4298 return;
4299 }
4300
4301 if (ev->status) {
4302 hci_conn_del(hcon);
4303 hci_dev_unlock(hdev);
4304 return;
4305 }
4306
4307 bredr_hcon = hcon->amp_mgr->l2cap_conn->hcon;
4308
4309 hcon->state = BT_CONNECTED;
4310 bacpy(&hcon->dst, &bredr_hcon->dst);
4311
4312 hci_conn_hold(hcon);
4313 hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02004314 hci_conn_drop(hcon);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004315
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01004316 hci_debugfs_create_conn(hcon);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004317 hci_conn_add_sysfs(hcon);
4318
Andrei Emeltchenkocf70ff22012-10-31 15:46:36 +02004319 amp_physical_cfm(bredr_hcon, hcon);
4320
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004321 hci_dev_unlock(hdev);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004322}
4323
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004324static void hci_loglink_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
4325{
4326 struct hci_ev_logical_link_complete *ev = (void *) skb->data;
4327 struct hci_conn *hcon;
4328 struct hci_chan *hchan;
4329 struct amp_mgr *mgr;
4330
4331 BT_DBG("%s log_handle 0x%4.4x phy_handle 0x%2.2x status 0x%2.2x",
4332 hdev->name, le16_to_cpu(ev->handle), ev->phy_handle,
4333 ev->status);
4334
4335 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4336 if (!hcon)
4337 return;
4338
4339 /* Create AMP hchan */
4340 hchan = hci_chan_create(hcon);
4341 if (!hchan)
4342 return;
4343
4344 hchan->handle = le16_to_cpu(ev->handle);
4345
4346 BT_DBG("hcon %p mgr %p hchan %p", hcon, hcon->amp_mgr, hchan);
4347
4348 mgr = hcon->amp_mgr;
4349 if (mgr && mgr->bredr_chan) {
4350 struct l2cap_chan *bredr_chan = mgr->bredr_chan;
4351
4352 l2cap_chan_lock(bredr_chan);
4353
4354 bredr_chan->conn->mtu = hdev->block_mtu;
4355 l2cap_logical_cfm(bredr_chan, hchan, 0);
4356 hci_conn_hold(hcon);
4357
4358 l2cap_chan_unlock(bredr_chan);
4359 }
4360}
4361
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02004362static void hci_disconn_loglink_complete_evt(struct hci_dev *hdev,
4363 struct sk_buff *skb)
4364{
4365 struct hci_ev_disconn_logical_link_complete *ev = (void *) skb->data;
4366 struct hci_chan *hchan;
4367
4368 BT_DBG("%s log handle 0x%4.4x status 0x%2.2x", hdev->name,
4369 le16_to_cpu(ev->handle), ev->status);
4370
4371 if (ev->status)
4372 return;
4373
4374 hci_dev_lock(hdev);
4375
4376 hchan = hci_chan_lookup_handle(hdev, le16_to_cpu(ev->handle));
4377 if (!hchan)
4378 goto unlock;
4379
4380 amp_destroy_logical_link(hchan, ev->reason);
4381
4382unlock:
4383 hci_dev_unlock(hdev);
4384}
4385
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02004386static void hci_disconn_phylink_complete_evt(struct hci_dev *hdev,
4387 struct sk_buff *skb)
4388{
4389 struct hci_ev_disconn_phy_link_complete *ev = (void *) skb->data;
4390 struct hci_conn *hcon;
4391
4392 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4393
4394 if (ev->status)
4395 return;
4396
4397 hci_dev_lock(hdev);
4398
4399 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4400 if (hcon) {
4401 hcon->state = BT_CLOSED;
4402 hci_conn_del(hcon);
4403 }
4404
4405 hci_dev_unlock(hdev);
4406}
4407
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004408static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03004409{
4410 struct hci_ev_le_conn_complete *ev = (void *) skb->data;
Johan Hedberg912b42ef2014-07-03 19:33:49 +03004411 struct hci_conn_params *params;
Ville Tervofcd89c02011-02-10 22:38:47 -03004412 struct hci_conn *conn;
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004413 struct smp_irk *irk;
Johan Hedberg837d5022014-07-02 09:36:22 +03004414 u8 addr_type;
Ville Tervofcd89c02011-02-10 22:38:47 -03004415
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004416 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Ville Tervofcd89c02011-02-10 22:38:47 -03004417
4418 hci_dev_lock(hdev);
4419
Johan Hedbergfbd96c12014-07-08 17:21:51 +03004420 /* All controllers implicitly stop advertising in the event of a
4421 * connection, so ensure that the state bit is cleared.
4422 */
Marcel Holtmanna358dc12015-03-13 02:11:02 -07004423 hci_dev_clear_flag(hdev, HCI_LE_ADV);
Johan Hedbergfbd96c12014-07-08 17:21:51 +03004424
Andre Guedesb47a09b2012-07-27 15:10:15 -03004425 conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
Ville Tervob62f3282011-02-10 22:38:50 -03004426 if (!conn) {
Johan Hedberga5c4e302014-07-16 11:56:07 +03004427 conn = hci_conn_add(hdev, LE_LINK, &ev->bdaddr, ev->role);
Ville Tervob62f3282011-02-10 22:38:50 -03004428 if (!conn) {
4429 BT_ERR("No memory for new connection");
Andre Guedes230fd162012-07-27 15:10:10 -03004430 goto unlock;
Ville Tervob62f3282011-02-10 22:38:50 -03004431 }
Andre Guedes29b79882011-05-31 14:20:54 -03004432
4433 conn->dst_type = ev->bdaddr_type;
Andre Guedesb9b343d2012-07-27 15:10:11 -03004434
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004435 /* If we didn't have a hci_conn object previously
4436 * but we're in master role this must be something
4437 * initiated using a white list. Since white list based
4438 * connections are not "first class citizens" we don't
4439 * have full tracking of them. Therefore, we go ahead
4440 * with a "best effort" approach of determining the
4441 * initiator address based on the HCI_PRIVACY flag.
4442 */
4443 if (conn->out) {
4444 conn->resp_addr_type = ev->bdaddr_type;
4445 bacpy(&conn->resp_addr, &ev->bdaddr);
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004446 if (hci_dev_test_flag(hdev, HCI_PRIVACY)) {
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004447 conn->init_addr_type = ADDR_LE_DEV_RANDOM;
4448 bacpy(&conn->init_addr, &hdev->rpa);
4449 } else {
4450 hci_copy_identity_address(hdev,
4451 &conn->init_addr,
4452 &conn->init_addr_type);
4453 }
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004454 }
Johan Hedberg9489eca2014-02-28 17:45:46 +02004455 } else {
4456 cancel_delayed_work(&conn->le_conn_timeout);
Ville Tervob62f3282011-02-10 22:38:50 -03004457 }
Ville Tervofcd89c02011-02-10 22:38:47 -03004458
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004459 if (!conn->out) {
4460 /* Set the responder (our side) address type based on
4461 * the advertising address type.
4462 */
4463 conn->resp_addr_type = hdev->adv_addr_type;
4464 if (hdev->adv_addr_type == ADDR_LE_DEV_RANDOM)
4465 bacpy(&conn->resp_addr, &hdev->random_addr);
4466 else
4467 bacpy(&conn->resp_addr, &hdev->bdaddr);
4468
4469 conn->init_addr_type = ev->bdaddr_type;
4470 bacpy(&conn->init_addr, &ev->bdaddr);
Marcel Holtmanna720d732014-06-23 12:14:51 +02004471
4472 /* For incoming connections, set the default minimum
4473 * and maximum connection interval. They will be used
4474 * to check if the parameters are in range and if not
4475 * trigger the connection update procedure.
4476 */
4477 conn->le_conn_min_interval = hdev->le_conn_min_interval;
4478 conn->le_conn_max_interval = hdev->le_conn_max_interval;
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004479 }
Johan Hedberg7be2edb2014-02-23 19:42:17 +02004480
Marcel Holtmannedb4b462014-02-18 15:13:43 -08004481 /* Lookup the identity address from the stored connection
4482 * address and address type.
4483 *
4484 * When establishing connections to an identity address, the
4485 * connection procedure will store the resolvable random
4486 * address first. Now if it can be converted back into the
4487 * identity address, start using the identity address from
4488 * now on.
4489 */
4490 irk = hci_get_irk(hdev, &conn->dst, conn->dst_type);
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004491 if (irk) {
4492 bacpy(&conn->dst, &irk->bdaddr);
4493 conn->dst_type = irk->addr_type;
4494 }
4495
Johan Hedberg2d3c2262014-07-15 11:51:28 +03004496 if (ev->status) {
4497 hci_le_conn_failed(conn, ev->status);
Johan Hedberg837d5022014-07-02 09:36:22 +03004498 goto unlock;
4499 }
4500
Johan Hedberg08853f12014-08-15 21:06:55 +03004501 if (conn->dst_type == ADDR_LE_DEV_PUBLIC)
4502 addr_type = BDADDR_LE_PUBLIC;
4503 else
4504 addr_type = BDADDR_LE_RANDOM;
4505
Johan Hedberg2d3c2262014-07-15 11:51:28 +03004506 /* Drop the connection if the device is blocked */
4507 if (hci_bdaddr_list_lookup(&hdev->blacklist, &conn->dst, addr_type)) {
4508 hci_conn_drop(conn);
Andre Guedescd17dec2012-07-27 15:10:16 -03004509 goto unlock;
4510 }
4511
Johan Hedbergb644ba32012-01-17 21:48:47 +02004512 if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00004513 mgmt_device_connected(hdev, conn, 0, NULL, 0);
Vinicius Costa Gomes83bc71b2011-05-06 18:41:43 -03004514
Vinicius Costa Gomes7b5c0d52011-06-09 18:50:50 -03004515 conn->sec_level = BT_SECURITY_LOW;
Ville Tervofcd89c02011-02-10 22:38:47 -03004516 conn->handle = __le16_to_cpu(ev->handle);
4517 conn->state = BT_CONNECTED;
4518
Marcel Holtmanne04fde62014-06-23 11:40:04 +02004519 conn->le_conn_interval = le16_to_cpu(ev->interval);
4520 conn->le_conn_latency = le16_to_cpu(ev->latency);
4521 conn->le_supv_timeout = le16_to_cpu(ev->supervision_timeout);
4522
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01004523 hci_debugfs_create_conn(conn);
Ville Tervofcd89c02011-02-10 22:38:47 -03004524 hci_conn_add_sysfs(conn);
4525
Johan Hedberg539c4962015-02-18 14:53:57 +02004526 hci_connect_cfm(conn, ev->status);
Ville Tervofcd89c02011-02-10 22:38:47 -03004527
Johan Hedberg54776102014-08-15 21:06:56 +03004528 params = hci_pend_le_action_lookup(&hdev->pend_le_conns, &conn->dst,
4529 conn->dst_type);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004530 if (params) {
Johan Hedberg95305ba2014-07-04 12:37:21 +03004531 list_del_init(&params->action);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004532 if (params->conn) {
4533 hci_conn_drop(params->conn);
Johan Hedbergf8aaf9b2014-08-17 23:28:57 +03004534 hci_conn_put(params->conn);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004535 params->conn = NULL;
4536 }
4537 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004538
Ville Tervofcd89c02011-02-10 22:38:47 -03004539unlock:
Johan Hedberg223683a52014-07-06 15:44:23 +03004540 hci_update_background_scan(hdev);
Ville Tervofcd89c02011-02-10 22:38:47 -03004541 hci_dev_unlock(hdev);
4542}
4543
Marcel Holtmann1855d922014-06-23 11:40:05 +02004544static void hci_le_conn_update_complete_evt(struct hci_dev *hdev,
4545 struct sk_buff *skb)
4546{
4547 struct hci_ev_le_conn_update_complete *ev = (void *) skb->data;
4548 struct hci_conn *conn;
4549
4550 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4551
4552 if (ev->status)
4553 return;
4554
4555 hci_dev_lock(hdev);
4556
4557 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
4558 if (conn) {
4559 conn->le_conn_interval = le16_to_cpu(ev->interval);
4560 conn->le_conn_latency = le16_to_cpu(ev->latency);
4561 conn->le_supv_timeout = le16_to_cpu(ev->supervision_timeout);
4562 }
4563
4564 hci_dev_unlock(hdev);
4565}
4566
Andre Guedesa4790db2014-02-26 20:21:47 -03004567/* This function requires the caller holds hdev->lock */
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004568static struct hci_conn *check_pending_le_conn(struct hci_dev *hdev,
4569 bdaddr_t *addr,
4570 u8 addr_type, u8 adv_type)
Andre Guedesa4790db2014-02-26 20:21:47 -03004571{
4572 struct hci_conn *conn;
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004573 struct hci_conn_params *params;
Andre Guedesa4790db2014-02-26 20:21:47 -03004574
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004575 /* If the event is not connectable don't proceed further */
4576 if (adv_type != LE_ADV_IND && adv_type != LE_ADV_DIRECT_IND)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004577 return NULL;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004578
4579 /* Ignore if the device is blocked */
Johan Hedbergdcc36c12014-07-09 12:59:13 +03004580 if (hci_bdaddr_list_lookup(&hdev->blacklist, addr, addr_type))
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004581 return NULL;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004582
Johan Hedbergf99353c2014-07-16 11:56:09 +03004583 /* Most controller will fail if we try to create new connections
4584 * while we have an existing one in slave role.
4585 */
4586 if (hdev->conn_hash.le_num_slave > 0)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004587 return NULL;
Johan Hedbergf99353c2014-07-16 11:56:09 +03004588
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004589 /* If we're not connectable only connect devices that we have in
4590 * our pend_le_conns list.
4591 */
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004592 params = hci_pend_le_action_lookup(&hdev->pend_le_conns,
4593 addr, addr_type);
4594 if (!params)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004595 return NULL;
Andre Guedesa4790db2014-02-26 20:21:47 -03004596
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004597 switch (params->auto_connect) {
4598 case HCI_AUTO_CONN_DIRECT:
4599 /* Only devices advertising with ADV_DIRECT_IND are
4600 * triggering a connection attempt. This is allowing
4601 * incoming connections from slave devices.
4602 */
4603 if (adv_type != LE_ADV_DIRECT_IND)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004604 return NULL;
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004605 break;
4606 case HCI_AUTO_CONN_ALWAYS:
4607 /* Devices advertising with ADV_IND or ADV_DIRECT_IND
4608 * are triggering a connection attempt. This means
4609 * that incoming connectioms from slave device are
4610 * accepted and also outgoing connections to slave
4611 * devices are established when found.
4612 */
4613 break;
4614 default:
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004615 return NULL;
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004616 }
4617
Andre Guedesa4790db2014-02-26 20:21:47 -03004618 conn = hci_connect_le(hdev, addr, addr_type, BT_SECURITY_LOW,
Johan Hedberge804d252014-07-16 11:42:28 +03004619 HCI_LE_AUTOCONN_TIMEOUT, HCI_ROLE_MASTER);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004620 if (!IS_ERR(conn)) {
4621 /* Store the pointer since we don't really have any
4622 * other owner of the object besides the params that
4623 * triggered it. This way we can abort the connection if
4624 * the parameters get removed and keep the reference
4625 * count consistent once the connection is established.
4626 */
Johan Hedbergf8aaf9b2014-08-17 23:28:57 +03004627 params->conn = hci_conn_get(conn);
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004628 return conn;
Johan Hedbergf161dd42014-08-15 21:06:54 +03004629 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004630
4631 switch (PTR_ERR(conn)) {
4632 case -EBUSY:
4633 /* If hci_connect() returns -EBUSY it means there is already
4634 * an LE connection attempt going on. Since controllers don't
4635 * support more than one connection attempt at the time, we
4636 * don't consider this an error case.
4637 */
4638 break;
4639 default:
4640 BT_DBG("Failed to connect: err %ld", PTR_ERR(conn));
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004641 return NULL;
Andre Guedesa4790db2014-02-26 20:21:47 -03004642 }
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004643
4644 return NULL;
Andre Guedesa4790db2014-02-26 20:21:47 -03004645}
4646
Johan Hedberg4af605d2014-03-24 10:48:00 +02004647static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr,
Marcel Holtmann2f010b52014-12-05 16:20:13 +01004648 u8 bdaddr_type, bdaddr_t *direct_addr,
4649 u8 direct_addr_type, s8 rssi, u8 *data, u8 len)
Johan Hedberg4af605d2014-03-24 10:48:00 +02004650{
Johan Hedbergb9a63282014-03-25 10:51:52 +02004651 struct discovery_state *d = &hdev->discovery;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004652 struct smp_irk *irk;
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004653 struct hci_conn *conn;
Johan Hedberg474ee062014-03-25 14:34:59 +02004654 bool match;
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004655 u32 flags;
Johan Hedbergb9a63282014-03-25 10:51:52 +02004656
Marcel Holtmann2f010b52014-12-05 16:20:13 +01004657 /* If the direct address is present, then this report is from
4658 * a LE Direct Advertising Report event. In that case it is
4659 * important to see if the address is matching the local
4660 * controller address.
4661 */
4662 if (direct_addr) {
4663 /* Only resolvable random addresses are valid for these
4664 * kind of reports and others can be ignored.
4665 */
4666 if (!hci_bdaddr_is_rpa(direct_addr, direct_addr_type))
4667 return;
4668
4669 /* If the controller is not using resolvable random
4670 * addresses, then this report can be ignored.
4671 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07004672 if (!hci_dev_test_flag(hdev, HCI_PRIVACY))
Marcel Holtmann2f010b52014-12-05 16:20:13 +01004673 return;
4674
4675 /* If the local IRK of the controller does not match
4676 * with the resolvable random address provided, then
4677 * this report can be ignored.
4678 */
4679 if (!smp_irk_matches(hdev, hdev->irk, direct_addr))
4680 return;
4681 }
4682
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004683 /* Check if we need to convert to identity address */
4684 irk = hci_get_irk(hdev, bdaddr, bdaddr_type);
4685 if (irk) {
4686 bdaddr = &irk->bdaddr;
4687 bdaddr_type = irk->addr_type;
4688 }
4689
4690 /* Check if we have been requested to connect to this device */
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004691 conn = check_pending_le_conn(hdev, bdaddr, bdaddr_type, type);
4692 if (conn && type == LE_ADV_IND) {
4693 /* Store report for later inclusion by
4694 * mgmt_device_connected
4695 */
4696 memcpy(conn->le_adv_data, data, len);
4697 conn->le_adv_data_len = len;
4698 }
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004699
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004700 /* Passive scanning shouldn't trigger any device found events,
4701 * except for devices marked as CONN_REPORT for which we do send
4702 * device found events.
4703 */
Johan Hedbergca5c4be2014-03-25 10:30:46 +02004704 if (hdev->le_scan_type == LE_SCAN_PASSIVE) {
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004705 if (type == LE_ADV_DIRECT_IND)
4706 return;
4707
Johan Hedberg3a19b6f2014-07-15 08:07:59 +03004708 if (!hci_pend_le_action_lookup(&hdev->pend_le_reports,
4709 bdaddr, bdaddr_type))
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004710 return;
4711
4712 if (type == LE_ADV_NONCONN_IND || type == LE_ADV_SCAN_IND)
4713 flags = MGMT_DEV_FOUND_NOT_CONNECTABLE;
4714 else
4715 flags = 0;
4716 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
4717 rssi, flags, data, len, NULL, 0);
Johan Hedberg97bf2e92014-07-04 12:37:16 +03004718 return;
Johan Hedbergca5c4be2014-03-25 10:30:46 +02004719 }
Johan Hedberg4af605d2014-03-24 10:48:00 +02004720
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004721 /* When receiving non-connectable or scannable undirected
4722 * advertising reports, this means that the remote device is
4723 * not connectable and then clearly indicate this in the
4724 * device found event.
4725 *
4726 * When receiving a scan response, then there is no way to
4727 * know if the remote device is connectable or not. However
4728 * since scan responses are merged with a previously seen
4729 * advertising report, the flags field from that report
4730 * will be used.
4731 *
4732 * In the really unlikely case that a controller get confused
4733 * and just sends a scan response event, then it is marked as
4734 * not connectable as well.
4735 */
4736 if (type == LE_ADV_NONCONN_IND || type == LE_ADV_SCAN_IND ||
4737 type == LE_ADV_SCAN_RSP)
4738 flags = MGMT_DEV_FOUND_NOT_CONNECTABLE;
4739 else
4740 flags = 0;
4741
Johan Hedbergb9a63282014-03-25 10:51:52 +02004742 /* If there's nothing pending either store the data from this
4743 * event or send an immediate device found event if the data
4744 * should not be stored for later.
4745 */
4746 if (!has_pending_adv_report(hdev)) {
4747 /* If the report will trigger a SCAN_REQ store it for
4748 * later merging.
4749 */
4750 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
4751 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004752 rssi, flags, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004753 return;
4754 }
4755
4756 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004757 rssi, flags, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004758 return;
4759 }
4760
Johan Hedberg474ee062014-03-25 14:34:59 +02004761 /* Check if the pending report is for the same device as the new one */
4762 match = (!bacmp(bdaddr, &d->last_adv_addr) &&
4763 bdaddr_type == d->last_adv_addr_type);
4764
Johan Hedbergb9a63282014-03-25 10:51:52 +02004765 /* If the pending data doesn't match this report or this isn't a
4766 * scan response (e.g. we got a duplicate ADV_IND) then force
4767 * sending of the pending data.
4768 */
Johan Hedberg474ee062014-03-25 14:34:59 +02004769 if (type != LE_ADV_SCAN_RSP || !match) {
4770 /* Send out whatever is in the cache, but skip duplicates */
4771 if (!match)
4772 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004773 d->last_adv_addr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004774 d->last_adv_rssi, d->last_adv_flags,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004775 d->last_adv_data,
Johan Hedberg474ee062014-03-25 14:34:59 +02004776 d->last_adv_data_len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004777
4778 /* If the new report will trigger a SCAN_REQ store it for
4779 * later merging.
4780 */
4781 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
4782 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004783 rssi, flags, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004784 return;
4785 }
4786
4787 /* The advertising reports cannot be merged, so clear
4788 * the pending report and send out a device found event.
4789 */
4790 clear_pending_adv_report(hdev);
Johan Hedberg5c5b93e2014-03-29 08:39:53 +02004791 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004792 rssi, flags, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004793 return;
4794 }
4795
4796 /* If we get here we've got a pending ADV_IND or ADV_SCAN_IND and
4797 * the new event is a SCAN_RSP. We can therefore proceed with
4798 * sending a merged device found event.
4799 */
4800 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004801 d->last_adv_addr_type, NULL, rssi, d->last_adv_flags,
Marcel Holtmann42bd6a52014-07-01 14:11:19 +02004802 d->last_adv_data, d->last_adv_data_len, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004803 clear_pending_adv_report(hdev);
Johan Hedberg4af605d2014-03-24 10:48:00 +02004804}
4805
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004806static void hci_le_adv_report_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andre Guedes9aa04c92011-05-26 16:23:51 -03004807{
Andre Guedese95beb42011-09-26 20:48:35 -03004808 u8 num_reports = skb->data[0];
4809 void *ptr = &skb->data[1];
Andre Guedes9aa04c92011-05-26 16:23:51 -03004810
Andre Guedesa4790db2014-02-26 20:21:47 -03004811 hci_dev_lock(hdev);
4812
Andre Guedese95beb42011-09-26 20:48:35 -03004813 while (num_reports--) {
4814 struct hci_ev_le_advertising_info *ev = ptr;
Johan Hedberg4af605d2014-03-24 10:48:00 +02004815 s8 rssi;
Andre Guedesa4790db2014-02-26 20:21:47 -03004816
Andre Guedes3c9e9192012-01-10 18:20:50 -03004817 rssi = ev->data[ev->length];
Johan Hedberg4af605d2014-03-24 10:48:00 +02004818 process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
Marcel Holtmann2f010b52014-12-05 16:20:13 +01004819 ev->bdaddr_type, NULL, 0, rssi,
4820 ev->data, ev->length);
Andre Guedes3c9e9192012-01-10 18:20:50 -03004821
Andre Guedese95beb42011-09-26 20:48:35 -03004822 ptr += sizeof(*ev) + ev->length + 1;
Andre Guedes9aa04c92011-05-26 16:23:51 -03004823 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004824
4825 hci_dev_unlock(hdev);
Andre Guedes9aa04c92011-05-26 16:23:51 -03004826}
4827
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004828static void hci_le_ltk_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004829{
4830 struct hci_ev_le_ltk_req *ev = (void *) skb->data;
4831 struct hci_cp_le_ltk_reply cp;
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004832 struct hci_cp_le_ltk_neg_reply neg;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004833 struct hci_conn *conn;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004834 struct smp_ltk *ltk;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004835
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004836 BT_DBG("%s handle 0x%4.4x", hdev->name, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004837
4838 hci_dev_lock(hdev);
4839
4840 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004841 if (conn == NULL)
4842 goto not_found;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004843
Johan Hedbergf3a73d92014-05-29 15:02:59 +03004844 ltk = hci_find_ltk(hdev, &conn->dst, conn->dst_type, conn->role);
Johan Hedberg5378bc52014-05-29 14:00:39 +03004845 if (!ltk)
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004846 goto not_found;
4847
Johan Hedberg5378bc52014-05-29 14:00:39 +03004848 if (smp_ltk_is_sc(ltk)) {
4849 /* With SC both EDiv and Rand are set to zero */
4850 if (ev->ediv || ev->rand)
4851 goto not_found;
4852 } else {
4853 /* For non-SC keys check that EDiv and Rand match */
4854 if (ev->ediv != ltk->ediv || ev->rand != ltk->rand)
4855 goto not_found;
4856 }
4857
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004858 memcpy(cp.ltk, ltk->val, sizeof(ltk->val));
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004859 cp.handle = cpu_to_le16(conn->handle);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004860
Johan Hedberga6f78332014-09-10 17:37:45 -07004861 conn->pending_sec_level = smp_ltk_sec_level(ltk);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004862
Andre Guedes89cbb4d2013-07-31 16:25:29 -03004863 conn->enc_key_size = ltk->enc_size;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004864
4865 hci_send_cmd(hdev, HCI_OP_LE_LTK_REPLY, sizeof(cp), &cp);
4866
Claudio Takahasi5981a882013-07-25 16:34:24 -03004867 /* Ref. Bluetooth Core SPEC pages 1975 and 2004. STK is a
4868 * temporary key used to encrypt a connection following
4869 * pairing. It is used during the Encrypted Session Setup to
4870 * distribute the keys. Later, security can be re-established
4871 * using a distributed LTK.
4872 */
Johan Hedberg2ceba532014-06-16 19:25:16 +03004873 if (ltk->type == SMP_STK) {
Johan Hedbergfe59a052014-07-01 19:14:12 +03004874 set_bit(HCI_CONN_STK_ENCRYPT, &conn->flags);
Johan Hedberg970d0f12014-11-13 14:37:47 +02004875 list_del_rcu(&ltk->list);
4876 kfree_rcu(ltk, rcu);
Johan Hedbergfe59a052014-07-01 19:14:12 +03004877 } else {
4878 clear_bit(HCI_CONN_STK_ENCRYPT, &conn->flags);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004879 }
4880
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004881 hci_dev_unlock(hdev);
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004882
4883 return;
4884
4885not_found:
4886 neg.handle = ev->handle;
4887 hci_send_cmd(hdev, HCI_OP_LE_LTK_NEG_REPLY, sizeof(neg), &neg);
4888 hci_dev_unlock(hdev);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004889}
4890
Andre Guedes8e75b462014-07-01 18:10:08 -03004891static void send_conn_param_neg_reply(struct hci_dev *hdev, u16 handle,
4892 u8 reason)
4893{
4894 struct hci_cp_le_conn_param_req_neg_reply cp;
4895
4896 cp.handle = cpu_to_le16(handle);
4897 cp.reason = reason;
4898
4899 hci_send_cmd(hdev, HCI_OP_LE_CONN_PARAM_REQ_NEG_REPLY, sizeof(cp),
4900 &cp);
4901}
4902
4903static void hci_le_remote_conn_param_req_evt(struct hci_dev *hdev,
4904 struct sk_buff *skb)
4905{
4906 struct hci_ev_le_remote_conn_param_req *ev = (void *) skb->data;
4907 struct hci_cp_le_conn_param_req_reply cp;
4908 struct hci_conn *hcon;
4909 u16 handle, min, max, latency, timeout;
4910
4911 handle = le16_to_cpu(ev->handle);
4912 min = le16_to_cpu(ev->interval_min);
4913 max = le16_to_cpu(ev->interval_max);
4914 latency = le16_to_cpu(ev->latency);
4915 timeout = le16_to_cpu(ev->timeout);
4916
4917 hcon = hci_conn_hash_lookup_handle(hdev, handle);
4918 if (!hcon || hcon->state != BT_CONNECTED)
4919 return send_conn_param_neg_reply(hdev, handle,
4920 HCI_ERROR_UNKNOWN_CONN_ID);
4921
4922 if (hci_check_conn_params(min, max, latency, timeout))
4923 return send_conn_param_neg_reply(hdev, handle,
4924 HCI_ERROR_INVALID_LL_PARAMS);
4925
Johan Hedberg40bef302014-07-16 11:42:27 +03004926 if (hcon->role == HCI_ROLE_MASTER) {
Johan Hedberg348d50b2014-07-02 17:37:30 +03004927 struct hci_conn_params *params;
Johan Hedbergf4869e22014-07-02 17:37:32 +03004928 u8 store_hint;
Johan Hedberg348d50b2014-07-02 17:37:30 +03004929
4930 hci_dev_lock(hdev);
4931
4932 params = hci_conn_params_lookup(hdev, &hcon->dst,
4933 hcon->dst_type);
4934 if (params) {
4935 params->conn_min_interval = min;
4936 params->conn_max_interval = max;
4937 params->conn_latency = latency;
4938 params->supervision_timeout = timeout;
Johan Hedbergf4869e22014-07-02 17:37:32 +03004939 store_hint = 0x01;
4940 } else{
4941 store_hint = 0x00;
Johan Hedberg348d50b2014-07-02 17:37:30 +03004942 }
4943
4944 hci_dev_unlock(hdev);
4945
Johan Hedbergf4869e22014-07-02 17:37:32 +03004946 mgmt_new_conn_param(hdev, &hcon->dst, hcon->dst_type,
4947 store_hint, min, max, latency, timeout);
Johan Hedberg348d50b2014-07-02 17:37:30 +03004948 }
Andre Guedesffb5a8272014-07-01 18:10:11 -03004949
Andre Guedes8e75b462014-07-01 18:10:08 -03004950 cp.handle = ev->handle;
4951 cp.interval_min = ev->interval_min;
4952 cp.interval_max = ev->interval_max;
4953 cp.latency = ev->latency;
4954 cp.timeout = ev->timeout;
4955 cp.min_ce_len = 0;
4956 cp.max_ce_len = 0;
4957
4958 hci_send_cmd(hdev, HCI_OP_LE_CONN_PARAM_REQ_REPLY, sizeof(cp), &cp);
4959}
4960
Marcel Holtmann2f010b52014-12-05 16:20:13 +01004961static void hci_le_direct_adv_report_evt(struct hci_dev *hdev,
4962 struct sk_buff *skb)
4963{
4964 u8 num_reports = skb->data[0];
4965 void *ptr = &skb->data[1];
4966
4967 hci_dev_lock(hdev);
4968
4969 while (num_reports--) {
4970 struct hci_ev_le_direct_adv_info *ev = ptr;
4971
4972 process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
4973 ev->bdaddr_type, &ev->direct_addr,
4974 ev->direct_addr_type, ev->rssi, NULL, 0);
4975
4976 ptr += sizeof(*ev);
4977 }
4978
4979 hci_dev_unlock(hdev);
4980}
4981
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004982static void hci_le_meta_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03004983{
4984 struct hci_ev_le_meta *le_ev = (void *) skb->data;
4985
4986 skb_pull(skb, sizeof(*le_ev));
4987
4988 switch (le_ev->subevent) {
4989 case HCI_EV_LE_CONN_COMPLETE:
4990 hci_le_conn_complete_evt(hdev, skb);
4991 break;
4992
Marcel Holtmann1855d922014-06-23 11:40:05 +02004993 case HCI_EV_LE_CONN_UPDATE_COMPLETE:
4994 hci_le_conn_update_complete_evt(hdev, skb);
4995 break;
4996
Andre Guedes9aa04c92011-05-26 16:23:51 -03004997 case HCI_EV_LE_ADVERTISING_REPORT:
4998 hci_le_adv_report_evt(hdev, skb);
4999 break;
5000
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03005001 case HCI_EV_LE_LTK_REQ:
5002 hci_le_ltk_request_evt(hdev, skb);
5003 break;
5004
Andre Guedes8e75b462014-07-01 18:10:08 -03005005 case HCI_EV_LE_REMOTE_CONN_PARAM_REQ:
5006 hci_le_remote_conn_param_req_evt(hdev, skb);
5007 break;
5008
Marcel Holtmann2f010b52014-12-05 16:20:13 +01005009 case HCI_EV_LE_DIRECT_ADV_REPORT:
5010 hci_le_direct_adv_report_evt(hdev, skb);
5011 break;
5012
Ville Tervofcd89c02011-02-10 22:38:47 -03005013 default:
5014 break;
5015 }
5016}
5017
Andrei Emeltchenko9495b2e2012-09-27 17:26:22 +03005018static void hci_chan_selected_evt(struct hci_dev *hdev, struct sk_buff *skb)
5019{
5020 struct hci_ev_channel_selected *ev = (void *) skb->data;
5021 struct hci_conn *hcon;
5022
5023 BT_DBG("%s handle 0x%2.2x", hdev->name, ev->phy_handle);
5024
5025 skb_pull(skb, sizeof(*ev));
5026
5027 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
5028 if (!hcon)
5029 return;
5030
5031 amp_read_loc_assoc_final_data(hdev, hcon);
5032}
5033
Linus Torvalds1da177e2005-04-16 15:20:36 -07005034void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)
5035{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005036 struct hci_event_hdr *hdr = (void *) skb->data;
5037 __u8 event = hdr->evt;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005038
Johan Hedbergb6ddb632013-04-02 13:34:31 +03005039 hci_dev_lock(hdev);
5040
5041 /* Received events are (currently) only needed when a request is
5042 * ongoing so avoid unnecessary memory allocation.
5043 */
Marcel Holtmann899de762014-07-11 05:51:58 +02005044 if (hci_req_pending(hdev)) {
Johan Hedbergb6ddb632013-04-02 13:34:31 +03005045 kfree_skb(hdev->recv_evt);
5046 hdev->recv_evt = skb_clone(skb, GFP_KERNEL);
5047 }
5048
5049 hci_dev_unlock(hdev);
5050
Linus Torvalds1da177e2005-04-16 15:20:36 -07005051 skb_pull(skb, HCI_EVENT_HDR_SIZE);
5052
Eyal Birger49a6fe02015-03-01 14:58:25 +02005053 if (hdev->sent_cmd && bt_cb(hdev->sent_cmd)->req_event == event) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02005054 struct hci_command_hdr *cmd_hdr = (void *) hdev->sent_cmd->data;
5055 u16 opcode = __le16_to_cpu(cmd_hdr->opcode);
Johan Hedberg02350a72013-04-03 21:50:29 +03005056
5057 hci_req_cmd_complete(hdev, opcode, 0);
5058 }
5059
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005060 switch (event) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005061 case HCI_EV_INQUIRY_COMPLETE:
5062 hci_inquiry_complete_evt(hdev, skb);
5063 break;
5064
5065 case HCI_EV_INQUIRY_RESULT:
5066 hci_inquiry_result_evt(hdev, skb);
5067 break;
5068
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005069 case HCI_EV_CONN_COMPLETE:
5070 hci_conn_complete_evt(hdev, skb);
Marcel Holtmann21d9e302005-09-13 01:32:25 +02005071 break;
5072
Linus Torvalds1da177e2005-04-16 15:20:36 -07005073 case HCI_EV_CONN_REQUEST:
5074 hci_conn_request_evt(hdev, skb);
5075 break;
5076
Linus Torvalds1da177e2005-04-16 15:20:36 -07005077 case HCI_EV_DISCONN_COMPLETE:
5078 hci_disconn_complete_evt(hdev, skb);
5079 break;
5080
Linus Torvalds1da177e2005-04-16 15:20:36 -07005081 case HCI_EV_AUTH_COMPLETE:
5082 hci_auth_complete_evt(hdev, skb);
5083 break;
5084
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005085 case HCI_EV_REMOTE_NAME:
5086 hci_remote_name_evt(hdev, skb);
5087 break;
5088
Linus Torvalds1da177e2005-04-16 15:20:36 -07005089 case HCI_EV_ENCRYPT_CHANGE:
5090 hci_encrypt_change_evt(hdev, skb);
5091 break;
5092
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005093 case HCI_EV_CHANGE_LINK_KEY_COMPLETE:
5094 hci_change_link_key_complete_evt(hdev, skb);
5095 break;
5096
5097 case HCI_EV_REMOTE_FEATURES:
5098 hci_remote_features_evt(hdev, skb);
5099 break;
5100
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005101 case HCI_EV_CMD_COMPLETE:
5102 hci_cmd_complete_evt(hdev, skb);
5103 break;
5104
5105 case HCI_EV_CMD_STATUS:
5106 hci_cmd_status_evt(hdev, skb);
5107 break;
5108
Marcel Holtmann24dfa342014-11-02 02:56:41 +01005109 case HCI_EV_HARDWARE_ERROR:
5110 hci_hardware_error_evt(hdev, skb);
5111 break;
5112
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005113 case HCI_EV_ROLE_CHANGE:
5114 hci_role_change_evt(hdev, skb);
5115 break;
5116
5117 case HCI_EV_NUM_COMP_PKTS:
5118 hci_num_comp_pkts_evt(hdev, skb);
5119 break;
5120
5121 case HCI_EV_MODE_CHANGE:
5122 hci_mode_change_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005123 break;
5124
5125 case HCI_EV_PIN_CODE_REQ:
5126 hci_pin_code_request_evt(hdev, skb);
5127 break;
5128
5129 case HCI_EV_LINK_KEY_REQ:
5130 hci_link_key_request_evt(hdev, skb);
5131 break;
5132
5133 case HCI_EV_LINK_KEY_NOTIFY:
5134 hci_link_key_notify_evt(hdev, skb);
5135 break;
5136
5137 case HCI_EV_CLOCK_OFFSET:
5138 hci_clock_offset_evt(hdev, skb);
5139 break;
5140
Marcel Holtmanna8746412008-07-14 20:13:46 +02005141 case HCI_EV_PKT_TYPE_CHANGE:
5142 hci_pkt_type_change_evt(hdev, skb);
5143 break;
5144
Marcel Holtmann85a1e932005-08-09 20:28:02 -07005145 case HCI_EV_PSCAN_REP_MODE:
5146 hci_pscan_rep_mode_evt(hdev, skb);
5147 break;
5148
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005149 case HCI_EV_INQUIRY_RESULT_WITH_RSSI:
5150 hci_inquiry_result_with_rssi_evt(hdev, skb);
5151 break;
5152
5153 case HCI_EV_REMOTE_EXT_FEATURES:
5154 hci_remote_ext_features_evt(hdev, skb);
5155 break;
5156
5157 case HCI_EV_SYNC_CONN_COMPLETE:
5158 hci_sync_conn_complete_evt(hdev, skb);
5159 break;
5160
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005161 case HCI_EV_EXTENDED_INQUIRY_RESULT:
5162 hci_extended_inquiry_result_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005163 break;
5164
Johan Hedberg1c2e0042012-06-08 23:31:13 +08005165 case HCI_EV_KEY_REFRESH_COMPLETE:
5166 hci_key_refresh_complete_evt(hdev, skb);
5167 break;
5168
Marcel Holtmann04936842008-07-14 20:13:48 +02005169 case HCI_EV_IO_CAPA_REQUEST:
5170 hci_io_capa_request_evt(hdev, skb);
5171 break;
5172
Johan Hedberg03b555e2011-01-04 15:40:05 +02005173 case HCI_EV_IO_CAPA_REPLY:
5174 hci_io_capa_reply_evt(hdev, skb);
5175 break;
5176
Johan Hedberga5c29682011-02-19 12:05:57 -03005177 case HCI_EV_USER_CONFIRM_REQUEST:
5178 hci_user_confirm_request_evt(hdev, skb);
5179 break;
5180
Brian Gix1143d452011-11-23 08:28:34 -08005181 case HCI_EV_USER_PASSKEY_REQUEST:
5182 hci_user_passkey_request_evt(hdev, skb);
5183 break;
5184
Johan Hedberg92a25252012-09-06 18:39:26 +03005185 case HCI_EV_USER_PASSKEY_NOTIFY:
5186 hci_user_passkey_notify_evt(hdev, skb);
5187 break;
5188
5189 case HCI_EV_KEYPRESS_NOTIFY:
5190 hci_keypress_notify_evt(hdev, skb);
5191 break;
5192
Marcel Holtmann04936842008-07-14 20:13:48 +02005193 case HCI_EV_SIMPLE_PAIR_COMPLETE:
5194 hci_simple_pair_complete_evt(hdev, skb);
5195 break;
5196
Marcel Holtmann41a96212008-07-14 20:13:48 +02005197 case HCI_EV_REMOTE_HOST_FEATURES:
5198 hci_remote_host_features_evt(hdev, skb);
5199 break;
5200
Ville Tervofcd89c02011-02-10 22:38:47 -03005201 case HCI_EV_LE_META:
5202 hci_le_meta_evt(hdev, skb);
5203 break;
5204
Andrei Emeltchenko9495b2e2012-09-27 17:26:22 +03005205 case HCI_EV_CHANNEL_SELECTED:
5206 hci_chan_selected_evt(hdev, skb);
5207 break;
5208
Szymon Janc2763eda2011-03-22 13:12:22 +01005209 case HCI_EV_REMOTE_OOB_DATA_REQUEST:
5210 hci_remote_oob_data_request_evt(hdev, skb);
5211 break;
5212
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03005213 case HCI_EV_PHY_LINK_COMPLETE:
5214 hci_phy_link_complete_evt(hdev, skb);
5215 break;
5216
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03005217 case HCI_EV_LOGICAL_LINK_COMPLETE:
5218 hci_loglink_complete_evt(hdev, skb);
5219 break;
5220
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02005221 case HCI_EV_DISCONN_LOGICAL_LINK_COMPLETE:
5222 hci_disconn_loglink_complete_evt(hdev, skb);
5223 break;
5224
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02005225 case HCI_EV_DISCONN_PHY_LINK_COMPLETE:
5226 hci_disconn_phylink_complete_evt(hdev, skb);
5227 break;
5228
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02005229 case HCI_EV_NUM_COMP_BLOCKS:
5230 hci_num_comp_blocks_evt(hdev, skb);
5231 break;
5232
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005233 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03005234 BT_DBG("%s event 0x%2.2x", hdev->name, event);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005235 break;
5236 }
5237
5238 kfree_skb(skb);
5239 hdev->stat.evt_rx++;
5240}