blob: 65f4ec8945a44be5051371d951c5e0d9a42a90ad [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
Marcel Holtmann70247282013-10-10 14:54:15 -070033#include "a2mp.h"
Marcel Holtmann7ef9fbf2013-10-10 14:54:14 -070034#include "amp.h"
Johan Hedberg2ceba532014-06-16 19:25:16 +030035#include "smp.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070036
Linus Torvalds1da177e2005-04-16 15:20:36 -070037/* Handle HCI Event packets */
38
Marcel Holtmanna9de9242007-10-20 13:33:56 +020039static void hci_cc_inquiry_cancel(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -070040{
Marcel Holtmanna9de9242007-10-20 13:33:56 +020041 __u8 status = *((__u8 *) skb->data);
Linus Torvalds1da177e2005-04-16 15:20:36 -070042
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030043 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -070044
Andre Guedes82f47852013-04-30 15:29:34 -030045 if (status)
Marcel Holtmanna9de9242007-10-20 13:33:56 +020046 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -070047
Andre Guedes89352e72011-11-04 14:16:53 -030048 clear_bit(HCI_INQUIRY, &hdev->flags);
Peter Zijlstra4e857c52014-03-17 18:06:10 +010049 smp_mb__after_atomic(); /* wake_up_bit advises about this barrier */
Andre Guedes3e13fa12013-03-27 20:04:56 -030050 wake_up_bit(&hdev->flags, HCI_INQUIRY);
Andre Guedes89352e72011-11-04 14:16:53 -030051
Johan Hedberg50143a42014-06-10 14:05:57 +030052 hci_dev_lock(hdev);
53 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
54 hci_dev_unlock(hdev);
55
Marcel Holtmanna9de9242007-10-20 13:33:56 +020056 hci_conn_check_pending(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -070057}
58
Andre Guedes4d934832012-03-21 00:03:35 -030059static void hci_cc_periodic_inq(struct hci_dev *hdev, struct sk_buff *skb)
60{
61 __u8 status = *((__u8 *) skb->data);
62
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030063 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedesae854a72012-03-21 00:03:36 -030064
65 if (status)
66 return;
67
68 set_bit(HCI_PERIODIC_INQ, &hdev->dev_flags);
Andre Guedes4d934832012-03-21 00:03:35 -030069}
70
Marcel Holtmanna9de9242007-10-20 13:33:56 +020071static void hci_cc_exit_periodic_inq(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -070072{
Marcel Holtmanna9de9242007-10-20 13:33:56 +020073 __u8 status = *((__u8 *) skb->data);
74
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030075 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +020076
77 if (status)
78 return;
79
Andre Guedesae854a72012-03-21 00:03:36 -030080 clear_bit(HCI_PERIODIC_INQ, &hdev->dev_flags);
81
Marcel Holtmanna9de9242007-10-20 13:33:56 +020082 hci_conn_check_pending(hdev);
83}
84
Gustavo Padovan807deac2012-05-17 00:36:24 -030085static void hci_cc_remote_name_req_cancel(struct hci_dev *hdev,
86 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +020087{
88 BT_DBG("%s", hdev->name);
89}
90
91static void hci_cc_role_discovery(struct hci_dev *hdev, struct sk_buff *skb)
92{
93 struct hci_rp_role_discovery *rp = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -070094 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -070095
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030096 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -070097
Marcel Holtmanna9de9242007-10-20 13:33:56 +020098 if (rp->status)
99 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700100
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200101 hci_dev_lock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700102
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200103 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
Johan Hedberg40bef302014-07-16 11:42:27 +0300104 if (conn)
105 conn->role = rp->role;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200106
107 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700108}
109
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200110static void hci_cc_read_link_policy(struct hci_dev *hdev, struct sk_buff *skb)
111{
112 struct hci_rp_read_link_policy *rp = (void *) skb->data;
113 struct hci_conn *conn;
114
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300115 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200116
117 if (rp->status)
118 return;
119
120 hci_dev_lock(hdev);
121
122 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
123 if (conn)
124 conn->link_policy = __le16_to_cpu(rp->policy);
125
126 hci_dev_unlock(hdev);
127}
128
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200129static void hci_cc_write_link_policy(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700130{
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200131 struct hci_rp_write_link_policy *rp = (void *) skb->data;
132 struct hci_conn *conn;
133 void *sent;
134
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300135 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200136
137 if (rp->status)
138 return;
139
140 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LINK_POLICY);
141 if (!sent)
142 return;
143
144 hci_dev_lock(hdev);
145
146 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200147 if (conn)
Harvey Harrison83985312008-05-02 16:25:46 -0700148 conn->link_policy = get_unaligned_le16(sent + 2);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200149
150 hci_dev_unlock(hdev);
151}
152
Gustavo Padovan807deac2012-05-17 00:36:24 -0300153static void hci_cc_read_def_link_policy(struct hci_dev *hdev,
154 struct sk_buff *skb)
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200155{
156 struct hci_rp_read_def_link_policy *rp = (void *) skb->data;
157
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300158 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200159
160 if (rp->status)
161 return;
162
163 hdev->link_policy = __le16_to_cpu(rp->policy);
164}
165
Gustavo Padovan807deac2012-05-17 00:36:24 -0300166static void hci_cc_write_def_link_policy(struct hci_dev *hdev,
167 struct sk_buff *skb)
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200168{
169 __u8 status = *((__u8 *) skb->data);
170 void *sent;
171
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300172 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200173
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200174 if (status)
175 return;
176
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200177 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_DEF_LINK_POLICY);
178 if (!sent)
179 return;
180
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200181 hdev->link_policy = get_unaligned_le16(sent);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200182}
183
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200184static void hci_cc_reset(struct hci_dev *hdev, struct sk_buff *skb)
185{
186 __u8 status = *((__u8 *) skb->data);
187
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300188 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200189
Gustavo F. Padovan10572132011-03-16 15:36:29 -0300190 clear_bit(HCI_RESET, &hdev->flags);
191
Marcel Holtmann8761f9d2014-11-02 02:45:58 +0100192 if (status)
193 return;
194
Johan Hedberga297e972012-02-21 17:55:47 +0200195 /* Reset all non-persistent flags */
Johan Hedberg2cc6fb02013-03-15 17:06:57 -0500196 hdev->dev_flags &= ~HCI_PERSISTENT_MASK;
Andre Guedes69775ff2012-02-23 16:50:05 +0200197
198 hdev->discovery.state = DISCOVERY_STOPPED;
Johan Hedbergbbaf4442012-11-08 01:22:59 +0100199 hdev->inq_tx_power = HCI_TX_POWER_INVALID;
200 hdev->adv_tx_power = HCI_TX_POWER_INVALID;
Johan Hedberg3f0f5242012-11-08 01:23:00 +0100201
202 memset(hdev->adv_data, 0, sizeof(hdev->adv_data));
203 hdev->adv_data_len = 0;
Marcel Holtmannf8e808b2013-10-16 00:16:47 -0700204
205 memset(hdev->scan_rsp_data, 0, sizeof(hdev->scan_rsp_data));
206 hdev->scan_rsp_data_len = 0;
Marcel Holtmann06f5b772013-10-19 07:09:11 -0700207
Marcel Holtmann533553f2014-03-21 12:18:10 -0700208 hdev->le_scan_type = LE_SCAN_PASSIVE;
209
Marcel Holtmann06f5b772013-10-19 07:09:11 -0700210 hdev->ssp_debug_mode = 0;
Marcel Holtmanna4d55042014-10-29 23:37:53 +0100211
212 hci_bdaddr_list_clear(&hdev->le_white_list);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200213}
214
215static void hci_cc_write_local_name(struct hci_dev *hdev, struct sk_buff *skb)
216{
217 __u8 status = *((__u8 *) skb->data);
218 void *sent;
219
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300220 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200221
222 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LOCAL_NAME);
223 if (!sent)
224 return;
225
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200226 hci_dev_lock(hdev);
227
Johan Hedbergf51d5b22012-02-22 18:17:32 +0200228 if (test_bit(HCI_MGMT, &hdev->dev_flags))
229 mgmt_set_local_name_complete(hdev, sent, status);
Johan Hedberg28cc7bd2012-02-22 21:06:55 +0200230 else if (!status)
231 memcpy(hdev->dev_name, sent, HCI_MAX_NAME_LENGTH);
Johan Hedbergf51d5b22012-02-22 18:17:32 +0200232
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200233 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200234}
235
236static void hci_cc_read_local_name(struct hci_dev *hdev, struct sk_buff *skb)
237{
238 struct hci_rp_read_local_name *rp = (void *) skb->data;
239
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300240 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200241
242 if (rp->status)
243 return;
244
Johan Hedbergdb99b5f2012-02-22 20:14:22 +0200245 if (test_bit(HCI_SETUP, &hdev->dev_flags))
246 memcpy(hdev->dev_name, rp->name, HCI_MAX_NAME_LENGTH);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200247}
248
249static void hci_cc_write_auth_enable(struct hci_dev *hdev, struct sk_buff *skb)
250{
251 __u8 status = *((__u8 *) skb->data);
252 void *sent;
253
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300254 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200255
256 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_AUTH_ENABLE);
257 if (!sent)
258 return;
259
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530260 hci_dev_lock(hdev);
261
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200262 if (!status) {
263 __u8 param = *((__u8 *) sent);
264
265 if (param == AUTH_ENABLED)
266 set_bit(HCI_AUTH, &hdev->flags);
267 else
268 clear_bit(HCI_AUTH, &hdev->flags);
269 }
270
Johan Hedberg33ef95e2012-02-16 23:56:27 +0200271 if (test_bit(HCI_MGMT, &hdev->dev_flags))
272 mgmt_auth_enable_complete(hdev, status);
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530273
274 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200275}
276
277static void hci_cc_write_encrypt_mode(struct hci_dev *hdev, struct sk_buff *skb)
278{
279 __u8 status = *((__u8 *) skb->data);
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200280 __u8 param;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200281 void *sent;
282
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300283 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200284
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200285 if (status)
286 return;
287
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200288 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_ENCRYPT_MODE);
289 if (!sent)
290 return;
291
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200292 param = *((__u8 *) sent);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200293
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200294 if (param)
295 set_bit(HCI_ENCRYPT, &hdev->flags);
296 else
297 clear_bit(HCI_ENCRYPT, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200298}
299
300static void hci_cc_write_scan_enable(struct hci_dev *hdev, struct sk_buff *skb)
301{
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200302 __u8 status = *((__u8 *) skb->data);
303 __u8 param;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200304 void *sent;
305
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300306 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200307
308 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SCAN_ENABLE);
309 if (!sent)
310 return;
311
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200312 param = *((__u8 *) sent);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200313
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200314 hci_dev_lock(hdev);
315
Mikel Astizfa1bd912012-08-09 09:52:29 +0200316 if (status) {
Johan Hedberg2d7cee52011-11-07 22:16:03 +0200317 hdev->discov_timeout = 0;
318 goto done;
319 }
320
Johan Hedbergbc6d2d02014-07-10 12:09:08 +0300321 if (param & SCAN_INQUIRY)
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200322 set_bit(HCI_ISCAN, &hdev->flags);
Johan Hedbergbc6d2d02014-07-10 12:09:08 +0300323 else
324 clear_bit(HCI_ISCAN, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200325
Johan Hedberg031547d2014-07-10 12:09:06 +0300326 if (param & SCAN_PAGE)
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200327 set_bit(HCI_PSCAN, &hdev->flags);
Johan Hedbergbc6d2d02014-07-10 12:09:08 +0300328 else
Johan Hedberg204e3992014-07-28 15:45:31 +0300329 clear_bit(HCI_PSCAN, &hdev->flags);
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200330
331done:
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200332 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200333}
334
335static void hci_cc_read_class_of_dev(struct hci_dev *hdev, struct sk_buff *skb)
336{
337 struct hci_rp_read_class_of_dev *rp = (void *) skb->data;
338
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300339 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200340
341 if (rp->status)
342 return;
343
344 memcpy(hdev->dev_class, rp->dev_class, 3);
345
346 BT_DBG("%s class 0x%.2x%.2x%.2x", hdev->name,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300347 hdev->dev_class[2], hdev->dev_class[1], hdev->dev_class[0]);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200348}
349
350static void hci_cc_write_class_of_dev(struct hci_dev *hdev, struct sk_buff *skb)
351{
352 __u8 status = *((__u8 *) skb->data);
353 void *sent;
354
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300355 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200356
357 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_CLASS_OF_DEV);
358 if (!sent)
359 return;
360
Marcel Holtmann7f9a9032012-02-22 18:38:01 +0100361 hci_dev_lock(hdev);
362
363 if (status == 0)
364 memcpy(hdev->dev_class, sent, 3);
365
366 if (test_bit(HCI_MGMT, &hdev->dev_flags))
367 mgmt_set_class_of_dev_complete(hdev, sent, status);
368
369 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200370}
371
372static void hci_cc_read_voice_setting(struct hci_dev *hdev, struct sk_buff *skb)
373{
374 struct hci_rp_read_voice_setting *rp = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700375 __u16 setting;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200376
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300377 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200378
379 if (rp->status)
380 return;
381
382 setting = __le16_to_cpu(rp->voice_setting);
383
Marcel Holtmannf383f272008-07-14 20:13:47 +0200384 if (hdev->voice_setting == setting)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200385 return;
386
387 hdev->voice_setting = setting;
388
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300389 BT_DBG("%s voice setting 0x%4.4x", hdev->name, setting);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200390
Gustavo F. Padovan3c547112011-12-14 22:58:44 -0200391 if (hdev->notify)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200392 hdev->notify(hdev, HCI_NOTIFY_VOICE_SETTING);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200393}
394
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300395static void hci_cc_write_voice_setting(struct hci_dev *hdev,
396 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200397{
398 __u8 status = *((__u8 *) skb->data);
Marcel Holtmannf383f272008-07-14 20:13:47 +0200399 __u16 setting;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700400 void *sent;
401
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300402 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700403
Marcel Holtmannf383f272008-07-14 20:13:47 +0200404 if (status)
405 return;
406
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200407 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_VOICE_SETTING);
408 if (!sent)
409 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700410
Marcel Holtmannf383f272008-07-14 20:13:47 +0200411 setting = get_unaligned_le16(sent);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700412
Marcel Holtmannf383f272008-07-14 20:13:47 +0200413 if (hdev->voice_setting == setting)
414 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700415
Marcel Holtmannf383f272008-07-14 20:13:47 +0200416 hdev->voice_setting = setting;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700417
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300418 BT_DBG("%s voice setting 0x%4.4x", hdev->name, setting);
Marcel Holtmannf383f272008-07-14 20:13:47 +0200419
Gustavo F. Padovan3c547112011-12-14 22:58:44 -0200420 if (hdev->notify)
Marcel Holtmannf383f272008-07-14 20:13:47 +0200421 hdev->notify(hdev, HCI_NOTIFY_VOICE_SETTING);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700422}
423
Marcel Holtmannb4cb9fb2013-10-14 13:56:16 -0700424static void hci_cc_read_num_supported_iac(struct hci_dev *hdev,
425 struct sk_buff *skb)
426{
427 struct hci_rp_read_num_supported_iac *rp = (void *) skb->data;
428
429 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
430
431 if (rp->status)
432 return;
433
434 hdev->num_iac = rp->num_iac;
435
436 BT_DBG("%s num iac %d", hdev->name, hdev->num_iac);
437}
438
Marcel Holtmann333140b2008-07-14 20:13:48 +0200439static void hci_cc_write_ssp_mode(struct hci_dev *hdev, struct sk_buff *skb)
440{
441 __u8 status = *((__u8 *) skb->data);
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300442 struct hci_cp_write_ssp_mode *sent;
Marcel Holtmann333140b2008-07-14 20:13:48 +0200443
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300444 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann333140b2008-07-14 20:13:48 +0200445
Marcel Holtmann333140b2008-07-14 20:13:48 +0200446 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SSP_MODE);
447 if (!sent)
448 return;
449
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530450 hci_dev_lock(hdev);
451
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300452 if (!status) {
453 if (sent->mode)
Johan Hedbergcad718e2013-04-17 15:00:51 +0300454 hdev->features[1][0] |= LMP_HOST_SSP;
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300455 else
Johan Hedbergcad718e2013-04-17 15:00:51 +0300456 hdev->features[1][0] &= ~LMP_HOST_SSP;
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300457 }
458
Johan Hedberged2c4ee2012-02-17 00:56:28 +0200459 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300460 mgmt_ssp_enable_complete(hdev, sent->mode, status);
Johan Hedbergc0ecddc2012-02-22 12:38:31 +0200461 else if (!status) {
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300462 if (sent->mode)
Johan Hedbergc0ecddc2012-02-22 12:38:31 +0200463 set_bit(HCI_SSP_ENABLED, &hdev->dev_flags);
464 else
465 clear_bit(HCI_SSP_ENABLED, &hdev->dev_flags);
466 }
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530467
468 hci_dev_unlock(hdev);
Marcel Holtmann333140b2008-07-14 20:13:48 +0200469}
470
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800471static void hci_cc_write_sc_support(struct hci_dev *hdev, struct sk_buff *skb)
472{
473 u8 status = *((u8 *) skb->data);
474 struct hci_cp_write_sc_support *sent;
475
476 BT_DBG("%s status 0x%2.2x", hdev->name, status);
477
478 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SC_SUPPORT);
479 if (!sent)
480 return;
481
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530482 hci_dev_lock(hdev);
483
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800484 if (!status) {
485 if (sent->support)
486 hdev->features[1][0] |= LMP_HOST_SC;
487 else
488 hdev->features[1][0] &= ~LMP_HOST_SC;
489 }
490
491 if (test_bit(HCI_MGMT, &hdev->dev_flags))
492 mgmt_sc_enable_complete(hdev, sent->support, status);
493 else if (!status) {
494 if (sent->support)
495 set_bit(HCI_SC_ENABLED, &hdev->dev_flags);
496 else
497 clear_bit(HCI_SC_ENABLED, &hdev->dev_flags);
498 }
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530499
500 hci_dev_unlock(hdev);
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800501}
502
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200503static void hci_cc_read_local_version(struct hci_dev *hdev, struct sk_buff *skb)
504{
505 struct hci_rp_read_local_version *rp = (void *) skb->data;
506
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300507 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200508
509 if (rp->status)
Johan Hedberg42c6b122013-03-05 20:37:49 +0200510 return;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200511
Marcel Holtmann0d5551f2013-10-18 12:04:50 -0700512 if (test_bit(HCI_SETUP, &hdev->dev_flags)) {
513 hdev->hci_ver = rp->hci_ver;
514 hdev->hci_rev = __le16_to_cpu(rp->hci_rev);
515 hdev->lmp_ver = rp->lmp_ver;
516 hdev->manufacturer = __le16_to_cpu(rp->manufacturer);
517 hdev->lmp_subver = __le16_to_cpu(rp->lmp_subver);
518 }
Johan Hedbergd5859e22011-01-25 01:19:58 +0200519}
520
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300521static void hci_cc_read_local_commands(struct hci_dev *hdev,
522 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200523{
524 struct hci_rp_read_local_commands *rp = (void *) skb->data;
525
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300526 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200527
Marcel Holtmann6a070e62013-10-31 04:54:33 -0700528 if (rp->status)
529 return;
530
531 if (test_bit(HCI_SETUP, &hdev->dev_flags))
Johan Hedberg2177bab2013-03-05 20:37:43 +0200532 memcpy(hdev->commands, rp->commands, sizeof(hdev->commands));
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200533}
534
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300535static void hci_cc_read_local_features(struct hci_dev *hdev,
536 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200537{
538 struct hci_rp_read_local_features *rp = (void *) skb->data;
539
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300540 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200541
542 if (rp->status)
543 return;
544
545 memcpy(hdev->features, rp->features, 8);
546
547 /* Adjust default settings according to features
548 * supported by device. */
549
Johan Hedbergcad718e2013-04-17 15:00:51 +0300550 if (hdev->features[0][0] & LMP_3SLOT)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200551 hdev->pkt_type |= (HCI_DM3 | HCI_DH3);
552
Johan Hedbergcad718e2013-04-17 15:00:51 +0300553 if (hdev->features[0][0] & LMP_5SLOT)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200554 hdev->pkt_type |= (HCI_DM5 | HCI_DH5);
555
Johan Hedbergcad718e2013-04-17 15:00:51 +0300556 if (hdev->features[0][1] & LMP_HV2) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200557 hdev->pkt_type |= (HCI_HV2);
558 hdev->esco_type |= (ESCO_HV2);
559 }
560
Johan Hedbergcad718e2013-04-17 15:00:51 +0300561 if (hdev->features[0][1] & LMP_HV3) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200562 hdev->pkt_type |= (HCI_HV3);
563 hdev->esco_type |= (ESCO_HV3);
564 }
565
Andre Guedes45db810f2012-07-24 15:03:49 -0300566 if (lmp_esco_capable(hdev))
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200567 hdev->esco_type |= (ESCO_EV3);
568
Johan Hedbergcad718e2013-04-17 15:00:51 +0300569 if (hdev->features[0][4] & LMP_EV4)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200570 hdev->esco_type |= (ESCO_EV4);
571
Johan Hedbergcad718e2013-04-17 15:00:51 +0300572 if (hdev->features[0][4] & LMP_EV5)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200573 hdev->esco_type |= (ESCO_EV5);
574
Johan Hedbergcad718e2013-04-17 15:00:51 +0300575 if (hdev->features[0][5] & LMP_EDR_ESCO_2M)
Marcel Holtmannefc76882009-02-06 09:13:37 +0100576 hdev->esco_type |= (ESCO_2EV3);
577
Johan Hedbergcad718e2013-04-17 15:00:51 +0300578 if (hdev->features[0][5] & LMP_EDR_ESCO_3M)
Marcel Holtmannefc76882009-02-06 09:13:37 +0100579 hdev->esco_type |= (ESCO_3EV3);
580
Johan Hedbergcad718e2013-04-17 15:00:51 +0300581 if (hdev->features[0][5] & LMP_EDR_3S_ESCO)
Marcel Holtmannefc76882009-02-06 09:13:37 +0100582 hdev->esco_type |= (ESCO_2EV5 | ESCO_3EV5);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200583}
584
Andre Guedes971e3a42011-06-30 19:20:52 -0300585static void hci_cc_read_local_ext_features(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300586 struct sk_buff *skb)
Andre Guedes971e3a42011-06-30 19:20:52 -0300587{
588 struct hci_rp_read_local_ext_features *rp = (void *) skb->data;
589
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300590 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andre Guedes971e3a42011-06-30 19:20:52 -0300591
592 if (rp->status)
Johan Hedberg42c6b122013-03-05 20:37:49 +0200593 return;
Andre Guedes971e3a42011-06-30 19:20:52 -0300594
Marcel Holtmann57af75a2013-10-18 12:04:47 -0700595 if (hdev->max_page < rp->max_page)
596 hdev->max_page = rp->max_page;
Johan Hedbergd2c5d772013-04-17 15:00:52 +0300597
Johan Hedbergcad718e2013-04-17 15:00:51 +0300598 if (rp->page < HCI_MAX_PAGES)
599 memcpy(hdev->features[rp->page], rp->features, 8);
Andre Guedes971e3a42011-06-30 19:20:52 -0300600}
601
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200602static void hci_cc_read_flow_control_mode(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300603 struct sk_buff *skb)
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200604{
605 struct hci_rp_read_flow_control_mode *rp = (void *) skb->data;
606
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300607 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200608
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200609 if (rp->status)
610 return;
611
612 hdev->flow_ctl_mode = rp->mode;
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200613}
614
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200615static void hci_cc_read_buffer_size(struct hci_dev *hdev, struct sk_buff *skb)
616{
617 struct hci_rp_read_buffer_size *rp = (void *) skb->data;
618
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300619 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200620
621 if (rp->status)
622 return;
623
624 hdev->acl_mtu = __le16_to_cpu(rp->acl_mtu);
625 hdev->sco_mtu = rp->sco_mtu;
626 hdev->acl_pkts = __le16_to_cpu(rp->acl_max_pkt);
627 hdev->sco_pkts = __le16_to_cpu(rp->sco_max_pkt);
628
629 if (test_bit(HCI_QUIRK_FIXUP_BUFFER_SIZE, &hdev->quirks)) {
630 hdev->sco_mtu = 64;
631 hdev->sco_pkts = 8;
632 }
633
634 hdev->acl_cnt = hdev->acl_pkts;
635 hdev->sco_cnt = hdev->sco_pkts;
636
Gustavo Padovan807deac2012-05-17 00:36:24 -0300637 BT_DBG("%s acl mtu %d:%d sco mtu %d:%d", hdev->name, hdev->acl_mtu,
638 hdev->acl_pkts, hdev->sco_mtu, hdev->sco_pkts);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200639}
640
641static void hci_cc_read_bd_addr(struct hci_dev *hdev, struct sk_buff *skb)
642{
643 struct hci_rp_read_bd_addr *rp = (void *) skb->data;
644
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300645 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200646
Marcel Holtmanne30d3f52014-07-05 10:48:03 +0200647 if (rp->status)
648 return;
649
650 if (test_bit(HCI_INIT, &hdev->flags))
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200651 bacpy(&hdev->bdaddr, &rp->bdaddr);
Marcel Holtmanne30d3f52014-07-05 10:48:03 +0200652
653 if (test_bit(HCI_SETUP, &hdev->dev_flags))
654 bacpy(&hdev->setup_addr, &rp->bdaddr);
Johan Hedberg23bb5762010-12-21 23:01:27 +0200655}
656
Johan Hedbergf332ec62013-03-15 17:07:11 -0500657static void hci_cc_read_page_scan_activity(struct hci_dev *hdev,
658 struct sk_buff *skb)
659{
660 struct hci_rp_read_page_scan_activity *rp = (void *) skb->data;
661
662 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
663
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200664 if (rp->status)
665 return;
666
667 if (test_bit(HCI_INIT, &hdev->flags)) {
Johan Hedbergf332ec62013-03-15 17:07:11 -0500668 hdev->page_scan_interval = __le16_to_cpu(rp->interval);
669 hdev->page_scan_window = __le16_to_cpu(rp->window);
670 }
671}
672
Johan Hedberg4a3ee762013-03-15 17:07:12 -0500673static void hci_cc_write_page_scan_activity(struct hci_dev *hdev,
674 struct sk_buff *skb)
675{
676 u8 status = *((u8 *) skb->data);
677 struct hci_cp_write_page_scan_activity *sent;
678
679 BT_DBG("%s status 0x%2.2x", hdev->name, status);
680
681 if (status)
682 return;
683
684 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY);
685 if (!sent)
686 return;
687
688 hdev->page_scan_interval = __le16_to_cpu(sent->interval);
689 hdev->page_scan_window = __le16_to_cpu(sent->window);
690}
691
Johan Hedbergf332ec62013-03-15 17:07:11 -0500692static void hci_cc_read_page_scan_type(struct hci_dev *hdev,
693 struct sk_buff *skb)
694{
695 struct hci_rp_read_page_scan_type *rp = (void *) skb->data;
696
697 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
698
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200699 if (rp->status)
700 return;
701
702 if (test_bit(HCI_INIT, &hdev->flags))
Johan Hedbergf332ec62013-03-15 17:07:11 -0500703 hdev->page_scan_type = rp->type;
704}
705
Johan Hedberg4a3ee762013-03-15 17:07:12 -0500706static void hci_cc_write_page_scan_type(struct hci_dev *hdev,
707 struct sk_buff *skb)
708{
709 u8 status = *((u8 *) skb->data);
710 u8 *type;
711
712 BT_DBG("%s status 0x%2.2x", hdev->name, status);
713
714 if (status)
715 return;
716
717 type = hci_sent_cmd_data(hdev, HCI_OP_WRITE_PAGE_SCAN_TYPE);
718 if (type)
719 hdev->page_scan_type = *type;
720}
721
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200722static void hci_cc_read_data_block_size(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300723 struct sk_buff *skb)
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200724{
725 struct hci_rp_read_data_block_size *rp = (void *) skb->data;
726
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300727 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200728
729 if (rp->status)
730 return;
731
732 hdev->block_mtu = __le16_to_cpu(rp->max_acl_len);
733 hdev->block_len = __le16_to_cpu(rp->block_len);
734 hdev->num_blocks = __le16_to_cpu(rp->num_blocks);
735
736 hdev->block_cnt = hdev->num_blocks;
737
738 BT_DBG("%s blk mtu %d cnt %d len %d", hdev->name, hdev->block_mtu,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300739 hdev->block_cnt, hdev->block_len);
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200740}
741
Johan Hedberg33f35722014-06-28 17:54:06 +0300742static void hci_cc_read_clock(struct hci_dev *hdev, struct sk_buff *skb)
743{
744 struct hci_rp_read_clock *rp = (void *) skb->data;
745 struct hci_cp_read_clock *cp;
746 struct hci_conn *conn;
747
748 BT_DBG("%s", hdev->name);
749
750 if (skb->len < sizeof(*rp))
751 return;
752
753 if (rp->status)
754 return;
755
756 hci_dev_lock(hdev);
757
758 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_CLOCK);
759 if (!cp)
760 goto unlock;
761
762 if (cp->which == 0x00) {
763 hdev->clock = le32_to_cpu(rp->clock);
764 goto unlock;
765 }
766
767 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
768 if (conn) {
769 conn->clock = le32_to_cpu(rp->clock);
770 conn->clock_accuracy = le16_to_cpu(rp->accuracy);
771 }
772
773unlock:
774 hci_dev_unlock(hdev);
775}
776
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300777static void hci_cc_read_local_amp_info(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300778 struct sk_buff *skb)
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300779{
780 struct hci_rp_read_local_amp_info *rp = (void *) skb->data;
781
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300782 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300783
784 if (rp->status)
Andrei Emeltchenko8e2a0d92012-09-27 17:26:08 +0300785 goto a2mp_rsp;
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300786
787 hdev->amp_status = rp->amp_status;
788 hdev->amp_total_bw = __le32_to_cpu(rp->total_bw);
789 hdev->amp_max_bw = __le32_to_cpu(rp->max_bw);
790 hdev->amp_min_latency = __le32_to_cpu(rp->min_latency);
791 hdev->amp_max_pdu = __le32_to_cpu(rp->max_pdu);
792 hdev->amp_type = rp->amp_type;
793 hdev->amp_pal_cap = __le16_to_cpu(rp->pal_cap);
794 hdev->amp_assoc_size = __le16_to_cpu(rp->max_assoc_size);
795 hdev->amp_be_flush_to = __le32_to_cpu(rp->be_flush_to);
796 hdev->amp_max_flush_to = __le32_to_cpu(rp->max_flush_to);
797
Andrei Emeltchenko8e2a0d92012-09-27 17:26:08 +0300798a2mp_rsp:
799 a2mp_send_getinfo_rsp(hdev);
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300800}
801
Andrei Emeltchenko903e4542012-09-27 17:26:09 +0300802static void hci_cc_read_local_amp_assoc(struct hci_dev *hdev,
803 struct sk_buff *skb)
804{
805 struct hci_rp_read_local_amp_assoc *rp = (void *) skb->data;
806 struct amp_assoc *assoc = &hdev->loc_assoc;
807 size_t rem_len, frag_len;
808
809 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
810
811 if (rp->status)
812 goto a2mp_rsp;
813
814 frag_len = skb->len - sizeof(*rp);
815 rem_len = __le16_to_cpu(rp->rem_len);
816
817 if (rem_len > frag_len) {
Andrei Emeltchenko2e430be32012-09-28 14:44:23 +0300818 BT_DBG("frag_len %zu rem_len %zu", frag_len, rem_len);
Andrei Emeltchenko903e4542012-09-27 17:26:09 +0300819
820 memcpy(assoc->data + assoc->offset, rp->frag, frag_len);
821 assoc->offset += frag_len;
822
823 /* Read other fragments */
824 amp_read_loc_assoc_frag(hdev, rp->phy_handle);
825
826 return;
827 }
828
829 memcpy(assoc->data + assoc->offset, rp->frag, rem_len);
830 assoc->len = assoc->offset + rem_len;
831 assoc->offset = 0;
832
833a2mp_rsp:
834 /* Send A2MP Rsp when all fragments are received */
835 a2mp_send_getampassoc_rsp(hdev, rp->status);
Andrei Emeltchenko9495b2e2012-09-27 17:26:22 +0300836 a2mp_send_create_phy_link_req(hdev, rp->status);
Andrei Emeltchenko903e4542012-09-27 17:26:09 +0300837}
838
Johan Hedbergd5859e22011-01-25 01:19:58 +0200839static void hci_cc_read_inq_rsp_tx_power(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300840 struct sk_buff *skb)
Johan Hedbergd5859e22011-01-25 01:19:58 +0200841{
Marcel Holtmann91c4e9b2012-03-11 19:27:21 -0700842 struct hci_rp_read_inq_rsp_tx_power *rp = (void *) skb->data;
Johan Hedbergd5859e22011-01-25 01:19:58 +0200843
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300844 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedbergd5859e22011-01-25 01:19:58 +0200845
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200846 if (rp->status)
847 return;
848
849 hdev->inq_tx_power = rp->tx_power;
Johan Hedbergd5859e22011-01-25 01:19:58 +0200850}
851
Johan Hedberg980e1a52011-01-22 06:10:07 +0200852static void hci_cc_pin_code_reply(struct hci_dev *hdev, struct sk_buff *skb)
853{
854 struct hci_rp_pin_code_reply *rp = (void *) skb->data;
855 struct hci_cp_pin_code_reply *cp;
856 struct hci_conn *conn;
857
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300858 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200859
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200860 hci_dev_lock(hdev);
861
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200862 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg744cf192011-11-08 20:40:14 +0200863 mgmt_pin_code_reply_complete(hdev, &rp->bdaddr, rp->status);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200864
Mikel Astizfa1bd912012-08-09 09:52:29 +0200865 if (rp->status)
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200866 goto unlock;
Johan Hedberg980e1a52011-01-22 06:10:07 +0200867
868 cp = hci_sent_cmd_data(hdev, HCI_OP_PIN_CODE_REPLY);
869 if (!cp)
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200870 goto unlock;
Johan Hedberg980e1a52011-01-22 06:10:07 +0200871
872 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
873 if (conn)
874 conn->pin_length = cp->pin_len;
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200875
876unlock:
877 hci_dev_unlock(hdev);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200878}
879
880static void hci_cc_pin_code_neg_reply(struct hci_dev *hdev, struct sk_buff *skb)
881{
882 struct hci_rp_pin_code_neg_reply *rp = (void *) skb->data;
883
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300884 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200885
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200886 hci_dev_lock(hdev);
887
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200888 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg744cf192011-11-08 20:40:14 +0200889 mgmt_pin_code_neg_reply_complete(hdev, &rp->bdaddr,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300890 rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200891
892 hci_dev_unlock(hdev);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200893}
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200894
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300895static void hci_cc_le_read_buffer_size(struct hci_dev *hdev,
896 struct sk_buff *skb)
897{
898 struct hci_rp_le_read_buffer_size *rp = (void *) skb->data;
899
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300900 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300901
902 if (rp->status)
903 return;
904
905 hdev->le_mtu = __le16_to_cpu(rp->le_mtu);
906 hdev->le_pkts = rp->le_max_pkt;
907
908 hdev->le_cnt = hdev->le_pkts;
909
910 BT_DBG("%s le mtu %d:%d", hdev->name, hdev->le_mtu, hdev->le_pkts);
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300911}
Johan Hedberg980e1a52011-01-22 06:10:07 +0200912
Johan Hedberg60e77322013-01-22 14:01:59 +0200913static void hci_cc_le_read_local_features(struct hci_dev *hdev,
914 struct sk_buff *skb)
915{
916 struct hci_rp_le_read_local_features *rp = (void *) skb->data;
917
918 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
919
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200920 if (rp->status)
921 return;
922
923 memcpy(hdev->le_features, rp->features, 8);
Johan Hedberg60e77322013-01-22 14:01:59 +0200924}
925
Johan Hedberg8fa19092012-10-19 20:57:49 +0300926static void hci_cc_le_read_adv_tx_power(struct hci_dev *hdev,
927 struct sk_buff *skb)
928{
929 struct hci_rp_le_read_adv_tx_power *rp = (void *) skb->data;
930
931 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
932
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200933 if (rp->status)
934 return;
935
936 hdev->adv_tx_power = rp->tx_power;
Johan Hedberg8fa19092012-10-19 20:57:49 +0300937}
938
Johan Hedberga5c29682011-02-19 12:05:57 -0300939static void hci_cc_user_confirm_reply(struct hci_dev *hdev, struct sk_buff *skb)
940{
941 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
942
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300943 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberga5c29682011-02-19 12:05:57 -0300944
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200945 hci_dev_lock(hdev);
946
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200947 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300948 mgmt_user_confirm_reply_complete(hdev, &rp->bdaddr, ACL_LINK, 0,
949 rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200950
951 hci_dev_unlock(hdev);
Johan Hedberga5c29682011-02-19 12:05:57 -0300952}
953
954static void hci_cc_user_confirm_neg_reply(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300955 struct sk_buff *skb)
Johan Hedberga5c29682011-02-19 12:05:57 -0300956{
957 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
958
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300959 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberga5c29682011-02-19 12:05:57 -0300960
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200961 hci_dev_lock(hdev);
962
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200963 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg744cf192011-11-08 20:40:14 +0200964 mgmt_user_confirm_neg_reply_complete(hdev, &rp->bdaddr,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300965 ACL_LINK, 0, rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200966
967 hci_dev_unlock(hdev);
Johan Hedberga5c29682011-02-19 12:05:57 -0300968}
969
Brian Gix1143d452011-11-23 08:28:34 -0800970static void hci_cc_user_passkey_reply(struct hci_dev *hdev, struct sk_buff *skb)
971{
972 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
973
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300974 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -0800975
976 hci_dev_lock(hdev);
977
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200978 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg272d90d2012-02-09 15:26:12 +0200979 mgmt_user_passkey_reply_complete(hdev, &rp->bdaddr, ACL_LINK,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300980 0, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -0800981
982 hci_dev_unlock(hdev);
983}
984
985static void hci_cc_user_passkey_neg_reply(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300986 struct sk_buff *skb)
Brian Gix1143d452011-11-23 08:28:34 -0800987{
988 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
989
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300990 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -0800991
992 hci_dev_lock(hdev);
993
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200994 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Brian Gix1143d452011-11-23 08:28:34 -0800995 mgmt_user_passkey_neg_reply_complete(hdev, &rp->bdaddr,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300996 ACL_LINK, 0, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -0800997
998 hci_dev_unlock(hdev);
999}
1000
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08001001static void hci_cc_read_local_oob_data(struct hci_dev *hdev,
1002 struct sk_buff *skb)
Szymon Jancc35938b2011-03-22 13:12:21 +01001003{
1004 struct hci_rp_read_local_oob_data *rp = (void *) skb->data;
1005
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001006 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Szymon Jancc35938b2011-03-22 13:12:21 +01001007
Johan Hedberg56e5cb82011-11-08 20:40:16 +02001008 hci_dev_lock(hdev);
Johan Hedberg38da1702014-11-17 20:52:20 +02001009 mgmt_read_local_oob_data_complete(hdev, rp->hash, rp->rand, NULL, NULL,
1010 rp->status);
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08001011 hci_dev_unlock(hdev);
1012}
1013
1014static void hci_cc_read_local_oob_ext_data(struct hci_dev *hdev,
1015 struct sk_buff *skb)
1016{
1017 struct hci_rp_read_local_oob_ext_data *rp = (void *) skb->data;
1018
1019 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1020
1021 hci_dev_lock(hdev);
Johan Hedberg38da1702014-11-17 20:52:20 +02001022 mgmt_read_local_oob_data_complete(hdev, rp->hash192, rp->rand192,
1023 rp->hash256, rp->rand256,
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08001024 rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +02001025 hci_dev_unlock(hdev);
Szymon Jancc35938b2011-03-22 13:12:21 +01001026}
1027
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08001028
1029static void hci_cc_le_set_random_addr(struct hci_dev *hdev, struct sk_buff *skb)
1030{
1031 __u8 status = *((__u8 *) skb->data);
1032 bdaddr_t *sent;
1033
1034 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1035
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001036 if (status)
1037 return;
1038
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08001039 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_RANDOM_ADDR);
1040 if (!sent)
1041 return;
1042
1043 hci_dev_lock(hdev);
1044
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001045 bacpy(&hdev->random_addr, sent);
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08001046
1047 hci_dev_unlock(hdev);
1048}
1049
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001050static void hci_cc_le_set_adv_enable(struct hci_dev *hdev, struct sk_buff *skb)
1051{
1052 __u8 *sent, status = *((__u8 *) skb->data);
1053
1054 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1055
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001056 if (status)
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001057 return;
1058
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001059 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADV_ENABLE);
1060 if (!sent)
Johan Hedberg3c857752014-03-25 10:30:49 +02001061 return;
1062
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001063 hci_dev_lock(hdev);
1064
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001065 /* If we're doing connection initiation as peripheral. Set a
Johan Hedberg3c857752014-03-25 10:30:49 +02001066 * timeout in case something goes wrong.
1067 */
1068 if (*sent) {
1069 struct hci_conn *conn;
1070
Johan Hedberg66c417c2014-07-08 15:07:47 +03001071 set_bit(HCI_LE_ADV, &hdev->dev_flags);
1072
Johan Hedberg3c857752014-03-25 10:30:49 +02001073 conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
1074 if (conn)
1075 queue_delayed_work(hdev->workqueue,
1076 &conn->le_conn_timeout,
Johan Hedberg09ae2602014-07-06 13:41:15 +03001077 conn->conn_timeout);
Johan Hedberg66c417c2014-07-08 15:07:47 +03001078 } else {
1079 clear_bit(HCI_LE_ADV, &hdev->dev_flags);
Johan Hedberg3c857752014-03-25 10:30:49 +02001080 }
1081
Johan Hedberg04b4edc2013-03-15 17:07:01 -05001082 hci_dev_unlock(hdev);
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001083}
1084
Marcel Holtmann533553f2014-03-21 12:18:10 -07001085static void hci_cc_le_set_scan_param(struct hci_dev *hdev, struct sk_buff *skb)
1086{
1087 struct hci_cp_le_set_scan_param *cp;
1088 __u8 status = *((__u8 *) skb->data);
1089
1090 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1091
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001092 if (status)
1093 return;
1094
Marcel Holtmann533553f2014-03-21 12:18:10 -07001095 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_PARAM);
1096 if (!cp)
1097 return;
1098
1099 hci_dev_lock(hdev);
1100
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001101 hdev->le_scan_type = cp->type;
Marcel Holtmann533553f2014-03-21 12:18:10 -07001102
1103 hci_dev_unlock(hdev);
1104}
1105
Johan Hedbergb9a63282014-03-25 10:51:52 +02001106static bool has_pending_adv_report(struct hci_dev *hdev)
1107{
1108 struct discovery_state *d = &hdev->discovery;
1109
1110 return bacmp(&d->last_adv_addr, BDADDR_ANY);
1111}
1112
1113static void clear_pending_adv_report(struct hci_dev *hdev)
1114{
1115 struct discovery_state *d = &hdev->discovery;
1116
1117 bacpy(&d->last_adv_addr, BDADDR_ANY);
1118 d->last_adv_data_len = 0;
1119}
1120
1121static void store_pending_adv_report(struct hci_dev *hdev, bdaddr_t *bdaddr,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001122 u8 bdaddr_type, s8 rssi, u32 flags,
1123 u8 *data, u8 len)
Johan Hedbergb9a63282014-03-25 10:51:52 +02001124{
1125 struct discovery_state *d = &hdev->discovery;
1126
1127 bacpy(&d->last_adv_addr, bdaddr);
1128 d->last_adv_addr_type = bdaddr_type;
Johan Hedbergff5cd292014-03-25 14:40:52 +02001129 d->last_adv_rssi = rssi;
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001130 d->last_adv_flags = flags;
Johan Hedbergb9a63282014-03-25 10:51:52 +02001131 memcpy(d->last_adv_data, data, len);
1132 d->last_adv_data_len = len;
1133}
1134
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001135static void hci_cc_le_set_scan_enable(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -03001136 struct sk_buff *skb)
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001137{
1138 struct hci_cp_le_set_scan_enable *cp;
1139 __u8 status = *((__u8 *) skb->data);
1140
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001141 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001142
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001143 if (status)
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001144 return;
1145
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001146 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_ENABLE);
1147 if (!cp)
Andre Guedes3fd319b2013-04-30 15:29:36 -03001148 return;
1149
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301150 hci_dev_lock(hdev);
1151
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001152 switch (cp->enable) {
Andre Guedes76a388b2013-04-04 20:21:02 -03001153 case LE_SCAN_ENABLE:
Andre Guedesd23264a2011-11-25 20:53:38 -03001154 set_bit(HCI_LE_SCAN, &hdev->dev_flags);
Johan Hedbergb9a63282014-03-25 10:51:52 +02001155 if (hdev->le_scan_type == LE_SCAN_ACTIVE)
1156 clear_pending_adv_report(hdev);
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001157 break;
1158
Andre Guedes76a388b2013-04-04 20:21:02 -03001159 case LE_SCAN_DISABLE:
Johan Hedbergb9a63282014-03-25 10:51:52 +02001160 /* We do this here instead of when setting DISCOVERY_STOPPED
1161 * since the latter would potentially require waiting for
1162 * inquiry to stop too.
1163 */
1164 if (has_pending_adv_report(hdev)) {
1165 struct discovery_state *d = &hdev->discovery;
1166
1167 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergab0aa432014-03-26 14:17:12 +02001168 d->last_adv_addr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001169 d->last_adv_rssi, d->last_adv_flags,
Johan Hedbergab0aa432014-03-26 14:17:12 +02001170 d->last_adv_data,
Johan Hedbergb9a63282014-03-25 10:51:52 +02001171 d->last_adv_data_len, NULL, 0);
1172 }
1173
Johan Hedberg317ac8c2014-02-28 20:26:12 +02001174 /* Cancel this timer so that we don't try to disable scanning
1175 * when it's already disabled.
1176 */
1177 cancel_delayed_work(&hdev->le_scan_disable);
1178
Andre Guedesd23264a2011-11-25 20:53:38 -03001179 clear_bit(HCI_LE_SCAN, &hdev->dev_flags);
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001180
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001181 /* The HCI_LE_SCAN_INTERRUPTED flag indicates that we
1182 * interrupted scanning due to a connect request. Mark
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001183 * therefore discovery as stopped. If this was not
1184 * because of a connect request advertising might have
1185 * been disabled because of active scanning, so
1186 * re-enable it again if necessary.
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001187 */
1188 if (test_and_clear_bit(HCI_LE_SCAN_INTERRUPTED,
1189 &hdev->dev_flags))
1190 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001191 else if (!test_bit(HCI_LE_ADV, &hdev->dev_flags) &&
Johan Hedberg34722272014-07-08 16:05:05 +03001192 hdev->discovery.state == DISCOVERY_FINDING)
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001193 mgmt_reenable_advertising(hdev);
1194
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001195 break;
1196
1197 default:
1198 BT_ERR("Used reserved LE_Scan_Enable param %d", cp->enable);
1199 break;
Andre Guedes35815082011-05-26 16:23:53 -03001200 }
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301201
1202 hci_dev_unlock(hdev);
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001203}
1204
Johan Hedbergcf1d0812013-01-22 14:02:00 +02001205static void hci_cc_le_read_white_list_size(struct hci_dev *hdev,
1206 struct sk_buff *skb)
1207{
1208 struct hci_rp_le_read_white_list_size *rp = (void *) skb->data;
1209
1210 BT_DBG("%s status 0x%2.2x size %u", hdev->name, rp->status, rp->size);
1211
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001212 if (rp->status)
1213 return;
1214
1215 hdev->le_white_list_size = rp->size;
Johan Hedbergcf1d0812013-01-22 14:02:00 +02001216}
1217
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001218static void hci_cc_le_clear_white_list(struct hci_dev *hdev,
1219 struct sk_buff *skb)
1220{
1221 __u8 status = *((__u8 *) skb->data);
1222
1223 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1224
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001225 if (status)
1226 return;
1227
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001228 hci_bdaddr_list_clear(&hdev->le_white_list);
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001229}
1230
1231static void hci_cc_le_add_to_white_list(struct hci_dev *hdev,
1232 struct sk_buff *skb)
1233{
1234 struct hci_cp_le_add_to_white_list *sent;
1235 __u8 status = *((__u8 *) skb->data);
1236
1237 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1238
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001239 if (status)
1240 return;
1241
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001242 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_ADD_TO_WHITE_LIST);
1243 if (!sent)
1244 return;
1245
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001246 hci_bdaddr_list_add(&hdev->le_white_list, &sent->bdaddr,
1247 sent->bdaddr_type);
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001248}
1249
1250static void hci_cc_le_del_from_white_list(struct hci_dev *hdev,
1251 struct sk_buff *skb)
1252{
1253 struct hci_cp_le_del_from_white_list *sent;
1254 __u8 status = *((__u8 *) skb->data);
1255
1256 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1257
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001258 if (status)
1259 return;
1260
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001261 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_DEL_FROM_WHITE_LIST);
1262 if (!sent)
1263 return;
1264
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001265 hci_bdaddr_list_del(&hdev->le_white_list, &sent->bdaddr,
1266 sent->bdaddr_type);
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001267}
1268
Johan Hedberg9b008c02013-01-22 14:02:01 +02001269static void hci_cc_le_read_supported_states(struct hci_dev *hdev,
1270 struct sk_buff *skb)
1271{
1272 struct hci_rp_le_read_supported_states *rp = (void *) skb->data;
1273
1274 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1275
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001276 if (rp->status)
1277 return;
1278
1279 memcpy(hdev->le_states, rp->le_states, 8);
Johan Hedberg9b008c02013-01-22 14:02:01 +02001280}
1281
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001282static void hci_cc_write_le_host_supported(struct hci_dev *hdev,
1283 struct sk_buff *skb)
Andre Guedesf9b49302011-06-30 19:20:53 -03001284{
Johan Hedberg06199cf2012-02-22 16:37:11 +02001285 struct hci_cp_write_le_host_supported *sent;
Andre Guedesf9b49302011-06-30 19:20:53 -03001286 __u8 status = *((__u8 *) skb->data);
1287
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001288 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedesf9b49302011-06-30 19:20:53 -03001289
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001290 if (status)
1291 return;
1292
Johan Hedberg06199cf2012-02-22 16:37:11 +02001293 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LE_HOST_SUPPORTED);
Johan Hedberg8f984df2012-02-28 01:07:22 +02001294 if (!sent)
Andre Guedesf9b49302011-06-30 19:20:53 -03001295 return;
1296
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301297 hci_dev_lock(hdev);
1298
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001299 if (sent->le) {
1300 hdev->features[1][0] |= LMP_HOST_LE;
1301 set_bit(HCI_LE_ENABLED, &hdev->dev_flags);
1302 } else {
1303 hdev->features[1][0] &= ~LMP_HOST_LE;
1304 clear_bit(HCI_LE_ENABLED, &hdev->dev_flags);
1305 clear_bit(HCI_ADVERTISING, &hdev->dev_flags);
Johan Hedberg8f984df2012-02-28 01:07:22 +02001306 }
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001307
1308 if (sent->simul)
1309 hdev->features[1][0] |= LMP_HOST_LE_BREDR;
1310 else
1311 hdev->features[1][0] &= ~LMP_HOST_LE_BREDR;
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301312
1313 hci_dev_unlock(hdev);
Andre Guedesf9b49302011-06-30 19:20:53 -03001314}
1315
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02001316static void hci_cc_set_adv_param(struct hci_dev *hdev, struct sk_buff *skb)
1317{
1318 struct hci_cp_le_set_adv_param *cp;
1319 u8 status = *((u8 *) skb->data);
1320
1321 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1322
1323 if (status)
1324 return;
1325
1326 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADV_PARAM);
1327 if (!cp)
1328 return;
1329
1330 hci_dev_lock(hdev);
1331 hdev->adv_addr_type = cp->own_address_type;
1332 hci_dev_unlock(hdev);
1333}
1334
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001335static void hci_cc_write_remote_amp_assoc(struct hci_dev *hdev,
1336 struct sk_buff *skb)
1337{
1338 struct hci_rp_write_remote_amp_assoc *rp = (void *) skb->data;
1339
1340 BT_DBG("%s status 0x%2.2x phy_handle 0x%2.2x",
1341 hdev->name, rp->status, rp->phy_handle);
1342
1343 if (rp->status)
1344 return;
1345
1346 amp_write_rem_assoc_continue(hdev, rp->phy_handle);
1347}
1348
Andrzej Kaczmarek5ae76a92014-05-08 15:32:08 +02001349static void hci_cc_read_rssi(struct hci_dev *hdev, struct sk_buff *skb)
1350{
1351 struct hci_rp_read_rssi *rp = (void *) skb->data;
1352 struct hci_conn *conn;
1353
1354 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1355
1356 if (rp->status)
1357 return;
1358
1359 hci_dev_lock(hdev);
1360
1361 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
1362 if (conn)
1363 conn->rssi = rp->rssi;
1364
1365 hci_dev_unlock(hdev);
1366}
1367
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001368static void hci_cc_read_tx_power(struct hci_dev *hdev, struct sk_buff *skb)
1369{
1370 struct hci_cp_read_tx_power *sent;
1371 struct hci_rp_read_tx_power *rp = (void *) skb->data;
1372 struct hci_conn *conn;
1373
1374 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1375
1376 if (rp->status)
1377 return;
1378
1379 sent = hci_sent_cmd_data(hdev, HCI_OP_READ_TX_POWER);
1380 if (!sent)
1381 return;
1382
1383 hci_dev_lock(hdev);
1384
1385 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
Andrzej Kaczmarekd0455ed2014-05-14 13:43:05 +02001386 if (!conn)
1387 goto unlock;
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001388
Andrzej Kaczmarekd0455ed2014-05-14 13:43:05 +02001389 switch (sent->type) {
1390 case 0x00:
1391 conn->tx_power = rp->tx_power;
1392 break;
1393 case 0x01:
1394 conn->max_tx_power = rp->tx_power;
1395 break;
1396 }
1397
1398unlock:
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001399 hci_dev_unlock(hdev);
1400}
1401
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001402static void hci_cs_inquiry(struct hci_dev *hdev, __u8 status)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001403{
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001404 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001405
1406 if (status) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001407 hci_conn_check_pending(hdev);
Johan Hedberg314b2382011-04-27 10:29:57 -04001408 return;
1409 }
1410
Andre Guedes89352e72011-11-04 14:16:53 -03001411 set_bit(HCI_INQUIRY, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001412}
1413
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001414static void hci_cs_create_conn(struct hci_dev *hdev, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001415{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001416 struct hci_cp_create_conn *cp;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001417 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001418
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001419 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001420
1421 cp = hci_sent_cmd_data(hdev, HCI_OP_CREATE_CONN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001422 if (!cp)
1423 return;
1424
1425 hci_dev_lock(hdev);
1426
1427 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
1428
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03001429 BT_DBG("%s bdaddr %pMR hcon %p", hdev->name, &cp->bdaddr, conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001430
1431 if (status) {
1432 if (conn && conn->state == BT_CONNECT) {
Marcel Holtmann4c67bc72006-10-15 17:30:56 +02001433 if (status != 0x0c || conn->attempt > 2) {
1434 conn->state = BT_CLOSED;
1435 hci_proto_connect_cfm(conn, status);
1436 hci_conn_del(conn);
1437 } else
1438 conn->state = BT_CONNECT2;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001439 }
1440 } else {
1441 if (!conn) {
Johan Hedberga5c4e302014-07-16 11:56:07 +03001442 conn = hci_conn_add(hdev, ACL_LINK, &cp->bdaddr,
1443 HCI_ROLE_MASTER);
1444 if (!conn)
Gustavo F. Padovan893ef972010-07-18 15:13:37 -03001445 BT_ERR("No memory for new connection");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001446 }
1447 }
1448
1449 hci_dev_unlock(hdev);
1450}
1451
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001452static void hci_cs_add_sco(struct hci_dev *hdev, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001453{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001454 struct hci_cp_add_sco *cp;
1455 struct hci_conn *acl, *sco;
1456 __u16 handle;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001457
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001458 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001459
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001460 if (!status)
1461 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001462
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001463 cp = hci_sent_cmd_data(hdev, HCI_OP_ADD_SCO);
1464 if (!cp)
1465 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001466
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001467 handle = __le16_to_cpu(cp->handle);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001468
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001469 BT_DBG("%s handle 0x%4.4x", hdev->name, handle);
Marcel Holtmann6bd57412006-11-18 22:14:22 +01001470
1471 hci_dev_lock(hdev);
1472
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001473 acl = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001474 if (acl) {
1475 sco = acl->link;
1476 if (sco) {
1477 sco->state = BT_CLOSED;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001478
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001479 hci_proto_connect_cfm(sco, status);
1480 hci_conn_del(sco);
1481 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001482 }
Marcel Holtmann6bd57412006-11-18 22:14:22 +01001483
1484 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001485}
1486
Marcel Holtmannf8558552008-07-14 20:13:49 +02001487static void hci_cs_auth_requested(struct hci_dev *hdev, __u8 status)
1488{
1489 struct hci_cp_auth_requested *cp;
1490 struct hci_conn *conn;
1491
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001492 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001493
1494 if (!status)
1495 return;
1496
1497 cp = hci_sent_cmd_data(hdev, HCI_OP_AUTH_REQUESTED);
1498 if (!cp)
1499 return;
1500
1501 hci_dev_lock(hdev);
1502
1503 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1504 if (conn) {
1505 if (conn->state == BT_CONFIG) {
1506 hci_proto_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001507 hci_conn_drop(conn);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001508 }
1509 }
1510
1511 hci_dev_unlock(hdev);
1512}
1513
1514static void hci_cs_set_conn_encrypt(struct hci_dev *hdev, __u8 status)
1515{
1516 struct hci_cp_set_conn_encrypt *cp;
1517 struct hci_conn *conn;
1518
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001519 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001520
1521 if (!status)
1522 return;
1523
1524 cp = hci_sent_cmd_data(hdev, HCI_OP_SET_CONN_ENCRYPT);
1525 if (!cp)
1526 return;
1527
1528 hci_dev_lock(hdev);
1529
1530 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1531 if (conn) {
1532 if (conn->state == BT_CONFIG) {
1533 hci_proto_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001534 hci_conn_drop(conn);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001535 }
1536 }
1537
1538 hci_dev_unlock(hdev);
1539}
1540
Johan Hedberg127178d2010-11-18 22:22:29 +02001541static int hci_outgoing_auth_needed(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -03001542 struct hci_conn *conn)
Johan Hedberg392599b2010-11-18 22:22:28 +02001543{
Johan Hedberg392599b2010-11-18 22:22:28 +02001544 if (conn->state != BT_CONFIG || !conn->out)
1545 return 0;
1546
Johan Hedberg765c2a92011-01-19 12:06:52 +05301547 if (conn->pending_sec_level == BT_SECURITY_SDP)
Johan Hedberg392599b2010-11-18 22:22:28 +02001548 return 0;
1549
1550 /* Only request authentication for SSP connections or non-SSP
Johan Hedberg264b8b42014-01-08 16:40:39 +02001551 * devices with sec_level MEDIUM or HIGH or if MITM protection
1552 * is requested.
1553 */
Gustavo Padovan807deac2012-05-17 00:36:24 -03001554 if (!hci_conn_ssp_enabled(conn) && !(conn->auth_type & 0x01) &&
Johan Hedberg7e3691e2014-05-30 14:45:19 +03001555 conn->pending_sec_level != BT_SECURITY_FIPS &&
Johan Hedberg264b8b42014-01-08 16:40:39 +02001556 conn->pending_sec_level != BT_SECURITY_HIGH &&
1557 conn->pending_sec_level != BT_SECURITY_MEDIUM)
Johan Hedberg392599b2010-11-18 22:22:28 +02001558 return 0;
1559
Johan Hedberg392599b2010-11-18 22:22:28 +02001560 return 1;
1561}
1562
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001563static int hci_resolve_name(struct hci_dev *hdev,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001564 struct inquiry_entry *e)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001565{
1566 struct hci_cp_remote_name_req cp;
1567
1568 memset(&cp, 0, sizeof(cp));
1569
1570 bacpy(&cp.bdaddr, &e->data.bdaddr);
1571 cp.pscan_rep_mode = e->data.pscan_rep_mode;
1572 cp.pscan_mode = e->data.pscan_mode;
1573 cp.clock_offset = e->data.clock_offset;
1574
1575 return hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
1576}
1577
Johan Hedbergb644ba32012-01-17 21:48:47 +02001578static bool hci_resolve_next_name(struct hci_dev *hdev)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001579{
1580 struct discovery_state *discov = &hdev->discovery;
1581 struct inquiry_entry *e;
1582
Johan Hedbergb644ba32012-01-17 21:48:47 +02001583 if (list_empty(&discov->resolve))
1584 return false;
1585
1586 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
Ram Malovanyc8100892012-07-19 10:26:09 +03001587 if (!e)
1588 return false;
1589
Johan Hedbergb644ba32012-01-17 21:48:47 +02001590 if (hci_resolve_name(hdev, e) == 0) {
1591 e->name_state = NAME_PENDING;
1592 return true;
1593 }
1594
1595 return false;
1596}
1597
1598static void hci_check_pending_name(struct hci_dev *hdev, struct hci_conn *conn,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001599 bdaddr_t *bdaddr, u8 *name, u8 name_len)
Johan Hedbergb644ba32012-01-17 21:48:47 +02001600{
1601 struct discovery_state *discov = &hdev->discovery;
1602 struct inquiry_entry *e;
1603
Johan Hedberg60cb49d2014-11-11 11:33:24 +02001604 /* Update the mgmt connected state if necessary. Be careful with
1605 * conn objects that exist but are not (yet) connected however.
1606 * Only those in BT_CONFIG or BT_CONNECTED states can be
1607 * considered connected.
1608 */
1609 if (conn &&
1610 (conn->state == BT_CONFIG || conn->state == BT_CONNECTED) &&
Jaganath Kanakkasserycb77c3e2014-11-07 16:39:09 +05301611 !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00001612 mgmt_device_connected(hdev, conn, 0, name, name_len);
Johan Hedbergb644ba32012-01-17 21:48:47 +02001613
1614 if (discov->state == DISCOVERY_STOPPED)
1615 return;
1616
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001617 if (discov->state == DISCOVERY_STOPPING)
1618 goto discov_complete;
1619
1620 if (discov->state != DISCOVERY_RESOLVING)
1621 return;
1622
1623 e = hci_inquiry_cache_lookup_resolve(hdev, bdaddr, NAME_PENDING);
Ram Malovany7cc83802012-07-19 10:26:10 +03001624 /* If the device was not found in a list of found devices names of which
1625 * are pending. there is no need to continue resolving a next name as it
1626 * will be done upon receiving another Remote Name Request Complete
1627 * Event */
1628 if (!e)
1629 return;
1630
1631 list_del(&e->list);
1632 if (name) {
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001633 e->name_state = NAME_KNOWN;
Ram Malovany7cc83802012-07-19 10:26:10 +03001634 mgmt_remote_name(hdev, bdaddr, ACL_LINK, 0x00,
1635 e->data.rssi, name, name_len);
Ram Malovanyc3e7c0d2012-07-19 10:26:11 +03001636 } else {
1637 e->name_state = NAME_NOT_KNOWN;
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001638 }
1639
Johan Hedbergb644ba32012-01-17 21:48:47 +02001640 if (hci_resolve_next_name(hdev))
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001641 return;
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001642
1643discov_complete:
1644 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
1645}
1646
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001647static void hci_cs_remote_name_req(struct hci_dev *hdev, __u8 status)
1648{
Johan Hedberg127178d2010-11-18 22:22:29 +02001649 struct hci_cp_remote_name_req *cp;
1650 struct hci_conn *conn;
1651
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001652 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Johan Hedberg127178d2010-11-18 22:22:29 +02001653
1654 /* If successful wait for the name req complete event before
1655 * checking for the need to do authentication */
1656 if (!status)
1657 return;
1658
1659 cp = hci_sent_cmd_data(hdev, HCI_OP_REMOTE_NAME_REQ);
1660 if (!cp)
1661 return;
1662
1663 hci_dev_lock(hdev);
1664
1665 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02001666
1667 if (test_bit(HCI_MGMT, &hdev->dev_flags))
1668 hci_check_pending_name(hdev, conn, &cp->bdaddr, NULL, 0);
1669
Johan Hedberg79c6c702011-04-28 11:28:55 -07001670 if (!conn)
1671 goto unlock;
1672
1673 if (!hci_outgoing_auth_needed(hdev, conn))
1674 goto unlock;
1675
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001676 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02001677 struct hci_cp_auth_requested auth_cp;
1678
Johan Hedberg977f8fc2014-07-17 15:35:39 +03001679 set_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags);
1680
Johannes Bergc1f23a22013-10-07 18:19:16 +02001681 auth_cp.handle = __cpu_to_le16(conn->handle);
1682 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED,
1683 sizeof(auth_cp), &auth_cp);
Johan Hedberg127178d2010-11-18 22:22:29 +02001684 }
1685
Johan Hedberg79c6c702011-04-28 11:28:55 -07001686unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02001687 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001688}
1689
Marcel Holtmann769be972008-07-14 20:13:49 +02001690static void hci_cs_read_remote_features(struct hci_dev *hdev, __u8 status)
1691{
1692 struct hci_cp_read_remote_features *cp;
1693 struct hci_conn *conn;
1694
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001695 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann769be972008-07-14 20:13:49 +02001696
1697 if (!status)
1698 return;
1699
1700 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_REMOTE_FEATURES);
1701 if (!cp)
1702 return;
1703
1704 hci_dev_lock(hdev);
1705
1706 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1707 if (conn) {
1708 if (conn->state == BT_CONFIG) {
Marcel Holtmann769be972008-07-14 20:13:49 +02001709 hci_proto_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001710 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02001711 }
1712 }
1713
1714 hci_dev_unlock(hdev);
1715}
1716
1717static void hci_cs_read_remote_ext_features(struct hci_dev *hdev, __u8 status)
1718{
1719 struct hci_cp_read_remote_ext_features *cp;
1720 struct hci_conn *conn;
1721
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001722 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann769be972008-07-14 20:13:49 +02001723
1724 if (!status)
1725 return;
1726
1727 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES);
1728 if (!cp)
1729 return;
1730
1731 hci_dev_lock(hdev);
1732
1733 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1734 if (conn) {
1735 if (conn->state == BT_CONFIG) {
Marcel Holtmann769be972008-07-14 20:13:49 +02001736 hci_proto_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001737 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02001738 }
1739 }
1740
1741 hci_dev_unlock(hdev);
1742}
1743
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001744static void hci_cs_setup_sync_conn(struct hci_dev *hdev, __u8 status)
1745{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001746 struct hci_cp_setup_sync_conn *cp;
1747 struct hci_conn *acl, *sco;
1748 __u16 handle;
1749
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001750 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001751
1752 if (!status)
1753 return;
1754
1755 cp = hci_sent_cmd_data(hdev, HCI_OP_SETUP_SYNC_CONN);
1756 if (!cp)
1757 return;
1758
1759 handle = __le16_to_cpu(cp->handle);
1760
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001761 BT_DBG("%s handle 0x%4.4x", hdev->name, handle);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001762
1763 hci_dev_lock(hdev);
1764
1765 acl = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001766 if (acl) {
1767 sco = acl->link;
1768 if (sco) {
1769 sco->state = BT_CLOSED;
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001770
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001771 hci_proto_connect_cfm(sco, status);
1772 hci_conn_del(sco);
1773 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001774 }
1775
1776 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001777}
1778
1779static void hci_cs_sniff_mode(struct hci_dev *hdev, __u8 status)
1780{
1781 struct hci_cp_sniff_mode *cp;
1782 struct hci_conn *conn;
1783
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001784 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001785
1786 if (!status)
1787 return;
1788
1789 cp = hci_sent_cmd_data(hdev, HCI_OP_SNIFF_MODE);
1790 if (!cp)
1791 return;
1792
1793 hci_dev_lock(hdev);
1794
1795 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001796 if (conn) {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001797 clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001798
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001799 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001800 hci_sco_setup(conn, status);
1801 }
1802
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001803 hci_dev_unlock(hdev);
1804}
1805
1806static void hci_cs_exit_sniff_mode(struct hci_dev *hdev, __u8 status)
1807{
1808 struct hci_cp_exit_sniff_mode *cp;
1809 struct hci_conn *conn;
1810
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001811 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001812
1813 if (!status)
1814 return;
1815
1816 cp = hci_sent_cmd_data(hdev, HCI_OP_EXIT_SNIFF_MODE);
1817 if (!cp)
1818 return;
1819
1820 hci_dev_lock(hdev);
1821
1822 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001823 if (conn) {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001824 clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001825
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001826 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001827 hci_sco_setup(conn, status);
1828 }
1829
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001830 hci_dev_unlock(hdev);
1831}
1832
Johan Hedberg88c3df12012-02-09 14:27:38 +02001833static void hci_cs_disconnect(struct hci_dev *hdev, u8 status)
1834{
1835 struct hci_cp_disconnect *cp;
1836 struct hci_conn *conn;
1837
1838 if (!status)
1839 return;
1840
1841 cp = hci_sent_cmd_data(hdev, HCI_OP_DISCONNECT);
1842 if (!cp)
1843 return;
1844
1845 hci_dev_lock(hdev);
1846
1847 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1848 if (conn)
1849 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001850 conn->dst_type, status);
Johan Hedberg88c3df12012-02-09 14:27:38 +02001851
1852 hci_dev_unlock(hdev);
1853}
1854
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03001855static void hci_cs_create_phylink(struct hci_dev *hdev, u8 status)
1856{
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001857 struct hci_cp_create_phy_link *cp;
1858
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03001859 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001860
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001861 cp = hci_sent_cmd_data(hdev, HCI_OP_CREATE_PHY_LINK);
1862 if (!cp)
1863 return;
1864
Andrei Emeltchenkoe58917b2012-10-31 15:46:33 +02001865 hci_dev_lock(hdev);
1866
1867 if (status) {
1868 struct hci_conn *hcon;
1869
1870 hcon = hci_conn_hash_lookup_handle(hdev, cp->phy_handle);
1871 if (hcon)
1872 hci_conn_del(hcon);
1873 } else {
1874 amp_write_remote_assoc(hdev, cp->phy_handle);
1875 }
1876
1877 hci_dev_unlock(hdev);
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03001878}
1879
Andrei Emeltchenko0b26ab92012-09-27 17:26:24 +03001880static void hci_cs_accept_phylink(struct hci_dev *hdev, u8 status)
1881{
1882 struct hci_cp_accept_phy_link *cp;
1883
1884 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1885
1886 if (status)
1887 return;
1888
1889 cp = hci_sent_cmd_data(hdev, HCI_OP_ACCEPT_PHY_LINK);
1890 if (!cp)
1891 return;
1892
1893 amp_write_remote_assoc(hdev, cp->phy_handle);
1894}
1895
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02001896static void hci_cs_le_create_conn(struct hci_dev *hdev, u8 status)
1897{
1898 struct hci_cp_le_create_conn *cp;
1899 struct hci_conn *conn;
1900
1901 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1902
1903 /* All connection failure handling is taken care of by the
1904 * hci_le_conn_failed function which is triggered by the HCI
1905 * request completion callbacks used for connecting.
1906 */
1907 if (status)
1908 return;
1909
1910 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_CREATE_CONN);
1911 if (!cp)
1912 return;
1913
1914 hci_dev_lock(hdev);
1915
1916 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->peer_addr);
1917 if (!conn)
1918 goto unlock;
1919
1920 /* Store the initiator and responder address information which
1921 * is needed for SMP. These values will not change during the
1922 * lifetime of the connection.
1923 */
1924 conn->init_addr_type = cp->own_address_type;
1925 if (cp->own_address_type == ADDR_LE_DEV_RANDOM)
1926 bacpy(&conn->init_addr, &hdev->random_addr);
1927 else
1928 bacpy(&conn->init_addr, &hdev->bdaddr);
1929
1930 conn->resp_addr_type = cp->peer_addr_type;
1931 bacpy(&conn->resp_addr, &cp->peer_addr);
1932
Johan Hedberg9489eca2014-02-28 17:45:46 +02001933 /* We don't want the connection attempt to stick around
1934 * indefinitely since LE doesn't have a page timeout concept
1935 * like BR/EDR. Set a timer for any connection that doesn't use
1936 * the white list for connecting.
1937 */
1938 if (cp->filter_policy == HCI_LE_USE_PEER_ADDR)
1939 queue_delayed_work(conn->hdev->workqueue,
1940 &conn->le_conn_timeout,
Johan Hedberg09ae2602014-07-06 13:41:15 +03001941 conn->conn_timeout);
Johan Hedberg9489eca2014-02-28 17:45:46 +02001942
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02001943unlock:
1944 hci_dev_unlock(hdev);
1945}
1946
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02001947static void hci_cs_le_start_enc(struct hci_dev *hdev, u8 status)
1948{
1949 struct hci_cp_le_start_enc *cp;
1950 struct hci_conn *conn;
1951
1952 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1953
1954 if (!status)
1955 return;
1956
1957 hci_dev_lock(hdev);
1958
1959 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_START_ENC);
1960 if (!cp)
1961 goto unlock;
1962
1963 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1964 if (!conn)
1965 goto unlock;
1966
1967 if (conn->state != BT_CONNECTED)
1968 goto unlock;
1969
1970 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
1971 hci_conn_drop(conn);
1972
1973unlock:
1974 hci_dev_unlock(hdev);
1975}
1976
Kuba Pawlak50fc85f2014-11-06 19:36:52 +01001977static void hci_cs_switch_role(struct hci_dev *hdev, u8 status)
1978{
1979 struct hci_cp_switch_role *cp;
1980 struct hci_conn *conn;
1981
1982 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1983
1984 if (!status)
1985 return;
1986
1987 cp = hci_sent_cmd_data(hdev, HCI_OP_SWITCH_ROLE);
1988 if (!cp)
1989 return;
1990
1991 hci_dev_lock(hdev);
1992
1993 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
1994 if (conn)
1995 clear_bit(HCI_CONN_RSWITCH_PEND, &conn->flags);
1996
1997 hci_dev_unlock(hdev);
1998}
1999
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002000static void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002001{
2002 __u8 status = *((__u8 *) skb->data);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002003 struct discovery_state *discov = &hdev->discovery;
2004 struct inquiry_entry *e;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002005
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002006 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002007
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002008 hci_conn_check_pending(hdev);
Andre Guedes89352e72011-11-04 14:16:53 -03002009
2010 if (!test_and_clear_bit(HCI_INQUIRY, &hdev->flags))
2011 return;
2012
Peter Zijlstra4e857c52014-03-17 18:06:10 +01002013 smp_mb__after_atomic(); /* wake_up_bit advises about this barrier */
Andre Guedes3e13fa12013-03-27 20:04:56 -03002014 wake_up_bit(&hdev->flags, HCI_INQUIRY);
2015
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02002016 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002017 return;
2018
Johan Hedberg56e5cb82011-11-08 20:40:16 +02002019 hci_dev_lock(hdev);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002020
Andre Guedes343f9352012-02-17 20:39:37 -03002021 if (discov->state != DISCOVERY_FINDING)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002022 goto unlock;
2023
2024 if (list_empty(&discov->resolve)) {
2025 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
2026 goto unlock;
2027 }
2028
2029 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
2030 if (e && hci_resolve_name(hdev, e) == 0) {
2031 e->name_state = NAME_PENDING;
2032 hci_discovery_set_state(hdev, DISCOVERY_RESOLVING);
2033 } else {
2034 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
2035 }
2036
2037unlock:
Johan Hedberg56e5cb82011-11-08 20:40:16 +02002038 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002039}
2040
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002041static void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002042{
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002043 struct inquiry_data data;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002044 struct inquiry_info *info = (void *) (skb->data + 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002045 int num_rsp = *((__u8 *) skb->data);
2046
2047 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
2048
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002049 if (!num_rsp)
2050 return;
2051
Andre Guedes1519cc12012-03-21 00:03:38 -03002052 if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags))
2053 return;
2054
Linus Torvalds1da177e2005-04-16 15:20:36 -07002055 hci_dev_lock(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002056
Johan Hedberge17acd42011-03-30 23:57:16 +03002057 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02002058 u32 flags;
Johan Hedberg31754052012-01-04 13:39:52 +02002059
Linus Torvalds1da177e2005-04-16 15:20:36 -07002060 bacpy(&data.bdaddr, &info->bdaddr);
2061 data.pscan_rep_mode = info->pscan_rep_mode;
2062 data.pscan_period_mode = info->pscan_period_mode;
2063 data.pscan_mode = info->pscan_mode;
2064 memcpy(data.dev_class, info->dev_class, 3);
2065 data.clock_offset = info->clock_offset;
Marcel Holtmannefb25132014-12-05 13:03:34 +01002066 data.rssi = HCI_RSSI_INVALID;
Marcel Holtmann41a96212008-07-14 20:13:48 +02002067 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02002068
Marcel Holtmannaf589252014-07-01 14:11:20 +02002069 flags = hci_inquiry_cache_update(hdev, &data, false);
2070
Johan Hedberg48264f02011-11-09 13:58:58 +02002071 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Marcel Holtmannefb25132014-12-05 13:03:34 +01002072 info->dev_class, HCI_RSSI_INVALID,
2073 flags, NULL, 0, NULL, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002074 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002075
Linus Torvalds1da177e2005-04-16 15:20:36 -07002076 hci_dev_unlock(hdev);
2077}
2078
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002079static void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002080{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002081 struct hci_ev_conn_complete *ev = (void *) skb->data;
2082 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002083
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002084 BT_DBG("%s", hdev->name);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002085
Linus Torvalds1da177e2005-04-16 15:20:36 -07002086 hci_dev_lock(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002087
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002088 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann94992372009-04-19 19:30:03 +02002089 if (!conn) {
2090 if (ev->link_type != SCO_LINK)
2091 goto unlock;
2092
2093 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
2094 if (!conn)
2095 goto unlock;
2096
2097 conn->type = SCO_LINK;
2098 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002099
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002100 if (!ev->status) {
2101 conn->handle = __le16_to_cpu(ev->handle);
Marcel Holtmann769be972008-07-14 20:13:49 +02002102
2103 if (conn->type == ACL_LINK) {
2104 conn->state = BT_CONFIG;
2105 hci_conn_hold(conn);
Szymon Janca9ea3ed2012-07-19 14:46:08 +02002106
2107 if (!conn->out && !hci_conn_ssp_enabled(conn) &&
2108 !hci_find_link_key(hdev, &ev->bdaddr))
2109 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
2110 else
2111 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
Marcel Holtmann769be972008-07-14 20:13:49 +02002112 } else
2113 conn->state = BT_CONNECTED;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002114
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02002115 hci_conn_add_sysfs(conn);
2116
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002117 if (test_bit(HCI_AUTH, &hdev->flags))
Johan Hedberg4dae2792014-06-24 17:03:50 +03002118 set_bit(HCI_CONN_AUTH, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002119
2120 if (test_bit(HCI_ENCRYPT, &hdev->flags))
Johan Hedberg4dae2792014-06-24 17:03:50 +03002121 set_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002122
2123 /* Get remote features */
2124 if (conn->type == ACL_LINK) {
2125 struct hci_cp_read_remote_features cp;
2126 cp.handle = ev->handle;
Marcel Holtmann769be972008-07-14 20:13:49 +02002127 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_FEATURES,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002128 sizeof(cp), &cp);
Johan Hedberg22f433d2014-08-01 11:13:32 +03002129
Johan Hedberg1d2dc5b2014-12-19 13:40:19 +02002130 hci_update_page_scan(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002131 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002132
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002133 /* Set packet type for incoming connection */
Andrei Emeltchenkod095c1e2011-12-01 14:33:27 +02002134 if (!conn->out && hdev->hci_ver < BLUETOOTH_VER_2_0) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002135 struct hci_cp_change_conn_ptype cp;
2136 cp.handle = ev->handle;
Marcel Holtmanna8746412008-07-14 20:13:46 +02002137 cp.pkt_type = cpu_to_le16(conn->pkt_type);
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002138 hci_send_cmd(hdev, HCI_OP_CHANGE_CONN_PTYPE, sizeof(cp),
2139 &cp);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002140 }
Johan Hedberg17d5c042011-01-22 06:09:08 +02002141 } else {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002142 conn->state = BT_CLOSED;
Johan Hedberg17d5c042011-01-22 06:09:08 +02002143 if (conn->type == ACL_LINK)
Marcel Holtmann64c7b772014-02-18 14:22:20 -08002144 mgmt_connect_failed(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002145 conn->dst_type, ev->status);
Johan Hedberg17d5c042011-01-22 06:09:08 +02002146 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002147
Marcel Holtmanne73439d2010-07-26 10:06:00 -04002148 if (conn->type == ACL_LINK)
2149 hci_sco_setup(conn, ev->status);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002150
Marcel Holtmann769be972008-07-14 20:13:49 +02002151 if (ev->status) {
2152 hci_proto_connect_cfm(conn, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002153 hci_conn_del(conn);
Marcel Holtmannc89b6e62009-01-15 21:57:03 +01002154 } else if (ev->link_type != ACL_LINK)
2155 hci_proto_connect_cfm(conn, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002156
2157unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002158 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002159
2160 hci_conn_check_pending(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002161}
2162
Johan Hedberg70c46422014-07-09 12:59:17 +03002163static void hci_reject_conn(struct hci_dev *hdev, bdaddr_t *bdaddr)
2164{
2165 struct hci_cp_reject_conn_req cp;
2166
2167 bacpy(&cp.bdaddr, bdaddr);
2168 cp.reason = HCI_ERROR_REJ_BAD_ADDR;
2169 hci_send_cmd(hdev, HCI_OP_REJECT_CONN_REQ, sizeof(cp), &cp);
2170}
2171
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002172static void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002173{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002174 struct hci_ev_conn_request *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002175 int mask = hdev->link_mode;
Johan Hedberg70c46422014-07-09 12:59:17 +03002176 struct inquiry_entry *ie;
2177 struct hci_conn *conn;
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002178 __u8 flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002179
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03002180 BT_DBG("%s bdaddr %pMR type 0x%x", hdev->name, &ev->bdaddr,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002181 ev->link_type);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002182
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002183 mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, ev->link_type,
2184 &flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002185
Johan Hedberg70c46422014-07-09 12:59:17 +03002186 if (!(mask & HCI_LM_ACCEPT)) {
2187 hci_reject_conn(hdev, &ev->bdaddr);
2188 return;
2189 }
2190
Johan Hedberg46c4c942014-07-16 16:19:21 +03002191 if (hci_bdaddr_list_lookup(&hdev->blacklist, &ev->bdaddr,
2192 BDADDR_BREDR)) {
2193 hci_reject_conn(hdev, &ev->bdaddr);
2194 return;
2195 }
2196
2197 if (!test_bit(HCI_CONNECTABLE, &hdev->dev_flags) &&
2198 !hci_bdaddr_list_lookup(&hdev->whitelist, &ev->bdaddr,
2199 BDADDR_BREDR)) {
2200 hci_reject_conn(hdev, &ev->bdaddr);
2201 return;
Johan Hedberg70c46422014-07-09 12:59:17 +03002202 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002203
Johan Hedberg70c46422014-07-09 12:59:17 +03002204 /* Connection accepted */
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002205
Johan Hedberg70c46422014-07-09 12:59:17 +03002206 hci_dev_lock(hdev);
Marcel Holtmannc7bdd502008-07-14 20:13:47 +02002207
Johan Hedberg70c46422014-07-09 12:59:17 +03002208 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
2209 if (ie)
2210 memcpy(ie->data.dev_class, ev->dev_class, 3);
2211
2212 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type,
2213 &ev->bdaddr);
2214 if (!conn) {
Johan Hedberga5c4e302014-07-16 11:56:07 +03002215 conn = hci_conn_add(hdev, ev->link_type, &ev->bdaddr,
2216 HCI_ROLE_SLAVE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002217 if (!conn) {
Johan Hedberg70c46422014-07-09 12:59:17 +03002218 BT_ERR("No memory for new connection");
2219 hci_dev_unlock(hdev);
2220 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002221 }
Johan Hedberg70c46422014-07-09 12:59:17 +03002222 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002223
Johan Hedberg70c46422014-07-09 12:59:17 +03002224 memcpy(conn->dev_class, ev->dev_class, 3);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002225
Johan Hedberg70c46422014-07-09 12:59:17 +03002226 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002227
Johan Hedberg70c46422014-07-09 12:59:17 +03002228 if (ev->link_type == ACL_LINK ||
2229 (!(flags & HCI_PROTO_DEFER) && !lmp_esco_capable(hdev))) {
2230 struct hci_cp_accept_conn_req cp;
2231 conn->state = BT_CONNECT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002232
2233 bacpy(&cp.bdaddr, &ev->bdaddr);
Johan Hedberg70c46422014-07-09 12:59:17 +03002234
2235 if (lmp_rswitch_capable(hdev) && (mask & HCI_LM_MASTER))
2236 cp.role = 0x00; /* Become master */
2237 else
2238 cp.role = 0x01; /* Remain slave */
2239
2240 hci_send_cmd(hdev, HCI_OP_ACCEPT_CONN_REQ, sizeof(cp), &cp);
2241 } else if (!(flags & HCI_PROTO_DEFER)) {
2242 struct hci_cp_accept_sync_conn_req cp;
2243 conn->state = BT_CONNECT;
2244
2245 bacpy(&cp.bdaddr, &ev->bdaddr);
2246 cp.pkt_type = cpu_to_le16(conn->pkt_type);
2247
2248 cp.tx_bandwidth = cpu_to_le32(0x00001f40);
2249 cp.rx_bandwidth = cpu_to_le32(0x00001f40);
2250 cp.max_latency = cpu_to_le16(0xffff);
2251 cp.content_format = cpu_to_le16(hdev->voice_setting);
2252 cp.retrans_effort = 0xff;
2253
2254 hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ, sizeof(cp),
2255 &cp);
2256 } else {
2257 conn->state = BT_CONNECT2;
2258 hci_proto_connect_cfm(conn, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002259 }
2260}
2261
Mikel Astizf0d6a0e2012-08-09 09:52:30 +02002262static u8 hci_to_mgmt_reason(u8 err)
2263{
2264 switch (err) {
2265 case HCI_ERROR_CONNECTION_TIMEOUT:
2266 return MGMT_DEV_DISCONN_TIMEOUT;
2267 case HCI_ERROR_REMOTE_USER_TERM:
2268 case HCI_ERROR_REMOTE_LOW_RESOURCES:
2269 case HCI_ERROR_REMOTE_POWER_OFF:
2270 return MGMT_DEV_DISCONN_REMOTE;
2271 case HCI_ERROR_LOCAL_HOST_TERM:
2272 return MGMT_DEV_DISCONN_LOCAL_HOST;
2273 default:
2274 return MGMT_DEV_DISCONN_UNKNOWN;
2275 }
2276}
2277
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002278static void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002279{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002280 struct hci_ev_disconn_complete *ev = (void *) skb->data;
Andre Guedesabf54a52013-11-07 17:36:09 -03002281 u8 reason = hci_to_mgmt_reason(ev->reason);
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002282 struct hci_conn_params *params;
Marcel Holtmann04837f62006-07-03 10:02:33 +02002283 struct hci_conn *conn;
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002284 bool mgmt_connected;
Andre Guedes38462202013-11-07 17:36:10 -03002285 u8 type;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002286
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002287 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002288
Linus Torvalds1da177e2005-04-16 15:20:36 -07002289 hci_dev_lock(hdev);
2290
Marcel Holtmann04837f62006-07-03 10:02:33 +02002291 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergf7520542011-01-20 12:34:39 +02002292 if (!conn)
2293 goto unlock;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02002294
Andre Guedesabf54a52013-11-07 17:36:09 -03002295 if (ev->status) {
2296 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
2297 conn->dst_type, ev->status);
2298 goto unlock;
Johan Hedberg37d9ef72011-11-10 15:54:39 +02002299 }
Johan Hedbergf7520542011-01-20 12:34:39 +02002300
Andre Guedes38462202013-11-07 17:36:10 -03002301 conn->state = BT_CLOSED;
2302
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002303 mgmt_connected = test_and_clear_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags);
2304 mgmt_device_disconnected(hdev, &conn->dst, conn->type, conn->dst_type,
2305 reason, mgmt_connected);
Andre Guedesabf54a52013-11-07 17:36:09 -03002306
Johan Hedberg22f433d2014-08-01 11:13:32 +03002307 if (conn->type == ACL_LINK) {
2308 if (test_bit(HCI_CONN_FLUSH_KEY, &conn->flags))
2309 hci_remove_link_key(hdev, &conn->dst);
2310
Johan Hedberg1d2dc5b2014-12-19 13:40:19 +02002311 hci_update_page_scan(hdev);
Johan Hedberg22f433d2014-08-01 11:13:32 +03002312 }
Johan Hedberg22102462013-10-05 12:01:06 +02002313
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002314 params = hci_conn_params_lookup(hdev, &conn->dst, conn->dst_type);
2315 if (params) {
2316 switch (params->auto_connect) {
2317 case HCI_AUTO_CONN_LINK_LOSS:
2318 if (ev->reason != HCI_ERROR_CONNECTION_TIMEOUT)
2319 break;
2320 /* Fall through */
2321
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02002322 case HCI_AUTO_CONN_DIRECT:
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002323 case HCI_AUTO_CONN_ALWAYS:
Johan Hedberg418025d2014-07-04 12:37:24 +03002324 list_del_init(&params->action);
2325 list_add(&params->action, &hdev->pend_le_conns);
2326 hci_update_background_scan(hdev);
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002327 break;
2328
2329 default:
2330 break;
2331 }
2332 }
2333
Andre Guedes38462202013-11-07 17:36:10 -03002334 type = conn->type;
Johan Hedberg22102462013-10-05 12:01:06 +02002335
Andre Guedes38462202013-11-07 17:36:10 -03002336 hci_proto_disconn_cfm(conn, ev->reason);
2337 hci_conn_del(conn);
2338
2339 /* Re-enable advertising if necessary, since it might
2340 * have been disabled by the connection. From the
2341 * HCI_LE_Set_Advertise_Enable command description in
2342 * the core specification (v4.0):
2343 * "The Controller shall continue advertising until the Host
2344 * issues an LE_Set_Advertise_Enable command with
2345 * Advertising_Enable set to 0x00 (Advertising is disabled)
2346 * or until a connection is created or until the Advertising
2347 * is timed out due to Directed Advertising."
2348 */
2349 if (type == LE_LINK)
2350 mgmt_reenable_advertising(hdev);
Johan Hedbergf7520542011-01-20 12:34:39 +02002351
2352unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002353 hci_dev_unlock(hdev);
2354}
2355
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002356static void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002357{
2358 struct hci_ev_auth_complete *ev = (void *) skb->data;
2359 struct hci_conn *conn;
2360
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002361 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002362
2363 hci_dev_lock(hdev);
2364
2365 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002366 if (!conn)
2367 goto unlock;
2368
2369 if (!ev->status) {
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002370 if (!hci_conn_ssp_enabled(conn) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03002371 test_bit(HCI_CONN_REAUTH_PEND, &conn->flags)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002372 BT_INFO("re-auth of legacy device is not possible.");
Johan Hedberg2a611692011-02-19 12:06:00 -03002373 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002374 set_bit(HCI_CONN_AUTH, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002375 conn->sec_level = conn->pending_sec_level;
Johan Hedberg2a611692011-02-19 12:06:00 -03002376 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002377 } else {
Johan Hedberge1e930f2014-09-08 17:09:49 -07002378 mgmt_auth_failed(conn, ev->status);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002379 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002380
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002381 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
2382 clear_bit(HCI_CONN_REAUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002383
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002384 if (conn->state == BT_CONFIG) {
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002385 if (!ev->status && hci_conn_ssp_enabled(conn)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002386 struct hci_cp_set_conn_encrypt cp;
2387 cp.handle = ev->handle;
2388 cp.encrypt = 0x01;
2389 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002390 &cp);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002391 } else {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002392 conn->state = BT_CONNECTED;
2393 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002394 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002395 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002396 } else {
2397 hci_auth_cfm(conn, ev->status);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002398
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002399 hci_conn_hold(conn);
2400 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02002401 hci_conn_drop(conn);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002402 }
2403
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002404 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002405 if (!ev->status) {
2406 struct hci_cp_set_conn_encrypt cp;
2407 cp.handle = ev->handle;
2408 cp.encrypt = 0x01;
2409 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002410 &cp);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002411 } else {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002412 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002413 hci_encrypt_cfm(conn, ev->status, 0x00);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002414 }
2415 }
2416
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002417unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002418 hci_dev_unlock(hdev);
2419}
2420
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002421static void hci_remote_name_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002422{
Johan Hedberg127178d2010-11-18 22:22:29 +02002423 struct hci_ev_remote_name *ev = (void *) skb->data;
2424 struct hci_conn *conn;
2425
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002426 BT_DBG("%s", hdev->name);
2427
2428 hci_conn_check_pending(hdev);
Johan Hedberg127178d2010-11-18 22:22:29 +02002429
2430 hci_dev_lock(hdev);
2431
2432 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002433
2434 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
2435 goto check_auth;
2436
2437 if (ev->status == 0)
2438 hci_check_pending_name(hdev, conn, &ev->bdaddr, ev->name,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002439 strnlen(ev->name, HCI_MAX_NAME_LENGTH));
Johan Hedbergb644ba32012-01-17 21:48:47 +02002440 else
2441 hci_check_pending_name(hdev, conn, &ev->bdaddr, NULL, 0);
2442
2443check_auth:
Johan Hedberg79c6c702011-04-28 11:28:55 -07002444 if (!conn)
2445 goto unlock;
2446
2447 if (!hci_outgoing_auth_needed(hdev, conn))
2448 goto unlock;
2449
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002450 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002451 struct hci_cp_auth_requested cp;
Johan Hedberg977f8fc2014-07-17 15:35:39 +03002452
2453 set_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags);
2454
Johan Hedberg127178d2010-11-18 22:22:29 +02002455 cp.handle = __cpu_to_le16(conn->handle);
2456 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED, sizeof(cp), &cp);
2457 }
2458
Johan Hedberg79c6c702011-04-28 11:28:55 -07002459unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02002460 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002461}
2462
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002463static void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002464{
2465 struct hci_ev_encrypt_change *ev = (void *) skb->data;
2466 struct hci_conn *conn;
2467
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002468 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002469
2470 hci_dev_lock(hdev);
2471
2472 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002473 if (!conn)
2474 goto unlock;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002475
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002476 if (!ev->status) {
2477 if (ev->encrypt) {
2478 /* Encryption implies authentication */
Johan Hedberg4dae2792014-06-24 17:03:50 +03002479 set_bit(HCI_CONN_AUTH, &conn->flags);
2480 set_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002481 conn->sec_level = conn->pending_sec_level;
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002482
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002483 /* P-256 authentication key implies FIPS */
2484 if (conn->key_type == HCI_LK_AUTH_COMBINATION_P256)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002485 set_bit(HCI_CONN_FIPS, &conn->flags);
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002486
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002487 if ((conn->type == ACL_LINK && ev->encrypt == 0x02) ||
2488 conn->type == LE_LINK)
2489 set_bit(HCI_CONN_AES_CCM, &conn->flags);
2490 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002491 clear_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002492 clear_bit(HCI_CONN_AES_CCM, &conn->flags);
2493 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002494 }
2495
Johan Hedberg7ed3fa22014-09-10 22:16:35 -07002496 /* We should disregard the current RPA and generate a new one
2497 * whenever the encryption procedure fails.
2498 */
2499 if (ev->status && conn->type == LE_LINK)
2500 set_bit(HCI_RPA_EXPIRED, &hdev->dev_flags);
2501
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002502 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
2503
2504 if (ev->status && conn->state == BT_CONNECTED) {
2505 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
2506 hci_conn_drop(conn);
2507 goto unlock;
2508 }
2509
2510 if (conn->state == BT_CONFIG) {
2511 if (!ev->status)
2512 conn->state = BT_CONNECTED;
2513
Marcel Holtmann40b552a2014-03-19 14:10:25 -07002514 /* In Secure Connections Only mode, do not allow any
2515 * connections that are not encrypted with AES-CCM
2516 * using a P-256 authenticated combination key.
2517 */
2518 if (test_bit(HCI_SC_ONLY, &hdev->dev_flags) &&
2519 (!test_bit(HCI_CONN_AES_CCM, &conn->flags) ||
2520 conn->key_type != HCI_LK_AUTH_COMBINATION_P256)) {
2521 hci_proto_connect_cfm(conn, HCI_ERROR_AUTH_FAILURE);
2522 hci_conn_drop(conn);
2523 goto unlock;
2524 }
2525
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002526 hci_proto_connect_cfm(conn, ev->status);
2527 hci_conn_drop(conn);
2528 } else
2529 hci_encrypt_cfm(conn, ev->status, ev->encrypt);
2530
Gustavo Padovana7d77232012-05-13 03:20:07 -03002531unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002532 hci_dev_unlock(hdev);
2533}
2534
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002535static void hci_change_link_key_complete_evt(struct hci_dev *hdev,
2536 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002537{
2538 struct hci_ev_change_link_key_complete *ev = (void *) skb->data;
2539 struct hci_conn *conn;
2540
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002541 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002542
2543 hci_dev_lock(hdev);
2544
2545 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
2546 if (conn) {
2547 if (!ev->status)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002548 set_bit(HCI_CONN_SECURE, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002549
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002550 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002551
2552 hci_key_change_cfm(conn, ev->status);
2553 }
2554
2555 hci_dev_unlock(hdev);
2556}
2557
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002558static void hci_remote_features_evt(struct hci_dev *hdev,
2559 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002560{
2561 struct hci_ev_remote_features *ev = (void *) skb->data;
2562 struct hci_conn *conn;
2563
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002564 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002565
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002566 hci_dev_lock(hdev);
2567
2568 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02002569 if (!conn)
2570 goto unlock;
Marcel Holtmann769be972008-07-14 20:13:49 +02002571
Johan Hedbergccd556f2010-11-10 17:11:51 +02002572 if (!ev->status)
Johan Hedbergcad718e2013-04-17 15:00:51 +03002573 memcpy(conn->features[0], ev->features, 8);
Johan Hedbergccd556f2010-11-10 17:11:51 +02002574
2575 if (conn->state != BT_CONFIG)
2576 goto unlock;
2577
2578 if (!ev->status && lmp_ssp_capable(hdev) && lmp_ssp_capable(conn)) {
2579 struct hci_cp_read_remote_ext_features cp;
2580 cp.handle = ev->handle;
2581 cp.page = 0x01;
2582 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002583 sizeof(cp), &cp);
Johan Hedberg392599b2010-11-18 22:22:28 +02002584 goto unlock;
2585 }
2586
Johan Hedberg671267b2012-05-12 16:11:50 -03002587 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002588 struct hci_cp_remote_name_req cp;
2589 memset(&cp, 0, sizeof(cp));
2590 bacpy(&cp.bdaddr, &conn->dst);
2591 cp.pscan_rep_mode = 0x02;
2592 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002593 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00002594 mgmt_device_connected(hdev, conn, 0, NULL, 0);
Johan Hedberg392599b2010-11-18 22:22:28 +02002595
Johan Hedberg127178d2010-11-18 22:22:29 +02002596 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02002597 conn->state = BT_CONNECTED;
2598 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002599 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02002600 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002601
Johan Hedbergccd556f2010-11-10 17:11:51 +02002602unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002603 hci_dev_unlock(hdev);
2604}
2605
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002606static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002607{
2608 struct hci_ev_cmd_complete *ev = (void *) skb->data;
Johan Hedberg9238f362013-03-05 20:37:48 +02002609 u8 status = skb->data[sizeof(*ev)];
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002610 __u16 opcode;
2611
2612 skb_pull(skb, sizeof(*ev));
2613
2614 opcode = __le16_to_cpu(ev->opcode);
2615
2616 switch (opcode) {
2617 case HCI_OP_INQUIRY_CANCEL:
2618 hci_cc_inquiry_cancel(hdev, skb);
2619 break;
2620
Andre Guedes4d934832012-03-21 00:03:35 -03002621 case HCI_OP_PERIODIC_INQ:
2622 hci_cc_periodic_inq(hdev, skb);
2623 break;
2624
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002625 case HCI_OP_EXIT_PERIODIC_INQ:
2626 hci_cc_exit_periodic_inq(hdev, skb);
2627 break;
2628
2629 case HCI_OP_REMOTE_NAME_REQ_CANCEL:
2630 hci_cc_remote_name_req_cancel(hdev, skb);
2631 break;
2632
2633 case HCI_OP_ROLE_DISCOVERY:
2634 hci_cc_role_discovery(hdev, skb);
2635 break;
2636
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002637 case HCI_OP_READ_LINK_POLICY:
2638 hci_cc_read_link_policy(hdev, skb);
2639 break;
2640
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002641 case HCI_OP_WRITE_LINK_POLICY:
2642 hci_cc_write_link_policy(hdev, skb);
2643 break;
2644
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002645 case HCI_OP_READ_DEF_LINK_POLICY:
2646 hci_cc_read_def_link_policy(hdev, skb);
2647 break;
2648
2649 case HCI_OP_WRITE_DEF_LINK_POLICY:
2650 hci_cc_write_def_link_policy(hdev, skb);
2651 break;
2652
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002653 case HCI_OP_RESET:
2654 hci_cc_reset(hdev, skb);
2655 break;
2656
2657 case HCI_OP_WRITE_LOCAL_NAME:
2658 hci_cc_write_local_name(hdev, skb);
2659 break;
2660
2661 case HCI_OP_READ_LOCAL_NAME:
2662 hci_cc_read_local_name(hdev, skb);
2663 break;
2664
2665 case HCI_OP_WRITE_AUTH_ENABLE:
2666 hci_cc_write_auth_enable(hdev, skb);
2667 break;
2668
2669 case HCI_OP_WRITE_ENCRYPT_MODE:
2670 hci_cc_write_encrypt_mode(hdev, skb);
2671 break;
2672
2673 case HCI_OP_WRITE_SCAN_ENABLE:
2674 hci_cc_write_scan_enable(hdev, skb);
2675 break;
2676
2677 case HCI_OP_READ_CLASS_OF_DEV:
2678 hci_cc_read_class_of_dev(hdev, skb);
2679 break;
2680
2681 case HCI_OP_WRITE_CLASS_OF_DEV:
2682 hci_cc_write_class_of_dev(hdev, skb);
2683 break;
2684
2685 case HCI_OP_READ_VOICE_SETTING:
2686 hci_cc_read_voice_setting(hdev, skb);
2687 break;
2688
2689 case HCI_OP_WRITE_VOICE_SETTING:
2690 hci_cc_write_voice_setting(hdev, skb);
2691 break;
2692
Marcel Holtmannb4cb9fb2013-10-14 13:56:16 -07002693 case HCI_OP_READ_NUM_SUPPORTED_IAC:
2694 hci_cc_read_num_supported_iac(hdev, skb);
2695 break;
2696
Marcel Holtmann333140b2008-07-14 20:13:48 +02002697 case HCI_OP_WRITE_SSP_MODE:
2698 hci_cc_write_ssp_mode(hdev, skb);
2699 break;
2700
Marcel Holtmanneac83dc2014-01-10 02:07:23 -08002701 case HCI_OP_WRITE_SC_SUPPORT:
2702 hci_cc_write_sc_support(hdev, skb);
2703 break;
2704
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002705 case HCI_OP_READ_LOCAL_VERSION:
2706 hci_cc_read_local_version(hdev, skb);
2707 break;
2708
2709 case HCI_OP_READ_LOCAL_COMMANDS:
2710 hci_cc_read_local_commands(hdev, skb);
2711 break;
2712
2713 case HCI_OP_READ_LOCAL_FEATURES:
2714 hci_cc_read_local_features(hdev, skb);
2715 break;
2716
Andre Guedes971e3a42011-06-30 19:20:52 -03002717 case HCI_OP_READ_LOCAL_EXT_FEATURES:
2718 hci_cc_read_local_ext_features(hdev, skb);
2719 break;
2720
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002721 case HCI_OP_READ_BUFFER_SIZE:
2722 hci_cc_read_buffer_size(hdev, skb);
2723 break;
2724
2725 case HCI_OP_READ_BD_ADDR:
2726 hci_cc_read_bd_addr(hdev, skb);
2727 break;
2728
Johan Hedbergf332ec62013-03-15 17:07:11 -05002729 case HCI_OP_READ_PAGE_SCAN_ACTIVITY:
2730 hci_cc_read_page_scan_activity(hdev, skb);
2731 break;
2732
Johan Hedberg4a3ee762013-03-15 17:07:12 -05002733 case HCI_OP_WRITE_PAGE_SCAN_ACTIVITY:
2734 hci_cc_write_page_scan_activity(hdev, skb);
2735 break;
2736
Johan Hedbergf332ec62013-03-15 17:07:11 -05002737 case HCI_OP_READ_PAGE_SCAN_TYPE:
2738 hci_cc_read_page_scan_type(hdev, skb);
2739 break;
2740
Johan Hedberg4a3ee762013-03-15 17:07:12 -05002741 case HCI_OP_WRITE_PAGE_SCAN_TYPE:
2742 hci_cc_write_page_scan_type(hdev, skb);
2743 break;
2744
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +02002745 case HCI_OP_READ_DATA_BLOCK_SIZE:
2746 hci_cc_read_data_block_size(hdev, skb);
2747 break;
2748
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +02002749 case HCI_OP_READ_FLOW_CONTROL_MODE:
2750 hci_cc_read_flow_control_mode(hdev, skb);
2751 break;
2752
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +03002753 case HCI_OP_READ_LOCAL_AMP_INFO:
2754 hci_cc_read_local_amp_info(hdev, skb);
2755 break;
2756
Johan Hedberg33f35722014-06-28 17:54:06 +03002757 case HCI_OP_READ_CLOCK:
2758 hci_cc_read_clock(hdev, skb);
2759 break;
2760
Andrei Emeltchenko903e4542012-09-27 17:26:09 +03002761 case HCI_OP_READ_LOCAL_AMP_ASSOC:
2762 hci_cc_read_local_amp_assoc(hdev, skb);
2763 break;
2764
Johan Hedbergd5859e22011-01-25 01:19:58 +02002765 case HCI_OP_READ_INQ_RSP_TX_POWER:
2766 hci_cc_read_inq_rsp_tx_power(hdev, skb);
2767 break;
2768
Johan Hedberg980e1a52011-01-22 06:10:07 +02002769 case HCI_OP_PIN_CODE_REPLY:
2770 hci_cc_pin_code_reply(hdev, skb);
2771 break;
2772
2773 case HCI_OP_PIN_CODE_NEG_REPLY:
2774 hci_cc_pin_code_neg_reply(hdev, skb);
2775 break;
2776
Szymon Jancc35938b2011-03-22 13:12:21 +01002777 case HCI_OP_READ_LOCAL_OOB_DATA:
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08002778 hci_cc_read_local_oob_data(hdev, skb);
2779 break;
2780
2781 case HCI_OP_READ_LOCAL_OOB_EXT_DATA:
2782 hci_cc_read_local_oob_ext_data(hdev, skb);
Szymon Jancc35938b2011-03-22 13:12:21 +01002783 break;
2784
Ville Tervo6ed58ec2011-02-10 22:38:48 -03002785 case HCI_OP_LE_READ_BUFFER_SIZE:
2786 hci_cc_le_read_buffer_size(hdev, skb);
2787 break;
2788
Johan Hedberg60e77322013-01-22 14:01:59 +02002789 case HCI_OP_LE_READ_LOCAL_FEATURES:
2790 hci_cc_le_read_local_features(hdev, skb);
2791 break;
2792
Johan Hedberg8fa19092012-10-19 20:57:49 +03002793 case HCI_OP_LE_READ_ADV_TX_POWER:
2794 hci_cc_le_read_adv_tx_power(hdev, skb);
2795 break;
2796
Johan Hedberga5c29682011-02-19 12:05:57 -03002797 case HCI_OP_USER_CONFIRM_REPLY:
2798 hci_cc_user_confirm_reply(hdev, skb);
2799 break;
2800
2801 case HCI_OP_USER_CONFIRM_NEG_REPLY:
2802 hci_cc_user_confirm_neg_reply(hdev, skb);
2803 break;
2804
Brian Gix1143d452011-11-23 08:28:34 -08002805 case HCI_OP_USER_PASSKEY_REPLY:
2806 hci_cc_user_passkey_reply(hdev, skb);
2807 break;
2808
2809 case HCI_OP_USER_PASSKEY_NEG_REPLY:
2810 hci_cc_user_passkey_neg_reply(hdev, skb);
Szymon Janc16cde992012-04-13 12:32:42 +02002811 break;
Andre Guedes07f7fa52011-12-02 21:13:31 +09002812
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08002813 case HCI_OP_LE_SET_RANDOM_ADDR:
2814 hci_cc_le_set_random_addr(hdev, skb);
2815 break;
2816
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01002817 case HCI_OP_LE_SET_ADV_ENABLE:
2818 hci_cc_le_set_adv_enable(hdev, skb);
2819 break;
2820
Marcel Holtmann533553f2014-03-21 12:18:10 -07002821 case HCI_OP_LE_SET_SCAN_PARAM:
2822 hci_cc_le_set_scan_param(hdev, skb);
2823 break;
2824
Andre Guedeseb9d91f2011-05-26 16:23:52 -03002825 case HCI_OP_LE_SET_SCAN_ENABLE:
2826 hci_cc_le_set_scan_enable(hdev, skb);
2827 break;
2828
Johan Hedbergcf1d0812013-01-22 14:02:00 +02002829 case HCI_OP_LE_READ_WHITE_LIST_SIZE:
2830 hci_cc_le_read_white_list_size(hdev, skb);
2831 break;
2832
Marcel Holtmann0f36b582014-02-27 20:37:31 -08002833 case HCI_OP_LE_CLEAR_WHITE_LIST:
2834 hci_cc_le_clear_white_list(hdev, skb);
2835 break;
2836
2837 case HCI_OP_LE_ADD_TO_WHITE_LIST:
2838 hci_cc_le_add_to_white_list(hdev, skb);
2839 break;
2840
2841 case HCI_OP_LE_DEL_FROM_WHITE_LIST:
2842 hci_cc_le_del_from_white_list(hdev, skb);
2843 break;
2844
Johan Hedberg9b008c02013-01-22 14:02:01 +02002845 case HCI_OP_LE_READ_SUPPORTED_STATES:
2846 hci_cc_le_read_supported_states(hdev, skb);
2847 break;
2848
Andre Guedesf9b49302011-06-30 19:20:53 -03002849 case HCI_OP_WRITE_LE_HOST_SUPPORTED:
2850 hci_cc_write_le_host_supported(hdev, skb);
2851 break;
2852
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02002853 case HCI_OP_LE_SET_ADV_PARAM:
2854 hci_cc_set_adv_param(hdev, skb);
2855 break;
2856
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03002857 case HCI_OP_WRITE_REMOTE_AMP_ASSOC:
2858 hci_cc_write_remote_amp_assoc(hdev, skb);
2859 break;
2860
Andrzej Kaczmarek5ae76a92014-05-08 15:32:08 +02002861 case HCI_OP_READ_RSSI:
2862 hci_cc_read_rssi(hdev, skb);
2863 break;
2864
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02002865 case HCI_OP_READ_TX_POWER:
2866 hci_cc_read_tx_power(hdev, skb);
2867 break;
2868
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002869 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002870 BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002871 break;
2872 }
2873
Johan Hedbergad82cdd2013-03-09 09:53:50 +02002874 if (opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02002875 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02002876
Johan Hedbergad82cdd2013-03-09 09:53:50 +02002877 hci_req_cmd_complete(hdev, opcode, status);
Johan Hedberg9238f362013-03-05 20:37:48 +02002878
Szymon Jancdbccd792012-12-11 08:51:19 +01002879 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags)) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002880 atomic_set(&hdev->cmd_cnt, 1);
2881 if (!skb_queue_empty(&hdev->cmd_q))
Gustavo F. Padovanc347b762011-12-14 23:53:47 -02002882 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002883 }
2884}
2885
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002886static void hci_cmd_status_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002887{
2888 struct hci_ev_cmd_status *ev = (void *) skb->data;
2889 __u16 opcode;
2890
2891 skb_pull(skb, sizeof(*ev));
2892
2893 opcode = __le16_to_cpu(ev->opcode);
2894
2895 switch (opcode) {
2896 case HCI_OP_INQUIRY:
2897 hci_cs_inquiry(hdev, ev->status);
2898 break;
2899
2900 case HCI_OP_CREATE_CONN:
2901 hci_cs_create_conn(hdev, ev->status);
2902 break;
2903
Kuba Pawlak9645c762014-11-06 19:36:53 +01002904 case HCI_OP_DISCONNECT:
2905 hci_cs_disconnect(hdev, ev->status);
2906 break;
2907
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002908 case HCI_OP_ADD_SCO:
2909 hci_cs_add_sco(hdev, ev->status);
2910 break;
2911
Marcel Holtmannf8558552008-07-14 20:13:49 +02002912 case HCI_OP_AUTH_REQUESTED:
2913 hci_cs_auth_requested(hdev, ev->status);
2914 break;
2915
2916 case HCI_OP_SET_CONN_ENCRYPT:
2917 hci_cs_set_conn_encrypt(hdev, ev->status);
2918 break;
2919
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002920 case HCI_OP_REMOTE_NAME_REQ:
2921 hci_cs_remote_name_req(hdev, ev->status);
2922 break;
2923
Marcel Holtmann769be972008-07-14 20:13:49 +02002924 case HCI_OP_READ_REMOTE_FEATURES:
2925 hci_cs_read_remote_features(hdev, ev->status);
2926 break;
2927
2928 case HCI_OP_READ_REMOTE_EXT_FEATURES:
2929 hci_cs_read_remote_ext_features(hdev, ev->status);
2930 break;
2931
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002932 case HCI_OP_SETUP_SYNC_CONN:
2933 hci_cs_setup_sync_conn(hdev, ev->status);
2934 break;
2935
Kuba Pawlak9645c762014-11-06 19:36:53 +01002936 case HCI_OP_CREATE_PHY_LINK:
2937 hci_cs_create_phylink(hdev, ev->status);
2938 break;
2939
2940 case HCI_OP_ACCEPT_PHY_LINK:
2941 hci_cs_accept_phylink(hdev, ev->status);
2942 break;
2943
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002944 case HCI_OP_SNIFF_MODE:
2945 hci_cs_sniff_mode(hdev, ev->status);
2946 break;
2947
2948 case HCI_OP_EXIT_SNIFF_MODE:
2949 hci_cs_exit_sniff_mode(hdev, ev->status);
2950 break;
2951
Kuba Pawlak50fc85f2014-11-06 19:36:52 +01002952 case HCI_OP_SWITCH_ROLE:
2953 hci_cs_switch_role(hdev, ev->status);
2954 break;
2955
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02002956 case HCI_OP_LE_CREATE_CONN:
2957 hci_cs_le_create_conn(hdev, ev->status);
2958 break;
2959
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02002960 case HCI_OP_LE_START_ENC:
2961 hci_cs_le_start_enc(hdev, ev->status);
2962 break;
2963
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002964 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002965 BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002966 break;
2967 }
2968
Johan Hedbergad82cdd2013-03-09 09:53:50 +02002969 if (opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02002970 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02002971
Johan Hedberg02350a72013-04-03 21:50:29 +03002972 if (ev->status ||
2973 (hdev->sent_cmd && !bt_cb(hdev->sent_cmd)->req.event))
2974 hci_req_cmd_complete(hdev, opcode, ev->status);
Johan Hedberg9238f362013-03-05 20:37:48 +02002975
Gustavo F. Padovan10572132011-03-16 15:36:29 -03002976 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags)) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002977 atomic_set(&hdev->cmd_cnt, 1);
2978 if (!skb_queue_empty(&hdev->cmd_q))
Gustavo F. Padovanc347b762011-12-14 23:53:47 -02002979 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002980 }
2981}
2982
Marcel Holtmann24dfa342014-11-02 02:56:41 +01002983static void hci_hardware_error_evt(struct hci_dev *hdev, struct sk_buff *skb)
2984{
2985 struct hci_ev_hardware_error *ev = (void *) skb->data;
2986
2987 BT_ERR("%s hardware error 0x%2.2x", hdev->name, ev->code);
2988}
2989
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002990static void hci_role_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002991{
2992 struct hci_ev_role_change *ev = (void *) skb->data;
2993 struct hci_conn *conn;
2994
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002995 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002996
2997 hci_dev_lock(hdev);
2998
2999 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3000 if (conn) {
Johan Hedberg40bef302014-07-16 11:42:27 +03003001 if (!ev->status)
3002 conn->role = ev->role;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003003
Johan Hedberg51a8efd2012-01-16 06:10:31 +02003004 clear_bit(HCI_CONN_RSWITCH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003005
3006 hci_role_switch_cfm(conn, ev->status, ev->role);
3007 }
3008
3009 hci_dev_unlock(hdev);
3010}
3011
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003012static void hci_num_comp_pkts_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003013{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003014 struct hci_ev_num_comp_pkts *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003015 int i;
3016
Andrei Emeltchenko32ac5b92011-12-19 16:31:29 +02003017 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_PACKET_BASED) {
3018 BT_ERR("Wrong event for mode %d", hdev->flow_ctl_mode);
3019 return;
3020 }
3021
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02003022 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03003023 ev->num_hndl * sizeof(struct hci_comp_pkts_info)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003024 BT_DBG("%s bad parameters", hdev->name);
3025 return;
3026 }
3027
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02003028 BT_DBG("%s num_hndl %d", hdev->name, ev->num_hndl);
3029
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02003030 for (i = 0; i < ev->num_hndl; i++) {
3031 struct hci_comp_pkts_info *info = &ev->handles[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07003032 struct hci_conn *conn;
3033 __u16 handle, count;
3034
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02003035 handle = __le16_to_cpu(info->handle);
3036 count = __le16_to_cpu(info->count);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003037
3038 conn = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003039 if (!conn)
3040 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003041
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003042 conn->sent -= count;
3043
3044 switch (conn->type) {
3045 case ACL_LINK:
3046 hdev->acl_cnt += count;
3047 if (hdev->acl_cnt > hdev->acl_pkts)
3048 hdev->acl_cnt = hdev->acl_pkts;
3049 break;
3050
3051 case LE_LINK:
3052 if (hdev->le_pkts) {
3053 hdev->le_cnt += count;
3054 if (hdev->le_cnt > hdev->le_pkts)
3055 hdev->le_cnt = hdev->le_pkts;
3056 } else {
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02003057 hdev->acl_cnt += count;
3058 if (hdev->acl_cnt > hdev->acl_pkts)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003059 hdev->acl_cnt = hdev->acl_pkts;
3060 }
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003061 break;
3062
3063 case SCO_LINK:
3064 hdev->sco_cnt += count;
3065 if (hdev->sco_cnt > hdev->sco_pkts)
3066 hdev->sco_cnt = hdev->sco_pkts;
3067 break;
3068
3069 default:
3070 BT_ERR("Unknown type %d conn %p", conn->type, conn);
3071 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003072 }
3073 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003074
Gustavo F. Padovan3eff45e2011-12-15 00:50:02 -02003075 queue_work(hdev->workqueue, &hdev->tx_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003076}
3077
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003078static struct hci_conn *__hci_conn_lookup_handle(struct hci_dev *hdev,
3079 __u16 handle)
3080{
3081 struct hci_chan *chan;
3082
3083 switch (hdev->dev_type) {
3084 case HCI_BREDR:
3085 return hci_conn_hash_lookup_handle(hdev, handle);
3086 case HCI_AMP:
3087 chan = hci_chan_lookup_handle(hdev, handle);
3088 if (chan)
3089 return chan->conn;
3090 break;
3091 default:
3092 BT_ERR("%s unknown dev_type %d", hdev->name, hdev->dev_type);
3093 break;
3094 }
3095
3096 return NULL;
3097}
3098
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003099static void hci_num_comp_blocks_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003100{
3101 struct hci_ev_num_comp_blocks *ev = (void *) skb->data;
3102 int i;
3103
3104 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_BLOCK_BASED) {
3105 BT_ERR("Wrong event for mode %d", hdev->flow_ctl_mode);
3106 return;
3107 }
3108
3109 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03003110 ev->num_hndl * sizeof(struct hci_comp_blocks_info)) {
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003111 BT_DBG("%s bad parameters", hdev->name);
3112 return;
3113 }
3114
3115 BT_DBG("%s num_blocks %d num_hndl %d", hdev->name, ev->num_blocks,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003116 ev->num_hndl);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003117
3118 for (i = 0; i < ev->num_hndl; i++) {
3119 struct hci_comp_blocks_info *info = &ev->handles[i];
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003120 struct hci_conn *conn = NULL;
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003121 __u16 handle, block_count;
3122
3123 handle = __le16_to_cpu(info->handle);
3124 block_count = __le16_to_cpu(info->blocks);
3125
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003126 conn = __hci_conn_lookup_handle(hdev, handle);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003127 if (!conn)
3128 continue;
3129
3130 conn->sent -= block_count;
3131
3132 switch (conn->type) {
3133 case ACL_LINK:
Andrei Emeltchenkobd1eb662012-10-10 17:38:30 +03003134 case AMP_LINK:
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003135 hdev->block_cnt += block_count;
3136 if (hdev->block_cnt > hdev->num_blocks)
3137 hdev->block_cnt = hdev->num_blocks;
3138 break;
3139
3140 default:
3141 BT_ERR("Unknown type %d conn %p", conn->type, conn);
3142 break;
3143 }
3144 }
3145
3146 queue_work(hdev->workqueue, &hdev->tx_work);
3147}
3148
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003149static void hci_mode_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003150{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003151 struct hci_ev_mode_change *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003152 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003153
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003154 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003155
3156 hci_dev_lock(hdev);
3157
Marcel Holtmann04837f62006-07-03 10:02:33 +02003158 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3159 if (conn) {
3160 conn->mode = ev->mode;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003161
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003162 if (!test_and_clear_bit(HCI_CONN_MODE_CHANGE_PEND,
3163 &conn->flags)) {
Marcel Holtmann04837f62006-07-03 10:02:33 +02003164 if (conn->mode == HCI_CM_ACTIVE)
Johan Hedberg58a681e2012-01-16 06:47:28 +02003165 set_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003166 else
Johan Hedberg58a681e2012-01-16 06:47:28 +02003167 clear_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003168 }
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003169
Johan Hedberg51a8efd2012-01-16 06:10:31 +02003170 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003171 hci_sco_setup(conn, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003172 }
3173
3174 hci_dev_unlock(hdev);
3175}
3176
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003177static void hci_pin_code_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003178{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003179 struct hci_ev_pin_code_req *ev = (void *) skb->data;
3180 struct hci_conn *conn;
3181
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003182 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003183
3184 hci_dev_lock(hdev);
3185
3186 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003187 if (!conn)
3188 goto unlock;
3189
3190 if (conn->state == BT_CONNECTED) {
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003191 hci_conn_hold(conn);
3192 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003193 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003194 }
3195
Johan Hedbergb6ae8452014-07-30 09:22:22 +03003196 if (!test_bit(HCI_BONDABLE, &hdev->dev_flags) &&
Johan Hedberg2f407f02014-07-17 15:35:40 +03003197 !test_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags)) {
Johan Hedberg03b555e2011-01-04 15:40:05 +02003198 hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003199 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg2f407f02014-07-17 15:35:40 +03003200 } else if (test_bit(HCI_MGMT, &hdev->dev_flags)) {
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003201 u8 secure;
3202
3203 if (conn->pending_sec_level == BT_SECURITY_HIGH)
3204 secure = 1;
3205 else
3206 secure = 0;
3207
Johan Hedberg744cf192011-11-08 20:40:14 +02003208 mgmt_pin_code_request(hdev, &ev->bdaddr, secure);
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003209 }
Johan Hedberg980e1a52011-01-22 06:10:07 +02003210
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003211unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003212 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003213}
3214
Johan Hedbergcb6f3f72014-11-19 14:53:04 +02003215static void conn_set_key(struct hci_conn *conn, u8 key_type, u8 pin_len)
3216{
3217 if (key_type == HCI_LK_CHANGED_COMBINATION)
3218 return;
3219
3220 conn->pin_length = pin_len;
3221 conn->key_type = key_type;
3222
3223 switch (key_type) {
3224 case HCI_LK_LOCAL_UNIT:
3225 case HCI_LK_REMOTE_UNIT:
3226 case HCI_LK_DEBUG_COMBINATION:
3227 return;
3228 case HCI_LK_COMBINATION:
3229 if (pin_len == 16)
3230 conn->pending_sec_level = BT_SECURITY_HIGH;
3231 else
3232 conn->pending_sec_level = BT_SECURITY_MEDIUM;
3233 break;
3234 case HCI_LK_UNAUTH_COMBINATION_P192:
3235 case HCI_LK_UNAUTH_COMBINATION_P256:
3236 conn->pending_sec_level = BT_SECURITY_MEDIUM;
3237 break;
3238 case HCI_LK_AUTH_COMBINATION_P192:
3239 conn->pending_sec_level = BT_SECURITY_HIGH;
3240 break;
3241 case HCI_LK_AUTH_COMBINATION_P256:
3242 conn->pending_sec_level = BT_SECURITY_FIPS;
3243 break;
3244 }
3245}
3246
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003247static void hci_link_key_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003248{
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003249 struct hci_ev_link_key_req *ev = (void *) skb->data;
3250 struct hci_cp_link_key_reply cp;
3251 struct hci_conn *conn;
3252 struct link_key *key;
3253
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003254 BT_DBG("%s", hdev->name);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003255
Andrei Emeltchenko034cbea2013-05-14 11:44:16 +03003256 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003257 return;
3258
3259 hci_dev_lock(hdev);
3260
3261 key = hci_find_link_key(hdev, &ev->bdaddr);
3262 if (!key) {
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003263 BT_DBG("%s link key not found for %pMR", hdev->name,
3264 &ev->bdaddr);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003265 goto not_found;
3266 }
3267
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003268 BT_DBG("%s found key type %u for %pMR", hdev->name, key->type,
3269 &ev->bdaddr);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003270
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003271 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003272 if (conn) {
Johan Hedbergfe8bc5a2014-08-14 12:33:17 +03003273 clear_bit(HCI_CONN_NEW_LINK_KEY, &conn->flags);
3274
Marcel Holtmann66138ce2014-01-10 02:07:20 -08003275 if ((key->type == HCI_LK_UNAUTH_COMBINATION_P192 ||
3276 key->type == HCI_LK_UNAUTH_COMBINATION_P256) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03003277 conn->auth_type != 0xff && (conn->auth_type & 0x01)) {
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003278 BT_DBG("%s ignoring unauthenticated key", hdev->name);
3279 goto not_found;
3280 }
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003281
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003282 if (key->type == HCI_LK_COMBINATION && key->pin_len < 16 &&
Johan Hedbergf3fb0b52014-06-02 10:12:44 +03003283 (conn->pending_sec_level == BT_SECURITY_HIGH ||
3284 conn->pending_sec_level == BT_SECURITY_FIPS)) {
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003285 BT_DBG("%s ignoring key unauthenticated for high security",
3286 hdev->name);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003287 goto not_found;
3288 }
3289
Johan Hedbergcb6f3f72014-11-19 14:53:04 +02003290 conn_set_key(conn, key->type, key->pin_len);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003291 }
3292
3293 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9b3b4462012-05-23 11:31:20 +03003294 memcpy(cp.link_key, key->val, HCI_LINK_KEY_SIZE);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003295
3296 hci_send_cmd(hdev, HCI_OP_LINK_KEY_REPLY, sizeof(cp), &cp);
3297
3298 hci_dev_unlock(hdev);
3299
3300 return;
3301
3302not_found:
3303 hci_send_cmd(hdev, HCI_OP_LINK_KEY_NEG_REPLY, 6, &ev->bdaddr);
3304 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003305}
3306
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003307static void hci_link_key_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003308{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003309 struct hci_ev_link_key_notify *ev = (void *) skb->data;
3310 struct hci_conn *conn;
Johan Hedberg7652ff62014-06-24 13:15:49 +03003311 struct link_key *key;
3312 bool persistent;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003313 u8 pin_len = 0;
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003314
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003315 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003316
3317 hci_dev_lock(hdev);
3318
3319 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg82c13d42014-12-03 11:03:06 +02003320 if (!conn)
3321 goto unlock;
3322
3323 hci_conn_hold(conn);
3324 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
3325 hci_conn_drop(conn);
3326
Johan Hedbergfe8bc5a2014-08-14 12:33:17 +03003327 set_bit(HCI_CONN_NEW_LINK_KEY, &conn->flags);
Johan Hedberg82c13d42014-12-03 11:03:06 +02003328 conn_set_key(conn, ev->key_type, conn->pin_length);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003329
Johan Hedberg7652ff62014-06-24 13:15:49 +03003330 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
3331 goto unlock;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003332
Johan Hedberg7652ff62014-06-24 13:15:49 +03003333 key = hci_add_link_key(hdev, conn, &ev->bdaddr, ev->link_key,
3334 ev->key_type, pin_len, &persistent);
3335 if (!key)
3336 goto unlock;
3337
Johan Hedbergcb6f3f72014-11-19 14:53:04 +02003338 /* Update connection information since adding the key will have
3339 * fixed up the type in the case of changed combination keys.
3340 */
3341 if (ev->key_type == HCI_LK_CHANGED_COMBINATION)
3342 conn_set_key(conn, key->type, key->pin_len);
3343
Johan Hedberg7652ff62014-06-24 13:15:49 +03003344 mgmt_new_link_key(hdev, key, persistent);
3345
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003346 /* Keep debug keys around only if the HCI_KEEP_DEBUG_KEYS flag
3347 * is set. If it's not set simply remove the key from the kernel
3348 * list (we've still notified user space about it but with
3349 * store_hint being 0).
3350 */
3351 if (key->type == HCI_LK_DEBUG_COMBINATION &&
3352 !test_bit(HCI_KEEP_DEBUG_KEYS, &hdev->dev_flags)) {
Johan Hedberg0378b592014-11-19 15:22:22 +02003353 list_del_rcu(&key->list);
3354 kfree_rcu(key, rcu);
Johan Hedberg82c13d42014-12-03 11:03:06 +02003355 goto unlock;
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003356 }
Johan Hedberg7652ff62014-06-24 13:15:49 +03003357
Johan Hedberg82c13d42014-12-03 11:03:06 +02003358 if (persistent)
3359 clear_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
3360 else
3361 set_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
3362
Johan Hedberg7652ff62014-06-24 13:15:49 +03003363unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003364 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003365}
3366
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003367static void hci_clock_offset_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04837f62006-07-03 10:02:33 +02003368{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003369 struct hci_ev_clock_offset *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003370 struct hci_conn *conn;
3371
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003372 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003373
3374 hci_dev_lock(hdev);
3375
3376 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003377 if (conn && !ev->status) {
3378 struct inquiry_entry *ie;
3379
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003380 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3381 if (ie) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003382 ie->data.clock_offset = ev->clock_offset;
3383 ie->timestamp = jiffies;
3384 }
3385 }
3386
3387 hci_dev_unlock(hdev);
3388}
3389
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003390static void hci_pkt_type_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna8746412008-07-14 20:13:46 +02003391{
3392 struct hci_ev_pkt_type_change *ev = (void *) skb->data;
3393 struct hci_conn *conn;
3394
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003395 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna8746412008-07-14 20:13:46 +02003396
3397 hci_dev_lock(hdev);
3398
3399 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3400 if (conn && !ev->status)
3401 conn->pkt_type = __le16_to_cpu(ev->pkt_type);
3402
3403 hci_dev_unlock(hdev);
3404}
3405
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003406static void hci_pscan_rep_mode_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003407{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003408 struct hci_ev_pscan_rep_mode *ev = (void *) skb->data;
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003409 struct inquiry_entry *ie;
3410
3411 BT_DBG("%s", hdev->name);
3412
3413 hci_dev_lock(hdev);
3414
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003415 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
3416 if (ie) {
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003417 ie->data.pscan_rep_mode = ev->pscan_rep_mode;
3418 ie->timestamp = jiffies;
3419 }
3420
3421 hci_dev_unlock(hdev);
3422}
3423
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003424static void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev,
3425 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003426{
3427 struct inquiry_data data;
3428 int num_rsp = *((__u8 *) skb->data);
3429
3430 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
3431
3432 if (!num_rsp)
3433 return;
3434
Andre Guedes1519cc12012-03-21 00:03:38 -03003435 if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags))
3436 return;
3437
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003438 hci_dev_lock(hdev);
3439
3440 if ((skb->len - 1) / num_rsp != sizeof(struct inquiry_info_with_rssi)) {
Szymon Janc138d22e2011-02-17 16:44:23 +01003441 struct inquiry_info_with_rssi_and_pscan_mode *info;
3442 info = (void *) (skb->data + 1);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003443
Johan Hedberge17acd42011-03-30 23:57:16 +03003444 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003445 u32 flags;
3446
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003447 bacpy(&data.bdaddr, &info->bdaddr);
3448 data.pscan_rep_mode = info->pscan_rep_mode;
3449 data.pscan_period_mode = info->pscan_period_mode;
3450 data.pscan_mode = info->pscan_mode;
3451 memcpy(data.dev_class, info->dev_class, 3);
3452 data.clock_offset = info->clock_offset;
3453 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003454 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02003455
Marcel Holtmannaf589252014-07-01 14:11:20 +02003456 flags = hci_inquiry_cache_update(hdev, &data, false);
3457
Johan Hedberg48264f02011-11-09 13:58:58 +02003458 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003459 info->dev_class, info->rssi,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003460 flags, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003461 }
3462 } else {
3463 struct inquiry_info_with_rssi *info = (void *) (skb->data + 1);
3464
Johan Hedberge17acd42011-03-30 23:57:16 +03003465 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003466 u32 flags;
3467
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003468 bacpy(&data.bdaddr, &info->bdaddr);
3469 data.pscan_rep_mode = info->pscan_rep_mode;
3470 data.pscan_period_mode = info->pscan_period_mode;
3471 data.pscan_mode = 0x00;
3472 memcpy(data.dev_class, info->dev_class, 3);
3473 data.clock_offset = info->clock_offset;
3474 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003475 data.ssp_mode = 0x00;
Marcel Holtmannaf589252014-07-01 14:11:20 +02003476
3477 flags = hci_inquiry_cache_update(hdev, &data, false);
3478
Johan Hedberg48264f02011-11-09 13:58:58 +02003479 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003480 info->dev_class, info->rssi,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003481 flags, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003482 }
3483 }
3484
3485 hci_dev_unlock(hdev);
3486}
3487
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003488static void hci_remote_ext_features_evt(struct hci_dev *hdev,
3489 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003490{
Marcel Holtmann41a96212008-07-14 20:13:48 +02003491 struct hci_ev_remote_ext_features *ev = (void *) skb->data;
3492 struct hci_conn *conn;
3493
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003494 BT_DBG("%s", hdev->name);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003495
Marcel Holtmann41a96212008-07-14 20:13:48 +02003496 hci_dev_lock(hdev);
3497
3498 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02003499 if (!conn)
3500 goto unlock;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003501
Johan Hedbergcad718e2013-04-17 15:00:51 +03003502 if (ev->page < HCI_MAX_PAGES)
3503 memcpy(conn->features[ev->page], ev->features, 8);
3504
Johan Hedbergccd556f2010-11-10 17:11:51 +02003505 if (!ev->status && ev->page == 0x01) {
3506 struct inquiry_entry *ie;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003507
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003508 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3509 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02003510 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann769be972008-07-14 20:13:49 +02003511
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303512 if (ev->features[0] & LMP_HOST_SSP) {
Johan Hedberg58a681e2012-01-16 06:47:28 +02003513 set_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303514 } else {
3515 /* It is mandatory by the Bluetooth specification that
3516 * Extended Inquiry Results are only used when Secure
3517 * Simple Pairing is enabled, but some devices violate
3518 * this.
3519 *
3520 * To make these devices work, the internal SSP
3521 * enabled flag needs to be cleared if the remote host
3522 * features do not indicate SSP support */
3523 clear_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
3524 }
Marcel Holtmanneb9a8f32014-01-15 22:37:38 -08003525
3526 if (ev->features[0] & LMP_HOST_SC)
3527 set_bit(HCI_CONN_SC_ENABLED, &conn->flags);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003528 }
3529
Johan Hedbergccd556f2010-11-10 17:11:51 +02003530 if (conn->state != BT_CONFIG)
3531 goto unlock;
3532
Johan Hedberg671267b2012-05-12 16:11:50 -03003533 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02003534 struct hci_cp_remote_name_req cp;
3535 memset(&cp, 0, sizeof(cp));
3536 bacpy(&cp.bdaddr, &conn->dst);
3537 cp.pscan_rep_mode = 0x02;
3538 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02003539 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00003540 mgmt_device_connected(hdev, conn, 0, NULL, 0);
Johan Hedberg392599b2010-11-18 22:22:28 +02003541
Johan Hedberg127178d2010-11-18 22:22:29 +02003542 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02003543 conn->state = BT_CONNECTED;
3544 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02003545 hci_conn_drop(conn);
Johan Hedbergccd556f2010-11-10 17:11:51 +02003546 }
3547
3548unlock:
Marcel Holtmann41a96212008-07-14 20:13:48 +02003549 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003550}
3551
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003552static void hci_sync_conn_complete_evt(struct hci_dev *hdev,
3553 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003554{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003555 struct hci_ev_sync_conn_complete *ev = (void *) skb->data;
3556 struct hci_conn *conn;
3557
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003558 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003559
3560 hci_dev_lock(hdev);
3561
3562 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann9dc0a3a2008-07-14 20:13:46 +02003563 if (!conn) {
3564 if (ev->link_type == ESCO_LINK)
3565 goto unlock;
3566
3567 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
3568 if (!conn)
3569 goto unlock;
3570
3571 conn->type = SCO_LINK;
3572 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003573
Marcel Holtmann732547f2009-04-19 19:14:14 +02003574 switch (ev->status) {
3575 case 0x00:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003576 conn->handle = __le16_to_cpu(ev->handle);
3577 conn->state = BT_CONNECTED;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02003578
3579 hci_conn_add_sysfs(conn);
Marcel Holtmann732547f2009-04-19 19:14:14 +02003580 break;
3581
Nick Pelly81218d22014-06-30 11:25:01 +05303582 case 0x10: /* Connection Accept Timeout */
Frédéric Dalleau1a4c9582013-08-19 14:24:02 +02003583 case 0x0d: /* Connection Rejected due to Limited Resources */
Stephen Coe705e5712010-02-16 11:29:44 -05003584 case 0x11: /* Unsupported Feature or Parameter Value */
Marcel Holtmann732547f2009-04-19 19:14:14 +02003585 case 0x1c: /* SCO interval rejected */
Nick Pelly1038a002010-02-03 11:42:26 -08003586 case 0x1a: /* Unsupported Remote Feature */
Marcel Holtmann732547f2009-04-19 19:14:14 +02003587 case 0x1f: /* Unspecified error */
Andrew Earl27539bc2014-03-10 10:31:04 +00003588 case 0x20: /* Unsupported LMP Parameter value */
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02003589 if (conn->out) {
Marcel Holtmann732547f2009-04-19 19:14:14 +02003590 conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) |
3591 (hdev->esco_type & EDR_ESCO_MASK);
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02003592 if (hci_setup_sync(conn, conn->link->handle))
3593 goto unlock;
Marcel Holtmann732547f2009-04-19 19:14:14 +02003594 }
3595 /* fall through */
3596
3597 default:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003598 conn->state = BT_CLOSED;
Marcel Holtmann732547f2009-04-19 19:14:14 +02003599 break;
3600 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003601
3602 hci_proto_connect_cfm(conn, ev->status);
3603 if (ev->status)
3604 hci_conn_del(conn);
3605
3606unlock:
3607 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003608}
3609
Marcel Holtmannefdcf8e2013-10-15 10:31:12 -07003610static inline size_t eir_get_length(u8 *eir, size_t eir_len)
3611{
3612 size_t parsed = 0;
3613
3614 while (parsed < eir_len) {
3615 u8 field_len = eir[0];
3616
3617 if (field_len == 0)
3618 return parsed;
3619
3620 parsed += field_len + 1;
3621 eir += field_len + 1;
3622 }
3623
3624 return eir_len;
3625}
3626
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003627static void hci_extended_inquiry_result_evt(struct hci_dev *hdev,
3628 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003629{
3630 struct inquiry_data data;
3631 struct extended_inquiry_info *info = (void *) (skb->data + 1);
3632 int num_rsp = *((__u8 *) skb->data);
Vishal Agarwal9d939d92012-04-26 19:19:56 +05303633 size_t eir_len;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003634
3635 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
3636
3637 if (!num_rsp)
3638 return;
3639
Andre Guedes1519cc12012-03-21 00:03:38 -03003640 if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags))
3641 return;
3642
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003643 hci_dev_lock(hdev);
3644
Johan Hedberge17acd42011-03-30 23:57:16 +03003645 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003646 u32 flags;
3647 bool name_known;
Johan Hedberg561aafb2012-01-04 13:31:59 +02003648
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003649 bacpy(&data.bdaddr, &info->bdaddr);
Szymon Janc138d22e2011-02-17 16:44:23 +01003650 data.pscan_rep_mode = info->pscan_rep_mode;
3651 data.pscan_period_mode = info->pscan_period_mode;
3652 data.pscan_mode = 0x00;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003653 memcpy(data.dev_class, info->dev_class, 3);
Szymon Janc138d22e2011-02-17 16:44:23 +01003654 data.clock_offset = info->clock_offset;
3655 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003656 data.ssp_mode = 0x01;
Johan Hedberg561aafb2012-01-04 13:31:59 +02003657
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003658 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg4ddb1932012-01-15 20:04:43 +02003659 name_known = eir_has_data_type(info->data,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003660 sizeof(info->data),
3661 EIR_NAME_COMPLETE);
Johan Hedberg561aafb2012-01-04 13:31:59 +02003662 else
3663 name_known = true;
3664
Marcel Holtmannaf589252014-07-01 14:11:20 +02003665 flags = hci_inquiry_cache_update(hdev, &data, name_known);
3666
Vishal Agarwal9d939d92012-04-26 19:19:56 +05303667 eir_len = eir_get_length(info->data, sizeof(info->data));
Marcel Holtmannaf589252014-07-01 14:11:20 +02003668
Johan Hedberg48264f02011-11-09 13:58:58 +02003669 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003670 info->dev_class, info->rssi,
3671 flags, info->data, eir_len, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003672 }
3673
3674 hci_dev_unlock(hdev);
3675}
3676
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003677static void hci_key_refresh_complete_evt(struct hci_dev *hdev,
3678 struct sk_buff *skb)
3679{
3680 struct hci_ev_key_refresh_complete *ev = (void *) skb->data;
3681 struct hci_conn *conn;
3682
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003683 BT_DBG("%s status 0x%2.2x handle 0x%4.4x", hdev->name, ev->status,
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003684 __le16_to_cpu(ev->handle));
3685
3686 hci_dev_lock(hdev);
3687
3688 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3689 if (!conn)
3690 goto unlock;
3691
Johan Hedberg9eb1fbf2014-04-11 12:02:31 -07003692 /* For BR/EDR the necessary steps are taken through the
3693 * auth_complete event.
3694 */
3695 if (conn->type != LE_LINK)
3696 goto unlock;
3697
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003698 if (!ev->status)
3699 conn->sec_level = conn->pending_sec_level;
3700
3701 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
3702
3703 if (ev->status && conn->state == BT_CONNECTED) {
Andre Guedesbed71742013-01-30 11:50:56 -03003704 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
David Herrmann76a68ba2013-04-06 20:28:37 +02003705 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003706 goto unlock;
3707 }
3708
3709 if (conn->state == BT_CONFIG) {
3710 if (!ev->status)
3711 conn->state = BT_CONNECTED;
3712
3713 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02003714 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003715 } else {
3716 hci_auth_cfm(conn, ev->status);
3717
3718 hci_conn_hold(conn);
3719 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003720 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003721 }
3722
3723unlock:
3724 hci_dev_unlock(hdev);
3725}
3726
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003727static u8 hci_get_auth_req(struct hci_conn *conn)
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003728{
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003729 /* If remote requests no-bonding follow that lead */
Mikel Astizacabae92013-06-28 10:56:28 +02003730 if (conn->remote_auth == HCI_AT_NO_BONDING ||
3731 conn->remote_auth == HCI_AT_NO_BONDING_MITM)
Waldemar Rymarkiewicz58797bf2011-04-28 12:07:58 +02003732 return conn->remote_auth | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003733
Mikel Astizb7f94c82014-04-08 14:21:31 +02003734 /* If both remote and local have enough IO capabilities, require
3735 * MITM protection
3736 */
3737 if (conn->remote_cap != HCI_IO_NO_INPUT_OUTPUT &&
3738 conn->io_capability != HCI_IO_NO_INPUT_OUTPUT)
3739 return conn->remote_auth | 0x01;
3740
Timo Mueller7e741702014-04-08 14:21:33 +02003741 /* No MITM protection possible so ignore remote requirement */
3742 return (conn->remote_auth & ~0x01) | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003743}
3744
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003745static void hci_io_capa_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02003746{
3747 struct hci_ev_io_capa_request *ev = (void *) skb->data;
3748 struct hci_conn *conn;
3749
3750 BT_DBG("%s", hdev->name);
3751
3752 hci_dev_lock(hdev);
3753
3754 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003755 if (!conn)
3756 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02003757
Johan Hedberg03b555e2011-01-04 15:40:05 +02003758 hci_conn_hold(conn);
3759
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003760 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg03b555e2011-01-04 15:40:05 +02003761 goto unlock;
3762
Johan Hedberg2f407f02014-07-17 15:35:40 +03003763 /* Allow pairing if we're pairable, the initiators of the
3764 * pairing or if the remote is not requesting bonding.
3765 */
Johan Hedbergb6ae8452014-07-30 09:22:22 +03003766 if (test_bit(HCI_BONDABLE, &hdev->dev_flags) ||
Johan Hedberg2f407f02014-07-17 15:35:40 +03003767 test_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags) ||
Gustavo Padovan807deac2012-05-17 00:36:24 -03003768 (conn->remote_auth & ~0x01) == HCI_AT_NO_BONDING) {
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003769 struct hci_cp_io_capability_reply cp;
3770
3771 bacpy(&cp.bdaddr, &ev->bdaddr);
Hemant Gupta7a7f1e72012-01-16 13:34:29 +05303772 /* Change the IO capability from KeyboardDisplay
3773 * to DisplayYesNo as it is not supported by BT spec. */
3774 cp.capability = (conn->io_capability == 0x04) ?
Mikel Astiza7676312013-06-28 10:56:29 +02003775 HCI_IO_DISPLAY_YESNO : conn->io_capability;
Mikel Astizb7f94c82014-04-08 14:21:31 +02003776
3777 /* If we are initiators, there is no remote information yet */
3778 if (conn->remote_auth == 0xff) {
Mikel Astizb16c6602014-04-08 14:21:34 +02003779 /* Request MITM protection if our IO caps allow it
Johan Hedberg4ad51a72014-06-09 14:41:25 +03003780 * except for the no-bonding case.
Mikel Astizb16c6602014-04-08 14:21:34 +02003781 */
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003782 if (conn->io_capability != HCI_IO_NO_INPUT_OUTPUT &&
Johan Hedberg9f743d72014-07-17 11:56:33 +03003783 conn->auth_type != HCI_AT_NO_BONDING)
Johan Hedberg6c538232014-07-11 15:32:23 +03003784 conn->auth_type |= 0x01;
Mikel Astizb7f94c82014-04-08 14:21:31 +02003785 } else {
3786 conn->auth_type = hci_get_auth_req(conn);
Mikel Astizb7f94c82014-04-08 14:21:31 +02003787 }
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003788
Johan Hedberg82c295b2014-07-30 09:22:24 +03003789 /* If we're not bondable, force one of the non-bondable
3790 * authentication requirement values.
3791 */
3792 if (!test_bit(HCI_BONDABLE, &hdev->dev_flags))
3793 conn->auth_type &= HCI_AT_NO_BONDING_MITM;
3794
3795 cp.authentication = conn->auth_type;
3796
Johan Hedberg6928a922014-10-26 20:46:09 +01003797 if (hci_find_remote_oob_data(hdev, &conn->dst, BDADDR_BREDR) &&
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003798 (conn->out || test_bit(HCI_CONN_REMOTE_OOB, &conn->flags)))
Szymon Jancce85ee12011-03-22 13:12:23 +01003799 cp.oob_data = 0x01;
3800 else
3801 cp.oob_data = 0x00;
3802
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003803 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003804 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003805 } else {
3806 struct hci_cp_io_capability_neg_reply cp;
3807
3808 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02003809 cp.reason = HCI_ERROR_PAIRING_NOT_ALLOWED;
Johan Hedberg03b555e2011-01-04 15:40:05 +02003810
3811 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003812 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003813 }
3814
3815unlock:
3816 hci_dev_unlock(hdev);
3817}
3818
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003819static void hci_io_capa_reply_evt(struct hci_dev *hdev, struct sk_buff *skb)
Johan Hedberg03b555e2011-01-04 15:40:05 +02003820{
3821 struct hci_ev_io_capa_reply *ev = (void *) skb->data;
3822 struct hci_conn *conn;
3823
3824 BT_DBG("%s", hdev->name);
3825
3826 hci_dev_lock(hdev);
3827
3828 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3829 if (!conn)
3830 goto unlock;
3831
Johan Hedberg03b555e2011-01-04 15:40:05 +02003832 conn->remote_cap = ev->capability;
Johan Hedberg03b555e2011-01-04 15:40:05 +02003833 conn->remote_auth = ev->authentication;
Johan Hedberg58a681e2012-01-16 06:47:28 +02003834 if (ev->oob_data)
3835 set_bit(HCI_CONN_REMOTE_OOB, &conn->flags);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003836
3837unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02003838 hci_dev_unlock(hdev);
3839}
3840
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003841static void hci_user_confirm_request_evt(struct hci_dev *hdev,
3842 struct sk_buff *skb)
Johan Hedberga5c29682011-02-19 12:05:57 -03003843{
3844 struct hci_ev_user_confirm_req *ev = (void *) skb->data;
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003845 int loc_mitm, rem_mitm, confirm_hint = 0;
Johan Hedberg7a828902011-04-28 11:28:53 -07003846 struct hci_conn *conn;
Johan Hedberga5c29682011-02-19 12:05:57 -03003847
3848 BT_DBG("%s", hdev->name);
3849
3850 hci_dev_lock(hdev);
3851
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003852 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg7a828902011-04-28 11:28:53 -07003853 goto unlock;
Johan Hedberga5c29682011-02-19 12:05:57 -03003854
Johan Hedberg7a828902011-04-28 11:28:53 -07003855 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3856 if (!conn)
3857 goto unlock;
3858
3859 loc_mitm = (conn->auth_type & 0x01);
3860 rem_mitm = (conn->remote_auth & 0x01);
3861
3862 /* If we require MITM but the remote device can't provide that
Johan Hedberg6c538232014-07-11 15:32:23 +03003863 * (it has NoInputNoOutput) then reject the confirmation
3864 * request. We check the security level here since it doesn't
3865 * necessarily match conn->auth_type.
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003866 */
Johan Hedberg6c538232014-07-11 15:32:23 +03003867 if (conn->pending_sec_level > BT_SECURITY_MEDIUM &&
3868 conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) {
Johan Hedberg7a828902011-04-28 11:28:53 -07003869 BT_DBG("Rejecting request: remote device can't provide MITM");
3870 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003871 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07003872 goto unlock;
3873 }
3874
3875 /* If no side requires MITM protection; auto-accept */
Mikel Astiza7676312013-06-28 10:56:29 +02003876 if ((!loc_mitm || conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) &&
3877 (!rem_mitm || conn->io_capability == HCI_IO_NO_INPUT_OUTPUT)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003878
3879 /* If we're not the initiators request authorization to
3880 * proceed from user space (mgmt_user_confirm with
Johan Hedbergba15a582014-06-09 13:58:14 +03003881 * confirm_hint set to 1). The exception is if neither
Johan Hedberg02f3e252014-07-16 15:09:13 +03003882 * side had MITM or if the local IO capability is
3883 * NoInputNoOutput, in which case we do auto-accept
Johan Hedbergba15a582014-06-09 13:58:14 +03003884 */
3885 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) &&
Johan Hedberg02f3e252014-07-16 15:09:13 +03003886 conn->io_capability != HCI_IO_NO_INPUT_OUTPUT &&
Johan Hedbergba15a582014-06-09 13:58:14 +03003887 (loc_mitm || rem_mitm)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003888 BT_DBG("Confirming auto-accept as acceptor");
3889 confirm_hint = 1;
3890 goto confirm;
3891 }
3892
Johan Hedberg9f616562011-04-28 11:28:54 -07003893 BT_DBG("Auto-accept of user confirmation with %ums delay",
Gustavo Padovan807deac2012-05-17 00:36:24 -03003894 hdev->auto_accept_delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07003895
3896 if (hdev->auto_accept_delay > 0) {
3897 int delay = msecs_to_jiffies(hdev->auto_accept_delay);
Johan Hedberg7bc18d92013-10-16 18:11:39 +03003898 queue_delayed_work(conn->hdev->workqueue,
3899 &conn->auto_accept_work, delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07003900 goto unlock;
3901 }
3902
Johan Hedberg7a828902011-04-28 11:28:53 -07003903 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003904 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07003905 goto unlock;
3906 }
3907
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003908confirm:
Johan Hedberg39adbff2014-03-20 08:18:14 +02003909 mgmt_user_confirm_request(hdev, &ev->bdaddr, ACL_LINK, 0,
3910 le32_to_cpu(ev->passkey), confirm_hint);
Johan Hedberg7a828902011-04-28 11:28:53 -07003911
3912unlock:
Johan Hedberga5c29682011-02-19 12:05:57 -03003913 hci_dev_unlock(hdev);
3914}
3915
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003916static void hci_user_passkey_request_evt(struct hci_dev *hdev,
3917 struct sk_buff *skb)
Brian Gix1143d452011-11-23 08:28:34 -08003918{
3919 struct hci_ev_user_passkey_req *ev = (void *) skb->data;
3920
3921 BT_DBG("%s", hdev->name);
3922
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003923 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg272d90d2012-02-09 15:26:12 +02003924 mgmt_user_passkey_request(hdev, &ev->bdaddr, ACL_LINK, 0);
Brian Gix1143d452011-11-23 08:28:34 -08003925}
3926
Johan Hedberg92a25252012-09-06 18:39:26 +03003927static void hci_user_passkey_notify_evt(struct hci_dev *hdev,
3928 struct sk_buff *skb)
3929{
3930 struct hci_ev_user_passkey_notify *ev = (void *) skb->data;
3931 struct hci_conn *conn;
3932
3933 BT_DBG("%s", hdev->name);
3934
3935 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3936 if (!conn)
3937 return;
3938
3939 conn->passkey_notify = __le32_to_cpu(ev->passkey);
3940 conn->passkey_entered = 0;
3941
3942 if (test_bit(HCI_MGMT, &hdev->dev_flags))
3943 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
3944 conn->dst_type, conn->passkey_notify,
3945 conn->passkey_entered);
3946}
3947
3948static void hci_keypress_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
3949{
3950 struct hci_ev_keypress_notify *ev = (void *) skb->data;
3951 struct hci_conn *conn;
3952
3953 BT_DBG("%s", hdev->name);
3954
3955 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3956 if (!conn)
3957 return;
3958
3959 switch (ev->type) {
3960 case HCI_KEYPRESS_STARTED:
3961 conn->passkey_entered = 0;
3962 return;
3963
3964 case HCI_KEYPRESS_ENTERED:
3965 conn->passkey_entered++;
3966 break;
3967
3968 case HCI_KEYPRESS_ERASED:
3969 conn->passkey_entered--;
3970 break;
3971
3972 case HCI_KEYPRESS_CLEARED:
3973 conn->passkey_entered = 0;
3974 break;
3975
3976 case HCI_KEYPRESS_COMPLETED:
3977 return;
3978 }
3979
3980 if (test_bit(HCI_MGMT, &hdev->dev_flags))
3981 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
3982 conn->dst_type, conn->passkey_notify,
3983 conn->passkey_entered);
3984}
3985
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003986static void hci_simple_pair_complete_evt(struct hci_dev *hdev,
3987 struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02003988{
3989 struct hci_ev_simple_pair_complete *ev = (void *) skb->data;
3990 struct hci_conn *conn;
3991
3992 BT_DBG("%s", hdev->name);
3993
3994 hci_dev_lock(hdev);
3995
3996 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg2a611692011-02-19 12:06:00 -03003997 if (!conn)
3998 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02003999
Johan Hedbergc1d4fa72014-07-17 15:14:50 +03004000 /* Reset the authentication requirement to unknown */
4001 conn->remote_auth = 0xff;
4002
Johan Hedberg2a611692011-02-19 12:06:00 -03004003 /* To avoid duplicate auth_failed events to user space we check
4004 * the HCI_CONN_AUTH_PEND flag which will be set if we
4005 * initiated the authentication. A traditional auth_complete
4006 * event gets always produced as initiator and is also mapped to
4007 * the mgmt_auth_failed event */
Mikel Astizfa1bd912012-08-09 09:52:29 +02004008 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) && ev->status)
Johan Hedberge1e930f2014-09-08 17:09:49 -07004009 mgmt_auth_failed(conn, ev->status);
Johan Hedberg2a611692011-02-19 12:06:00 -03004010
David Herrmann76a68ba2013-04-06 20:28:37 +02004011 hci_conn_drop(conn);
Johan Hedberg2a611692011-02-19 12:06:00 -03004012
4013unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02004014 hci_dev_unlock(hdev);
4015}
4016
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004017static void hci_remote_host_features_evt(struct hci_dev *hdev,
4018 struct sk_buff *skb)
Marcel Holtmann41a96212008-07-14 20:13:48 +02004019{
4020 struct hci_ev_remote_host_features *ev = (void *) skb->data;
4021 struct inquiry_entry *ie;
Johan Hedbergcad718e2013-04-17 15:00:51 +03004022 struct hci_conn *conn;
Marcel Holtmann41a96212008-07-14 20:13:48 +02004023
4024 BT_DBG("%s", hdev->name);
4025
4026 hci_dev_lock(hdev);
4027
Johan Hedbergcad718e2013-04-17 15:00:51 +03004028 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4029 if (conn)
4030 memcpy(conn->features[1], ev->features, 8);
4031
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02004032 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
4033 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02004034 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann41a96212008-07-14 20:13:48 +02004035
4036 hci_dev_unlock(hdev);
4037}
4038
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004039static void hci_remote_oob_data_request_evt(struct hci_dev *hdev,
4040 struct sk_buff *skb)
Szymon Janc2763eda2011-03-22 13:12:22 +01004041{
4042 struct hci_ev_remote_oob_data_request *ev = (void *) skb->data;
4043 struct oob_data *data;
4044
4045 BT_DBG("%s", hdev->name);
4046
4047 hci_dev_lock(hdev);
4048
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02004049 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Szymon Jance1ba1f12011-04-06 13:01:59 +02004050 goto unlock;
4051
Johan Hedberg6928a922014-10-26 20:46:09 +01004052 data = hci_find_remote_oob_data(hdev, &ev->bdaddr, BDADDR_BREDR);
Szymon Janc2763eda2011-03-22 13:12:22 +01004053 if (data) {
Johan Hedberg710f11c2014-05-26 11:21:22 +03004054 if (bredr_sc_enabled(hdev)) {
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08004055 struct hci_cp_remote_oob_ext_data_reply cp;
Szymon Janc2763eda2011-03-22 13:12:22 +01004056
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08004057 bacpy(&cp.bdaddr, &ev->bdaddr);
4058 memcpy(cp.hash192, data->hash192, sizeof(cp.hash192));
Johan Hedberg38da1702014-11-17 20:52:20 +02004059 memcpy(cp.rand192, data->rand192, sizeof(cp.rand192));
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08004060 memcpy(cp.hash256, data->hash256, sizeof(cp.hash256));
Johan Hedberg38da1702014-11-17 20:52:20 +02004061 memcpy(cp.rand256, data->rand256, sizeof(cp.rand256));
Szymon Janc2763eda2011-03-22 13:12:22 +01004062
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08004063 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_EXT_DATA_REPLY,
4064 sizeof(cp), &cp);
4065 } else {
4066 struct hci_cp_remote_oob_data_reply cp;
4067
4068 bacpy(&cp.bdaddr, &ev->bdaddr);
4069 memcpy(cp.hash, data->hash192, sizeof(cp.hash));
Johan Hedberg38da1702014-11-17 20:52:20 +02004070 memcpy(cp.rand, data->rand192, sizeof(cp.rand));
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08004071
4072 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_REPLY,
4073 sizeof(cp), &cp);
4074 }
Szymon Janc2763eda2011-03-22 13:12:22 +01004075 } else {
4076 struct hci_cp_remote_oob_data_neg_reply cp;
4077
4078 bacpy(&cp.bdaddr, &ev->bdaddr);
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08004079 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_NEG_REPLY,
4080 sizeof(cp), &cp);
Szymon Janc2763eda2011-03-22 13:12:22 +01004081 }
4082
Szymon Jance1ba1f12011-04-06 13:01:59 +02004083unlock:
Szymon Janc2763eda2011-03-22 13:12:22 +01004084 hci_dev_unlock(hdev);
4085}
4086
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004087static void hci_phy_link_complete_evt(struct hci_dev *hdev,
4088 struct sk_buff *skb)
4089{
4090 struct hci_ev_phy_link_complete *ev = (void *) skb->data;
4091 struct hci_conn *hcon, *bredr_hcon;
4092
4093 BT_DBG("%s handle 0x%2.2x status 0x%2.2x", hdev->name, ev->phy_handle,
4094 ev->status);
4095
4096 hci_dev_lock(hdev);
4097
4098 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4099 if (!hcon) {
4100 hci_dev_unlock(hdev);
4101 return;
4102 }
4103
4104 if (ev->status) {
4105 hci_conn_del(hcon);
4106 hci_dev_unlock(hdev);
4107 return;
4108 }
4109
4110 bredr_hcon = hcon->amp_mgr->l2cap_conn->hcon;
4111
4112 hcon->state = BT_CONNECTED;
4113 bacpy(&hcon->dst, &bredr_hcon->dst);
4114
4115 hci_conn_hold(hcon);
4116 hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02004117 hci_conn_drop(hcon);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004118
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004119 hci_conn_add_sysfs(hcon);
4120
Andrei Emeltchenkocf70ff22012-10-31 15:46:36 +02004121 amp_physical_cfm(bredr_hcon, hcon);
4122
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004123 hci_dev_unlock(hdev);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004124}
4125
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004126static void hci_loglink_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
4127{
4128 struct hci_ev_logical_link_complete *ev = (void *) skb->data;
4129 struct hci_conn *hcon;
4130 struct hci_chan *hchan;
4131 struct amp_mgr *mgr;
4132
4133 BT_DBG("%s log_handle 0x%4.4x phy_handle 0x%2.2x status 0x%2.2x",
4134 hdev->name, le16_to_cpu(ev->handle), ev->phy_handle,
4135 ev->status);
4136
4137 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4138 if (!hcon)
4139 return;
4140
4141 /* Create AMP hchan */
4142 hchan = hci_chan_create(hcon);
4143 if (!hchan)
4144 return;
4145
4146 hchan->handle = le16_to_cpu(ev->handle);
4147
4148 BT_DBG("hcon %p mgr %p hchan %p", hcon, hcon->amp_mgr, hchan);
4149
4150 mgr = hcon->amp_mgr;
4151 if (mgr && mgr->bredr_chan) {
4152 struct l2cap_chan *bredr_chan = mgr->bredr_chan;
4153
4154 l2cap_chan_lock(bredr_chan);
4155
4156 bredr_chan->conn->mtu = hdev->block_mtu;
4157 l2cap_logical_cfm(bredr_chan, hchan, 0);
4158 hci_conn_hold(hcon);
4159
4160 l2cap_chan_unlock(bredr_chan);
4161 }
4162}
4163
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02004164static void hci_disconn_loglink_complete_evt(struct hci_dev *hdev,
4165 struct sk_buff *skb)
4166{
4167 struct hci_ev_disconn_logical_link_complete *ev = (void *) skb->data;
4168 struct hci_chan *hchan;
4169
4170 BT_DBG("%s log handle 0x%4.4x status 0x%2.2x", hdev->name,
4171 le16_to_cpu(ev->handle), ev->status);
4172
4173 if (ev->status)
4174 return;
4175
4176 hci_dev_lock(hdev);
4177
4178 hchan = hci_chan_lookup_handle(hdev, le16_to_cpu(ev->handle));
4179 if (!hchan)
4180 goto unlock;
4181
4182 amp_destroy_logical_link(hchan, ev->reason);
4183
4184unlock:
4185 hci_dev_unlock(hdev);
4186}
4187
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02004188static void hci_disconn_phylink_complete_evt(struct hci_dev *hdev,
4189 struct sk_buff *skb)
4190{
4191 struct hci_ev_disconn_phy_link_complete *ev = (void *) skb->data;
4192 struct hci_conn *hcon;
4193
4194 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4195
4196 if (ev->status)
4197 return;
4198
4199 hci_dev_lock(hdev);
4200
4201 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4202 if (hcon) {
4203 hcon->state = BT_CLOSED;
4204 hci_conn_del(hcon);
4205 }
4206
4207 hci_dev_unlock(hdev);
4208}
4209
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004210static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03004211{
4212 struct hci_ev_le_conn_complete *ev = (void *) skb->data;
Johan Hedberg912b42e2014-07-03 19:33:49 +03004213 struct hci_conn_params *params;
Ville Tervofcd89c02011-02-10 22:38:47 -03004214 struct hci_conn *conn;
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004215 struct smp_irk *irk;
Johan Hedberg837d5022014-07-02 09:36:22 +03004216 u8 addr_type;
Ville Tervofcd89c02011-02-10 22:38:47 -03004217
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004218 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Ville Tervofcd89c02011-02-10 22:38:47 -03004219
4220 hci_dev_lock(hdev);
4221
Johan Hedbergfbd96c12014-07-08 17:21:51 +03004222 /* All controllers implicitly stop advertising in the event of a
4223 * connection, so ensure that the state bit is cleared.
4224 */
4225 clear_bit(HCI_LE_ADV, &hdev->dev_flags);
4226
Andre Guedesb47a09b2012-07-27 15:10:15 -03004227 conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
Ville Tervob62f3282011-02-10 22:38:50 -03004228 if (!conn) {
Johan Hedberga5c4e302014-07-16 11:56:07 +03004229 conn = hci_conn_add(hdev, LE_LINK, &ev->bdaddr, ev->role);
Ville Tervob62f3282011-02-10 22:38:50 -03004230 if (!conn) {
4231 BT_ERR("No memory for new connection");
Andre Guedes230fd162012-07-27 15:10:10 -03004232 goto unlock;
Ville Tervob62f3282011-02-10 22:38:50 -03004233 }
Andre Guedes29b79882011-05-31 14:20:54 -03004234
4235 conn->dst_type = ev->bdaddr_type;
Andre Guedesb9b343d2012-07-27 15:10:11 -03004236
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004237 /* If we didn't have a hci_conn object previously
4238 * but we're in master role this must be something
4239 * initiated using a white list. Since white list based
4240 * connections are not "first class citizens" we don't
4241 * have full tracking of them. Therefore, we go ahead
4242 * with a "best effort" approach of determining the
4243 * initiator address based on the HCI_PRIVACY flag.
4244 */
4245 if (conn->out) {
4246 conn->resp_addr_type = ev->bdaddr_type;
4247 bacpy(&conn->resp_addr, &ev->bdaddr);
4248 if (test_bit(HCI_PRIVACY, &hdev->dev_flags)) {
4249 conn->init_addr_type = ADDR_LE_DEV_RANDOM;
4250 bacpy(&conn->init_addr, &hdev->rpa);
4251 } else {
4252 hci_copy_identity_address(hdev,
4253 &conn->init_addr,
4254 &conn->init_addr_type);
4255 }
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004256 }
Johan Hedberg9489eca2014-02-28 17:45:46 +02004257 } else {
4258 cancel_delayed_work(&conn->le_conn_timeout);
Ville Tervob62f3282011-02-10 22:38:50 -03004259 }
Ville Tervofcd89c02011-02-10 22:38:47 -03004260
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004261 if (!conn->out) {
4262 /* Set the responder (our side) address type based on
4263 * the advertising address type.
4264 */
4265 conn->resp_addr_type = hdev->adv_addr_type;
4266 if (hdev->adv_addr_type == ADDR_LE_DEV_RANDOM)
4267 bacpy(&conn->resp_addr, &hdev->random_addr);
4268 else
4269 bacpy(&conn->resp_addr, &hdev->bdaddr);
4270
4271 conn->init_addr_type = ev->bdaddr_type;
4272 bacpy(&conn->init_addr, &ev->bdaddr);
Marcel Holtmanna720d732014-06-23 12:14:51 +02004273
4274 /* For incoming connections, set the default minimum
4275 * and maximum connection interval. They will be used
4276 * to check if the parameters are in range and if not
4277 * trigger the connection update procedure.
4278 */
4279 conn->le_conn_min_interval = hdev->le_conn_min_interval;
4280 conn->le_conn_max_interval = hdev->le_conn_max_interval;
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004281 }
Johan Hedberg7be2edb2014-02-23 19:42:17 +02004282
Marcel Holtmannedb4b462014-02-18 15:13:43 -08004283 /* Lookup the identity address from the stored connection
4284 * address and address type.
4285 *
4286 * When establishing connections to an identity address, the
4287 * connection procedure will store the resolvable random
4288 * address first. Now if it can be converted back into the
4289 * identity address, start using the identity address from
4290 * now on.
4291 */
4292 irk = hci_get_irk(hdev, &conn->dst, conn->dst_type);
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004293 if (irk) {
4294 bacpy(&conn->dst, &irk->bdaddr);
4295 conn->dst_type = irk->addr_type;
4296 }
4297
Johan Hedberg2d3c2262014-07-15 11:51:28 +03004298 if (ev->status) {
4299 hci_le_conn_failed(conn, ev->status);
Johan Hedberg837d5022014-07-02 09:36:22 +03004300 goto unlock;
4301 }
4302
Johan Hedberg08853f12014-08-15 21:06:55 +03004303 if (conn->dst_type == ADDR_LE_DEV_PUBLIC)
4304 addr_type = BDADDR_LE_PUBLIC;
4305 else
4306 addr_type = BDADDR_LE_RANDOM;
4307
Johan Hedberg2d3c2262014-07-15 11:51:28 +03004308 /* Drop the connection if the device is blocked */
4309 if (hci_bdaddr_list_lookup(&hdev->blacklist, &conn->dst, addr_type)) {
4310 hci_conn_drop(conn);
Andre Guedescd17dec2012-07-27 15:10:16 -03004311 goto unlock;
4312 }
4313
Johan Hedbergb644ba32012-01-17 21:48:47 +02004314 if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00004315 mgmt_device_connected(hdev, conn, 0, NULL, 0);
Vinicius Costa Gomes83bc71b2011-05-06 18:41:43 -03004316
Vinicius Costa Gomes7b5c0d52011-06-09 18:50:50 -03004317 conn->sec_level = BT_SECURITY_LOW;
Ville Tervofcd89c02011-02-10 22:38:47 -03004318 conn->handle = __le16_to_cpu(ev->handle);
4319 conn->state = BT_CONNECTED;
4320
Marcel Holtmanne04fde62014-06-23 11:40:04 +02004321 conn->le_conn_interval = le16_to_cpu(ev->interval);
4322 conn->le_conn_latency = le16_to_cpu(ev->latency);
4323 conn->le_supv_timeout = le16_to_cpu(ev->supervision_timeout);
4324
Ville Tervofcd89c02011-02-10 22:38:47 -03004325 hci_conn_add_sysfs(conn);
4326
4327 hci_proto_connect_cfm(conn, ev->status);
4328
Johan Hedberg54776102014-08-15 21:06:56 +03004329 params = hci_pend_le_action_lookup(&hdev->pend_le_conns, &conn->dst,
4330 conn->dst_type);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004331 if (params) {
Johan Hedberg95305ba2014-07-04 12:37:21 +03004332 list_del_init(&params->action);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004333 if (params->conn) {
4334 hci_conn_drop(params->conn);
Johan Hedbergf8aaf9b2014-08-17 23:28:57 +03004335 hci_conn_put(params->conn);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004336 params->conn = NULL;
4337 }
4338 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004339
Ville Tervofcd89c02011-02-10 22:38:47 -03004340unlock:
Johan Hedberg223683a2014-07-06 15:44:23 +03004341 hci_update_background_scan(hdev);
Ville Tervofcd89c02011-02-10 22:38:47 -03004342 hci_dev_unlock(hdev);
4343}
4344
Marcel Holtmann1855d922014-06-23 11:40:05 +02004345static void hci_le_conn_update_complete_evt(struct hci_dev *hdev,
4346 struct sk_buff *skb)
4347{
4348 struct hci_ev_le_conn_update_complete *ev = (void *) skb->data;
4349 struct hci_conn *conn;
4350
4351 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4352
4353 if (ev->status)
4354 return;
4355
4356 hci_dev_lock(hdev);
4357
4358 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
4359 if (conn) {
4360 conn->le_conn_interval = le16_to_cpu(ev->interval);
4361 conn->le_conn_latency = le16_to_cpu(ev->latency);
4362 conn->le_supv_timeout = le16_to_cpu(ev->supervision_timeout);
4363 }
4364
4365 hci_dev_unlock(hdev);
4366}
4367
Andre Guedesa4790db2014-02-26 20:21:47 -03004368/* This function requires the caller holds hdev->lock */
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004369static struct hci_conn *check_pending_le_conn(struct hci_dev *hdev,
4370 bdaddr_t *addr,
4371 u8 addr_type, u8 adv_type)
Andre Guedesa4790db2014-02-26 20:21:47 -03004372{
4373 struct hci_conn *conn;
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004374 struct hci_conn_params *params;
Andre Guedesa4790db2014-02-26 20:21:47 -03004375
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004376 /* If the event is not connectable don't proceed further */
4377 if (adv_type != LE_ADV_IND && adv_type != LE_ADV_DIRECT_IND)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004378 return NULL;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004379
4380 /* Ignore if the device is blocked */
Johan Hedbergdcc36c12014-07-09 12:59:13 +03004381 if (hci_bdaddr_list_lookup(&hdev->blacklist, addr, addr_type))
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004382 return NULL;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004383
Johan Hedbergf99353c2014-07-16 11:56:09 +03004384 /* Most controller will fail if we try to create new connections
4385 * while we have an existing one in slave role.
4386 */
4387 if (hdev->conn_hash.le_num_slave > 0)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004388 return NULL;
Johan Hedbergf99353c2014-07-16 11:56:09 +03004389
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004390 /* If we're not connectable only connect devices that we have in
4391 * our pend_le_conns list.
4392 */
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004393 params = hci_pend_le_action_lookup(&hdev->pend_le_conns,
4394 addr, addr_type);
4395 if (!params)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004396 return NULL;
Andre Guedesa4790db2014-02-26 20:21:47 -03004397
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004398 switch (params->auto_connect) {
4399 case HCI_AUTO_CONN_DIRECT:
4400 /* Only devices advertising with ADV_DIRECT_IND are
4401 * triggering a connection attempt. This is allowing
4402 * incoming connections from slave devices.
4403 */
4404 if (adv_type != LE_ADV_DIRECT_IND)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004405 return NULL;
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004406 break;
4407 case HCI_AUTO_CONN_ALWAYS:
4408 /* Devices advertising with ADV_IND or ADV_DIRECT_IND
4409 * are triggering a connection attempt. This means
4410 * that incoming connectioms from slave device are
4411 * accepted and also outgoing connections to slave
4412 * devices are established when found.
4413 */
4414 break;
4415 default:
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004416 return NULL;
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004417 }
4418
Andre Guedesa4790db2014-02-26 20:21:47 -03004419 conn = hci_connect_le(hdev, addr, addr_type, BT_SECURITY_LOW,
Johan Hedberge804d252014-07-16 11:42:28 +03004420 HCI_LE_AUTOCONN_TIMEOUT, HCI_ROLE_MASTER);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004421 if (!IS_ERR(conn)) {
4422 /* Store the pointer since we don't really have any
4423 * other owner of the object besides the params that
4424 * triggered it. This way we can abort the connection if
4425 * the parameters get removed and keep the reference
4426 * count consistent once the connection is established.
4427 */
Johan Hedbergf8aaf9b2014-08-17 23:28:57 +03004428 params->conn = hci_conn_get(conn);
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004429 return conn;
Johan Hedbergf161dd42014-08-15 21:06:54 +03004430 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004431
4432 switch (PTR_ERR(conn)) {
4433 case -EBUSY:
4434 /* If hci_connect() returns -EBUSY it means there is already
4435 * an LE connection attempt going on. Since controllers don't
4436 * support more than one connection attempt at the time, we
4437 * don't consider this an error case.
4438 */
4439 break;
4440 default:
4441 BT_DBG("Failed to connect: err %ld", PTR_ERR(conn));
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004442 return NULL;
Andre Guedesa4790db2014-02-26 20:21:47 -03004443 }
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004444
4445 return NULL;
Andre Guedesa4790db2014-02-26 20:21:47 -03004446}
4447
Johan Hedberg4af605d2014-03-24 10:48:00 +02004448static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr,
Marcel Holtmann2f010b52014-12-05 16:20:13 +01004449 u8 bdaddr_type, bdaddr_t *direct_addr,
4450 u8 direct_addr_type, s8 rssi, u8 *data, u8 len)
Johan Hedberg4af605d2014-03-24 10:48:00 +02004451{
Johan Hedbergb9a63282014-03-25 10:51:52 +02004452 struct discovery_state *d = &hdev->discovery;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004453 struct smp_irk *irk;
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004454 struct hci_conn *conn;
Johan Hedberg474ee062014-03-25 14:34:59 +02004455 bool match;
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004456 u32 flags;
Johan Hedbergb9a63282014-03-25 10:51:52 +02004457
Marcel Holtmann2f010b52014-12-05 16:20:13 +01004458 /* If the direct address is present, then this report is from
4459 * a LE Direct Advertising Report event. In that case it is
4460 * important to see if the address is matching the local
4461 * controller address.
4462 */
4463 if (direct_addr) {
4464 /* Only resolvable random addresses are valid for these
4465 * kind of reports and others can be ignored.
4466 */
4467 if (!hci_bdaddr_is_rpa(direct_addr, direct_addr_type))
4468 return;
4469
4470 /* If the controller is not using resolvable random
4471 * addresses, then this report can be ignored.
4472 */
4473 if (!test_bit(HCI_PRIVACY, &hdev->dev_flags))
4474 return;
4475
4476 /* If the local IRK of the controller does not match
4477 * with the resolvable random address provided, then
4478 * this report can be ignored.
4479 */
4480 if (!smp_irk_matches(hdev, hdev->irk, direct_addr))
4481 return;
4482 }
4483
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004484 /* Check if we need to convert to identity address */
4485 irk = hci_get_irk(hdev, bdaddr, bdaddr_type);
4486 if (irk) {
4487 bdaddr = &irk->bdaddr;
4488 bdaddr_type = irk->addr_type;
4489 }
4490
4491 /* Check if we have been requested to connect to this device */
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004492 conn = check_pending_le_conn(hdev, bdaddr, bdaddr_type, type);
4493 if (conn && type == LE_ADV_IND) {
4494 /* Store report for later inclusion by
4495 * mgmt_device_connected
4496 */
4497 memcpy(conn->le_adv_data, data, len);
4498 conn->le_adv_data_len = len;
4499 }
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004500
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004501 /* Passive scanning shouldn't trigger any device found events,
4502 * except for devices marked as CONN_REPORT for which we do send
4503 * device found events.
4504 */
Johan Hedbergca5c4be2014-03-25 10:30:46 +02004505 if (hdev->le_scan_type == LE_SCAN_PASSIVE) {
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004506 if (type == LE_ADV_DIRECT_IND)
4507 return;
4508
Johan Hedberg3a19b6f2014-07-15 08:07:59 +03004509 if (!hci_pend_le_action_lookup(&hdev->pend_le_reports,
4510 bdaddr, bdaddr_type))
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004511 return;
4512
4513 if (type == LE_ADV_NONCONN_IND || type == LE_ADV_SCAN_IND)
4514 flags = MGMT_DEV_FOUND_NOT_CONNECTABLE;
4515 else
4516 flags = 0;
4517 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
4518 rssi, flags, data, len, NULL, 0);
Johan Hedberg97bf2e92014-07-04 12:37:16 +03004519 return;
Johan Hedbergca5c4be2014-03-25 10:30:46 +02004520 }
Johan Hedberg4af605d2014-03-24 10:48:00 +02004521
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004522 /* When receiving non-connectable or scannable undirected
4523 * advertising reports, this means that the remote device is
4524 * not connectable and then clearly indicate this in the
4525 * device found event.
4526 *
4527 * When receiving a scan response, then there is no way to
4528 * know if the remote device is connectable or not. However
4529 * since scan responses are merged with a previously seen
4530 * advertising report, the flags field from that report
4531 * will be used.
4532 *
4533 * In the really unlikely case that a controller get confused
4534 * and just sends a scan response event, then it is marked as
4535 * not connectable as well.
4536 */
4537 if (type == LE_ADV_NONCONN_IND || type == LE_ADV_SCAN_IND ||
4538 type == LE_ADV_SCAN_RSP)
4539 flags = MGMT_DEV_FOUND_NOT_CONNECTABLE;
4540 else
4541 flags = 0;
4542
Johan Hedbergb9a63282014-03-25 10:51:52 +02004543 /* If there's nothing pending either store the data from this
4544 * event or send an immediate device found event if the data
4545 * should not be stored for later.
4546 */
4547 if (!has_pending_adv_report(hdev)) {
4548 /* If the report will trigger a SCAN_REQ store it for
4549 * later merging.
4550 */
4551 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
4552 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004553 rssi, flags, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004554 return;
4555 }
4556
4557 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004558 rssi, flags, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004559 return;
4560 }
4561
Johan Hedberg474ee062014-03-25 14:34:59 +02004562 /* Check if the pending report is for the same device as the new one */
4563 match = (!bacmp(bdaddr, &d->last_adv_addr) &&
4564 bdaddr_type == d->last_adv_addr_type);
4565
Johan Hedbergb9a63282014-03-25 10:51:52 +02004566 /* If the pending data doesn't match this report or this isn't a
4567 * scan response (e.g. we got a duplicate ADV_IND) then force
4568 * sending of the pending data.
4569 */
Johan Hedberg474ee062014-03-25 14:34:59 +02004570 if (type != LE_ADV_SCAN_RSP || !match) {
4571 /* Send out whatever is in the cache, but skip duplicates */
4572 if (!match)
4573 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004574 d->last_adv_addr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004575 d->last_adv_rssi, d->last_adv_flags,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004576 d->last_adv_data,
Johan Hedberg474ee062014-03-25 14:34:59 +02004577 d->last_adv_data_len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004578
4579 /* If the new report will trigger a SCAN_REQ store it for
4580 * later merging.
4581 */
4582 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
4583 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004584 rssi, flags, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004585 return;
4586 }
4587
4588 /* The advertising reports cannot be merged, so clear
4589 * the pending report and send out a device found event.
4590 */
4591 clear_pending_adv_report(hdev);
Johan Hedberg5c5b93e2014-03-29 08:39:53 +02004592 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004593 rssi, flags, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004594 return;
4595 }
4596
4597 /* If we get here we've got a pending ADV_IND or ADV_SCAN_IND and
4598 * the new event is a SCAN_RSP. We can therefore proceed with
4599 * sending a merged device found event.
4600 */
4601 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004602 d->last_adv_addr_type, NULL, rssi, d->last_adv_flags,
Marcel Holtmann42bd6a52014-07-01 14:11:19 +02004603 d->last_adv_data, d->last_adv_data_len, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004604 clear_pending_adv_report(hdev);
Johan Hedberg4af605d2014-03-24 10:48:00 +02004605}
4606
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004607static void hci_le_adv_report_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andre Guedes9aa04c92011-05-26 16:23:51 -03004608{
Andre Guedese95beb42011-09-26 20:48:35 -03004609 u8 num_reports = skb->data[0];
4610 void *ptr = &skb->data[1];
Andre Guedes9aa04c92011-05-26 16:23:51 -03004611
Andre Guedesa4790db2014-02-26 20:21:47 -03004612 hci_dev_lock(hdev);
4613
Andre Guedese95beb42011-09-26 20:48:35 -03004614 while (num_reports--) {
4615 struct hci_ev_le_advertising_info *ev = ptr;
Johan Hedberg4af605d2014-03-24 10:48:00 +02004616 s8 rssi;
Andre Guedesa4790db2014-02-26 20:21:47 -03004617
Andre Guedes3c9e9192012-01-10 18:20:50 -03004618 rssi = ev->data[ev->length];
Johan Hedberg4af605d2014-03-24 10:48:00 +02004619 process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
Marcel Holtmann2f010b52014-12-05 16:20:13 +01004620 ev->bdaddr_type, NULL, 0, rssi,
4621 ev->data, ev->length);
Andre Guedes3c9e9192012-01-10 18:20:50 -03004622
Andre Guedese95beb42011-09-26 20:48:35 -03004623 ptr += sizeof(*ev) + ev->length + 1;
Andre Guedes9aa04c92011-05-26 16:23:51 -03004624 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004625
4626 hci_dev_unlock(hdev);
Andre Guedes9aa04c92011-05-26 16:23:51 -03004627}
4628
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004629static void hci_le_ltk_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004630{
4631 struct hci_ev_le_ltk_req *ev = (void *) skb->data;
4632 struct hci_cp_le_ltk_reply cp;
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004633 struct hci_cp_le_ltk_neg_reply neg;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004634 struct hci_conn *conn;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004635 struct smp_ltk *ltk;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004636
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004637 BT_DBG("%s handle 0x%4.4x", hdev->name, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004638
4639 hci_dev_lock(hdev);
4640
4641 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004642 if (conn == NULL)
4643 goto not_found;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004644
Johan Hedbergf3a73d92014-05-29 15:02:59 +03004645 ltk = hci_find_ltk(hdev, &conn->dst, conn->dst_type, conn->role);
Johan Hedberg5378bc52014-05-29 14:00:39 +03004646 if (!ltk)
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004647 goto not_found;
4648
Johan Hedberg5378bc52014-05-29 14:00:39 +03004649 if (smp_ltk_is_sc(ltk)) {
4650 /* With SC both EDiv and Rand are set to zero */
4651 if (ev->ediv || ev->rand)
4652 goto not_found;
4653 } else {
4654 /* For non-SC keys check that EDiv and Rand match */
4655 if (ev->ediv != ltk->ediv || ev->rand != ltk->rand)
4656 goto not_found;
4657 }
4658
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004659 memcpy(cp.ltk, ltk->val, sizeof(ltk->val));
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004660 cp.handle = cpu_to_le16(conn->handle);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004661
Johan Hedberga6f78332014-09-10 17:37:45 -07004662 conn->pending_sec_level = smp_ltk_sec_level(ltk);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004663
Andre Guedes89cbb4d2013-07-31 16:25:29 -03004664 conn->enc_key_size = ltk->enc_size;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004665
4666 hci_send_cmd(hdev, HCI_OP_LE_LTK_REPLY, sizeof(cp), &cp);
4667
Claudio Takahasi5981a882013-07-25 16:34:24 -03004668 /* Ref. Bluetooth Core SPEC pages 1975 and 2004. STK is a
4669 * temporary key used to encrypt a connection following
4670 * pairing. It is used during the Encrypted Session Setup to
4671 * distribute the keys. Later, security can be re-established
4672 * using a distributed LTK.
4673 */
Johan Hedberg2ceba532014-06-16 19:25:16 +03004674 if (ltk->type == SMP_STK) {
Johan Hedbergfe59a052014-07-01 19:14:12 +03004675 set_bit(HCI_CONN_STK_ENCRYPT, &conn->flags);
Johan Hedberg970d0f12014-11-13 14:37:47 +02004676 list_del_rcu(&ltk->list);
4677 kfree_rcu(ltk, rcu);
Johan Hedbergfe59a052014-07-01 19:14:12 +03004678 } else {
4679 clear_bit(HCI_CONN_STK_ENCRYPT, &conn->flags);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004680 }
4681
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004682 hci_dev_unlock(hdev);
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004683
4684 return;
4685
4686not_found:
4687 neg.handle = ev->handle;
4688 hci_send_cmd(hdev, HCI_OP_LE_LTK_NEG_REPLY, sizeof(neg), &neg);
4689 hci_dev_unlock(hdev);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004690}
4691
Andre Guedes8e75b462014-07-01 18:10:08 -03004692static void send_conn_param_neg_reply(struct hci_dev *hdev, u16 handle,
4693 u8 reason)
4694{
4695 struct hci_cp_le_conn_param_req_neg_reply cp;
4696
4697 cp.handle = cpu_to_le16(handle);
4698 cp.reason = reason;
4699
4700 hci_send_cmd(hdev, HCI_OP_LE_CONN_PARAM_REQ_NEG_REPLY, sizeof(cp),
4701 &cp);
4702}
4703
4704static void hci_le_remote_conn_param_req_evt(struct hci_dev *hdev,
4705 struct sk_buff *skb)
4706{
4707 struct hci_ev_le_remote_conn_param_req *ev = (void *) skb->data;
4708 struct hci_cp_le_conn_param_req_reply cp;
4709 struct hci_conn *hcon;
4710 u16 handle, min, max, latency, timeout;
4711
4712 handle = le16_to_cpu(ev->handle);
4713 min = le16_to_cpu(ev->interval_min);
4714 max = le16_to_cpu(ev->interval_max);
4715 latency = le16_to_cpu(ev->latency);
4716 timeout = le16_to_cpu(ev->timeout);
4717
4718 hcon = hci_conn_hash_lookup_handle(hdev, handle);
4719 if (!hcon || hcon->state != BT_CONNECTED)
4720 return send_conn_param_neg_reply(hdev, handle,
4721 HCI_ERROR_UNKNOWN_CONN_ID);
4722
4723 if (hci_check_conn_params(min, max, latency, timeout))
4724 return send_conn_param_neg_reply(hdev, handle,
4725 HCI_ERROR_INVALID_LL_PARAMS);
4726
Johan Hedberg40bef302014-07-16 11:42:27 +03004727 if (hcon->role == HCI_ROLE_MASTER) {
Johan Hedberg348d50b2014-07-02 17:37:30 +03004728 struct hci_conn_params *params;
Johan Hedbergf4869e22014-07-02 17:37:32 +03004729 u8 store_hint;
Johan Hedberg348d50b2014-07-02 17:37:30 +03004730
4731 hci_dev_lock(hdev);
4732
4733 params = hci_conn_params_lookup(hdev, &hcon->dst,
4734 hcon->dst_type);
4735 if (params) {
4736 params->conn_min_interval = min;
4737 params->conn_max_interval = max;
4738 params->conn_latency = latency;
4739 params->supervision_timeout = timeout;
Johan Hedbergf4869e22014-07-02 17:37:32 +03004740 store_hint = 0x01;
4741 } else{
4742 store_hint = 0x00;
Johan Hedberg348d50b2014-07-02 17:37:30 +03004743 }
4744
4745 hci_dev_unlock(hdev);
4746
Johan Hedbergf4869e22014-07-02 17:37:32 +03004747 mgmt_new_conn_param(hdev, &hcon->dst, hcon->dst_type,
4748 store_hint, min, max, latency, timeout);
Johan Hedberg348d50b2014-07-02 17:37:30 +03004749 }
Andre Guedesffb5a8272014-07-01 18:10:11 -03004750
Andre Guedes8e75b462014-07-01 18:10:08 -03004751 cp.handle = ev->handle;
4752 cp.interval_min = ev->interval_min;
4753 cp.interval_max = ev->interval_max;
4754 cp.latency = ev->latency;
4755 cp.timeout = ev->timeout;
4756 cp.min_ce_len = 0;
4757 cp.max_ce_len = 0;
4758
4759 hci_send_cmd(hdev, HCI_OP_LE_CONN_PARAM_REQ_REPLY, sizeof(cp), &cp);
4760}
4761
Marcel Holtmann2f010b52014-12-05 16:20:13 +01004762static void hci_le_direct_adv_report_evt(struct hci_dev *hdev,
4763 struct sk_buff *skb)
4764{
4765 u8 num_reports = skb->data[0];
4766 void *ptr = &skb->data[1];
4767
4768 hci_dev_lock(hdev);
4769
4770 while (num_reports--) {
4771 struct hci_ev_le_direct_adv_info *ev = ptr;
4772
4773 process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
4774 ev->bdaddr_type, &ev->direct_addr,
4775 ev->direct_addr_type, ev->rssi, NULL, 0);
4776
4777 ptr += sizeof(*ev);
4778 }
4779
4780 hci_dev_unlock(hdev);
4781}
4782
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004783static void hci_le_meta_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03004784{
4785 struct hci_ev_le_meta *le_ev = (void *) skb->data;
4786
4787 skb_pull(skb, sizeof(*le_ev));
4788
4789 switch (le_ev->subevent) {
4790 case HCI_EV_LE_CONN_COMPLETE:
4791 hci_le_conn_complete_evt(hdev, skb);
4792 break;
4793
Marcel Holtmann1855d922014-06-23 11:40:05 +02004794 case HCI_EV_LE_CONN_UPDATE_COMPLETE:
4795 hci_le_conn_update_complete_evt(hdev, skb);
4796 break;
4797
Andre Guedes9aa04c92011-05-26 16:23:51 -03004798 case HCI_EV_LE_ADVERTISING_REPORT:
4799 hci_le_adv_report_evt(hdev, skb);
4800 break;
4801
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004802 case HCI_EV_LE_LTK_REQ:
4803 hci_le_ltk_request_evt(hdev, skb);
4804 break;
4805
Andre Guedes8e75b462014-07-01 18:10:08 -03004806 case HCI_EV_LE_REMOTE_CONN_PARAM_REQ:
4807 hci_le_remote_conn_param_req_evt(hdev, skb);
4808 break;
4809
Marcel Holtmann2f010b52014-12-05 16:20:13 +01004810 case HCI_EV_LE_DIRECT_ADV_REPORT:
4811 hci_le_direct_adv_report_evt(hdev, skb);
4812 break;
4813
Ville Tervofcd89c02011-02-10 22:38:47 -03004814 default:
4815 break;
4816 }
4817}
4818
Andrei Emeltchenko9495b2e2012-09-27 17:26:22 +03004819static void hci_chan_selected_evt(struct hci_dev *hdev, struct sk_buff *skb)
4820{
4821 struct hci_ev_channel_selected *ev = (void *) skb->data;
4822 struct hci_conn *hcon;
4823
4824 BT_DBG("%s handle 0x%2.2x", hdev->name, ev->phy_handle);
4825
4826 skb_pull(skb, sizeof(*ev));
4827
4828 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4829 if (!hcon)
4830 return;
4831
4832 amp_read_loc_assoc_final_data(hdev, hcon);
4833}
4834
Linus Torvalds1da177e2005-04-16 15:20:36 -07004835void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)
4836{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004837 struct hci_event_hdr *hdr = (void *) skb->data;
4838 __u8 event = hdr->evt;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004839
Johan Hedbergb6ddb632013-04-02 13:34:31 +03004840 hci_dev_lock(hdev);
4841
4842 /* Received events are (currently) only needed when a request is
4843 * ongoing so avoid unnecessary memory allocation.
4844 */
Marcel Holtmann899de762014-07-11 05:51:58 +02004845 if (hci_req_pending(hdev)) {
Johan Hedbergb6ddb632013-04-02 13:34:31 +03004846 kfree_skb(hdev->recv_evt);
4847 hdev->recv_evt = skb_clone(skb, GFP_KERNEL);
4848 }
4849
4850 hci_dev_unlock(hdev);
4851
Linus Torvalds1da177e2005-04-16 15:20:36 -07004852 skb_pull(skb, HCI_EVENT_HDR_SIZE);
4853
Johan Hedberg02350a72013-04-03 21:50:29 +03004854 if (hdev->sent_cmd && bt_cb(hdev->sent_cmd)->req.event == event) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02004855 struct hci_command_hdr *cmd_hdr = (void *) hdev->sent_cmd->data;
4856 u16 opcode = __le16_to_cpu(cmd_hdr->opcode);
Johan Hedberg02350a72013-04-03 21:50:29 +03004857
4858 hci_req_cmd_complete(hdev, opcode, 0);
4859 }
4860
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004861 switch (event) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004862 case HCI_EV_INQUIRY_COMPLETE:
4863 hci_inquiry_complete_evt(hdev, skb);
4864 break;
4865
4866 case HCI_EV_INQUIRY_RESULT:
4867 hci_inquiry_result_evt(hdev, skb);
4868 break;
4869
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004870 case HCI_EV_CONN_COMPLETE:
4871 hci_conn_complete_evt(hdev, skb);
Marcel Holtmann21d9e302005-09-13 01:32:25 +02004872 break;
4873
Linus Torvalds1da177e2005-04-16 15:20:36 -07004874 case HCI_EV_CONN_REQUEST:
4875 hci_conn_request_evt(hdev, skb);
4876 break;
4877
Linus Torvalds1da177e2005-04-16 15:20:36 -07004878 case HCI_EV_DISCONN_COMPLETE:
4879 hci_disconn_complete_evt(hdev, skb);
4880 break;
4881
Linus Torvalds1da177e2005-04-16 15:20:36 -07004882 case HCI_EV_AUTH_COMPLETE:
4883 hci_auth_complete_evt(hdev, skb);
4884 break;
4885
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004886 case HCI_EV_REMOTE_NAME:
4887 hci_remote_name_evt(hdev, skb);
4888 break;
4889
Linus Torvalds1da177e2005-04-16 15:20:36 -07004890 case HCI_EV_ENCRYPT_CHANGE:
4891 hci_encrypt_change_evt(hdev, skb);
4892 break;
4893
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004894 case HCI_EV_CHANGE_LINK_KEY_COMPLETE:
4895 hci_change_link_key_complete_evt(hdev, skb);
4896 break;
4897
4898 case HCI_EV_REMOTE_FEATURES:
4899 hci_remote_features_evt(hdev, skb);
4900 break;
4901
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004902 case HCI_EV_CMD_COMPLETE:
4903 hci_cmd_complete_evt(hdev, skb);
4904 break;
4905
4906 case HCI_EV_CMD_STATUS:
4907 hci_cmd_status_evt(hdev, skb);
4908 break;
4909
Marcel Holtmann24dfa342014-11-02 02:56:41 +01004910 case HCI_EV_HARDWARE_ERROR:
4911 hci_hardware_error_evt(hdev, skb);
4912 break;
4913
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004914 case HCI_EV_ROLE_CHANGE:
4915 hci_role_change_evt(hdev, skb);
4916 break;
4917
4918 case HCI_EV_NUM_COMP_PKTS:
4919 hci_num_comp_pkts_evt(hdev, skb);
4920 break;
4921
4922 case HCI_EV_MODE_CHANGE:
4923 hci_mode_change_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004924 break;
4925
4926 case HCI_EV_PIN_CODE_REQ:
4927 hci_pin_code_request_evt(hdev, skb);
4928 break;
4929
4930 case HCI_EV_LINK_KEY_REQ:
4931 hci_link_key_request_evt(hdev, skb);
4932 break;
4933
4934 case HCI_EV_LINK_KEY_NOTIFY:
4935 hci_link_key_notify_evt(hdev, skb);
4936 break;
4937
4938 case HCI_EV_CLOCK_OFFSET:
4939 hci_clock_offset_evt(hdev, skb);
4940 break;
4941
Marcel Holtmanna8746412008-07-14 20:13:46 +02004942 case HCI_EV_PKT_TYPE_CHANGE:
4943 hci_pkt_type_change_evt(hdev, skb);
4944 break;
4945
Marcel Holtmann85a1e932005-08-09 20:28:02 -07004946 case HCI_EV_PSCAN_REP_MODE:
4947 hci_pscan_rep_mode_evt(hdev, skb);
4948 break;
4949
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004950 case HCI_EV_INQUIRY_RESULT_WITH_RSSI:
4951 hci_inquiry_result_with_rssi_evt(hdev, skb);
4952 break;
4953
4954 case HCI_EV_REMOTE_EXT_FEATURES:
4955 hci_remote_ext_features_evt(hdev, skb);
4956 break;
4957
4958 case HCI_EV_SYNC_CONN_COMPLETE:
4959 hci_sync_conn_complete_evt(hdev, skb);
4960 break;
4961
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004962 case HCI_EV_EXTENDED_INQUIRY_RESULT:
4963 hci_extended_inquiry_result_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004964 break;
4965
Johan Hedberg1c2e0042012-06-08 23:31:13 +08004966 case HCI_EV_KEY_REFRESH_COMPLETE:
4967 hci_key_refresh_complete_evt(hdev, skb);
4968 break;
4969
Marcel Holtmann04936842008-07-14 20:13:48 +02004970 case HCI_EV_IO_CAPA_REQUEST:
4971 hci_io_capa_request_evt(hdev, skb);
4972 break;
4973
Johan Hedberg03b555e2011-01-04 15:40:05 +02004974 case HCI_EV_IO_CAPA_REPLY:
4975 hci_io_capa_reply_evt(hdev, skb);
4976 break;
4977
Johan Hedberga5c29682011-02-19 12:05:57 -03004978 case HCI_EV_USER_CONFIRM_REQUEST:
4979 hci_user_confirm_request_evt(hdev, skb);
4980 break;
4981
Brian Gix1143d452011-11-23 08:28:34 -08004982 case HCI_EV_USER_PASSKEY_REQUEST:
4983 hci_user_passkey_request_evt(hdev, skb);
4984 break;
4985
Johan Hedberg92a25252012-09-06 18:39:26 +03004986 case HCI_EV_USER_PASSKEY_NOTIFY:
4987 hci_user_passkey_notify_evt(hdev, skb);
4988 break;
4989
4990 case HCI_EV_KEYPRESS_NOTIFY:
4991 hci_keypress_notify_evt(hdev, skb);
4992 break;
4993
Marcel Holtmann04936842008-07-14 20:13:48 +02004994 case HCI_EV_SIMPLE_PAIR_COMPLETE:
4995 hci_simple_pair_complete_evt(hdev, skb);
4996 break;
4997
Marcel Holtmann41a96212008-07-14 20:13:48 +02004998 case HCI_EV_REMOTE_HOST_FEATURES:
4999 hci_remote_host_features_evt(hdev, skb);
5000 break;
5001
Ville Tervofcd89c02011-02-10 22:38:47 -03005002 case HCI_EV_LE_META:
5003 hci_le_meta_evt(hdev, skb);
5004 break;
5005
Andrei Emeltchenko9495b2e2012-09-27 17:26:22 +03005006 case HCI_EV_CHANNEL_SELECTED:
5007 hci_chan_selected_evt(hdev, skb);
5008 break;
5009
Szymon Janc2763eda2011-03-22 13:12:22 +01005010 case HCI_EV_REMOTE_OOB_DATA_REQUEST:
5011 hci_remote_oob_data_request_evt(hdev, skb);
5012 break;
5013
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03005014 case HCI_EV_PHY_LINK_COMPLETE:
5015 hci_phy_link_complete_evt(hdev, skb);
5016 break;
5017
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03005018 case HCI_EV_LOGICAL_LINK_COMPLETE:
5019 hci_loglink_complete_evt(hdev, skb);
5020 break;
5021
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02005022 case HCI_EV_DISCONN_LOGICAL_LINK_COMPLETE:
5023 hci_disconn_loglink_complete_evt(hdev, skb);
5024 break;
5025
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02005026 case HCI_EV_DISCONN_PHY_LINK_COMPLETE:
5027 hci_disconn_phylink_complete_evt(hdev, skb);
5028 break;
5029
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02005030 case HCI_EV_NUM_COMP_BLOCKS:
5031 hci_num_comp_blocks_evt(hdev, skb);
5032 break;
5033
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005034 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03005035 BT_DBG("%s event 0x%2.2x", hdev->name, event);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005036 break;
5037 }
5038
5039 kfree_skb(skb);
5040 hdev->stat.evt_rx++;
5041}