blob: 0850cad8c36886da559d8a89460344d06afe8844 [file] [log] [blame]
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 BlueZ - Bluetooth protocol stack for Linux
Ron Shaffer2d0a0342010-05-28 11:53:46 -04003 Copyright (c) 2000-2001, 2010, Code Aurora Forum. All rights reserved.
Linus Torvalds1da177e2005-04-16 15:20:36 -07004
5 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License version 2 as
9 published by the Free Software Foundation;
10
11 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
12 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
14 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090015 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
16 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
Linus Torvalds1da177e2005-04-16 15:20:36 -070018 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090020 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
Linus Torvalds1da177e2005-04-16 15:20:36 -070022 SOFTWARE IS DISCLAIMED.
23*/
24
25/* Bluetooth HCI event handling. */
26
Linus Torvalds1da177e2005-04-16 15:20:36 -070027#include <asm/unaligned.h>
28
29#include <net/bluetooth/bluetooth.h>
30#include <net/bluetooth/hci_core.h>
Mikel Astizf0d6a0e2012-08-09 09:52:30 +020031#include <net/bluetooth/mgmt.h>
Marcel Holtmann7ef9fbf2013-10-10 14:54:14 -070032
Johan Hedberg0857dd32014-12-19 13:40:20 +020033#include "hci_request.h"
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +010034#include "hci_debugfs.h"
Marcel Holtmann70247282013-10-10 14:54:15 -070035#include "a2mp.h"
Marcel Holtmann7ef9fbf2013-10-10 14:54:14 -070036#include "amp.h"
Johan Hedberg2ceba532014-06-16 19:25:16 +030037#include "smp.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070038
Linus Torvalds1da177e2005-04-16 15:20:36 -070039/* Handle HCI Event packets */
40
Marcel Holtmanna9de9242007-10-20 13:33:56 +020041static void hci_cc_inquiry_cancel(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -070042{
Marcel Holtmanna9de9242007-10-20 13:33:56 +020043 __u8 status = *((__u8 *) skb->data);
Linus Torvalds1da177e2005-04-16 15:20:36 -070044
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030045 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -070046
Andre Guedes82f47852013-04-30 15:29:34 -030047 if (status)
Marcel Holtmanna9de9242007-10-20 13:33:56 +020048 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -070049
Andre Guedes89352e72011-11-04 14:16:53 -030050 clear_bit(HCI_INQUIRY, &hdev->flags);
Peter Zijlstra4e857c52014-03-17 18:06:10 +010051 smp_mb__after_atomic(); /* wake_up_bit advises about this barrier */
Andre Guedes3e13fa12013-03-27 20:04:56 -030052 wake_up_bit(&hdev->flags, HCI_INQUIRY);
Andre Guedes89352e72011-11-04 14:16:53 -030053
Johan Hedberg50143a42014-06-10 14:05:57 +030054 hci_dev_lock(hdev);
55 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
56 hci_dev_unlock(hdev);
57
Marcel Holtmanna9de9242007-10-20 13:33:56 +020058 hci_conn_check_pending(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -070059}
60
Andre Guedes4d934832012-03-21 00:03:35 -030061static void hci_cc_periodic_inq(struct hci_dev *hdev, struct sk_buff *skb)
62{
63 __u8 status = *((__u8 *) skb->data);
64
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030065 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedesae854a72012-03-21 00:03:36 -030066
67 if (status)
68 return;
69
70 set_bit(HCI_PERIODIC_INQ, &hdev->dev_flags);
Andre Guedes4d934832012-03-21 00:03:35 -030071}
72
Marcel Holtmanna9de9242007-10-20 13:33:56 +020073static void hci_cc_exit_periodic_inq(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -070074{
Marcel Holtmanna9de9242007-10-20 13:33:56 +020075 __u8 status = *((__u8 *) skb->data);
76
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030077 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +020078
79 if (status)
80 return;
81
Andre Guedesae854a72012-03-21 00:03:36 -030082 clear_bit(HCI_PERIODIC_INQ, &hdev->dev_flags);
83
Marcel Holtmanna9de9242007-10-20 13:33:56 +020084 hci_conn_check_pending(hdev);
85}
86
Gustavo Padovan807deac2012-05-17 00:36:24 -030087static void hci_cc_remote_name_req_cancel(struct hci_dev *hdev,
88 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +020089{
90 BT_DBG("%s", hdev->name);
91}
92
93static void hci_cc_role_discovery(struct hci_dev *hdev, struct sk_buff *skb)
94{
95 struct hci_rp_role_discovery *rp = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -070096 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -070097
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030098 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -070099
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200100 if (rp->status)
101 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700102
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200103 hci_dev_lock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700104
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200105 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
Johan Hedberg40bef302014-07-16 11:42:27 +0300106 if (conn)
107 conn->role = rp->role;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200108
109 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700110}
111
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200112static void hci_cc_read_link_policy(struct hci_dev *hdev, struct sk_buff *skb)
113{
114 struct hci_rp_read_link_policy *rp = (void *) skb->data;
115 struct hci_conn *conn;
116
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300117 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200118
119 if (rp->status)
120 return;
121
122 hci_dev_lock(hdev);
123
124 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
125 if (conn)
126 conn->link_policy = __le16_to_cpu(rp->policy);
127
128 hci_dev_unlock(hdev);
129}
130
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200131static void hci_cc_write_link_policy(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700132{
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200133 struct hci_rp_write_link_policy *rp = (void *) skb->data;
134 struct hci_conn *conn;
135 void *sent;
136
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300137 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200138
139 if (rp->status)
140 return;
141
142 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LINK_POLICY);
143 if (!sent)
144 return;
145
146 hci_dev_lock(hdev);
147
148 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200149 if (conn)
Harvey Harrison83985312008-05-02 16:25:46 -0700150 conn->link_policy = get_unaligned_le16(sent + 2);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200151
152 hci_dev_unlock(hdev);
153}
154
Gustavo Padovan807deac2012-05-17 00:36:24 -0300155static void hci_cc_read_def_link_policy(struct hci_dev *hdev,
156 struct sk_buff *skb)
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200157{
158 struct hci_rp_read_def_link_policy *rp = (void *) skb->data;
159
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300160 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200161
162 if (rp->status)
163 return;
164
165 hdev->link_policy = __le16_to_cpu(rp->policy);
166}
167
Gustavo Padovan807deac2012-05-17 00:36:24 -0300168static void hci_cc_write_def_link_policy(struct hci_dev *hdev,
169 struct sk_buff *skb)
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200170{
171 __u8 status = *((__u8 *) skb->data);
172 void *sent;
173
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300174 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200175
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200176 if (status)
177 return;
178
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200179 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_DEF_LINK_POLICY);
180 if (!sent)
181 return;
182
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200183 hdev->link_policy = get_unaligned_le16(sent);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200184}
185
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200186static void hci_cc_reset(struct hci_dev *hdev, struct sk_buff *skb)
187{
188 __u8 status = *((__u8 *) skb->data);
189
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300190 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200191
Gustavo F. Padovan10572132011-03-16 15:36:29 -0300192 clear_bit(HCI_RESET, &hdev->flags);
193
Marcel Holtmann8761f9d2014-11-02 02:45:58 +0100194 if (status)
195 return;
196
Johan Hedberga297e972012-02-21 17:55:47 +0200197 /* Reset all non-persistent flags */
Johan Hedberg2cc6fb02013-03-15 17:06:57 -0500198 hdev->dev_flags &= ~HCI_PERSISTENT_MASK;
Andre Guedes69775ff2012-02-23 16:50:05 +0200199
200 hdev->discovery.state = DISCOVERY_STOPPED;
Johan Hedbergbbaf4442012-11-08 01:22:59 +0100201 hdev->inq_tx_power = HCI_TX_POWER_INVALID;
202 hdev->adv_tx_power = HCI_TX_POWER_INVALID;
Johan Hedberg3f0f5242012-11-08 01:23:00 +0100203
204 memset(hdev->adv_data, 0, sizeof(hdev->adv_data));
205 hdev->adv_data_len = 0;
Marcel Holtmannf8e808b2013-10-16 00:16:47 -0700206
207 memset(hdev->scan_rsp_data, 0, sizeof(hdev->scan_rsp_data));
208 hdev->scan_rsp_data_len = 0;
Marcel Holtmann06f5b772013-10-19 07:09:11 -0700209
Marcel Holtmann533553f2014-03-21 12:18:10 -0700210 hdev->le_scan_type = LE_SCAN_PASSIVE;
211
Marcel Holtmann06f5b772013-10-19 07:09:11 -0700212 hdev->ssp_debug_mode = 0;
Marcel Holtmanna4d55042014-10-29 23:37:53 +0100213
214 hci_bdaddr_list_clear(&hdev->le_white_list);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200215}
216
Marcel Holtmannc2f0f972015-01-12 09:21:25 -0800217static void hci_cc_read_stored_link_key(struct hci_dev *hdev,
218 struct sk_buff *skb)
219{
220 struct hci_rp_read_stored_link_key *rp = (void *)skb->data;
221 struct hci_cp_read_stored_link_key *sent;
222
223 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
224
225 sent = hci_sent_cmd_data(hdev, HCI_OP_READ_STORED_LINK_KEY);
226 if (!sent)
227 return;
228
229 if (!rp->status && sent->read_all == 0x01) {
230 hdev->stored_max_keys = rp->max_keys;
231 hdev->stored_num_keys = rp->num_keys;
232 }
233}
234
Marcel Holtmanna93661202015-01-12 09:21:28 -0800235static void hci_cc_delete_stored_link_key(struct hci_dev *hdev,
236 struct sk_buff *skb)
237{
238 struct hci_rp_delete_stored_link_key *rp = (void *)skb->data;
239
240 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
241
242 if (rp->status)
243 return;
244
245 if (rp->num_keys <= hdev->stored_num_keys)
246 hdev->stored_num_keys -= rp->num_keys;
247 else
248 hdev->stored_num_keys = 0;
249}
250
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200251static void hci_cc_write_local_name(struct hci_dev *hdev, struct sk_buff *skb)
252{
253 __u8 status = *((__u8 *) skb->data);
254 void *sent;
255
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300256 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200257
258 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LOCAL_NAME);
259 if (!sent)
260 return;
261
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200262 hci_dev_lock(hdev);
263
Johan Hedbergf51d5b22012-02-22 18:17:32 +0200264 if (test_bit(HCI_MGMT, &hdev->dev_flags))
265 mgmt_set_local_name_complete(hdev, sent, status);
Johan Hedberg28cc7bd2012-02-22 21:06:55 +0200266 else if (!status)
267 memcpy(hdev->dev_name, sent, HCI_MAX_NAME_LENGTH);
Johan Hedbergf51d5b22012-02-22 18:17:32 +0200268
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200269 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200270}
271
272static void hci_cc_read_local_name(struct hci_dev *hdev, struct sk_buff *skb)
273{
274 struct hci_rp_read_local_name *rp = (void *) skb->data;
275
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300276 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200277
278 if (rp->status)
279 return;
280
Marcel Holtmann8bfe8442014-12-23 23:10:48 +0100281 if (test_bit(HCI_SETUP, &hdev->dev_flags) ||
282 test_bit(HCI_CONFIG, &hdev->dev_flags))
Johan Hedbergdb99b5f2012-02-22 20:14:22 +0200283 memcpy(hdev->dev_name, rp->name, HCI_MAX_NAME_LENGTH);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200284}
285
286static void hci_cc_write_auth_enable(struct hci_dev *hdev, struct sk_buff *skb)
287{
288 __u8 status = *((__u8 *) skb->data);
289 void *sent;
290
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300291 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200292
293 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_AUTH_ENABLE);
294 if (!sent)
295 return;
296
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530297 hci_dev_lock(hdev);
298
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200299 if (!status) {
300 __u8 param = *((__u8 *) sent);
301
302 if (param == AUTH_ENABLED)
303 set_bit(HCI_AUTH, &hdev->flags);
304 else
305 clear_bit(HCI_AUTH, &hdev->flags);
306 }
307
Johan Hedberg33ef95e2012-02-16 23:56:27 +0200308 if (test_bit(HCI_MGMT, &hdev->dev_flags))
309 mgmt_auth_enable_complete(hdev, status);
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530310
311 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200312}
313
314static void hci_cc_write_encrypt_mode(struct hci_dev *hdev, struct sk_buff *skb)
315{
316 __u8 status = *((__u8 *) skb->data);
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200317 __u8 param;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200318 void *sent;
319
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300320 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200321
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200322 if (status)
323 return;
324
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200325 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_ENCRYPT_MODE);
326 if (!sent)
327 return;
328
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200329 param = *((__u8 *) sent);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200330
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200331 if (param)
332 set_bit(HCI_ENCRYPT, &hdev->flags);
333 else
334 clear_bit(HCI_ENCRYPT, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200335}
336
337static void hci_cc_write_scan_enable(struct hci_dev *hdev, struct sk_buff *skb)
338{
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200339 __u8 status = *((__u8 *) skb->data);
340 __u8 param;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200341 void *sent;
342
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300343 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200344
345 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SCAN_ENABLE);
346 if (!sent)
347 return;
348
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200349 param = *((__u8 *) sent);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200350
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200351 hci_dev_lock(hdev);
352
Mikel Astizfa1bd912012-08-09 09:52:29 +0200353 if (status) {
Johan Hedberg2d7cee52011-11-07 22:16:03 +0200354 hdev->discov_timeout = 0;
355 goto done;
356 }
357
Johan Hedbergbc6d2d02014-07-10 12:09:08 +0300358 if (param & SCAN_INQUIRY)
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200359 set_bit(HCI_ISCAN, &hdev->flags);
Johan Hedbergbc6d2d02014-07-10 12:09:08 +0300360 else
361 clear_bit(HCI_ISCAN, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200362
Johan Hedberg031547d2014-07-10 12:09:06 +0300363 if (param & SCAN_PAGE)
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200364 set_bit(HCI_PSCAN, &hdev->flags);
Johan Hedbergbc6d2d02014-07-10 12:09:08 +0300365 else
Johan Hedberg204e3992014-07-28 15:45:31 +0300366 clear_bit(HCI_PSCAN, &hdev->flags);
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200367
368done:
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200369 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200370}
371
372static void hci_cc_read_class_of_dev(struct hci_dev *hdev, struct sk_buff *skb)
373{
374 struct hci_rp_read_class_of_dev *rp = (void *) skb->data;
375
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300376 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200377
378 if (rp->status)
379 return;
380
381 memcpy(hdev->dev_class, rp->dev_class, 3);
382
383 BT_DBG("%s class 0x%.2x%.2x%.2x", hdev->name,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300384 hdev->dev_class[2], hdev->dev_class[1], hdev->dev_class[0]);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200385}
386
387static void hci_cc_write_class_of_dev(struct hci_dev *hdev, struct sk_buff *skb)
388{
389 __u8 status = *((__u8 *) skb->data);
390 void *sent;
391
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300392 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200393
394 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_CLASS_OF_DEV);
395 if (!sent)
396 return;
397
Marcel Holtmann7f9a9032012-02-22 18:38:01 +0100398 hci_dev_lock(hdev);
399
400 if (status == 0)
401 memcpy(hdev->dev_class, sent, 3);
402
403 if (test_bit(HCI_MGMT, &hdev->dev_flags))
404 mgmt_set_class_of_dev_complete(hdev, sent, status);
405
406 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200407}
408
409static void hci_cc_read_voice_setting(struct hci_dev *hdev, struct sk_buff *skb)
410{
411 struct hci_rp_read_voice_setting *rp = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700412 __u16 setting;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200413
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300414 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200415
416 if (rp->status)
417 return;
418
419 setting = __le16_to_cpu(rp->voice_setting);
420
Marcel Holtmannf383f272008-07-14 20:13:47 +0200421 if (hdev->voice_setting == setting)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200422 return;
423
424 hdev->voice_setting = setting;
425
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300426 BT_DBG("%s voice setting 0x%4.4x", hdev->name, setting);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200427
Gustavo F. Padovan3c547112011-12-14 22:58:44 -0200428 if (hdev->notify)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200429 hdev->notify(hdev, HCI_NOTIFY_VOICE_SETTING);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200430}
431
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300432static void hci_cc_write_voice_setting(struct hci_dev *hdev,
433 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200434{
435 __u8 status = *((__u8 *) skb->data);
Marcel Holtmannf383f272008-07-14 20:13:47 +0200436 __u16 setting;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700437 void *sent;
438
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300439 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700440
Marcel Holtmannf383f272008-07-14 20:13:47 +0200441 if (status)
442 return;
443
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200444 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_VOICE_SETTING);
445 if (!sent)
446 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700447
Marcel Holtmannf383f272008-07-14 20:13:47 +0200448 setting = get_unaligned_le16(sent);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700449
Marcel Holtmannf383f272008-07-14 20:13:47 +0200450 if (hdev->voice_setting == setting)
451 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700452
Marcel Holtmannf383f272008-07-14 20:13:47 +0200453 hdev->voice_setting = setting;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700454
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300455 BT_DBG("%s voice setting 0x%4.4x", hdev->name, setting);
Marcel Holtmannf383f272008-07-14 20:13:47 +0200456
Gustavo F. Padovan3c547112011-12-14 22:58:44 -0200457 if (hdev->notify)
Marcel Holtmannf383f272008-07-14 20:13:47 +0200458 hdev->notify(hdev, HCI_NOTIFY_VOICE_SETTING);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700459}
460
Marcel Holtmannb4cb9fb2013-10-14 13:56:16 -0700461static void hci_cc_read_num_supported_iac(struct hci_dev *hdev,
462 struct sk_buff *skb)
463{
464 struct hci_rp_read_num_supported_iac *rp = (void *) skb->data;
465
466 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
467
468 if (rp->status)
469 return;
470
471 hdev->num_iac = rp->num_iac;
472
473 BT_DBG("%s num iac %d", hdev->name, hdev->num_iac);
474}
475
Marcel Holtmann333140b2008-07-14 20:13:48 +0200476static void hci_cc_write_ssp_mode(struct hci_dev *hdev, struct sk_buff *skb)
477{
478 __u8 status = *((__u8 *) skb->data);
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300479 struct hci_cp_write_ssp_mode *sent;
Marcel Holtmann333140b2008-07-14 20:13:48 +0200480
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300481 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann333140b2008-07-14 20:13:48 +0200482
Marcel Holtmann333140b2008-07-14 20:13:48 +0200483 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SSP_MODE);
484 if (!sent)
485 return;
486
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530487 hci_dev_lock(hdev);
488
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300489 if (!status) {
490 if (sent->mode)
Johan Hedbergcad718e2013-04-17 15:00:51 +0300491 hdev->features[1][0] |= LMP_HOST_SSP;
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300492 else
Johan Hedbergcad718e2013-04-17 15:00:51 +0300493 hdev->features[1][0] &= ~LMP_HOST_SSP;
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300494 }
495
Johan Hedberged2c4ee2012-02-17 00:56:28 +0200496 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300497 mgmt_ssp_enable_complete(hdev, sent->mode, status);
Johan Hedbergc0ecddc2012-02-22 12:38:31 +0200498 else if (!status) {
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300499 if (sent->mode)
Johan Hedbergc0ecddc2012-02-22 12:38:31 +0200500 set_bit(HCI_SSP_ENABLED, &hdev->dev_flags);
501 else
502 clear_bit(HCI_SSP_ENABLED, &hdev->dev_flags);
503 }
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530504
505 hci_dev_unlock(hdev);
Marcel Holtmann333140b2008-07-14 20:13:48 +0200506}
507
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800508static void hci_cc_write_sc_support(struct hci_dev *hdev, struct sk_buff *skb)
509{
510 u8 status = *((u8 *) skb->data);
511 struct hci_cp_write_sc_support *sent;
512
513 BT_DBG("%s status 0x%2.2x", hdev->name, status);
514
515 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SC_SUPPORT);
516 if (!sent)
517 return;
518
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530519 hci_dev_lock(hdev);
520
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800521 if (!status) {
522 if (sent->support)
523 hdev->features[1][0] |= LMP_HOST_SC;
524 else
525 hdev->features[1][0] &= ~LMP_HOST_SC;
526 }
527
Johan Hedberga1443f52015-01-23 15:42:46 +0200528 if (!test_bit(HCI_MGMT, &hdev->dev_flags) && !status) {
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800529 if (sent->support)
530 set_bit(HCI_SC_ENABLED, &hdev->dev_flags);
531 else
532 clear_bit(HCI_SC_ENABLED, &hdev->dev_flags);
533 }
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +0530534
535 hci_dev_unlock(hdev);
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800536}
537
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200538static void hci_cc_read_local_version(struct hci_dev *hdev, struct sk_buff *skb)
539{
540 struct hci_rp_read_local_version *rp = (void *) skb->data;
541
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300542 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200543
544 if (rp->status)
Johan Hedberg42c6b122013-03-05 20:37:49 +0200545 return;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200546
Marcel Holtmann8bfe8442014-12-23 23:10:48 +0100547 if (test_bit(HCI_SETUP, &hdev->dev_flags) ||
548 test_bit(HCI_CONFIG, &hdev->dev_flags)) {
Marcel Holtmann0d5551f2013-10-18 12:04:50 -0700549 hdev->hci_ver = rp->hci_ver;
550 hdev->hci_rev = __le16_to_cpu(rp->hci_rev);
551 hdev->lmp_ver = rp->lmp_ver;
552 hdev->manufacturer = __le16_to_cpu(rp->manufacturer);
553 hdev->lmp_subver = __le16_to_cpu(rp->lmp_subver);
554 }
Johan Hedbergd5859e22011-01-25 01:19:58 +0200555}
556
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300557static void hci_cc_read_local_commands(struct hci_dev *hdev,
558 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200559{
560 struct hci_rp_read_local_commands *rp = (void *) skb->data;
561
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300562 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200563
Marcel Holtmann6a070e62013-10-31 04:54:33 -0700564 if (rp->status)
565 return;
566
Marcel Holtmann8bfe8442014-12-23 23:10:48 +0100567 if (test_bit(HCI_SETUP, &hdev->dev_flags) ||
568 test_bit(HCI_CONFIG, &hdev->dev_flags))
Johan Hedberg2177bab2013-03-05 20:37:43 +0200569 memcpy(hdev->commands, rp->commands, sizeof(hdev->commands));
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200570}
571
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300572static void hci_cc_read_local_features(struct hci_dev *hdev,
573 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200574{
575 struct hci_rp_read_local_features *rp = (void *) skb->data;
576
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300577 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200578
579 if (rp->status)
580 return;
581
582 memcpy(hdev->features, rp->features, 8);
583
584 /* Adjust default settings according to features
585 * supported by device. */
586
Johan Hedbergcad718e2013-04-17 15:00:51 +0300587 if (hdev->features[0][0] & LMP_3SLOT)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200588 hdev->pkt_type |= (HCI_DM3 | HCI_DH3);
589
Johan Hedbergcad718e2013-04-17 15:00:51 +0300590 if (hdev->features[0][0] & LMP_5SLOT)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200591 hdev->pkt_type |= (HCI_DM5 | HCI_DH5);
592
Johan Hedbergcad718e2013-04-17 15:00:51 +0300593 if (hdev->features[0][1] & LMP_HV2) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200594 hdev->pkt_type |= (HCI_HV2);
595 hdev->esco_type |= (ESCO_HV2);
596 }
597
Johan Hedbergcad718e2013-04-17 15:00:51 +0300598 if (hdev->features[0][1] & LMP_HV3) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200599 hdev->pkt_type |= (HCI_HV3);
600 hdev->esco_type |= (ESCO_HV3);
601 }
602
Andre Guedes45db810f2012-07-24 15:03:49 -0300603 if (lmp_esco_capable(hdev))
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200604 hdev->esco_type |= (ESCO_EV3);
605
Johan Hedbergcad718e2013-04-17 15:00:51 +0300606 if (hdev->features[0][4] & LMP_EV4)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200607 hdev->esco_type |= (ESCO_EV4);
608
Johan Hedbergcad718e2013-04-17 15:00:51 +0300609 if (hdev->features[0][4] & LMP_EV5)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200610 hdev->esco_type |= (ESCO_EV5);
611
Johan Hedbergcad718e2013-04-17 15:00:51 +0300612 if (hdev->features[0][5] & LMP_EDR_ESCO_2M)
Marcel Holtmannefc76882009-02-06 09:13:37 +0100613 hdev->esco_type |= (ESCO_2EV3);
614
Johan Hedbergcad718e2013-04-17 15:00:51 +0300615 if (hdev->features[0][5] & LMP_EDR_ESCO_3M)
Marcel Holtmannefc76882009-02-06 09:13:37 +0100616 hdev->esco_type |= (ESCO_3EV3);
617
Johan Hedbergcad718e2013-04-17 15:00:51 +0300618 if (hdev->features[0][5] & LMP_EDR_3S_ESCO)
Marcel Holtmannefc76882009-02-06 09:13:37 +0100619 hdev->esco_type |= (ESCO_2EV5 | ESCO_3EV5);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200620}
621
Andre Guedes971e3a42011-06-30 19:20:52 -0300622static void hci_cc_read_local_ext_features(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300623 struct sk_buff *skb)
Andre Guedes971e3a42011-06-30 19:20:52 -0300624{
625 struct hci_rp_read_local_ext_features *rp = (void *) skb->data;
626
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300627 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andre Guedes971e3a42011-06-30 19:20:52 -0300628
629 if (rp->status)
Johan Hedberg42c6b122013-03-05 20:37:49 +0200630 return;
Andre Guedes971e3a42011-06-30 19:20:52 -0300631
Marcel Holtmann57af75a2013-10-18 12:04:47 -0700632 if (hdev->max_page < rp->max_page)
633 hdev->max_page = rp->max_page;
Johan Hedbergd2c5d772013-04-17 15:00:52 +0300634
Johan Hedbergcad718e2013-04-17 15:00:51 +0300635 if (rp->page < HCI_MAX_PAGES)
636 memcpy(hdev->features[rp->page], rp->features, 8);
Andre Guedes971e3a42011-06-30 19:20:52 -0300637}
638
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200639static void hci_cc_read_flow_control_mode(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300640 struct sk_buff *skb)
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200641{
642 struct hci_rp_read_flow_control_mode *rp = (void *) skb->data;
643
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300644 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200645
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200646 if (rp->status)
647 return;
648
649 hdev->flow_ctl_mode = rp->mode;
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200650}
651
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200652static void hci_cc_read_buffer_size(struct hci_dev *hdev, struct sk_buff *skb)
653{
654 struct hci_rp_read_buffer_size *rp = (void *) skb->data;
655
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300656 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200657
658 if (rp->status)
659 return;
660
661 hdev->acl_mtu = __le16_to_cpu(rp->acl_mtu);
662 hdev->sco_mtu = rp->sco_mtu;
663 hdev->acl_pkts = __le16_to_cpu(rp->acl_max_pkt);
664 hdev->sco_pkts = __le16_to_cpu(rp->sco_max_pkt);
665
666 if (test_bit(HCI_QUIRK_FIXUP_BUFFER_SIZE, &hdev->quirks)) {
667 hdev->sco_mtu = 64;
668 hdev->sco_pkts = 8;
669 }
670
671 hdev->acl_cnt = hdev->acl_pkts;
672 hdev->sco_cnt = hdev->sco_pkts;
673
Gustavo Padovan807deac2012-05-17 00:36:24 -0300674 BT_DBG("%s acl mtu %d:%d sco mtu %d:%d", hdev->name, hdev->acl_mtu,
675 hdev->acl_pkts, hdev->sco_mtu, hdev->sco_pkts);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200676}
677
678static void hci_cc_read_bd_addr(struct hci_dev *hdev, struct sk_buff *skb)
679{
680 struct hci_rp_read_bd_addr *rp = (void *) skb->data;
681
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300682 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200683
Marcel Holtmanne30d3f52014-07-05 10:48:03 +0200684 if (rp->status)
685 return;
686
687 if (test_bit(HCI_INIT, &hdev->flags))
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200688 bacpy(&hdev->bdaddr, &rp->bdaddr);
Marcel Holtmanne30d3f52014-07-05 10:48:03 +0200689
690 if (test_bit(HCI_SETUP, &hdev->dev_flags))
691 bacpy(&hdev->setup_addr, &rp->bdaddr);
Johan Hedberg23bb5762010-12-21 23:01:27 +0200692}
693
Johan Hedbergf332ec62013-03-15 17:07:11 -0500694static void hci_cc_read_page_scan_activity(struct hci_dev *hdev,
695 struct sk_buff *skb)
696{
697 struct hci_rp_read_page_scan_activity *rp = (void *) skb->data;
698
699 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
700
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200701 if (rp->status)
702 return;
703
704 if (test_bit(HCI_INIT, &hdev->flags)) {
Johan Hedbergf332ec62013-03-15 17:07:11 -0500705 hdev->page_scan_interval = __le16_to_cpu(rp->interval);
706 hdev->page_scan_window = __le16_to_cpu(rp->window);
707 }
708}
709
Johan Hedberg4a3ee762013-03-15 17:07:12 -0500710static void hci_cc_write_page_scan_activity(struct hci_dev *hdev,
711 struct sk_buff *skb)
712{
713 u8 status = *((u8 *) skb->data);
714 struct hci_cp_write_page_scan_activity *sent;
715
716 BT_DBG("%s status 0x%2.2x", hdev->name, status);
717
718 if (status)
719 return;
720
721 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY);
722 if (!sent)
723 return;
724
725 hdev->page_scan_interval = __le16_to_cpu(sent->interval);
726 hdev->page_scan_window = __le16_to_cpu(sent->window);
727}
728
Johan Hedbergf332ec62013-03-15 17:07:11 -0500729static void hci_cc_read_page_scan_type(struct hci_dev *hdev,
730 struct sk_buff *skb)
731{
732 struct hci_rp_read_page_scan_type *rp = (void *) skb->data;
733
734 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
735
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200736 if (rp->status)
737 return;
738
739 if (test_bit(HCI_INIT, &hdev->flags))
Johan Hedbergf332ec62013-03-15 17:07:11 -0500740 hdev->page_scan_type = rp->type;
741}
742
Johan Hedberg4a3ee762013-03-15 17:07:12 -0500743static void hci_cc_write_page_scan_type(struct hci_dev *hdev,
744 struct sk_buff *skb)
745{
746 u8 status = *((u8 *) skb->data);
747 u8 *type;
748
749 BT_DBG("%s status 0x%2.2x", hdev->name, status);
750
751 if (status)
752 return;
753
754 type = hci_sent_cmd_data(hdev, HCI_OP_WRITE_PAGE_SCAN_TYPE);
755 if (type)
756 hdev->page_scan_type = *type;
757}
758
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200759static void hci_cc_read_data_block_size(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300760 struct sk_buff *skb)
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200761{
762 struct hci_rp_read_data_block_size *rp = (void *) skb->data;
763
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300764 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200765
766 if (rp->status)
767 return;
768
769 hdev->block_mtu = __le16_to_cpu(rp->max_acl_len);
770 hdev->block_len = __le16_to_cpu(rp->block_len);
771 hdev->num_blocks = __le16_to_cpu(rp->num_blocks);
772
773 hdev->block_cnt = hdev->num_blocks;
774
775 BT_DBG("%s blk mtu %d cnt %d len %d", hdev->name, hdev->block_mtu,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300776 hdev->block_cnt, hdev->block_len);
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200777}
778
Johan Hedberg33f35722014-06-28 17:54:06 +0300779static void hci_cc_read_clock(struct hci_dev *hdev, struct sk_buff *skb)
780{
781 struct hci_rp_read_clock *rp = (void *) skb->data;
782 struct hci_cp_read_clock *cp;
783 struct hci_conn *conn;
784
785 BT_DBG("%s", hdev->name);
786
787 if (skb->len < sizeof(*rp))
788 return;
789
790 if (rp->status)
791 return;
792
793 hci_dev_lock(hdev);
794
795 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_CLOCK);
796 if (!cp)
797 goto unlock;
798
799 if (cp->which == 0x00) {
800 hdev->clock = le32_to_cpu(rp->clock);
801 goto unlock;
802 }
803
804 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
805 if (conn) {
806 conn->clock = le32_to_cpu(rp->clock);
807 conn->clock_accuracy = le16_to_cpu(rp->accuracy);
808 }
809
810unlock:
811 hci_dev_unlock(hdev);
812}
813
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300814static void hci_cc_read_local_amp_info(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300815 struct sk_buff *skb)
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300816{
817 struct hci_rp_read_local_amp_info *rp = (void *) skb->data;
818
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300819 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300820
821 if (rp->status)
Andrei Emeltchenko8e2a0d92012-09-27 17:26:08 +0300822 goto a2mp_rsp;
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300823
824 hdev->amp_status = rp->amp_status;
825 hdev->amp_total_bw = __le32_to_cpu(rp->total_bw);
826 hdev->amp_max_bw = __le32_to_cpu(rp->max_bw);
827 hdev->amp_min_latency = __le32_to_cpu(rp->min_latency);
828 hdev->amp_max_pdu = __le32_to_cpu(rp->max_pdu);
829 hdev->amp_type = rp->amp_type;
830 hdev->amp_pal_cap = __le16_to_cpu(rp->pal_cap);
831 hdev->amp_assoc_size = __le16_to_cpu(rp->max_assoc_size);
832 hdev->amp_be_flush_to = __le32_to_cpu(rp->be_flush_to);
833 hdev->amp_max_flush_to = __le32_to_cpu(rp->max_flush_to);
834
Andrei Emeltchenko8e2a0d92012-09-27 17:26:08 +0300835a2mp_rsp:
836 a2mp_send_getinfo_rsp(hdev);
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300837}
838
Andrei Emeltchenko903e4542012-09-27 17:26:09 +0300839static void hci_cc_read_local_amp_assoc(struct hci_dev *hdev,
840 struct sk_buff *skb)
841{
842 struct hci_rp_read_local_amp_assoc *rp = (void *) skb->data;
843 struct amp_assoc *assoc = &hdev->loc_assoc;
844 size_t rem_len, frag_len;
845
846 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
847
848 if (rp->status)
849 goto a2mp_rsp;
850
851 frag_len = skb->len - sizeof(*rp);
852 rem_len = __le16_to_cpu(rp->rem_len);
853
854 if (rem_len > frag_len) {
Andrei Emeltchenko2e430be32012-09-28 14:44:23 +0300855 BT_DBG("frag_len %zu rem_len %zu", frag_len, rem_len);
Andrei Emeltchenko903e4542012-09-27 17:26:09 +0300856
857 memcpy(assoc->data + assoc->offset, rp->frag, frag_len);
858 assoc->offset += frag_len;
859
860 /* Read other fragments */
861 amp_read_loc_assoc_frag(hdev, rp->phy_handle);
862
863 return;
864 }
865
866 memcpy(assoc->data + assoc->offset, rp->frag, rem_len);
867 assoc->len = assoc->offset + rem_len;
868 assoc->offset = 0;
869
870a2mp_rsp:
871 /* Send A2MP Rsp when all fragments are received */
872 a2mp_send_getampassoc_rsp(hdev, rp->status);
Andrei Emeltchenko9495b2e2012-09-27 17:26:22 +0300873 a2mp_send_create_phy_link_req(hdev, rp->status);
Andrei Emeltchenko903e4542012-09-27 17:26:09 +0300874}
875
Johan Hedbergd5859e22011-01-25 01:19:58 +0200876static void hci_cc_read_inq_rsp_tx_power(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300877 struct sk_buff *skb)
Johan Hedbergd5859e22011-01-25 01:19:58 +0200878{
Marcel Holtmann91c4e9b2012-03-11 19:27:21 -0700879 struct hci_rp_read_inq_rsp_tx_power *rp = (void *) skb->data;
Johan Hedbergd5859e22011-01-25 01:19:58 +0200880
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300881 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedbergd5859e22011-01-25 01:19:58 +0200882
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200883 if (rp->status)
884 return;
885
886 hdev->inq_tx_power = rp->tx_power;
Johan Hedbergd5859e22011-01-25 01:19:58 +0200887}
888
Johan Hedberg980e1a52011-01-22 06:10:07 +0200889static void hci_cc_pin_code_reply(struct hci_dev *hdev, struct sk_buff *skb)
890{
891 struct hci_rp_pin_code_reply *rp = (void *) skb->data;
892 struct hci_cp_pin_code_reply *cp;
893 struct hci_conn *conn;
894
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300895 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200896
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200897 hci_dev_lock(hdev);
898
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200899 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg744cf192011-11-08 20:40:14 +0200900 mgmt_pin_code_reply_complete(hdev, &rp->bdaddr, rp->status);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200901
Mikel Astizfa1bd912012-08-09 09:52:29 +0200902 if (rp->status)
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200903 goto unlock;
Johan Hedberg980e1a52011-01-22 06:10:07 +0200904
905 cp = hci_sent_cmd_data(hdev, HCI_OP_PIN_CODE_REPLY);
906 if (!cp)
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200907 goto unlock;
Johan Hedberg980e1a52011-01-22 06:10:07 +0200908
909 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
910 if (conn)
911 conn->pin_length = cp->pin_len;
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200912
913unlock:
914 hci_dev_unlock(hdev);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200915}
916
917static void hci_cc_pin_code_neg_reply(struct hci_dev *hdev, struct sk_buff *skb)
918{
919 struct hci_rp_pin_code_neg_reply *rp = (void *) skb->data;
920
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300921 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200922
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200923 hci_dev_lock(hdev);
924
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200925 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg744cf192011-11-08 20:40:14 +0200926 mgmt_pin_code_neg_reply_complete(hdev, &rp->bdaddr,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300927 rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200928
929 hci_dev_unlock(hdev);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200930}
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200931
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300932static void hci_cc_le_read_buffer_size(struct hci_dev *hdev,
933 struct sk_buff *skb)
934{
935 struct hci_rp_le_read_buffer_size *rp = (void *) skb->data;
936
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300937 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300938
939 if (rp->status)
940 return;
941
942 hdev->le_mtu = __le16_to_cpu(rp->le_mtu);
943 hdev->le_pkts = rp->le_max_pkt;
944
945 hdev->le_cnt = hdev->le_pkts;
946
947 BT_DBG("%s le mtu %d:%d", hdev->name, hdev->le_mtu, hdev->le_pkts);
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300948}
Johan Hedberg980e1a52011-01-22 06:10:07 +0200949
Johan Hedberg60e77322013-01-22 14:01:59 +0200950static void hci_cc_le_read_local_features(struct hci_dev *hdev,
951 struct sk_buff *skb)
952{
953 struct hci_rp_le_read_local_features *rp = (void *) skb->data;
954
955 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
956
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200957 if (rp->status)
958 return;
959
960 memcpy(hdev->le_features, rp->features, 8);
Johan Hedberg60e77322013-01-22 14:01:59 +0200961}
962
Johan Hedberg8fa19092012-10-19 20:57:49 +0300963static void hci_cc_le_read_adv_tx_power(struct hci_dev *hdev,
964 struct sk_buff *skb)
965{
966 struct hci_rp_le_read_adv_tx_power *rp = (void *) skb->data;
967
968 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
969
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200970 if (rp->status)
971 return;
972
973 hdev->adv_tx_power = rp->tx_power;
Johan Hedberg8fa19092012-10-19 20:57:49 +0300974}
975
Johan Hedberga5c29682011-02-19 12:05:57 -0300976static void hci_cc_user_confirm_reply(struct hci_dev *hdev, struct sk_buff *skb)
977{
978 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
979
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300980 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberga5c29682011-02-19 12:05:57 -0300981
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200982 hci_dev_lock(hdev);
983
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200984 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300985 mgmt_user_confirm_reply_complete(hdev, &rp->bdaddr, ACL_LINK, 0,
986 rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200987
988 hci_dev_unlock(hdev);
Johan Hedberga5c29682011-02-19 12:05:57 -0300989}
990
991static void hci_cc_user_confirm_neg_reply(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300992 struct sk_buff *skb)
Johan Hedberga5c29682011-02-19 12:05:57 -0300993{
994 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
995
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300996 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberga5c29682011-02-19 12:05:57 -0300997
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200998 hci_dev_lock(hdev);
999
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02001000 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg744cf192011-11-08 20:40:14 +02001001 mgmt_user_confirm_neg_reply_complete(hdev, &rp->bdaddr,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001002 ACL_LINK, 0, rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +02001003
1004 hci_dev_unlock(hdev);
Johan Hedberga5c29682011-02-19 12:05:57 -03001005}
1006
Brian Gix1143d452011-11-23 08:28:34 -08001007static void hci_cc_user_passkey_reply(struct hci_dev *hdev, struct sk_buff *skb)
1008{
1009 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
1010
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001011 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -08001012
1013 hci_dev_lock(hdev);
1014
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02001015 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg272d90d2012-02-09 15:26:12 +02001016 mgmt_user_passkey_reply_complete(hdev, &rp->bdaddr, ACL_LINK,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001017 0, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -08001018
1019 hci_dev_unlock(hdev);
1020}
1021
1022static void hci_cc_user_passkey_neg_reply(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -03001023 struct sk_buff *skb)
Brian Gix1143d452011-11-23 08:28:34 -08001024{
1025 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
1026
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001027 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -08001028
1029 hci_dev_lock(hdev);
1030
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02001031 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Brian Gix1143d452011-11-23 08:28:34 -08001032 mgmt_user_passkey_neg_reply_complete(hdev, &rp->bdaddr,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001033 ACL_LINK, 0, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -08001034
1035 hci_dev_unlock(hdev);
1036}
1037
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08001038static void hci_cc_read_local_oob_data(struct hci_dev *hdev,
1039 struct sk_buff *skb)
Szymon Jancc35938b2011-03-22 13:12:21 +01001040{
1041 struct hci_rp_read_local_oob_data *rp = (void *) skb->data;
1042
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001043 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Szymon Jancc35938b2011-03-22 13:12:21 +01001044
Johan Hedberg56e5cb82011-11-08 20:40:16 +02001045 hci_dev_lock(hdev);
Johan Hedberg38da1702014-11-17 20:52:20 +02001046 mgmt_read_local_oob_data_complete(hdev, rp->hash, rp->rand, NULL, NULL,
1047 rp->status);
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08001048 hci_dev_unlock(hdev);
1049}
1050
1051static void hci_cc_read_local_oob_ext_data(struct hci_dev *hdev,
1052 struct sk_buff *skb)
1053{
1054 struct hci_rp_read_local_oob_ext_data *rp = (void *) skb->data;
1055
1056 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1057
1058 hci_dev_lock(hdev);
Johan Hedberg38da1702014-11-17 20:52:20 +02001059 mgmt_read_local_oob_data_complete(hdev, rp->hash192, rp->rand192,
1060 rp->hash256, rp->rand256,
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08001061 rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +02001062 hci_dev_unlock(hdev);
Szymon Jancc35938b2011-03-22 13:12:21 +01001063}
1064
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08001065
1066static void hci_cc_le_set_random_addr(struct hci_dev *hdev, struct sk_buff *skb)
1067{
1068 __u8 status = *((__u8 *) skb->data);
1069 bdaddr_t *sent;
1070
1071 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1072
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001073 if (status)
1074 return;
1075
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08001076 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_RANDOM_ADDR);
1077 if (!sent)
1078 return;
1079
1080 hci_dev_lock(hdev);
1081
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001082 bacpy(&hdev->random_addr, sent);
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08001083
1084 hci_dev_unlock(hdev);
1085}
1086
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001087static void hci_cc_le_set_adv_enable(struct hci_dev *hdev, struct sk_buff *skb)
1088{
1089 __u8 *sent, status = *((__u8 *) skb->data);
1090
1091 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1092
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001093 if (status)
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001094 return;
1095
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001096 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADV_ENABLE);
1097 if (!sent)
Johan Hedberg3c857752014-03-25 10:30:49 +02001098 return;
1099
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001100 hci_dev_lock(hdev);
1101
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001102 /* If we're doing connection initiation as peripheral. Set a
Johan Hedberg3c857752014-03-25 10:30:49 +02001103 * timeout in case something goes wrong.
1104 */
1105 if (*sent) {
1106 struct hci_conn *conn;
1107
Johan Hedberg66c417c2014-07-08 15:07:47 +03001108 set_bit(HCI_LE_ADV, &hdev->dev_flags);
1109
Johan Hedberg3c857752014-03-25 10:30:49 +02001110 conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
1111 if (conn)
1112 queue_delayed_work(hdev->workqueue,
1113 &conn->le_conn_timeout,
Johan Hedberg09ae2602014-07-06 13:41:15 +03001114 conn->conn_timeout);
Johan Hedberg66c417c2014-07-08 15:07:47 +03001115 } else {
1116 clear_bit(HCI_LE_ADV, &hdev->dev_flags);
Johan Hedberg3c857752014-03-25 10:30:49 +02001117 }
1118
Johan Hedberg04b4edc2013-03-15 17:07:01 -05001119 hci_dev_unlock(hdev);
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001120}
1121
Marcel Holtmann533553f2014-03-21 12:18:10 -07001122static void hci_cc_le_set_scan_param(struct hci_dev *hdev, struct sk_buff *skb)
1123{
1124 struct hci_cp_le_set_scan_param *cp;
1125 __u8 status = *((__u8 *) skb->data);
1126
1127 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1128
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001129 if (status)
1130 return;
1131
Marcel Holtmann533553f2014-03-21 12:18:10 -07001132 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_PARAM);
1133 if (!cp)
1134 return;
1135
1136 hci_dev_lock(hdev);
1137
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001138 hdev->le_scan_type = cp->type;
Marcel Holtmann533553f2014-03-21 12:18:10 -07001139
1140 hci_dev_unlock(hdev);
1141}
1142
Johan Hedbergb9a63282014-03-25 10:51:52 +02001143static bool has_pending_adv_report(struct hci_dev *hdev)
1144{
1145 struct discovery_state *d = &hdev->discovery;
1146
1147 return bacmp(&d->last_adv_addr, BDADDR_ANY);
1148}
1149
1150static void clear_pending_adv_report(struct hci_dev *hdev)
1151{
1152 struct discovery_state *d = &hdev->discovery;
1153
1154 bacpy(&d->last_adv_addr, BDADDR_ANY);
1155 d->last_adv_data_len = 0;
1156}
1157
1158static void store_pending_adv_report(struct hci_dev *hdev, bdaddr_t *bdaddr,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001159 u8 bdaddr_type, s8 rssi, u32 flags,
1160 u8 *data, u8 len)
Johan Hedbergb9a63282014-03-25 10:51:52 +02001161{
1162 struct discovery_state *d = &hdev->discovery;
1163
1164 bacpy(&d->last_adv_addr, bdaddr);
1165 d->last_adv_addr_type = bdaddr_type;
Johan Hedbergff5cd292014-03-25 14:40:52 +02001166 d->last_adv_rssi = rssi;
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001167 d->last_adv_flags = flags;
Johan Hedbergb9a63282014-03-25 10:51:52 +02001168 memcpy(d->last_adv_data, data, len);
1169 d->last_adv_data_len = len;
1170}
1171
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001172static void hci_cc_le_set_scan_enable(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -03001173 struct sk_buff *skb)
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001174{
1175 struct hci_cp_le_set_scan_enable *cp;
1176 __u8 status = *((__u8 *) skb->data);
1177
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001178 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001179
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001180 if (status)
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001181 return;
1182
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001183 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_ENABLE);
1184 if (!cp)
Andre Guedes3fd319b2013-04-30 15:29:36 -03001185 return;
1186
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301187 hci_dev_lock(hdev);
1188
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001189 switch (cp->enable) {
Andre Guedes76a388b2013-04-04 20:21:02 -03001190 case LE_SCAN_ENABLE:
Andre Guedesd23264a2011-11-25 20:53:38 -03001191 set_bit(HCI_LE_SCAN, &hdev->dev_flags);
Johan Hedbergb9a63282014-03-25 10:51:52 +02001192 if (hdev->le_scan_type == LE_SCAN_ACTIVE)
1193 clear_pending_adv_report(hdev);
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001194 break;
1195
Andre Guedes76a388b2013-04-04 20:21:02 -03001196 case LE_SCAN_DISABLE:
Johan Hedbergb9a63282014-03-25 10:51:52 +02001197 /* We do this here instead of when setting DISCOVERY_STOPPED
1198 * since the latter would potentially require waiting for
1199 * inquiry to stop too.
1200 */
1201 if (has_pending_adv_report(hdev)) {
1202 struct discovery_state *d = &hdev->discovery;
1203
1204 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergab0aa432014-03-26 14:17:12 +02001205 d->last_adv_addr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001206 d->last_adv_rssi, d->last_adv_flags,
Johan Hedbergab0aa432014-03-26 14:17:12 +02001207 d->last_adv_data,
Johan Hedbergb9a63282014-03-25 10:51:52 +02001208 d->last_adv_data_len, NULL, 0);
1209 }
1210
Johan Hedberg317ac8c2014-02-28 20:26:12 +02001211 /* Cancel this timer so that we don't try to disable scanning
1212 * when it's already disabled.
1213 */
1214 cancel_delayed_work(&hdev->le_scan_disable);
1215
Andre Guedesd23264a2011-11-25 20:53:38 -03001216 clear_bit(HCI_LE_SCAN, &hdev->dev_flags);
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001217
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001218 /* The HCI_LE_SCAN_INTERRUPTED flag indicates that we
1219 * interrupted scanning due to a connect request. Mark
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001220 * therefore discovery as stopped. If this was not
1221 * because of a connect request advertising might have
1222 * been disabled because of active scanning, so
1223 * re-enable it again if necessary.
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001224 */
1225 if (test_and_clear_bit(HCI_LE_SCAN_INTERRUPTED,
1226 &hdev->dev_flags))
1227 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001228 else if (!test_bit(HCI_LE_ADV, &hdev->dev_flags) &&
Johan Hedberg34722272014-07-08 16:05:05 +03001229 hdev->discovery.state == DISCOVERY_FINDING)
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001230 mgmt_reenable_advertising(hdev);
1231
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001232 break;
1233
1234 default:
1235 BT_ERR("Used reserved LE_Scan_Enable param %d", cp->enable);
1236 break;
Andre Guedes35815082011-05-26 16:23:53 -03001237 }
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301238
1239 hci_dev_unlock(hdev);
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001240}
1241
Johan Hedbergcf1d0812013-01-22 14:02:00 +02001242static void hci_cc_le_read_white_list_size(struct hci_dev *hdev,
1243 struct sk_buff *skb)
1244{
1245 struct hci_rp_le_read_white_list_size *rp = (void *) skb->data;
1246
1247 BT_DBG("%s status 0x%2.2x size %u", hdev->name, rp->status, rp->size);
1248
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001249 if (rp->status)
1250 return;
1251
1252 hdev->le_white_list_size = rp->size;
Johan Hedbergcf1d0812013-01-22 14:02:00 +02001253}
1254
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001255static void hci_cc_le_clear_white_list(struct hci_dev *hdev,
1256 struct sk_buff *skb)
1257{
1258 __u8 status = *((__u8 *) skb->data);
1259
1260 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1261
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001262 if (status)
1263 return;
1264
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001265 hci_bdaddr_list_clear(&hdev->le_white_list);
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001266}
1267
1268static void hci_cc_le_add_to_white_list(struct hci_dev *hdev,
1269 struct sk_buff *skb)
1270{
1271 struct hci_cp_le_add_to_white_list *sent;
1272 __u8 status = *((__u8 *) skb->data);
1273
1274 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1275
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001276 if (status)
1277 return;
1278
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001279 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_ADD_TO_WHITE_LIST);
1280 if (!sent)
1281 return;
1282
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001283 hci_bdaddr_list_add(&hdev->le_white_list, &sent->bdaddr,
1284 sent->bdaddr_type);
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001285}
1286
1287static void hci_cc_le_del_from_white_list(struct hci_dev *hdev,
1288 struct sk_buff *skb)
1289{
1290 struct hci_cp_le_del_from_white_list *sent;
1291 __u8 status = *((__u8 *) skb->data);
1292
1293 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1294
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001295 if (status)
1296 return;
1297
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001298 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_DEL_FROM_WHITE_LIST);
1299 if (!sent)
1300 return;
1301
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001302 hci_bdaddr_list_del(&hdev->le_white_list, &sent->bdaddr,
1303 sent->bdaddr_type);
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001304}
1305
Johan Hedberg9b008c02013-01-22 14:02:01 +02001306static void hci_cc_le_read_supported_states(struct hci_dev *hdev,
1307 struct sk_buff *skb)
1308{
1309 struct hci_rp_le_read_supported_states *rp = (void *) skb->data;
1310
1311 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1312
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001313 if (rp->status)
1314 return;
1315
1316 memcpy(hdev->le_states, rp->le_states, 8);
Johan Hedberg9b008c02013-01-22 14:02:01 +02001317}
1318
Marcel Holtmanna8e1bfa2014-12-20 16:28:40 +01001319static void hci_cc_le_read_def_data_len(struct hci_dev *hdev,
1320 struct sk_buff *skb)
1321{
1322 struct hci_rp_le_read_def_data_len *rp = (void *) skb->data;
1323
1324 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1325
1326 if (rp->status)
1327 return;
1328
1329 hdev->le_def_tx_len = le16_to_cpu(rp->tx_len);
1330 hdev->le_def_tx_time = le16_to_cpu(rp->tx_time);
1331}
1332
1333static void hci_cc_le_write_def_data_len(struct hci_dev *hdev,
1334 struct sk_buff *skb)
1335{
1336 struct hci_cp_le_write_def_data_len *sent;
1337 __u8 status = *((__u8 *) skb->data);
1338
1339 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1340
1341 if (status)
1342 return;
1343
1344 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_WRITE_DEF_DATA_LEN);
1345 if (!sent)
1346 return;
1347
1348 hdev->le_def_tx_len = le16_to_cpu(sent->tx_len);
1349 hdev->le_def_tx_time = le16_to_cpu(sent->tx_time);
1350}
1351
1352static void hci_cc_le_read_max_data_len(struct hci_dev *hdev,
1353 struct sk_buff *skb)
1354{
1355 struct hci_rp_le_read_max_data_len *rp = (void *) skb->data;
1356
1357 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1358
1359 if (rp->status)
1360 return;
1361
1362 hdev->le_max_tx_len = le16_to_cpu(rp->tx_len);
1363 hdev->le_max_tx_time = le16_to_cpu(rp->tx_time);
1364 hdev->le_max_rx_len = le16_to_cpu(rp->rx_len);
1365 hdev->le_max_rx_time = le16_to_cpu(rp->rx_time);
1366}
1367
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001368static void hci_cc_write_le_host_supported(struct hci_dev *hdev,
1369 struct sk_buff *skb)
Andre Guedesf9b49302011-06-30 19:20:53 -03001370{
Johan Hedberg06199cf2012-02-22 16:37:11 +02001371 struct hci_cp_write_le_host_supported *sent;
Andre Guedesf9b49302011-06-30 19:20:53 -03001372 __u8 status = *((__u8 *) skb->data);
1373
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001374 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedesf9b49302011-06-30 19:20:53 -03001375
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001376 if (status)
1377 return;
1378
Johan Hedberg06199cf2012-02-22 16:37:11 +02001379 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LE_HOST_SUPPORTED);
Johan Hedberg8f984df2012-02-28 01:07:22 +02001380 if (!sent)
Andre Guedesf9b49302011-06-30 19:20:53 -03001381 return;
1382
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301383 hci_dev_lock(hdev);
1384
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001385 if (sent->le) {
1386 hdev->features[1][0] |= LMP_HOST_LE;
1387 set_bit(HCI_LE_ENABLED, &hdev->dev_flags);
1388 } else {
1389 hdev->features[1][0] &= ~LMP_HOST_LE;
1390 clear_bit(HCI_LE_ENABLED, &hdev->dev_flags);
1391 clear_bit(HCI_ADVERTISING, &hdev->dev_flags);
Johan Hedberg8f984df2012-02-28 01:07:22 +02001392 }
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001393
1394 if (sent->simul)
1395 hdev->features[1][0] |= LMP_HOST_LE_BREDR;
1396 else
1397 hdev->features[1][0] &= ~LMP_HOST_LE_BREDR;
Jaganath Kanakkassery5c1a4c82014-12-11 18:58:15 +05301398
1399 hci_dev_unlock(hdev);
Andre Guedesf9b49302011-06-30 19:20:53 -03001400}
1401
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02001402static void hci_cc_set_adv_param(struct hci_dev *hdev, struct sk_buff *skb)
1403{
1404 struct hci_cp_le_set_adv_param *cp;
1405 u8 status = *((u8 *) skb->data);
1406
1407 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1408
1409 if (status)
1410 return;
1411
1412 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADV_PARAM);
1413 if (!cp)
1414 return;
1415
1416 hci_dev_lock(hdev);
1417 hdev->adv_addr_type = cp->own_address_type;
1418 hci_dev_unlock(hdev);
1419}
1420
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001421static void hci_cc_write_remote_amp_assoc(struct hci_dev *hdev,
1422 struct sk_buff *skb)
1423{
1424 struct hci_rp_write_remote_amp_assoc *rp = (void *) skb->data;
1425
1426 BT_DBG("%s status 0x%2.2x phy_handle 0x%2.2x",
1427 hdev->name, rp->status, rp->phy_handle);
1428
1429 if (rp->status)
1430 return;
1431
1432 amp_write_rem_assoc_continue(hdev, rp->phy_handle);
1433}
1434
Andrzej Kaczmarek5ae76a92014-05-08 15:32:08 +02001435static void hci_cc_read_rssi(struct hci_dev *hdev, struct sk_buff *skb)
1436{
1437 struct hci_rp_read_rssi *rp = (void *) skb->data;
1438 struct hci_conn *conn;
1439
1440 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1441
1442 if (rp->status)
1443 return;
1444
1445 hci_dev_lock(hdev);
1446
1447 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
1448 if (conn)
1449 conn->rssi = rp->rssi;
1450
1451 hci_dev_unlock(hdev);
1452}
1453
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001454static void hci_cc_read_tx_power(struct hci_dev *hdev, struct sk_buff *skb)
1455{
1456 struct hci_cp_read_tx_power *sent;
1457 struct hci_rp_read_tx_power *rp = (void *) skb->data;
1458 struct hci_conn *conn;
1459
1460 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1461
1462 if (rp->status)
1463 return;
1464
1465 sent = hci_sent_cmd_data(hdev, HCI_OP_READ_TX_POWER);
1466 if (!sent)
1467 return;
1468
1469 hci_dev_lock(hdev);
1470
1471 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
Andrzej Kaczmarekd0455ed2014-05-14 13:43:05 +02001472 if (!conn)
1473 goto unlock;
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001474
Andrzej Kaczmarekd0455ed2014-05-14 13:43:05 +02001475 switch (sent->type) {
1476 case 0x00:
1477 conn->tx_power = rp->tx_power;
1478 break;
1479 case 0x01:
1480 conn->max_tx_power = rp->tx_power;
1481 break;
1482 }
1483
1484unlock:
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001485 hci_dev_unlock(hdev);
1486}
1487
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001488static void hci_cs_inquiry(struct hci_dev *hdev, __u8 status)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001489{
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001490 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001491
1492 if (status) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001493 hci_conn_check_pending(hdev);
Johan Hedberg314b2382011-04-27 10:29:57 -04001494 return;
1495 }
1496
Andre Guedes89352e72011-11-04 14:16:53 -03001497 set_bit(HCI_INQUIRY, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001498}
1499
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001500static void hci_cs_create_conn(struct hci_dev *hdev, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001501{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001502 struct hci_cp_create_conn *cp;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001503 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001504
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001505 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001506
1507 cp = hci_sent_cmd_data(hdev, HCI_OP_CREATE_CONN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001508 if (!cp)
1509 return;
1510
1511 hci_dev_lock(hdev);
1512
1513 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
1514
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03001515 BT_DBG("%s bdaddr %pMR hcon %p", hdev->name, &cp->bdaddr, conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001516
1517 if (status) {
1518 if (conn && conn->state == BT_CONNECT) {
Marcel Holtmann4c67bc72006-10-15 17:30:56 +02001519 if (status != 0x0c || conn->attempt > 2) {
1520 conn->state = BT_CLOSED;
1521 hci_proto_connect_cfm(conn, status);
1522 hci_conn_del(conn);
1523 } else
1524 conn->state = BT_CONNECT2;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001525 }
1526 } else {
1527 if (!conn) {
Johan Hedberga5c4e302014-07-16 11:56:07 +03001528 conn = hci_conn_add(hdev, ACL_LINK, &cp->bdaddr,
1529 HCI_ROLE_MASTER);
1530 if (!conn)
Gustavo F. Padovan893ef972010-07-18 15:13:37 -03001531 BT_ERR("No memory for new connection");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001532 }
1533 }
1534
1535 hci_dev_unlock(hdev);
1536}
1537
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001538static void hci_cs_add_sco(struct hci_dev *hdev, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001539{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001540 struct hci_cp_add_sco *cp;
1541 struct hci_conn *acl, *sco;
1542 __u16 handle;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001543
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001544 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001545
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001546 if (!status)
1547 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001548
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001549 cp = hci_sent_cmd_data(hdev, HCI_OP_ADD_SCO);
1550 if (!cp)
1551 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001552
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001553 handle = __le16_to_cpu(cp->handle);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001554
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001555 BT_DBG("%s handle 0x%4.4x", hdev->name, handle);
Marcel Holtmann6bd57412006-11-18 22:14:22 +01001556
1557 hci_dev_lock(hdev);
1558
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001559 acl = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001560 if (acl) {
1561 sco = acl->link;
1562 if (sco) {
1563 sco->state = BT_CLOSED;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001564
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001565 hci_proto_connect_cfm(sco, status);
1566 hci_conn_del(sco);
1567 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001568 }
Marcel Holtmann6bd57412006-11-18 22:14:22 +01001569
1570 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001571}
1572
Marcel Holtmannf8558552008-07-14 20:13:49 +02001573static void hci_cs_auth_requested(struct hci_dev *hdev, __u8 status)
1574{
1575 struct hci_cp_auth_requested *cp;
1576 struct hci_conn *conn;
1577
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001578 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001579
1580 if (!status)
1581 return;
1582
1583 cp = hci_sent_cmd_data(hdev, HCI_OP_AUTH_REQUESTED);
1584 if (!cp)
1585 return;
1586
1587 hci_dev_lock(hdev);
1588
1589 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1590 if (conn) {
1591 if (conn->state == BT_CONFIG) {
1592 hci_proto_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001593 hci_conn_drop(conn);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001594 }
1595 }
1596
1597 hci_dev_unlock(hdev);
1598}
1599
1600static void hci_cs_set_conn_encrypt(struct hci_dev *hdev, __u8 status)
1601{
1602 struct hci_cp_set_conn_encrypt *cp;
1603 struct hci_conn *conn;
1604
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001605 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001606
1607 if (!status)
1608 return;
1609
1610 cp = hci_sent_cmd_data(hdev, HCI_OP_SET_CONN_ENCRYPT);
1611 if (!cp)
1612 return;
1613
1614 hci_dev_lock(hdev);
1615
1616 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1617 if (conn) {
1618 if (conn->state == BT_CONFIG) {
1619 hci_proto_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001620 hci_conn_drop(conn);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001621 }
1622 }
1623
1624 hci_dev_unlock(hdev);
1625}
1626
Johan Hedberg127178d2010-11-18 22:22:29 +02001627static int hci_outgoing_auth_needed(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -03001628 struct hci_conn *conn)
Johan Hedberg392599b2010-11-18 22:22:28 +02001629{
Johan Hedberg392599b2010-11-18 22:22:28 +02001630 if (conn->state != BT_CONFIG || !conn->out)
1631 return 0;
1632
Johan Hedberg765c2a92011-01-19 12:06:52 +05301633 if (conn->pending_sec_level == BT_SECURITY_SDP)
Johan Hedberg392599b2010-11-18 22:22:28 +02001634 return 0;
1635
1636 /* Only request authentication for SSP connections or non-SSP
Johan Hedberg264b8b42014-01-08 16:40:39 +02001637 * devices with sec_level MEDIUM or HIGH or if MITM protection
1638 * is requested.
1639 */
Gustavo Padovan807deac2012-05-17 00:36:24 -03001640 if (!hci_conn_ssp_enabled(conn) && !(conn->auth_type & 0x01) &&
Johan Hedberg7e3691e2014-05-30 14:45:19 +03001641 conn->pending_sec_level != BT_SECURITY_FIPS &&
Johan Hedberg264b8b42014-01-08 16:40:39 +02001642 conn->pending_sec_level != BT_SECURITY_HIGH &&
1643 conn->pending_sec_level != BT_SECURITY_MEDIUM)
Johan Hedberg392599b2010-11-18 22:22:28 +02001644 return 0;
1645
Johan Hedberg392599b2010-11-18 22:22:28 +02001646 return 1;
1647}
1648
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001649static int hci_resolve_name(struct hci_dev *hdev,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001650 struct inquiry_entry *e)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001651{
1652 struct hci_cp_remote_name_req cp;
1653
1654 memset(&cp, 0, sizeof(cp));
1655
1656 bacpy(&cp.bdaddr, &e->data.bdaddr);
1657 cp.pscan_rep_mode = e->data.pscan_rep_mode;
1658 cp.pscan_mode = e->data.pscan_mode;
1659 cp.clock_offset = e->data.clock_offset;
1660
1661 return hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
1662}
1663
Johan Hedbergb644ba32012-01-17 21:48:47 +02001664static bool hci_resolve_next_name(struct hci_dev *hdev)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001665{
1666 struct discovery_state *discov = &hdev->discovery;
1667 struct inquiry_entry *e;
1668
Johan Hedbergb644ba32012-01-17 21:48:47 +02001669 if (list_empty(&discov->resolve))
1670 return false;
1671
1672 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
Ram Malovanyc8100892012-07-19 10:26:09 +03001673 if (!e)
1674 return false;
1675
Johan Hedbergb644ba32012-01-17 21:48:47 +02001676 if (hci_resolve_name(hdev, e) == 0) {
1677 e->name_state = NAME_PENDING;
1678 return true;
1679 }
1680
1681 return false;
1682}
1683
1684static void hci_check_pending_name(struct hci_dev *hdev, struct hci_conn *conn,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001685 bdaddr_t *bdaddr, u8 *name, u8 name_len)
Johan Hedbergb644ba32012-01-17 21:48:47 +02001686{
1687 struct discovery_state *discov = &hdev->discovery;
1688 struct inquiry_entry *e;
1689
Johan Hedberg60cb49d2014-11-11 11:33:24 +02001690 /* Update the mgmt connected state if necessary. Be careful with
1691 * conn objects that exist but are not (yet) connected however.
1692 * Only those in BT_CONFIG or BT_CONNECTED states can be
1693 * considered connected.
1694 */
1695 if (conn &&
1696 (conn->state == BT_CONFIG || conn->state == BT_CONNECTED) &&
Jaganath Kanakkasserycb77c3e2014-11-07 16:39:09 +05301697 !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00001698 mgmt_device_connected(hdev, conn, 0, name, name_len);
Johan Hedbergb644ba32012-01-17 21:48:47 +02001699
1700 if (discov->state == DISCOVERY_STOPPED)
1701 return;
1702
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001703 if (discov->state == DISCOVERY_STOPPING)
1704 goto discov_complete;
1705
1706 if (discov->state != DISCOVERY_RESOLVING)
1707 return;
1708
1709 e = hci_inquiry_cache_lookup_resolve(hdev, bdaddr, NAME_PENDING);
Ram Malovany7cc83802012-07-19 10:26:10 +03001710 /* If the device was not found in a list of found devices names of which
1711 * are pending. there is no need to continue resolving a next name as it
1712 * will be done upon receiving another Remote Name Request Complete
1713 * Event */
1714 if (!e)
1715 return;
1716
1717 list_del(&e->list);
1718 if (name) {
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001719 e->name_state = NAME_KNOWN;
Ram Malovany7cc83802012-07-19 10:26:10 +03001720 mgmt_remote_name(hdev, bdaddr, ACL_LINK, 0x00,
1721 e->data.rssi, name, name_len);
Ram Malovanyc3e7c0d2012-07-19 10:26:11 +03001722 } else {
1723 e->name_state = NAME_NOT_KNOWN;
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001724 }
1725
Johan Hedbergb644ba32012-01-17 21:48:47 +02001726 if (hci_resolve_next_name(hdev))
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001727 return;
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001728
1729discov_complete:
1730 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
1731}
1732
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001733static void hci_cs_remote_name_req(struct hci_dev *hdev, __u8 status)
1734{
Johan Hedberg127178d2010-11-18 22:22:29 +02001735 struct hci_cp_remote_name_req *cp;
1736 struct hci_conn *conn;
1737
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001738 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Johan Hedberg127178d2010-11-18 22:22:29 +02001739
1740 /* If successful wait for the name req complete event before
1741 * checking for the need to do authentication */
1742 if (!status)
1743 return;
1744
1745 cp = hci_sent_cmd_data(hdev, HCI_OP_REMOTE_NAME_REQ);
1746 if (!cp)
1747 return;
1748
1749 hci_dev_lock(hdev);
1750
1751 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02001752
1753 if (test_bit(HCI_MGMT, &hdev->dev_flags))
1754 hci_check_pending_name(hdev, conn, &cp->bdaddr, NULL, 0);
1755
Johan Hedberg79c6c702011-04-28 11:28:55 -07001756 if (!conn)
1757 goto unlock;
1758
1759 if (!hci_outgoing_auth_needed(hdev, conn))
1760 goto unlock;
1761
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001762 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02001763 struct hci_cp_auth_requested auth_cp;
1764
Johan Hedberg977f8fc2014-07-17 15:35:39 +03001765 set_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags);
1766
Johannes Bergc1f23a22013-10-07 18:19:16 +02001767 auth_cp.handle = __cpu_to_le16(conn->handle);
1768 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED,
1769 sizeof(auth_cp), &auth_cp);
Johan Hedberg127178d2010-11-18 22:22:29 +02001770 }
1771
Johan Hedberg79c6c702011-04-28 11:28:55 -07001772unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02001773 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001774}
1775
Marcel Holtmann769be972008-07-14 20:13:49 +02001776static void hci_cs_read_remote_features(struct hci_dev *hdev, __u8 status)
1777{
1778 struct hci_cp_read_remote_features *cp;
1779 struct hci_conn *conn;
1780
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001781 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann769be972008-07-14 20:13:49 +02001782
1783 if (!status)
1784 return;
1785
1786 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_REMOTE_FEATURES);
1787 if (!cp)
1788 return;
1789
1790 hci_dev_lock(hdev);
1791
1792 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1793 if (conn) {
1794 if (conn->state == BT_CONFIG) {
Marcel Holtmann769be972008-07-14 20:13:49 +02001795 hci_proto_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001796 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02001797 }
1798 }
1799
1800 hci_dev_unlock(hdev);
1801}
1802
1803static void hci_cs_read_remote_ext_features(struct hci_dev *hdev, __u8 status)
1804{
1805 struct hci_cp_read_remote_ext_features *cp;
1806 struct hci_conn *conn;
1807
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001808 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann769be972008-07-14 20:13:49 +02001809
1810 if (!status)
1811 return;
1812
1813 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES);
1814 if (!cp)
1815 return;
1816
1817 hci_dev_lock(hdev);
1818
1819 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1820 if (conn) {
1821 if (conn->state == BT_CONFIG) {
Marcel Holtmann769be972008-07-14 20:13:49 +02001822 hci_proto_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001823 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02001824 }
1825 }
1826
1827 hci_dev_unlock(hdev);
1828}
1829
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001830static void hci_cs_setup_sync_conn(struct hci_dev *hdev, __u8 status)
1831{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001832 struct hci_cp_setup_sync_conn *cp;
1833 struct hci_conn *acl, *sco;
1834 __u16 handle;
1835
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001836 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001837
1838 if (!status)
1839 return;
1840
1841 cp = hci_sent_cmd_data(hdev, HCI_OP_SETUP_SYNC_CONN);
1842 if (!cp)
1843 return;
1844
1845 handle = __le16_to_cpu(cp->handle);
1846
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001847 BT_DBG("%s handle 0x%4.4x", hdev->name, handle);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001848
1849 hci_dev_lock(hdev);
1850
1851 acl = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001852 if (acl) {
1853 sco = acl->link;
1854 if (sco) {
1855 sco->state = BT_CLOSED;
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001856
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001857 hci_proto_connect_cfm(sco, status);
1858 hci_conn_del(sco);
1859 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001860 }
1861
1862 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001863}
1864
1865static void hci_cs_sniff_mode(struct hci_dev *hdev, __u8 status)
1866{
1867 struct hci_cp_sniff_mode *cp;
1868 struct hci_conn *conn;
1869
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001870 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001871
1872 if (!status)
1873 return;
1874
1875 cp = hci_sent_cmd_data(hdev, HCI_OP_SNIFF_MODE);
1876 if (!cp)
1877 return;
1878
1879 hci_dev_lock(hdev);
1880
1881 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001882 if (conn) {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001883 clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001884
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001885 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001886 hci_sco_setup(conn, status);
1887 }
1888
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001889 hci_dev_unlock(hdev);
1890}
1891
1892static void hci_cs_exit_sniff_mode(struct hci_dev *hdev, __u8 status)
1893{
1894 struct hci_cp_exit_sniff_mode *cp;
1895 struct hci_conn *conn;
1896
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001897 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001898
1899 if (!status)
1900 return;
1901
1902 cp = hci_sent_cmd_data(hdev, HCI_OP_EXIT_SNIFF_MODE);
1903 if (!cp)
1904 return;
1905
1906 hci_dev_lock(hdev);
1907
1908 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001909 if (conn) {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001910 clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001911
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001912 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001913 hci_sco_setup(conn, status);
1914 }
1915
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001916 hci_dev_unlock(hdev);
1917}
1918
Johan Hedberg88c3df12012-02-09 14:27:38 +02001919static void hci_cs_disconnect(struct hci_dev *hdev, u8 status)
1920{
1921 struct hci_cp_disconnect *cp;
1922 struct hci_conn *conn;
1923
1924 if (!status)
1925 return;
1926
1927 cp = hci_sent_cmd_data(hdev, HCI_OP_DISCONNECT);
1928 if (!cp)
1929 return;
1930
1931 hci_dev_lock(hdev);
1932
1933 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1934 if (conn)
1935 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001936 conn->dst_type, status);
Johan Hedberg88c3df12012-02-09 14:27:38 +02001937
1938 hci_dev_unlock(hdev);
1939}
1940
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03001941static void hci_cs_create_phylink(struct hci_dev *hdev, u8 status)
1942{
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001943 struct hci_cp_create_phy_link *cp;
1944
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03001945 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001946
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001947 cp = hci_sent_cmd_data(hdev, HCI_OP_CREATE_PHY_LINK);
1948 if (!cp)
1949 return;
1950
Andrei Emeltchenkoe58917b2012-10-31 15:46:33 +02001951 hci_dev_lock(hdev);
1952
1953 if (status) {
1954 struct hci_conn *hcon;
1955
1956 hcon = hci_conn_hash_lookup_handle(hdev, cp->phy_handle);
1957 if (hcon)
1958 hci_conn_del(hcon);
1959 } else {
1960 amp_write_remote_assoc(hdev, cp->phy_handle);
1961 }
1962
1963 hci_dev_unlock(hdev);
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03001964}
1965
Andrei Emeltchenko0b26ab92012-09-27 17:26:24 +03001966static void hci_cs_accept_phylink(struct hci_dev *hdev, u8 status)
1967{
1968 struct hci_cp_accept_phy_link *cp;
1969
1970 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1971
1972 if (status)
1973 return;
1974
1975 cp = hci_sent_cmd_data(hdev, HCI_OP_ACCEPT_PHY_LINK);
1976 if (!cp)
1977 return;
1978
1979 amp_write_remote_assoc(hdev, cp->phy_handle);
1980}
1981
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02001982static void hci_cs_le_create_conn(struct hci_dev *hdev, u8 status)
1983{
1984 struct hci_cp_le_create_conn *cp;
1985 struct hci_conn *conn;
1986
1987 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1988
1989 /* All connection failure handling is taken care of by the
1990 * hci_le_conn_failed function which is triggered by the HCI
1991 * request completion callbacks used for connecting.
1992 */
1993 if (status)
1994 return;
1995
1996 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_CREATE_CONN);
1997 if (!cp)
1998 return;
1999
2000 hci_dev_lock(hdev);
2001
2002 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->peer_addr);
2003 if (!conn)
2004 goto unlock;
2005
2006 /* Store the initiator and responder address information which
2007 * is needed for SMP. These values will not change during the
2008 * lifetime of the connection.
2009 */
2010 conn->init_addr_type = cp->own_address_type;
2011 if (cp->own_address_type == ADDR_LE_DEV_RANDOM)
2012 bacpy(&conn->init_addr, &hdev->random_addr);
2013 else
2014 bacpy(&conn->init_addr, &hdev->bdaddr);
2015
2016 conn->resp_addr_type = cp->peer_addr_type;
2017 bacpy(&conn->resp_addr, &cp->peer_addr);
2018
Johan Hedberg9489eca2014-02-28 17:45:46 +02002019 /* We don't want the connection attempt to stick around
2020 * indefinitely since LE doesn't have a page timeout concept
2021 * like BR/EDR. Set a timer for any connection that doesn't use
2022 * the white list for connecting.
2023 */
2024 if (cp->filter_policy == HCI_LE_USE_PEER_ADDR)
2025 queue_delayed_work(conn->hdev->workqueue,
2026 &conn->le_conn_timeout,
Johan Hedberg09ae2602014-07-06 13:41:15 +03002027 conn->conn_timeout);
Johan Hedberg9489eca2014-02-28 17:45:46 +02002028
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02002029unlock:
2030 hci_dev_unlock(hdev);
2031}
2032
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02002033static void hci_cs_le_start_enc(struct hci_dev *hdev, u8 status)
2034{
2035 struct hci_cp_le_start_enc *cp;
2036 struct hci_conn *conn;
2037
2038 BT_DBG("%s status 0x%2.2x", hdev->name, status);
2039
2040 if (!status)
2041 return;
2042
2043 hci_dev_lock(hdev);
2044
2045 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_START_ENC);
2046 if (!cp)
2047 goto unlock;
2048
2049 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
2050 if (!conn)
2051 goto unlock;
2052
2053 if (conn->state != BT_CONNECTED)
2054 goto unlock;
2055
2056 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
2057 hci_conn_drop(conn);
2058
2059unlock:
2060 hci_dev_unlock(hdev);
2061}
2062
Kuba Pawlak50fc85f2014-11-06 19:36:52 +01002063static void hci_cs_switch_role(struct hci_dev *hdev, u8 status)
2064{
2065 struct hci_cp_switch_role *cp;
2066 struct hci_conn *conn;
2067
2068 BT_DBG("%s status 0x%2.2x", hdev->name, status);
2069
2070 if (!status)
2071 return;
2072
2073 cp = hci_sent_cmd_data(hdev, HCI_OP_SWITCH_ROLE);
2074 if (!cp)
2075 return;
2076
2077 hci_dev_lock(hdev);
2078
2079 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
2080 if (conn)
2081 clear_bit(HCI_CONN_RSWITCH_PEND, &conn->flags);
2082
2083 hci_dev_unlock(hdev);
2084}
2085
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002086static void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002087{
2088 __u8 status = *((__u8 *) skb->data);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002089 struct discovery_state *discov = &hdev->discovery;
2090 struct inquiry_entry *e;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002091
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002092 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002093
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002094 hci_conn_check_pending(hdev);
Andre Guedes89352e72011-11-04 14:16:53 -03002095
2096 if (!test_and_clear_bit(HCI_INQUIRY, &hdev->flags))
2097 return;
2098
Peter Zijlstra4e857c52014-03-17 18:06:10 +01002099 smp_mb__after_atomic(); /* wake_up_bit advises about this barrier */
Andre Guedes3e13fa12013-03-27 20:04:56 -03002100 wake_up_bit(&hdev->flags, HCI_INQUIRY);
2101
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02002102 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002103 return;
2104
Johan Hedberg56e5cb82011-11-08 20:40:16 +02002105 hci_dev_lock(hdev);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002106
Andre Guedes343f9352012-02-17 20:39:37 -03002107 if (discov->state != DISCOVERY_FINDING)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02002108 goto unlock;
2109
2110 if (list_empty(&discov->resolve)) {
2111 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
2112 goto unlock;
2113 }
2114
2115 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
2116 if (e && hci_resolve_name(hdev, e) == 0) {
2117 e->name_state = NAME_PENDING;
2118 hci_discovery_set_state(hdev, DISCOVERY_RESOLVING);
2119 } else {
2120 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
2121 }
2122
2123unlock:
Johan Hedberg56e5cb82011-11-08 20:40:16 +02002124 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002125}
2126
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002127static void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002128{
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002129 struct inquiry_data data;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002130 struct inquiry_info *info = (void *) (skb->data + 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002131 int num_rsp = *((__u8 *) skb->data);
2132
2133 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
2134
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002135 if (!num_rsp)
2136 return;
2137
Andre Guedes1519cc12012-03-21 00:03:38 -03002138 if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags))
2139 return;
2140
Linus Torvalds1da177e2005-04-16 15:20:36 -07002141 hci_dev_lock(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002142
Johan Hedberge17acd42011-03-30 23:57:16 +03002143 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02002144 u32 flags;
Johan Hedberg31754052012-01-04 13:39:52 +02002145
Linus Torvalds1da177e2005-04-16 15:20:36 -07002146 bacpy(&data.bdaddr, &info->bdaddr);
2147 data.pscan_rep_mode = info->pscan_rep_mode;
2148 data.pscan_period_mode = info->pscan_period_mode;
2149 data.pscan_mode = info->pscan_mode;
2150 memcpy(data.dev_class, info->dev_class, 3);
2151 data.clock_offset = info->clock_offset;
Marcel Holtmannefb25132014-12-05 13:03:34 +01002152 data.rssi = HCI_RSSI_INVALID;
Marcel Holtmann41a96212008-07-14 20:13:48 +02002153 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02002154
Marcel Holtmannaf589252014-07-01 14:11:20 +02002155 flags = hci_inquiry_cache_update(hdev, &data, false);
2156
Johan Hedberg48264f02011-11-09 13:58:58 +02002157 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Marcel Holtmannefb25132014-12-05 13:03:34 +01002158 info->dev_class, HCI_RSSI_INVALID,
2159 flags, NULL, 0, NULL, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002160 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002161
Linus Torvalds1da177e2005-04-16 15:20:36 -07002162 hci_dev_unlock(hdev);
2163}
2164
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002165static void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002166{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002167 struct hci_ev_conn_complete *ev = (void *) skb->data;
2168 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002169
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002170 BT_DBG("%s", hdev->name);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002171
Linus Torvalds1da177e2005-04-16 15:20:36 -07002172 hci_dev_lock(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002173
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002174 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann94992372009-04-19 19:30:03 +02002175 if (!conn) {
2176 if (ev->link_type != SCO_LINK)
2177 goto unlock;
2178
2179 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
2180 if (!conn)
2181 goto unlock;
2182
2183 conn->type = SCO_LINK;
2184 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002185
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002186 if (!ev->status) {
2187 conn->handle = __le16_to_cpu(ev->handle);
Marcel Holtmann769be972008-07-14 20:13:49 +02002188
2189 if (conn->type == ACL_LINK) {
2190 conn->state = BT_CONFIG;
2191 hci_conn_hold(conn);
Szymon Janca9ea3ed2012-07-19 14:46:08 +02002192
2193 if (!conn->out && !hci_conn_ssp_enabled(conn) &&
2194 !hci_find_link_key(hdev, &ev->bdaddr))
2195 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
2196 else
2197 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
Marcel Holtmann769be972008-07-14 20:13:49 +02002198 } else
2199 conn->state = BT_CONNECTED;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002200
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01002201 hci_debugfs_create_conn(conn);
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02002202 hci_conn_add_sysfs(conn);
2203
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002204 if (test_bit(HCI_AUTH, &hdev->flags))
Johan Hedberg4dae2792014-06-24 17:03:50 +03002205 set_bit(HCI_CONN_AUTH, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002206
2207 if (test_bit(HCI_ENCRYPT, &hdev->flags))
Johan Hedberg4dae2792014-06-24 17:03:50 +03002208 set_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002209
2210 /* Get remote features */
2211 if (conn->type == ACL_LINK) {
2212 struct hci_cp_read_remote_features cp;
2213 cp.handle = ev->handle;
Marcel Holtmann769be972008-07-14 20:13:49 +02002214 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_FEATURES,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002215 sizeof(cp), &cp);
Johan Hedberg22f433d2014-08-01 11:13:32 +03002216
Johan Hedberg1d2dc5b2014-12-19 13:40:19 +02002217 hci_update_page_scan(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002218 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002219
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002220 /* Set packet type for incoming connection */
Andrei Emeltchenkod095c1e2011-12-01 14:33:27 +02002221 if (!conn->out && hdev->hci_ver < BLUETOOTH_VER_2_0) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002222 struct hci_cp_change_conn_ptype cp;
2223 cp.handle = ev->handle;
Marcel Holtmanna8746412008-07-14 20:13:46 +02002224 cp.pkt_type = cpu_to_le16(conn->pkt_type);
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002225 hci_send_cmd(hdev, HCI_OP_CHANGE_CONN_PTYPE, sizeof(cp),
2226 &cp);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002227 }
Johan Hedberg17d5c042011-01-22 06:09:08 +02002228 } else {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002229 conn->state = BT_CLOSED;
Johan Hedberg17d5c042011-01-22 06:09:08 +02002230 if (conn->type == ACL_LINK)
Marcel Holtmann64c7b772014-02-18 14:22:20 -08002231 mgmt_connect_failed(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002232 conn->dst_type, ev->status);
Johan Hedberg17d5c042011-01-22 06:09:08 +02002233 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002234
Marcel Holtmanne73439d2010-07-26 10:06:00 -04002235 if (conn->type == ACL_LINK)
2236 hci_sco_setup(conn, ev->status);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002237
Marcel Holtmann769be972008-07-14 20:13:49 +02002238 if (ev->status) {
2239 hci_proto_connect_cfm(conn, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002240 hci_conn_del(conn);
Marcel Holtmannc89b6e62009-01-15 21:57:03 +01002241 } else if (ev->link_type != ACL_LINK)
2242 hci_proto_connect_cfm(conn, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002243
2244unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002245 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002246
2247 hci_conn_check_pending(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002248}
2249
Johan Hedberg70c46422014-07-09 12:59:17 +03002250static void hci_reject_conn(struct hci_dev *hdev, bdaddr_t *bdaddr)
2251{
2252 struct hci_cp_reject_conn_req cp;
2253
2254 bacpy(&cp.bdaddr, bdaddr);
2255 cp.reason = HCI_ERROR_REJ_BAD_ADDR;
2256 hci_send_cmd(hdev, HCI_OP_REJECT_CONN_REQ, sizeof(cp), &cp);
2257}
2258
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002259static void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002260{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002261 struct hci_ev_conn_request *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002262 int mask = hdev->link_mode;
Johan Hedberg70c46422014-07-09 12:59:17 +03002263 struct inquiry_entry *ie;
2264 struct hci_conn *conn;
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002265 __u8 flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002266
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03002267 BT_DBG("%s bdaddr %pMR type 0x%x", hdev->name, &ev->bdaddr,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002268 ev->link_type);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002269
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01002270 mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, ev->link_type,
2271 &flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002272
Johan Hedberg70c46422014-07-09 12:59:17 +03002273 if (!(mask & HCI_LM_ACCEPT)) {
2274 hci_reject_conn(hdev, &ev->bdaddr);
2275 return;
2276 }
2277
Johan Hedberg46c4c942014-07-16 16:19:21 +03002278 if (hci_bdaddr_list_lookup(&hdev->blacklist, &ev->bdaddr,
2279 BDADDR_BREDR)) {
2280 hci_reject_conn(hdev, &ev->bdaddr);
2281 return;
2282 }
2283
Johan Hedberg6a8fc952014-12-24 20:43:11 +02002284 /* Require HCI_CONNECTABLE or a whitelist entry to accept the
2285 * connection. These features are only touched through mgmt so
2286 * only do the checks if HCI_MGMT is set.
2287 */
2288 if (test_bit(HCI_MGMT, &hdev->dev_flags) &&
2289 !test_bit(HCI_CONNECTABLE, &hdev->dev_flags) &&
Johan Hedberg46c4c942014-07-16 16:19:21 +03002290 !hci_bdaddr_list_lookup(&hdev->whitelist, &ev->bdaddr,
2291 BDADDR_BREDR)) {
2292 hci_reject_conn(hdev, &ev->bdaddr);
2293 return;
Johan Hedberg70c46422014-07-09 12:59:17 +03002294 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002295
Johan Hedberg70c46422014-07-09 12:59:17 +03002296 /* Connection accepted */
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002297
Johan Hedberg70c46422014-07-09 12:59:17 +03002298 hci_dev_lock(hdev);
Marcel Holtmannc7bdd502008-07-14 20:13:47 +02002299
Johan Hedberg70c46422014-07-09 12:59:17 +03002300 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
2301 if (ie)
2302 memcpy(ie->data.dev_class, ev->dev_class, 3);
2303
2304 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type,
2305 &ev->bdaddr);
2306 if (!conn) {
Johan Hedberga5c4e302014-07-16 11:56:07 +03002307 conn = hci_conn_add(hdev, ev->link_type, &ev->bdaddr,
2308 HCI_ROLE_SLAVE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002309 if (!conn) {
Johan Hedberg70c46422014-07-09 12:59:17 +03002310 BT_ERR("No memory for new connection");
2311 hci_dev_unlock(hdev);
2312 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002313 }
Johan Hedberg70c46422014-07-09 12:59:17 +03002314 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002315
Johan Hedberg70c46422014-07-09 12:59:17 +03002316 memcpy(conn->dev_class, ev->dev_class, 3);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002317
Johan Hedberg70c46422014-07-09 12:59:17 +03002318 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002319
Johan Hedberg70c46422014-07-09 12:59:17 +03002320 if (ev->link_type == ACL_LINK ||
2321 (!(flags & HCI_PROTO_DEFER) && !lmp_esco_capable(hdev))) {
2322 struct hci_cp_accept_conn_req cp;
2323 conn->state = BT_CONNECT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002324
2325 bacpy(&cp.bdaddr, &ev->bdaddr);
Johan Hedberg70c46422014-07-09 12:59:17 +03002326
2327 if (lmp_rswitch_capable(hdev) && (mask & HCI_LM_MASTER))
2328 cp.role = 0x00; /* Become master */
2329 else
2330 cp.role = 0x01; /* Remain slave */
2331
2332 hci_send_cmd(hdev, HCI_OP_ACCEPT_CONN_REQ, sizeof(cp), &cp);
2333 } else if (!(flags & HCI_PROTO_DEFER)) {
2334 struct hci_cp_accept_sync_conn_req cp;
2335 conn->state = BT_CONNECT;
2336
2337 bacpy(&cp.bdaddr, &ev->bdaddr);
2338 cp.pkt_type = cpu_to_le16(conn->pkt_type);
2339
2340 cp.tx_bandwidth = cpu_to_le32(0x00001f40);
2341 cp.rx_bandwidth = cpu_to_le32(0x00001f40);
2342 cp.max_latency = cpu_to_le16(0xffff);
2343 cp.content_format = cpu_to_le16(hdev->voice_setting);
2344 cp.retrans_effort = 0xff;
2345
2346 hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ, sizeof(cp),
2347 &cp);
2348 } else {
2349 conn->state = BT_CONNECT2;
2350 hci_proto_connect_cfm(conn, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002351 }
2352}
2353
Mikel Astizf0d6a0e2012-08-09 09:52:30 +02002354static u8 hci_to_mgmt_reason(u8 err)
2355{
2356 switch (err) {
2357 case HCI_ERROR_CONNECTION_TIMEOUT:
2358 return MGMT_DEV_DISCONN_TIMEOUT;
2359 case HCI_ERROR_REMOTE_USER_TERM:
2360 case HCI_ERROR_REMOTE_LOW_RESOURCES:
2361 case HCI_ERROR_REMOTE_POWER_OFF:
2362 return MGMT_DEV_DISCONN_REMOTE;
2363 case HCI_ERROR_LOCAL_HOST_TERM:
2364 return MGMT_DEV_DISCONN_LOCAL_HOST;
2365 default:
2366 return MGMT_DEV_DISCONN_UNKNOWN;
2367 }
2368}
2369
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002370static void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002371{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002372 struct hci_ev_disconn_complete *ev = (void *) skb->data;
Andre Guedesabf54a52013-11-07 17:36:09 -03002373 u8 reason = hci_to_mgmt_reason(ev->reason);
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002374 struct hci_conn_params *params;
Marcel Holtmann04837f62006-07-03 10:02:33 +02002375 struct hci_conn *conn;
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002376 bool mgmt_connected;
Andre Guedes38462202013-11-07 17:36:10 -03002377 u8 type;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002378
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002379 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002380
Linus Torvalds1da177e2005-04-16 15:20:36 -07002381 hci_dev_lock(hdev);
2382
Marcel Holtmann04837f62006-07-03 10:02:33 +02002383 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergf7520542011-01-20 12:34:39 +02002384 if (!conn)
2385 goto unlock;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02002386
Andre Guedesabf54a52013-11-07 17:36:09 -03002387 if (ev->status) {
2388 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
2389 conn->dst_type, ev->status);
2390 goto unlock;
Johan Hedberg37d9ef72011-11-10 15:54:39 +02002391 }
Johan Hedbergf7520542011-01-20 12:34:39 +02002392
Andre Guedes38462202013-11-07 17:36:10 -03002393 conn->state = BT_CLOSED;
2394
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002395 mgmt_connected = test_and_clear_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags);
2396 mgmt_device_disconnected(hdev, &conn->dst, conn->type, conn->dst_type,
2397 reason, mgmt_connected);
Andre Guedesabf54a52013-11-07 17:36:09 -03002398
Johan Hedberg22f433d2014-08-01 11:13:32 +03002399 if (conn->type == ACL_LINK) {
2400 if (test_bit(HCI_CONN_FLUSH_KEY, &conn->flags))
2401 hci_remove_link_key(hdev, &conn->dst);
2402
Johan Hedberg1d2dc5b2014-12-19 13:40:19 +02002403 hci_update_page_scan(hdev);
Johan Hedberg22f433d2014-08-01 11:13:32 +03002404 }
Johan Hedberg22102462013-10-05 12:01:06 +02002405
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002406 params = hci_conn_params_lookup(hdev, &conn->dst, conn->dst_type);
2407 if (params) {
2408 switch (params->auto_connect) {
2409 case HCI_AUTO_CONN_LINK_LOSS:
2410 if (ev->reason != HCI_ERROR_CONNECTION_TIMEOUT)
2411 break;
2412 /* Fall through */
2413
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02002414 case HCI_AUTO_CONN_DIRECT:
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002415 case HCI_AUTO_CONN_ALWAYS:
Johan Hedberg418025d2014-07-04 12:37:24 +03002416 list_del_init(&params->action);
2417 list_add(&params->action, &hdev->pend_le_conns);
2418 hci_update_background_scan(hdev);
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002419 break;
2420
2421 default:
2422 break;
2423 }
2424 }
2425
Andre Guedes38462202013-11-07 17:36:10 -03002426 type = conn->type;
Johan Hedberg22102462013-10-05 12:01:06 +02002427
Andre Guedes38462202013-11-07 17:36:10 -03002428 hci_proto_disconn_cfm(conn, ev->reason);
2429 hci_conn_del(conn);
2430
2431 /* Re-enable advertising if necessary, since it might
2432 * have been disabled by the connection. From the
2433 * HCI_LE_Set_Advertise_Enable command description in
2434 * the core specification (v4.0):
2435 * "The Controller shall continue advertising until the Host
2436 * issues an LE_Set_Advertise_Enable command with
2437 * Advertising_Enable set to 0x00 (Advertising is disabled)
2438 * or until a connection is created or until the Advertising
2439 * is timed out due to Directed Advertising."
2440 */
2441 if (type == LE_LINK)
2442 mgmt_reenable_advertising(hdev);
Johan Hedbergf7520542011-01-20 12:34:39 +02002443
2444unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002445 hci_dev_unlock(hdev);
2446}
2447
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002448static void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002449{
2450 struct hci_ev_auth_complete *ev = (void *) skb->data;
2451 struct hci_conn *conn;
2452
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002453 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002454
2455 hci_dev_lock(hdev);
2456
2457 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002458 if (!conn)
2459 goto unlock;
2460
2461 if (!ev->status) {
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002462 if (!hci_conn_ssp_enabled(conn) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03002463 test_bit(HCI_CONN_REAUTH_PEND, &conn->flags)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002464 BT_INFO("re-auth of legacy device is not possible.");
Johan Hedberg2a611692011-02-19 12:06:00 -03002465 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002466 set_bit(HCI_CONN_AUTH, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002467 conn->sec_level = conn->pending_sec_level;
Johan Hedberg2a611692011-02-19 12:06:00 -03002468 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002469 } else {
Johan Hedberge1e930f2014-09-08 17:09:49 -07002470 mgmt_auth_failed(conn, ev->status);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002471 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002472
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002473 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
2474 clear_bit(HCI_CONN_REAUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002475
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002476 if (conn->state == BT_CONFIG) {
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002477 if (!ev->status && hci_conn_ssp_enabled(conn)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002478 struct hci_cp_set_conn_encrypt cp;
2479 cp.handle = ev->handle;
2480 cp.encrypt = 0x01;
2481 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002482 &cp);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002483 } else {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002484 conn->state = BT_CONNECTED;
2485 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002486 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002487 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002488 } else {
2489 hci_auth_cfm(conn, ev->status);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002490
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002491 hci_conn_hold(conn);
2492 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02002493 hci_conn_drop(conn);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002494 }
2495
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002496 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002497 if (!ev->status) {
2498 struct hci_cp_set_conn_encrypt cp;
2499 cp.handle = ev->handle;
2500 cp.encrypt = 0x01;
2501 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002502 &cp);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002503 } else {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002504 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002505 hci_encrypt_cfm(conn, ev->status, 0x00);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002506 }
2507 }
2508
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002509unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002510 hci_dev_unlock(hdev);
2511}
2512
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002513static void hci_remote_name_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002514{
Johan Hedberg127178d2010-11-18 22:22:29 +02002515 struct hci_ev_remote_name *ev = (void *) skb->data;
2516 struct hci_conn *conn;
2517
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002518 BT_DBG("%s", hdev->name);
2519
2520 hci_conn_check_pending(hdev);
Johan Hedberg127178d2010-11-18 22:22:29 +02002521
2522 hci_dev_lock(hdev);
2523
2524 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002525
2526 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
2527 goto check_auth;
2528
2529 if (ev->status == 0)
2530 hci_check_pending_name(hdev, conn, &ev->bdaddr, ev->name,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002531 strnlen(ev->name, HCI_MAX_NAME_LENGTH));
Johan Hedbergb644ba32012-01-17 21:48:47 +02002532 else
2533 hci_check_pending_name(hdev, conn, &ev->bdaddr, NULL, 0);
2534
2535check_auth:
Johan Hedberg79c6c702011-04-28 11:28:55 -07002536 if (!conn)
2537 goto unlock;
2538
2539 if (!hci_outgoing_auth_needed(hdev, conn))
2540 goto unlock;
2541
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002542 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002543 struct hci_cp_auth_requested cp;
Johan Hedberg977f8fc2014-07-17 15:35:39 +03002544
2545 set_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags);
2546
Johan Hedberg127178d2010-11-18 22:22:29 +02002547 cp.handle = __cpu_to_le16(conn->handle);
2548 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED, sizeof(cp), &cp);
2549 }
2550
Johan Hedberg79c6c702011-04-28 11:28:55 -07002551unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02002552 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002553}
2554
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002555static void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002556{
2557 struct hci_ev_encrypt_change *ev = (void *) skb->data;
2558 struct hci_conn *conn;
2559
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002560 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002561
2562 hci_dev_lock(hdev);
2563
2564 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002565 if (!conn)
2566 goto unlock;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002567
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002568 if (!ev->status) {
2569 if (ev->encrypt) {
2570 /* Encryption implies authentication */
Johan Hedberg4dae2792014-06-24 17:03:50 +03002571 set_bit(HCI_CONN_AUTH, &conn->flags);
2572 set_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002573 conn->sec_level = conn->pending_sec_level;
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002574
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002575 /* P-256 authentication key implies FIPS */
2576 if (conn->key_type == HCI_LK_AUTH_COMBINATION_P256)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002577 set_bit(HCI_CONN_FIPS, &conn->flags);
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002578
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002579 if ((conn->type == ACL_LINK && ev->encrypt == 0x02) ||
2580 conn->type == LE_LINK)
2581 set_bit(HCI_CONN_AES_CCM, &conn->flags);
2582 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002583 clear_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002584 clear_bit(HCI_CONN_AES_CCM, &conn->flags);
2585 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002586 }
2587
Johan Hedberg7ed3fa22014-09-10 22:16:35 -07002588 /* We should disregard the current RPA and generate a new one
2589 * whenever the encryption procedure fails.
2590 */
2591 if (ev->status && conn->type == LE_LINK)
2592 set_bit(HCI_RPA_EXPIRED, &hdev->dev_flags);
2593
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002594 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
2595
2596 if (ev->status && conn->state == BT_CONNECTED) {
2597 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
2598 hci_conn_drop(conn);
2599 goto unlock;
2600 }
2601
2602 if (conn->state == BT_CONFIG) {
2603 if (!ev->status)
2604 conn->state = BT_CONNECTED;
2605
Marcel Holtmann40b552a2014-03-19 14:10:25 -07002606 /* In Secure Connections Only mode, do not allow any
2607 * connections that are not encrypted with AES-CCM
2608 * using a P-256 authenticated combination key.
2609 */
2610 if (test_bit(HCI_SC_ONLY, &hdev->dev_flags) &&
2611 (!test_bit(HCI_CONN_AES_CCM, &conn->flags) ||
2612 conn->key_type != HCI_LK_AUTH_COMBINATION_P256)) {
2613 hci_proto_connect_cfm(conn, HCI_ERROR_AUTH_FAILURE);
2614 hci_conn_drop(conn);
2615 goto unlock;
2616 }
2617
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002618 hci_proto_connect_cfm(conn, ev->status);
2619 hci_conn_drop(conn);
2620 } else
2621 hci_encrypt_cfm(conn, ev->status, ev->encrypt);
2622
Gustavo Padovana7d77232012-05-13 03:20:07 -03002623unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002624 hci_dev_unlock(hdev);
2625}
2626
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002627static void hci_change_link_key_complete_evt(struct hci_dev *hdev,
2628 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002629{
2630 struct hci_ev_change_link_key_complete *ev = (void *) skb->data;
2631 struct hci_conn *conn;
2632
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002633 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002634
2635 hci_dev_lock(hdev);
2636
2637 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
2638 if (conn) {
2639 if (!ev->status)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002640 set_bit(HCI_CONN_SECURE, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002641
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002642 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002643
2644 hci_key_change_cfm(conn, ev->status);
2645 }
2646
2647 hci_dev_unlock(hdev);
2648}
2649
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002650static void hci_remote_features_evt(struct hci_dev *hdev,
2651 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002652{
2653 struct hci_ev_remote_features *ev = (void *) skb->data;
2654 struct hci_conn *conn;
2655
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002656 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002657
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002658 hci_dev_lock(hdev);
2659
2660 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02002661 if (!conn)
2662 goto unlock;
Marcel Holtmann769be972008-07-14 20:13:49 +02002663
Johan Hedbergccd556f2010-11-10 17:11:51 +02002664 if (!ev->status)
Johan Hedbergcad718e2013-04-17 15:00:51 +03002665 memcpy(conn->features[0], ev->features, 8);
Johan Hedbergccd556f2010-11-10 17:11:51 +02002666
2667 if (conn->state != BT_CONFIG)
2668 goto unlock;
2669
2670 if (!ev->status && lmp_ssp_capable(hdev) && lmp_ssp_capable(conn)) {
2671 struct hci_cp_read_remote_ext_features cp;
2672 cp.handle = ev->handle;
2673 cp.page = 0x01;
2674 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002675 sizeof(cp), &cp);
Johan Hedberg392599b2010-11-18 22:22:28 +02002676 goto unlock;
2677 }
2678
Johan Hedberg671267b2012-05-12 16:11:50 -03002679 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002680 struct hci_cp_remote_name_req cp;
2681 memset(&cp, 0, sizeof(cp));
2682 bacpy(&cp.bdaddr, &conn->dst);
2683 cp.pscan_rep_mode = 0x02;
2684 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002685 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00002686 mgmt_device_connected(hdev, conn, 0, NULL, 0);
Johan Hedberg392599b2010-11-18 22:22:28 +02002687
Johan Hedberg127178d2010-11-18 22:22:29 +02002688 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02002689 conn->state = BT_CONNECTED;
2690 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002691 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02002692 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002693
Johan Hedbergccd556f2010-11-10 17:11:51 +02002694unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002695 hci_dev_unlock(hdev);
2696}
2697
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002698static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002699{
2700 struct hci_ev_cmd_complete *ev = (void *) skb->data;
Johan Hedberg9238f362013-03-05 20:37:48 +02002701 u8 status = skb->data[sizeof(*ev)];
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002702 __u16 opcode;
2703
2704 skb_pull(skb, sizeof(*ev));
2705
2706 opcode = __le16_to_cpu(ev->opcode);
2707
2708 switch (opcode) {
2709 case HCI_OP_INQUIRY_CANCEL:
2710 hci_cc_inquiry_cancel(hdev, skb);
2711 break;
2712
Andre Guedes4d934832012-03-21 00:03:35 -03002713 case HCI_OP_PERIODIC_INQ:
2714 hci_cc_periodic_inq(hdev, skb);
2715 break;
2716
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002717 case HCI_OP_EXIT_PERIODIC_INQ:
2718 hci_cc_exit_periodic_inq(hdev, skb);
2719 break;
2720
2721 case HCI_OP_REMOTE_NAME_REQ_CANCEL:
2722 hci_cc_remote_name_req_cancel(hdev, skb);
2723 break;
2724
2725 case HCI_OP_ROLE_DISCOVERY:
2726 hci_cc_role_discovery(hdev, skb);
2727 break;
2728
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002729 case HCI_OP_READ_LINK_POLICY:
2730 hci_cc_read_link_policy(hdev, skb);
2731 break;
2732
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002733 case HCI_OP_WRITE_LINK_POLICY:
2734 hci_cc_write_link_policy(hdev, skb);
2735 break;
2736
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002737 case HCI_OP_READ_DEF_LINK_POLICY:
2738 hci_cc_read_def_link_policy(hdev, skb);
2739 break;
2740
2741 case HCI_OP_WRITE_DEF_LINK_POLICY:
2742 hci_cc_write_def_link_policy(hdev, skb);
2743 break;
2744
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002745 case HCI_OP_RESET:
2746 hci_cc_reset(hdev, skb);
2747 break;
2748
Marcel Holtmannc2f0f972015-01-12 09:21:25 -08002749 case HCI_OP_READ_STORED_LINK_KEY:
2750 hci_cc_read_stored_link_key(hdev, skb);
2751 break;
2752
Marcel Holtmanna93661202015-01-12 09:21:28 -08002753 case HCI_OP_DELETE_STORED_LINK_KEY:
2754 hci_cc_delete_stored_link_key(hdev, skb);
2755 break;
2756
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002757 case HCI_OP_WRITE_LOCAL_NAME:
2758 hci_cc_write_local_name(hdev, skb);
2759 break;
2760
2761 case HCI_OP_READ_LOCAL_NAME:
2762 hci_cc_read_local_name(hdev, skb);
2763 break;
2764
2765 case HCI_OP_WRITE_AUTH_ENABLE:
2766 hci_cc_write_auth_enable(hdev, skb);
2767 break;
2768
2769 case HCI_OP_WRITE_ENCRYPT_MODE:
2770 hci_cc_write_encrypt_mode(hdev, skb);
2771 break;
2772
2773 case HCI_OP_WRITE_SCAN_ENABLE:
2774 hci_cc_write_scan_enable(hdev, skb);
2775 break;
2776
2777 case HCI_OP_READ_CLASS_OF_DEV:
2778 hci_cc_read_class_of_dev(hdev, skb);
2779 break;
2780
2781 case HCI_OP_WRITE_CLASS_OF_DEV:
2782 hci_cc_write_class_of_dev(hdev, skb);
2783 break;
2784
2785 case HCI_OP_READ_VOICE_SETTING:
2786 hci_cc_read_voice_setting(hdev, skb);
2787 break;
2788
2789 case HCI_OP_WRITE_VOICE_SETTING:
2790 hci_cc_write_voice_setting(hdev, skb);
2791 break;
2792
Marcel Holtmannb4cb9fb2013-10-14 13:56:16 -07002793 case HCI_OP_READ_NUM_SUPPORTED_IAC:
2794 hci_cc_read_num_supported_iac(hdev, skb);
2795 break;
2796
Marcel Holtmann333140b2008-07-14 20:13:48 +02002797 case HCI_OP_WRITE_SSP_MODE:
2798 hci_cc_write_ssp_mode(hdev, skb);
2799 break;
2800
Marcel Holtmanneac83dc2014-01-10 02:07:23 -08002801 case HCI_OP_WRITE_SC_SUPPORT:
2802 hci_cc_write_sc_support(hdev, skb);
2803 break;
2804
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002805 case HCI_OP_READ_LOCAL_VERSION:
2806 hci_cc_read_local_version(hdev, skb);
2807 break;
2808
2809 case HCI_OP_READ_LOCAL_COMMANDS:
2810 hci_cc_read_local_commands(hdev, skb);
2811 break;
2812
2813 case HCI_OP_READ_LOCAL_FEATURES:
2814 hci_cc_read_local_features(hdev, skb);
2815 break;
2816
Andre Guedes971e3a42011-06-30 19:20:52 -03002817 case HCI_OP_READ_LOCAL_EXT_FEATURES:
2818 hci_cc_read_local_ext_features(hdev, skb);
2819 break;
2820
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002821 case HCI_OP_READ_BUFFER_SIZE:
2822 hci_cc_read_buffer_size(hdev, skb);
2823 break;
2824
2825 case HCI_OP_READ_BD_ADDR:
2826 hci_cc_read_bd_addr(hdev, skb);
2827 break;
2828
Johan Hedbergf332ec62013-03-15 17:07:11 -05002829 case HCI_OP_READ_PAGE_SCAN_ACTIVITY:
2830 hci_cc_read_page_scan_activity(hdev, skb);
2831 break;
2832
Johan Hedberg4a3ee762013-03-15 17:07:12 -05002833 case HCI_OP_WRITE_PAGE_SCAN_ACTIVITY:
2834 hci_cc_write_page_scan_activity(hdev, skb);
2835 break;
2836
Johan Hedbergf332ec62013-03-15 17:07:11 -05002837 case HCI_OP_READ_PAGE_SCAN_TYPE:
2838 hci_cc_read_page_scan_type(hdev, skb);
2839 break;
2840
Johan Hedberg4a3ee762013-03-15 17:07:12 -05002841 case HCI_OP_WRITE_PAGE_SCAN_TYPE:
2842 hci_cc_write_page_scan_type(hdev, skb);
2843 break;
2844
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +02002845 case HCI_OP_READ_DATA_BLOCK_SIZE:
2846 hci_cc_read_data_block_size(hdev, skb);
2847 break;
2848
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +02002849 case HCI_OP_READ_FLOW_CONTROL_MODE:
2850 hci_cc_read_flow_control_mode(hdev, skb);
2851 break;
2852
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +03002853 case HCI_OP_READ_LOCAL_AMP_INFO:
2854 hci_cc_read_local_amp_info(hdev, skb);
2855 break;
2856
Johan Hedberg33f35722014-06-28 17:54:06 +03002857 case HCI_OP_READ_CLOCK:
2858 hci_cc_read_clock(hdev, skb);
2859 break;
2860
Andrei Emeltchenko903e4542012-09-27 17:26:09 +03002861 case HCI_OP_READ_LOCAL_AMP_ASSOC:
2862 hci_cc_read_local_amp_assoc(hdev, skb);
2863 break;
2864
Johan Hedbergd5859e22011-01-25 01:19:58 +02002865 case HCI_OP_READ_INQ_RSP_TX_POWER:
2866 hci_cc_read_inq_rsp_tx_power(hdev, skb);
2867 break;
2868
Johan Hedberg980e1a52011-01-22 06:10:07 +02002869 case HCI_OP_PIN_CODE_REPLY:
2870 hci_cc_pin_code_reply(hdev, skb);
2871 break;
2872
2873 case HCI_OP_PIN_CODE_NEG_REPLY:
2874 hci_cc_pin_code_neg_reply(hdev, skb);
2875 break;
2876
Szymon Jancc35938b2011-03-22 13:12:21 +01002877 case HCI_OP_READ_LOCAL_OOB_DATA:
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08002878 hci_cc_read_local_oob_data(hdev, skb);
2879 break;
2880
2881 case HCI_OP_READ_LOCAL_OOB_EXT_DATA:
2882 hci_cc_read_local_oob_ext_data(hdev, skb);
Szymon Jancc35938b2011-03-22 13:12:21 +01002883 break;
2884
Ville Tervo6ed58ec2011-02-10 22:38:48 -03002885 case HCI_OP_LE_READ_BUFFER_SIZE:
2886 hci_cc_le_read_buffer_size(hdev, skb);
2887 break;
2888
Johan Hedberg60e77322013-01-22 14:01:59 +02002889 case HCI_OP_LE_READ_LOCAL_FEATURES:
2890 hci_cc_le_read_local_features(hdev, skb);
2891 break;
2892
Johan Hedberg8fa19092012-10-19 20:57:49 +03002893 case HCI_OP_LE_READ_ADV_TX_POWER:
2894 hci_cc_le_read_adv_tx_power(hdev, skb);
2895 break;
2896
Johan Hedberga5c29682011-02-19 12:05:57 -03002897 case HCI_OP_USER_CONFIRM_REPLY:
2898 hci_cc_user_confirm_reply(hdev, skb);
2899 break;
2900
2901 case HCI_OP_USER_CONFIRM_NEG_REPLY:
2902 hci_cc_user_confirm_neg_reply(hdev, skb);
2903 break;
2904
Brian Gix1143d452011-11-23 08:28:34 -08002905 case HCI_OP_USER_PASSKEY_REPLY:
2906 hci_cc_user_passkey_reply(hdev, skb);
2907 break;
2908
2909 case HCI_OP_USER_PASSKEY_NEG_REPLY:
2910 hci_cc_user_passkey_neg_reply(hdev, skb);
Szymon Janc16cde992012-04-13 12:32:42 +02002911 break;
Andre Guedes07f7fa52011-12-02 21:13:31 +09002912
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08002913 case HCI_OP_LE_SET_RANDOM_ADDR:
2914 hci_cc_le_set_random_addr(hdev, skb);
2915 break;
2916
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01002917 case HCI_OP_LE_SET_ADV_ENABLE:
2918 hci_cc_le_set_adv_enable(hdev, skb);
2919 break;
2920
Marcel Holtmann533553f2014-03-21 12:18:10 -07002921 case HCI_OP_LE_SET_SCAN_PARAM:
2922 hci_cc_le_set_scan_param(hdev, skb);
2923 break;
2924
Andre Guedeseb9d91f2011-05-26 16:23:52 -03002925 case HCI_OP_LE_SET_SCAN_ENABLE:
2926 hci_cc_le_set_scan_enable(hdev, skb);
2927 break;
2928
Johan Hedbergcf1d0812013-01-22 14:02:00 +02002929 case HCI_OP_LE_READ_WHITE_LIST_SIZE:
2930 hci_cc_le_read_white_list_size(hdev, skb);
2931 break;
2932
Marcel Holtmann0f36b582014-02-27 20:37:31 -08002933 case HCI_OP_LE_CLEAR_WHITE_LIST:
2934 hci_cc_le_clear_white_list(hdev, skb);
2935 break;
2936
2937 case HCI_OP_LE_ADD_TO_WHITE_LIST:
2938 hci_cc_le_add_to_white_list(hdev, skb);
2939 break;
2940
2941 case HCI_OP_LE_DEL_FROM_WHITE_LIST:
2942 hci_cc_le_del_from_white_list(hdev, skb);
2943 break;
2944
Johan Hedberg9b008c02013-01-22 14:02:01 +02002945 case HCI_OP_LE_READ_SUPPORTED_STATES:
2946 hci_cc_le_read_supported_states(hdev, skb);
2947 break;
2948
Marcel Holtmanna8e1bfa2014-12-20 16:28:40 +01002949 case HCI_OP_LE_READ_DEF_DATA_LEN:
2950 hci_cc_le_read_def_data_len(hdev, skb);
2951 break;
2952
2953 case HCI_OP_LE_WRITE_DEF_DATA_LEN:
2954 hci_cc_le_write_def_data_len(hdev, skb);
2955 break;
2956
2957 case HCI_OP_LE_READ_MAX_DATA_LEN:
2958 hci_cc_le_read_max_data_len(hdev, skb);
2959 break;
2960
Andre Guedesf9b49302011-06-30 19:20:53 -03002961 case HCI_OP_WRITE_LE_HOST_SUPPORTED:
2962 hci_cc_write_le_host_supported(hdev, skb);
2963 break;
2964
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02002965 case HCI_OP_LE_SET_ADV_PARAM:
2966 hci_cc_set_adv_param(hdev, skb);
2967 break;
2968
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03002969 case HCI_OP_WRITE_REMOTE_AMP_ASSOC:
2970 hci_cc_write_remote_amp_assoc(hdev, skb);
2971 break;
2972
Andrzej Kaczmarek5ae76a92014-05-08 15:32:08 +02002973 case HCI_OP_READ_RSSI:
2974 hci_cc_read_rssi(hdev, skb);
2975 break;
2976
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02002977 case HCI_OP_READ_TX_POWER:
2978 hci_cc_read_tx_power(hdev, skb);
2979 break;
2980
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002981 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002982 BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002983 break;
2984 }
2985
Johan Hedbergad82cdd2013-03-09 09:53:50 +02002986 if (opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02002987 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02002988
Johan Hedbergad82cdd2013-03-09 09:53:50 +02002989 hci_req_cmd_complete(hdev, opcode, status);
Johan Hedberg9238f362013-03-05 20:37:48 +02002990
Szymon Jancdbccd792012-12-11 08:51:19 +01002991 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags)) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002992 atomic_set(&hdev->cmd_cnt, 1);
2993 if (!skb_queue_empty(&hdev->cmd_q))
Gustavo F. Padovanc347b762011-12-14 23:53:47 -02002994 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002995 }
2996}
2997
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002998static void hci_cmd_status_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002999{
3000 struct hci_ev_cmd_status *ev = (void *) skb->data;
3001 __u16 opcode;
3002
3003 skb_pull(skb, sizeof(*ev));
3004
3005 opcode = __le16_to_cpu(ev->opcode);
3006
3007 switch (opcode) {
3008 case HCI_OP_INQUIRY:
3009 hci_cs_inquiry(hdev, ev->status);
3010 break;
3011
3012 case HCI_OP_CREATE_CONN:
3013 hci_cs_create_conn(hdev, ev->status);
3014 break;
3015
Kuba Pawlak9645c762014-11-06 19:36:53 +01003016 case HCI_OP_DISCONNECT:
3017 hci_cs_disconnect(hdev, ev->status);
3018 break;
3019
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003020 case HCI_OP_ADD_SCO:
3021 hci_cs_add_sco(hdev, ev->status);
3022 break;
3023
Marcel Holtmannf8558552008-07-14 20:13:49 +02003024 case HCI_OP_AUTH_REQUESTED:
3025 hci_cs_auth_requested(hdev, ev->status);
3026 break;
3027
3028 case HCI_OP_SET_CONN_ENCRYPT:
3029 hci_cs_set_conn_encrypt(hdev, ev->status);
3030 break;
3031
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003032 case HCI_OP_REMOTE_NAME_REQ:
3033 hci_cs_remote_name_req(hdev, ev->status);
3034 break;
3035
Marcel Holtmann769be972008-07-14 20:13:49 +02003036 case HCI_OP_READ_REMOTE_FEATURES:
3037 hci_cs_read_remote_features(hdev, ev->status);
3038 break;
3039
3040 case HCI_OP_READ_REMOTE_EXT_FEATURES:
3041 hci_cs_read_remote_ext_features(hdev, ev->status);
3042 break;
3043
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003044 case HCI_OP_SETUP_SYNC_CONN:
3045 hci_cs_setup_sync_conn(hdev, ev->status);
3046 break;
3047
Kuba Pawlak9645c762014-11-06 19:36:53 +01003048 case HCI_OP_CREATE_PHY_LINK:
3049 hci_cs_create_phylink(hdev, ev->status);
3050 break;
3051
3052 case HCI_OP_ACCEPT_PHY_LINK:
3053 hci_cs_accept_phylink(hdev, ev->status);
3054 break;
3055
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003056 case HCI_OP_SNIFF_MODE:
3057 hci_cs_sniff_mode(hdev, ev->status);
3058 break;
3059
3060 case HCI_OP_EXIT_SNIFF_MODE:
3061 hci_cs_exit_sniff_mode(hdev, ev->status);
3062 break;
3063
Kuba Pawlak50fc85f2014-11-06 19:36:52 +01003064 case HCI_OP_SWITCH_ROLE:
3065 hci_cs_switch_role(hdev, ev->status);
3066 break;
3067
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02003068 case HCI_OP_LE_CREATE_CONN:
3069 hci_cs_le_create_conn(hdev, ev->status);
3070 break;
3071
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02003072 case HCI_OP_LE_START_ENC:
3073 hci_cs_le_start_enc(hdev, ev->status);
3074 break;
3075
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003076 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003077 BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003078 break;
3079 }
3080
Johan Hedbergad82cdd2013-03-09 09:53:50 +02003081 if (opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02003082 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02003083
Johan Hedberg02350a72013-04-03 21:50:29 +03003084 if (ev->status ||
3085 (hdev->sent_cmd && !bt_cb(hdev->sent_cmd)->req.event))
3086 hci_req_cmd_complete(hdev, opcode, ev->status);
Johan Hedberg9238f362013-03-05 20:37:48 +02003087
Gustavo F. Padovan10572132011-03-16 15:36:29 -03003088 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags)) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003089 atomic_set(&hdev->cmd_cnt, 1);
3090 if (!skb_queue_empty(&hdev->cmd_q))
Gustavo F. Padovanc347b762011-12-14 23:53:47 -02003091 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003092 }
3093}
3094
Marcel Holtmann24dfa342014-11-02 02:56:41 +01003095static void hci_hardware_error_evt(struct hci_dev *hdev, struct sk_buff *skb)
3096{
3097 struct hci_ev_hardware_error *ev = (void *) skb->data;
3098
3099 BT_ERR("%s hardware error 0x%2.2x", hdev->name, ev->code);
3100}
3101
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003102static void hci_role_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003103{
3104 struct hci_ev_role_change *ev = (void *) skb->data;
3105 struct hci_conn *conn;
3106
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003107 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003108
3109 hci_dev_lock(hdev);
3110
3111 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3112 if (conn) {
Johan Hedberg40bef302014-07-16 11:42:27 +03003113 if (!ev->status)
3114 conn->role = ev->role;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003115
Johan Hedberg51a8efd2012-01-16 06:10:31 +02003116 clear_bit(HCI_CONN_RSWITCH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003117
3118 hci_role_switch_cfm(conn, ev->status, ev->role);
3119 }
3120
3121 hci_dev_unlock(hdev);
3122}
3123
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003124static void hci_num_comp_pkts_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003125{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003126 struct hci_ev_num_comp_pkts *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003127 int i;
3128
Andrei Emeltchenko32ac5b92011-12-19 16:31:29 +02003129 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_PACKET_BASED) {
3130 BT_ERR("Wrong event for mode %d", hdev->flow_ctl_mode);
3131 return;
3132 }
3133
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02003134 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03003135 ev->num_hndl * sizeof(struct hci_comp_pkts_info)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003136 BT_DBG("%s bad parameters", hdev->name);
3137 return;
3138 }
3139
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02003140 BT_DBG("%s num_hndl %d", hdev->name, ev->num_hndl);
3141
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02003142 for (i = 0; i < ev->num_hndl; i++) {
3143 struct hci_comp_pkts_info *info = &ev->handles[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07003144 struct hci_conn *conn;
3145 __u16 handle, count;
3146
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02003147 handle = __le16_to_cpu(info->handle);
3148 count = __le16_to_cpu(info->count);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003149
3150 conn = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003151 if (!conn)
3152 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003153
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003154 conn->sent -= count;
3155
3156 switch (conn->type) {
3157 case ACL_LINK:
3158 hdev->acl_cnt += count;
3159 if (hdev->acl_cnt > hdev->acl_pkts)
3160 hdev->acl_cnt = hdev->acl_pkts;
3161 break;
3162
3163 case LE_LINK:
3164 if (hdev->le_pkts) {
3165 hdev->le_cnt += count;
3166 if (hdev->le_cnt > hdev->le_pkts)
3167 hdev->le_cnt = hdev->le_pkts;
3168 } else {
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02003169 hdev->acl_cnt += count;
3170 if (hdev->acl_cnt > hdev->acl_pkts)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003171 hdev->acl_cnt = hdev->acl_pkts;
3172 }
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003173 break;
3174
3175 case SCO_LINK:
3176 hdev->sco_cnt += count;
3177 if (hdev->sco_cnt > hdev->sco_pkts)
3178 hdev->sco_cnt = hdev->sco_pkts;
3179 break;
3180
3181 default:
3182 BT_ERR("Unknown type %d conn %p", conn->type, conn);
3183 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003184 }
3185 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003186
Gustavo F. Padovan3eff45e2011-12-15 00:50:02 -02003187 queue_work(hdev->workqueue, &hdev->tx_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003188}
3189
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003190static struct hci_conn *__hci_conn_lookup_handle(struct hci_dev *hdev,
3191 __u16 handle)
3192{
3193 struct hci_chan *chan;
3194
3195 switch (hdev->dev_type) {
3196 case HCI_BREDR:
3197 return hci_conn_hash_lookup_handle(hdev, handle);
3198 case HCI_AMP:
3199 chan = hci_chan_lookup_handle(hdev, handle);
3200 if (chan)
3201 return chan->conn;
3202 break;
3203 default:
3204 BT_ERR("%s unknown dev_type %d", hdev->name, hdev->dev_type);
3205 break;
3206 }
3207
3208 return NULL;
3209}
3210
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003211static void hci_num_comp_blocks_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003212{
3213 struct hci_ev_num_comp_blocks *ev = (void *) skb->data;
3214 int i;
3215
3216 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_BLOCK_BASED) {
3217 BT_ERR("Wrong event for mode %d", hdev->flow_ctl_mode);
3218 return;
3219 }
3220
3221 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03003222 ev->num_hndl * sizeof(struct hci_comp_blocks_info)) {
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003223 BT_DBG("%s bad parameters", hdev->name);
3224 return;
3225 }
3226
3227 BT_DBG("%s num_blocks %d num_hndl %d", hdev->name, ev->num_blocks,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003228 ev->num_hndl);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003229
3230 for (i = 0; i < ev->num_hndl; i++) {
3231 struct hci_comp_blocks_info *info = &ev->handles[i];
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003232 struct hci_conn *conn = NULL;
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003233 __u16 handle, block_count;
3234
3235 handle = __le16_to_cpu(info->handle);
3236 block_count = __le16_to_cpu(info->blocks);
3237
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003238 conn = __hci_conn_lookup_handle(hdev, handle);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003239 if (!conn)
3240 continue;
3241
3242 conn->sent -= block_count;
3243
3244 switch (conn->type) {
3245 case ACL_LINK:
Andrei Emeltchenkobd1eb662012-10-10 17:38:30 +03003246 case AMP_LINK:
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003247 hdev->block_cnt += block_count;
3248 if (hdev->block_cnt > hdev->num_blocks)
3249 hdev->block_cnt = hdev->num_blocks;
3250 break;
3251
3252 default:
3253 BT_ERR("Unknown type %d conn %p", conn->type, conn);
3254 break;
3255 }
3256 }
3257
3258 queue_work(hdev->workqueue, &hdev->tx_work);
3259}
3260
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003261static void hci_mode_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003262{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003263 struct hci_ev_mode_change *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003264 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003265
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003266 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003267
3268 hci_dev_lock(hdev);
3269
Marcel Holtmann04837f62006-07-03 10:02:33 +02003270 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3271 if (conn) {
3272 conn->mode = ev->mode;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003273
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003274 if (!test_and_clear_bit(HCI_CONN_MODE_CHANGE_PEND,
3275 &conn->flags)) {
Marcel Holtmann04837f62006-07-03 10:02:33 +02003276 if (conn->mode == HCI_CM_ACTIVE)
Johan Hedberg58a681e2012-01-16 06:47:28 +02003277 set_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003278 else
Johan Hedberg58a681e2012-01-16 06:47:28 +02003279 clear_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003280 }
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003281
Johan Hedberg51a8efd2012-01-16 06:10:31 +02003282 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003283 hci_sco_setup(conn, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003284 }
3285
3286 hci_dev_unlock(hdev);
3287}
3288
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003289static void hci_pin_code_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003290{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003291 struct hci_ev_pin_code_req *ev = (void *) skb->data;
3292 struct hci_conn *conn;
3293
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003294 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003295
3296 hci_dev_lock(hdev);
3297
3298 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003299 if (!conn)
3300 goto unlock;
3301
3302 if (conn->state == BT_CONNECTED) {
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003303 hci_conn_hold(conn);
3304 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003305 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003306 }
3307
Johan Hedbergb6ae8452014-07-30 09:22:22 +03003308 if (!test_bit(HCI_BONDABLE, &hdev->dev_flags) &&
Johan Hedberg2f407f02014-07-17 15:35:40 +03003309 !test_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags)) {
Johan Hedberg03b555e2011-01-04 15:40:05 +02003310 hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003311 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg2f407f02014-07-17 15:35:40 +03003312 } else if (test_bit(HCI_MGMT, &hdev->dev_flags)) {
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003313 u8 secure;
3314
3315 if (conn->pending_sec_level == BT_SECURITY_HIGH)
3316 secure = 1;
3317 else
3318 secure = 0;
3319
Johan Hedberg744cf192011-11-08 20:40:14 +02003320 mgmt_pin_code_request(hdev, &ev->bdaddr, secure);
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003321 }
Johan Hedberg980e1a52011-01-22 06:10:07 +02003322
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003323unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003324 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003325}
3326
Johan Hedbergcb6f3f72014-11-19 14:53:04 +02003327static void conn_set_key(struct hci_conn *conn, u8 key_type, u8 pin_len)
3328{
3329 if (key_type == HCI_LK_CHANGED_COMBINATION)
3330 return;
3331
3332 conn->pin_length = pin_len;
3333 conn->key_type = key_type;
3334
3335 switch (key_type) {
3336 case HCI_LK_LOCAL_UNIT:
3337 case HCI_LK_REMOTE_UNIT:
3338 case HCI_LK_DEBUG_COMBINATION:
3339 return;
3340 case HCI_LK_COMBINATION:
3341 if (pin_len == 16)
3342 conn->pending_sec_level = BT_SECURITY_HIGH;
3343 else
3344 conn->pending_sec_level = BT_SECURITY_MEDIUM;
3345 break;
3346 case HCI_LK_UNAUTH_COMBINATION_P192:
3347 case HCI_LK_UNAUTH_COMBINATION_P256:
3348 conn->pending_sec_level = BT_SECURITY_MEDIUM;
3349 break;
3350 case HCI_LK_AUTH_COMBINATION_P192:
3351 conn->pending_sec_level = BT_SECURITY_HIGH;
3352 break;
3353 case HCI_LK_AUTH_COMBINATION_P256:
3354 conn->pending_sec_level = BT_SECURITY_FIPS;
3355 break;
3356 }
3357}
3358
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003359static void hci_link_key_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003360{
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003361 struct hci_ev_link_key_req *ev = (void *) skb->data;
3362 struct hci_cp_link_key_reply cp;
3363 struct hci_conn *conn;
3364 struct link_key *key;
3365
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003366 BT_DBG("%s", hdev->name);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003367
Andrei Emeltchenko034cbea2013-05-14 11:44:16 +03003368 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003369 return;
3370
3371 hci_dev_lock(hdev);
3372
3373 key = hci_find_link_key(hdev, &ev->bdaddr);
3374 if (!key) {
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003375 BT_DBG("%s link key not found for %pMR", hdev->name,
3376 &ev->bdaddr);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003377 goto not_found;
3378 }
3379
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003380 BT_DBG("%s found key type %u for %pMR", hdev->name, key->type,
3381 &ev->bdaddr);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003382
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003383 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003384 if (conn) {
Johan Hedbergfe8bc5a2014-08-14 12:33:17 +03003385 clear_bit(HCI_CONN_NEW_LINK_KEY, &conn->flags);
3386
Marcel Holtmann66138ce2014-01-10 02:07:20 -08003387 if ((key->type == HCI_LK_UNAUTH_COMBINATION_P192 ||
3388 key->type == HCI_LK_UNAUTH_COMBINATION_P256) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03003389 conn->auth_type != 0xff && (conn->auth_type & 0x01)) {
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003390 BT_DBG("%s ignoring unauthenticated key", hdev->name);
3391 goto not_found;
3392 }
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003393
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003394 if (key->type == HCI_LK_COMBINATION && key->pin_len < 16 &&
Johan Hedbergf3fb0b52014-06-02 10:12:44 +03003395 (conn->pending_sec_level == BT_SECURITY_HIGH ||
3396 conn->pending_sec_level == BT_SECURITY_FIPS)) {
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003397 BT_DBG("%s ignoring key unauthenticated for high security",
3398 hdev->name);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003399 goto not_found;
3400 }
3401
Johan Hedbergcb6f3f72014-11-19 14:53:04 +02003402 conn_set_key(conn, key->type, key->pin_len);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003403 }
3404
3405 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9b3b4462012-05-23 11:31:20 +03003406 memcpy(cp.link_key, key->val, HCI_LINK_KEY_SIZE);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003407
3408 hci_send_cmd(hdev, HCI_OP_LINK_KEY_REPLY, sizeof(cp), &cp);
3409
3410 hci_dev_unlock(hdev);
3411
3412 return;
3413
3414not_found:
3415 hci_send_cmd(hdev, HCI_OP_LINK_KEY_NEG_REPLY, 6, &ev->bdaddr);
3416 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003417}
3418
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003419static void hci_link_key_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003420{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003421 struct hci_ev_link_key_notify *ev = (void *) skb->data;
3422 struct hci_conn *conn;
Johan Hedberg7652ff62014-06-24 13:15:49 +03003423 struct link_key *key;
3424 bool persistent;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003425 u8 pin_len = 0;
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003426
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003427 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003428
3429 hci_dev_lock(hdev);
3430
3431 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg82c13d42014-12-03 11:03:06 +02003432 if (!conn)
3433 goto unlock;
3434
3435 hci_conn_hold(conn);
3436 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
3437 hci_conn_drop(conn);
3438
Johan Hedbergfe8bc5a2014-08-14 12:33:17 +03003439 set_bit(HCI_CONN_NEW_LINK_KEY, &conn->flags);
Johan Hedberg82c13d42014-12-03 11:03:06 +02003440 conn_set_key(conn, ev->key_type, conn->pin_length);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003441
Johan Hedberg7652ff62014-06-24 13:15:49 +03003442 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
3443 goto unlock;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003444
Johan Hedberg7652ff62014-06-24 13:15:49 +03003445 key = hci_add_link_key(hdev, conn, &ev->bdaddr, ev->link_key,
3446 ev->key_type, pin_len, &persistent);
3447 if (!key)
3448 goto unlock;
3449
Johan Hedbergcb6f3f72014-11-19 14:53:04 +02003450 /* Update connection information since adding the key will have
3451 * fixed up the type in the case of changed combination keys.
3452 */
3453 if (ev->key_type == HCI_LK_CHANGED_COMBINATION)
3454 conn_set_key(conn, key->type, key->pin_len);
3455
Johan Hedberg7652ff62014-06-24 13:15:49 +03003456 mgmt_new_link_key(hdev, key, persistent);
3457
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003458 /* Keep debug keys around only if the HCI_KEEP_DEBUG_KEYS flag
3459 * is set. If it's not set simply remove the key from the kernel
3460 * list (we've still notified user space about it but with
3461 * store_hint being 0).
3462 */
3463 if (key->type == HCI_LK_DEBUG_COMBINATION &&
3464 !test_bit(HCI_KEEP_DEBUG_KEYS, &hdev->dev_flags)) {
Johan Hedberg0378b592014-11-19 15:22:22 +02003465 list_del_rcu(&key->list);
3466 kfree_rcu(key, rcu);
Johan Hedberg82c13d42014-12-03 11:03:06 +02003467 goto unlock;
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003468 }
Johan Hedberg7652ff62014-06-24 13:15:49 +03003469
Johan Hedberg82c13d42014-12-03 11:03:06 +02003470 if (persistent)
3471 clear_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
3472 else
3473 set_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
3474
Johan Hedberg7652ff62014-06-24 13:15:49 +03003475unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003476 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003477}
3478
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003479static void hci_clock_offset_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04837f62006-07-03 10:02:33 +02003480{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003481 struct hci_ev_clock_offset *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003482 struct hci_conn *conn;
3483
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003484 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003485
3486 hci_dev_lock(hdev);
3487
3488 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003489 if (conn && !ev->status) {
3490 struct inquiry_entry *ie;
3491
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003492 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3493 if (ie) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003494 ie->data.clock_offset = ev->clock_offset;
3495 ie->timestamp = jiffies;
3496 }
3497 }
3498
3499 hci_dev_unlock(hdev);
3500}
3501
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003502static void hci_pkt_type_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna8746412008-07-14 20:13:46 +02003503{
3504 struct hci_ev_pkt_type_change *ev = (void *) skb->data;
3505 struct hci_conn *conn;
3506
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003507 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna8746412008-07-14 20:13:46 +02003508
3509 hci_dev_lock(hdev);
3510
3511 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3512 if (conn && !ev->status)
3513 conn->pkt_type = __le16_to_cpu(ev->pkt_type);
3514
3515 hci_dev_unlock(hdev);
3516}
3517
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003518static void hci_pscan_rep_mode_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003519{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003520 struct hci_ev_pscan_rep_mode *ev = (void *) skb->data;
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003521 struct inquiry_entry *ie;
3522
3523 BT_DBG("%s", hdev->name);
3524
3525 hci_dev_lock(hdev);
3526
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003527 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
3528 if (ie) {
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003529 ie->data.pscan_rep_mode = ev->pscan_rep_mode;
3530 ie->timestamp = jiffies;
3531 }
3532
3533 hci_dev_unlock(hdev);
3534}
3535
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003536static void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev,
3537 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003538{
3539 struct inquiry_data data;
3540 int num_rsp = *((__u8 *) skb->data);
3541
3542 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
3543
3544 if (!num_rsp)
3545 return;
3546
Andre Guedes1519cc12012-03-21 00:03:38 -03003547 if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags))
3548 return;
3549
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003550 hci_dev_lock(hdev);
3551
3552 if ((skb->len - 1) / num_rsp != sizeof(struct inquiry_info_with_rssi)) {
Szymon Janc138d22e2011-02-17 16:44:23 +01003553 struct inquiry_info_with_rssi_and_pscan_mode *info;
3554 info = (void *) (skb->data + 1);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003555
Johan Hedberge17acd42011-03-30 23:57:16 +03003556 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003557 u32 flags;
3558
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003559 bacpy(&data.bdaddr, &info->bdaddr);
3560 data.pscan_rep_mode = info->pscan_rep_mode;
3561 data.pscan_period_mode = info->pscan_period_mode;
3562 data.pscan_mode = info->pscan_mode;
3563 memcpy(data.dev_class, info->dev_class, 3);
3564 data.clock_offset = info->clock_offset;
3565 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003566 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02003567
Marcel Holtmannaf589252014-07-01 14:11:20 +02003568 flags = hci_inquiry_cache_update(hdev, &data, false);
3569
Johan Hedberg48264f02011-11-09 13:58:58 +02003570 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003571 info->dev_class, info->rssi,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003572 flags, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003573 }
3574 } else {
3575 struct inquiry_info_with_rssi *info = (void *) (skb->data + 1);
3576
Johan Hedberge17acd42011-03-30 23:57:16 +03003577 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003578 u32 flags;
3579
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003580 bacpy(&data.bdaddr, &info->bdaddr);
3581 data.pscan_rep_mode = info->pscan_rep_mode;
3582 data.pscan_period_mode = info->pscan_period_mode;
3583 data.pscan_mode = 0x00;
3584 memcpy(data.dev_class, info->dev_class, 3);
3585 data.clock_offset = info->clock_offset;
3586 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003587 data.ssp_mode = 0x00;
Marcel Holtmannaf589252014-07-01 14:11:20 +02003588
3589 flags = hci_inquiry_cache_update(hdev, &data, false);
3590
Johan Hedberg48264f02011-11-09 13:58:58 +02003591 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003592 info->dev_class, info->rssi,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003593 flags, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003594 }
3595 }
3596
3597 hci_dev_unlock(hdev);
3598}
3599
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003600static void hci_remote_ext_features_evt(struct hci_dev *hdev,
3601 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003602{
Marcel Holtmann41a96212008-07-14 20:13:48 +02003603 struct hci_ev_remote_ext_features *ev = (void *) skb->data;
3604 struct hci_conn *conn;
3605
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003606 BT_DBG("%s", hdev->name);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003607
Marcel Holtmann41a96212008-07-14 20:13:48 +02003608 hci_dev_lock(hdev);
3609
3610 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02003611 if (!conn)
3612 goto unlock;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003613
Johan Hedbergcad718e2013-04-17 15:00:51 +03003614 if (ev->page < HCI_MAX_PAGES)
3615 memcpy(conn->features[ev->page], ev->features, 8);
3616
Johan Hedbergccd556f2010-11-10 17:11:51 +02003617 if (!ev->status && ev->page == 0x01) {
3618 struct inquiry_entry *ie;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003619
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003620 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3621 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02003622 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann769be972008-07-14 20:13:49 +02003623
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303624 if (ev->features[0] & LMP_HOST_SSP) {
Johan Hedberg58a681e2012-01-16 06:47:28 +02003625 set_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303626 } else {
3627 /* It is mandatory by the Bluetooth specification that
3628 * Extended Inquiry Results are only used when Secure
3629 * Simple Pairing is enabled, but some devices violate
3630 * this.
3631 *
3632 * To make these devices work, the internal SSP
3633 * enabled flag needs to be cleared if the remote host
3634 * features do not indicate SSP support */
3635 clear_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
3636 }
Marcel Holtmanneb9a8f32014-01-15 22:37:38 -08003637
3638 if (ev->features[0] & LMP_HOST_SC)
3639 set_bit(HCI_CONN_SC_ENABLED, &conn->flags);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003640 }
3641
Johan Hedbergccd556f2010-11-10 17:11:51 +02003642 if (conn->state != BT_CONFIG)
3643 goto unlock;
3644
Johan Hedberg671267b2012-05-12 16:11:50 -03003645 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02003646 struct hci_cp_remote_name_req cp;
3647 memset(&cp, 0, sizeof(cp));
3648 bacpy(&cp.bdaddr, &conn->dst);
3649 cp.pscan_rep_mode = 0x02;
3650 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02003651 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00003652 mgmt_device_connected(hdev, conn, 0, NULL, 0);
Johan Hedberg392599b2010-11-18 22:22:28 +02003653
Johan Hedberg127178d2010-11-18 22:22:29 +02003654 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02003655 conn->state = BT_CONNECTED;
3656 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02003657 hci_conn_drop(conn);
Johan Hedbergccd556f2010-11-10 17:11:51 +02003658 }
3659
3660unlock:
Marcel Holtmann41a96212008-07-14 20:13:48 +02003661 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003662}
3663
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003664static void hci_sync_conn_complete_evt(struct hci_dev *hdev,
3665 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003666{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003667 struct hci_ev_sync_conn_complete *ev = (void *) skb->data;
3668 struct hci_conn *conn;
3669
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003670 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003671
3672 hci_dev_lock(hdev);
3673
3674 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann9dc0a3a2008-07-14 20:13:46 +02003675 if (!conn) {
3676 if (ev->link_type == ESCO_LINK)
3677 goto unlock;
3678
3679 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
3680 if (!conn)
3681 goto unlock;
3682
3683 conn->type = SCO_LINK;
3684 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003685
Marcel Holtmann732547f2009-04-19 19:14:14 +02003686 switch (ev->status) {
3687 case 0x00:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003688 conn->handle = __le16_to_cpu(ev->handle);
3689 conn->state = BT_CONNECTED;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02003690
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01003691 hci_debugfs_create_conn(conn);
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02003692 hci_conn_add_sysfs(conn);
Marcel Holtmann732547f2009-04-19 19:14:14 +02003693 break;
3694
Nick Pelly81218d22014-06-30 11:25:01 +05303695 case 0x10: /* Connection Accept Timeout */
Frédéric Dalleau1a4c9582013-08-19 14:24:02 +02003696 case 0x0d: /* Connection Rejected due to Limited Resources */
Stephen Coe705e5712010-02-16 11:29:44 -05003697 case 0x11: /* Unsupported Feature or Parameter Value */
Marcel Holtmann732547f2009-04-19 19:14:14 +02003698 case 0x1c: /* SCO interval rejected */
Nick Pelly1038a002010-02-03 11:42:26 -08003699 case 0x1a: /* Unsupported Remote Feature */
Marcel Holtmann732547f2009-04-19 19:14:14 +02003700 case 0x1f: /* Unspecified error */
Andrew Earl27539bc2014-03-10 10:31:04 +00003701 case 0x20: /* Unsupported LMP Parameter value */
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02003702 if (conn->out) {
Marcel Holtmann732547f2009-04-19 19:14:14 +02003703 conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) |
3704 (hdev->esco_type & EDR_ESCO_MASK);
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02003705 if (hci_setup_sync(conn, conn->link->handle))
3706 goto unlock;
Marcel Holtmann732547f2009-04-19 19:14:14 +02003707 }
3708 /* fall through */
3709
3710 default:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003711 conn->state = BT_CLOSED;
Marcel Holtmann732547f2009-04-19 19:14:14 +02003712 break;
3713 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003714
3715 hci_proto_connect_cfm(conn, ev->status);
3716 if (ev->status)
3717 hci_conn_del(conn);
3718
3719unlock:
3720 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003721}
3722
Marcel Holtmannefdcf8e2013-10-15 10:31:12 -07003723static inline size_t eir_get_length(u8 *eir, size_t eir_len)
3724{
3725 size_t parsed = 0;
3726
3727 while (parsed < eir_len) {
3728 u8 field_len = eir[0];
3729
3730 if (field_len == 0)
3731 return parsed;
3732
3733 parsed += field_len + 1;
3734 eir += field_len + 1;
3735 }
3736
3737 return eir_len;
3738}
3739
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003740static void hci_extended_inquiry_result_evt(struct hci_dev *hdev,
3741 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003742{
3743 struct inquiry_data data;
3744 struct extended_inquiry_info *info = (void *) (skb->data + 1);
3745 int num_rsp = *((__u8 *) skb->data);
Vishal Agarwal9d939d92012-04-26 19:19:56 +05303746 size_t eir_len;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003747
3748 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
3749
3750 if (!num_rsp)
3751 return;
3752
Andre Guedes1519cc12012-03-21 00:03:38 -03003753 if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags))
3754 return;
3755
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003756 hci_dev_lock(hdev);
3757
Johan Hedberge17acd42011-03-30 23:57:16 +03003758 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003759 u32 flags;
3760 bool name_known;
Johan Hedberg561aafb2012-01-04 13:31:59 +02003761
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003762 bacpy(&data.bdaddr, &info->bdaddr);
Szymon Janc138d22e2011-02-17 16:44:23 +01003763 data.pscan_rep_mode = info->pscan_rep_mode;
3764 data.pscan_period_mode = info->pscan_period_mode;
3765 data.pscan_mode = 0x00;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003766 memcpy(data.dev_class, info->dev_class, 3);
Szymon Janc138d22e2011-02-17 16:44:23 +01003767 data.clock_offset = info->clock_offset;
3768 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003769 data.ssp_mode = 0x01;
Johan Hedberg561aafb2012-01-04 13:31:59 +02003770
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003771 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg4ddb1932012-01-15 20:04:43 +02003772 name_known = eir_has_data_type(info->data,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003773 sizeof(info->data),
3774 EIR_NAME_COMPLETE);
Johan Hedberg561aafb2012-01-04 13:31:59 +02003775 else
3776 name_known = true;
3777
Marcel Holtmannaf589252014-07-01 14:11:20 +02003778 flags = hci_inquiry_cache_update(hdev, &data, name_known);
3779
Vishal Agarwal9d939d92012-04-26 19:19:56 +05303780 eir_len = eir_get_length(info->data, sizeof(info->data));
Marcel Holtmannaf589252014-07-01 14:11:20 +02003781
Johan Hedberg48264f02011-11-09 13:58:58 +02003782 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003783 info->dev_class, info->rssi,
3784 flags, info->data, eir_len, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003785 }
3786
3787 hci_dev_unlock(hdev);
3788}
3789
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003790static void hci_key_refresh_complete_evt(struct hci_dev *hdev,
3791 struct sk_buff *skb)
3792{
3793 struct hci_ev_key_refresh_complete *ev = (void *) skb->data;
3794 struct hci_conn *conn;
3795
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003796 BT_DBG("%s status 0x%2.2x handle 0x%4.4x", hdev->name, ev->status,
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003797 __le16_to_cpu(ev->handle));
3798
3799 hci_dev_lock(hdev);
3800
3801 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3802 if (!conn)
3803 goto unlock;
3804
Johan Hedberg9eb1fbf2014-04-11 12:02:31 -07003805 /* For BR/EDR the necessary steps are taken through the
3806 * auth_complete event.
3807 */
3808 if (conn->type != LE_LINK)
3809 goto unlock;
3810
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003811 if (!ev->status)
3812 conn->sec_level = conn->pending_sec_level;
3813
3814 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
3815
3816 if (ev->status && conn->state == BT_CONNECTED) {
Andre Guedesbed71742013-01-30 11:50:56 -03003817 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
David Herrmann76a68ba2013-04-06 20:28:37 +02003818 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003819 goto unlock;
3820 }
3821
3822 if (conn->state == BT_CONFIG) {
3823 if (!ev->status)
3824 conn->state = BT_CONNECTED;
3825
3826 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02003827 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003828 } else {
3829 hci_auth_cfm(conn, ev->status);
3830
3831 hci_conn_hold(conn);
3832 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003833 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003834 }
3835
3836unlock:
3837 hci_dev_unlock(hdev);
3838}
3839
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003840static u8 hci_get_auth_req(struct hci_conn *conn)
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003841{
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003842 /* If remote requests no-bonding follow that lead */
Mikel Astizacabae92013-06-28 10:56:28 +02003843 if (conn->remote_auth == HCI_AT_NO_BONDING ||
3844 conn->remote_auth == HCI_AT_NO_BONDING_MITM)
Waldemar Rymarkiewicz58797bf2011-04-28 12:07:58 +02003845 return conn->remote_auth | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003846
Mikel Astizb7f94c82014-04-08 14:21:31 +02003847 /* If both remote and local have enough IO capabilities, require
3848 * MITM protection
3849 */
3850 if (conn->remote_cap != HCI_IO_NO_INPUT_OUTPUT &&
3851 conn->io_capability != HCI_IO_NO_INPUT_OUTPUT)
3852 return conn->remote_auth | 0x01;
3853
Timo Mueller7e741702014-04-08 14:21:33 +02003854 /* No MITM protection possible so ignore remote requirement */
3855 return (conn->remote_auth & ~0x01) | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003856}
3857
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003858static void hci_io_capa_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02003859{
3860 struct hci_ev_io_capa_request *ev = (void *) skb->data;
3861 struct hci_conn *conn;
3862
3863 BT_DBG("%s", hdev->name);
3864
3865 hci_dev_lock(hdev);
3866
3867 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003868 if (!conn)
3869 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02003870
Johan Hedberg03b555e2011-01-04 15:40:05 +02003871 hci_conn_hold(conn);
3872
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003873 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg03b555e2011-01-04 15:40:05 +02003874 goto unlock;
3875
Johan Hedberg2f407f02014-07-17 15:35:40 +03003876 /* Allow pairing if we're pairable, the initiators of the
3877 * pairing or if the remote is not requesting bonding.
3878 */
Johan Hedbergb6ae8452014-07-30 09:22:22 +03003879 if (test_bit(HCI_BONDABLE, &hdev->dev_flags) ||
Johan Hedberg2f407f02014-07-17 15:35:40 +03003880 test_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags) ||
Gustavo Padovan807deac2012-05-17 00:36:24 -03003881 (conn->remote_auth & ~0x01) == HCI_AT_NO_BONDING) {
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003882 struct hci_cp_io_capability_reply cp;
3883
3884 bacpy(&cp.bdaddr, &ev->bdaddr);
Hemant Gupta7a7f1e72012-01-16 13:34:29 +05303885 /* Change the IO capability from KeyboardDisplay
3886 * to DisplayYesNo as it is not supported by BT spec. */
3887 cp.capability = (conn->io_capability == 0x04) ?
Mikel Astiza7676312013-06-28 10:56:29 +02003888 HCI_IO_DISPLAY_YESNO : conn->io_capability;
Mikel Astizb7f94c82014-04-08 14:21:31 +02003889
3890 /* If we are initiators, there is no remote information yet */
3891 if (conn->remote_auth == 0xff) {
Mikel Astizb16c6602014-04-08 14:21:34 +02003892 /* Request MITM protection if our IO caps allow it
Johan Hedberg4ad51a72014-06-09 14:41:25 +03003893 * except for the no-bonding case.
Mikel Astizb16c6602014-04-08 14:21:34 +02003894 */
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003895 if (conn->io_capability != HCI_IO_NO_INPUT_OUTPUT &&
Johan Hedberg9f743d72014-07-17 11:56:33 +03003896 conn->auth_type != HCI_AT_NO_BONDING)
Johan Hedberg6c538232014-07-11 15:32:23 +03003897 conn->auth_type |= 0x01;
Mikel Astizb7f94c82014-04-08 14:21:31 +02003898 } else {
3899 conn->auth_type = hci_get_auth_req(conn);
Mikel Astizb7f94c82014-04-08 14:21:31 +02003900 }
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003901
Johan Hedberg82c295b2014-07-30 09:22:24 +03003902 /* If we're not bondable, force one of the non-bondable
3903 * authentication requirement values.
3904 */
3905 if (!test_bit(HCI_BONDABLE, &hdev->dev_flags))
3906 conn->auth_type &= HCI_AT_NO_BONDING_MITM;
3907
3908 cp.authentication = conn->auth_type;
3909
Johan Hedberg6928a922014-10-26 20:46:09 +01003910 if (hci_find_remote_oob_data(hdev, &conn->dst, BDADDR_BREDR) &&
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003911 (conn->out || test_bit(HCI_CONN_REMOTE_OOB, &conn->flags)))
Szymon Jancce85ee12011-03-22 13:12:23 +01003912 cp.oob_data = 0x01;
3913 else
3914 cp.oob_data = 0x00;
3915
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003916 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003917 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003918 } else {
3919 struct hci_cp_io_capability_neg_reply cp;
3920
3921 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02003922 cp.reason = HCI_ERROR_PAIRING_NOT_ALLOWED;
Johan Hedberg03b555e2011-01-04 15:40:05 +02003923
3924 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003925 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003926 }
3927
3928unlock:
3929 hci_dev_unlock(hdev);
3930}
3931
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003932static void hci_io_capa_reply_evt(struct hci_dev *hdev, struct sk_buff *skb)
Johan Hedberg03b555e2011-01-04 15:40:05 +02003933{
3934 struct hci_ev_io_capa_reply *ev = (void *) skb->data;
3935 struct hci_conn *conn;
3936
3937 BT_DBG("%s", hdev->name);
3938
3939 hci_dev_lock(hdev);
3940
3941 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3942 if (!conn)
3943 goto unlock;
3944
Johan Hedberg03b555e2011-01-04 15:40:05 +02003945 conn->remote_cap = ev->capability;
Johan Hedberg03b555e2011-01-04 15:40:05 +02003946 conn->remote_auth = ev->authentication;
Johan Hedberg58a681e2012-01-16 06:47:28 +02003947 if (ev->oob_data)
3948 set_bit(HCI_CONN_REMOTE_OOB, &conn->flags);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003949
3950unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02003951 hci_dev_unlock(hdev);
3952}
3953
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003954static void hci_user_confirm_request_evt(struct hci_dev *hdev,
3955 struct sk_buff *skb)
Johan Hedberga5c29682011-02-19 12:05:57 -03003956{
3957 struct hci_ev_user_confirm_req *ev = (void *) skb->data;
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003958 int loc_mitm, rem_mitm, confirm_hint = 0;
Johan Hedberg7a828902011-04-28 11:28:53 -07003959 struct hci_conn *conn;
Johan Hedberga5c29682011-02-19 12:05:57 -03003960
3961 BT_DBG("%s", hdev->name);
3962
3963 hci_dev_lock(hdev);
3964
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003965 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg7a828902011-04-28 11:28:53 -07003966 goto unlock;
Johan Hedberga5c29682011-02-19 12:05:57 -03003967
Johan Hedberg7a828902011-04-28 11:28:53 -07003968 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3969 if (!conn)
3970 goto unlock;
3971
3972 loc_mitm = (conn->auth_type & 0x01);
3973 rem_mitm = (conn->remote_auth & 0x01);
3974
3975 /* If we require MITM but the remote device can't provide that
Johan Hedberg6c538232014-07-11 15:32:23 +03003976 * (it has NoInputNoOutput) then reject the confirmation
3977 * request. We check the security level here since it doesn't
3978 * necessarily match conn->auth_type.
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003979 */
Johan Hedberg6c538232014-07-11 15:32:23 +03003980 if (conn->pending_sec_level > BT_SECURITY_MEDIUM &&
3981 conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) {
Johan Hedberg7a828902011-04-28 11:28:53 -07003982 BT_DBG("Rejecting request: remote device can't provide MITM");
3983 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003984 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07003985 goto unlock;
3986 }
3987
3988 /* If no side requires MITM protection; auto-accept */
Mikel Astiza7676312013-06-28 10:56:29 +02003989 if ((!loc_mitm || conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) &&
3990 (!rem_mitm || conn->io_capability == HCI_IO_NO_INPUT_OUTPUT)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003991
3992 /* If we're not the initiators request authorization to
3993 * proceed from user space (mgmt_user_confirm with
Johan Hedbergba15a582014-06-09 13:58:14 +03003994 * confirm_hint set to 1). The exception is if neither
Johan Hedberg02f3e252014-07-16 15:09:13 +03003995 * side had MITM or if the local IO capability is
3996 * NoInputNoOutput, in which case we do auto-accept
Johan Hedbergba15a582014-06-09 13:58:14 +03003997 */
3998 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) &&
Johan Hedberg02f3e252014-07-16 15:09:13 +03003999 conn->io_capability != HCI_IO_NO_INPUT_OUTPUT &&
Johan Hedbergba15a582014-06-09 13:58:14 +03004000 (loc_mitm || rem_mitm)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004001 BT_DBG("Confirming auto-accept as acceptor");
4002 confirm_hint = 1;
4003 goto confirm;
4004 }
4005
Johan Hedberg9f616562011-04-28 11:28:54 -07004006 BT_DBG("Auto-accept of user confirmation with %ums delay",
Gustavo Padovan807deac2012-05-17 00:36:24 -03004007 hdev->auto_accept_delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07004008
4009 if (hdev->auto_accept_delay > 0) {
4010 int delay = msecs_to_jiffies(hdev->auto_accept_delay);
Johan Hedberg7bc18d92013-10-16 18:11:39 +03004011 queue_delayed_work(conn->hdev->workqueue,
4012 &conn->auto_accept_work, delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07004013 goto unlock;
4014 }
4015
Johan Hedberg7a828902011-04-28 11:28:53 -07004016 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03004017 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07004018 goto unlock;
4019 }
4020
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004021confirm:
Johan Hedberg39adbff2014-03-20 08:18:14 +02004022 mgmt_user_confirm_request(hdev, &ev->bdaddr, ACL_LINK, 0,
4023 le32_to_cpu(ev->passkey), confirm_hint);
Johan Hedberg7a828902011-04-28 11:28:53 -07004024
4025unlock:
Johan Hedberga5c29682011-02-19 12:05:57 -03004026 hci_dev_unlock(hdev);
4027}
4028
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004029static void hci_user_passkey_request_evt(struct hci_dev *hdev,
4030 struct sk_buff *skb)
Brian Gix1143d452011-11-23 08:28:34 -08004031{
4032 struct hci_ev_user_passkey_req *ev = (void *) skb->data;
4033
4034 BT_DBG("%s", hdev->name);
4035
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02004036 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg272d90d2012-02-09 15:26:12 +02004037 mgmt_user_passkey_request(hdev, &ev->bdaddr, ACL_LINK, 0);
Brian Gix1143d452011-11-23 08:28:34 -08004038}
4039
Johan Hedberg92a25252012-09-06 18:39:26 +03004040static void hci_user_passkey_notify_evt(struct hci_dev *hdev,
4041 struct sk_buff *skb)
4042{
4043 struct hci_ev_user_passkey_notify *ev = (void *) skb->data;
4044 struct hci_conn *conn;
4045
4046 BT_DBG("%s", hdev->name);
4047
4048 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4049 if (!conn)
4050 return;
4051
4052 conn->passkey_notify = __le32_to_cpu(ev->passkey);
4053 conn->passkey_entered = 0;
4054
4055 if (test_bit(HCI_MGMT, &hdev->dev_flags))
4056 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
4057 conn->dst_type, conn->passkey_notify,
4058 conn->passkey_entered);
4059}
4060
4061static void hci_keypress_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
4062{
4063 struct hci_ev_keypress_notify *ev = (void *) skb->data;
4064 struct hci_conn *conn;
4065
4066 BT_DBG("%s", hdev->name);
4067
4068 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4069 if (!conn)
4070 return;
4071
4072 switch (ev->type) {
4073 case HCI_KEYPRESS_STARTED:
4074 conn->passkey_entered = 0;
4075 return;
4076
4077 case HCI_KEYPRESS_ENTERED:
4078 conn->passkey_entered++;
4079 break;
4080
4081 case HCI_KEYPRESS_ERASED:
4082 conn->passkey_entered--;
4083 break;
4084
4085 case HCI_KEYPRESS_CLEARED:
4086 conn->passkey_entered = 0;
4087 break;
4088
4089 case HCI_KEYPRESS_COMPLETED:
4090 return;
4091 }
4092
4093 if (test_bit(HCI_MGMT, &hdev->dev_flags))
4094 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
4095 conn->dst_type, conn->passkey_notify,
4096 conn->passkey_entered);
4097}
4098
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004099static void hci_simple_pair_complete_evt(struct hci_dev *hdev,
4100 struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02004101{
4102 struct hci_ev_simple_pair_complete *ev = (void *) skb->data;
4103 struct hci_conn *conn;
4104
4105 BT_DBG("%s", hdev->name);
4106
4107 hci_dev_lock(hdev);
4108
4109 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg2a611692011-02-19 12:06:00 -03004110 if (!conn)
4111 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02004112
Johan Hedbergc1d4fa72014-07-17 15:14:50 +03004113 /* Reset the authentication requirement to unknown */
4114 conn->remote_auth = 0xff;
4115
Johan Hedberg2a611692011-02-19 12:06:00 -03004116 /* To avoid duplicate auth_failed events to user space we check
4117 * the HCI_CONN_AUTH_PEND flag which will be set if we
4118 * initiated the authentication. A traditional auth_complete
4119 * event gets always produced as initiator and is also mapped to
4120 * the mgmt_auth_failed event */
Mikel Astizfa1bd912012-08-09 09:52:29 +02004121 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) && ev->status)
Johan Hedberge1e930f2014-09-08 17:09:49 -07004122 mgmt_auth_failed(conn, ev->status);
Johan Hedberg2a611692011-02-19 12:06:00 -03004123
David Herrmann76a68ba2013-04-06 20:28:37 +02004124 hci_conn_drop(conn);
Johan Hedberg2a611692011-02-19 12:06:00 -03004125
4126unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02004127 hci_dev_unlock(hdev);
4128}
4129
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004130static void hci_remote_host_features_evt(struct hci_dev *hdev,
4131 struct sk_buff *skb)
Marcel Holtmann41a96212008-07-14 20:13:48 +02004132{
4133 struct hci_ev_remote_host_features *ev = (void *) skb->data;
4134 struct inquiry_entry *ie;
Johan Hedbergcad718e2013-04-17 15:00:51 +03004135 struct hci_conn *conn;
Marcel Holtmann41a96212008-07-14 20:13:48 +02004136
4137 BT_DBG("%s", hdev->name);
4138
4139 hci_dev_lock(hdev);
4140
Johan Hedbergcad718e2013-04-17 15:00:51 +03004141 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4142 if (conn)
4143 memcpy(conn->features[1], ev->features, 8);
4144
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02004145 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
4146 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02004147 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann41a96212008-07-14 20:13:48 +02004148
4149 hci_dev_unlock(hdev);
4150}
4151
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004152static void hci_remote_oob_data_request_evt(struct hci_dev *hdev,
4153 struct sk_buff *skb)
Szymon Janc2763eda2011-03-22 13:12:22 +01004154{
4155 struct hci_ev_remote_oob_data_request *ev = (void *) skb->data;
4156 struct oob_data *data;
4157
4158 BT_DBG("%s", hdev->name);
4159
4160 hci_dev_lock(hdev);
4161
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02004162 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Szymon Jance1ba1f12011-04-06 13:01:59 +02004163 goto unlock;
4164
Johan Hedberg6928a922014-10-26 20:46:09 +01004165 data = hci_find_remote_oob_data(hdev, &ev->bdaddr, BDADDR_BREDR);
Marcel Holtmann6665d052015-01-27 16:04:31 -08004166 if (!data) {
Szymon Janc2763eda2011-03-22 13:12:22 +01004167 struct hci_cp_remote_oob_data_neg_reply cp;
4168
4169 bacpy(&cp.bdaddr, &ev->bdaddr);
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08004170 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_NEG_REPLY,
4171 sizeof(cp), &cp);
Marcel Holtmann6665d052015-01-27 16:04:31 -08004172 goto unlock;
4173 }
4174
4175 if (bredr_sc_enabled(hdev)) {
4176 struct hci_cp_remote_oob_ext_data_reply cp;
4177
4178 bacpy(&cp.bdaddr, &ev->bdaddr);
4179 if (test_bit(HCI_SC_ONLY, &hdev->dev_flags)) {
4180 memset(cp.hash192, 0, sizeof(cp.hash192));
4181 memset(cp.rand192, 0, sizeof(cp.rand192));
4182 } else {
4183 memcpy(cp.hash192, data->hash192, sizeof(cp.hash192));
4184 memcpy(cp.rand192, data->rand192, sizeof(cp.rand192));
4185 }
4186 memcpy(cp.hash256, data->hash256, sizeof(cp.hash256));
4187 memcpy(cp.rand256, data->rand256, sizeof(cp.rand256));
4188
4189 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_EXT_DATA_REPLY,
4190 sizeof(cp), &cp);
4191 } else {
4192 struct hci_cp_remote_oob_data_reply cp;
4193
4194 bacpy(&cp.bdaddr, &ev->bdaddr);
4195 memcpy(cp.hash, data->hash192, sizeof(cp.hash));
4196 memcpy(cp.rand, data->rand192, sizeof(cp.rand));
4197
4198 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_REPLY,
4199 sizeof(cp), &cp);
Szymon Janc2763eda2011-03-22 13:12:22 +01004200 }
4201
Szymon Jance1ba1f12011-04-06 13:01:59 +02004202unlock:
Szymon Janc2763eda2011-03-22 13:12:22 +01004203 hci_dev_unlock(hdev);
4204}
4205
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004206static void hci_phy_link_complete_evt(struct hci_dev *hdev,
4207 struct sk_buff *skb)
4208{
4209 struct hci_ev_phy_link_complete *ev = (void *) skb->data;
4210 struct hci_conn *hcon, *bredr_hcon;
4211
4212 BT_DBG("%s handle 0x%2.2x status 0x%2.2x", hdev->name, ev->phy_handle,
4213 ev->status);
4214
4215 hci_dev_lock(hdev);
4216
4217 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4218 if (!hcon) {
4219 hci_dev_unlock(hdev);
4220 return;
4221 }
4222
4223 if (ev->status) {
4224 hci_conn_del(hcon);
4225 hci_dev_unlock(hdev);
4226 return;
4227 }
4228
4229 bredr_hcon = hcon->amp_mgr->l2cap_conn->hcon;
4230
4231 hcon->state = BT_CONNECTED;
4232 bacpy(&hcon->dst, &bredr_hcon->dst);
4233
4234 hci_conn_hold(hcon);
4235 hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02004236 hci_conn_drop(hcon);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004237
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01004238 hci_debugfs_create_conn(hcon);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004239 hci_conn_add_sysfs(hcon);
4240
Andrei Emeltchenkocf70ff22012-10-31 15:46:36 +02004241 amp_physical_cfm(bredr_hcon, hcon);
4242
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004243 hci_dev_unlock(hdev);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004244}
4245
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004246static void hci_loglink_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
4247{
4248 struct hci_ev_logical_link_complete *ev = (void *) skb->data;
4249 struct hci_conn *hcon;
4250 struct hci_chan *hchan;
4251 struct amp_mgr *mgr;
4252
4253 BT_DBG("%s log_handle 0x%4.4x phy_handle 0x%2.2x status 0x%2.2x",
4254 hdev->name, le16_to_cpu(ev->handle), ev->phy_handle,
4255 ev->status);
4256
4257 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4258 if (!hcon)
4259 return;
4260
4261 /* Create AMP hchan */
4262 hchan = hci_chan_create(hcon);
4263 if (!hchan)
4264 return;
4265
4266 hchan->handle = le16_to_cpu(ev->handle);
4267
4268 BT_DBG("hcon %p mgr %p hchan %p", hcon, hcon->amp_mgr, hchan);
4269
4270 mgr = hcon->amp_mgr;
4271 if (mgr && mgr->bredr_chan) {
4272 struct l2cap_chan *bredr_chan = mgr->bredr_chan;
4273
4274 l2cap_chan_lock(bredr_chan);
4275
4276 bredr_chan->conn->mtu = hdev->block_mtu;
4277 l2cap_logical_cfm(bredr_chan, hchan, 0);
4278 hci_conn_hold(hcon);
4279
4280 l2cap_chan_unlock(bredr_chan);
4281 }
4282}
4283
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02004284static void hci_disconn_loglink_complete_evt(struct hci_dev *hdev,
4285 struct sk_buff *skb)
4286{
4287 struct hci_ev_disconn_logical_link_complete *ev = (void *) skb->data;
4288 struct hci_chan *hchan;
4289
4290 BT_DBG("%s log handle 0x%4.4x status 0x%2.2x", hdev->name,
4291 le16_to_cpu(ev->handle), ev->status);
4292
4293 if (ev->status)
4294 return;
4295
4296 hci_dev_lock(hdev);
4297
4298 hchan = hci_chan_lookup_handle(hdev, le16_to_cpu(ev->handle));
4299 if (!hchan)
4300 goto unlock;
4301
4302 amp_destroy_logical_link(hchan, ev->reason);
4303
4304unlock:
4305 hci_dev_unlock(hdev);
4306}
4307
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02004308static void hci_disconn_phylink_complete_evt(struct hci_dev *hdev,
4309 struct sk_buff *skb)
4310{
4311 struct hci_ev_disconn_phy_link_complete *ev = (void *) skb->data;
4312 struct hci_conn *hcon;
4313
4314 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4315
4316 if (ev->status)
4317 return;
4318
4319 hci_dev_lock(hdev);
4320
4321 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4322 if (hcon) {
4323 hcon->state = BT_CLOSED;
4324 hci_conn_del(hcon);
4325 }
4326
4327 hci_dev_unlock(hdev);
4328}
4329
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004330static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03004331{
4332 struct hci_ev_le_conn_complete *ev = (void *) skb->data;
Johan Hedberg912b42e2014-07-03 19:33:49 +03004333 struct hci_conn_params *params;
Ville Tervofcd89c02011-02-10 22:38:47 -03004334 struct hci_conn *conn;
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004335 struct smp_irk *irk;
Johan Hedberg837d5022014-07-02 09:36:22 +03004336 u8 addr_type;
Ville Tervofcd89c02011-02-10 22:38:47 -03004337
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004338 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Ville Tervofcd89c02011-02-10 22:38:47 -03004339
4340 hci_dev_lock(hdev);
4341
Johan Hedbergfbd96c12014-07-08 17:21:51 +03004342 /* All controllers implicitly stop advertising in the event of a
4343 * connection, so ensure that the state bit is cleared.
4344 */
4345 clear_bit(HCI_LE_ADV, &hdev->dev_flags);
4346
Andre Guedesb47a09b2012-07-27 15:10:15 -03004347 conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
Ville Tervob62f3282011-02-10 22:38:50 -03004348 if (!conn) {
Johan Hedberga5c4e302014-07-16 11:56:07 +03004349 conn = hci_conn_add(hdev, LE_LINK, &ev->bdaddr, ev->role);
Ville Tervob62f3282011-02-10 22:38:50 -03004350 if (!conn) {
4351 BT_ERR("No memory for new connection");
Andre Guedes230fd162012-07-27 15:10:10 -03004352 goto unlock;
Ville Tervob62f3282011-02-10 22:38:50 -03004353 }
Andre Guedes29b79882011-05-31 14:20:54 -03004354
4355 conn->dst_type = ev->bdaddr_type;
Andre Guedesb9b343d2012-07-27 15:10:11 -03004356
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004357 /* If we didn't have a hci_conn object previously
4358 * but we're in master role this must be something
4359 * initiated using a white list. Since white list based
4360 * connections are not "first class citizens" we don't
4361 * have full tracking of them. Therefore, we go ahead
4362 * with a "best effort" approach of determining the
4363 * initiator address based on the HCI_PRIVACY flag.
4364 */
4365 if (conn->out) {
4366 conn->resp_addr_type = ev->bdaddr_type;
4367 bacpy(&conn->resp_addr, &ev->bdaddr);
4368 if (test_bit(HCI_PRIVACY, &hdev->dev_flags)) {
4369 conn->init_addr_type = ADDR_LE_DEV_RANDOM;
4370 bacpy(&conn->init_addr, &hdev->rpa);
4371 } else {
4372 hci_copy_identity_address(hdev,
4373 &conn->init_addr,
4374 &conn->init_addr_type);
4375 }
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004376 }
Johan Hedberg9489eca2014-02-28 17:45:46 +02004377 } else {
4378 cancel_delayed_work(&conn->le_conn_timeout);
Ville Tervob62f3282011-02-10 22:38:50 -03004379 }
Ville Tervofcd89c02011-02-10 22:38:47 -03004380
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004381 if (!conn->out) {
4382 /* Set the responder (our side) address type based on
4383 * the advertising address type.
4384 */
4385 conn->resp_addr_type = hdev->adv_addr_type;
4386 if (hdev->adv_addr_type == ADDR_LE_DEV_RANDOM)
4387 bacpy(&conn->resp_addr, &hdev->random_addr);
4388 else
4389 bacpy(&conn->resp_addr, &hdev->bdaddr);
4390
4391 conn->init_addr_type = ev->bdaddr_type;
4392 bacpy(&conn->init_addr, &ev->bdaddr);
Marcel Holtmanna720d732014-06-23 12:14:51 +02004393
4394 /* For incoming connections, set the default minimum
4395 * and maximum connection interval. They will be used
4396 * to check if the parameters are in range and if not
4397 * trigger the connection update procedure.
4398 */
4399 conn->le_conn_min_interval = hdev->le_conn_min_interval;
4400 conn->le_conn_max_interval = hdev->le_conn_max_interval;
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004401 }
Johan Hedberg7be2edb2014-02-23 19:42:17 +02004402
Marcel Holtmannedb4b462014-02-18 15:13:43 -08004403 /* Lookup the identity address from the stored connection
4404 * address and address type.
4405 *
4406 * When establishing connections to an identity address, the
4407 * connection procedure will store the resolvable random
4408 * address first. Now if it can be converted back into the
4409 * identity address, start using the identity address from
4410 * now on.
4411 */
4412 irk = hci_get_irk(hdev, &conn->dst, conn->dst_type);
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004413 if (irk) {
4414 bacpy(&conn->dst, &irk->bdaddr);
4415 conn->dst_type = irk->addr_type;
4416 }
4417
Johan Hedberg2d3c2262014-07-15 11:51:28 +03004418 if (ev->status) {
4419 hci_le_conn_failed(conn, ev->status);
Johan Hedberg837d5022014-07-02 09:36:22 +03004420 goto unlock;
4421 }
4422
Johan Hedberg08853f12014-08-15 21:06:55 +03004423 if (conn->dst_type == ADDR_LE_DEV_PUBLIC)
4424 addr_type = BDADDR_LE_PUBLIC;
4425 else
4426 addr_type = BDADDR_LE_RANDOM;
4427
Johan Hedberg2d3c2262014-07-15 11:51:28 +03004428 /* Drop the connection if the device is blocked */
4429 if (hci_bdaddr_list_lookup(&hdev->blacklist, &conn->dst, addr_type)) {
4430 hci_conn_drop(conn);
Andre Guedescd17dec2012-07-27 15:10:16 -03004431 goto unlock;
4432 }
4433
Johan Hedbergb644ba32012-01-17 21:48:47 +02004434 if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00004435 mgmt_device_connected(hdev, conn, 0, NULL, 0);
Vinicius Costa Gomes83bc71b2011-05-06 18:41:43 -03004436
Vinicius Costa Gomes7b5c0d52011-06-09 18:50:50 -03004437 conn->sec_level = BT_SECURITY_LOW;
Ville Tervofcd89c02011-02-10 22:38:47 -03004438 conn->handle = __le16_to_cpu(ev->handle);
4439 conn->state = BT_CONNECTED;
4440
Marcel Holtmanne04fde62014-06-23 11:40:04 +02004441 conn->le_conn_interval = le16_to_cpu(ev->interval);
4442 conn->le_conn_latency = le16_to_cpu(ev->latency);
4443 conn->le_supv_timeout = le16_to_cpu(ev->supervision_timeout);
4444
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01004445 hci_debugfs_create_conn(conn);
Ville Tervofcd89c02011-02-10 22:38:47 -03004446 hci_conn_add_sysfs(conn);
4447
4448 hci_proto_connect_cfm(conn, ev->status);
4449
Johan Hedberg54776102014-08-15 21:06:56 +03004450 params = hci_pend_le_action_lookup(&hdev->pend_le_conns, &conn->dst,
4451 conn->dst_type);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004452 if (params) {
Johan Hedberg95305ba2014-07-04 12:37:21 +03004453 list_del_init(&params->action);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004454 if (params->conn) {
4455 hci_conn_drop(params->conn);
Johan Hedbergf8aaf9b2014-08-17 23:28:57 +03004456 hci_conn_put(params->conn);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004457 params->conn = NULL;
4458 }
4459 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004460
Ville Tervofcd89c02011-02-10 22:38:47 -03004461unlock:
Johan Hedberg223683a2014-07-06 15:44:23 +03004462 hci_update_background_scan(hdev);
Ville Tervofcd89c02011-02-10 22:38:47 -03004463 hci_dev_unlock(hdev);
4464}
4465
Marcel Holtmann1855d922014-06-23 11:40:05 +02004466static void hci_le_conn_update_complete_evt(struct hci_dev *hdev,
4467 struct sk_buff *skb)
4468{
4469 struct hci_ev_le_conn_update_complete *ev = (void *) skb->data;
4470 struct hci_conn *conn;
4471
4472 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4473
4474 if (ev->status)
4475 return;
4476
4477 hci_dev_lock(hdev);
4478
4479 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
4480 if (conn) {
4481 conn->le_conn_interval = le16_to_cpu(ev->interval);
4482 conn->le_conn_latency = le16_to_cpu(ev->latency);
4483 conn->le_supv_timeout = le16_to_cpu(ev->supervision_timeout);
4484 }
4485
4486 hci_dev_unlock(hdev);
4487}
4488
Andre Guedesa4790db2014-02-26 20:21:47 -03004489/* This function requires the caller holds hdev->lock */
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004490static struct hci_conn *check_pending_le_conn(struct hci_dev *hdev,
4491 bdaddr_t *addr,
4492 u8 addr_type, u8 adv_type)
Andre Guedesa4790db2014-02-26 20:21:47 -03004493{
4494 struct hci_conn *conn;
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004495 struct hci_conn_params *params;
Andre Guedesa4790db2014-02-26 20:21:47 -03004496
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004497 /* If the event is not connectable don't proceed further */
4498 if (adv_type != LE_ADV_IND && adv_type != LE_ADV_DIRECT_IND)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004499 return NULL;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004500
4501 /* Ignore if the device is blocked */
Johan Hedbergdcc36c12014-07-09 12:59:13 +03004502 if (hci_bdaddr_list_lookup(&hdev->blacklist, addr, addr_type))
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004503 return NULL;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004504
Johan Hedbergf99353c2014-07-16 11:56:09 +03004505 /* Most controller will fail if we try to create new connections
4506 * while we have an existing one in slave role.
4507 */
4508 if (hdev->conn_hash.le_num_slave > 0)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004509 return NULL;
Johan Hedbergf99353c2014-07-16 11:56:09 +03004510
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004511 /* If we're not connectable only connect devices that we have in
4512 * our pend_le_conns list.
4513 */
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004514 params = hci_pend_le_action_lookup(&hdev->pend_le_conns,
4515 addr, addr_type);
4516 if (!params)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004517 return NULL;
Andre Guedesa4790db2014-02-26 20:21:47 -03004518
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004519 switch (params->auto_connect) {
4520 case HCI_AUTO_CONN_DIRECT:
4521 /* Only devices advertising with ADV_DIRECT_IND are
4522 * triggering a connection attempt. This is allowing
4523 * incoming connections from slave devices.
4524 */
4525 if (adv_type != LE_ADV_DIRECT_IND)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004526 return NULL;
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004527 break;
4528 case HCI_AUTO_CONN_ALWAYS:
4529 /* Devices advertising with ADV_IND or ADV_DIRECT_IND
4530 * are triggering a connection attempt. This means
4531 * that incoming connectioms from slave device are
4532 * accepted and also outgoing connections to slave
4533 * devices are established when found.
4534 */
4535 break;
4536 default:
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004537 return NULL;
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004538 }
4539
Andre Guedesa4790db2014-02-26 20:21:47 -03004540 conn = hci_connect_le(hdev, addr, addr_type, BT_SECURITY_LOW,
Johan Hedberge804d252014-07-16 11:42:28 +03004541 HCI_LE_AUTOCONN_TIMEOUT, HCI_ROLE_MASTER);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004542 if (!IS_ERR(conn)) {
4543 /* Store the pointer since we don't really have any
4544 * other owner of the object besides the params that
4545 * triggered it. This way we can abort the connection if
4546 * the parameters get removed and keep the reference
4547 * count consistent once the connection is established.
4548 */
Johan Hedbergf8aaf9b2014-08-17 23:28:57 +03004549 params->conn = hci_conn_get(conn);
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004550 return conn;
Johan Hedbergf161dd42014-08-15 21:06:54 +03004551 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004552
4553 switch (PTR_ERR(conn)) {
4554 case -EBUSY:
4555 /* If hci_connect() returns -EBUSY it means there is already
4556 * an LE connection attempt going on. Since controllers don't
4557 * support more than one connection attempt at the time, we
4558 * don't consider this an error case.
4559 */
4560 break;
4561 default:
4562 BT_DBG("Failed to connect: err %ld", PTR_ERR(conn));
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004563 return NULL;
Andre Guedesa4790db2014-02-26 20:21:47 -03004564 }
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004565
4566 return NULL;
Andre Guedesa4790db2014-02-26 20:21:47 -03004567}
4568
Johan Hedberg4af605d2014-03-24 10:48:00 +02004569static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr,
Marcel Holtmann2f010b52014-12-05 16:20:13 +01004570 u8 bdaddr_type, bdaddr_t *direct_addr,
4571 u8 direct_addr_type, s8 rssi, u8 *data, u8 len)
Johan Hedberg4af605d2014-03-24 10:48:00 +02004572{
Johan Hedbergb9a63282014-03-25 10:51:52 +02004573 struct discovery_state *d = &hdev->discovery;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004574 struct smp_irk *irk;
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004575 struct hci_conn *conn;
Johan Hedberg474ee062014-03-25 14:34:59 +02004576 bool match;
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004577 u32 flags;
Johan Hedbergb9a63282014-03-25 10:51:52 +02004578
Marcel Holtmann2f010b52014-12-05 16:20:13 +01004579 /* If the direct address is present, then this report is from
4580 * a LE Direct Advertising Report event. In that case it is
4581 * important to see if the address is matching the local
4582 * controller address.
4583 */
4584 if (direct_addr) {
4585 /* Only resolvable random addresses are valid for these
4586 * kind of reports and others can be ignored.
4587 */
4588 if (!hci_bdaddr_is_rpa(direct_addr, direct_addr_type))
4589 return;
4590
4591 /* If the controller is not using resolvable random
4592 * addresses, then this report can be ignored.
4593 */
4594 if (!test_bit(HCI_PRIVACY, &hdev->dev_flags))
4595 return;
4596
4597 /* If the local IRK of the controller does not match
4598 * with the resolvable random address provided, then
4599 * this report can be ignored.
4600 */
4601 if (!smp_irk_matches(hdev, hdev->irk, direct_addr))
4602 return;
4603 }
4604
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004605 /* Check if we need to convert to identity address */
4606 irk = hci_get_irk(hdev, bdaddr, bdaddr_type);
4607 if (irk) {
4608 bdaddr = &irk->bdaddr;
4609 bdaddr_type = irk->addr_type;
4610 }
4611
4612 /* Check if we have been requested to connect to this device */
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004613 conn = check_pending_le_conn(hdev, bdaddr, bdaddr_type, type);
4614 if (conn && type == LE_ADV_IND) {
4615 /* Store report for later inclusion by
4616 * mgmt_device_connected
4617 */
4618 memcpy(conn->le_adv_data, data, len);
4619 conn->le_adv_data_len = len;
4620 }
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004621
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004622 /* Passive scanning shouldn't trigger any device found events,
4623 * except for devices marked as CONN_REPORT for which we do send
4624 * device found events.
4625 */
Johan Hedbergca5c4be2014-03-25 10:30:46 +02004626 if (hdev->le_scan_type == LE_SCAN_PASSIVE) {
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004627 if (type == LE_ADV_DIRECT_IND)
4628 return;
4629
Johan Hedberg3a19b6f2014-07-15 08:07:59 +03004630 if (!hci_pend_le_action_lookup(&hdev->pend_le_reports,
4631 bdaddr, bdaddr_type))
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004632 return;
4633
4634 if (type == LE_ADV_NONCONN_IND || type == LE_ADV_SCAN_IND)
4635 flags = MGMT_DEV_FOUND_NOT_CONNECTABLE;
4636 else
4637 flags = 0;
4638 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
4639 rssi, flags, data, len, NULL, 0);
Johan Hedberg97bf2e92014-07-04 12:37:16 +03004640 return;
Johan Hedbergca5c4be2014-03-25 10:30:46 +02004641 }
Johan Hedberg4af605d2014-03-24 10:48:00 +02004642
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004643 /* When receiving non-connectable or scannable undirected
4644 * advertising reports, this means that the remote device is
4645 * not connectable and then clearly indicate this in the
4646 * device found event.
4647 *
4648 * When receiving a scan response, then there is no way to
4649 * know if the remote device is connectable or not. However
4650 * since scan responses are merged with a previously seen
4651 * advertising report, the flags field from that report
4652 * will be used.
4653 *
4654 * In the really unlikely case that a controller get confused
4655 * and just sends a scan response event, then it is marked as
4656 * not connectable as well.
4657 */
4658 if (type == LE_ADV_NONCONN_IND || type == LE_ADV_SCAN_IND ||
4659 type == LE_ADV_SCAN_RSP)
4660 flags = MGMT_DEV_FOUND_NOT_CONNECTABLE;
4661 else
4662 flags = 0;
4663
Johan Hedbergb9a63282014-03-25 10:51:52 +02004664 /* If there's nothing pending either store the data from this
4665 * event or send an immediate device found event if the data
4666 * should not be stored for later.
4667 */
4668 if (!has_pending_adv_report(hdev)) {
4669 /* If the report will trigger a SCAN_REQ store it for
4670 * later merging.
4671 */
4672 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
4673 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004674 rssi, flags, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004675 return;
4676 }
4677
4678 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004679 rssi, flags, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004680 return;
4681 }
4682
Johan Hedberg474ee062014-03-25 14:34:59 +02004683 /* Check if the pending report is for the same device as the new one */
4684 match = (!bacmp(bdaddr, &d->last_adv_addr) &&
4685 bdaddr_type == d->last_adv_addr_type);
4686
Johan Hedbergb9a63282014-03-25 10:51:52 +02004687 /* If the pending data doesn't match this report or this isn't a
4688 * scan response (e.g. we got a duplicate ADV_IND) then force
4689 * sending of the pending data.
4690 */
Johan Hedberg474ee062014-03-25 14:34:59 +02004691 if (type != LE_ADV_SCAN_RSP || !match) {
4692 /* Send out whatever is in the cache, but skip duplicates */
4693 if (!match)
4694 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004695 d->last_adv_addr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004696 d->last_adv_rssi, d->last_adv_flags,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004697 d->last_adv_data,
Johan Hedberg474ee062014-03-25 14:34:59 +02004698 d->last_adv_data_len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004699
4700 /* If the new report will trigger a SCAN_REQ store it for
4701 * later merging.
4702 */
4703 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
4704 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004705 rssi, flags, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004706 return;
4707 }
4708
4709 /* The advertising reports cannot be merged, so clear
4710 * the pending report and send out a device found event.
4711 */
4712 clear_pending_adv_report(hdev);
Johan Hedberg5c5b93e2014-03-29 08:39:53 +02004713 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004714 rssi, flags, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004715 return;
4716 }
4717
4718 /* If we get here we've got a pending ADV_IND or ADV_SCAN_IND and
4719 * the new event is a SCAN_RSP. We can therefore proceed with
4720 * sending a merged device found event.
4721 */
4722 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004723 d->last_adv_addr_type, NULL, rssi, d->last_adv_flags,
Marcel Holtmann42bd6a52014-07-01 14:11:19 +02004724 d->last_adv_data, d->last_adv_data_len, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004725 clear_pending_adv_report(hdev);
Johan Hedberg4af605d2014-03-24 10:48:00 +02004726}
4727
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004728static void hci_le_adv_report_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andre Guedes9aa04c92011-05-26 16:23:51 -03004729{
Andre Guedese95beb42011-09-26 20:48:35 -03004730 u8 num_reports = skb->data[0];
4731 void *ptr = &skb->data[1];
Andre Guedes9aa04c92011-05-26 16:23:51 -03004732
Andre Guedesa4790db2014-02-26 20:21:47 -03004733 hci_dev_lock(hdev);
4734
Andre Guedese95beb42011-09-26 20:48:35 -03004735 while (num_reports--) {
4736 struct hci_ev_le_advertising_info *ev = ptr;
Johan Hedberg4af605d2014-03-24 10:48:00 +02004737 s8 rssi;
Andre Guedesa4790db2014-02-26 20:21:47 -03004738
Andre Guedes3c9e9192012-01-10 18:20:50 -03004739 rssi = ev->data[ev->length];
Johan Hedberg4af605d2014-03-24 10:48:00 +02004740 process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
Marcel Holtmann2f010b52014-12-05 16:20:13 +01004741 ev->bdaddr_type, NULL, 0, rssi,
4742 ev->data, ev->length);
Andre Guedes3c9e9192012-01-10 18:20:50 -03004743
Andre Guedese95beb42011-09-26 20:48:35 -03004744 ptr += sizeof(*ev) + ev->length + 1;
Andre Guedes9aa04c92011-05-26 16:23:51 -03004745 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004746
4747 hci_dev_unlock(hdev);
Andre Guedes9aa04c92011-05-26 16:23:51 -03004748}
4749
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004750static void hci_le_ltk_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004751{
4752 struct hci_ev_le_ltk_req *ev = (void *) skb->data;
4753 struct hci_cp_le_ltk_reply cp;
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004754 struct hci_cp_le_ltk_neg_reply neg;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004755 struct hci_conn *conn;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004756 struct smp_ltk *ltk;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004757
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004758 BT_DBG("%s handle 0x%4.4x", hdev->name, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004759
4760 hci_dev_lock(hdev);
4761
4762 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004763 if (conn == NULL)
4764 goto not_found;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004765
Johan Hedbergf3a73d92014-05-29 15:02:59 +03004766 ltk = hci_find_ltk(hdev, &conn->dst, conn->dst_type, conn->role);
Johan Hedberg5378bc52014-05-29 14:00:39 +03004767 if (!ltk)
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004768 goto not_found;
4769
Johan Hedberg5378bc52014-05-29 14:00:39 +03004770 if (smp_ltk_is_sc(ltk)) {
4771 /* With SC both EDiv and Rand are set to zero */
4772 if (ev->ediv || ev->rand)
4773 goto not_found;
4774 } else {
4775 /* For non-SC keys check that EDiv and Rand match */
4776 if (ev->ediv != ltk->ediv || ev->rand != ltk->rand)
4777 goto not_found;
4778 }
4779
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004780 memcpy(cp.ltk, ltk->val, sizeof(ltk->val));
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004781 cp.handle = cpu_to_le16(conn->handle);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004782
Johan Hedberga6f78332014-09-10 17:37:45 -07004783 conn->pending_sec_level = smp_ltk_sec_level(ltk);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004784
Andre Guedes89cbb4d2013-07-31 16:25:29 -03004785 conn->enc_key_size = ltk->enc_size;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004786
4787 hci_send_cmd(hdev, HCI_OP_LE_LTK_REPLY, sizeof(cp), &cp);
4788
Claudio Takahasi5981a882013-07-25 16:34:24 -03004789 /* Ref. Bluetooth Core SPEC pages 1975 and 2004. STK is a
4790 * temporary key used to encrypt a connection following
4791 * pairing. It is used during the Encrypted Session Setup to
4792 * distribute the keys. Later, security can be re-established
4793 * using a distributed LTK.
4794 */
Johan Hedberg2ceba532014-06-16 19:25:16 +03004795 if (ltk->type == SMP_STK) {
Johan Hedbergfe59a052014-07-01 19:14:12 +03004796 set_bit(HCI_CONN_STK_ENCRYPT, &conn->flags);
Johan Hedberg970d0f12014-11-13 14:37:47 +02004797 list_del_rcu(&ltk->list);
4798 kfree_rcu(ltk, rcu);
Johan Hedbergfe59a052014-07-01 19:14:12 +03004799 } else {
4800 clear_bit(HCI_CONN_STK_ENCRYPT, &conn->flags);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004801 }
4802
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004803 hci_dev_unlock(hdev);
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004804
4805 return;
4806
4807not_found:
4808 neg.handle = ev->handle;
4809 hci_send_cmd(hdev, HCI_OP_LE_LTK_NEG_REPLY, sizeof(neg), &neg);
4810 hci_dev_unlock(hdev);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004811}
4812
Andre Guedes8e75b462014-07-01 18:10:08 -03004813static void send_conn_param_neg_reply(struct hci_dev *hdev, u16 handle,
4814 u8 reason)
4815{
4816 struct hci_cp_le_conn_param_req_neg_reply cp;
4817
4818 cp.handle = cpu_to_le16(handle);
4819 cp.reason = reason;
4820
4821 hci_send_cmd(hdev, HCI_OP_LE_CONN_PARAM_REQ_NEG_REPLY, sizeof(cp),
4822 &cp);
4823}
4824
4825static void hci_le_remote_conn_param_req_evt(struct hci_dev *hdev,
4826 struct sk_buff *skb)
4827{
4828 struct hci_ev_le_remote_conn_param_req *ev = (void *) skb->data;
4829 struct hci_cp_le_conn_param_req_reply cp;
4830 struct hci_conn *hcon;
4831 u16 handle, min, max, latency, timeout;
4832
4833 handle = le16_to_cpu(ev->handle);
4834 min = le16_to_cpu(ev->interval_min);
4835 max = le16_to_cpu(ev->interval_max);
4836 latency = le16_to_cpu(ev->latency);
4837 timeout = le16_to_cpu(ev->timeout);
4838
4839 hcon = hci_conn_hash_lookup_handle(hdev, handle);
4840 if (!hcon || hcon->state != BT_CONNECTED)
4841 return send_conn_param_neg_reply(hdev, handle,
4842 HCI_ERROR_UNKNOWN_CONN_ID);
4843
4844 if (hci_check_conn_params(min, max, latency, timeout))
4845 return send_conn_param_neg_reply(hdev, handle,
4846 HCI_ERROR_INVALID_LL_PARAMS);
4847
Johan Hedberg40bef302014-07-16 11:42:27 +03004848 if (hcon->role == HCI_ROLE_MASTER) {
Johan Hedberg348d50b2014-07-02 17:37:30 +03004849 struct hci_conn_params *params;
Johan Hedbergf4869e22014-07-02 17:37:32 +03004850 u8 store_hint;
Johan Hedberg348d50b2014-07-02 17:37:30 +03004851
4852 hci_dev_lock(hdev);
4853
4854 params = hci_conn_params_lookup(hdev, &hcon->dst,
4855 hcon->dst_type);
4856 if (params) {
4857 params->conn_min_interval = min;
4858 params->conn_max_interval = max;
4859 params->conn_latency = latency;
4860 params->supervision_timeout = timeout;
Johan Hedbergf4869e22014-07-02 17:37:32 +03004861 store_hint = 0x01;
4862 } else{
4863 store_hint = 0x00;
Johan Hedberg348d50b2014-07-02 17:37:30 +03004864 }
4865
4866 hci_dev_unlock(hdev);
4867
Johan Hedbergf4869e22014-07-02 17:37:32 +03004868 mgmt_new_conn_param(hdev, &hcon->dst, hcon->dst_type,
4869 store_hint, min, max, latency, timeout);
Johan Hedberg348d50b2014-07-02 17:37:30 +03004870 }
Andre Guedesffb5a8272014-07-01 18:10:11 -03004871
Andre Guedes8e75b462014-07-01 18:10:08 -03004872 cp.handle = ev->handle;
4873 cp.interval_min = ev->interval_min;
4874 cp.interval_max = ev->interval_max;
4875 cp.latency = ev->latency;
4876 cp.timeout = ev->timeout;
4877 cp.min_ce_len = 0;
4878 cp.max_ce_len = 0;
4879
4880 hci_send_cmd(hdev, HCI_OP_LE_CONN_PARAM_REQ_REPLY, sizeof(cp), &cp);
4881}
4882
Marcel Holtmann2f010b52014-12-05 16:20:13 +01004883static void hci_le_direct_adv_report_evt(struct hci_dev *hdev,
4884 struct sk_buff *skb)
4885{
4886 u8 num_reports = skb->data[0];
4887 void *ptr = &skb->data[1];
4888
4889 hci_dev_lock(hdev);
4890
4891 while (num_reports--) {
4892 struct hci_ev_le_direct_adv_info *ev = ptr;
4893
4894 process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
4895 ev->bdaddr_type, &ev->direct_addr,
4896 ev->direct_addr_type, ev->rssi, NULL, 0);
4897
4898 ptr += sizeof(*ev);
4899 }
4900
4901 hci_dev_unlock(hdev);
4902}
4903
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004904static void hci_le_meta_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03004905{
4906 struct hci_ev_le_meta *le_ev = (void *) skb->data;
4907
4908 skb_pull(skb, sizeof(*le_ev));
4909
4910 switch (le_ev->subevent) {
4911 case HCI_EV_LE_CONN_COMPLETE:
4912 hci_le_conn_complete_evt(hdev, skb);
4913 break;
4914
Marcel Holtmann1855d922014-06-23 11:40:05 +02004915 case HCI_EV_LE_CONN_UPDATE_COMPLETE:
4916 hci_le_conn_update_complete_evt(hdev, skb);
4917 break;
4918
Andre Guedes9aa04c92011-05-26 16:23:51 -03004919 case HCI_EV_LE_ADVERTISING_REPORT:
4920 hci_le_adv_report_evt(hdev, skb);
4921 break;
4922
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004923 case HCI_EV_LE_LTK_REQ:
4924 hci_le_ltk_request_evt(hdev, skb);
4925 break;
4926
Andre Guedes8e75b462014-07-01 18:10:08 -03004927 case HCI_EV_LE_REMOTE_CONN_PARAM_REQ:
4928 hci_le_remote_conn_param_req_evt(hdev, skb);
4929 break;
4930
Marcel Holtmann2f010b52014-12-05 16:20:13 +01004931 case HCI_EV_LE_DIRECT_ADV_REPORT:
4932 hci_le_direct_adv_report_evt(hdev, skb);
4933 break;
4934
Ville Tervofcd89c02011-02-10 22:38:47 -03004935 default:
4936 break;
4937 }
4938}
4939
Andrei Emeltchenko9495b2e2012-09-27 17:26:22 +03004940static void hci_chan_selected_evt(struct hci_dev *hdev, struct sk_buff *skb)
4941{
4942 struct hci_ev_channel_selected *ev = (void *) skb->data;
4943 struct hci_conn *hcon;
4944
4945 BT_DBG("%s handle 0x%2.2x", hdev->name, ev->phy_handle);
4946
4947 skb_pull(skb, sizeof(*ev));
4948
4949 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4950 if (!hcon)
4951 return;
4952
4953 amp_read_loc_assoc_final_data(hdev, hcon);
4954}
4955
Linus Torvalds1da177e2005-04-16 15:20:36 -07004956void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)
4957{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004958 struct hci_event_hdr *hdr = (void *) skb->data;
4959 __u8 event = hdr->evt;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004960
Johan Hedbergb6ddb632013-04-02 13:34:31 +03004961 hci_dev_lock(hdev);
4962
4963 /* Received events are (currently) only needed when a request is
4964 * ongoing so avoid unnecessary memory allocation.
4965 */
Marcel Holtmann899de762014-07-11 05:51:58 +02004966 if (hci_req_pending(hdev)) {
Johan Hedbergb6ddb632013-04-02 13:34:31 +03004967 kfree_skb(hdev->recv_evt);
4968 hdev->recv_evt = skb_clone(skb, GFP_KERNEL);
4969 }
4970
4971 hci_dev_unlock(hdev);
4972
Linus Torvalds1da177e2005-04-16 15:20:36 -07004973 skb_pull(skb, HCI_EVENT_HDR_SIZE);
4974
Johan Hedberg02350a72013-04-03 21:50:29 +03004975 if (hdev->sent_cmd && bt_cb(hdev->sent_cmd)->req.event == event) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02004976 struct hci_command_hdr *cmd_hdr = (void *) hdev->sent_cmd->data;
4977 u16 opcode = __le16_to_cpu(cmd_hdr->opcode);
Johan Hedberg02350a72013-04-03 21:50:29 +03004978
4979 hci_req_cmd_complete(hdev, opcode, 0);
4980 }
4981
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004982 switch (event) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004983 case HCI_EV_INQUIRY_COMPLETE:
4984 hci_inquiry_complete_evt(hdev, skb);
4985 break;
4986
4987 case HCI_EV_INQUIRY_RESULT:
4988 hci_inquiry_result_evt(hdev, skb);
4989 break;
4990
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004991 case HCI_EV_CONN_COMPLETE:
4992 hci_conn_complete_evt(hdev, skb);
Marcel Holtmann21d9e302005-09-13 01:32:25 +02004993 break;
4994
Linus Torvalds1da177e2005-04-16 15:20:36 -07004995 case HCI_EV_CONN_REQUEST:
4996 hci_conn_request_evt(hdev, skb);
4997 break;
4998
Linus Torvalds1da177e2005-04-16 15:20:36 -07004999 case HCI_EV_DISCONN_COMPLETE:
5000 hci_disconn_complete_evt(hdev, skb);
5001 break;
5002
Linus Torvalds1da177e2005-04-16 15:20:36 -07005003 case HCI_EV_AUTH_COMPLETE:
5004 hci_auth_complete_evt(hdev, skb);
5005 break;
5006
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005007 case HCI_EV_REMOTE_NAME:
5008 hci_remote_name_evt(hdev, skb);
5009 break;
5010
Linus Torvalds1da177e2005-04-16 15:20:36 -07005011 case HCI_EV_ENCRYPT_CHANGE:
5012 hci_encrypt_change_evt(hdev, skb);
5013 break;
5014
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005015 case HCI_EV_CHANGE_LINK_KEY_COMPLETE:
5016 hci_change_link_key_complete_evt(hdev, skb);
5017 break;
5018
5019 case HCI_EV_REMOTE_FEATURES:
5020 hci_remote_features_evt(hdev, skb);
5021 break;
5022
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005023 case HCI_EV_CMD_COMPLETE:
5024 hci_cmd_complete_evt(hdev, skb);
5025 break;
5026
5027 case HCI_EV_CMD_STATUS:
5028 hci_cmd_status_evt(hdev, skb);
5029 break;
5030
Marcel Holtmann24dfa342014-11-02 02:56:41 +01005031 case HCI_EV_HARDWARE_ERROR:
5032 hci_hardware_error_evt(hdev, skb);
5033 break;
5034
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005035 case HCI_EV_ROLE_CHANGE:
5036 hci_role_change_evt(hdev, skb);
5037 break;
5038
5039 case HCI_EV_NUM_COMP_PKTS:
5040 hci_num_comp_pkts_evt(hdev, skb);
5041 break;
5042
5043 case HCI_EV_MODE_CHANGE:
5044 hci_mode_change_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005045 break;
5046
5047 case HCI_EV_PIN_CODE_REQ:
5048 hci_pin_code_request_evt(hdev, skb);
5049 break;
5050
5051 case HCI_EV_LINK_KEY_REQ:
5052 hci_link_key_request_evt(hdev, skb);
5053 break;
5054
5055 case HCI_EV_LINK_KEY_NOTIFY:
5056 hci_link_key_notify_evt(hdev, skb);
5057 break;
5058
5059 case HCI_EV_CLOCK_OFFSET:
5060 hci_clock_offset_evt(hdev, skb);
5061 break;
5062
Marcel Holtmanna8746412008-07-14 20:13:46 +02005063 case HCI_EV_PKT_TYPE_CHANGE:
5064 hci_pkt_type_change_evt(hdev, skb);
5065 break;
5066
Marcel Holtmann85a1e932005-08-09 20:28:02 -07005067 case HCI_EV_PSCAN_REP_MODE:
5068 hci_pscan_rep_mode_evt(hdev, skb);
5069 break;
5070
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005071 case HCI_EV_INQUIRY_RESULT_WITH_RSSI:
5072 hci_inquiry_result_with_rssi_evt(hdev, skb);
5073 break;
5074
5075 case HCI_EV_REMOTE_EXT_FEATURES:
5076 hci_remote_ext_features_evt(hdev, skb);
5077 break;
5078
5079 case HCI_EV_SYNC_CONN_COMPLETE:
5080 hci_sync_conn_complete_evt(hdev, skb);
5081 break;
5082
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005083 case HCI_EV_EXTENDED_INQUIRY_RESULT:
5084 hci_extended_inquiry_result_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005085 break;
5086
Johan Hedberg1c2e0042012-06-08 23:31:13 +08005087 case HCI_EV_KEY_REFRESH_COMPLETE:
5088 hci_key_refresh_complete_evt(hdev, skb);
5089 break;
5090
Marcel Holtmann04936842008-07-14 20:13:48 +02005091 case HCI_EV_IO_CAPA_REQUEST:
5092 hci_io_capa_request_evt(hdev, skb);
5093 break;
5094
Johan Hedberg03b555e2011-01-04 15:40:05 +02005095 case HCI_EV_IO_CAPA_REPLY:
5096 hci_io_capa_reply_evt(hdev, skb);
5097 break;
5098
Johan Hedberga5c29682011-02-19 12:05:57 -03005099 case HCI_EV_USER_CONFIRM_REQUEST:
5100 hci_user_confirm_request_evt(hdev, skb);
5101 break;
5102
Brian Gix1143d452011-11-23 08:28:34 -08005103 case HCI_EV_USER_PASSKEY_REQUEST:
5104 hci_user_passkey_request_evt(hdev, skb);
5105 break;
5106
Johan Hedberg92a25252012-09-06 18:39:26 +03005107 case HCI_EV_USER_PASSKEY_NOTIFY:
5108 hci_user_passkey_notify_evt(hdev, skb);
5109 break;
5110
5111 case HCI_EV_KEYPRESS_NOTIFY:
5112 hci_keypress_notify_evt(hdev, skb);
5113 break;
5114
Marcel Holtmann04936842008-07-14 20:13:48 +02005115 case HCI_EV_SIMPLE_PAIR_COMPLETE:
5116 hci_simple_pair_complete_evt(hdev, skb);
5117 break;
5118
Marcel Holtmann41a96212008-07-14 20:13:48 +02005119 case HCI_EV_REMOTE_HOST_FEATURES:
5120 hci_remote_host_features_evt(hdev, skb);
5121 break;
5122
Ville Tervofcd89c02011-02-10 22:38:47 -03005123 case HCI_EV_LE_META:
5124 hci_le_meta_evt(hdev, skb);
5125 break;
5126
Andrei Emeltchenko9495b2e2012-09-27 17:26:22 +03005127 case HCI_EV_CHANNEL_SELECTED:
5128 hci_chan_selected_evt(hdev, skb);
5129 break;
5130
Szymon Janc2763eda2011-03-22 13:12:22 +01005131 case HCI_EV_REMOTE_OOB_DATA_REQUEST:
5132 hci_remote_oob_data_request_evt(hdev, skb);
5133 break;
5134
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03005135 case HCI_EV_PHY_LINK_COMPLETE:
5136 hci_phy_link_complete_evt(hdev, skb);
5137 break;
5138
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03005139 case HCI_EV_LOGICAL_LINK_COMPLETE:
5140 hci_loglink_complete_evt(hdev, skb);
5141 break;
5142
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02005143 case HCI_EV_DISCONN_LOGICAL_LINK_COMPLETE:
5144 hci_disconn_loglink_complete_evt(hdev, skb);
5145 break;
5146
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02005147 case HCI_EV_DISCONN_PHY_LINK_COMPLETE:
5148 hci_disconn_phylink_complete_evt(hdev, skb);
5149 break;
5150
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02005151 case HCI_EV_NUM_COMP_BLOCKS:
5152 hci_num_comp_blocks_evt(hdev, skb);
5153 break;
5154
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005155 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03005156 BT_DBG("%s event 0x%2.2x", hdev->name, event);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005157 break;
5158 }
5159
5160 kfree_skb(skb);
5161 hdev->stat.evt_rx++;
5162}