blob: 8ed8516b18c7355de29b287928dea8e3dd6dd64e [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 Holtmanna9366122015-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 Padovan6039aa732012-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 Padovan6039aa732012-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 Padovan6039aa732012-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 Padovan6039aa732012-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 Padovan6039aa732012-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 Padovan6039aa732012-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 Padovan6039aa732012-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 Padovan6039aa732012-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 Padovan6039aa732012-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 Padovan6039aa732012-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 Padovan6039aa732012-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 Padovan6039aa732012-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 Padovan6039aa732012-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 Padovan6039aa732012-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 Padovan6039aa732012-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 Holtmanna9366122015-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 Padovan6039aa732012-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 Padovan6039aa732012-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 Padovan6039aa732012-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 Padovan6039aa732012-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 Padovan6039aa732012-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 Padovan6039aa732012-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 Padovan6039aa732012-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 Hedberg55ed8ca2011-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 Hedberg55ed8ca2011-01-17 14:41:05 +02003367
Andrei Emeltchenko034cbea2013-05-14 11:44:16 +03003368 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg55ed8ca2011-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 Hedberg55ed8ca2011-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 Hedberg55ed8ca2011-01-17 14:41:05 +02003382
Johan Hedberg55ed8ca2011-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 Hedberg55ed8ca2011-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 Hedberg55ed8ca2011-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 Hedberg55ed8ca2011-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 Padovan6039aa732012-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 Hedberg55ed8ca2011-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 Hedberg55ed8ca2011-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 Padovan6039aa732012-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 Padovan6039aa732012-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 Padovan6039aa732012-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 Padovan6039aa732012-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 Padovan6039aa732012-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 Padovan6039aa732012-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 Padovan6039aa732012-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 Padovan6039aa732012-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
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08003858static u8 bredr_oob_data_present(struct hci_conn *conn)
3859{
3860 struct hci_dev *hdev = conn->hdev;
3861 struct oob_data *data;
3862
3863 data = hci_find_remote_oob_data(hdev, &conn->dst, BDADDR_BREDR);
3864 if (!data)
3865 return 0x00;
3866
3867 if (conn->out || test_bit(HCI_CONN_REMOTE_OOB, &conn->flags))
3868 return 0x01;
3869
3870 return 0x00;
3871}
3872
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003873static void hci_io_capa_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02003874{
3875 struct hci_ev_io_capa_request *ev = (void *) skb->data;
3876 struct hci_conn *conn;
3877
3878 BT_DBG("%s", hdev->name);
3879
3880 hci_dev_lock(hdev);
3881
3882 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003883 if (!conn)
3884 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02003885
Johan Hedberg03b555e2011-01-04 15:40:05 +02003886 hci_conn_hold(conn);
3887
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003888 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg03b555e2011-01-04 15:40:05 +02003889 goto unlock;
3890
Johan Hedberg2f407f02014-07-17 15:35:40 +03003891 /* Allow pairing if we're pairable, the initiators of the
3892 * pairing or if the remote is not requesting bonding.
3893 */
Johan Hedbergb6ae8452014-07-30 09:22:22 +03003894 if (test_bit(HCI_BONDABLE, &hdev->dev_flags) ||
Johan Hedberg2f407f02014-07-17 15:35:40 +03003895 test_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags) ||
Gustavo Padovan807deac2012-05-17 00:36:24 -03003896 (conn->remote_auth & ~0x01) == HCI_AT_NO_BONDING) {
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003897 struct hci_cp_io_capability_reply cp;
3898
3899 bacpy(&cp.bdaddr, &ev->bdaddr);
Hemant Gupta7a7f1e72012-01-16 13:34:29 +05303900 /* Change the IO capability from KeyboardDisplay
3901 * to DisplayYesNo as it is not supported by BT spec. */
3902 cp.capability = (conn->io_capability == 0x04) ?
Mikel Astiza7676312013-06-28 10:56:29 +02003903 HCI_IO_DISPLAY_YESNO : conn->io_capability;
Mikel Astizb7f94c82014-04-08 14:21:31 +02003904
3905 /* If we are initiators, there is no remote information yet */
3906 if (conn->remote_auth == 0xff) {
Mikel Astizb16c6602014-04-08 14:21:34 +02003907 /* Request MITM protection if our IO caps allow it
Johan Hedberg4ad51a72014-06-09 14:41:25 +03003908 * except for the no-bonding case.
Mikel Astizb16c6602014-04-08 14:21:34 +02003909 */
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003910 if (conn->io_capability != HCI_IO_NO_INPUT_OUTPUT &&
Johan Hedberg9f743d72014-07-17 11:56:33 +03003911 conn->auth_type != HCI_AT_NO_BONDING)
Johan Hedberg6c538232014-07-11 15:32:23 +03003912 conn->auth_type |= 0x01;
Mikel Astizb7f94c82014-04-08 14:21:31 +02003913 } else {
3914 conn->auth_type = hci_get_auth_req(conn);
Mikel Astizb7f94c82014-04-08 14:21:31 +02003915 }
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003916
Johan Hedberg82c295b2014-07-30 09:22:24 +03003917 /* If we're not bondable, force one of the non-bondable
3918 * authentication requirement values.
3919 */
3920 if (!test_bit(HCI_BONDABLE, &hdev->dev_flags))
3921 conn->auth_type &= HCI_AT_NO_BONDING_MITM;
3922
3923 cp.authentication = conn->auth_type;
Marcel Holtmanna83ed81e2015-01-27 16:04:32 -08003924 cp.oob_data = bredr_oob_data_present(conn);
Szymon Jancce85ee12011-03-22 13:12:23 +01003925
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003926 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003927 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003928 } else {
3929 struct hci_cp_io_capability_neg_reply cp;
3930
3931 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02003932 cp.reason = HCI_ERROR_PAIRING_NOT_ALLOWED;
Johan Hedberg03b555e2011-01-04 15:40:05 +02003933
3934 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003935 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003936 }
3937
3938unlock:
3939 hci_dev_unlock(hdev);
3940}
3941
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003942static void hci_io_capa_reply_evt(struct hci_dev *hdev, struct sk_buff *skb)
Johan Hedberg03b555e2011-01-04 15:40:05 +02003943{
3944 struct hci_ev_io_capa_reply *ev = (void *) skb->data;
3945 struct hci_conn *conn;
3946
3947 BT_DBG("%s", hdev->name);
3948
3949 hci_dev_lock(hdev);
3950
3951 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3952 if (!conn)
3953 goto unlock;
3954
Johan Hedberg03b555e2011-01-04 15:40:05 +02003955 conn->remote_cap = ev->capability;
Johan Hedberg03b555e2011-01-04 15:40:05 +02003956 conn->remote_auth = ev->authentication;
Johan Hedberg58a681e2012-01-16 06:47:28 +02003957 if (ev->oob_data)
3958 set_bit(HCI_CONN_REMOTE_OOB, &conn->flags);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003959
3960unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02003961 hci_dev_unlock(hdev);
3962}
3963
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003964static void hci_user_confirm_request_evt(struct hci_dev *hdev,
3965 struct sk_buff *skb)
Johan Hedberga5c29682011-02-19 12:05:57 -03003966{
3967 struct hci_ev_user_confirm_req *ev = (void *) skb->data;
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003968 int loc_mitm, rem_mitm, confirm_hint = 0;
Johan Hedberg7a828902011-04-28 11:28:53 -07003969 struct hci_conn *conn;
Johan Hedberga5c29682011-02-19 12:05:57 -03003970
3971 BT_DBG("%s", hdev->name);
3972
3973 hci_dev_lock(hdev);
3974
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003975 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg7a828902011-04-28 11:28:53 -07003976 goto unlock;
Johan Hedberga5c29682011-02-19 12:05:57 -03003977
Johan Hedberg7a828902011-04-28 11:28:53 -07003978 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3979 if (!conn)
3980 goto unlock;
3981
3982 loc_mitm = (conn->auth_type & 0x01);
3983 rem_mitm = (conn->remote_auth & 0x01);
3984
3985 /* If we require MITM but the remote device can't provide that
Johan Hedberg6c538232014-07-11 15:32:23 +03003986 * (it has NoInputNoOutput) then reject the confirmation
3987 * request. We check the security level here since it doesn't
3988 * necessarily match conn->auth_type.
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003989 */
Johan Hedberg6c538232014-07-11 15:32:23 +03003990 if (conn->pending_sec_level > BT_SECURITY_MEDIUM &&
3991 conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) {
Johan Hedberg7a828902011-04-28 11:28:53 -07003992 BT_DBG("Rejecting request: remote device can't provide MITM");
3993 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003994 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07003995 goto unlock;
3996 }
3997
3998 /* If no side requires MITM protection; auto-accept */
Mikel Astiza7676312013-06-28 10:56:29 +02003999 if ((!loc_mitm || conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) &&
4000 (!rem_mitm || conn->io_capability == HCI_IO_NO_INPUT_OUTPUT)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004001
4002 /* If we're not the initiators request authorization to
4003 * proceed from user space (mgmt_user_confirm with
Johan Hedbergba15a582014-06-09 13:58:14 +03004004 * confirm_hint set to 1). The exception is if neither
Johan Hedberg02f3e252014-07-16 15:09:13 +03004005 * side had MITM or if the local IO capability is
4006 * NoInputNoOutput, in which case we do auto-accept
Johan Hedbergba15a582014-06-09 13:58:14 +03004007 */
4008 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) &&
Johan Hedberg02f3e252014-07-16 15:09:13 +03004009 conn->io_capability != HCI_IO_NO_INPUT_OUTPUT &&
Johan Hedbergba15a582014-06-09 13:58:14 +03004010 (loc_mitm || rem_mitm)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004011 BT_DBG("Confirming auto-accept as acceptor");
4012 confirm_hint = 1;
4013 goto confirm;
4014 }
4015
Johan Hedberg9f616562011-04-28 11:28:54 -07004016 BT_DBG("Auto-accept of user confirmation with %ums delay",
Gustavo Padovan807deac2012-05-17 00:36:24 -03004017 hdev->auto_accept_delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07004018
4019 if (hdev->auto_accept_delay > 0) {
4020 int delay = msecs_to_jiffies(hdev->auto_accept_delay);
Johan Hedberg7bc18d92013-10-16 18:11:39 +03004021 queue_delayed_work(conn->hdev->workqueue,
4022 &conn->auto_accept_work, delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07004023 goto unlock;
4024 }
4025
Johan Hedberg7a828902011-04-28 11:28:53 -07004026 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03004027 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07004028 goto unlock;
4029 }
4030
Johan Hedberg55bc1a32011-04-28 11:28:56 -07004031confirm:
Johan Hedberg39adbff2014-03-20 08:18:14 +02004032 mgmt_user_confirm_request(hdev, &ev->bdaddr, ACL_LINK, 0,
4033 le32_to_cpu(ev->passkey), confirm_hint);
Johan Hedberg7a828902011-04-28 11:28:53 -07004034
4035unlock:
Johan Hedberga5c29682011-02-19 12:05:57 -03004036 hci_dev_unlock(hdev);
4037}
4038
Gustavo Padovan6039aa732012-05-23 04:04:18 -03004039static void hci_user_passkey_request_evt(struct hci_dev *hdev,
4040 struct sk_buff *skb)
Brian Gix1143d452011-11-23 08:28:34 -08004041{
4042 struct hci_ev_user_passkey_req *ev = (void *) skb->data;
4043
4044 BT_DBG("%s", hdev->name);
4045
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02004046 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg272d90d2012-02-09 15:26:12 +02004047 mgmt_user_passkey_request(hdev, &ev->bdaddr, ACL_LINK, 0);
Brian Gix1143d452011-11-23 08:28:34 -08004048}
4049
Johan Hedberg92a25252012-09-06 18:39:26 +03004050static void hci_user_passkey_notify_evt(struct hci_dev *hdev,
4051 struct sk_buff *skb)
4052{
4053 struct hci_ev_user_passkey_notify *ev = (void *) skb->data;
4054 struct hci_conn *conn;
4055
4056 BT_DBG("%s", hdev->name);
4057
4058 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4059 if (!conn)
4060 return;
4061
4062 conn->passkey_notify = __le32_to_cpu(ev->passkey);
4063 conn->passkey_entered = 0;
4064
4065 if (test_bit(HCI_MGMT, &hdev->dev_flags))
4066 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
4067 conn->dst_type, conn->passkey_notify,
4068 conn->passkey_entered);
4069}
4070
4071static void hci_keypress_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
4072{
4073 struct hci_ev_keypress_notify *ev = (void *) skb->data;
4074 struct hci_conn *conn;
4075
4076 BT_DBG("%s", hdev->name);
4077
4078 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4079 if (!conn)
4080 return;
4081
4082 switch (ev->type) {
4083 case HCI_KEYPRESS_STARTED:
4084 conn->passkey_entered = 0;
4085 return;
4086
4087 case HCI_KEYPRESS_ENTERED:
4088 conn->passkey_entered++;
4089 break;
4090
4091 case HCI_KEYPRESS_ERASED:
4092 conn->passkey_entered--;
4093 break;
4094
4095 case HCI_KEYPRESS_CLEARED:
4096 conn->passkey_entered = 0;
4097 break;
4098
4099 case HCI_KEYPRESS_COMPLETED:
4100 return;
4101 }
4102
4103 if (test_bit(HCI_MGMT, &hdev->dev_flags))
4104 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
4105 conn->dst_type, conn->passkey_notify,
4106 conn->passkey_entered);
4107}
4108
Gustavo Padovan6039aa732012-05-23 04:04:18 -03004109static void hci_simple_pair_complete_evt(struct hci_dev *hdev,
4110 struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02004111{
4112 struct hci_ev_simple_pair_complete *ev = (void *) skb->data;
4113 struct hci_conn *conn;
4114
4115 BT_DBG("%s", hdev->name);
4116
4117 hci_dev_lock(hdev);
4118
4119 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg2a611692011-02-19 12:06:00 -03004120 if (!conn)
4121 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02004122
Johan Hedbergc1d4fa72014-07-17 15:14:50 +03004123 /* Reset the authentication requirement to unknown */
4124 conn->remote_auth = 0xff;
4125
Johan Hedberg2a611692011-02-19 12:06:00 -03004126 /* To avoid duplicate auth_failed events to user space we check
4127 * the HCI_CONN_AUTH_PEND flag which will be set if we
4128 * initiated the authentication. A traditional auth_complete
4129 * event gets always produced as initiator and is also mapped to
4130 * the mgmt_auth_failed event */
Mikel Astizfa1bd912012-08-09 09:52:29 +02004131 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) && ev->status)
Johan Hedberge1e930f2014-09-08 17:09:49 -07004132 mgmt_auth_failed(conn, ev->status);
Johan Hedberg2a611692011-02-19 12:06:00 -03004133
David Herrmann76a68ba2013-04-06 20:28:37 +02004134 hci_conn_drop(conn);
Johan Hedberg2a611692011-02-19 12:06:00 -03004135
4136unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02004137 hci_dev_unlock(hdev);
4138}
4139
Gustavo Padovan6039aa732012-05-23 04:04:18 -03004140static void hci_remote_host_features_evt(struct hci_dev *hdev,
4141 struct sk_buff *skb)
Marcel Holtmann41a96212008-07-14 20:13:48 +02004142{
4143 struct hci_ev_remote_host_features *ev = (void *) skb->data;
4144 struct inquiry_entry *ie;
Johan Hedbergcad718e2013-04-17 15:00:51 +03004145 struct hci_conn *conn;
Marcel Holtmann41a96212008-07-14 20:13:48 +02004146
4147 BT_DBG("%s", hdev->name);
4148
4149 hci_dev_lock(hdev);
4150
Johan Hedbergcad718e2013-04-17 15:00:51 +03004151 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
4152 if (conn)
4153 memcpy(conn->features[1], ev->features, 8);
4154
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02004155 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
4156 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02004157 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann41a96212008-07-14 20:13:48 +02004158
4159 hci_dev_unlock(hdev);
4160}
4161
Gustavo Padovan6039aa732012-05-23 04:04:18 -03004162static void hci_remote_oob_data_request_evt(struct hci_dev *hdev,
4163 struct sk_buff *skb)
Szymon Janc2763eda2011-03-22 13:12:22 +01004164{
4165 struct hci_ev_remote_oob_data_request *ev = (void *) skb->data;
4166 struct oob_data *data;
4167
4168 BT_DBG("%s", hdev->name);
4169
4170 hci_dev_lock(hdev);
4171
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02004172 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Szymon Jance1ba1f12011-04-06 13:01:59 +02004173 goto unlock;
4174
Johan Hedberg6928a922014-10-26 20:46:09 +01004175 data = hci_find_remote_oob_data(hdev, &ev->bdaddr, BDADDR_BREDR);
Marcel Holtmann6665d052015-01-27 16:04:31 -08004176 if (!data) {
Szymon Janc2763eda2011-03-22 13:12:22 +01004177 struct hci_cp_remote_oob_data_neg_reply cp;
4178
4179 bacpy(&cp.bdaddr, &ev->bdaddr);
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08004180 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_NEG_REPLY,
4181 sizeof(cp), &cp);
Marcel Holtmann6665d052015-01-27 16:04:31 -08004182 goto unlock;
4183 }
4184
4185 if (bredr_sc_enabled(hdev)) {
4186 struct hci_cp_remote_oob_ext_data_reply cp;
4187
4188 bacpy(&cp.bdaddr, &ev->bdaddr);
4189 if (test_bit(HCI_SC_ONLY, &hdev->dev_flags)) {
4190 memset(cp.hash192, 0, sizeof(cp.hash192));
4191 memset(cp.rand192, 0, sizeof(cp.rand192));
4192 } else {
4193 memcpy(cp.hash192, data->hash192, sizeof(cp.hash192));
4194 memcpy(cp.rand192, data->rand192, sizeof(cp.rand192));
4195 }
4196 memcpy(cp.hash256, data->hash256, sizeof(cp.hash256));
4197 memcpy(cp.rand256, data->rand256, sizeof(cp.rand256));
4198
4199 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_EXT_DATA_REPLY,
4200 sizeof(cp), &cp);
4201 } else {
4202 struct hci_cp_remote_oob_data_reply cp;
4203
4204 bacpy(&cp.bdaddr, &ev->bdaddr);
4205 memcpy(cp.hash, data->hash192, sizeof(cp.hash));
4206 memcpy(cp.rand, data->rand192, sizeof(cp.rand));
4207
4208 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_REPLY,
4209 sizeof(cp), &cp);
Szymon Janc2763eda2011-03-22 13:12:22 +01004210 }
4211
Szymon Jance1ba1f12011-04-06 13:01:59 +02004212unlock:
Szymon Janc2763eda2011-03-22 13:12:22 +01004213 hci_dev_unlock(hdev);
4214}
4215
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004216static void hci_phy_link_complete_evt(struct hci_dev *hdev,
4217 struct sk_buff *skb)
4218{
4219 struct hci_ev_phy_link_complete *ev = (void *) skb->data;
4220 struct hci_conn *hcon, *bredr_hcon;
4221
4222 BT_DBG("%s handle 0x%2.2x status 0x%2.2x", hdev->name, ev->phy_handle,
4223 ev->status);
4224
4225 hci_dev_lock(hdev);
4226
4227 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4228 if (!hcon) {
4229 hci_dev_unlock(hdev);
4230 return;
4231 }
4232
4233 if (ev->status) {
4234 hci_conn_del(hcon);
4235 hci_dev_unlock(hdev);
4236 return;
4237 }
4238
4239 bredr_hcon = hcon->amp_mgr->l2cap_conn->hcon;
4240
4241 hcon->state = BT_CONNECTED;
4242 bacpy(&hcon->dst, &bredr_hcon->dst);
4243
4244 hci_conn_hold(hcon);
4245 hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02004246 hci_conn_drop(hcon);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004247
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01004248 hci_debugfs_create_conn(hcon);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004249 hci_conn_add_sysfs(hcon);
4250
Andrei Emeltchenkocf70ff22012-10-31 15:46:36 +02004251 amp_physical_cfm(bredr_hcon, hcon);
4252
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004253 hci_dev_unlock(hdev);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004254}
4255
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004256static void hci_loglink_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
4257{
4258 struct hci_ev_logical_link_complete *ev = (void *) skb->data;
4259 struct hci_conn *hcon;
4260 struct hci_chan *hchan;
4261 struct amp_mgr *mgr;
4262
4263 BT_DBG("%s log_handle 0x%4.4x phy_handle 0x%2.2x status 0x%2.2x",
4264 hdev->name, le16_to_cpu(ev->handle), ev->phy_handle,
4265 ev->status);
4266
4267 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4268 if (!hcon)
4269 return;
4270
4271 /* Create AMP hchan */
4272 hchan = hci_chan_create(hcon);
4273 if (!hchan)
4274 return;
4275
4276 hchan->handle = le16_to_cpu(ev->handle);
4277
4278 BT_DBG("hcon %p mgr %p hchan %p", hcon, hcon->amp_mgr, hchan);
4279
4280 mgr = hcon->amp_mgr;
4281 if (mgr && mgr->bredr_chan) {
4282 struct l2cap_chan *bredr_chan = mgr->bredr_chan;
4283
4284 l2cap_chan_lock(bredr_chan);
4285
4286 bredr_chan->conn->mtu = hdev->block_mtu;
4287 l2cap_logical_cfm(bredr_chan, hchan, 0);
4288 hci_conn_hold(hcon);
4289
4290 l2cap_chan_unlock(bredr_chan);
4291 }
4292}
4293
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02004294static void hci_disconn_loglink_complete_evt(struct hci_dev *hdev,
4295 struct sk_buff *skb)
4296{
4297 struct hci_ev_disconn_logical_link_complete *ev = (void *) skb->data;
4298 struct hci_chan *hchan;
4299
4300 BT_DBG("%s log handle 0x%4.4x status 0x%2.2x", hdev->name,
4301 le16_to_cpu(ev->handle), ev->status);
4302
4303 if (ev->status)
4304 return;
4305
4306 hci_dev_lock(hdev);
4307
4308 hchan = hci_chan_lookup_handle(hdev, le16_to_cpu(ev->handle));
4309 if (!hchan)
4310 goto unlock;
4311
4312 amp_destroy_logical_link(hchan, ev->reason);
4313
4314unlock:
4315 hci_dev_unlock(hdev);
4316}
4317
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02004318static void hci_disconn_phylink_complete_evt(struct hci_dev *hdev,
4319 struct sk_buff *skb)
4320{
4321 struct hci_ev_disconn_phy_link_complete *ev = (void *) skb->data;
4322 struct hci_conn *hcon;
4323
4324 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4325
4326 if (ev->status)
4327 return;
4328
4329 hci_dev_lock(hdev);
4330
4331 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4332 if (hcon) {
4333 hcon->state = BT_CLOSED;
4334 hci_conn_del(hcon);
4335 }
4336
4337 hci_dev_unlock(hdev);
4338}
4339
Gustavo Padovan6039aa732012-05-23 04:04:18 -03004340static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03004341{
4342 struct hci_ev_le_conn_complete *ev = (void *) skb->data;
Johan Hedberg912b42e2014-07-03 19:33:49 +03004343 struct hci_conn_params *params;
Ville Tervofcd89c02011-02-10 22:38:47 -03004344 struct hci_conn *conn;
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004345 struct smp_irk *irk;
Johan Hedberg837d5022014-07-02 09:36:22 +03004346 u8 addr_type;
Ville Tervofcd89c02011-02-10 22:38:47 -03004347
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004348 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Ville Tervofcd89c02011-02-10 22:38:47 -03004349
4350 hci_dev_lock(hdev);
4351
Johan Hedbergfbd96c12014-07-08 17:21:51 +03004352 /* All controllers implicitly stop advertising in the event of a
4353 * connection, so ensure that the state bit is cleared.
4354 */
4355 clear_bit(HCI_LE_ADV, &hdev->dev_flags);
4356
Andre Guedesb47a09b2012-07-27 15:10:15 -03004357 conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
Ville Tervob62f3282011-02-10 22:38:50 -03004358 if (!conn) {
Johan Hedberga5c4e302014-07-16 11:56:07 +03004359 conn = hci_conn_add(hdev, LE_LINK, &ev->bdaddr, ev->role);
Ville Tervob62f3282011-02-10 22:38:50 -03004360 if (!conn) {
4361 BT_ERR("No memory for new connection");
Andre Guedes230fd162012-07-27 15:10:10 -03004362 goto unlock;
Ville Tervob62f3282011-02-10 22:38:50 -03004363 }
Andre Guedes29b79882011-05-31 14:20:54 -03004364
4365 conn->dst_type = ev->bdaddr_type;
Andre Guedesb9b343d2012-07-27 15:10:11 -03004366
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004367 /* If we didn't have a hci_conn object previously
4368 * but we're in master role this must be something
4369 * initiated using a white list. Since white list based
4370 * connections are not "first class citizens" we don't
4371 * have full tracking of them. Therefore, we go ahead
4372 * with a "best effort" approach of determining the
4373 * initiator address based on the HCI_PRIVACY flag.
4374 */
4375 if (conn->out) {
4376 conn->resp_addr_type = ev->bdaddr_type;
4377 bacpy(&conn->resp_addr, &ev->bdaddr);
4378 if (test_bit(HCI_PRIVACY, &hdev->dev_flags)) {
4379 conn->init_addr_type = ADDR_LE_DEV_RANDOM;
4380 bacpy(&conn->init_addr, &hdev->rpa);
4381 } else {
4382 hci_copy_identity_address(hdev,
4383 &conn->init_addr,
4384 &conn->init_addr_type);
4385 }
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004386 }
Johan Hedberg9489eca2014-02-28 17:45:46 +02004387 } else {
4388 cancel_delayed_work(&conn->le_conn_timeout);
Ville Tervob62f3282011-02-10 22:38:50 -03004389 }
Ville Tervofcd89c02011-02-10 22:38:47 -03004390
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004391 if (!conn->out) {
4392 /* Set the responder (our side) address type based on
4393 * the advertising address type.
4394 */
4395 conn->resp_addr_type = hdev->adv_addr_type;
4396 if (hdev->adv_addr_type == ADDR_LE_DEV_RANDOM)
4397 bacpy(&conn->resp_addr, &hdev->random_addr);
4398 else
4399 bacpy(&conn->resp_addr, &hdev->bdaddr);
4400
4401 conn->init_addr_type = ev->bdaddr_type;
4402 bacpy(&conn->init_addr, &ev->bdaddr);
Marcel Holtmanna720d732014-06-23 12:14:51 +02004403
4404 /* For incoming connections, set the default minimum
4405 * and maximum connection interval. They will be used
4406 * to check if the parameters are in range and if not
4407 * trigger the connection update procedure.
4408 */
4409 conn->le_conn_min_interval = hdev->le_conn_min_interval;
4410 conn->le_conn_max_interval = hdev->le_conn_max_interval;
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004411 }
Johan Hedberg7be2edb2014-02-23 19:42:17 +02004412
Marcel Holtmannedb4b462014-02-18 15:13:43 -08004413 /* Lookup the identity address from the stored connection
4414 * address and address type.
4415 *
4416 * When establishing connections to an identity address, the
4417 * connection procedure will store the resolvable random
4418 * address first. Now if it can be converted back into the
4419 * identity address, start using the identity address from
4420 * now on.
4421 */
4422 irk = hci_get_irk(hdev, &conn->dst, conn->dst_type);
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004423 if (irk) {
4424 bacpy(&conn->dst, &irk->bdaddr);
4425 conn->dst_type = irk->addr_type;
4426 }
4427
Johan Hedberg2d3c2262014-07-15 11:51:28 +03004428 if (ev->status) {
4429 hci_le_conn_failed(conn, ev->status);
Johan Hedberg837d5022014-07-02 09:36:22 +03004430 goto unlock;
4431 }
4432
Johan Hedberg08853f12014-08-15 21:06:55 +03004433 if (conn->dst_type == ADDR_LE_DEV_PUBLIC)
4434 addr_type = BDADDR_LE_PUBLIC;
4435 else
4436 addr_type = BDADDR_LE_RANDOM;
4437
Johan Hedberg2d3c2262014-07-15 11:51:28 +03004438 /* Drop the connection if the device is blocked */
4439 if (hci_bdaddr_list_lookup(&hdev->blacklist, &conn->dst, addr_type)) {
4440 hci_conn_drop(conn);
Andre Guedescd17dec2012-07-27 15:10:16 -03004441 goto unlock;
4442 }
4443
Johan Hedbergb644ba32012-01-17 21:48:47 +02004444 if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Alfonso Acosta48ec92f2014-10-07 08:44:10 +00004445 mgmt_device_connected(hdev, conn, 0, NULL, 0);
Vinicius Costa Gomes83bc71b2011-05-06 18:41:43 -03004446
Vinicius Costa Gomes7b5c0d52011-06-09 18:50:50 -03004447 conn->sec_level = BT_SECURITY_LOW;
Ville Tervofcd89c02011-02-10 22:38:47 -03004448 conn->handle = __le16_to_cpu(ev->handle);
4449 conn->state = BT_CONNECTED;
4450
Marcel Holtmanne04fde62014-06-23 11:40:04 +02004451 conn->le_conn_interval = le16_to_cpu(ev->interval);
4452 conn->le_conn_latency = le16_to_cpu(ev->latency);
4453 conn->le_supv_timeout = le16_to_cpu(ev->supervision_timeout);
4454
Marcel Holtmann23b9ceb2014-12-20 17:13:41 +01004455 hci_debugfs_create_conn(conn);
Ville Tervofcd89c02011-02-10 22:38:47 -03004456 hci_conn_add_sysfs(conn);
4457
4458 hci_proto_connect_cfm(conn, ev->status);
4459
Johan Hedberg54776102014-08-15 21:06:56 +03004460 params = hci_pend_le_action_lookup(&hdev->pend_le_conns, &conn->dst,
4461 conn->dst_type);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004462 if (params) {
Johan Hedberg95305ba2014-07-04 12:37:21 +03004463 list_del_init(&params->action);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004464 if (params->conn) {
4465 hci_conn_drop(params->conn);
Johan Hedbergf8aaf9b2014-08-17 23:28:57 +03004466 hci_conn_put(params->conn);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004467 params->conn = NULL;
4468 }
4469 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004470
Ville Tervofcd89c02011-02-10 22:38:47 -03004471unlock:
Johan Hedberg223683a2014-07-06 15:44:23 +03004472 hci_update_background_scan(hdev);
Ville Tervofcd89c02011-02-10 22:38:47 -03004473 hci_dev_unlock(hdev);
4474}
4475
Marcel Holtmann1855d922014-06-23 11:40:05 +02004476static void hci_le_conn_update_complete_evt(struct hci_dev *hdev,
4477 struct sk_buff *skb)
4478{
4479 struct hci_ev_le_conn_update_complete *ev = (void *) skb->data;
4480 struct hci_conn *conn;
4481
4482 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4483
4484 if (ev->status)
4485 return;
4486
4487 hci_dev_lock(hdev);
4488
4489 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
4490 if (conn) {
4491 conn->le_conn_interval = le16_to_cpu(ev->interval);
4492 conn->le_conn_latency = le16_to_cpu(ev->latency);
4493 conn->le_supv_timeout = le16_to_cpu(ev->supervision_timeout);
4494 }
4495
4496 hci_dev_unlock(hdev);
4497}
4498
Andre Guedesa4790db2014-02-26 20:21:47 -03004499/* This function requires the caller holds hdev->lock */
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004500static struct hci_conn *check_pending_le_conn(struct hci_dev *hdev,
4501 bdaddr_t *addr,
4502 u8 addr_type, u8 adv_type)
Andre Guedesa4790db2014-02-26 20:21:47 -03004503{
4504 struct hci_conn *conn;
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004505 struct hci_conn_params *params;
Andre Guedesa4790db2014-02-26 20:21:47 -03004506
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004507 /* If the event is not connectable don't proceed further */
4508 if (adv_type != LE_ADV_IND && adv_type != LE_ADV_DIRECT_IND)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004509 return NULL;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004510
4511 /* Ignore if the device is blocked */
Johan Hedbergdcc36c12014-07-09 12:59:13 +03004512 if (hci_bdaddr_list_lookup(&hdev->blacklist, addr, addr_type))
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004513 return NULL;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004514
Johan Hedbergf99353c2014-07-16 11:56:09 +03004515 /* Most controller will fail if we try to create new connections
4516 * while we have an existing one in slave role.
4517 */
4518 if (hdev->conn_hash.le_num_slave > 0)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004519 return NULL;
Johan Hedbergf99353c2014-07-16 11:56:09 +03004520
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004521 /* If we're not connectable only connect devices that we have in
4522 * our pend_le_conns list.
4523 */
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004524 params = hci_pend_le_action_lookup(&hdev->pend_le_conns,
4525 addr, addr_type);
4526 if (!params)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004527 return NULL;
Andre Guedesa4790db2014-02-26 20:21:47 -03004528
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004529 switch (params->auto_connect) {
4530 case HCI_AUTO_CONN_DIRECT:
4531 /* Only devices advertising with ADV_DIRECT_IND are
4532 * triggering a connection attempt. This is allowing
4533 * incoming connections from slave devices.
4534 */
4535 if (adv_type != LE_ADV_DIRECT_IND)
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004536 return NULL;
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004537 break;
4538 case HCI_AUTO_CONN_ALWAYS:
4539 /* Devices advertising with ADV_IND or ADV_DIRECT_IND
4540 * are triggering a connection attempt. This means
4541 * that incoming connectioms from slave device are
4542 * accepted and also outgoing connections to slave
4543 * devices are established when found.
4544 */
4545 break;
4546 default:
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004547 return NULL;
Marcel Holtmann4b9e7e72014-07-23 21:55:23 +02004548 }
4549
Andre Guedesa4790db2014-02-26 20:21:47 -03004550 conn = hci_connect_le(hdev, addr, addr_type, BT_SECURITY_LOW,
Johan Hedberge804d252014-07-16 11:42:28 +03004551 HCI_LE_AUTOCONN_TIMEOUT, HCI_ROLE_MASTER);
Johan Hedbergf161dd42014-08-15 21:06:54 +03004552 if (!IS_ERR(conn)) {
4553 /* Store the pointer since we don't really have any
4554 * other owner of the object besides the params that
4555 * triggered it. This way we can abort the connection if
4556 * the parameters get removed and keep the reference
4557 * count consistent once the connection is established.
4558 */
Johan Hedbergf8aaf9b2014-08-17 23:28:57 +03004559 params->conn = hci_conn_get(conn);
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004560 return conn;
Johan Hedbergf161dd42014-08-15 21:06:54 +03004561 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004562
4563 switch (PTR_ERR(conn)) {
4564 case -EBUSY:
4565 /* If hci_connect() returns -EBUSY it means there is already
4566 * an LE connection attempt going on. Since controllers don't
4567 * support more than one connection attempt at the time, we
4568 * don't consider this an error case.
4569 */
4570 break;
4571 default:
4572 BT_DBG("Failed to connect: err %ld", PTR_ERR(conn));
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004573 return NULL;
Andre Guedesa4790db2014-02-26 20:21:47 -03004574 }
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004575
4576 return NULL;
Andre Guedesa4790db2014-02-26 20:21:47 -03004577}
4578
Johan Hedberg4af605d2014-03-24 10:48:00 +02004579static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr,
Marcel Holtmann2f010b52014-12-05 16:20:13 +01004580 u8 bdaddr_type, bdaddr_t *direct_addr,
4581 u8 direct_addr_type, s8 rssi, u8 *data, u8 len)
Johan Hedberg4af605d2014-03-24 10:48:00 +02004582{
Johan Hedbergb9a63282014-03-25 10:51:52 +02004583 struct discovery_state *d = &hdev->discovery;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004584 struct smp_irk *irk;
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004585 struct hci_conn *conn;
Johan Hedberg474ee062014-03-25 14:34:59 +02004586 bool match;
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004587 u32 flags;
Johan Hedbergb9a63282014-03-25 10:51:52 +02004588
Marcel Holtmann2f010b52014-12-05 16:20:13 +01004589 /* If the direct address is present, then this report is from
4590 * a LE Direct Advertising Report event. In that case it is
4591 * important to see if the address is matching the local
4592 * controller address.
4593 */
4594 if (direct_addr) {
4595 /* Only resolvable random addresses are valid for these
4596 * kind of reports and others can be ignored.
4597 */
4598 if (!hci_bdaddr_is_rpa(direct_addr, direct_addr_type))
4599 return;
4600
4601 /* If the controller is not using resolvable random
4602 * addresses, then this report can be ignored.
4603 */
4604 if (!test_bit(HCI_PRIVACY, &hdev->dev_flags))
4605 return;
4606
4607 /* If the local IRK of the controller does not match
4608 * with the resolvable random address provided, then
4609 * this report can be ignored.
4610 */
4611 if (!smp_irk_matches(hdev, hdev->irk, direct_addr))
4612 return;
4613 }
4614
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004615 /* Check if we need to convert to identity address */
4616 irk = hci_get_irk(hdev, bdaddr, bdaddr_type);
4617 if (irk) {
4618 bdaddr = &irk->bdaddr;
4619 bdaddr_type = irk->addr_type;
4620 }
4621
4622 /* Check if we have been requested to connect to this device */
Alfonso Acostafd45ada2014-10-07 08:44:11 +00004623 conn = check_pending_le_conn(hdev, bdaddr, bdaddr_type, type);
4624 if (conn && type == LE_ADV_IND) {
4625 /* Store report for later inclusion by
4626 * mgmt_device_connected
4627 */
4628 memcpy(conn->le_adv_data, data, len);
4629 conn->le_adv_data_len = len;
4630 }
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004631
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004632 /* Passive scanning shouldn't trigger any device found events,
4633 * except for devices marked as CONN_REPORT for which we do send
4634 * device found events.
4635 */
Johan Hedbergca5c4be2014-03-25 10:30:46 +02004636 if (hdev->le_scan_type == LE_SCAN_PASSIVE) {
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004637 if (type == LE_ADV_DIRECT_IND)
4638 return;
4639
Johan Hedberg3a19b6f2014-07-15 08:07:59 +03004640 if (!hci_pend_le_action_lookup(&hdev->pend_le_reports,
4641 bdaddr, bdaddr_type))
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004642 return;
4643
4644 if (type == LE_ADV_NONCONN_IND || type == LE_ADV_SCAN_IND)
4645 flags = MGMT_DEV_FOUND_NOT_CONNECTABLE;
4646 else
4647 flags = 0;
4648 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
4649 rssi, flags, data, len, NULL, 0);
Johan Hedberg97bf2e92014-07-04 12:37:16 +03004650 return;
Johan Hedbergca5c4be2014-03-25 10:30:46 +02004651 }
Johan Hedberg4af605d2014-03-24 10:48:00 +02004652
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004653 /* When receiving non-connectable or scannable undirected
4654 * advertising reports, this means that the remote device is
4655 * not connectable and then clearly indicate this in the
4656 * device found event.
4657 *
4658 * When receiving a scan response, then there is no way to
4659 * know if the remote device is connectable or not. However
4660 * since scan responses are merged with a previously seen
4661 * advertising report, the flags field from that report
4662 * will be used.
4663 *
4664 * In the really unlikely case that a controller get confused
4665 * and just sends a scan response event, then it is marked as
4666 * not connectable as well.
4667 */
4668 if (type == LE_ADV_NONCONN_IND || type == LE_ADV_SCAN_IND ||
4669 type == LE_ADV_SCAN_RSP)
4670 flags = MGMT_DEV_FOUND_NOT_CONNECTABLE;
4671 else
4672 flags = 0;
4673
Johan Hedbergb9a63282014-03-25 10:51:52 +02004674 /* If there's nothing pending either store the data from this
4675 * event or send an immediate device found event if the data
4676 * should not be stored for later.
4677 */
4678 if (!has_pending_adv_report(hdev)) {
4679 /* If the report will trigger a SCAN_REQ store it for
4680 * later merging.
4681 */
4682 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
4683 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004684 rssi, flags, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004685 return;
4686 }
4687
4688 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004689 rssi, flags, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004690 return;
4691 }
4692
Johan Hedberg474ee062014-03-25 14:34:59 +02004693 /* Check if the pending report is for the same device as the new one */
4694 match = (!bacmp(bdaddr, &d->last_adv_addr) &&
4695 bdaddr_type == d->last_adv_addr_type);
4696
Johan Hedbergb9a63282014-03-25 10:51:52 +02004697 /* If the pending data doesn't match this report or this isn't a
4698 * scan response (e.g. we got a duplicate ADV_IND) then force
4699 * sending of the pending data.
4700 */
Johan Hedberg474ee062014-03-25 14:34:59 +02004701 if (type != LE_ADV_SCAN_RSP || !match) {
4702 /* Send out whatever is in the cache, but skip duplicates */
4703 if (!match)
4704 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004705 d->last_adv_addr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004706 d->last_adv_rssi, d->last_adv_flags,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004707 d->last_adv_data,
Johan Hedberg474ee062014-03-25 14:34:59 +02004708 d->last_adv_data_len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004709
4710 /* If the new report will trigger a SCAN_REQ store it for
4711 * later merging.
4712 */
4713 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
4714 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004715 rssi, flags, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004716 return;
4717 }
4718
4719 /* The advertising reports cannot be merged, so clear
4720 * the pending report and send out a device found event.
4721 */
4722 clear_pending_adv_report(hdev);
Johan Hedberg5c5b93e2014-03-29 08:39:53 +02004723 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004724 rssi, flags, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004725 return;
4726 }
4727
4728 /* If we get here we've got a pending ADV_IND or ADV_SCAN_IND and
4729 * the new event is a SCAN_RSP. We can therefore proceed with
4730 * sending a merged device found event.
4731 */
4732 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004733 d->last_adv_addr_type, NULL, rssi, d->last_adv_flags,
Marcel Holtmann42bd6a52014-07-01 14:11:19 +02004734 d->last_adv_data, d->last_adv_data_len, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004735 clear_pending_adv_report(hdev);
Johan Hedberg4af605d2014-03-24 10:48:00 +02004736}
4737
Gustavo Padovan6039aa732012-05-23 04:04:18 -03004738static void hci_le_adv_report_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andre Guedes9aa04c92011-05-26 16:23:51 -03004739{
Andre Guedese95beb42011-09-26 20:48:35 -03004740 u8 num_reports = skb->data[0];
4741 void *ptr = &skb->data[1];
Andre Guedes9aa04c92011-05-26 16:23:51 -03004742
Andre Guedesa4790db2014-02-26 20:21:47 -03004743 hci_dev_lock(hdev);
4744
Andre Guedese95beb42011-09-26 20:48:35 -03004745 while (num_reports--) {
4746 struct hci_ev_le_advertising_info *ev = ptr;
Johan Hedberg4af605d2014-03-24 10:48:00 +02004747 s8 rssi;
Andre Guedesa4790db2014-02-26 20:21:47 -03004748
Andre Guedes3c9e9192012-01-10 18:20:50 -03004749 rssi = ev->data[ev->length];
Johan Hedberg4af605d2014-03-24 10:48:00 +02004750 process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
Marcel Holtmann2f010b52014-12-05 16:20:13 +01004751 ev->bdaddr_type, NULL, 0, rssi,
4752 ev->data, ev->length);
Andre Guedes3c9e9192012-01-10 18:20:50 -03004753
Andre Guedese95beb42011-09-26 20:48:35 -03004754 ptr += sizeof(*ev) + ev->length + 1;
Andre Guedes9aa04c92011-05-26 16:23:51 -03004755 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004756
4757 hci_dev_unlock(hdev);
Andre Guedes9aa04c92011-05-26 16:23:51 -03004758}
4759
Gustavo Padovan6039aa732012-05-23 04:04:18 -03004760static void hci_le_ltk_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004761{
4762 struct hci_ev_le_ltk_req *ev = (void *) skb->data;
4763 struct hci_cp_le_ltk_reply cp;
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004764 struct hci_cp_le_ltk_neg_reply neg;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004765 struct hci_conn *conn;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004766 struct smp_ltk *ltk;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004767
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004768 BT_DBG("%s handle 0x%4.4x", hdev->name, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004769
4770 hci_dev_lock(hdev);
4771
4772 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004773 if (conn == NULL)
4774 goto not_found;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004775
Johan Hedbergf3a73d92014-05-29 15:02:59 +03004776 ltk = hci_find_ltk(hdev, &conn->dst, conn->dst_type, conn->role);
Johan Hedberg5378bc52014-05-29 14:00:39 +03004777 if (!ltk)
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004778 goto not_found;
4779
Johan Hedberg5378bc52014-05-29 14:00:39 +03004780 if (smp_ltk_is_sc(ltk)) {
4781 /* With SC both EDiv and Rand are set to zero */
4782 if (ev->ediv || ev->rand)
4783 goto not_found;
4784 } else {
4785 /* For non-SC keys check that EDiv and Rand match */
4786 if (ev->ediv != ltk->ediv || ev->rand != ltk->rand)
4787 goto not_found;
4788 }
4789
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004790 memcpy(cp.ltk, ltk->val, sizeof(ltk->val));
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004791 cp.handle = cpu_to_le16(conn->handle);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004792
Johan Hedberga6f78332014-09-10 17:37:45 -07004793 conn->pending_sec_level = smp_ltk_sec_level(ltk);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004794
Andre Guedes89cbb4d2013-07-31 16:25:29 -03004795 conn->enc_key_size = ltk->enc_size;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004796
4797 hci_send_cmd(hdev, HCI_OP_LE_LTK_REPLY, sizeof(cp), &cp);
4798
Claudio Takahasi5981a882013-07-25 16:34:24 -03004799 /* Ref. Bluetooth Core SPEC pages 1975 and 2004. STK is a
4800 * temporary key used to encrypt a connection following
4801 * pairing. It is used during the Encrypted Session Setup to
4802 * distribute the keys. Later, security can be re-established
4803 * using a distributed LTK.
4804 */
Johan Hedberg2ceba532014-06-16 19:25:16 +03004805 if (ltk->type == SMP_STK) {
Johan Hedbergfe59a052014-07-01 19:14:12 +03004806 set_bit(HCI_CONN_STK_ENCRYPT, &conn->flags);
Johan Hedberg970d0f12014-11-13 14:37:47 +02004807 list_del_rcu(&ltk->list);
4808 kfree_rcu(ltk, rcu);
Johan Hedbergfe59a052014-07-01 19:14:12 +03004809 } else {
4810 clear_bit(HCI_CONN_STK_ENCRYPT, &conn->flags);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004811 }
4812
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004813 hci_dev_unlock(hdev);
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004814
4815 return;
4816
4817not_found:
4818 neg.handle = ev->handle;
4819 hci_send_cmd(hdev, HCI_OP_LE_LTK_NEG_REPLY, sizeof(neg), &neg);
4820 hci_dev_unlock(hdev);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004821}
4822
Andre Guedes8e75b462014-07-01 18:10:08 -03004823static void send_conn_param_neg_reply(struct hci_dev *hdev, u16 handle,
4824 u8 reason)
4825{
4826 struct hci_cp_le_conn_param_req_neg_reply cp;
4827
4828 cp.handle = cpu_to_le16(handle);
4829 cp.reason = reason;
4830
4831 hci_send_cmd(hdev, HCI_OP_LE_CONN_PARAM_REQ_NEG_REPLY, sizeof(cp),
4832 &cp);
4833}
4834
4835static void hci_le_remote_conn_param_req_evt(struct hci_dev *hdev,
4836 struct sk_buff *skb)
4837{
4838 struct hci_ev_le_remote_conn_param_req *ev = (void *) skb->data;
4839 struct hci_cp_le_conn_param_req_reply cp;
4840 struct hci_conn *hcon;
4841 u16 handle, min, max, latency, timeout;
4842
4843 handle = le16_to_cpu(ev->handle);
4844 min = le16_to_cpu(ev->interval_min);
4845 max = le16_to_cpu(ev->interval_max);
4846 latency = le16_to_cpu(ev->latency);
4847 timeout = le16_to_cpu(ev->timeout);
4848
4849 hcon = hci_conn_hash_lookup_handle(hdev, handle);
4850 if (!hcon || hcon->state != BT_CONNECTED)
4851 return send_conn_param_neg_reply(hdev, handle,
4852 HCI_ERROR_UNKNOWN_CONN_ID);
4853
4854 if (hci_check_conn_params(min, max, latency, timeout))
4855 return send_conn_param_neg_reply(hdev, handle,
4856 HCI_ERROR_INVALID_LL_PARAMS);
4857
Johan Hedberg40bef302014-07-16 11:42:27 +03004858 if (hcon->role == HCI_ROLE_MASTER) {
Johan Hedberg348d50b2014-07-02 17:37:30 +03004859 struct hci_conn_params *params;
Johan Hedbergf4869e22014-07-02 17:37:32 +03004860 u8 store_hint;
Johan Hedberg348d50b2014-07-02 17:37:30 +03004861
4862 hci_dev_lock(hdev);
4863
4864 params = hci_conn_params_lookup(hdev, &hcon->dst,
4865 hcon->dst_type);
4866 if (params) {
4867 params->conn_min_interval = min;
4868 params->conn_max_interval = max;
4869 params->conn_latency = latency;
4870 params->supervision_timeout = timeout;
Johan Hedbergf4869e22014-07-02 17:37:32 +03004871 store_hint = 0x01;
4872 } else{
4873 store_hint = 0x00;
Johan Hedberg348d50b2014-07-02 17:37:30 +03004874 }
4875
4876 hci_dev_unlock(hdev);
4877
Johan Hedbergf4869e22014-07-02 17:37:32 +03004878 mgmt_new_conn_param(hdev, &hcon->dst, hcon->dst_type,
4879 store_hint, min, max, latency, timeout);
Johan Hedberg348d50b2014-07-02 17:37:30 +03004880 }
Andre Guedesffb5a8272014-07-01 18:10:11 -03004881
Andre Guedes8e75b462014-07-01 18:10:08 -03004882 cp.handle = ev->handle;
4883 cp.interval_min = ev->interval_min;
4884 cp.interval_max = ev->interval_max;
4885 cp.latency = ev->latency;
4886 cp.timeout = ev->timeout;
4887 cp.min_ce_len = 0;
4888 cp.max_ce_len = 0;
4889
4890 hci_send_cmd(hdev, HCI_OP_LE_CONN_PARAM_REQ_REPLY, sizeof(cp), &cp);
4891}
4892
Marcel Holtmann2f010b52014-12-05 16:20:13 +01004893static void hci_le_direct_adv_report_evt(struct hci_dev *hdev,
4894 struct sk_buff *skb)
4895{
4896 u8 num_reports = skb->data[0];
4897 void *ptr = &skb->data[1];
4898
4899 hci_dev_lock(hdev);
4900
4901 while (num_reports--) {
4902 struct hci_ev_le_direct_adv_info *ev = ptr;
4903
4904 process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
4905 ev->bdaddr_type, &ev->direct_addr,
4906 ev->direct_addr_type, ev->rssi, NULL, 0);
4907
4908 ptr += sizeof(*ev);
4909 }
4910
4911 hci_dev_unlock(hdev);
4912}
4913
Gustavo Padovan6039aa732012-05-23 04:04:18 -03004914static void hci_le_meta_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03004915{
4916 struct hci_ev_le_meta *le_ev = (void *) skb->data;
4917
4918 skb_pull(skb, sizeof(*le_ev));
4919
4920 switch (le_ev->subevent) {
4921 case HCI_EV_LE_CONN_COMPLETE:
4922 hci_le_conn_complete_evt(hdev, skb);
4923 break;
4924
Marcel Holtmann1855d922014-06-23 11:40:05 +02004925 case HCI_EV_LE_CONN_UPDATE_COMPLETE:
4926 hci_le_conn_update_complete_evt(hdev, skb);
4927 break;
4928
Andre Guedes9aa04c92011-05-26 16:23:51 -03004929 case HCI_EV_LE_ADVERTISING_REPORT:
4930 hci_le_adv_report_evt(hdev, skb);
4931 break;
4932
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004933 case HCI_EV_LE_LTK_REQ:
4934 hci_le_ltk_request_evt(hdev, skb);
4935 break;
4936
Andre Guedes8e75b462014-07-01 18:10:08 -03004937 case HCI_EV_LE_REMOTE_CONN_PARAM_REQ:
4938 hci_le_remote_conn_param_req_evt(hdev, skb);
4939 break;
4940
Marcel Holtmann2f010b52014-12-05 16:20:13 +01004941 case HCI_EV_LE_DIRECT_ADV_REPORT:
4942 hci_le_direct_adv_report_evt(hdev, skb);
4943 break;
4944
Ville Tervofcd89c02011-02-10 22:38:47 -03004945 default:
4946 break;
4947 }
4948}
4949
Andrei Emeltchenko9495b2e2012-09-27 17:26:22 +03004950static void hci_chan_selected_evt(struct hci_dev *hdev, struct sk_buff *skb)
4951{
4952 struct hci_ev_channel_selected *ev = (void *) skb->data;
4953 struct hci_conn *hcon;
4954
4955 BT_DBG("%s handle 0x%2.2x", hdev->name, ev->phy_handle);
4956
4957 skb_pull(skb, sizeof(*ev));
4958
4959 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4960 if (!hcon)
4961 return;
4962
4963 amp_read_loc_assoc_final_data(hdev, hcon);
4964}
4965
Linus Torvalds1da177e2005-04-16 15:20:36 -07004966void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)
4967{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004968 struct hci_event_hdr *hdr = (void *) skb->data;
4969 __u8 event = hdr->evt;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004970
Johan Hedbergb6ddb632013-04-02 13:34:31 +03004971 hci_dev_lock(hdev);
4972
4973 /* Received events are (currently) only needed when a request is
4974 * ongoing so avoid unnecessary memory allocation.
4975 */
Marcel Holtmann899de762014-07-11 05:51:58 +02004976 if (hci_req_pending(hdev)) {
Johan Hedbergb6ddb632013-04-02 13:34:31 +03004977 kfree_skb(hdev->recv_evt);
4978 hdev->recv_evt = skb_clone(skb, GFP_KERNEL);
4979 }
4980
4981 hci_dev_unlock(hdev);
4982
Linus Torvalds1da177e2005-04-16 15:20:36 -07004983 skb_pull(skb, HCI_EVENT_HDR_SIZE);
4984
Johan Hedberg02350a72013-04-03 21:50:29 +03004985 if (hdev->sent_cmd && bt_cb(hdev->sent_cmd)->req.event == event) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02004986 struct hci_command_hdr *cmd_hdr = (void *) hdev->sent_cmd->data;
4987 u16 opcode = __le16_to_cpu(cmd_hdr->opcode);
Johan Hedberg02350a72013-04-03 21:50:29 +03004988
4989 hci_req_cmd_complete(hdev, opcode, 0);
4990 }
4991
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004992 switch (event) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004993 case HCI_EV_INQUIRY_COMPLETE:
4994 hci_inquiry_complete_evt(hdev, skb);
4995 break;
4996
4997 case HCI_EV_INQUIRY_RESULT:
4998 hci_inquiry_result_evt(hdev, skb);
4999 break;
5000
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005001 case HCI_EV_CONN_COMPLETE:
5002 hci_conn_complete_evt(hdev, skb);
Marcel Holtmann21d9e302005-09-13 01:32:25 +02005003 break;
5004
Linus Torvalds1da177e2005-04-16 15:20:36 -07005005 case HCI_EV_CONN_REQUEST:
5006 hci_conn_request_evt(hdev, skb);
5007 break;
5008
Linus Torvalds1da177e2005-04-16 15:20:36 -07005009 case HCI_EV_DISCONN_COMPLETE:
5010 hci_disconn_complete_evt(hdev, skb);
5011 break;
5012
Linus Torvalds1da177e2005-04-16 15:20:36 -07005013 case HCI_EV_AUTH_COMPLETE:
5014 hci_auth_complete_evt(hdev, skb);
5015 break;
5016
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005017 case HCI_EV_REMOTE_NAME:
5018 hci_remote_name_evt(hdev, skb);
5019 break;
5020
Linus Torvalds1da177e2005-04-16 15:20:36 -07005021 case HCI_EV_ENCRYPT_CHANGE:
5022 hci_encrypt_change_evt(hdev, skb);
5023 break;
5024
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005025 case HCI_EV_CHANGE_LINK_KEY_COMPLETE:
5026 hci_change_link_key_complete_evt(hdev, skb);
5027 break;
5028
5029 case HCI_EV_REMOTE_FEATURES:
5030 hci_remote_features_evt(hdev, skb);
5031 break;
5032
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005033 case HCI_EV_CMD_COMPLETE:
5034 hci_cmd_complete_evt(hdev, skb);
5035 break;
5036
5037 case HCI_EV_CMD_STATUS:
5038 hci_cmd_status_evt(hdev, skb);
5039 break;
5040
Marcel Holtmann24dfa342014-11-02 02:56:41 +01005041 case HCI_EV_HARDWARE_ERROR:
5042 hci_hardware_error_evt(hdev, skb);
5043 break;
5044
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005045 case HCI_EV_ROLE_CHANGE:
5046 hci_role_change_evt(hdev, skb);
5047 break;
5048
5049 case HCI_EV_NUM_COMP_PKTS:
5050 hci_num_comp_pkts_evt(hdev, skb);
5051 break;
5052
5053 case HCI_EV_MODE_CHANGE:
5054 hci_mode_change_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005055 break;
5056
5057 case HCI_EV_PIN_CODE_REQ:
5058 hci_pin_code_request_evt(hdev, skb);
5059 break;
5060
5061 case HCI_EV_LINK_KEY_REQ:
5062 hci_link_key_request_evt(hdev, skb);
5063 break;
5064
5065 case HCI_EV_LINK_KEY_NOTIFY:
5066 hci_link_key_notify_evt(hdev, skb);
5067 break;
5068
5069 case HCI_EV_CLOCK_OFFSET:
5070 hci_clock_offset_evt(hdev, skb);
5071 break;
5072
Marcel Holtmanna8746412008-07-14 20:13:46 +02005073 case HCI_EV_PKT_TYPE_CHANGE:
5074 hci_pkt_type_change_evt(hdev, skb);
5075 break;
5076
Marcel Holtmann85a1e932005-08-09 20:28:02 -07005077 case HCI_EV_PSCAN_REP_MODE:
5078 hci_pscan_rep_mode_evt(hdev, skb);
5079 break;
5080
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005081 case HCI_EV_INQUIRY_RESULT_WITH_RSSI:
5082 hci_inquiry_result_with_rssi_evt(hdev, skb);
5083 break;
5084
5085 case HCI_EV_REMOTE_EXT_FEATURES:
5086 hci_remote_ext_features_evt(hdev, skb);
5087 break;
5088
5089 case HCI_EV_SYNC_CONN_COMPLETE:
5090 hci_sync_conn_complete_evt(hdev, skb);
5091 break;
5092
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005093 case HCI_EV_EXTENDED_INQUIRY_RESULT:
5094 hci_extended_inquiry_result_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005095 break;
5096
Johan Hedberg1c2e0042012-06-08 23:31:13 +08005097 case HCI_EV_KEY_REFRESH_COMPLETE:
5098 hci_key_refresh_complete_evt(hdev, skb);
5099 break;
5100
Marcel Holtmann04936842008-07-14 20:13:48 +02005101 case HCI_EV_IO_CAPA_REQUEST:
5102 hci_io_capa_request_evt(hdev, skb);
5103 break;
5104
Johan Hedberg03b555e2011-01-04 15:40:05 +02005105 case HCI_EV_IO_CAPA_REPLY:
5106 hci_io_capa_reply_evt(hdev, skb);
5107 break;
5108
Johan Hedberga5c29682011-02-19 12:05:57 -03005109 case HCI_EV_USER_CONFIRM_REQUEST:
5110 hci_user_confirm_request_evt(hdev, skb);
5111 break;
5112
Brian Gix1143d452011-11-23 08:28:34 -08005113 case HCI_EV_USER_PASSKEY_REQUEST:
5114 hci_user_passkey_request_evt(hdev, skb);
5115 break;
5116
Johan Hedberg92a25252012-09-06 18:39:26 +03005117 case HCI_EV_USER_PASSKEY_NOTIFY:
5118 hci_user_passkey_notify_evt(hdev, skb);
5119 break;
5120
5121 case HCI_EV_KEYPRESS_NOTIFY:
5122 hci_keypress_notify_evt(hdev, skb);
5123 break;
5124
Marcel Holtmann04936842008-07-14 20:13:48 +02005125 case HCI_EV_SIMPLE_PAIR_COMPLETE:
5126 hci_simple_pair_complete_evt(hdev, skb);
5127 break;
5128
Marcel Holtmann41a96212008-07-14 20:13:48 +02005129 case HCI_EV_REMOTE_HOST_FEATURES:
5130 hci_remote_host_features_evt(hdev, skb);
5131 break;
5132
Ville Tervofcd89c02011-02-10 22:38:47 -03005133 case HCI_EV_LE_META:
5134 hci_le_meta_evt(hdev, skb);
5135 break;
5136
Andrei Emeltchenko9495b2e2012-09-27 17:26:22 +03005137 case HCI_EV_CHANNEL_SELECTED:
5138 hci_chan_selected_evt(hdev, skb);
5139 break;
5140
Szymon Janc2763eda2011-03-22 13:12:22 +01005141 case HCI_EV_REMOTE_OOB_DATA_REQUEST:
5142 hci_remote_oob_data_request_evt(hdev, skb);
5143 break;
5144
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03005145 case HCI_EV_PHY_LINK_COMPLETE:
5146 hci_phy_link_complete_evt(hdev, skb);
5147 break;
5148
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03005149 case HCI_EV_LOGICAL_LINK_COMPLETE:
5150 hci_loglink_complete_evt(hdev, skb);
5151 break;
5152
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02005153 case HCI_EV_DISCONN_LOGICAL_LINK_COMPLETE:
5154 hci_disconn_loglink_complete_evt(hdev, skb);
5155 break;
5156
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02005157 case HCI_EV_DISCONN_PHY_LINK_COMPLETE:
5158 hci_disconn_phylink_complete_evt(hdev, skb);
5159 break;
5160
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02005161 case HCI_EV_NUM_COMP_BLOCKS:
5162 hci_num_comp_blocks_evt(hdev, skb);
5163 break;
5164
Marcel Holtmanna9de9242007-10-20 13:33:56 +02005165 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03005166 BT_DBG("%s event 0x%2.2x", hdev->name, event);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005167 break;
5168 }
5169
5170 kfree_skb(skb);
5171 hdev->stat.evt_rx++;
5172}