blob: 381c631423f1064170761979b019af587ac2842b [file] [log] [blame]
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 BlueZ - Bluetooth protocol stack for Linux
Ron Shaffer2d0a0342010-05-28 11:53:46 -04003 Copyright (c) 2000-2001, 2010, Code Aurora Forum. All rights reserved.
Linus Torvalds1da177e2005-04-16 15:20:36 -07004
5 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License version 2 as
9 published by the Free Software Foundation;
10
11 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
12 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
14 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090015 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
16 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
Linus Torvalds1da177e2005-04-16 15:20:36 -070018 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090020 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
Linus Torvalds1da177e2005-04-16 15:20:36 -070022 SOFTWARE IS DISCLAIMED.
23*/
24
25/* Bluetooth HCI event handling. */
26
Linus Torvalds1da177e2005-04-16 15:20:36 -070027#include <asm/unaligned.h>
28
29#include <net/bluetooth/bluetooth.h>
30#include <net/bluetooth/hci_core.h>
Mikel Astizf0d6a0e2012-08-09 09:52:30 +020031#include <net/bluetooth/mgmt.h>
Marcel Holtmann7ef9fbf2013-10-10 14:54:14 -070032
Marcel Holtmann70247282013-10-10 14:54:15 -070033#include "a2mp.h"
Marcel Holtmann7ef9fbf2013-10-10 14:54:14 -070034#include "amp.h"
Johan Hedberg2ceba532014-06-16 19:25:16 +030035#include "smp.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070036
Linus Torvalds1da177e2005-04-16 15:20:36 -070037/* Handle HCI Event packets */
38
Marcel Holtmanna9de9242007-10-20 13:33:56 +020039static void hci_cc_inquiry_cancel(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -070040{
Marcel Holtmanna9de9242007-10-20 13:33:56 +020041 __u8 status = *((__u8 *) skb->data);
Linus Torvalds1da177e2005-04-16 15:20:36 -070042
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030043 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -070044
Andre Guedes82f47852013-04-30 15:29:34 -030045 if (status)
Marcel Holtmanna9de9242007-10-20 13:33:56 +020046 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -070047
Andre Guedes89352e72011-11-04 14:16:53 -030048 clear_bit(HCI_INQUIRY, &hdev->flags);
Peter Zijlstra4e857c52014-03-17 18:06:10 +010049 smp_mb__after_atomic(); /* wake_up_bit advises about this barrier */
Andre Guedes3e13fa12013-03-27 20:04:56 -030050 wake_up_bit(&hdev->flags, HCI_INQUIRY);
Andre Guedes89352e72011-11-04 14:16:53 -030051
Johan Hedberg50143a42014-06-10 14:05:57 +030052 hci_dev_lock(hdev);
53 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
54 hci_dev_unlock(hdev);
55
Marcel Holtmanna9de9242007-10-20 13:33:56 +020056 hci_conn_check_pending(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -070057}
58
Andre Guedes4d934832012-03-21 00:03:35 -030059static void hci_cc_periodic_inq(struct hci_dev *hdev, struct sk_buff *skb)
60{
61 __u8 status = *((__u8 *) skb->data);
62
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030063 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedesae854a72012-03-21 00:03:36 -030064
65 if (status)
66 return;
67
68 set_bit(HCI_PERIODIC_INQ, &hdev->dev_flags);
Andre Guedes4d934832012-03-21 00:03:35 -030069}
70
Marcel Holtmanna9de9242007-10-20 13:33:56 +020071static void hci_cc_exit_periodic_inq(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -070072{
Marcel Holtmanna9de9242007-10-20 13:33:56 +020073 __u8 status = *((__u8 *) skb->data);
74
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030075 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +020076
77 if (status)
78 return;
79
Andre Guedesae854a72012-03-21 00:03:36 -030080 clear_bit(HCI_PERIODIC_INQ, &hdev->dev_flags);
81
Marcel Holtmanna9de9242007-10-20 13:33:56 +020082 hci_conn_check_pending(hdev);
83}
84
Gustavo Padovan807deac2012-05-17 00:36:24 -030085static void hci_cc_remote_name_req_cancel(struct hci_dev *hdev,
86 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +020087{
88 BT_DBG("%s", hdev->name);
89}
90
91static void hci_cc_role_discovery(struct hci_dev *hdev, struct sk_buff *skb)
92{
93 struct hci_rp_role_discovery *rp = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -070094 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -070095
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +030096 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -070097
Marcel Holtmanna9de9242007-10-20 13:33:56 +020098 if (rp->status)
99 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700100
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200101 hci_dev_lock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700102
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200103 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
104 if (conn) {
105 if (rp->role)
Johan Hedberg4dae2792014-06-24 17:03:50 +0300106 clear_bit(HCI_CONN_MASTER, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200107 else
Johan Hedberg4dae2792014-06-24 17:03:50 +0300108 set_bit(HCI_CONN_MASTER, &conn->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700109 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200110
111 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700112}
113
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200114static void hci_cc_read_link_policy(struct hci_dev *hdev, struct sk_buff *skb)
115{
116 struct hci_rp_read_link_policy *rp = (void *) skb->data;
117 struct hci_conn *conn;
118
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300119 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200120
121 if (rp->status)
122 return;
123
124 hci_dev_lock(hdev);
125
126 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
127 if (conn)
128 conn->link_policy = __le16_to_cpu(rp->policy);
129
130 hci_dev_unlock(hdev);
131}
132
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200133static void hci_cc_write_link_policy(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700134{
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200135 struct hci_rp_write_link_policy *rp = (void *) skb->data;
136 struct hci_conn *conn;
137 void *sent;
138
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300139 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200140
141 if (rp->status)
142 return;
143
144 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LINK_POLICY);
145 if (!sent)
146 return;
147
148 hci_dev_lock(hdev);
149
150 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200151 if (conn)
Harvey Harrison83985312008-05-02 16:25:46 -0700152 conn->link_policy = get_unaligned_le16(sent + 2);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200153
154 hci_dev_unlock(hdev);
155}
156
Gustavo Padovan807deac2012-05-17 00:36:24 -0300157static void hci_cc_read_def_link_policy(struct hci_dev *hdev,
158 struct sk_buff *skb)
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200159{
160 struct hci_rp_read_def_link_policy *rp = (void *) skb->data;
161
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300162 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200163
164 if (rp->status)
165 return;
166
167 hdev->link_policy = __le16_to_cpu(rp->policy);
168}
169
Gustavo Padovan807deac2012-05-17 00:36:24 -0300170static void hci_cc_write_def_link_policy(struct hci_dev *hdev,
171 struct sk_buff *skb)
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200172{
173 __u8 status = *((__u8 *) skb->data);
174 void *sent;
175
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300176 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200177
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200178 if (status)
179 return;
180
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200181 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_DEF_LINK_POLICY);
182 if (!sent)
183 return;
184
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200185 hdev->link_policy = get_unaligned_le16(sent);
Marcel Holtmanne4e8e372008-07-14 20:13:47 +0200186}
187
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200188static void hci_cc_reset(struct hci_dev *hdev, struct sk_buff *skb)
189{
190 __u8 status = *((__u8 *) skb->data);
191
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300192 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200193
Gustavo F. Padovan10572132011-03-16 15:36:29 -0300194 clear_bit(HCI_RESET, &hdev->flags);
195
Johan Hedberga297e972012-02-21 17:55:47 +0200196 /* Reset all non-persistent flags */
Johan Hedberg2cc6fb02013-03-15 17:06:57 -0500197 hdev->dev_flags &= ~HCI_PERSISTENT_MASK;
Andre Guedes69775ff2012-02-23 16:50:05 +0200198
199 hdev->discovery.state = DISCOVERY_STOPPED;
Johan Hedbergbbaf4442012-11-08 01:22:59 +0100200 hdev->inq_tx_power = HCI_TX_POWER_INVALID;
201 hdev->adv_tx_power = HCI_TX_POWER_INVALID;
Johan Hedberg3f0f5242012-11-08 01:23:00 +0100202
203 memset(hdev->adv_data, 0, sizeof(hdev->adv_data));
204 hdev->adv_data_len = 0;
Marcel Holtmannf8e808b2013-10-16 00:16:47 -0700205
206 memset(hdev->scan_rsp_data, 0, sizeof(hdev->scan_rsp_data));
207 hdev->scan_rsp_data_len = 0;
Marcel Holtmann06f5b772013-10-19 07:09:11 -0700208
Marcel Holtmann533553f2014-03-21 12:18:10 -0700209 hdev->le_scan_type = LE_SCAN_PASSIVE;
210
Marcel Holtmann06f5b772013-10-19 07:09:11 -0700211 hdev->ssp_debug_mode = 0;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200212}
213
214static void hci_cc_write_local_name(struct hci_dev *hdev, struct sk_buff *skb)
215{
216 __u8 status = *((__u8 *) skb->data);
217 void *sent;
218
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300219 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200220
221 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LOCAL_NAME);
222 if (!sent)
223 return;
224
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200225 hci_dev_lock(hdev);
226
Johan Hedbergf51d5b22012-02-22 18:17:32 +0200227 if (test_bit(HCI_MGMT, &hdev->dev_flags))
228 mgmt_set_local_name_complete(hdev, sent, status);
Johan Hedberg28cc7bd2012-02-22 21:06:55 +0200229 else if (!status)
230 memcpy(hdev->dev_name, sent, HCI_MAX_NAME_LENGTH);
Johan Hedbergf51d5b22012-02-22 18:17:32 +0200231
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200232 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200233}
234
235static void hci_cc_read_local_name(struct hci_dev *hdev, struct sk_buff *skb)
236{
237 struct hci_rp_read_local_name *rp = (void *) skb->data;
238
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300239 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200240
241 if (rp->status)
242 return;
243
Johan Hedbergdb99b5f2012-02-22 20:14:22 +0200244 if (test_bit(HCI_SETUP, &hdev->dev_flags))
245 memcpy(hdev->dev_name, rp->name, HCI_MAX_NAME_LENGTH);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200246}
247
248static void hci_cc_write_auth_enable(struct hci_dev *hdev, struct sk_buff *skb)
249{
250 __u8 status = *((__u8 *) skb->data);
251 void *sent;
252
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300253 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200254
255 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_AUTH_ENABLE);
256 if (!sent)
257 return;
258
259 if (!status) {
260 __u8 param = *((__u8 *) sent);
261
262 if (param == AUTH_ENABLED)
263 set_bit(HCI_AUTH, &hdev->flags);
264 else
265 clear_bit(HCI_AUTH, &hdev->flags);
266 }
267
Johan Hedberg33ef95e2012-02-16 23:56:27 +0200268 if (test_bit(HCI_MGMT, &hdev->dev_flags))
269 mgmt_auth_enable_complete(hdev, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200270}
271
272static void hci_cc_write_encrypt_mode(struct hci_dev *hdev, struct sk_buff *skb)
273{
274 __u8 status = *((__u8 *) skb->data);
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200275 __u8 param;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200276 void *sent;
277
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300278 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200279
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200280 if (status)
281 return;
282
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200283 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_ENCRYPT_MODE);
284 if (!sent)
285 return;
286
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200287 param = *((__u8 *) sent);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200288
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200289 if (param)
290 set_bit(HCI_ENCRYPT, &hdev->flags);
291 else
292 clear_bit(HCI_ENCRYPT, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200293}
294
295static void hci_cc_write_scan_enable(struct hci_dev *hdev, struct sk_buff *skb)
296{
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200297 __u8 status = *((__u8 *) skb->data);
298 __u8 param;
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200299 int old_pscan, old_iscan;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200300 void *sent;
301
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300302 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200303
304 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SCAN_ENABLE);
305 if (!sent)
306 return;
307
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200308 param = *((__u8 *) sent);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200309
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200310 hci_dev_lock(hdev);
311
Mikel Astizfa1bd912012-08-09 09:52:29 +0200312 if (status) {
Johan Hedberg744cf192011-11-08 20:40:14 +0200313 mgmt_write_scan_failed(hdev, param, status);
Johan Hedberg2d7cee52011-11-07 22:16:03 +0200314 hdev->discov_timeout = 0;
315 goto done;
316 }
317
Johan Hedberg0663ca22013-10-02 13:43:14 +0300318 /* We need to ensure that we set this back on if someone changed
319 * the scan mode through a raw HCI socket.
320 */
321 set_bit(HCI_BREDR_ENABLED, &hdev->dev_flags);
322
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200323 old_pscan = test_and_clear_bit(HCI_PSCAN, &hdev->flags);
324 old_iscan = test_and_clear_bit(HCI_ISCAN, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200325
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200326 if (param & SCAN_INQUIRY) {
327 set_bit(HCI_ISCAN, &hdev->flags);
328 if (!old_iscan)
Johan Hedberg744cf192011-11-08 20:40:14 +0200329 mgmt_discoverable(hdev, 1);
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200330 } else if (old_iscan)
Johan Hedberg744cf192011-11-08 20:40:14 +0200331 mgmt_discoverable(hdev, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200332
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200333 if (param & SCAN_PAGE) {
334 set_bit(HCI_PSCAN, &hdev->flags);
335 if (!old_pscan)
Johan Hedberg744cf192011-11-08 20:40:14 +0200336 mgmt_connectable(hdev, 1);
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200337 } else if (old_pscan)
Johan Hedberg744cf192011-11-08 20:40:14 +0200338 mgmt_connectable(hdev, 0);
Johan Hedberg36f7fc72011-11-04 00:17:45 +0200339
340done:
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200341 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200342}
343
344static void hci_cc_read_class_of_dev(struct hci_dev *hdev, struct sk_buff *skb)
345{
346 struct hci_rp_read_class_of_dev *rp = (void *) skb->data;
347
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300348 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200349
350 if (rp->status)
351 return;
352
353 memcpy(hdev->dev_class, rp->dev_class, 3);
354
355 BT_DBG("%s class 0x%.2x%.2x%.2x", hdev->name,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300356 hdev->dev_class[2], hdev->dev_class[1], hdev->dev_class[0]);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200357}
358
359static void hci_cc_write_class_of_dev(struct hci_dev *hdev, struct sk_buff *skb)
360{
361 __u8 status = *((__u8 *) skb->data);
362 void *sent;
363
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300364 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200365
366 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_CLASS_OF_DEV);
367 if (!sent)
368 return;
369
Marcel Holtmann7f9a9032012-02-22 18:38:01 +0100370 hci_dev_lock(hdev);
371
372 if (status == 0)
373 memcpy(hdev->dev_class, sent, 3);
374
375 if (test_bit(HCI_MGMT, &hdev->dev_flags))
376 mgmt_set_class_of_dev_complete(hdev, sent, status);
377
378 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200379}
380
381static void hci_cc_read_voice_setting(struct hci_dev *hdev, struct sk_buff *skb)
382{
383 struct hci_rp_read_voice_setting *rp = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700384 __u16 setting;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200385
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300386 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200387
388 if (rp->status)
389 return;
390
391 setting = __le16_to_cpu(rp->voice_setting);
392
Marcel Holtmannf383f272008-07-14 20:13:47 +0200393 if (hdev->voice_setting == setting)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200394 return;
395
396 hdev->voice_setting = setting;
397
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300398 BT_DBG("%s voice setting 0x%4.4x", hdev->name, setting);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200399
Gustavo F. Padovan3c547112011-12-14 22:58:44 -0200400 if (hdev->notify)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200401 hdev->notify(hdev, HCI_NOTIFY_VOICE_SETTING);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200402}
403
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300404static void hci_cc_write_voice_setting(struct hci_dev *hdev,
405 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200406{
407 __u8 status = *((__u8 *) skb->data);
Marcel Holtmannf383f272008-07-14 20:13:47 +0200408 __u16 setting;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700409 void *sent;
410
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300411 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700412
Marcel Holtmannf383f272008-07-14 20:13:47 +0200413 if (status)
414 return;
415
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200416 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_VOICE_SETTING);
417 if (!sent)
418 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700419
Marcel Holtmannf383f272008-07-14 20:13:47 +0200420 setting = get_unaligned_le16(sent);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700421
Marcel Holtmannf383f272008-07-14 20:13:47 +0200422 if (hdev->voice_setting == setting)
423 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700424
Marcel Holtmannf383f272008-07-14 20:13:47 +0200425 hdev->voice_setting = setting;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700426
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300427 BT_DBG("%s voice setting 0x%4.4x", hdev->name, setting);
Marcel Holtmannf383f272008-07-14 20:13:47 +0200428
Gustavo F. Padovan3c547112011-12-14 22:58:44 -0200429 if (hdev->notify)
Marcel Holtmannf383f272008-07-14 20:13:47 +0200430 hdev->notify(hdev, HCI_NOTIFY_VOICE_SETTING);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700431}
432
Marcel Holtmannb4cb9fb2013-10-14 13:56:16 -0700433static void hci_cc_read_num_supported_iac(struct hci_dev *hdev,
434 struct sk_buff *skb)
435{
436 struct hci_rp_read_num_supported_iac *rp = (void *) skb->data;
437
438 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
439
440 if (rp->status)
441 return;
442
443 hdev->num_iac = rp->num_iac;
444
445 BT_DBG("%s num iac %d", hdev->name, hdev->num_iac);
446}
447
Marcel Holtmann333140b2008-07-14 20:13:48 +0200448static void hci_cc_write_ssp_mode(struct hci_dev *hdev, struct sk_buff *skb)
449{
450 __u8 status = *((__u8 *) skb->data);
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300451 struct hci_cp_write_ssp_mode *sent;
Marcel Holtmann333140b2008-07-14 20:13:48 +0200452
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300453 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann333140b2008-07-14 20:13:48 +0200454
Marcel Holtmann333140b2008-07-14 20:13:48 +0200455 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SSP_MODE);
456 if (!sent)
457 return;
458
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300459 if (!status) {
460 if (sent->mode)
Johan Hedbergcad718e2013-04-17 15:00:51 +0300461 hdev->features[1][0] |= LMP_HOST_SSP;
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300462 else
Johan Hedbergcad718e2013-04-17 15:00:51 +0300463 hdev->features[1][0] &= ~LMP_HOST_SSP;
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300464 }
465
Johan Hedberged2c4ee2012-02-17 00:56:28 +0200466 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300467 mgmt_ssp_enable_complete(hdev, sent->mode, status);
Johan Hedbergc0ecddc2012-02-22 12:38:31 +0200468 else if (!status) {
Johan Hedberg5ed8eb22012-10-25 00:09:51 +0300469 if (sent->mode)
Johan Hedbergc0ecddc2012-02-22 12:38:31 +0200470 set_bit(HCI_SSP_ENABLED, &hdev->dev_flags);
471 else
472 clear_bit(HCI_SSP_ENABLED, &hdev->dev_flags);
473 }
Marcel Holtmann333140b2008-07-14 20:13:48 +0200474}
475
Marcel Holtmanneac83dc2014-01-10 02:07:23 -0800476static void hci_cc_write_sc_support(struct hci_dev *hdev, struct sk_buff *skb)
477{
478 u8 status = *((u8 *) skb->data);
479 struct hci_cp_write_sc_support *sent;
480
481 BT_DBG("%s status 0x%2.2x", hdev->name, status);
482
483 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SC_SUPPORT);
484 if (!sent)
485 return;
486
487 if (!status) {
488 if (sent->support)
489 hdev->features[1][0] |= LMP_HOST_SC;
490 else
491 hdev->features[1][0] &= ~LMP_HOST_SC;
492 }
493
494 if (test_bit(HCI_MGMT, &hdev->dev_flags))
495 mgmt_sc_enable_complete(hdev, sent->support, status);
496 else if (!status) {
497 if (sent->support)
498 set_bit(HCI_SC_ENABLED, &hdev->dev_flags);
499 else
500 clear_bit(HCI_SC_ENABLED, &hdev->dev_flags);
501 }
502}
503
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200504static void hci_cc_read_local_version(struct hci_dev *hdev, struct sk_buff *skb)
505{
506 struct hci_rp_read_local_version *rp = (void *) skb->data;
507
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300508 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200509
510 if (rp->status)
Johan Hedberg42c6b122013-03-05 20:37:49 +0200511 return;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200512
Marcel Holtmann0d5551f2013-10-18 12:04:50 -0700513 if (test_bit(HCI_SETUP, &hdev->dev_flags)) {
514 hdev->hci_ver = rp->hci_ver;
515 hdev->hci_rev = __le16_to_cpu(rp->hci_rev);
516 hdev->lmp_ver = rp->lmp_ver;
517 hdev->manufacturer = __le16_to_cpu(rp->manufacturer);
518 hdev->lmp_subver = __le16_to_cpu(rp->lmp_subver);
519 }
Johan Hedbergd5859e22011-01-25 01:19:58 +0200520}
521
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300522static void hci_cc_read_local_commands(struct hci_dev *hdev,
523 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200524{
525 struct hci_rp_read_local_commands *rp = (void *) skb->data;
526
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300527 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200528
Marcel Holtmann6a070e62013-10-31 04:54:33 -0700529 if (rp->status)
530 return;
531
532 if (test_bit(HCI_SETUP, &hdev->dev_flags))
Johan Hedberg2177bab2013-03-05 20:37:43 +0200533 memcpy(hdev->commands, rp->commands, sizeof(hdev->commands));
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200534}
535
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300536static void hci_cc_read_local_features(struct hci_dev *hdev,
537 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200538{
539 struct hci_rp_read_local_features *rp = (void *) skb->data;
540
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300541 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200542
543 if (rp->status)
544 return;
545
546 memcpy(hdev->features, rp->features, 8);
547
548 /* Adjust default settings according to features
549 * supported by device. */
550
Johan Hedbergcad718e2013-04-17 15:00:51 +0300551 if (hdev->features[0][0] & LMP_3SLOT)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200552 hdev->pkt_type |= (HCI_DM3 | HCI_DH3);
553
Johan Hedbergcad718e2013-04-17 15:00:51 +0300554 if (hdev->features[0][0] & LMP_5SLOT)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200555 hdev->pkt_type |= (HCI_DM5 | HCI_DH5);
556
Johan Hedbergcad718e2013-04-17 15:00:51 +0300557 if (hdev->features[0][1] & LMP_HV2) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200558 hdev->pkt_type |= (HCI_HV2);
559 hdev->esco_type |= (ESCO_HV2);
560 }
561
Johan Hedbergcad718e2013-04-17 15:00:51 +0300562 if (hdev->features[0][1] & LMP_HV3) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200563 hdev->pkt_type |= (HCI_HV3);
564 hdev->esco_type |= (ESCO_HV3);
565 }
566
Andre Guedes45db810f2012-07-24 15:03:49 -0300567 if (lmp_esco_capable(hdev))
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200568 hdev->esco_type |= (ESCO_EV3);
569
Johan Hedbergcad718e2013-04-17 15:00:51 +0300570 if (hdev->features[0][4] & LMP_EV4)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200571 hdev->esco_type |= (ESCO_EV4);
572
Johan Hedbergcad718e2013-04-17 15:00:51 +0300573 if (hdev->features[0][4] & LMP_EV5)
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200574 hdev->esco_type |= (ESCO_EV5);
575
Johan Hedbergcad718e2013-04-17 15:00:51 +0300576 if (hdev->features[0][5] & LMP_EDR_ESCO_2M)
Marcel Holtmannefc76882009-02-06 09:13:37 +0100577 hdev->esco_type |= (ESCO_2EV3);
578
Johan Hedbergcad718e2013-04-17 15:00:51 +0300579 if (hdev->features[0][5] & LMP_EDR_ESCO_3M)
Marcel Holtmannefc76882009-02-06 09:13:37 +0100580 hdev->esco_type |= (ESCO_3EV3);
581
Johan Hedbergcad718e2013-04-17 15:00:51 +0300582 if (hdev->features[0][5] & LMP_EDR_3S_ESCO)
Marcel Holtmannefc76882009-02-06 09:13:37 +0100583 hdev->esco_type |= (ESCO_2EV5 | ESCO_3EV5);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200584}
585
Andre Guedes971e3a42011-06-30 19:20:52 -0300586static void hci_cc_read_local_ext_features(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300587 struct sk_buff *skb)
Andre Guedes971e3a42011-06-30 19:20:52 -0300588{
589 struct hci_rp_read_local_ext_features *rp = (void *) skb->data;
590
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300591 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andre Guedes971e3a42011-06-30 19:20:52 -0300592
593 if (rp->status)
Johan Hedberg42c6b122013-03-05 20:37:49 +0200594 return;
Andre Guedes971e3a42011-06-30 19:20:52 -0300595
Marcel Holtmann57af75a2013-10-18 12:04:47 -0700596 if (hdev->max_page < rp->max_page)
597 hdev->max_page = rp->max_page;
Johan Hedbergd2c5d772013-04-17 15:00:52 +0300598
Johan Hedbergcad718e2013-04-17 15:00:51 +0300599 if (rp->page < HCI_MAX_PAGES)
600 memcpy(hdev->features[rp->page], rp->features, 8);
Andre Guedes971e3a42011-06-30 19:20:52 -0300601}
602
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200603static void hci_cc_read_flow_control_mode(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300604 struct sk_buff *skb)
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200605{
606 struct hci_rp_read_flow_control_mode *rp = (void *) skb->data;
607
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300608 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200609
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200610 if (rp->status)
611 return;
612
613 hdev->flow_ctl_mode = rp->mode;
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +0200614}
615
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200616static void hci_cc_read_buffer_size(struct hci_dev *hdev, struct sk_buff *skb)
617{
618 struct hci_rp_read_buffer_size *rp = (void *) skb->data;
619
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300620 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200621
622 if (rp->status)
623 return;
624
625 hdev->acl_mtu = __le16_to_cpu(rp->acl_mtu);
626 hdev->sco_mtu = rp->sco_mtu;
627 hdev->acl_pkts = __le16_to_cpu(rp->acl_max_pkt);
628 hdev->sco_pkts = __le16_to_cpu(rp->sco_max_pkt);
629
630 if (test_bit(HCI_QUIRK_FIXUP_BUFFER_SIZE, &hdev->quirks)) {
631 hdev->sco_mtu = 64;
632 hdev->sco_pkts = 8;
633 }
634
635 hdev->acl_cnt = hdev->acl_pkts;
636 hdev->sco_cnt = hdev->sco_pkts;
637
Gustavo Padovan807deac2012-05-17 00:36:24 -0300638 BT_DBG("%s acl mtu %d:%d sco mtu %d:%d", hdev->name, hdev->acl_mtu,
639 hdev->acl_pkts, hdev->sco_mtu, hdev->sco_pkts);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200640}
641
642static void hci_cc_read_bd_addr(struct hci_dev *hdev, struct sk_buff *skb)
643{
644 struct hci_rp_read_bd_addr *rp = (void *) skb->data;
645
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300646 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200647
Marcel Holtmanne30d3f52014-07-05 10:48:03 +0200648 if (rp->status)
649 return;
650
651 if (test_bit(HCI_INIT, &hdev->flags))
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200652 bacpy(&hdev->bdaddr, &rp->bdaddr);
Marcel Holtmanne30d3f52014-07-05 10:48:03 +0200653
654 if (test_bit(HCI_SETUP, &hdev->dev_flags))
655 bacpy(&hdev->setup_addr, &rp->bdaddr);
Johan Hedberg23bb5762010-12-21 23:01:27 +0200656}
657
Johan Hedbergf332ec62013-03-15 17:07:11 -0500658static void hci_cc_read_page_scan_activity(struct hci_dev *hdev,
659 struct sk_buff *skb)
660{
661 struct hci_rp_read_page_scan_activity *rp = (void *) skb->data;
662
663 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
664
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200665 if (rp->status)
666 return;
667
668 if (test_bit(HCI_INIT, &hdev->flags)) {
Johan Hedbergf332ec62013-03-15 17:07:11 -0500669 hdev->page_scan_interval = __le16_to_cpu(rp->interval);
670 hdev->page_scan_window = __le16_to_cpu(rp->window);
671 }
672}
673
Johan Hedberg4a3ee762013-03-15 17:07:12 -0500674static void hci_cc_write_page_scan_activity(struct hci_dev *hdev,
675 struct sk_buff *skb)
676{
677 u8 status = *((u8 *) skb->data);
678 struct hci_cp_write_page_scan_activity *sent;
679
680 BT_DBG("%s status 0x%2.2x", hdev->name, status);
681
682 if (status)
683 return;
684
685 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY);
686 if (!sent)
687 return;
688
689 hdev->page_scan_interval = __le16_to_cpu(sent->interval);
690 hdev->page_scan_window = __le16_to_cpu(sent->window);
691}
692
Johan Hedbergf332ec62013-03-15 17:07:11 -0500693static void hci_cc_read_page_scan_type(struct hci_dev *hdev,
694 struct sk_buff *skb)
695{
696 struct hci_rp_read_page_scan_type *rp = (void *) skb->data;
697
698 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
699
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200700 if (rp->status)
701 return;
702
703 if (test_bit(HCI_INIT, &hdev->flags))
Johan Hedbergf332ec62013-03-15 17:07:11 -0500704 hdev->page_scan_type = rp->type;
705}
706
Johan Hedberg4a3ee762013-03-15 17:07:12 -0500707static void hci_cc_write_page_scan_type(struct hci_dev *hdev,
708 struct sk_buff *skb)
709{
710 u8 status = *((u8 *) skb->data);
711 u8 *type;
712
713 BT_DBG("%s status 0x%2.2x", hdev->name, status);
714
715 if (status)
716 return;
717
718 type = hci_sent_cmd_data(hdev, HCI_OP_WRITE_PAGE_SCAN_TYPE);
719 if (type)
720 hdev->page_scan_type = *type;
721}
722
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200723static void hci_cc_read_data_block_size(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300724 struct sk_buff *skb)
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200725{
726 struct hci_rp_read_data_block_size *rp = (void *) skb->data;
727
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300728 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200729
730 if (rp->status)
731 return;
732
733 hdev->block_mtu = __le16_to_cpu(rp->max_acl_len);
734 hdev->block_len = __le16_to_cpu(rp->block_len);
735 hdev->num_blocks = __le16_to_cpu(rp->num_blocks);
736
737 hdev->block_cnt = hdev->num_blocks;
738
739 BT_DBG("%s blk mtu %d cnt %d len %d", hdev->name, hdev->block_mtu,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300740 hdev->block_cnt, hdev->block_len);
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +0200741}
742
Johan Hedberg33f35722014-06-28 17:54:06 +0300743static void hci_cc_read_clock(struct hci_dev *hdev, struct sk_buff *skb)
744{
745 struct hci_rp_read_clock *rp = (void *) skb->data;
746 struct hci_cp_read_clock *cp;
747 struct hci_conn *conn;
748
749 BT_DBG("%s", hdev->name);
750
751 if (skb->len < sizeof(*rp))
752 return;
753
754 if (rp->status)
755 return;
756
757 hci_dev_lock(hdev);
758
759 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_CLOCK);
760 if (!cp)
761 goto unlock;
762
763 if (cp->which == 0x00) {
764 hdev->clock = le32_to_cpu(rp->clock);
765 goto unlock;
766 }
767
768 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
769 if (conn) {
770 conn->clock = le32_to_cpu(rp->clock);
771 conn->clock_accuracy = le16_to_cpu(rp->accuracy);
772 }
773
774unlock:
775 hci_dev_unlock(hdev);
776}
777
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300778static void hci_cc_read_local_amp_info(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300779 struct sk_buff *skb)
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300780{
781 struct hci_rp_read_local_amp_info *rp = (void *) skb->data;
782
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300783 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300784
785 if (rp->status)
Andrei Emeltchenko8e2a0d92012-09-27 17:26:08 +0300786 goto a2mp_rsp;
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300787
788 hdev->amp_status = rp->amp_status;
789 hdev->amp_total_bw = __le32_to_cpu(rp->total_bw);
790 hdev->amp_max_bw = __le32_to_cpu(rp->max_bw);
791 hdev->amp_min_latency = __le32_to_cpu(rp->min_latency);
792 hdev->amp_max_pdu = __le32_to_cpu(rp->max_pdu);
793 hdev->amp_type = rp->amp_type;
794 hdev->amp_pal_cap = __le16_to_cpu(rp->pal_cap);
795 hdev->amp_assoc_size = __le16_to_cpu(rp->max_assoc_size);
796 hdev->amp_be_flush_to = __le32_to_cpu(rp->be_flush_to);
797 hdev->amp_max_flush_to = __le32_to_cpu(rp->max_flush_to);
798
Andrei Emeltchenko8e2a0d92012-09-27 17:26:08 +0300799a2mp_rsp:
800 a2mp_send_getinfo_rsp(hdev);
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +0300801}
802
Andrei Emeltchenko903e4542012-09-27 17:26:09 +0300803static void hci_cc_read_local_amp_assoc(struct hci_dev *hdev,
804 struct sk_buff *skb)
805{
806 struct hci_rp_read_local_amp_assoc *rp = (void *) skb->data;
807 struct amp_assoc *assoc = &hdev->loc_assoc;
808 size_t rem_len, frag_len;
809
810 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
811
812 if (rp->status)
813 goto a2mp_rsp;
814
815 frag_len = skb->len - sizeof(*rp);
816 rem_len = __le16_to_cpu(rp->rem_len);
817
818 if (rem_len > frag_len) {
Andrei Emeltchenko2e430be32012-09-28 14:44:23 +0300819 BT_DBG("frag_len %zu rem_len %zu", frag_len, rem_len);
Andrei Emeltchenko903e4542012-09-27 17:26:09 +0300820
821 memcpy(assoc->data + assoc->offset, rp->frag, frag_len);
822 assoc->offset += frag_len;
823
824 /* Read other fragments */
825 amp_read_loc_assoc_frag(hdev, rp->phy_handle);
826
827 return;
828 }
829
830 memcpy(assoc->data + assoc->offset, rp->frag, rem_len);
831 assoc->len = assoc->offset + rem_len;
832 assoc->offset = 0;
833
834a2mp_rsp:
835 /* Send A2MP Rsp when all fragments are received */
836 a2mp_send_getampassoc_rsp(hdev, rp->status);
Andrei Emeltchenko9495b2e2012-09-27 17:26:22 +0300837 a2mp_send_create_phy_link_req(hdev, rp->status);
Andrei Emeltchenko903e4542012-09-27 17:26:09 +0300838}
839
Johan Hedbergd5859e22011-01-25 01:19:58 +0200840static void hci_cc_read_inq_rsp_tx_power(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300841 struct sk_buff *skb)
Johan Hedbergd5859e22011-01-25 01:19:58 +0200842{
Marcel Holtmann91c4e9b2012-03-11 19:27:21 -0700843 struct hci_rp_read_inq_rsp_tx_power *rp = (void *) skb->data;
Johan Hedbergd5859e22011-01-25 01:19:58 +0200844
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300845 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedbergd5859e22011-01-25 01:19:58 +0200846
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200847 if (rp->status)
848 return;
849
850 hdev->inq_tx_power = rp->tx_power;
Johan Hedbergd5859e22011-01-25 01:19:58 +0200851}
852
Johan Hedberg980e1a52011-01-22 06:10:07 +0200853static void hci_cc_pin_code_reply(struct hci_dev *hdev, struct sk_buff *skb)
854{
855 struct hci_rp_pin_code_reply *rp = (void *) skb->data;
856 struct hci_cp_pin_code_reply *cp;
857 struct hci_conn *conn;
858
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300859 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200860
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200861 hci_dev_lock(hdev);
862
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200863 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg744cf192011-11-08 20:40:14 +0200864 mgmt_pin_code_reply_complete(hdev, &rp->bdaddr, rp->status);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200865
Mikel Astizfa1bd912012-08-09 09:52:29 +0200866 if (rp->status)
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200867 goto unlock;
Johan Hedberg980e1a52011-01-22 06:10:07 +0200868
869 cp = hci_sent_cmd_data(hdev, HCI_OP_PIN_CODE_REPLY);
870 if (!cp)
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200871 goto unlock;
Johan Hedberg980e1a52011-01-22 06:10:07 +0200872
873 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
874 if (conn)
875 conn->pin_length = cp->pin_len;
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200876
877unlock:
878 hci_dev_unlock(hdev);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200879}
880
881static void hci_cc_pin_code_neg_reply(struct hci_dev *hdev, struct sk_buff *skb)
882{
883 struct hci_rp_pin_code_neg_reply *rp = (void *) skb->data;
884
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300885 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200886
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200887 hci_dev_lock(hdev);
888
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200889 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg744cf192011-11-08 20:40:14 +0200890 mgmt_pin_code_neg_reply_complete(hdev, &rp->bdaddr,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300891 rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200892
893 hci_dev_unlock(hdev);
Johan Hedberg980e1a52011-01-22 06:10:07 +0200894}
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200895
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300896static void hci_cc_le_read_buffer_size(struct hci_dev *hdev,
897 struct sk_buff *skb)
898{
899 struct hci_rp_le_read_buffer_size *rp = (void *) skb->data;
900
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300901 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300902
903 if (rp->status)
904 return;
905
906 hdev->le_mtu = __le16_to_cpu(rp->le_mtu);
907 hdev->le_pkts = rp->le_max_pkt;
908
909 hdev->le_cnt = hdev->le_pkts;
910
911 BT_DBG("%s le mtu %d:%d", hdev->name, hdev->le_mtu, hdev->le_pkts);
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300912}
Johan Hedberg980e1a52011-01-22 06:10:07 +0200913
Johan Hedberg60e77322013-01-22 14:01:59 +0200914static void hci_cc_le_read_local_features(struct hci_dev *hdev,
915 struct sk_buff *skb)
916{
917 struct hci_rp_le_read_local_features *rp = (void *) skb->data;
918
919 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
920
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200921 if (rp->status)
922 return;
923
924 memcpy(hdev->le_features, rp->features, 8);
Johan Hedberg60e77322013-01-22 14:01:59 +0200925}
926
Johan Hedberg8fa19092012-10-19 20:57:49 +0300927static void hci_cc_le_read_adv_tx_power(struct hci_dev *hdev,
928 struct sk_buff *skb)
929{
930 struct hci_rp_le_read_adv_tx_power *rp = (void *) skb->data;
931
932 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
933
Marcel Holtmann45296ac2014-07-05 10:48:01 +0200934 if (rp->status)
935 return;
936
937 hdev->adv_tx_power = rp->tx_power;
Johan Hedberg8fa19092012-10-19 20:57:49 +0300938}
939
Johan Hedberga5c29682011-02-19 12:05:57 -0300940static void hci_cc_user_confirm_reply(struct hci_dev *hdev, struct sk_buff *skb)
941{
942 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
943
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300944 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberga5c29682011-02-19 12:05:57 -0300945
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200946 hci_dev_lock(hdev);
947
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200948 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300949 mgmt_user_confirm_reply_complete(hdev, &rp->bdaddr, ACL_LINK, 0,
950 rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200951
952 hci_dev_unlock(hdev);
Johan Hedberga5c29682011-02-19 12:05:57 -0300953}
954
955static void hci_cc_user_confirm_neg_reply(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300956 struct sk_buff *skb)
Johan Hedberga5c29682011-02-19 12:05:57 -0300957{
958 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
959
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300960 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Johan Hedberga5c29682011-02-19 12:05:57 -0300961
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200962 hci_dev_lock(hdev);
963
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200964 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg744cf192011-11-08 20:40:14 +0200965 mgmt_user_confirm_neg_reply_complete(hdev, &rp->bdaddr,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300966 ACL_LINK, 0, rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +0200967
968 hci_dev_unlock(hdev);
Johan Hedberga5c29682011-02-19 12:05:57 -0300969}
970
Brian Gix1143d452011-11-23 08:28:34 -0800971static void hci_cc_user_passkey_reply(struct hci_dev *hdev, struct sk_buff *skb)
972{
973 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
974
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300975 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -0800976
977 hci_dev_lock(hdev);
978
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200979 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg272d90d2012-02-09 15:26:12 +0200980 mgmt_user_passkey_reply_complete(hdev, &rp->bdaddr, ACL_LINK,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300981 0, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -0800982
983 hci_dev_unlock(hdev);
984}
985
986static void hci_cc_user_passkey_neg_reply(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -0300987 struct sk_buff *skb)
Brian Gix1143d452011-11-23 08:28:34 -0800988{
989 struct hci_rp_user_confirm_reply *rp = (void *) skb->data;
990
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +0300991 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -0800992
993 hci_dev_lock(hdev);
994
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200995 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Brian Gix1143d452011-11-23 08:28:34 -0800996 mgmt_user_passkey_neg_reply_complete(hdev, &rp->bdaddr,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300997 ACL_LINK, 0, rp->status);
Brian Gix1143d452011-11-23 08:28:34 -0800998
999 hci_dev_unlock(hdev);
1000}
1001
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08001002static void hci_cc_read_local_oob_data(struct hci_dev *hdev,
1003 struct sk_buff *skb)
Szymon Jancc35938b2011-03-22 13:12:21 +01001004{
1005 struct hci_rp_read_local_oob_data *rp = (void *) skb->data;
1006
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001007 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
Szymon Jancc35938b2011-03-22 13:12:21 +01001008
Johan Hedberg56e5cb82011-11-08 20:40:16 +02001009 hci_dev_lock(hdev);
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08001010 mgmt_read_local_oob_data_complete(hdev, rp->hash, rp->randomizer,
1011 NULL, NULL, rp->status);
1012 hci_dev_unlock(hdev);
1013}
1014
1015static void hci_cc_read_local_oob_ext_data(struct hci_dev *hdev,
1016 struct sk_buff *skb)
1017{
1018 struct hci_rp_read_local_oob_ext_data *rp = (void *) skb->data;
1019
1020 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1021
1022 hci_dev_lock(hdev);
1023 mgmt_read_local_oob_data_complete(hdev, rp->hash192, rp->randomizer192,
1024 rp->hash256, rp->randomizer256,
1025 rp->status);
Johan Hedberg56e5cb82011-11-08 20:40:16 +02001026 hci_dev_unlock(hdev);
Szymon Jancc35938b2011-03-22 13:12:21 +01001027}
1028
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08001029
1030static void hci_cc_le_set_random_addr(struct hci_dev *hdev, struct sk_buff *skb)
1031{
1032 __u8 status = *((__u8 *) skb->data);
1033 bdaddr_t *sent;
1034
1035 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1036
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001037 if (status)
1038 return;
1039
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08001040 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_RANDOM_ADDR);
1041 if (!sent)
1042 return;
1043
1044 hci_dev_lock(hdev);
1045
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001046 bacpy(&hdev->random_addr, sent);
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08001047
1048 hci_dev_unlock(hdev);
1049}
1050
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001051static void hci_cc_le_set_adv_enable(struct hci_dev *hdev, struct sk_buff *skb)
1052{
1053 __u8 *sent, status = *((__u8 *) skb->data);
1054
1055 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1056
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001057 if (status)
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001058 return;
1059
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001060 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADV_ENABLE);
1061 if (!sent)
Johan Hedberg3c857752014-03-25 10:30:49 +02001062 return;
1063
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001064 hci_dev_lock(hdev);
1065
Johan Hedberg3c857752014-03-25 10:30:49 +02001066 /* If we're doing connection initation as peripheral. Set a
1067 * timeout in case something goes wrong.
1068 */
1069 if (*sent) {
1070 struct hci_conn *conn;
1071
Johan Hedberg66c417c2014-07-08 15:07:47 +03001072 set_bit(HCI_LE_ADV, &hdev->dev_flags);
1073
Johan Hedberg3c857752014-03-25 10:30:49 +02001074 conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
1075 if (conn)
1076 queue_delayed_work(hdev->workqueue,
1077 &conn->le_conn_timeout,
Johan Hedberg09ae2602014-07-06 13:41:15 +03001078 conn->conn_timeout);
Johan Hedberg66c417c2014-07-08 15:07:47 +03001079 } else {
1080 clear_bit(HCI_LE_ADV, &hdev->dev_flags);
Johan Hedberg3c857752014-03-25 10:30:49 +02001081 }
1082
Johan Hedberg04b4edc2013-03-15 17:07:01 -05001083 hci_dev_unlock(hdev);
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01001084}
1085
Marcel Holtmann533553f2014-03-21 12:18:10 -07001086static void hci_cc_le_set_scan_param(struct hci_dev *hdev, struct sk_buff *skb)
1087{
1088 struct hci_cp_le_set_scan_param *cp;
1089 __u8 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)
1094 return;
1095
Marcel Holtmann533553f2014-03-21 12:18:10 -07001096 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_PARAM);
1097 if (!cp)
1098 return;
1099
1100 hci_dev_lock(hdev);
1101
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001102 hdev->le_scan_type = cp->type;
Marcel Holtmann533553f2014-03-21 12:18:10 -07001103
1104 hci_dev_unlock(hdev);
1105}
1106
Johan Hedbergb9a63282014-03-25 10:51:52 +02001107static bool has_pending_adv_report(struct hci_dev *hdev)
1108{
1109 struct discovery_state *d = &hdev->discovery;
1110
1111 return bacmp(&d->last_adv_addr, BDADDR_ANY);
1112}
1113
1114static void clear_pending_adv_report(struct hci_dev *hdev)
1115{
1116 struct discovery_state *d = &hdev->discovery;
1117
1118 bacpy(&d->last_adv_addr, BDADDR_ANY);
1119 d->last_adv_data_len = 0;
1120}
1121
1122static void store_pending_adv_report(struct hci_dev *hdev, bdaddr_t *bdaddr,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001123 u8 bdaddr_type, s8 rssi, u32 flags,
1124 u8 *data, u8 len)
Johan Hedbergb9a63282014-03-25 10:51:52 +02001125{
1126 struct discovery_state *d = &hdev->discovery;
1127
1128 bacpy(&d->last_adv_addr, bdaddr);
1129 d->last_adv_addr_type = bdaddr_type;
Johan Hedbergff5cd292014-03-25 14:40:52 +02001130 d->last_adv_rssi = rssi;
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001131 d->last_adv_flags = flags;
Johan Hedbergb9a63282014-03-25 10:51:52 +02001132 memcpy(d->last_adv_data, data, len);
1133 d->last_adv_data_len = len;
1134}
1135
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001136static void hci_cc_le_set_scan_enable(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -03001137 struct sk_buff *skb)
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001138{
1139 struct hci_cp_le_set_scan_enable *cp;
1140 __u8 status = *((__u8 *) skb->data);
1141
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001142 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001143
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001144 if (status)
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001145 return;
1146
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001147 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_ENABLE);
1148 if (!cp)
Andre Guedes3fd319b2013-04-30 15:29:36 -03001149 return;
1150
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001151 switch (cp->enable) {
Andre Guedes76a388be2013-04-04 20:21:02 -03001152 case LE_SCAN_ENABLE:
Andre Guedesd23264a2011-11-25 20:53:38 -03001153 set_bit(HCI_LE_SCAN, &hdev->dev_flags);
Johan Hedbergb9a63282014-03-25 10:51:52 +02001154 if (hdev->le_scan_type == LE_SCAN_ACTIVE)
1155 clear_pending_adv_report(hdev);
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001156 break;
1157
Andre Guedes76a388be2013-04-04 20:21:02 -03001158 case LE_SCAN_DISABLE:
Johan Hedbergb9a63282014-03-25 10:51:52 +02001159 /* We do this here instead of when setting DISCOVERY_STOPPED
1160 * since the latter would potentially require waiting for
1161 * inquiry to stop too.
1162 */
1163 if (has_pending_adv_report(hdev)) {
1164 struct discovery_state *d = &hdev->discovery;
1165
1166 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergab0aa432014-03-26 14:17:12 +02001167 d->last_adv_addr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02001168 d->last_adv_rssi, d->last_adv_flags,
Johan Hedbergab0aa432014-03-26 14:17:12 +02001169 d->last_adv_data,
Johan Hedbergb9a63282014-03-25 10:51:52 +02001170 d->last_adv_data_len, NULL, 0);
1171 }
1172
Johan Hedberg317ac8c2014-02-28 20:26:12 +02001173 /* Cancel this timer so that we don't try to disable scanning
1174 * when it's already disabled.
1175 */
1176 cancel_delayed_work(&hdev->le_scan_disable);
1177
Andre Guedesd23264a2011-11-25 20:53:38 -03001178 clear_bit(HCI_LE_SCAN, &hdev->dev_flags);
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001179
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001180 /* The HCI_LE_SCAN_INTERRUPTED flag indicates that we
1181 * interrupted scanning due to a connect request. Mark
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001182 * therefore discovery as stopped. If this was not
1183 * because of a connect request advertising might have
1184 * been disabled because of active scanning, so
1185 * re-enable it again if necessary.
Johan Hedberg81ad6fd2014-02-28 20:26:13 +02001186 */
1187 if (test_and_clear_bit(HCI_LE_SCAN_INTERRUPTED,
1188 &hdev->dev_flags))
1189 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001190 else if (!test_bit(HCI_LE_ADV, &hdev->dev_flags) &&
Johan Hedberg34722272014-07-08 16:05:05 +03001191 hdev->discovery.state == DISCOVERY_FINDING)
Johan Hedberge8bb6b92014-07-08 15:07:53 +03001192 mgmt_reenable_advertising(hdev);
1193
Andrei Emeltchenko68a8aea2011-12-19 16:14:18 +02001194 break;
1195
1196 default:
1197 BT_ERR("Used reserved LE_Scan_Enable param %d", cp->enable);
1198 break;
Andre Guedes35815082011-05-26 16:23:53 -03001199 }
Andre Guedeseb9d91f2011-05-26 16:23:52 -03001200}
1201
Johan Hedbergcf1d0812013-01-22 14:02:00 +02001202static void hci_cc_le_read_white_list_size(struct hci_dev *hdev,
1203 struct sk_buff *skb)
1204{
1205 struct hci_rp_le_read_white_list_size *rp = (void *) skb->data;
1206
1207 BT_DBG("%s status 0x%2.2x size %u", hdev->name, rp->status, rp->size);
1208
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001209 if (rp->status)
1210 return;
1211
1212 hdev->le_white_list_size = rp->size;
Johan Hedbergcf1d0812013-01-22 14:02:00 +02001213}
1214
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001215static void hci_cc_le_clear_white_list(struct hci_dev *hdev,
1216 struct sk_buff *skb)
1217{
1218 __u8 status = *((__u8 *) skb->data);
1219
1220 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1221
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001222 if (status)
1223 return;
1224
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001225 hci_bdaddr_list_clear(&hdev->le_white_list);
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001226}
1227
1228static void hci_cc_le_add_to_white_list(struct hci_dev *hdev,
1229 struct sk_buff *skb)
1230{
1231 struct hci_cp_le_add_to_white_list *sent;
1232 __u8 status = *((__u8 *) skb->data);
1233
1234 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1235
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001236 if (status)
1237 return;
1238
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001239 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_ADD_TO_WHITE_LIST);
1240 if (!sent)
1241 return;
1242
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001243 hci_bdaddr_list_add(&hdev->le_white_list, &sent->bdaddr,
1244 sent->bdaddr_type);
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001245}
1246
1247static void hci_cc_le_del_from_white_list(struct hci_dev *hdev,
1248 struct sk_buff *skb)
1249{
1250 struct hci_cp_le_del_from_white_list *sent;
1251 __u8 status = *((__u8 *) skb->data);
1252
1253 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1254
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001255 if (status)
1256 return;
1257
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001258 sent = hci_sent_cmd_data(hdev, HCI_OP_LE_DEL_FROM_WHITE_LIST);
1259 if (!sent)
1260 return;
1261
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001262 hci_bdaddr_list_del(&hdev->le_white_list, &sent->bdaddr,
1263 sent->bdaddr_type);
Marcel Holtmann0f36b582014-02-27 20:37:31 -08001264}
1265
Johan Hedberg9b008c02013-01-22 14:02:01 +02001266static void hci_cc_le_read_supported_states(struct hci_dev *hdev,
1267 struct sk_buff *skb)
1268{
1269 struct hci_rp_le_read_supported_states *rp = (void *) skb->data;
1270
1271 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1272
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001273 if (rp->status)
1274 return;
1275
1276 memcpy(hdev->le_states, rp->le_states, 8);
Johan Hedberg9b008c02013-01-22 14:02:01 +02001277}
1278
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001279static void hci_cc_write_le_host_supported(struct hci_dev *hdev,
1280 struct sk_buff *skb)
Andre Guedesf9b49302011-06-30 19:20:53 -03001281{
Johan Hedberg06199cf2012-02-22 16:37:11 +02001282 struct hci_cp_write_le_host_supported *sent;
Andre Guedesf9b49302011-06-30 19:20:53 -03001283 __u8 status = *((__u8 *) skb->data);
1284
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001285 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andre Guedesf9b49302011-06-30 19:20:53 -03001286
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001287 if (status)
1288 return;
1289
Johan Hedberg06199cf2012-02-22 16:37:11 +02001290 sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LE_HOST_SUPPORTED);
Johan Hedberg8f984df2012-02-28 01:07:22 +02001291 if (!sent)
Andre Guedesf9b49302011-06-30 19:20:53 -03001292 return;
1293
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001294 if (sent->le) {
1295 hdev->features[1][0] |= LMP_HOST_LE;
1296 set_bit(HCI_LE_ENABLED, &hdev->dev_flags);
1297 } else {
1298 hdev->features[1][0] &= ~LMP_HOST_LE;
1299 clear_bit(HCI_LE_ENABLED, &hdev->dev_flags);
1300 clear_bit(HCI_ADVERTISING, &hdev->dev_flags);
Johan Hedberg8f984df2012-02-28 01:07:22 +02001301 }
Marcel Holtmann45296ac2014-07-05 10:48:01 +02001302
1303 if (sent->simul)
1304 hdev->features[1][0] |= LMP_HOST_LE_BREDR;
1305 else
1306 hdev->features[1][0] &= ~LMP_HOST_LE_BREDR;
Andre Guedesf9b49302011-06-30 19:20:53 -03001307}
1308
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02001309static void hci_cc_set_adv_param(struct hci_dev *hdev, struct sk_buff *skb)
1310{
1311 struct hci_cp_le_set_adv_param *cp;
1312 u8 status = *((u8 *) skb->data);
1313
1314 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1315
1316 if (status)
1317 return;
1318
1319 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADV_PARAM);
1320 if (!cp)
1321 return;
1322
1323 hci_dev_lock(hdev);
1324 hdev->adv_addr_type = cp->own_address_type;
1325 hci_dev_unlock(hdev);
1326}
1327
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001328static void hci_cc_write_remote_amp_assoc(struct hci_dev *hdev,
1329 struct sk_buff *skb)
1330{
1331 struct hci_rp_write_remote_amp_assoc *rp = (void *) skb->data;
1332
1333 BT_DBG("%s status 0x%2.2x phy_handle 0x%2.2x",
1334 hdev->name, rp->status, rp->phy_handle);
1335
1336 if (rp->status)
1337 return;
1338
1339 amp_write_rem_assoc_continue(hdev, rp->phy_handle);
1340}
1341
Andrzej Kaczmarek5ae76a92014-05-08 15:32:08 +02001342static void hci_cc_read_rssi(struct hci_dev *hdev, struct sk_buff *skb)
1343{
1344 struct hci_rp_read_rssi *rp = (void *) skb->data;
1345 struct hci_conn *conn;
1346
1347 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1348
1349 if (rp->status)
1350 return;
1351
1352 hci_dev_lock(hdev);
1353
1354 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
1355 if (conn)
1356 conn->rssi = rp->rssi;
1357
1358 hci_dev_unlock(hdev);
1359}
1360
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001361static void hci_cc_read_tx_power(struct hci_dev *hdev, struct sk_buff *skb)
1362{
1363 struct hci_cp_read_tx_power *sent;
1364 struct hci_rp_read_tx_power *rp = (void *) skb->data;
1365 struct hci_conn *conn;
1366
1367 BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
1368
1369 if (rp->status)
1370 return;
1371
1372 sent = hci_sent_cmd_data(hdev, HCI_OP_READ_TX_POWER);
1373 if (!sent)
1374 return;
1375
1376 hci_dev_lock(hdev);
1377
1378 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
Andrzej Kaczmarekd0455ed2014-05-14 13:43:05 +02001379 if (!conn)
1380 goto unlock;
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001381
Andrzej Kaczmarekd0455ed2014-05-14 13:43:05 +02001382 switch (sent->type) {
1383 case 0x00:
1384 conn->tx_power = rp->tx_power;
1385 break;
1386 case 0x01:
1387 conn->max_tx_power = rp->tx_power;
1388 break;
1389 }
1390
1391unlock:
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02001392 hci_dev_unlock(hdev);
1393}
1394
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001395static void hci_cs_inquiry(struct hci_dev *hdev, __u8 status)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001396{
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001397 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001398
1399 if (status) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001400 hci_conn_check_pending(hdev);
Johan Hedberg314b2382011-04-27 10:29:57 -04001401 return;
1402 }
1403
Andre Guedes89352e72011-11-04 14:16:53 -03001404 set_bit(HCI_INQUIRY, &hdev->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001405}
1406
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001407static void hci_cs_create_conn(struct hci_dev *hdev, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001408{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001409 struct hci_cp_create_conn *cp;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001410 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001411
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001412 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001413
1414 cp = hci_sent_cmd_data(hdev, HCI_OP_CREATE_CONN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001415 if (!cp)
1416 return;
1417
1418 hci_dev_lock(hdev);
1419
1420 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
1421
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03001422 BT_DBG("%s bdaddr %pMR hcon %p", hdev->name, &cp->bdaddr, conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001423
1424 if (status) {
1425 if (conn && conn->state == BT_CONNECT) {
Marcel Holtmann4c67bc72006-10-15 17:30:56 +02001426 if (status != 0x0c || conn->attempt > 2) {
1427 conn->state = BT_CLOSED;
1428 hci_proto_connect_cfm(conn, status);
1429 hci_conn_del(conn);
1430 } else
1431 conn->state = BT_CONNECT2;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001432 }
1433 } else {
1434 if (!conn) {
1435 conn = hci_conn_add(hdev, ACL_LINK, &cp->bdaddr);
1436 if (conn) {
Johan Hedberga0c808b2012-01-16 09:49:58 +02001437 conn->out = true;
Johan Hedberg4dae2792014-06-24 17:03:50 +03001438 set_bit(HCI_CONN_MASTER, &conn->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001439 } else
Gustavo F. Padovan893ef972010-07-18 15:13:37 -03001440 BT_ERR("No memory for new connection");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001441 }
1442 }
1443
1444 hci_dev_unlock(hdev);
1445}
1446
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001447static void hci_cs_add_sco(struct hci_dev *hdev, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001448{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001449 struct hci_cp_add_sco *cp;
1450 struct hci_conn *acl, *sco;
1451 __u16 handle;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001452
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001453 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001454
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001455 if (!status)
1456 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001457
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001458 cp = hci_sent_cmd_data(hdev, HCI_OP_ADD_SCO);
1459 if (!cp)
1460 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001461
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001462 handle = __le16_to_cpu(cp->handle);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001463
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001464 BT_DBG("%s handle 0x%4.4x", hdev->name, handle);
Marcel Holtmann6bd57412006-11-18 22:14:22 +01001465
1466 hci_dev_lock(hdev);
1467
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001468 acl = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001469 if (acl) {
1470 sco = acl->link;
1471 if (sco) {
1472 sco->state = BT_CLOSED;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001473
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001474 hci_proto_connect_cfm(sco, status);
1475 hci_conn_del(sco);
1476 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001477 }
Marcel Holtmann6bd57412006-11-18 22:14:22 +01001478
1479 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001480}
1481
Marcel Holtmannf8558552008-07-14 20:13:49 +02001482static void hci_cs_auth_requested(struct hci_dev *hdev, __u8 status)
1483{
1484 struct hci_cp_auth_requested *cp;
1485 struct hci_conn *conn;
1486
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001487 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001488
1489 if (!status)
1490 return;
1491
1492 cp = hci_sent_cmd_data(hdev, HCI_OP_AUTH_REQUESTED);
1493 if (!cp)
1494 return;
1495
1496 hci_dev_lock(hdev);
1497
1498 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1499 if (conn) {
1500 if (conn->state == BT_CONFIG) {
1501 hci_proto_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001502 hci_conn_drop(conn);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001503 }
1504 }
1505
1506 hci_dev_unlock(hdev);
1507}
1508
1509static void hci_cs_set_conn_encrypt(struct hci_dev *hdev, __u8 status)
1510{
1511 struct hci_cp_set_conn_encrypt *cp;
1512 struct hci_conn *conn;
1513
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001514 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001515
1516 if (!status)
1517 return;
1518
1519 cp = hci_sent_cmd_data(hdev, HCI_OP_SET_CONN_ENCRYPT);
1520 if (!cp)
1521 return;
1522
1523 hci_dev_lock(hdev);
1524
1525 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1526 if (conn) {
1527 if (conn->state == BT_CONFIG) {
1528 hci_proto_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001529 hci_conn_drop(conn);
Marcel Holtmannf8558552008-07-14 20:13:49 +02001530 }
1531 }
1532
1533 hci_dev_unlock(hdev);
1534}
1535
Johan Hedberg127178d2010-11-18 22:22:29 +02001536static int hci_outgoing_auth_needed(struct hci_dev *hdev,
Gustavo Padovan807deac2012-05-17 00:36:24 -03001537 struct hci_conn *conn)
Johan Hedberg392599b2010-11-18 22:22:28 +02001538{
Johan Hedberg392599b2010-11-18 22:22:28 +02001539 if (conn->state != BT_CONFIG || !conn->out)
1540 return 0;
1541
Johan Hedberg765c2a92011-01-19 12:06:52 +05301542 if (conn->pending_sec_level == BT_SECURITY_SDP)
Johan Hedberg392599b2010-11-18 22:22:28 +02001543 return 0;
1544
1545 /* Only request authentication for SSP connections or non-SSP
Johan Hedberg264b8b42014-01-08 16:40:39 +02001546 * devices with sec_level MEDIUM or HIGH or if MITM protection
1547 * is requested.
1548 */
Gustavo Padovan807deac2012-05-17 00:36:24 -03001549 if (!hci_conn_ssp_enabled(conn) && !(conn->auth_type & 0x01) &&
Johan Hedberg7e3691e2014-05-30 14:45:19 +03001550 conn->pending_sec_level != BT_SECURITY_FIPS &&
Johan Hedberg264b8b42014-01-08 16:40:39 +02001551 conn->pending_sec_level != BT_SECURITY_HIGH &&
1552 conn->pending_sec_level != BT_SECURITY_MEDIUM)
Johan Hedberg392599b2010-11-18 22:22:28 +02001553 return 0;
1554
Johan Hedberg392599b2010-11-18 22:22:28 +02001555 return 1;
1556}
1557
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001558static int hci_resolve_name(struct hci_dev *hdev,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001559 struct inquiry_entry *e)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001560{
1561 struct hci_cp_remote_name_req cp;
1562
1563 memset(&cp, 0, sizeof(cp));
1564
1565 bacpy(&cp.bdaddr, &e->data.bdaddr);
1566 cp.pscan_rep_mode = e->data.pscan_rep_mode;
1567 cp.pscan_mode = e->data.pscan_mode;
1568 cp.clock_offset = e->data.clock_offset;
1569
1570 return hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
1571}
1572
Johan Hedbergb644ba32012-01-17 21:48:47 +02001573static bool hci_resolve_next_name(struct hci_dev *hdev)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001574{
1575 struct discovery_state *discov = &hdev->discovery;
1576 struct inquiry_entry *e;
1577
Johan Hedbergb644ba32012-01-17 21:48:47 +02001578 if (list_empty(&discov->resolve))
1579 return false;
1580
1581 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
Ram Malovanyc8100892012-07-19 10:26:09 +03001582 if (!e)
1583 return false;
1584
Johan Hedbergb644ba32012-01-17 21:48:47 +02001585 if (hci_resolve_name(hdev, e) == 0) {
1586 e->name_state = NAME_PENDING;
1587 return true;
1588 }
1589
1590 return false;
1591}
1592
1593static void hci_check_pending_name(struct hci_dev *hdev, struct hci_conn *conn,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001594 bdaddr_t *bdaddr, u8 *name, u8 name_len)
Johan Hedbergb644ba32012-01-17 21:48:47 +02001595{
1596 struct discovery_state *discov = &hdev->discovery;
1597 struct inquiry_entry *e;
1598
1599 if (conn && !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001600 mgmt_device_connected(hdev, bdaddr, ACL_LINK, 0x00, 0, name,
1601 name_len, conn->dev_class);
Johan Hedbergb644ba32012-01-17 21:48:47 +02001602
1603 if (discov->state == DISCOVERY_STOPPED)
1604 return;
1605
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001606 if (discov->state == DISCOVERY_STOPPING)
1607 goto discov_complete;
1608
1609 if (discov->state != DISCOVERY_RESOLVING)
1610 return;
1611
1612 e = hci_inquiry_cache_lookup_resolve(hdev, bdaddr, NAME_PENDING);
Ram Malovany7cc83802012-07-19 10:26:10 +03001613 /* If the device was not found in a list of found devices names of which
1614 * are pending. there is no need to continue resolving a next name as it
1615 * will be done upon receiving another Remote Name Request Complete
1616 * Event */
1617 if (!e)
1618 return;
1619
1620 list_del(&e->list);
1621 if (name) {
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001622 e->name_state = NAME_KNOWN;
Ram Malovany7cc83802012-07-19 10:26:10 +03001623 mgmt_remote_name(hdev, bdaddr, ACL_LINK, 0x00,
1624 e->data.rssi, name, name_len);
Ram Malovanyc3e7c0d2012-07-19 10:26:11 +03001625 } else {
1626 e->name_state = NAME_NOT_KNOWN;
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001627 }
1628
Johan Hedbergb644ba32012-01-17 21:48:47 +02001629 if (hci_resolve_next_name(hdev))
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001630 return;
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001631
1632discov_complete:
1633 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
1634}
1635
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001636static void hci_cs_remote_name_req(struct hci_dev *hdev, __u8 status)
1637{
Johan Hedberg127178d2010-11-18 22:22:29 +02001638 struct hci_cp_remote_name_req *cp;
1639 struct hci_conn *conn;
1640
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001641 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Johan Hedberg127178d2010-11-18 22:22:29 +02001642
1643 /* If successful wait for the name req complete event before
1644 * checking for the need to do authentication */
1645 if (!status)
1646 return;
1647
1648 cp = hci_sent_cmd_data(hdev, HCI_OP_REMOTE_NAME_REQ);
1649 if (!cp)
1650 return;
1651
1652 hci_dev_lock(hdev);
1653
1654 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02001655
1656 if (test_bit(HCI_MGMT, &hdev->dev_flags))
1657 hci_check_pending_name(hdev, conn, &cp->bdaddr, NULL, 0);
1658
Johan Hedberg79c6c702011-04-28 11:28:55 -07001659 if (!conn)
1660 goto unlock;
1661
1662 if (!hci_outgoing_auth_needed(hdev, conn))
1663 goto unlock;
1664
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001665 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02001666 struct hci_cp_auth_requested auth_cp;
1667
1668 auth_cp.handle = __cpu_to_le16(conn->handle);
1669 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED,
1670 sizeof(auth_cp), &auth_cp);
Johan Hedberg127178d2010-11-18 22:22:29 +02001671 }
1672
Johan Hedberg79c6c702011-04-28 11:28:55 -07001673unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02001674 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001675}
1676
Marcel Holtmann769be972008-07-14 20:13:49 +02001677static void hci_cs_read_remote_features(struct hci_dev *hdev, __u8 status)
1678{
1679 struct hci_cp_read_remote_features *cp;
1680 struct hci_conn *conn;
1681
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001682 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann769be972008-07-14 20:13:49 +02001683
1684 if (!status)
1685 return;
1686
1687 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_REMOTE_FEATURES);
1688 if (!cp)
1689 return;
1690
1691 hci_dev_lock(hdev);
1692
1693 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1694 if (conn) {
1695 if (conn->state == BT_CONFIG) {
Marcel Holtmann769be972008-07-14 20:13:49 +02001696 hci_proto_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001697 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02001698 }
1699 }
1700
1701 hci_dev_unlock(hdev);
1702}
1703
1704static void hci_cs_read_remote_ext_features(struct hci_dev *hdev, __u8 status)
1705{
1706 struct hci_cp_read_remote_ext_features *cp;
1707 struct hci_conn *conn;
1708
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001709 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmann769be972008-07-14 20:13:49 +02001710
1711 if (!status)
1712 return;
1713
1714 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES);
1715 if (!cp)
1716 return;
1717
1718 hci_dev_lock(hdev);
1719
1720 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1721 if (conn) {
1722 if (conn->state == BT_CONFIG) {
Marcel Holtmann769be972008-07-14 20:13:49 +02001723 hci_proto_connect_cfm(conn, status);
David Herrmann76a68ba2013-04-06 20:28:37 +02001724 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02001725 }
1726 }
1727
1728 hci_dev_unlock(hdev);
1729}
1730
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001731static void hci_cs_setup_sync_conn(struct hci_dev *hdev, __u8 status)
1732{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001733 struct hci_cp_setup_sync_conn *cp;
1734 struct hci_conn *acl, *sco;
1735 __u16 handle;
1736
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001737 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001738
1739 if (!status)
1740 return;
1741
1742 cp = hci_sent_cmd_data(hdev, HCI_OP_SETUP_SYNC_CONN);
1743 if (!cp)
1744 return;
1745
1746 handle = __le16_to_cpu(cp->handle);
1747
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001748 BT_DBG("%s handle 0x%4.4x", hdev->name, handle);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001749
1750 hci_dev_lock(hdev);
1751
1752 acl = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001753 if (acl) {
1754 sco = acl->link;
1755 if (sco) {
1756 sco->state = BT_CLOSED;
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001757
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02001758 hci_proto_connect_cfm(sco, status);
1759 hci_conn_del(sco);
1760 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02001761 }
1762
1763 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001764}
1765
1766static void hci_cs_sniff_mode(struct hci_dev *hdev, __u8 status)
1767{
1768 struct hci_cp_sniff_mode *cp;
1769 struct hci_conn *conn;
1770
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001771 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001772
1773 if (!status)
1774 return;
1775
1776 cp = hci_sent_cmd_data(hdev, HCI_OP_SNIFF_MODE);
1777 if (!cp)
1778 return;
1779
1780 hci_dev_lock(hdev);
1781
1782 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001783 if (conn) {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001784 clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001785
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001786 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001787 hci_sco_setup(conn, status);
1788 }
1789
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001790 hci_dev_unlock(hdev);
1791}
1792
1793static void hci_cs_exit_sniff_mode(struct hci_dev *hdev, __u8 status)
1794{
1795 struct hci_cp_exit_sniff_mode *cp;
1796 struct hci_conn *conn;
1797
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001798 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001799
1800 if (!status)
1801 return;
1802
1803 cp = hci_sent_cmd_data(hdev, HCI_OP_EXIT_SNIFF_MODE);
1804 if (!cp)
1805 return;
1806
1807 hci_dev_lock(hdev);
1808
1809 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001810 if (conn) {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001811 clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001812
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001813 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04001814 hci_sco_setup(conn, status);
1815 }
1816
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001817 hci_dev_unlock(hdev);
1818}
1819
Johan Hedberg88c3df12012-02-09 14:27:38 +02001820static void hci_cs_disconnect(struct hci_dev *hdev, u8 status)
1821{
1822 struct hci_cp_disconnect *cp;
1823 struct hci_conn *conn;
1824
1825 if (!status)
1826 return;
1827
1828 cp = hci_sent_cmd_data(hdev, HCI_OP_DISCONNECT);
1829 if (!cp)
1830 return;
1831
1832 hci_dev_lock(hdev);
1833
1834 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1835 if (conn)
1836 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03001837 conn->dst_type, status);
Johan Hedberg88c3df12012-02-09 14:27:38 +02001838
1839 hci_dev_unlock(hdev);
1840}
1841
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03001842static void hci_cs_create_phylink(struct hci_dev *hdev, u8 status)
1843{
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001844 struct hci_cp_create_phy_link *cp;
1845
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03001846 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001847
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03001848 cp = hci_sent_cmd_data(hdev, HCI_OP_CREATE_PHY_LINK);
1849 if (!cp)
1850 return;
1851
Andrei Emeltchenkoe58917b2012-10-31 15:46:33 +02001852 hci_dev_lock(hdev);
1853
1854 if (status) {
1855 struct hci_conn *hcon;
1856
1857 hcon = hci_conn_hash_lookup_handle(hdev, cp->phy_handle);
1858 if (hcon)
1859 hci_conn_del(hcon);
1860 } else {
1861 amp_write_remote_assoc(hdev, cp->phy_handle);
1862 }
1863
1864 hci_dev_unlock(hdev);
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03001865}
1866
Andrei Emeltchenko0b26ab92012-09-27 17:26:24 +03001867static void hci_cs_accept_phylink(struct hci_dev *hdev, u8 status)
1868{
1869 struct hci_cp_accept_phy_link *cp;
1870
1871 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1872
1873 if (status)
1874 return;
1875
1876 cp = hci_sent_cmd_data(hdev, HCI_OP_ACCEPT_PHY_LINK);
1877 if (!cp)
1878 return;
1879
1880 amp_write_remote_assoc(hdev, cp->phy_handle);
1881}
1882
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02001883static void hci_cs_le_create_conn(struct hci_dev *hdev, u8 status)
1884{
1885 struct hci_cp_le_create_conn *cp;
1886 struct hci_conn *conn;
1887
1888 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1889
1890 /* All connection failure handling is taken care of by the
1891 * hci_le_conn_failed function which is triggered by the HCI
1892 * request completion callbacks used for connecting.
1893 */
1894 if (status)
1895 return;
1896
1897 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_CREATE_CONN);
1898 if (!cp)
1899 return;
1900
1901 hci_dev_lock(hdev);
1902
1903 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->peer_addr);
1904 if (!conn)
1905 goto unlock;
1906
1907 /* Store the initiator and responder address information which
1908 * is needed for SMP. These values will not change during the
1909 * lifetime of the connection.
1910 */
1911 conn->init_addr_type = cp->own_address_type;
1912 if (cp->own_address_type == ADDR_LE_DEV_RANDOM)
1913 bacpy(&conn->init_addr, &hdev->random_addr);
1914 else
1915 bacpy(&conn->init_addr, &hdev->bdaddr);
1916
1917 conn->resp_addr_type = cp->peer_addr_type;
1918 bacpy(&conn->resp_addr, &cp->peer_addr);
1919
Johan Hedberg9489eca2014-02-28 17:45:46 +02001920 /* We don't want the connection attempt to stick around
1921 * indefinitely since LE doesn't have a page timeout concept
1922 * like BR/EDR. Set a timer for any connection that doesn't use
1923 * the white list for connecting.
1924 */
1925 if (cp->filter_policy == HCI_LE_USE_PEER_ADDR)
1926 queue_delayed_work(conn->hdev->workqueue,
1927 &conn->le_conn_timeout,
Johan Hedberg09ae2602014-07-06 13:41:15 +03001928 conn->conn_timeout);
Johan Hedberg9489eca2014-02-28 17:45:46 +02001929
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02001930unlock:
1931 hci_dev_unlock(hdev);
1932}
1933
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02001934static void hci_cs_le_start_enc(struct hci_dev *hdev, u8 status)
1935{
1936 struct hci_cp_le_start_enc *cp;
1937 struct hci_conn *conn;
1938
1939 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1940
1941 if (!status)
1942 return;
1943
1944 hci_dev_lock(hdev);
1945
1946 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_START_ENC);
1947 if (!cp)
1948 goto unlock;
1949
1950 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
1951 if (!conn)
1952 goto unlock;
1953
1954 if (conn->state != BT_CONNECTED)
1955 goto unlock;
1956
1957 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
1958 hci_conn_drop(conn);
1959
1960unlock:
1961 hci_dev_unlock(hdev);
1962}
1963
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001964static void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001965{
1966 __u8 status = *((__u8 *) skb->data);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001967 struct discovery_state *discov = &hdev->discovery;
1968 struct inquiry_entry *e;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001969
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03001970 BT_DBG("%s status 0x%2.2x", hdev->name, status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001971
Marcel Holtmanna9de9242007-10-20 13:33:56 +02001972 hci_conn_check_pending(hdev);
Andre Guedes89352e72011-11-04 14:16:53 -03001973
1974 if (!test_and_clear_bit(HCI_INQUIRY, &hdev->flags))
1975 return;
1976
Peter Zijlstra4e857c52014-03-17 18:06:10 +01001977 smp_mb__after_atomic(); /* wake_up_bit advises about this barrier */
Andre Guedes3e13fa12013-03-27 20:04:56 -03001978 wake_up_bit(&hdev->flags, HCI_INQUIRY);
1979
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02001980 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001981 return;
1982
Johan Hedberg56e5cb82011-11-08 20:40:16 +02001983 hci_dev_lock(hdev);
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001984
Andre Guedes343f9352012-02-17 20:39:37 -03001985 if (discov->state != DISCOVERY_FINDING)
Johan Hedberg30dc78e2012-01-04 15:44:20 +02001986 goto unlock;
1987
1988 if (list_empty(&discov->resolve)) {
1989 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
1990 goto unlock;
1991 }
1992
1993 e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
1994 if (e && hci_resolve_name(hdev, e) == 0) {
1995 e->name_state = NAME_PENDING;
1996 hci_discovery_set_state(hdev, DISCOVERY_RESOLVING);
1997 } else {
1998 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
1999 }
2000
2001unlock:
Johan Hedberg56e5cb82011-11-08 20:40:16 +02002002 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002003}
2004
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002005static void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002006{
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002007 struct inquiry_data data;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002008 struct inquiry_info *info = (void *) (skb->data + 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002009 int num_rsp = *((__u8 *) skb->data);
2010
2011 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
2012
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002013 if (!num_rsp)
2014 return;
2015
Andre Guedes1519cc12012-03-21 00:03:38 -03002016 if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags))
2017 return;
2018
Linus Torvalds1da177e2005-04-16 15:20:36 -07002019 hci_dev_lock(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002020
Johan Hedberge17acd42011-03-30 23:57:16 +03002021 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02002022 u32 flags;
Johan Hedberg31754052012-01-04 13:39:52 +02002023
Linus Torvalds1da177e2005-04-16 15:20:36 -07002024 bacpy(&data.bdaddr, &info->bdaddr);
2025 data.pscan_rep_mode = info->pscan_rep_mode;
2026 data.pscan_period_mode = info->pscan_period_mode;
2027 data.pscan_mode = info->pscan_mode;
2028 memcpy(data.dev_class, info->dev_class, 3);
2029 data.clock_offset = info->clock_offset;
2030 data.rssi = 0x00;
Marcel Holtmann41a96212008-07-14 20:13:48 +02002031 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02002032
Marcel Holtmannaf589252014-07-01 14:11:20 +02002033 flags = hci_inquiry_cache_update(hdev, &data, false);
2034
Johan Hedberg48264f02011-11-09 13:58:58 +02002035 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Marcel Holtmannaf589252014-07-01 14:11:20 +02002036 info->dev_class, 0, flags, NULL, 0, NULL, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002037 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002038
Linus Torvalds1da177e2005-04-16 15:20:36 -07002039 hci_dev_unlock(hdev);
2040}
2041
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002042static void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002043{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002044 struct hci_ev_conn_complete *ev = (void *) skb->data;
2045 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002046
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002047 BT_DBG("%s", hdev->name);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002048
Linus Torvalds1da177e2005-04-16 15:20:36 -07002049 hci_dev_lock(hdev);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002050
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002051 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann94992372009-04-19 19:30:03 +02002052 if (!conn) {
2053 if (ev->link_type != SCO_LINK)
2054 goto unlock;
2055
2056 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
2057 if (!conn)
2058 goto unlock;
2059
2060 conn->type = SCO_LINK;
2061 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002062
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002063 if (!ev->status) {
2064 conn->handle = __le16_to_cpu(ev->handle);
Marcel Holtmann769be972008-07-14 20:13:49 +02002065
2066 if (conn->type == ACL_LINK) {
2067 conn->state = BT_CONFIG;
2068 hci_conn_hold(conn);
Szymon Janca9ea3ed2012-07-19 14:46:08 +02002069
2070 if (!conn->out && !hci_conn_ssp_enabled(conn) &&
2071 !hci_find_link_key(hdev, &ev->bdaddr))
2072 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
2073 else
2074 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
Marcel Holtmann769be972008-07-14 20:13:49 +02002075 } else
2076 conn->state = BT_CONNECTED;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002077
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02002078 hci_conn_add_sysfs(conn);
2079
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002080 if (test_bit(HCI_AUTH, &hdev->flags))
Johan Hedberg4dae2792014-06-24 17:03:50 +03002081 set_bit(HCI_CONN_AUTH, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002082
2083 if (test_bit(HCI_ENCRYPT, &hdev->flags))
Johan Hedberg4dae2792014-06-24 17:03:50 +03002084 set_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002085
2086 /* Get remote features */
2087 if (conn->type == ACL_LINK) {
2088 struct hci_cp_read_remote_features cp;
2089 cp.handle = ev->handle;
Marcel Holtmann769be972008-07-14 20:13:49 +02002090 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_FEATURES,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002091 sizeof(cp), &cp);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002092 }
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002093
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002094 /* Set packet type for incoming connection */
Andrei Emeltchenkod095c1e2011-12-01 14:33:27 +02002095 if (!conn->out && hdev->hci_ver < BLUETOOTH_VER_2_0) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002096 struct hci_cp_change_conn_ptype cp;
2097 cp.handle = ev->handle;
Marcel Holtmanna8746412008-07-14 20:13:46 +02002098 cp.pkt_type = cpu_to_le16(conn->pkt_type);
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002099 hci_send_cmd(hdev, HCI_OP_CHANGE_CONN_PTYPE, sizeof(cp),
2100 &cp);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002101 }
Johan Hedberg17d5c042011-01-22 06:09:08 +02002102 } else {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002103 conn->state = BT_CLOSED;
Johan Hedberg17d5c042011-01-22 06:09:08 +02002104 if (conn->type == ACL_LINK)
Marcel Holtmann64c7b772014-02-18 14:22:20 -08002105 mgmt_connect_failed(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002106 conn->dst_type, ev->status);
Johan Hedberg17d5c042011-01-22 06:09:08 +02002107 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002108
Marcel Holtmanne73439d2010-07-26 10:06:00 -04002109 if (conn->type == ACL_LINK)
2110 hci_sco_setup(conn, ev->status);
Marcel Holtmann45bb4bf2005-08-09 20:27:49 -07002111
Marcel Holtmann769be972008-07-14 20:13:49 +02002112 if (ev->status) {
2113 hci_proto_connect_cfm(conn, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002114 hci_conn_del(conn);
Marcel Holtmannc89b6e62009-01-15 21:57:03 +01002115 } else if (ev->link_type != ACL_LINK)
2116 hci_proto_connect_cfm(conn, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002117
2118unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002119 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002120
2121 hci_conn_check_pending(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002122}
2123
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002124static void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002125{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002126 struct hci_ev_conn_request *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002127 int mask = hdev->link_mode;
Frédéric Dalleau20714bfe2012-11-21 10:51:12 +01002128 __u8 flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002129
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03002130 BT_DBG("%s bdaddr %pMR type 0x%x", hdev->name, &ev->bdaddr,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002131 ev->link_type);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002132
Frédéric Dalleau20714bfe2012-11-21 10:51:12 +01002133 mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, ev->link_type,
2134 &flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002135
Szymon Janc138d22e2011-02-17 16:44:23 +01002136 if ((mask & HCI_LM_ACCEPT) &&
Johan Hedbergdcc36c12014-07-09 12:59:13 +03002137 !hci_bdaddr_list_lookup(&hdev->blacklist, &ev->bdaddr,
2138 BDADDR_BREDR)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002139 /* Connection accepted */
Marcel Holtmannc7bdd502008-07-14 20:13:47 +02002140 struct inquiry_entry *ie;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002141 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002142
2143 hci_dev_lock(hdev);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002144
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02002145 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
2146 if (ie)
Marcel Holtmannc7bdd502008-07-14 20:13:47 +02002147 memcpy(ie->data.dev_class, ev->dev_class, 3);
2148
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03002149 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type,
2150 &ev->bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002151 if (!conn) {
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02002152 conn = hci_conn_add(hdev, ev->link_type, &ev->bdaddr);
2153 if (!conn) {
Gustavo F. Padovan893ef972010-07-18 15:13:37 -03002154 BT_ERR("No memory for new connection");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002155 hci_dev_unlock(hdev);
2156 return;
2157 }
2158 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002159
Linus Torvalds1da177e2005-04-16 15:20:36 -07002160 memcpy(conn->dev_class, ev->dev_class, 3);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002161
Linus Torvalds1da177e2005-04-16 15:20:36 -07002162 hci_dev_unlock(hdev);
2163
Frédéric Dalleau20714bfe2012-11-21 10:51:12 +01002164 if (ev->link_type == ACL_LINK ||
2165 (!(flags & HCI_PROTO_DEFER) && !lmp_esco_capable(hdev))) {
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002166 struct hci_cp_accept_conn_req cp;
Frédéric Dalleau20714bfe2012-11-21 10:51:12 +01002167 conn->state = BT_CONNECT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002168
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002169 bacpy(&cp.bdaddr, &ev->bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002170
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002171 if (lmp_rswitch_capable(hdev) && (mask & HCI_LM_MASTER))
2172 cp.role = 0x00; /* Become master */
2173 else
2174 cp.role = 0x01; /* Remain slave */
2175
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002176 hci_send_cmd(hdev, HCI_OP_ACCEPT_CONN_REQ, sizeof(cp),
2177 &cp);
Frédéric Dalleau20714bfe2012-11-21 10:51:12 +01002178 } else if (!(flags & HCI_PROTO_DEFER)) {
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002179 struct hci_cp_accept_sync_conn_req cp;
Frédéric Dalleau20714bfe2012-11-21 10:51:12 +01002180 conn->state = BT_CONNECT;
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002181
2182 bacpy(&cp.bdaddr, &ev->bdaddr);
Marcel Holtmanna8746412008-07-14 20:13:46 +02002183 cp.pkt_type = cpu_to_le16(conn->pkt_type);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002184
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002185 cp.tx_bandwidth = cpu_to_le32(0x00001f40);
2186 cp.rx_bandwidth = cpu_to_le32(0x00001f40);
2187 cp.max_latency = cpu_to_le16(0xffff);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002188 cp.content_format = cpu_to_le16(hdev->voice_setting);
2189 cp.retrans_effort = 0xff;
2190
2191 hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002192 sizeof(cp), &cp);
Frédéric Dalleau20714bfe2012-11-21 10:51:12 +01002193 } else {
2194 conn->state = BT_CONNECT2;
2195 hci_proto_connect_cfm(conn, 0);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002196 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002197 } else {
2198 /* Connection rejected */
2199 struct hci_cp_reject_conn_req cp;
2200
2201 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02002202 cp.reason = HCI_ERROR_REJ_BAD_ADDR;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002203 hci_send_cmd(hdev, HCI_OP_REJECT_CONN_REQ, sizeof(cp), &cp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002204 }
2205}
2206
Mikel Astizf0d6a0e2012-08-09 09:52:30 +02002207static u8 hci_to_mgmt_reason(u8 err)
2208{
2209 switch (err) {
2210 case HCI_ERROR_CONNECTION_TIMEOUT:
2211 return MGMT_DEV_DISCONN_TIMEOUT;
2212 case HCI_ERROR_REMOTE_USER_TERM:
2213 case HCI_ERROR_REMOTE_LOW_RESOURCES:
2214 case HCI_ERROR_REMOTE_POWER_OFF:
2215 return MGMT_DEV_DISCONN_REMOTE;
2216 case HCI_ERROR_LOCAL_HOST_TERM:
2217 return MGMT_DEV_DISCONN_LOCAL_HOST;
2218 default:
2219 return MGMT_DEV_DISCONN_UNKNOWN;
2220 }
2221}
2222
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002223static void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002224{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002225 struct hci_ev_disconn_complete *ev = (void *) skb->data;
Andre Guedesabf54a52013-11-07 17:36:09 -03002226 u8 reason = hci_to_mgmt_reason(ev->reason);
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002227 struct hci_conn_params *params;
Marcel Holtmann04837f62006-07-03 10:02:33 +02002228 struct hci_conn *conn;
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002229 bool mgmt_connected;
Andre Guedes38462202013-11-07 17:36:10 -03002230 u8 type;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002231
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002232 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002233
Linus Torvalds1da177e2005-04-16 15:20:36 -07002234 hci_dev_lock(hdev);
2235
Marcel Holtmann04837f62006-07-03 10:02:33 +02002236 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergf7520542011-01-20 12:34:39 +02002237 if (!conn)
2238 goto unlock;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02002239
Andre Guedesabf54a52013-11-07 17:36:09 -03002240 if (ev->status) {
2241 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
2242 conn->dst_type, ev->status);
2243 goto unlock;
Johan Hedberg37d9ef72011-11-10 15:54:39 +02002244 }
Johan Hedbergf7520542011-01-20 12:34:39 +02002245
Andre Guedes38462202013-11-07 17:36:10 -03002246 conn->state = BT_CLOSED;
2247
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002248 mgmt_connected = test_and_clear_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags);
2249 mgmt_device_disconnected(hdev, &conn->dst, conn->type, conn->dst_type,
2250 reason, mgmt_connected);
Andre Guedesabf54a52013-11-07 17:36:09 -03002251
Johan Hedbergaf6a9c32014-06-24 13:15:53 +03002252 if (conn->type == ACL_LINK &&
2253 test_bit(HCI_CONN_FLUSH_KEY, &conn->flags))
Andre Guedes38462202013-11-07 17:36:10 -03002254 hci_remove_link_key(hdev, &conn->dst);
Johan Hedberg22102462013-10-05 12:01:06 +02002255
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002256 params = hci_conn_params_lookup(hdev, &conn->dst, conn->dst_type);
2257 if (params) {
2258 switch (params->auto_connect) {
2259 case HCI_AUTO_CONN_LINK_LOSS:
2260 if (ev->reason != HCI_ERROR_CONNECTION_TIMEOUT)
2261 break;
2262 /* Fall through */
2263
2264 case HCI_AUTO_CONN_ALWAYS:
Johan Hedberg418025d2014-07-04 12:37:24 +03002265 list_del_init(&params->action);
2266 list_add(&params->action, &hdev->pend_le_conns);
2267 hci_update_background_scan(hdev);
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002268 break;
2269
2270 default:
2271 break;
2272 }
2273 }
2274
Andre Guedes38462202013-11-07 17:36:10 -03002275 type = conn->type;
Johan Hedberg22102462013-10-05 12:01:06 +02002276
Andre Guedes38462202013-11-07 17:36:10 -03002277 hci_proto_disconn_cfm(conn, ev->reason);
2278 hci_conn_del(conn);
2279
2280 /* Re-enable advertising if necessary, since it might
2281 * have been disabled by the connection. From the
2282 * HCI_LE_Set_Advertise_Enable command description in
2283 * the core specification (v4.0):
2284 * "The Controller shall continue advertising until the Host
2285 * issues an LE_Set_Advertise_Enable command with
2286 * Advertising_Enable set to 0x00 (Advertising is disabled)
2287 * or until a connection is created or until the Advertising
2288 * is timed out due to Directed Advertising."
2289 */
2290 if (type == LE_LINK)
2291 mgmt_reenable_advertising(hdev);
Johan Hedbergf7520542011-01-20 12:34:39 +02002292
2293unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002294 hci_dev_unlock(hdev);
2295}
2296
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002297static void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002298{
2299 struct hci_ev_auth_complete *ev = (void *) skb->data;
2300 struct hci_conn *conn;
2301
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002302 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002303
2304 hci_dev_lock(hdev);
2305
2306 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002307 if (!conn)
2308 goto unlock;
2309
2310 if (!ev->status) {
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002311 if (!hci_conn_ssp_enabled(conn) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03002312 test_bit(HCI_CONN_REAUTH_PEND, &conn->flags)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002313 BT_INFO("re-auth of legacy device is not possible.");
Johan Hedberg2a611692011-02-19 12:06:00 -03002314 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002315 set_bit(HCI_CONN_AUTH, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002316 conn->sec_level = conn->pending_sec_level;
Johan Hedberg2a611692011-02-19 12:06:00 -03002317 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002318 } else {
Johan Hedbergbab73cb2012-02-09 16:07:29 +02002319 mgmt_auth_failed(hdev, &conn->dst, conn->type, conn->dst_type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002320 ev->status);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002321 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002322
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002323 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
2324 clear_bit(HCI_CONN_REAUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002325
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002326 if (conn->state == BT_CONFIG) {
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002327 if (!ev->status && hci_conn_ssp_enabled(conn)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002328 struct hci_cp_set_conn_encrypt cp;
2329 cp.handle = ev->handle;
2330 cp.encrypt = 0x01;
2331 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002332 &cp);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002333 } else {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002334 conn->state = BT_CONNECTED;
2335 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002336 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002337 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002338 } else {
2339 hci_auth_cfm(conn, ev->status);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002340
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002341 hci_conn_hold(conn);
2342 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02002343 hci_conn_drop(conn);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002344 }
2345
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002346 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002347 if (!ev->status) {
2348 struct hci_cp_set_conn_encrypt cp;
2349 cp.handle = ev->handle;
2350 cp.encrypt = 0x01;
2351 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002352 &cp);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002353 } else {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002354 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002355 hci_encrypt_cfm(conn, ev->status, 0x00);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002356 }
2357 }
2358
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002359unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002360 hci_dev_unlock(hdev);
2361}
2362
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002363static void hci_remote_name_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002364{
Johan Hedberg127178d2010-11-18 22:22:29 +02002365 struct hci_ev_remote_name *ev = (void *) skb->data;
2366 struct hci_conn *conn;
2367
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002368 BT_DBG("%s", hdev->name);
2369
2370 hci_conn_check_pending(hdev);
Johan Hedberg127178d2010-11-18 22:22:29 +02002371
2372 hci_dev_lock(hdev);
2373
2374 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002375
2376 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
2377 goto check_auth;
2378
2379 if (ev->status == 0)
2380 hci_check_pending_name(hdev, conn, &ev->bdaddr, ev->name,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002381 strnlen(ev->name, HCI_MAX_NAME_LENGTH));
Johan Hedbergb644ba32012-01-17 21:48:47 +02002382 else
2383 hci_check_pending_name(hdev, conn, &ev->bdaddr, NULL, 0);
2384
2385check_auth:
Johan Hedberg79c6c702011-04-28 11:28:55 -07002386 if (!conn)
2387 goto unlock;
2388
2389 if (!hci_outgoing_auth_needed(hdev, conn))
2390 goto unlock;
2391
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002392 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002393 struct hci_cp_auth_requested cp;
2394 cp.handle = __cpu_to_le16(conn->handle);
2395 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED, sizeof(cp), &cp);
2396 }
2397
Johan Hedberg79c6c702011-04-28 11:28:55 -07002398unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02002399 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002400}
2401
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002402static void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002403{
2404 struct hci_ev_encrypt_change *ev = (void *) skb->data;
2405 struct hci_conn *conn;
2406
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002407 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002408
2409 hci_dev_lock(hdev);
2410
2411 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002412 if (!conn)
2413 goto unlock;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002414
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002415 if (!ev->status) {
2416 if (ev->encrypt) {
2417 /* Encryption implies authentication */
Johan Hedberg4dae2792014-06-24 17:03:50 +03002418 set_bit(HCI_CONN_AUTH, &conn->flags);
2419 set_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002420 conn->sec_level = conn->pending_sec_level;
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002421
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002422 /* P-256 authentication key implies FIPS */
2423 if (conn->key_type == HCI_LK_AUTH_COMBINATION_P256)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002424 set_bit(HCI_CONN_FIPS, &conn->flags);
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002425
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002426 if ((conn->type == ACL_LINK && ev->encrypt == 0x02) ||
2427 conn->type == LE_LINK)
2428 set_bit(HCI_CONN_AES_CCM, &conn->flags);
2429 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002430 clear_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002431 clear_bit(HCI_CONN_AES_CCM, &conn->flags);
2432 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002433 }
2434
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002435 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
2436
2437 if (ev->status && conn->state == BT_CONNECTED) {
2438 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
2439 hci_conn_drop(conn);
2440 goto unlock;
2441 }
2442
2443 if (conn->state == BT_CONFIG) {
2444 if (!ev->status)
2445 conn->state = BT_CONNECTED;
2446
Marcel Holtmann40b552a2014-03-19 14:10:25 -07002447 /* In Secure Connections Only mode, do not allow any
2448 * connections that are not encrypted with AES-CCM
2449 * using a P-256 authenticated combination key.
2450 */
2451 if (test_bit(HCI_SC_ONLY, &hdev->dev_flags) &&
2452 (!test_bit(HCI_CONN_AES_CCM, &conn->flags) ||
2453 conn->key_type != HCI_LK_AUTH_COMBINATION_P256)) {
2454 hci_proto_connect_cfm(conn, HCI_ERROR_AUTH_FAILURE);
2455 hci_conn_drop(conn);
2456 goto unlock;
2457 }
2458
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002459 hci_proto_connect_cfm(conn, ev->status);
2460 hci_conn_drop(conn);
2461 } else
2462 hci_encrypt_cfm(conn, ev->status, ev->encrypt);
2463
Gustavo Padovana7d77232012-05-13 03:20:07 -03002464unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002465 hci_dev_unlock(hdev);
2466}
2467
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002468static void hci_change_link_key_complete_evt(struct hci_dev *hdev,
2469 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002470{
2471 struct hci_ev_change_link_key_complete *ev = (void *) skb->data;
2472 struct hci_conn *conn;
2473
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002474 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002475
2476 hci_dev_lock(hdev);
2477
2478 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
2479 if (conn) {
2480 if (!ev->status)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002481 set_bit(HCI_CONN_SECURE, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002482
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002483 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002484
2485 hci_key_change_cfm(conn, ev->status);
2486 }
2487
2488 hci_dev_unlock(hdev);
2489}
2490
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002491static void hci_remote_features_evt(struct hci_dev *hdev,
2492 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002493{
2494 struct hci_ev_remote_features *ev = (void *) skb->data;
2495 struct hci_conn *conn;
2496
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002497 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002498
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002499 hci_dev_lock(hdev);
2500
2501 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02002502 if (!conn)
2503 goto unlock;
Marcel Holtmann769be972008-07-14 20:13:49 +02002504
Johan Hedbergccd556f2010-11-10 17:11:51 +02002505 if (!ev->status)
Johan Hedbergcad718e2013-04-17 15:00:51 +03002506 memcpy(conn->features[0], ev->features, 8);
Johan Hedbergccd556f2010-11-10 17:11:51 +02002507
2508 if (conn->state != BT_CONFIG)
2509 goto unlock;
2510
2511 if (!ev->status && lmp_ssp_capable(hdev) && lmp_ssp_capable(conn)) {
2512 struct hci_cp_read_remote_ext_features cp;
2513 cp.handle = ev->handle;
2514 cp.page = 0x01;
2515 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002516 sizeof(cp), &cp);
Johan Hedberg392599b2010-11-18 22:22:28 +02002517 goto unlock;
2518 }
2519
Johan Hedberg671267b2012-05-12 16:11:50 -03002520 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002521 struct hci_cp_remote_name_req cp;
2522 memset(&cp, 0, sizeof(cp));
2523 bacpy(&cp.bdaddr, &conn->dst);
2524 cp.pscan_rep_mode = 0x02;
2525 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002526 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
2527 mgmt_device_connected(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002528 conn->dst_type, 0, NULL, 0,
2529 conn->dev_class);
Johan Hedberg392599b2010-11-18 22:22:28 +02002530
Johan Hedberg127178d2010-11-18 22:22:29 +02002531 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02002532 conn->state = BT_CONNECTED;
2533 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002534 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02002535 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002536
Johan Hedbergccd556f2010-11-10 17:11:51 +02002537unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002538 hci_dev_unlock(hdev);
2539}
2540
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002541static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002542{
2543 struct hci_ev_cmd_complete *ev = (void *) skb->data;
Johan Hedberg9238f362013-03-05 20:37:48 +02002544 u8 status = skb->data[sizeof(*ev)];
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002545 __u16 opcode;
2546
2547 skb_pull(skb, sizeof(*ev));
2548
2549 opcode = __le16_to_cpu(ev->opcode);
2550
2551 switch (opcode) {
2552 case HCI_OP_INQUIRY_CANCEL:
2553 hci_cc_inquiry_cancel(hdev, skb);
2554 break;
2555
Andre Guedes4d934832012-03-21 00:03:35 -03002556 case HCI_OP_PERIODIC_INQ:
2557 hci_cc_periodic_inq(hdev, skb);
2558 break;
2559
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002560 case HCI_OP_EXIT_PERIODIC_INQ:
2561 hci_cc_exit_periodic_inq(hdev, skb);
2562 break;
2563
2564 case HCI_OP_REMOTE_NAME_REQ_CANCEL:
2565 hci_cc_remote_name_req_cancel(hdev, skb);
2566 break;
2567
2568 case HCI_OP_ROLE_DISCOVERY:
2569 hci_cc_role_discovery(hdev, skb);
2570 break;
2571
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002572 case HCI_OP_READ_LINK_POLICY:
2573 hci_cc_read_link_policy(hdev, skb);
2574 break;
2575
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002576 case HCI_OP_WRITE_LINK_POLICY:
2577 hci_cc_write_link_policy(hdev, skb);
2578 break;
2579
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002580 case HCI_OP_READ_DEF_LINK_POLICY:
2581 hci_cc_read_def_link_policy(hdev, skb);
2582 break;
2583
2584 case HCI_OP_WRITE_DEF_LINK_POLICY:
2585 hci_cc_write_def_link_policy(hdev, skb);
2586 break;
2587
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002588 case HCI_OP_RESET:
2589 hci_cc_reset(hdev, skb);
2590 break;
2591
2592 case HCI_OP_WRITE_LOCAL_NAME:
2593 hci_cc_write_local_name(hdev, skb);
2594 break;
2595
2596 case HCI_OP_READ_LOCAL_NAME:
2597 hci_cc_read_local_name(hdev, skb);
2598 break;
2599
2600 case HCI_OP_WRITE_AUTH_ENABLE:
2601 hci_cc_write_auth_enable(hdev, skb);
2602 break;
2603
2604 case HCI_OP_WRITE_ENCRYPT_MODE:
2605 hci_cc_write_encrypt_mode(hdev, skb);
2606 break;
2607
2608 case HCI_OP_WRITE_SCAN_ENABLE:
2609 hci_cc_write_scan_enable(hdev, skb);
2610 break;
2611
2612 case HCI_OP_READ_CLASS_OF_DEV:
2613 hci_cc_read_class_of_dev(hdev, skb);
2614 break;
2615
2616 case HCI_OP_WRITE_CLASS_OF_DEV:
2617 hci_cc_write_class_of_dev(hdev, skb);
2618 break;
2619
2620 case HCI_OP_READ_VOICE_SETTING:
2621 hci_cc_read_voice_setting(hdev, skb);
2622 break;
2623
2624 case HCI_OP_WRITE_VOICE_SETTING:
2625 hci_cc_write_voice_setting(hdev, skb);
2626 break;
2627
Marcel Holtmannb4cb9fb2013-10-14 13:56:16 -07002628 case HCI_OP_READ_NUM_SUPPORTED_IAC:
2629 hci_cc_read_num_supported_iac(hdev, skb);
2630 break;
2631
Marcel Holtmann333140b2008-07-14 20:13:48 +02002632 case HCI_OP_WRITE_SSP_MODE:
2633 hci_cc_write_ssp_mode(hdev, skb);
2634 break;
2635
Marcel Holtmanneac83dc2014-01-10 02:07:23 -08002636 case HCI_OP_WRITE_SC_SUPPORT:
2637 hci_cc_write_sc_support(hdev, skb);
2638 break;
2639
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002640 case HCI_OP_READ_LOCAL_VERSION:
2641 hci_cc_read_local_version(hdev, skb);
2642 break;
2643
2644 case HCI_OP_READ_LOCAL_COMMANDS:
2645 hci_cc_read_local_commands(hdev, skb);
2646 break;
2647
2648 case HCI_OP_READ_LOCAL_FEATURES:
2649 hci_cc_read_local_features(hdev, skb);
2650 break;
2651
Andre Guedes971e3a42011-06-30 19:20:52 -03002652 case HCI_OP_READ_LOCAL_EXT_FEATURES:
2653 hci_cc_read_local_ext_features(hdev, skb);
2654 break;
2655
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002656 case HCI_OP_READ_BUFFER_SIZE:
2657 hci_cc_read_buffer_size(hdev, skb);
2658 break;
2659
2660 case HCI_OP_READ_BD_ADDR:
2661 hci_cc_read_bd_addr(hdev, skb);
2662 break;
2663
Johan Hedbergf332ec62013-03-15 17:07:11 -05002664 case HCI_OP_READ_PAGE_SCAN_ACTIVITY:
2665 hci_cc_read_page_scan_activity(hdev, skb);
2666 break;
2667
Johan Hedberg4a3ee762013-03-15 17:07:12 -05002668 case HCI_OP_WRITE_PAGE_SCAN_ACTIVITY:
2669 hci_cc_write_page_scan_activity(hdev, skb);
2670 break;
2671
Johan Hedbergf332ec62013-03-15 17:07:11 -05002672 case HCI_OP_READ_PAGE_SCAN_TYPE:
2673 hci_cc_read_page_scan_type(hdev, skb);
2674 break;
2675
Johan Hedberg4a3ee762013-03-15 17:07:12 -05002676 case HCI_OP_WRITE_PAGE_SCAN_TYPE:
2677 hci_cc_write_page_scan_type(hdev, skb);
2678 break;
2679
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +02002680 case HCI_OP_READ_DATA_BLOCK_SIZE:
2681 hci_cc_read_data_block_size(hdev, skb);
2682 break;
2683
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +02002684 case HCI_OP_READ_FLOW_CONTROL_MODE:
2685 hci_cc_read_flow_control_mode(hdev, skb);
2686 break;
2687
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +03002688 case HCI_OP_READ_LOCAL_AMP_INFO:
2689 hci_cc_read_local_amp_info(hdev, skb);
2690 break;
2691
Johan Hedberg33f35722014-06-28 17:54:06 +03002692 case HCI_OP_READ_CLOCK:
2693 hci_cc_read_clock(hdev, skb);
2694 break;
2695
Andrei Emeltchenko903e4542012-09-27 17:26:09 +03002696 case HCI_OP_READ_LOCAL_AMP_ASSOC:
2697 hci_cc_read_local_amp_assoc(hdev, skb);
2698 break;
2699
Johan Hedbergd5859e22011-01-25 01:19:58 +02002700 case HCI_OP_READ_INQ_RSP_TX_POWER:
2701 hci_cc_read_inq_rsp_tx_power(hdev, skb);
2702 break;
2703
Johan Hedberg980e1a52011-01-22 06:10:07 +02002704 case HCI_OP_PIN_CODE_REPLY:
2705 hci_cc_pin_code_reply(hdev, skb);
2706 break;
2707
2708 case HCI_OP_PIN_CODE_NEG_REPLY:
2709 hci_cc_pin_code_neg_reply(hdev, skb);
2710 break;
2711
Szymon Jancc35938b2011-03-22 13:12:21 +01002712 case HCI_OP_READ_LOCAL_OOB_DATA:
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08002713 hci_cc_read_local_oob_data(hdev, skb);
2714 break;
2715
2716 case HCI_OP_READ_LOCAL_OOB_EXT_DATA:
2717 hci_cc_read_local_oob_ext_data(hdev, skb);
Szymon Jancc35938b2011-03-22 13:12:21 +01002718 break;
2719
Ville Tervo6ed58ec2011-02-10 22:38:48 -03002720 case HCI_OP_LE_READ_BUFFER_SIZE:
2721 hci_cc_le_read_buffer_size(hdev, skb);
2722 break;
2723
Johan Hedberg60e77322013-01-22 14:01:59 +02002724 case HCI_OP_LE_READ_LOCAL_FEATURES:
2725 hci_cc_le_read_local_features(hdev, skb);
2726 break;
2727
Johan Hedberg8fa19092012-10-19 20:57:49 +03002728 case HCI_OP_LE_READ_ADV_TX_POWER:
2729 hci_cc_le_read_adv_tx_power(hdev, skb);
2730 break;
2731
Johan Hedberga5c29682011-02-19 12:05:57 -03002732 case HCI_OP_USER_CONFIRM_REPLY:
2733 hci_cc_user_confirm_reply(hdev, skb);
2734 break;
2735
2736 case HCI_OP_USER_CONFIRM_NEG_REPLY:
2737 hci_cc_user_confirm_neg_reply(hdev, skb);
2738 break;
2739
Brian Gix1143d452011-11-23 08:28:34 -08002740 case HCI_OP_USER_PASSKEY_REPLY:
2741 hci_cc_user_passkey_reply(hdev, skb);
2742 break;
2743
2744 case HCI_OP_USER_PASSKEY_NEG_REPLY:
2745 hci_cc_user_passkey_neg_reply(hdev, skb);
Szymon Janc16cde992012-04-13 12:32:42 +02002746 break;
Andre Guedes07f7fa52011-12-02 21:13:31 +09002747
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08002748 case HCI_OP_LE_SET_RANDOM_ADDR:
2749 hci_cc_le_set_random_addr(hdev, skb);
2750 break;
2751
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01002752 case HCI_OP_LE_SET_ADV_ENABLE:
2753 hci_cc_le_set_adv_enable(hdev, skb);
2754 break;
2755
Marcel Holtmann533553f2014-03-21 12:18:10 -07002756 case HCI_OP_LE_SET_SCAN_PARAM:
2757 hci_cc_le_set_scan_param(hdev, skb);
2758 break;
2759
Andre Guedeseb9d91f2011-05-26 16:23:52 -03002760 case HCI_OP_LE_SET_SCAN_ENABLE:
2761 hci_cc_le_set_scan_enable(hdev, skb);
2762 break;
2763
Johan Hedbergcf1d0812013-01-22 14:02:00 +02002764 case HCI_OP_LE_READ_WHITE_LIST_SIZE:
2765 hci_cc_le_read_white_list_size(hdev, skb);
2766 break;
2767
Marcel Holtmann0f36b582014-02-27 20:37:31 -08002768 case HCI_OP_LE_CLEAR_WHITE_LIST:
2769 hci_cc_le_clear_white_list(hdev, skb);
2770 break;
2771
2772 case HCI_OP_LE_ADD_TO_WHITE_LIST:
2773 hci_cc_le_add_to_white_list(hdev, skb);
2774 break;
2775
2776 case HCI_OP_LE_DEL_FROM_WHITE_LIST:
2777 hci_cc_le_del_from_white_list(hdev, skb);
2778 break;
2779
Johan Hedberg9b008c02013-01-22 14:02:01 +02002780 case HCI_OP_LE_READ_SUPPORTED_STATES:
2781 hci_cc_le_read_supported_states(hdev, skb);
2782 break;
2783
Andre Guedesf9b49302011-06-30 19:20:53 -03002784 case HCI_OP_WRITE_LE_HOST_SUPPORTED:
2785 hci_cc_write_le_host_supported(hdev, skb);
2786 break;
2787
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02002788 case HCI_OP_LE_SET_ADV_PARAM:
2789 hci_cc_set_adv_param(hdev, skb);
2790 break;
2791
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03002792 case HCI_OP_WRITE_REMOTE_AMP_ASSOC:
2793 hci_cc_write_remote_amp_assoc(hdev, skb);
2794 break;
2795
Andrzej Kaczmarek5ae76a92014-05-08 15:32:08 +02002796 case HCI_OP_READ_RSSI:
2797 hci_cc_read_rssi(hdev, skb);
2798 break;
2799
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02002800 case HCI_OP_READ_TX_POWER:
2801 hci_cc_read_tx_power(hdev, skb);
2802 break;
2803
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002804 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002805 BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002806 break;
2807 }
2808
Johan Hedbergad82cdd2013-03-09 09:53:50 +02002809 if (opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02002810 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02002811
Johan Hedbergad82cdd2013-03-09 09:53:50 +02002812 hci_req_cmd_complete(hdev, opcode, status);
Johan Hedberg9238f362013-03-05 20:37:48 +02002813
Szymon Jancdbccd792012-12-11 08:51:19 +01002814 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags)) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002815 atomic_set(&hdev->cmd_cnt, 1);
2816 if (!skb_queue_empty(&hdev->cmd_q))
Gustavo F. Padovanc347b762011-12-14 23:53:47 -02002817 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002818 }
2819}
2820
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002821static void hci_cmd_status_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002822{
2823 struct hci_ev_cmd_status *ev = (void *) skb->data;
2824 __u16 opcode;
2825
2826 skb_pull(skb, sizeof(*ev));
2827
2828 opcode = __le16_to_cpu(ev->opcode);
2829
2830 switch (opcode) {
2831 case HCI_OP_INQUIRY:
2832 hci_cs_inquiry(hdev, ev->status);
2833 break;
2834
2835 case HCI_OP_CREATE_CONN:
2836 hci_cs_create_conn(hdev, ev->status);
2837 break;
2838
2839 case HCI_OP_ADD_SCO:
2840 hci_cs_add_sco(hdev, ev->status);
2841 break;
2842
Marcel Holtmannf8558552008-07-14 20:13:49 +02002843 case HCI_OP_AUTH_REQUESTED:
2844 hci_cs_auth_requested(hdev, ev->status);
2845 break;
2846
2847 case HCI_OP_SET_CONN_ENCRYPT:
2848 hci_cs_set_conn_encrypt(hdev, ev->status);
2849 break;
2850
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002851 case HCI_OP_REMOTE_NAME_REQ:
2852 hci_cs_remote_name_req(hdev, ev->status);
2853 break;
2854
Marcel Holtmann769be972008-07-14 20:13:49 +02002855 case HCI_OP_READ_REMOTE_FEATURES:
2856 hci_cs_read_remote_features(hdev, ev->status);
2857 break;
2858
2859 case HCI_OP_READ_REMOTE_EXT_FEATURES:
2860 hci_cs_read_remote_ext_features(hdev, ev->status);
2861 break;
2862
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002863 case HCI_OP_SETUP_SYNC_CONN:
2864 hci_cs_setup_sync_conn(hdev, ev->status);
2865 break;
2866
2867 case HCI_OP_SNIFF_MODE:
2868 hci_cs_sniff_mode(hdev, ev->status);
2869 break;
2870
2871 case HCI_OP_EXIT_SNIFF_MODE:
2872 hci_cs_exit_sniff_mode(hdev, ev->status);
2873 break;
2874
Johan Hedberg8962ee72011-01-20 12:40:27 +02002875 case HCI_OP_DISCONNECT:
Johan Hedberg88c3df12012-02-09 14:27:38 +02002876 hci_cs_disconnect(hdev, ev->status);
Johan Hedberg8962ee72011-01-20 12:40:27 +02002877 break;
2878
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03002879 case HCI_OP_CREATE_PHY_LINK:
2880 hci_cs_create_phylink(hdev, ev->status);
2881 break;
2882
Andrei Emeltchenko0b26ab92012-09-27 17:26:24 +03002883 case HCI_OP_ACCEPT_PHY_LINK:
2884 hci_cs_accept_phylink(hdev, ev->status);
2885 break;
2886
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02002887 case HCI_OP_LE_CREATE_CONN:
2888 hci_cs_le_create_conn(hdev, ev->status);
2889 break;
2890
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02002891 case HCI_OP_LE_START_ENC:
2892 hci_cs_le_start_enc(hdev, ev->status);
2893 break;
2894
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002895 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002896 BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002897 break;
2898 }
2899
Johan Hedbergad82cdd2013-03-09 09:53:50 +02002900 if (opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02002901 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02002902
Johan Hedberg02350a72013-04-03 21:50:29 +03002903 if (ev->status ||
2904 (hdev->sent_cmd && !bt_cb(hdev->sent_cmd)->req.event))
2905 hci_req_cmd_complete(hdev, opcode, ev->status);
Johan Hedberg9238f362013-03-05 20:37:48 +02002906
Gustavo F. Padovan10572132011-03-16 15:36:29 -03002907 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags)) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002908 atomic_set(&hdev->cmd_cnt, 1);
2909 if (!skb_queue_empty(&hdev->cmd_q))
Gustavo F. Padovanc347b762011-12-14 23:53:47 -02002910 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002911 }
2912}
2913
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002914static void hci_role_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002915{
2916 struct hci_ev_role_change *ev = (void *) skb->data;
2917 struct hci_conn *conn;
2918
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002919 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002920
2921 hci_dev_lock(hdev);
2922
2923 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
2924 if (conn) {
2925 if (!ev->status) {
2926 if (ev->role)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002927 clear_bit(HCI_CONN_MASTER, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002928 else
Johan Hedberg4dae2792014-06-24 17:03:50 +03002929 set_bit(HCI_CONN_MASTER, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002930 }
2931
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002932 clear_bit(HCI_CONN_RSWITCH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002933
2934 hci_role_switch_cfm(conn, ev->status, ev->role);
2935 }
2936
2937 hci_dev_unlock(hdev);
2938}
2939
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002940static void hci_num_comp_pkts_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002941{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002942 struct hci_ev_num_comp_pkts *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002943 int i;
2944
Andrei Emeltchenko32ac5b92011-12-19 16:31:29 +02002945 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_PACKET_BASED) {
2946 BT_ERR("Wrong event for mode %d", hdev->flow_ctl_mode);
2947 return;
2948 }
2949
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02002950 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03002951 ev->num_hndl * sizeof(struct hci_comp_pkts_info)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002952 BT_DBG("%s bad parameters", hdev->name);
2953 return;
2954 }
2955
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02002956 BT_DBG("%s num_hndl %d", hdev->name, ev->num_hndl);
2957
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02002958 for (i = 0; i < ev->num_hndl; i++) {
2959 struct hci_comp_pkts_info *info = &ev->handles[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07002960 struct hci_conn *conn;
2961 __u16 handle, count;
2962
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02002963 handle = __le16_to_cpu(info->handle);
2964 count = __le16_to_cpu(info->count);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002965
2966 conn = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02002967 if (!conn)
2968 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002969
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02002970 conn->sent -= count;
2971
2972 switch (conn->type) {
2973 case ACL_LINK:
2974 hdev->acl_cnt += count;
2975 if (hdev->acl_cnt > hdev->acl_pkts)
2976 hdev->acl_cnt = hdev->acl_pkts;
2977 break;
2978
2979 case LE_LINK:
2980 if (hdev->le_pkts) {
2981 hdev->le_cnt += count;
2982 if (hdev->le_cnt > hdev->le_pkts)
2983 hdev->le_cnt = hdev->le_pkts;
2984 } else {
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02002985 hdev->acl_cnt += count;
2986 if (hdev->acl_cnt > hdev->acl_pkts)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002987 hdev->acl_cnt = hdev->acl_pkts;
2988 }
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02002989 break;
2990
2991 case SCO_LINK:
2992 hdev->sco_cnt += count;
2993 if (hdev->sco_cnt > hdev->sco_pkts)
2994 hdev->sco_cnt = hdev->sco_pkts;
2995 break;
2996
2997 default:
2998 BT_ERR("Unknown type %d conn %p", conn->type, conn);
2999 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003000 }
3001 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003002
Gustavo F. Padovan3eff45e2011-12-15 00:50:02 -02003003 queue_work(hdev->workqueue, &hdev->tx_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003004}
3005
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003006static struct hci_conn *__hci_conn_lookup_handle(struct hci_dev *hdev,
3007 __u16 handle)
3008{
3009 struct hci_chan *chan;
3010
3011 switch (hdev->dev_type) {
3012 case HCI_BREDR:
3013 return hci_conn_hash_lookup_handle(hdev, handle);
3014 case HCI_AMP:
3015 chan = hci_chan_lookup_handle(hdev, handle);
3016 if (chan)
3017 return chan->conn;
3018 break;
3019 default:
3020 BT_ERR("%s unknown dev_type %d", hdev->name, hdev->dev_type);
3021 break;
3022 }
3023
3024 return NULL;
3025}
3026
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003027static void hci_num_comp_blocks_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003028{
3029 struct hci_ev_num_comp_blocks *ev = (void *) skb->data;
3030 int i;
3031
3032 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_BLOCK_BASED) {
3033 BT_ERR("Wrong event for mode %d", hdev->flow_ctl_mode);
3034 return;
3035 }
3036
3037 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03003038 ev->num_hndl * sizeof(struct hci_comp_blocks_info)) {
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003039 BT_DBG("%s bad parameters", hdev->name);
3040 return;
3041 }
3042
3043 BT_DBG("%s num_blocks %d num_hndl %d", hdev->name, ev->num_blocks,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003044 ev->num_hndl);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003045
3046 for (i = 0; i < ev->num_hndl; i++) {
3047 struct hci_comp_blocks_info *info = &ev->handles[i];
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003048 struct hci_conn *conn = NULL;
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003049 __u16 handle, block_count;
3050
3051 handle = __le16_to_cpu(info->handle);
3052 block_count = __le16_to_cpu(info->blocks);
3053
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003054 conn = __hci_conn_lookup_handle(hdev, handle);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003055 if (!conn)
3056 continue;
3057
3058 conn->sent -= block_count;
3059
3060 switch (conn->type) {
3061 case ACL_LINK:
Andrei Emeltchenkobd1eb662012-10-10 17:38:30 +03003062 case AMP_LINK:
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003063 hdev->block_cnt += block_count;
3064 if (hdev->block_cnt > hdev->num_blocks)
3065 hdev->block_cnt = hdev->num_blocks;
3066 break;
3067
3068 default:
3069 BT_ERR("Unknown type %d conn %p", conn->type, conn);
3070 break;
3071 }
3072 }
3073
3074 queue_work(hdev->workqueue, &hdev->tx_work);
3075}
3076
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003077static void hci_mode_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003078{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003079 struct hci_ev_mode_change *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003080 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003081
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003082 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003083
3084 hci_dev_lock(hdev);
3085
Marcel Holtmann04837f62006-07-03 10:02:33 +02003086 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3087 if (conn) {
3088 conn->mode = ev->mode;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003089
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003090 if (!test_and_clear_bit(HCI_CONN_MODE_CHANGE_PEND,
3091 &conn->flags)) {
Marcel Holtmann04837f62006-07-03 10:02:33 +02003092 if (conn->mode == HCI_CM_ACTIVE)
Johan Hedberg58a681e2012-01-16 06:47:28 +02003093 set_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003094 else
Johan Hedberg58a681e2012-01-16 06:47:28 +02003095 clear_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003096 }
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003097
Johan Hedberg51a8efd2012-01-16 06:10:31 +02003098 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003099 hci_sco_setup(conn, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003100 }
3101
3102 hci_dev_unlock(hdev);
3103}
3104
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003105static void hci_pin_code_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003106{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003107 struct hci_ev_pin_code_req *ev = (void *) skb->data;
3108 struct hci_conn *conn;
3109
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003110 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003111
3112 hci_dev_lock(hdev);
3113
3114 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003115 if (!conn)
3116 goto unlock;
3117
3118 if (conn->state == BT_CONNECTED) {
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003119 hci_conn_hold(conn);
3120 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003121 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003122 }
3123
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003124 if (!test_bit(HCI_PAIRABLE, &hdev->dev_flags))
Johan Hedberg03b555e2011-01-04 15:40:05 +02003125 hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003126 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003127 else if (test_bit(HCI_MGMT, &hdev->dev_flags)) {
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003128 u8 secure;
3129
3130 if (conn->pending_sec_level == BT_SECURITY_HIGH)
3131 secure = 1;
3132 else
3133 secure = 0;
3134
Johan Hedberg744cf192011-11-08 20:40:14 +02003135 mgmt_pin_code_request(hdev, &ev->bdaddr, secure);
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003136 }
Johan Hedberg980e1a52011-01-22 06:10:07 +02003137
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003138unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003139 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003140}
3141
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003142static void hci_link_key_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003143{
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003144 struct hci_ev_link_key_req *ev = (void *) skb->data;
3145 struct hci_cp_link_key_reply cp;
3146 struct hci_conn *conn;
3147 struct link_key *key;
3148
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003149 BT_DBG("%s", hdev->name);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003150
Andrei Emeltchenko034cbea2013-05-14 11:44:16 +03003151 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003152 return;
3153
3154 hci_dev_lock(hdev);
3155
3156 key = hci_find_link_key(hdev, &ev->bdaddr);
3157 if (!key) {
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003158 BT_DBG("%s link key not found for %pMR", hdev->name,
3159 &ev->bdaddr);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003160 goto not_found;
3161 }
3162
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003163 BT_DBG("%s found key type %u for %pMR", hdev->name, key->type,
3164 &ev->bdaddr);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003165
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003166 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003167 if (conn) {
Marcel Holtmann66138ce2014-01-10 02:07:20 -08003168 if ((key->type == HCI_LK_UNAUTH_COMBINATION_P192 ||
3169 key->type == HCI_LK_UNAUTH_COMBINATION_P256) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03003170 conn->auth_type != 0xff && (conn->auth_type & 0x01)) {
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003171 BT_DBG("%s ignoring unauthenticated key", hdev->name);
3172 goto not_found;
3173 }
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003174
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003175 if (key->type == HCI_LK_COMBINATION && key->pin_len < 16 &&
Johan Hedbergf3fb0b52014-06-02 10:12:44 +03003176 (conn->pending_sec_level == BT_SECURITY_HIGH ||
3177 conn->pending_sec_level == BT_SECURITY_FIPS)) {
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003178 BT_DBG("%s ignoring key unauthenticated for high security",
3179 hdev->name);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003180 goto not_found;
3181 }
3182
3183 conn->key_type = key->type;
3184 conn->pin_length = key->pin_len;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003185 }
3186
3187 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9b3b4462012-05-23 11:31:20 +03003188 memcpy(cp.link_key, key->val, HCI_LINK_KEY_SIZE);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003189
3190 hci_send_cmd(hdev, HCI_OP_LINK_KEY_REPLY, sizeof(cp), &cp);
3191
3192 hci_dev_unlock(hdev);
3193
3194 return;
3195
3196not_found:
3197 hci_send_cmd(hdev, HCI_OP_LINK_KEY_NEG_REPLY, 6, &ev->bdaddr);
3198 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003199}
3200
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003201static void hci_link_key_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003202{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003203 struct hci_ev_link_key_notify *ev = (void *) skb->data;
3204 struct hci_conn *conn;
Johan Hedberg7652ff62014-06-24 13:15:49 +03003205 struct link_key *key;
3206 bool persistent;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003207 u8 pin_len = 0;
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003208
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003209 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003210
3211 hci_dev_lock(hdev);
3212
3213 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3214 if (conn) {
3215 hci_conn_hold(conn);
3216 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
Johan Hedberg980e1a52011-01-22 06:10:07 +02003217 pin_len = conn->pin_length;
Waldemar Rymarkiewicz13d39312011-04-28 12:07:55 +02003218
3219 if (ev->key_type != HCI_LK_CHANGED_COMBINATION)
3220 conn->key_type = ev->key_type;
3221
David Herrmann76a68ba2013-04-06 20:28:37 +02003222 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003223 }
3224
Johan Hedberg7652ff62014-06-24 13:15:49 +03003225 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
3226 goto unlock;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003227
Johan Hedberg7652ff62014-06-24 13:15:49 +03003228 key = hci_add_link_key(hdev, conn, &ev->bdaddr, ev->link_key,
3229 ev->key_type, pin_len, &persistent);
3230 if (!key)
3231 goto unlock;
3232
3233 mgmt_new_link_key(hdev, key, persistent);
3234
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003235 /* Keep debug keys around only if the HCI_KEEP_DEBUG_KEYS flag
3236 * is set. If it's not set simply remove the key from the kernel
3237 * list (we've still notified user space about it but with
3238 * store_hint being 0).
3239 */
3240 if (key->type == HCI_LK_DEBUG_COMBINATION &&
3241 !test_bit(HCI_KEEP_DEBUG_KEYS, &hdev->dev_flags)) {
3242 list_del(&key->list);
3243 kfree(key);
3244 } else if (conn) {
Johan Hedbergaf6a9c32014-06-24 13:15:53 +03003245 if (persistent)
3246 clear_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
3247 else
3248 set_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003249 }
Johan Hedberg7652ff62014-06-24 13:15:49 +03003250
3251unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003252 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003253}
3254
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003255static void hci_clock_offset_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04837f62006-07-03 10:02:33 +02003256{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003257 struct hci_ev_clock_offset *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003258 struct hci_conn *conn;
3259
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003260 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003261
3262 hci_dev_lock(hdev);
3263
3264 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003265 if (conn && !ev->status) {
3266 struct inquiry_entry *ie;
3267
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003268 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3269 if (ie) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003270 ie->data.clock_offset = ev->clock_offset;
3271 ie->timestamp = jiffies;
3272 }
3273 }
3274
3275 hci_dev_unlock(hdev);
3276}
3277
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003278static void hci_pkt_type_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna8746412008-07-14 20:13:46 +02003279{
3280 struct hci_ev_pkt_type_change *ev = (void *) skb->data;
3281 struct hci_conn *conn;
3282
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003283 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna8746412008-07-14 20:13:46 +02003284
3285 hci_dev_lock(hdev);
3286
3287 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3288 if (conn && !ev->status)
3289 conn->pkt_type = __le16_to_cpu(ev->pkt_type);
3290
3291 hci_dev_unlock(hdev);
3292}
3293
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003294static void hci_pscan_rep_mode_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003295{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003296 struct hci_ev_pscan_rep_mode *ev = (void *) skb->data;
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003297 struct inquiry_entry *ie;
3298
3299 BT_DBG("%s", hdev->name);
3300
3301 hci_dev_lock(hdev);
3302
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003303 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
3304 if (ie) {
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003305 ie->data.pscan_rep_mode = ev->pscan_rep_mode;
3306 ie->timestamp = jiffies;
3307 }
3308
3309 hci_dev_unlock(hdev);
3310}
3311
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003312static void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev,
3313 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003314{
3315 struct inquiry_data data;
3316 int num_rsp = *((__u8 *) skb->data);
3317
3318 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
3319
3320 if (!num_rsp)
3321 return;
3322
Andre Guedes1519cc12012-03-21 00:03:38 -03003323 if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags))
3324 return;
3325
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003326 hci_dev_lock(hdev);
3327
3328 if ((skb->len - 1) / num_rsp != sizeof(struct inquiry_info_with_rssi)) {
Szymon Janc138d22e2011-02-17 16:44:23 +01003329 struct inquiry_info_with_rssi_and_pscan_mode *info;
3330 info = (void *) (skb->data + 1);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003331
Johan Hedberge17acd42011-03-30 23:57:16 +03003332 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003333 u32 flags;
3334
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003335 bacpy(&data.bdaddr, &info->bdaddr);
3336 data.pscan_rep_mode = info->pscan_rep_mode;
3337 data.pscan_period_mode = info->pscan_period_mode;
3338 data.pscan_mode = info->pscan_mode;
3339 memcpy(data.dev_class, info->dev_class, 3);
3340 data.clock_offset = info->clock_offset;
3341 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003342 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02003343
Marcel Holtmannaf589252014-07-01 14:11:20 +02003344 flags = hci_inquiry_cache_update(hdev, &data, false);
3345
Johan Hedberg48264f02011-11-09 13:58:58 +02003346 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003347 info->dev_class, info->rssi,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003348 flags, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003349 }
3350 } else {
3351 struct inquiry_info_with_rssi *info = (void *) (skb->data + 1);
3352
Johan Hedberge17acd42011-03-30 23:57:16 +03003353 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003354 u32 flags;
3355
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003356 bacpy(&data.bdaddr, &info->bdaddr);
3357 data.pscan_rep_mode = info->pscan_rep_mode;
3358 data.pscan_period_mode = info->pscan_period_mode;
3359 data.pscan_mode = 0x00;
3360 memcpy(data.dev_class, info->dev_class, 3);
3361 data.clock_offset = info->clock_offset;
3362 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003363 data.ssp_mode = 0x00;
Marcel Holtmannaf589252014-07-01 14:11:20 +02003364
3365 flags = hci_inquiry_cache_update(hdev, &data, false);
3366
Johan Hedberg48264f02011-11-09 13:58:58 +02003367 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003368 info->dev_class, info->rssi,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003369 flags, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003370 }
3371 }
3372
3373 hci_dev_unlock(hdev);
3374}
3375
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003376static void hci_remote_ext_features_evt(struct hci_dev *hdev,
3377 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003378{
Marcel Holtmann41a96212008-07-14 20:13:48 +02003379 struct hci_ev_remote_ext_features *ev = (void *) skb->data;
3380 struct hci_conn *conn;
3381
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003382 BT_DBG("%s", hdev->name);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003383
Marcel Holtmann41a96212008-07-14 20:13:48 +02003384 hci_dev_lock(hdev);
3385
3386 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02003387 if (!conn)
3388 goto unlock;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003389
Johan Hedbergcad718e2013-04-17 15:00:51 +03003390 if (ev->page < HCI_MAX_PAGES)
3391 memcpy(conn->features[ev->page], ev->features, 8);
3392
Johan Hedbergccd556f2010-11-10 17:11:51 +02003393 if (!ev->status && ev->page == 0x01) {
3394 struct inquiry_entry *ie;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003395
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003396 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3397 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02003398 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann769be972008-07-14 20:13:49 +02003399
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303400 if (ev->features[0] & LMP_HOST_SSP) {
Johan Hedberg58a681e2012-01-16 06:47:28 +02003401 set_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303402 } else {
3403 /* It is mandatory by the Bluetooth specification that
3404 * Extended Inquiry Results are only used when Secure
3405 * Simple Pairing is enabled, but some devices violate
3406 * this.
3407 *
3408 * To make these devices work, the internal SSP
3409 * enabled flag needs to be cleared if the remote host
3410 * features do not indicate SSP support */
3411 clear_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
3412 }
Marcel Holtmanneb9a8f32014-01-15 22:37:38 -08003413
3414 if (ev->features[0] & LMP_HOST_SC)
3415 set_bit(HCI_CONN_SC_ENABLED, &conn->flags);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003416 }
3417
Johan Hedbergccd556f2010-11-10 17:11:51 +02003418 if (conn->state != BT_CONFIG)
3419 goto unlock;
3420
Johan Hedberg671267b2012-05-12 16:11:50 -03003421 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02003422 struct hci_cp_remote_name_req cp;
3423 memset(&cp, 0, sizeof(cp));
3424 bacpy(&cp.bdaddr, &conn->dst);
3425 cp.pscan_rep_mode = 0x02;
3426 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02003427 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
3428 mgmt_device_connected(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003429 conn->dst_type, 0, NULL, 0,
3430 conn->dev_class);
Johan Hedberg392599b2010-11-18 22:22:28 +02003431
Johan Hedberg127178d2010-11-18 22:22:29 +02003432 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02003433 conn->state = BT_CONNECTED;
3434 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02003435 hci_conn_drop(conn);
Johan Hedbergccd556f2010-11-10 17:11:51 +02003436 }
3437
3438unlock:
Marcel Holtmann41a96212008-07-14 20:13:48 +02003439 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003440}
3441
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003442static void hci_sync_conn_complete_evt(struct hci_dev *hdev,
3443 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003444{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003445 struct hci_ev_sync_conn_complete *ev = (void *) skb->data;
3446 struct hci_conn *conn;
3447
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003448 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003449
3450 hci_dev_lock(hdev);
3451
3452 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann9dc0a3a2008-07-14 20:13:46 +02003453 if (!conn) {
3454 if (ev->link_type == ESCO_LINK)
3455 goto unlock;
3456
3457 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
3458 if (!conn)
3459 goto unlock;
3460
3461 conn->type = SCO_LINK;
3462 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003463
Marcel Holtmann732547f2009-04-19 19:14:14 +02003464 switch (ev->status) {
3465 case 0x00:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003466 conn->handle = __le16_to_cpu(ev->handle);
3467 conn->state = BT_CONNECTED;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02003468
3469 hci_conn_add_sysfs(conn);
Marcel Holtmann732547f2009-04-19 19:14:14 +02003470 break;
3471
Nick Pelly81218d22014-06-30 11:25:01 +05303472 case 0x10: /* Connection Accept Timeout */
Frédéric Dalleau1a4c9582013-08-19 14:24:02 +02003473 case 0x0d: /* Connection Rejected due to Limited Resources */
Stephen Coe705e5712010-02-16 11:29:44 -05003474 case 0x11: /* Unsupported Feature or Parameter Value */
Marcel Holtmann732547f2009-04-19 19:14:14 +02003475 case 0x1c: /* SCO interval rejected */
Nick Pelly1038a002010-02-03 11:42:26 -08003476 case 0x1a: /* Unsupported Remote Feature */
Marcel Holtmann732547f2009-04-19 19:14:14 +02003477 case 0x1f: /* Unspecified error */
Andrew Earl27539bc2014-03-10 10:31:04 +00003478 case 0x20: /* Unsupported LMP Parameter value */
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02003479 if (conn->out) {
Marcel Holtmann732547f2009-04-19 19:14:14 +02003480 conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) |
3481 (hdev->esco_type & EDR_ESCO_MASK);
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02003482 if (hci_setup_sync(conn, conn->link->handle))
3483 goto unlock;
Marcel Holtmann732547f2009-04-19 19:14:14 +02003484 }
3485 /* fall through */
3486
3487 default:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003488 conn->state = BT_CLOSED;
Marcel Holtmann732547f2009-04-19 19:14:14 +02003489 break;
3490 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003491
3492 hci_proto_connect_cfm(conn, ev->status);
3493 if (ev->status)
3494 hci_conn_del(conn);
3495
3496unlock:
3497 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003498}
3499
Marcel Holtmannefdcf8e2013-10-15 10:31:12 -07003500static inline size_t eir_get_length(u8 *eir, size_t eir_len)
3501{
3502 size_t parsed = 0;
3503
3504 while (parsed < eir_len) {
3505 u8 field_len = eir[0];
3506
3507 if (field_len == 0)
3508 return parsed;
3509
3510 parsed += field_len + 1;
3511 eir += field_len + 1;
3512 }
3513
3514 return eir_len;
3515}
3516
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003517static void hci_extended_inquiry_result_evt(struct hci_dev *hdev,
3518 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003519{
3520 struct inquiry_data data;
3521 struct extended_inquiry_info *info = (void *) (skb->data + 1);
3522 int num_rsp = *((__u8 *) skb->data);
Vishal Agarwal9d939d92012-04-26 19:19:56 +05303523 size_t eir_len;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003524
3525 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
3526
3527 if (!num_rsp)
3528 return;
3529
Andre Guedes1519cc12012-03-21 00:03:38 -03003530 if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags))
3531 return;
3532
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003533 hci_dev_lock(hdev);
3534
Johan Hedberge17acd42011-03-30 23:57:16 +03003535 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003536 u32 flags;
3537 bool name_known;
Johan Hedberg561aafb2012-01-04 13:31:59 +02003538
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003539 bacpy(&data.bdaddr, &info->bdaddr);
Szymon Janc138d22e2011-02-17 16:44:23 +01003540 data.pscan_rep_mode = info->pscan_rep_mode;
3541 data.pscan_period_mode = info->pscan_period_mode;
3542 data.pscan_mode = 0x00;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003543 memcpy(data.dev_class, info->dev_class, 3);
Szymon Janc138d22e2011-02-17 16:44:23 +01003544 data.clock_offset = info->clock_offset;
3545 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003546 data.ssp_mode = 0x01;
Johan Hedberg561aafb2012-01-04 13:31:59 +02003547
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003548 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg4ddb1932012-01-15 20:04:43 +02003549 name_known = eir_has_data_type(info->data,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003550 sizeof(info->data),
3551 EIR_NAME_COMPLETE);
Johan Hedberg561aafb2012-01-04 13:31:59 +02003552 else
3553 name_known = true;
3554
Marcel Holtmannaf589252014-07-01 14:11:20 +02003555 flags = hci_inquiry_cache_update(hdev, &data, name_known);
3556
Vishal Agarwal9d939d92012-04-26 19:19:56 +05303557 eir_len = eir_get_length(info->data, sizeof(info->data));
Marcel Holtmannaf589252014-07-01 14:11:20 +02003558
Johan Hedberg48264f02011-11-09 13:58:58 +02003559 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003560 info->dev_class, info->rssi,
3561 flags, info->data, eir_len, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003562 }
3563
3564 hci_dev_unlock(hdev);
3565}
3566
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003567static void hci_key_refresh_complete_evt(struct hci_dev *hdev,
3568 struct sk_buff *skb)
3569{
3570 struct hci_ev_key_refresh_complete *ev = (void *) skb->data;
3571 struct hci_conn *conn;
3572
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003573 BT_DBG("%s status 0x%2.2x handle 0x%4.4x", hdev->name, ev->status,
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003574 __le16_to_cpu(ev->handle));
3575
3576 hci_dev_lock(hdev);
3577
3578 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3579 if (!conn)
3580 goto unlock;
3581
Johan Hedberg9eb1fbf2014-04-11 12:02:31 -07003582 /* For BR/EDR the necessary steps are taken through the
3583 * auth_complete event.
3584 */
3585 if (conn->type != LE_LINK)
3586 goto unlock;
3587
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003588 if (!ev->status)
3589 conn->sec_level = conn->pending_sec_level;
3590
3591 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
3592
3593 if (ev->status && conn->state == BT_CONNECTED) {
Andre Guedesbed71742013-01-30 11:50:56 -03003594 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
David Herrmann76a68ba2013-04-06 20:28:37 +02003595 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003596 goto unlock;
3597 }
3598
3599 if (conn->state == BT_CONFIG) {
3600 if (!ev->status)
3601 conn->state = BT_CONNECTED;
3602
3603 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02003604 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003605 } else {
3606 hci_auth_cfm(conn, ev->status);
3607
3608 hci_conn_hold(conn);
3609 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003610 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003611 }
3612
3613unlock:
3614 hci_dev_unlock(hdev);
3615}
3616
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003617static u8 hci_get_auth_req(struct hci_conn *conn)
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003618{
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003619 /* If remote requests no-bonding follow that lead */
Mikel Astizacabae92013-06-28 10:56:28 +02003620 if (conn->remote_auth == HCI_AT_NO_BONDING ||
3621 conn->remote_auth == HCI_AT_NO_BONDING_MITM)
Waldemar Rymarkiewicz58797bf2011-04-28 12:07:58 +02003622 return conn->remote_auth | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003623
Mikel Astizb7f94c82014-04-08 14:21:31 +02003624 /* If both remote and local have enough IO capabilities, require
3625 * MITM protection
3626 */
3627 if (conn->remote_cap != HCI_IO_NO_INPUT_OUTPUT &&
3628 conn->io_capability != HCI_IO_NO_INPUT_OUTPUT)
3629 return conn->remote_auth | 0x01;
3630
Timo Mueller7e741702014-04-08 14:21:33 +02003631 /* No MITM protection possible so ignore remote requirement */
3632 return (conn->remote_auth & ~0x01) | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003633}
3634
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003635static void hci_io_capa_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02003636{
3637 struct hci_ev_io_capa_request *ev = (void *) skb->data;
3638 struct hci_conn *conn;
3639
3640 BT_DBG("%s", hdev->name);
3641
3642 hci_dev_lock(hdev);
3643
3644 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003645 if (!conn)
3646 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02003647
Johan Hedberg03b555e2011-01-04 15:40:05 +02003648 hci_conn_hold(conn);
3649
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003650 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg03b555e2011-01-04 15:40:05 +02003651 goto unlock;
3652
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003653 if (test_bit(HCI_PAIRABLE, &hdev->dev_flags) ||
Gustavo Padovan807deac2012-05-17 00:36:24 -03003654 (conn->remote_auth & ~0x01) == HCI_AT_NO_BONDING) {
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003655 struct hci_cp_io_capability_reply cp;
3656
3657 bacpy(&cp.bdaddr, &ev->bdaddr);
Hemant Gupta7a7f1e72012-01-16 13:34:29 +05303658 /* Change the IO capability from KeyboardDisplay
3659 * to DisplayYesNo as it is not supported by BT spec. */
3660 cp.capability = (conn->io_capability == 0x04) ?
Mikel Astiza7676312013-06-28 10:56:29 +02003661 HCI_IO_DISPLAY_YESNO : conn->io_capability;
Mikel Astizb7f94c82014-04-08 14:21:31 +02003662
3663 /* If we are initiators, there is no remote information yet */
3664 if (conn->remote_auth == 0xff) {
3665 cp.authentication = conn->auth_type;
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003666
Mikel Astizb16c6602014-04-08 14:21:34 +02003667 /* Request MITM protection if our IO caps allow it
Johan Hedberg4ad51a72014-06-09 14:41:25 +03003668 * except for the no-bonding case.
3669 * conn->auth_type is not updated here since
3670 * that might cause the user confirmation to be
3671 * rejected in case the remote doesn't have the
3672 * IO capabilities for MITM.
Mikel Astizb16c6602014-04-08 14:21:34 +02003673 */
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003674 if (conn->io_capability != HCI_IO_NO_INPUT_OUTPUT &&
Mikel Astizb16c6602014-04-08 14:21:34 +02003675 cp.authentication != HCI_AT_NO_BONDING)
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003676 cp.authentication |= 0x01;
Mikel Astizb7f94c82014-04-08 14:21:31 +02003677 } else {
3678 conn->auth_type = hci_get_auth_req(conn);
3679 cp.authentication = conn->auth_type;
3680 }
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003681
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003682 if (hci_find_remote_oob_data(hdev, &conn->dst) &&
3683 (conn->out || test_bit(HCI_CONN_REMOTE_OOB, &conn->flags)))
Szymon Jancce85ee12011-03-22 13:12:23 +01003684 cp.oob_data = 0x01;
3685 else
3686 cp.oob_data = 0x00;
3687
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003688 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003689 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003690 } else {
3691 struct hci_cp_io_capability_neg_reply cp;
3692
3693 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02003694 cp.reason = HCI_ERROR_PAIRING_NOT_ALLOWED;
Johan Hedberg03b555e2011-01-04 15:40:05 +02003695
3696 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003697 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003698 }
3699
3700unlock:
3701 hci_dev_unlock(hdev);
3702}
3703
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003704static void hci_io_capa_reply_evt(struct hci_dev *hdev, struct sk_buff *skb)
Johan Hedberg03b555e2011-01-04 15:40:05 +02003705{
3706 struct hci_ev_io_capa_reply *ev = (void *) skb->data;
3707 struct hci_conn *conn;
3708
3709 BT_DBG("%s", hdev->name);
3710
3711 hci_dev_lock(hdev);
3712
3713 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3714 if (!conn)
3715 goto unlock;
3716
Johan Hedberg03b555e2011-01-04 15:40:05 +02003717 conn->remote_cap = ev->capability;
Johan Hedberg03b555e2011-01-04 15:40:05 +02003718 conn->remote_auth = ev->authentication;
Johan Hedberg58a681e2012-01-16 06:47:28 +02003719 if (ev->oob_data)
3720 set_bit(HCI_CONN_REMOTE_OOB, &conn->flags);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003721
3722unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02003723 hci_dev_unlock(hdev);
3724}
3725
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003726static void hci_user_confirm_request_evt(struct hci_dev *hdev,
3727 struct sk_buff *skb)
Johan Hedberga5c29682011-02-19 12:05:57 -03003728{
3729 struct hci_ev_user_confirm_req *ev = (void *) skb->data;
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003730 int loc_mitm, rem_mitm, confirm_hint = 0;
Johan Hedberg7a828902011-04-28 11:28:53 -07003731 struct hci_conn *conn;
Johan Hedberga5c29682011-02-19 12:05:57 -03003732
3733 BT_DBG("%s", hdev->name);
3734
3735 hci_dev_lock(hdev);
3736
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003737 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg7a828902011-04-28 11:28:53 -07003738 goto unlock;
Johan Hedberga5c29682011-02-19 12:05:57 -03003739
Johan Hedberg7a828902011-04-28 11:28:53 -07003740 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3741 if (!conn)
3742 goto unlock;
3743
3744 loc_mitm = (conn->auth_type & 0x01);
3745 rem_mitm = (conn->remote_auth & 0x01);
3746
3747 /* If we require MITM but the remote device can't provide that
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003748 * (it has NoInputNoOutput) then reject the confirmation request
3749 */
3750 if (loc_mitm && conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) {
Johan Hedberg7a828902011-04-28 11:28:53 -07003751 BT_DBG("Rejecting request: remote device can't provide MITM");
3752 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003753 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07003754 goto unlock;
3755 }
3756
3757 /* If no side requires MITM protection; auto-accept */
Mikel Astiza7676312013-06-28 10:56:29 +02003758 if ((!loc_mitm || conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) &&
3759 (!rem_mitm || conn->io_capability == HCI_IO_NO_INPUT_OUTPUT)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003760
3761 /* If we're not the initiators request authorization to
3762 * proceed from user space (mgmt_user_confirm with
Johan Hedbergba15a582014-06-09 13:58:14 +03003763 * confirm_hint set to 1). The exception is if neither
3764 * side had MITM in which case we do auto-accept.
3765 */
3766 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) &&
3767 (loc_mitm || rem_mitm)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003768 BT_DBG("Confirming auto-accept as acceptor");
3769 confirm_hint = 1;
3770 goto confirm;
3771 }
3772
Johan Hedberg9f616562011-04-28 11:28:54 -07003773 BT_DBG("Auto-accept of user confirmation with %ums delay",
Gustavo Padovan807deac2012-05-17 00:36:24 -03003774 hdev->auto_accept_delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07003775
3776 if (hdev->auto_accept_delay > 0) {
3777 int delay = msecs_to_jiffies(hdev->auto_accept_delay);
Johan Hedberg7bc18d92013-10-16 18:11:39 +03003778 queue_delayed_work(conn->hdev->workqueue,
3779 &conn->auto_accept_work, delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07003780 goto unlock;
3781 }
3782
Johan Hedberg7a828902011-04-28 11:28:53 -07003783 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003784 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07003785 goto unlock;
3786 }
3787
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003788confirm:
Johan Hedberg39adbff2014-03-20 08:18:14 +02003789 mgmt_user_confirm_request(hdev, &ev->bdaddr, ACL_LINK, 0,
3790 le32_to_cpu(ev->passkey), confirm_hint);
Johan Hedberg7a828902011-04-28 11:28:53 -07003791
3792unlock:
Johan Hedberga5c29682011-02-19 12:05:57 -03003793 hci_dev_unlock(hdev);
3794}
3795
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003796static void hci_user_passkey_request_evt(struct hci_dev *hdev,
3797 struct sk_buff *skb)
Brian Gix1143d452011-11-23 08:28:34 -08003798{
3799 struct hci_ev_user_passkey_req *ev = (void *) skb->data;
3800
3801 BT_DBG("%s", hdev->name);
3802
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003803 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg272d90d2012-02-09 15:26:12 +02003804 mgmt_user_passkey_request(hdev, &ev->bdaddr, ACL_LINK, 0);
Brian Gix1143d452011-11-23 08:28:34 -08003805}
3806
Johan Hedberg92a25252012-09-06 18:39:26 +03003807static void hci_user_passkey_notify_evt(struct hci_dev *hdev,
3808 struct sk_buff *skb)
3809{
3810 struct hci_ev_user_passkey_notify *ev = (void *) skb->data;
3811 struct hci_conn *conn;
3812
3813 BT_DBG("%s", hdev->name);
3814
3815 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3816 if (!conn)
3817 return;
3818
3819 conn->passkey_notify = __le32_to_cpu(ev->passkey);
3820 conn->passkey_entered = 0;
3821
3822 if (test_bit(HCI_MGMT, &hdev->dev_flags))
3823 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
3824 conn->dst_type, conn->passkey_notify,
3825 conn->passkey_entered);
3826}
3827
3828static void hci_keypress_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
3829{
3830 struct hci_ev_keypress_notify *ev = (void *) skb->data;
3831 struct hci_conn *conn;
3832
3833 BT_DBG("%s", hdev->name);
3834
3835 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3836 if (!conn)
3837 return;
3838
3839 switch (ev->type) {
3840 case HCI_KEYPRESS_STARTED:
3841 conn->passkey_entered = 0;
3842 return;
3843
3844 case HCI_KEYPRESS_ENTERED:
3845 conn->passkey_entered++;
3846 break;
3847
3848 case HCI_KEYPRESS_ERASED:
3849 conn->passkey_entered--;
3850 break;
3851
3852 case HCI_KEYPRESS_CLEARED:
3853 conn->passkey_entered = 0;
3854 break;
3855
3856 case HCI_KEYPRESS_COMPLETED:
3857 return;
3858 }
3859
3860 if (test_bit(HCI_MGMT, &hdev->dev_flags))
3861 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
3862 conn->dst_type, conn->passkey_notify,
3863 conn->passkey_entered);
3864}
3865
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003866static void hci_simple_pair_complete_evt(struct hci_dev *hdev,
3867 struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02003868{
3869 struct hci_ev_simple_pair_complete *ev = (void *) skb->data;
3870 struct hci_conn *conn;
3871
3872 BT_DBG("%s", hdev->name);
3873
3874 hci_dev_lock(hdev);
3875
3876 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg2a611692011-02-19 12:06:00 -03003877 if (!conn)
3878 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02003879
Johan Hedberg2a611692011-02-19 12:06:00 -03003880 /* To avoid duplicate auth_failed events to user space we check
3881 * the HCI_CONN_AUTH_PEND flag which will be set if we
3882 * initiated the authentication. A traditional auth_complete
3883 * event gets always produced as initiator and is also mapped to
3884 * the mgmt_auth_failed event */
Mikel Astizfa1bd912012-08-09 09:52:29 +02003885 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) && ev->status)
Johan Hedbergbab73cb2012-02-09 16:07:29 +02003886 mgmt_auth_failed(hdev, &conn->dst, conn->type, conn->dst_type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003887 ev->status);
Johan Hedberg2a611692011-02-19 12:06:00 -03003888
David Herrmann76a68ba2013-04-06 20:28:37 +02003889 hci_conn_drop(conn);
Johan Hedberg2a611692011-02-19 12:06:00 -03003890
3891unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02003892 hci_dev_unlock(hdev);
3893}
3894
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003895static void hci_remote_host_features_evt(struct hci_dev *hdev,
3896 struct sk_buff *skb)
Marcel Holtmann41a96212008-07-14 20:13:48 +02003897{
3898 struct hci_ev_remote_host_features *ev = (void *) skb->data;
3899 struct inquiry_entry *ie;
Johan Hedbergcad718e2013-04-17 15:00:51 +03003900 struct hci_conn *conn;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003901
3902 BT_DBG("%s", hdev->name);
3903
3904 hci_dev_lock(hdev);
3905
Johan Hedbergcad718e2013-04-17 15:00:51 +03003906 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3907 if (conn)
3908 memcpy(conn->features[1], ev->features, 8);
3909
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003910 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
3911 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02003912 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003913
3914 hci_dev_unlock(hdev);
3915}
3916
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003917static void hci_remote_oob_data_request_evt(struct hci_dev *hdev,
3918 struct sk_buff *skb)
Szymon Janc2763eda2011-03-22 13:12:22 +01003919{
3920 struct hci_ev_remote_oob_data_request *ev = (void *) skb->data;
3921 struct oob_data *data;
3922
3923 BT_DBG("%s", hdev->name);
3924
3925 hci_dev_lock(hdev);
3926
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003927 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Szymon Jance1ba1f12011-04-06 13:01:59 +02003928 goto unlock;
3929
Szymon Janc2763eda2011-03-22 13:12:22 +01003930 data = hci_find_remote_oob_data(hdev, &ev->bdaddr);
3931 if (data) {
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08003932 if (test_bit(HCI_SC_ENABLED, &hdev->dev_flags)) {
3933 struct hci_cp_remote_oob_ext_data_reply cp;
Szymon Janc2763eda2011-03-22 13:12:22 +01003934
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08003935 bacpy(&cp.bdaddr, &ev->bdaddr);
3936 memcpy(cp.hash192, data->hash192, sizeof(cp.hash192));
3937 memcpy(cp.randomizer192, data->randomizer192,
3938 sizeof(cp.randomizer192));
3939 memcpy(cp.hash256, data->hash256, sizeof(cp.hash256));
3940 memcpy(cp.randomizer256, data->randomizer256,
3941 sizeof(cp.randomizer256));
Szymon Janc2763eda2011-03-22 13:12:22 +01003942
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08003943 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_EXT_DATA_REPLY,
3944 sizeof(cp), &cp);
3945 } else {
3946 struct hci_cp_remote_oob_data_reply cp;
3947
3948 bacpy(&cp.bdaddr, &ev->bdaddr);
3949 memcpy(cp.hash, data->hash192, sizeof(cp.hash));
3950 memcpy(cp.randomizer, data->randomizer192,
3951 sizeof(cp.randomizer));
3952
3953 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_REPLY,
3954 sizeof(cp), &cp);
3955 }
Szymon Janc2763eda2011-03-22 13:12:22 +01003956 } else {
3957 struct hci_cp_remote_oob_data_neg_reply cp;
3958
3959 bacpy(&cp.bdaddr, &ev->bdaddr);
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08003960 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_NEG_REPLY,
3961 sizeof(cp), &cp);
Szymon Janc2763eda2011-03-22 13:12:22 +01003962 }
3963
Szymon Jance1ba1f12011-04-06 13:01:59 +02003964unlock:
Szymon Janc2763eda2011-03-22 13:12:22 +01003965 hci_dev_unlock(hdev);
3966}
3967
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03003968static void hci_phy_link_complete_evt(struct hci_dev *hdev,
3969 struct sk_buff *skb)
3970{
3971 struct hci_ev_phy_link_complete *ev = (void *) skb->data;
3972 struct hci_conn *hcon, *bredr_hcon;
3973
3974 BT_DBG("%s handle 0x%2.2x status 0x%2.2x", hdev->name, ev->phy_handle,
3975 ev->status);
3976
3977 hci_dev_lock(hdev);
3978
3979 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
3980 if (!hcon) {
3981 hci_dev_unlock(hdev);
3982 return;
3983 }
3984
3985 if (ev->status) {
3986 hci_conn_del(hcon);
3987 hci_dev_unlock(hdev);
3988 return;
3989 }
3990
3991 bredr_hcon = hcon->amp_mgr->l2cap_conn->hcon;
3992
3993 hcon->state = BT_CONNECTED;
3994 bacpy(&hcon->dst, &bredr_hcon->dst);
3995
3996 hci_conn_hold(hcon);
3997 hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003998 hci_conn_drop(hcon);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03003999
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004000 hci_conn_add_sysfs(hcon);
4001
Andrei Emeltchenkocf70ff22012-10-31 15:46:36 +02004002 amp_physical_cfm(bredr_hcon, hcon);
4003
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004004 hci_dev_unlock(hdev);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004005}
4006
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004007static void hci_loglink_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
4008{
4009 struct hci_ev_logical_link_complete *ev = (void *) skb->data;
4010 struct hci_conn *hcon;
4011 struct hci_chan *hchan;
4012 struct amp_mgr *mgr;
4013
4014 BT_DBG("%s log_handle 0x%4.4x phy_handle 0x%2.2x status 0x%2.2x",
4015 hdev->name, le16_to_cpu(ev->handle), ev->phy_handle,
4016 ev->status);
4017
4018 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4019 if (!hcon)
4020 return;
4021
4022 /* Create AMP hchan */
4023 hchan = hci_chan_create(hcon);
4024 if (!hchan)
4025 return;
4026
4027 hchan->handle = le16_to_cpu(ev->handle);
4028
4029 BT_DBG("hcon %p mgr %p hchan %p", hcon, hcon->amp_mgr, hchan);
4030
4031 mgr = hcon->amp_mgr;
4032 if (mgr && mgr->bredr_chan) {
4033 struct l2cap_chan *bredr_chan = mgr->bredr_chan;
4034
4035 l2cap_chan_lock(bredr_chan);
4036
4037 bredr_chan->conn->mtu = hdev->block_mtu;
4038 l2cap_logical_cfm(bredr_chan, hchan, 0);
4039 hci_conn_hold(hcon);
4040
4041 l2cap_chan_unlock(bredr_chan);
4042 }
4043}
4044
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02004045static void hci_disconn_loglink_complete_evt(struct hci_dev *hdev,
4046 struct sk_buff *skb)
4047{
4048 struct hci_ev_disconn_logical_link_complete *ev = (void *) skb->data;
4049 struct hci_chan *hchan;
4050
4051 BT_DBG("%s log handle 0x%4.4x status 0x%2.2x", hdev->name,
4052 le16_to_cpu(ev->handle), ev->status);
4053
4054 if (ev->status)
4055 return;
4056
4057 hci_dev_lock(hdev);
4058
4059 hchan = hci_chan_lookup_handle(hdev, le16_to_cpu(ev->handle));
4060 if (!hchan)
4061 goto unlock;
4062
4063 amp_destroy_logical_link(hchan, ev->reason);
4064
4065unlock:
4066 hci_dev_unlock(hdev);
4067}
4068
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02004069static void hci_disconn_phylink_complete_evt(struct hci_dev *hdev,
4070 struct sk_buff *skb)
4071{
4072 struct hci_ev_disconn_phy_link_complete *ev = (void *) skb->data;
4073 struct hci_conn *hcon;
4074
4075 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4076
4077 if (ev->status)
4078 return;
4079
4080 hci_dev_lock(hdev);
4081
4082 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4083 if (hcon) {
4084 hcon->state = BT_CLOSED;
4085 hci_conn_del(hcon);
4086 }
4087
4088 hci_dev_unlock(hdev);
4089}
4090
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004091static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03004092{
4093 struct hci_ev_le_conn_complete *ev = (void *) skb->data;
Johan Hedberg912b42ef2014-07-03 19:33:49 +03004094 struct hci_conn_params *params;
Ville Tervofcd89c02011-02-10 22:38:47 -03004095 struct hci_conn *conn;
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004096 struct smp_irk *irk;
Johan Hedberg837d5022014-07-02 09:36:22 +03004097 u8 addr_type;
Ville Tervofcd89c02011-02-10 22:38:47 -03004098
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004099 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Ville Tervofcd89c02011-02-10 22:38:47 -03004100
4101 hci_dev_lock(hdev);
4102
Johan Hedbergfbd96c12014-07-08 17:21:51 +03004103 /* All controllers implicitly stop advertising in the event of a
4104 * connection, so ensure that the state bit is cleared.
4105 */
4106 clear_bit(HCI_LE_ADV, &hdev->dev_flags);
4107
Andre Guedesb47a09b2012-07-27 15:10:15 -03004108 conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
Ville Tervob62f3282011-02-10 22:38:50 -03004109 if (!conn) {
4110 conn = hci_conn_add(hdev, LE_LINK, &ev->bdaddr);
4111 if (!conn) {
4112 BT_ERR("No memory for new connection");
Andre Guedes230fd162012-07-27 15:10:10 -03004113 goto unlock;
Ville Tervob62f3282011-02-10 22:38:50 -03004114 }
Andre Guedes29b79882011-05-31 14:20:54 -03004115
4116 conn->dst_type = ev->bdaddr_type;
Andre Guedesb9b343d2012-07-27 15:10:11 -03004117
4118 if (ev->role == LE_CONN_ROLE_MASTER) {
4119 conn->out = true;
Johan Hedberg4dae2792014-06-24 17:03:50 +03004120 set_bit(HCI_CONN_MASTER, &conn->flags);
Andre Guedesb9b343d2012-07-27 15:10:11 -03004121 }
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004122
4123 /* If we didn't have a hci_conn object previously
4124 * but we're in master role this must be something
4125 * initiated using a white list. Since white list based
4126 * connections are not "first class citizens" we don't
4127 * have full tracking of them. Therefore, we go ahead
4128 * with a "best effort" approach of determining the
4129 * initiator address based on the HCI_PRIVACY flag.
4130 */
4131 if (conn->out) {
4132 conn->resp_addr_type = ev->bdaddr_type;
4133 bacpy(&conn->resp_addr, &ev->bdaddr);
4134 if (test_bit(HCI_PRIVACY, &hdev->dev_flags)) {
4135 conn->init_addr_type = ADDR_LE_DEV_RANDOM;
4136 bacpy(&conn->init_addr, &hdev->rpa);
4137 } else {
4138 hci_copy_identity_address(hdev,
4139 &conn->init_addr,
4140 &conn->init_addr_type);
4141 }
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004142 }
Johan Hedberg9489eca2014-02-28 17:45:46 +02004143 } else {
4144 cancel_delayed_work(&conn->le_conn_timeout);
Ville Tervob62f3282011-02-10 22:38:50 -03004145 }
Ville Tervofcd89c02011-02-10 22:38:47 -03004146
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004147 if (!conn->out) {
4148 /* Set the responder (our side) address type based on
4149 * the advertising address type.
4150 */
4151 conn->resp_addr_type = hdev->adv_addr_type;
4152 if (hdev->adv_addr_type == ADDR_LE_DEV_RANDOM)
4153 bacpy(&conn->resp_addr, &hdev->random_addr);
4154 else
4155 bacpy(&conn->resp_addr, &hdev->bdaddr);
4156
4157 conn->init_addr_type = ev->bdaddr_type;
4158 bacpy(&conn->init_addr, &ev->bdaddr);
Marcel Holtmanna720d732014-06-23 12:14:51 +02004159
4160 /* For incoming connections, set the default minimum
4161 * and maximum connection interval. They will be used
4162 * to check if the parameters are in range and if not
4163 * trigger the connection update procedure.
4164 */
4165 conn->le_conn_min_interval = hdev->le_conn_min_interval;
4166 conn->le_conn_max_interval = hdev->le_conn_max_interval;
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004167 }
Johan Hedberg7be2edb2014-02-23 19:42:17 +02004168
Marcel Holtmannedb4b462014-02-18 15:13:43 -08004169 /* Lookup the identity address from the stored connection
4170 * address and address type.
4171 *
4172 * When establishing connections to an identity address, the
4173 * connection procedure will store the resolvable random
4174 * address first. Now if it can be converted back into the
4175 * identity address, start using the identity address from
4176 * now on.
4177 */
4178 irk = hci_get_irk(hdev, &conn->dst, conn->dst_type);
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004179 if (irk) {
4180 bacpy(&conn->dst, &irk->bdaddr);
4181 conn->dst_type = irk->addr_type;
4182 }
4183
Johan Hedberg837d5022014-07-02 09:36:22 +03004184 if (conn->dst_type == ADDR_LE_DEV_PUBLIC)
4185 addr_type = BDADDR_LE_PUBLIC;
4186 else
4187 addr_type = BDADDR_LE_RANDOM;
4188
4189 /* Drop the connection if he device is blocked */
Johan Hedbergdcc36c12014-07-09 12:59:13 +03004190 if (hci_bdaddr_list_lookup(&hdev->blacklist, &conn->dst, addr_type)) {
Johan Hedberg837d5022014-07-02 09:36:22 +03004191 hci_conn_drop(conn);
4192 goto unlock;
4193 }
4194
Andre Guedescd17dec2012-07-27 15:10:16 -03004195 if (ev->status) {
Andre Guedes06c053f2014-02-26 20:21:41 -03004196 hci_le_conn_failed(conn, ev->status);
Andre Guedescd17dec2012-07-27 15:10:16 -03004197 goto unlock;
4198 }
4199
Johan Hedbergb644ba32012-01-17 21:48:47 +02004200 if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Marcel Holtmann01fdb0f2014-02-18 14:22:19 -08004201 mgmt_device_connected(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03004202 conn->dst_type, 0, NULL, 0, NULL);
Vinicius Costa Gomes83bc71b2011-05-06 18:41:43 -03004203
Vinicius Costa Gomes7b5c0d52011-06-09 18:50:50 -03004204 conn->sec_level = BT_SECURITY_LOW;
Ville Tervofcd89c02011-02-10 22:38:47 -03004205 conn->handle = __le16_to_cpu(ev->handle);
4206 conn->state = BT_CONNECTED;
4207
Marcel Holtmanne04fde62014-06-23 11:40:04 +02004208 conn->le_conn_interval = le16_to_cpu(ev->interval);
4209 conn->le_conn_latency = le16_to_cpu(ev->latency);
4210 conn->le_supv_timeout = le16_to_cpu(ev->supervision_timeout);
4211
Ville Tervofcd89c02011-02-10 22:38:47 -03004212 hci_conn_add_sysfs(conn);
4213
4214 hci_proto_connect_cfm(conn, ev->status);
4215
Johan Hedberg912b42ef2014-07-03 19:33:49 +03004216 params = hci_conn_params_lookup(hdev, &conn->dst, conn->dst_type);
Johan Hedberg223683a52014-07-06 15:44:23 +03004217 if (params)
Johan Hedberg95305ba2014-07-04 12:37:21 +03004218 list_del_init(&params->action);
Andre Guedesa4790db2014-02-26 20:21:47 -03004219
Ville Tervofcd89c02011-02-10 22:38:47 -03004220unlock:
Johan Hedberg223683a52014-07-06 15:44:23 +03004221 hci_update_background_scan(hdev);
Ville Tervofcd89c02011-02-10 22:38:47 -03004222 hci_dev_unlock(hdev);
4223}
4224
Marcel Holtmann1855d922014-06-23 11:40:05 +02004225static void hci_le_conn_update_complete_evt(struct hci_dev *hdev,
4226 struct sk_buff *skb)
4227{
4228 struct hci_ev_le_conn_update_complete *ev = (void *) skb->data;
4229 struct hci_conn *conn;
4230
4231 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4232
4233 if (ev->status)
4234 return;
4235
4236 hci_dev_lock(hdev);
4237
4238 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
4239 if (conn) {
4240 conn->le_conn_interval = le16_to_cpu(ev->interval);
4241 conn->le_conn_latency = le16_to_cpu(ev->latency);
4242 conn->le_supv_timeout = le16_to_cpu(ev->supervision_timeout);
4243 }
4244
4245 hci_dev_unlock(hdev);
4246}
4247
Andre Guedesa4790db2014-02-26 20:21:47 -03004248/* This function requires the caller holds hdev->lock */
Johan Hedberg7e899c92014-07-07 12:45:55 +03004249static void check_pending_le_conn(struct hci_dev *hdev, bdaddr_t *addr,
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004250 u8 addr_type, u8 adv_type)
Andre Guedesa4790db2014-02-26 20:21:47 -03004251{
4252 struct hci_conn *conn;
4253
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004254 /* If the event is not connectable don't proceed further */
4255 if (adv_type != LE_ADV_IND && adv_type != LE_ADV_DIRECT_IND)
Johan Hedberg7e899c92014-07-07 12:45:55 +03004256 return;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004257
4258 /* Ignore if the device is blocked */
Johan Hedbergdcc36c12014-07-09 12:59:13 +03004259 if (hci_bdaddr_list_lookup(&hdev->blacklist, addr, addr_type))
Johan Hedberg7e899c92014-07-07 12:45:55 +03004260 return;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004261
4262 /* If we're connectable, always connect any ADV_DIRECT_IND event */
4263 if (test_bit(HCI_CONNECTABLE, &hdev->dev_flags) &&
4264 adv_type == LE_ADV_DIRECT_IND)
4265 goto connect;
4266
4267 /* If we're not connectable only connect devices that we have in
4268 * our pend_le_conns list.
4269 */
Johan Hedberg501f8822014-07-04 12:37:26 +03004270 if (!hci_pend_le_action_lookup(&hdev->pend_le_conns, addr, addr_type))
Johan Hedberg7e899c92014-07-07 12:45:55 +03004271 return;
Andre Guedesa4790db2014-02-26 20:21:47 -03004272
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004273connect:
Johan Hedbergcdd62752014-07-07 15:02:28 +03004274 /* Request connection in master = true role */
Andre Guedesa4790db2014-02-26 20:21:47 -03004275 conn = hci_connect_le(hdev, addr, addr_type, BT_SECURITY_LOW,
Johan Hedbergcdd62752014-07-07 15:02:28 +03004276 HCI_LE_AUTOCONN_TIMEOUT, true);
Andre Guedesa4790db2014-02-26 20:21:47 -03004277 if (!IS_ERR(conn))
Johan Hedberg7e899c92014-07-07 12:45:55 +03004278 return;
Andre Guedesa4790db2014-02-26 20:21:47 -03004279
4280 switch (PTR_ERR(conn)) {
4281 case -EBUSY:
4282 /* If hci_connect() returns -EBUSY it means there is already
4283 * an LE connection attempt going on. Since controllers don't
4284 * support more than one connection attempt at the time, we
4285 * don't consider this an error case.
4286 */
4287 break;
4288 default:
4289 BT_DBG("Failed to connect: err %ld", PTR_ERR(conn));
4290 }
4291}
4292
Johan Hedberg4af605d2014-03-24 10:48:00 +02004293static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr,
4294 u8 bdaddr_type, s8 rssi, u8 *data, u8 len)
4295{
Johan Hedbergb9a63282014-03-25 10:51:52 +02004296 struct discovery_state *d = &hdev->discovery;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004297 struct smp_irk *irk;
Johan Hedberg474ee062014-03-25 14:34:59 +02004298 bool match;
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004299 u32 flags;
Johan Hedbergb9a63282014-03-25 10:51:52 +02004300
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004301 /* Check if we need to convert to identity address */
4302 irk = hci_get_irk(hdev, bdaddr, bdaddr_type);
4303 if (irk) {
4304 bdaddr = &irk->bdaddr;
4305 bdaddr_type = irk->addr_type;
4306 }
4307
4308 /* Check if we have been requested to connect to this device */
4309 check_pending_le_conn(hdev, bdaddr, bdaddr_type, type);
4310
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004311 /* Passive scanning shouldn't trigger any device found events,
4312 * except for devices marked as CONN_REPORT for which we do send
4313 * device found events.
4314 */
Johan Hedbergca5c4be2014-03-25 10:30:46 +02004315 if (hdev->le_scan_type == LE_SCAN_PASSIVE) {
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004316 struct hci_conn_params *param;
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004317
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004318 if (type == LE_ADV_DIRECT_IND)
4319 return;
4320
Johan Hedberga7545f22014-07-04 12:37:27 +03004321 param = hci_pend_le_action_lookup(&hdev->pend_le_reports,
4322 bdaddr, bdaddr_type);
4323 if (!param)
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004324 return;
4325
4326 if (type == LE_ADV_NONCONN_IND || type == LE_ADV_SCAN_IND)
4327 flags = MGMT_DEV_FOUND_NOT_CONNECTABLE;
4328 else
4329 flags = 0;
4330 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
4331 rssi, flags, data, len, NULL, 0);
Johan Hedberg97bf2e92014-07-04 12:37:16 +03004332 return;
Johan Hedbergca5c4be2014-03-25 10:30:46 +02004333 }
Johan Hedberg4af605d2014-03-24 10:48:00 +02004334
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004335 /* When receiving non-connectable or scannable undirected
4336 * advertising reports, this means that the remote device is
4337 * not connectable and then clearly indicate this in the
4338 * device found event.
4339 *
4340 * When receiving a scan response, then there is no way to
4341 * know if the remote device is connectable or not. However
4342 * since scan responses are merged with a previously seen
4343 * advertising report, the flags field from that report
4344 * will be used.
4345 *
4346 * In the really unlikely case that a controller get confused
4347 * and just sends a scan response event, then it is marked as
4348 * not connectable as well.
4349 */
4350 if (type == LE_ADV_NONCONN_IND || type == LE_ADV_SCAN_IND ||
4351 type == LE_ADV_SCAN_RSP)
4352 flags = MGMT_DEV_FOUND_NOT_CONNECTABLE;
4353 else
4354 flags = 0;
4355
Johan Hedbergb9a63282014-03-25 10:51:52 +02004356 /* If there's nothing pending either store the data from this
4357 * event or send an immediate device found event if the data
4358 * should not be stored for later.
4359 */
4360 if (!has_pending_adv_report(hdev)) {
4361 /* If the report will trigger a SCAN_REQ store it for
4362 * later merging.
4363 */
4364 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
4365 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004366 rssi, flags, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004367 return;
4368 }
4369
4370 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004371 rssi, flags, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004372 return;
4373 }
4374
Johan Hedberg474ee062014-03-25 14:34:59 +02004375 /* Check if the pending report is for the same device as the new one */
4376 match = (!bacmp(bdaddr, &d->last_adv_addr) &&
4377 bdaddr_type == d->last_adv_addr_type);
4378
Johan Hedbergb9a63282014-03-25 10:51:52 +02004379 /* If the pending data doesn't match this report or this isn't a
4380 * scan response (e.g. we got a duplicate ADV_IND) then force
4381 * sending of the pending data.
4382 */
Johan Hedberg474ee062014-03-25 14:34:59 +02004383 if (type != LE_ADV_SCAN_RSP || !match) {
4384 /* Send out whatever is in the cache, but skip duplicates */
4385 if (!match)
4386 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004387 d->last_adv_addr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004388 d->last_adv_rssi, d->last_adv_flags,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004389 d->last_adv_data,
Johan Hedberg474ee062014-03-25 14:34:59 +02004390 d->last_adv_data_len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004391
4392 /* If the new report will trigger a SCAN_REQ store it for
4393 * later merging.
4394 */
4395 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
4396 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004397 rssi, flags, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004398 return;
4399 }
4400
4401 /* The advertising reports cannot be merged, so clear
4402 * the pending report and send out a device found event.
4403 */
4404 clear_pending_adv_report(hdev);
Johan Hedberg5c5b93e2014-03-29 08:39:53 +02004405 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004406 rssi, flags, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004407 return;
4408 }
4409
4410 /* If we get here we've got a pending ADV_IND or ADV_SCAN_IND and
4411 * the new event is a SCAN_RSP. We can therefore proceed with
4412 * sending a merged device found event.
4413 */
4414 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004415 d->last_adv_addr_type, NULL, rssi, d->last_adv_flags,
Marcel Holtmann42bd6a52014-07-01 14:11:19 +02004416 d->last_adv_data, d->last_adv_data_len, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004417 clear_pending_adv_report(hdev);
Johan Hedberg4af605d2014-03-24 10:48:00 +02004418}
4419
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004420static void hci_le_adv_report_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andre Guedes9aa04c92011-05-26 16:23:51 -03004421{
Andre Guedese95beb42011-09-26 20:48:35 -03004422 u8 num_reports = skb->data[0];
4423 void *ptr = &skb->data[1];
Andre Guedes9aa04c92011-05-26 16:23:51 -03004424
Andre Guedesa4790db2014-02-26 20:21:47 -03004425 hci_dev_lock(hdev);
4426
Andre Guedese95beb42011-09-26 20:48:35 -03004427 while (num_reports--) {
4428 struct hci_ev_le_advertising_info *ev = ptr;
Johan Hedberg4af605d2014-03-24 10:48:00 +02004429 s8 rssi;
Andre Guedesa4790db2014-02-26 20:21:47 -03004430
Andre Guedes3c9e9192012-01-10 18:20:50 -03004431 rssi = ev->data[ev->length];
Johan Hedberg4af605d2014-03-24 10:48:00 +02004432 process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
4433 ev->bdaddr_type, rssi, ev->data, ev->length);
Andre Guedes3c9e9192012-01-10 18:20:50 -03004434
Andre Guedese95beb42011-09-26 20:48:35 -03004435 ptr += sizeof(*ev) + ev->length + 1;
Andre Guedes9aa04c92011-05-26 16:23:51 -03004436 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004437
4438 hci_dev_unlock(hdev);
Andre Guedes9aa04c92011-05-26 16:23:51 -03004439}
4440
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004441static void hci_le_ltk_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004442{
4443 struct hci_ev_le_ltk_req *ev = (void *) skb->data;
4444 struct hci_cp_le_ltk_reply cp;
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004445 struct hci_cp_le_ltk_neg_reply neg;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004446 struct hci_conn *conn;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004447 struct smp_ltk *ltk;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004448
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004449 BT_DBG("%s handle 0x%4.4x", hdev->name, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004450
4451 hci_dev_lock(hdev);
4452
4453 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004454 if (conn == NULL)
4455 goto not_found;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004456
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -08004457 ltk = hci_find_ltk(hdev, ev->ediv, ev->rand, conn->out);
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004458 if (ltk == NULL)
4459 goto not_found;
4460
4461 memcpy(cp.ltk, ltk->val, sizeof(ltk->val));
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004462 cp.handle = cpu_to_le16(conn->handle);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004463
4464 if (ltk->authenticated)
Andre Guedesf8776212013-07-31 16:25:28 -03004465 conn->pending_sec_level = BT_SECURITY_HIGH;
4466 else
4467 conn->pending_sec_level = BT_SECURITY_MEDIUM;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004468
Andre Guedes89cbb4d2013-07-31 16:25:29 -03004469 conn->enc_key_size = ltk->enc_size;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004470
4471 hci_send_cmd(hdev, HCI_OP_LE_LTK_REPLY, sizeof(cp), &cp);
4472
Claudio Takahasi5981a882013-07-25 16:34:24 -03004473 /* Ref. Bluetooth Core SPEC pages 1975 and 2004. STK is a
4474 * temporary key used to encrypt a connection following
4475 * pairing. It is used during the Encrypted Session Setup to
4476 * distribute the keys. Later, security can be re-established
4477 * using a distributed LTK.
4478 */
Johan Hedberg2ceba532014-06-16 19:25:16 +03004479 if (ltk->type == SMP_STK) {
Johan Hedbergfe59a052014-07-01 19:14:12 +03004480 set_bit(HCI_CONN_STK_ENCRYPT, &conn->flags);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004481 list_del(&ltk->list);
4482 kfree(ltk);
Johan Hedbergfe59a052014-07-01 19:14:12 +03004483 } else {
4484 clear_bit(HCI_CONN_STK_ENCRYPT, &conn->flags);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004485 }
4486
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004487 hci_dev_unlock(hdev);
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004488
4489 return;
4490
4491not_found:
4492 neg.handle = ev->handle;
4493 hci_send_cmd(hdev, HCI_OP_LE_LTK_NEG_REPLY, sizeof(neg), &neg);
4494 hci_dev_unlock(hdev);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004495}
4496
Andre Guedes8e75b462014-07-01 18:10:08 -03004497static void send_conn_param_neg_reply(struct hci_dev *hdev, u16 handle,
4498 u8 reason)
4499{
4500 struct hci_cp_le_conn_param_req_neg_reply cp;
4501
4502 cp.handle = cpu_to_le16(handle);
4503 cp.reason = reason;
4504
4505 hci_send_cmd(hdev, HCI_OP_LE_CONN_PARAM_REQ_NEG_REPLY, sizeof(cp),
4506 &cp);
4507}
4508
4509static void hci_le_remote_conn_param_req_evt(struct hci_dev *hdev,
4510 struct sk_buff *skb)
4511{
4512 struct hci_ev_le_remote_conn_param_req *ev = (void *) skb->data;
4513 struct hci_cp_le_conn_param_req_reply cp;
4514 struct hci_conn *hcon;
4515 u16 handle, min, max, latency, timeout;
4516
4517 handle = le16_to_cpu(ev->handle);
4518 min = le16_to_cpu(ev->interval_min);
4519 max = le16_to_cpu(ev->interval_max);
4520 latency = le16_to_cpu(ev->latency);
4521 timeout = le16_to_cpu(ev->timeout);
4522
4523 hcon = hci_conn_hash_lookup_handle(hdev, handle);
4524 if (!hcon || hcon->state != BT_CONNECTED)
4525 return send_conn_param_neg_reply(hdev, handle,
4526 HCI_ERROR_UNKNOWN_CONN_ID);
4527
4528 if (hci_check_conn_params(min, max, latency, timeout))
4529 return send_conn_param_neg_reply(hdev, handle,
4530 HCI_ERROR_INVALID_LL_PARAMS);
4531
Johan Hedberg348d50b2014-07-02 17:37:30 +03004532 if (test_bit(HCI_CONN_MASTER, &hcon->flags)) {
4533 struct hci_conn_params *params;
Johan Hedbergf4869e22014-07-02 17:37:32 +03004534 u8 store_hint;
Johan Hedberg348d50b2014-07-02 17:37:30 +03004535
4536 hci_dev_lock(hdev);
4537
4538 params = hci_conn_params_lookup(hdev, &hcon->dst,
4539 hcon->dst_type);
4540 if (params) {
4541 params->conn_min_interval = min;
4542 params->conn_max_interval = max;
4543 params->conn_latency = latency;
4544 params->supervision_timeout = timeout;
Johan Hedbergf4869e22014-07-02 17:37:32 +03004545 store_hint = 0x01;
4546 } else{
4547 store_hint = 0x00;
Johan Hedberg348d50b2014-07-02 17:37:30 +03004548 }
4549
4550 hci_dev_unlock(hdev);
4551
Johan Hedbergf4869e22014-07-02 17:37:32 +03004552 mgmt_new_conn_param(hdev, &hcon->dst, hcon->dst_type,
4553 store_hint, min, max, latency, timeout);
Johan Hedberg348d50b2014-07-02 17:37:30 +03004554 }
Andre Guedesffb5a8272014-07-01 18:10:11 -03004555
Andre Guedes8e75b462014-07-01 18:10:08 -03004556 cp.handle = ev->handle;
4557 cp.interval_min = ev->interval_min;
4558 cp.interval_max = ev->interval_max;
4559 cp.latency = ev->latency;
4560 cp.timeout = ev->timeout;
4561 cp.min_ce_len = 0;
4562 cp.max_ce_len = 0;
4563
4564 hci_send_cmd(hdev, HCI_OP_LE_CONN_PARAM_REQ_REPLY, sizeof(cp), &cp);
4565}
4566
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004567static void hci_le_meta_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03004568{
4569 struct hci_ev_le_meta *le_ev = (void *) skb->data;
4570
4571 skb_pull(skb, sizeof(*le_ev));
4572
4573 switch (le_ev->subevent) {
4574 case HCI_EV_LE_CONN_COMPLETE:
4575 hci_le_conn_complete_evt(hdev, skb);
4576 break;
4577
Marcel Holtmann1855d922014-06-23 11:40:05 +02004578 case HCI_EV_LE_CONN_UPDATE_COMPLETE:
4579 hci_le_conn_update_complete_evt(hdev, skb);
4580 break;
4581
Andre Guedes9aa04c92011-05-26 16:23:51 -03004582 case HCI_EV_LE_ADVERTISING_REPORT:
4583 hci_le_adv_report_evt(hdev, skb);
4584 break;
4585
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004586 case HCI_EV_LE_LTK_REQ:
4587 hci_le_ltk_request_evt(hdev, skb);
4588 break;
4589
Andre Guedes8e75b462014-07-01 18:10:08 -03004590 case HCI_EV_LE_REMOTE_CONN_PARAM_REQ:
4591 hci_le_remote_conn_param_req_evt(hdev, skb);
4592 break;
4593
Ville Tervofcd89c02011-02-10 22:38:47 -03004594 default:
4595 break;
4596 }
4597}
4598
Andrei Emeltchenko9495b2e2012-09-27 17:26:22 +03004599static void hci_chan_selected_evt(struct hci_dev *hdev, struct sk_buff *skb)
4600{
4601 struct hci_ev_channel_selected *ev = (void *) skb->data;
4602 struct hci_conn *hcon;
4603
4604 BT_DBG("%s handle 0x%2.2x", hdev->name, ev->phy_handle);
4605
4606 skb_pull(skb, sizeof(*ev));
4607
4608 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4609 if (!hcon)
4610 return;
4611
4612 amp_read_loc_assoc_final_data(hdev, hcon);
4613}
4614
Linus Torvalds1da177e2005-04-16 15:20:36 -07004615void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)
4616{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004617 struct hci_event_hdr *hdr = (void *) skb->data;
4618 __u8 event = hdr->evt;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004619
Johan Hedbergb6ddb632013-04-02 13:34:31 +03004620 hci_dev_lock(hdev);
4621
4622 /* Received events are (currently) only needed when a request is
4623 * ongoing so avoid unnecessary memory allocation.
4624 */
4625 if (hdev->req_status == HCI_REQ_PEND) {
4626 kfree_skb(hdev->recv_evt);
4627 hdev->recv_evt = skb_clone(skb, GFP_KERNEL);
4628 }
4629
4630 hci_dev_unlock(hdev);
4631
Linus Torvalds1da177e2005-04-16 15:20:36 -07004632 skb_pull(skb, HCI_EVENT_HDR_SIZE);
4633
Johan Hedberg02350a72013-04-03 21:50:29 +03004634 if (hdev->sent_cmd && bt_cb(hdev->sent_cmd)->req.event == event) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02004635 struct hci_command_hdr *cmd_hdr = (void *) hdev->sent_cmd->data;
4636 u16 opcode = __le16_to_cpu(cmd_hdr->opcode);
Johan Hedberg02350a72013-04-03 21:50:29 +03004637
4638 hci_req_cmd_complete(hdev, opcode, 0);
4639 }
4640
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004641 switch (event) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004642 case HCI_EV_INQUIRY_COMPLETE:
4643 hci_inquiry_complete_evt(hdev, skb);
4644 break;
4645
4646 case HCI_EV_INQUIRY_RESULT:
4647 hci_inquiry_result_evt(hdev, skb);
4648 break;
4649
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004650 case HCI_EV_CONN_COMPLETE:
4651 hci_conn_complete_evt(hdev, skb);
Marcel Holtmann21d9e302005-09-13 01:32:25 +02004652 break;
4653
Linus Torvalds1da177e2005-04-16 15:20:36 -07004654 case HCI_EV_CONN_REQUEST:
4655 hci_conn_request_evt(hdev, skb);
4656 break;
4657
Linus Torvalds1da177e2005-04-16 15:20:36 -07004658 case HCI_EV_DISCONN_COMPLETE:
4659 hci_disconn_complete_evt(hdev, skb);
4660 break;
4661
Linus Torvalds1da177e2005-04-16 15:20:36 -07004662 case HCI_EV_AUTH_COMPLETE:
4663 hci_auth_complete_evt(hdev, skb);
4664 break;
4665
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004666 case HCI_EV_REMOTE_NAME:
4667 hci_remote_name_evt(hdev, skb);
4668 break;
4669
Linus Torvalds1da177e2005-04-16 15:20:36 -07004670 case HCI_EV_ENCRYPT_CHANGE:
4671 hci_encrypt_change_evt(hdev, skb);
4672 break;
4673
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004674 case HCI_EV_CHANGE_LINK_KEY_COMPLETE:
4675 hci_change_link_key_complete_evt(hdev, skb);
4676 break;
4677
4678 case HCI_EV_REMOTE_FEATURES:
4679 hci_remote_features_evt(hdev, skb);
4680 break;
4681
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004682 case HCI_EV_CMD_COMPLETE:
4683 hci_cmd_complete_evt(hdev, skb);
4684 break;
4685
4686 case HCI_EV_CMD_STATUS:
4687 hci_cmd_status_evt(hdev, skb);
4688 break;
4689
4690 case HCI_EV_ROLE_CHANGE:
4691 hci_role_change_evt(hdev, skb);
4692 break;
4693
4694 case HCI_EV_NUM_COMP_PKTS:
4695 hci_num_comp_pkts_evt(hdev, skb);
4696 break;
4697
4698 case HCI_EV_MODE_CHANGE:
4699 hci_mode_change_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004700 break;
4701
4702 case HCI_EV_PIN_CODE_REQ:
4703 hci_pin_code_request_evt(hdev, skb);
4704 break;
4705
4706 case HCI_EV_LINK_KEY_REQ:
4707 hci_link_key_request_evt(hdev, skb);
4708 break;
4709
4710 case HCI_EV_LINK_KEY_NOTIFY:
4711 hci_link_key_notify_evt(hdev, skb);
4712 break;
4713
4714 case HCI_EV_CLOCK_OFFSET:
4715 hci_clock_offset_evt(hdev, skb);
4716 break;
4717
Marcel Holtmanna8746412008-07-14 20:13:46 +02004718 case HCI_EV_PKT_TYPE_CHANGE:
4719 hci_pkt_type_change_evt(hdev, skb);
4720 break;
4721
Marcel Holtmann85a1e932005-08-09 20:28:02 -07004722 case HCI_EV_PSCAN_REP_MODE:
4723 hci_pscan_rep_mode_evt(hdev, skb);
4724 break;
4725
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004726 case HCI_EV_INQUIRY_RESULT_WITH_RSSI:
4727 hci_inquiry_result_with_rssi_evt(hdev, skb);
4728 break;
4729
4730 case HCI_EV_REMOTE_EXT_FEATURES:
4731 hci_remote_ext_features_evt(hdev, skb);
4732 break;
4733
4734 case HCI_EV_SYNC_CONN_COMPLETE:
4735 hci_sync_conn_complete_evt(hdev, skb);
4736 break;
4737
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004738 case HCI_EV_EXTENDED_INQUIRY_RESULT:
4739 hci_extended_inquiry_result_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004740 break;
4741
Johan Hedberg1c2e0042012-06-08 23:31:13 +08004742 case HCI_EV_KEY_REFRESH_COMPLETE:
4743 hci_key_refresh_complete_evt(hdev, skb);
4744 break;
4745
Marcel Holtmann04936842008-07-14 20:13:48 +02004746 case HCI_EV_IO_CAPA_REQUEST:
4747 hci_io_capa_request_evt(hdev, skb);
4748 break;
4749
Johan Hedberg03b555e2011-01-04 15:40:05 +02004750 case HCI_EV_IO_CAPA_REPLY:
4751 hci_io_capa_reply_evt(hdev, skb);
4752 break;
4753
Johan Hedberga5c29682011-02-19 12:05:57 -03004754 case HCI_EV_USER_CONFIRM_REQUEST:
4755 hci_user_confirm_request_evt(hdev, skb);
4756 break;
4757
Brian Gix1143d452011-11-23 08:28:34 -08004758 case HCI_EV_USER_PASSKEY_REQUEST:
4759 hci_user_passkey_request_evt(hdev, skb);
4760 break;
4761
Johan Hedberg92a25252012-09-06 18:39:26 +03004762 case HCI_EV_USER_PASSKEY_NOTIFY:
4763 hci_user_passkey_notify_evt(hdev, skb);
4764 break;
4765
4766 case HCI_EV_KEYPRESS_NOTIFY:
4767 hci_keypress_notify_evt(hdev, skb);
4768 break;
4769
Marcel Holtmann04936842008-07-14 20:13:48 +02004770 case HCI_EV_SIMPLE_PAIR_COMPLETE:
4771 hci_simple_pair_complete_evt(hdev, skb);
4772 break;
4773
Marcel Holtmann41a96212008-07-14 20:13:48 +02004774 case HCI_EV_REMOTE_HOST_FEATURES:
4775 hci_remote_host_features_evt(hdev, skb);
4776 break;
4777
Ville Tervofcd89c02011-02-10 22:38:47 -03004778 case HCI_EV_LE_META:
4779 hci_le_meta_evt(hdev, skb);
4780 break;
4781
Andrei Emeltchenko9495b2e2012-09-27 17:26:22 +03004782 case HCI_EV_CHANNEL_SELECTED:
4783 hci_chan_selected_evt(hdev, skb);
4784 break;
4785
Szymon Janc2763eda2011-03-22 13:12:22 +01004786 case HCI_EV_REMOTE_OOB_DATA_REQUEST:
4787 hci_remote_oob_data_request_evt(hdev, skb);
4788 break;
4789
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004790 case HCI_EV_PHY_LINK_COMPLETE:
4791 hci_phy_link_complete_evt(hdev, skb);
4792 break;
4793
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004794 case HCI_EV_LOGICAL_LINK_COMPLETE:
4795 hci_loglink_complete_evt(hdev, skb);
4796 break;
4797
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02004798 case HCI_EV_DISCONN_LOGICAL_LINK_COMPLETE:
4799 hci_disconn_loglink_complete_evt(hdev, skb);
4800 break;
4801
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02004802 case HCI_EV_DISCONN_PHY_LINK_COMPLETE:
4803 hci_disconn_phylink_complete_evt(hdev, skb);
4804 break;
4805
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02004806 case HCI_EV_NUM_COMP_BLOCKS:
4807 hci_num_comp_blocks_evt(hdev, skb);
4808 break;
4809
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004810 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004811 BT_DBG("%s event 0x%2.2x", hdev->name, event);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004812 break;
4813 }
4814
4815 kfree_skb(skb);
4816 hdev->stat.evt_rx++;
4817}