blob: 6d1d5b3e9cd4df5740c8b1814413dc3773bc4104 [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 Guedes76a388b2013-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 Guedes76a388b2013-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
Johan Hedberg70c46422014-07-09 12:59:17 +03002124static void hci_reject_conn(struct hci_dev *hdev, bdaddr_t *bdaddr)
2125{
2126 struct hci_cp_reject_conn_req cp;
2127
2128 bacpy(&cp.bdaddr, bdaddr);
2129 cp.reason = HCI_ERROR_REJ_BAD_ADDR;
2130 hci_send_cmd(hdev, HCI_OP_REJECT_CONN_REQ, sizeof(cp), &cp);
2131}
2132
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002133static void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002134{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002135 struct hci_ev_conn_request *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002136 int mask = hdev->link_mode;
Johan Hedberg70c46422014-07-09 12:59:17 +03002137 struct inquiry_entry *ie;
2138 struct hci_conn *conn;
Frédéric Dalleau20714bfe2012-11-21 10:51:12 +01002139 __u8 flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002140
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03002141 BT_DBG("%s bdaddr %pMR type 0x%x", hdev->name, &ev->bdaddr,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002142 ev->link_type);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002143
Frédéric Dalleau20714bfe2012-11-21 10:51:12 +01002144 mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, ev->link_type,
2145 &flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002146
Johan Hedberg70c46422014-07-09 12:59:17 +03002147 if (!(mask & HCI_LM_ACCEPT)) {
2148 hci_reject_conn(hdev, &ev->bdaddr);
2149 return;
2150 }
2151
2152 if (!hci_bdaddr_list_lookup(&hdev->blacklist, &ev->bdaddr,
Johan Hedbergdcc36c12014-07-09 12:59:13 +03002153 BDADDR_BREDR)) {
Johan Hedberg70c46422014-07-09 12:59:17 +03002154 hci_reject_conn(hdev, &ev->bdaddr);
2155 return;
2156 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002157
Johan Hedberg70c46422014-07-09 12:59:17 +03002158 /* Connection accepted */
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002159
Johan Hedberg70c46422014-07-09 12:59:17 +03002160 hci_dev_lock(hdev);
Marcel Holtmannc7bdd502008-07-14 20:13:47 +02002161
Johan Hedberg70c46422014-07-09 12:59:17 +03002162 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
2163 if (ie)
2164 memcpy(ie->data.dev_class, ev->dev_class, 3);
2165
2166 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type,
2167 &ev->bdaddr);
2168 if (!conn) {
2169 conn = hci_conn_add(hdev, ev->link_type, &ev->bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002170 if (!conn) {
Johan Hedberg70c46422014-07-09 12:59:17 +03002171 BT_ERR("No memory for new connection");
2172 hci_dev_unlock(hdev);
2173 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002174 }
Johan Hedberg70c46422014-07-09 12:59:17 +03002175 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002176
Johan Hedberg70c46422014-07-09 12:59:17 +03002177 memcpy(conn->dev_class, ev->dev_class, 3);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002178
Johan Hedberg70c46422014-07-09 12:59:17 +03002179 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002180
Johan Hedberg70c46422014-07-09 12:59:17 +03002181 if (ev->link_type == ACL_LINK ||
2182 (!(flags & HCI_PROTO_DEFER) && !lmp_esco_capable(hdev))) {
2183 struct hci_cp_accept_conn_req cp;
2184 conn->state = BT_CONNECT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002185
2186 bacpy(&cp.bdaddr, &ev->bdaddr);
Johan Hedberg70c46422014-07-09 12:59:17 +03002187
2188 if (lmp_rswitch_capable(hdev) && (mask & HCI_LM_MASTER))
2189 cp.role = 0x00; /* Become master */
2190 else
2191 cp.role = 0x01; /* Remain slave */
2192
2193 hci_send_cmd(hdev, HCI_OP_ACCEPT_CONN_REQ, sizeof(cp), &cp);
2194 } else if (!(flags & HCI_PROTO_DEFER)) {
2195 struct hci_cp_accept_sync_conn_req cp;
2196 conn->state = BT_CONNECT;
2197
2198 bacpy(&cp.bdaddr, &ev->bdaddr);
2199 cp.pkt_type = cpu_to_le16(conn->pkt_type);
2200
2201 cp.tx_bandwidth = cpu_to_le32(0x00001f40);
2202 cp.rx_bandwidth = cpu_to_le32(0x00001f40);
2203 cp.max_latency = cpu_to_le16(0xffff);
2204 cp.content_format = cpu_to_le16(hdev->voice_setting);
2205 cp.retrans_effort = 0xff;
2206
2207 hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ, sizeof(cp),
2208 &cp);
2209 } else {
2210 conn->state = BT_CONNECT2;
2211 hci_proto_connect_cfm(conn, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002212 }
2213}
2214
Mikel Astizf0d6a0e2012-08-09 09:52:30 +02002215static u8 hci_to_mgmt_reason(u8 err)
2216{
2217 switch (err) {
2218 case HCI_ERROR_CONNECTION_TIMEOUT:
2219 return MGMT_DEV_DISCONN_TIMEOUT;
2220 case HCI_ERROR_REMOTE_USER_TERM:
2221 case HCI_ERROR_REMOTE_LOW_RESOURCES:
2222 case HCI_ERROR_REMOTE_POWER_OFF:
2223 return MGMT_DEV_DISCONN_REMOTE;
2224 case HCI_ERROR_LOCAL_HOST_TERM:
2225 return MGMT_DEV_DISCONN_LOCAL_HOST;
2226 default:
2227 return MGMT_DEV_DISCONN_UNKNOWN;
2228 }
2229}
2230
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002231static void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002232{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002233 struct hci_ev_disconn_complete *ev = (void *) skb->data;
Andre Guedesabf54a52013-11-07 17:36:09 -03002234 u8 reason = hci_to_mgmt_reason(ev->reason);
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002235 struct hci_conn_params *params;
Marcel Holtmann04837f62006-07-03 10:02:33 +02002236 struct hci_conn *conn;
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002237 bool mgmt_connected;
Andre Guedes38462202013-11-07 17:36:10 -03002238 u8 type;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002239
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002240 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002241
Linus Torvalds1da177e2005-04-16 15:20:36 -07002242 hci_dev_lock(hdev);
2243
Marcel Holtmann04837f62006-07-03 10:02:33 +02002244 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergf7520542011-01-20 12:34:39 +02002245 if (!conn)
2246 goto unlock;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02002247
Andre Guedesabf54a52013-11-07 17:36:09 -03002248 if (ev->status) {
2249 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
2250 conn->dst_type, ev->status);
2251 goto unlock;
Johan Hedberg37d9ef72011-11-10 15:54:39 +02002252 }
Johan Hedbergf7520542011-01-20 12:34:39 +02002253
Andre Guedes38462202013-11-07 17:36:10 -03002254 conn->state = BT_CLOSED;
2255
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002256 mgmt_connected = test_and_clear_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags);
2257 mgmt_device_disconnected(hdev, &conn->dst, conn->type, conn->dst_type,
2258 reason, mgmt_connected);
Andre Guedesabf54a52013-11-07 17:36:09 -03002259
Johan Hedbergaf6a9c32014-06-24 13:15:53 +03002260 if (conn->type == ACL_LINK &&
2261 test_bit(HCI_CONN_FLUSH_KEY, &conn->flags))
Andre Guedes38462202013-11-07 17:36:10 -03002262 hci_remove_link_key(hdev, &conn->dst);
Johan Hedberg22102462013-10-05 12:01:06 +02002263
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002264 params = hci_conn_params_lookup(hdev, &conn->dst, conn->dst_type);
2265 if (params) {
2266 switch (params->auto_connect) {
2267 case HCI_AUTO_CONN_LINK_LOSS:
2268 if (ev->reason != HCI_ERROR_CONNECTION_TIMEOUT)
2269 break;
2270 /* Fall through */
2271
2272 case HCI_AUTO_CONN_ALWAYS:
Johan Hedberg418025d2014-07-04 12:37:24 +03002273 list_del_init(&params->action);
2274 list_add(&params->action, &hdev->pend_le_conns);
2275 hci_update_background_scan(hdev);
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002276 break;
2277
2278 default:
2279 break;
2280 }
2281 }
2282
Andre Guedes38462202013-11-07 17:36:10 -03002283 type = conn->type;
Johan Hedberg22102462013-10-05 12:01:06 +02002284
Andre Guedes38462202013-11-07 17:36:10 -03002285 hci_proto_disconn_cfm(conn, ev->reason);
2286 hci_conn_del(conn);
2287
2288 /* Re-enable advertising if necessary, since it might
2289 * have been disabled by the connection. From the
2290 * HCI_LE_Set_Advertise_Enable command description in
2291 * the core specification (v4.0):
2292 * "The Controller shall continue advertising until the Host
2293 * issues an LE_Set_Advertise_Enable command with
2294 * Advertising_Enable set to 0x00 (Advertising is disabled)
2295 * or until a connection is created or until the Advertising
2296 * is timed out due to Directed Advertising."
2297 */
2298 if (type == LE_LINK)
2299 mgmt_reenable_advertising(hdev);
Johan Hedbergf7520542011-01-20 12:34:39 +02002300
2301unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002302 hci_dev_unlock(hdev);
2303}
2304
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002305static void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002306{
2307 struct hci_ev_auth_complete *ev = (void *) skb->data;
2308 struct hci_conn *conn;
2309
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002310 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002311
2312 hci_dev_lock(hdev);
2313
2314 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002315 if (!conn)
2316 goto unlock;
2317
2318 if (!ev->status) {
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002319 if (!hci_conn_ssp_enabled(conn) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03002320 test_bit(HCI_CONN_REAUTH_PEND, &conn->flags)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002321 BT_INFO("re-auth of legacy device is not possible.");
Johan Hedberg2a611692011-02-19 12:06:00 -03002322 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002323 set_bit(HCI_CONN_AUTH, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002324 conn->sec_level = conn->pending_sec_level;
Johan Hedberg2a611692011-02-19 12:06:00 -03002325 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002326 } else {
Johan Hedbergbab73cb2012-02-09 16:07:29 +02002327 mgmt_auth_failed(hdev, &conn->dst, conn->type, conn->dst_type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002328 ev->status);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002329 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002330
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002331 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
2332 clear_bit(HCI_CONN_REAUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002333
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002334 if (conn->state == BT_CONFIG) {
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002335 if (!ev->status && hci_conn_ssp_enabled(conn)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002336 struct hci_cp_set_conn_encrypt cp;
2337 cp.handle = ev->handle;
2338 cp.encrypt = 0x01;
2339 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002340 &cp);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002341 } else {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002342 conn->state = BT_CONNECTED;
2343 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002344 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002345 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002346 } else {
2347 hci_auth_cfm(conn, ev->status);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002348
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002349 hci_conn_hold(conn);
2350 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02002351 hci_conn_drop(conn);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002352 }
2353
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002354 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002355 if (!ev->status) {
2356 struct hci_cp_set_conn_encrypt cp;
2357 cp.handle = ev->handle;
2358 cp.encrypt = 0x01;
2359 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002360 &cp);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002361 } else {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002362 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002363 hci_encrypt_cfm(conn, ev->status, 0x00);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002364 }
2365 }
2366
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002367unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002368 hci_dev_unlock(hdev);
2369}
2370
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002371static void hci_remote_name_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002372{
Johan Hedberg127178d2010-11-18 22:22:29 +02002373 struct hci_ev_remote_name *ev = (void *) skb->data;
2374 struct hci_conn *conn;
2375
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002376 BT_DBG("%s", hdev->name);
2377
2378 hci_conn_check_pending(hdev);
Johan Hedberg127178d2010-11-18 22:22:29 +02002379
2380 hci_dev_lock(hdev);
2381
2382 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002383
2384 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
2385 goto check_auth;
2386
2387 if (ev->status == 0)
2388 hci_check_pending_name(hdev, conn, &ev->bdaddr, ev->name,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002389 strnlen(ev->name, HCI_MAX_NAME_LENGTH));
Johan Hedbergb644ba32012-01-17 21:48:47 +02002390 else
2391 hci_check_pending_name(hdev, conn, &ev->bdaddr, NULL, 0);
2392
2393check_auth:
Johan Hedberg79c6c702011-04-28 11:28:55 -07002394 if (!conn)
2395 goto unlock;
2396
2397 if (!hci_outgoing_auth_needed(hdev, conn))
2398 goto unlock;
2399
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002400 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002401 struct hci_cp_auth_requested cp;
2402 cp.handle = __cpu_to_le16(conn->handle);
2403 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED, sizeof(cp), &cp);
2404 }
2405
Johan Hedberg79c6c702011-04-28 11:28:55 -07002406unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02002407 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002408}
2409
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002410static void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002411{
2412 struct hci_ev_encrypt_change *ev = (void *) skb->data;
2413 struct hci_conn *conn;
2414
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002415 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002416
2417 hci_dev_lock(hdev);
2418
2419 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002420 if (!conn)
2421 goto unlock;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002422
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002423 if (!ev->status) {
2424 if (ev->encrypt) {
2425 /* Encryption implies authentication */
Johan Hedberg4dae2792014-06-24 17:03:50 +03002426 set_bit(HCI_CONN_AUTH, &conn->flags);
2427 set_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002428 conn->sec_level = conn->pending_sec_level;
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002429
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002430 /* P-256 authentication key implies FIPS */
2431 if (conn->key_type == HCI_LK_AUTH_COMBINATION_P256)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002432 set_bit(HCI_CONN_FIPS, &conn->flags);
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002433
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002434 if ((conn->type == ACL_LINK && ev->encrypt == 0x02) ||
2435 conn->type == LE_LINK)
2436 set_bit(HCI_CONN_AES_CCM, &conn->flags);
2437 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002438 clear_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002439 clear_bit(HCI_CONN_AES_CCM, &conn->flags);
2440 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002441 }
2442
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002443 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
2444
2445 if (ev->status && conn->state == BT_CONNECTED) {
2446 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
2447 hci_conn_drop(conn);
2448 goto unlock;
2449 }
2450
2451 if (conn->state == BT_CONFIG) {
2452 if (!ev->status)
2453 conn->state = BT_CONNECTED;
2454
Marcel Holtmann40b552a2014-03-19 14:10:25 -07002455 /* In Secure Connections Only mode, do not allow any
2456 * connections that are not encrypted with AES-CCM
2457 * using a P-256 authenticated combination key.
2458 */
2459 if (test_bit(HCI_SC_ONLY, &hdev->dev_flags) &&
2460 (!test_bit(HCI_CONN_AES_CCM, &conn->flags) ||
2461 conn->key_type != HCI_LK_AUTH_COMBINATION_P256)) {
2462 hci_proto_connect_cfm(conn, HCI_ERROR_AUTH_FAILURE);
2463 hci_conn_drop(conn);
2464 goto unlock;
2465 }
2466
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002467 hci_proto_connect_cfm(conn, ev->status);
2468 hci_conn_drop(conn);
2469 } else
2470 hci_encrypt_cfm(conn, ev->status, ev->encrypt);
2471
Gustavo Padovana7d77232012-05-13 03:20:07 -03002472unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002473 hci_dev_unlock(hdev);
2474}
2475
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002476static void hci_change_link_key_complete_evt(struct hci_dev *hdev,
2477 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002478{
2479 struct hci_ev_change_link_key_complete *ev = (void *) skb->data;
2480 struct hci_conn *conn;
2481
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002482 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002483
2484 hci_dev_lock(hdev);
2485
2486 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
2487 if (conn) {
2488 if (!ev->status)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002489 set_bit(HCI_CONN_SECURE, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002490
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002491 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002492
2493 hci_key_change_cfm(conn, ev->status);
2494 }
2495
2496 hci_dev_unlock(hdev);
2497}
2498
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002499static void hci_remote_features_evt(struct hci_dev *hdev,
2500 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002501{
2502 struct hci_ev_remote_features *ev = (void *) skb->data;
2503 struct hci_conn *conn;
2504
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002505 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002506
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002507 hci_dev_lock(hdev);
2508
2509 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02002510 if (!conn)
2511 goto unlock;
Marcel Holtmann769be972008-07-14 20:13:49 +02002512
Johan Hedbergccd556f2010-11-10 17:11:51 +02002513 if (!ev->status)
Johan Hedbergcad718e2013-04-17 15:00:51 +03002514 memcpy(conn->features[0], ev->features, 8);
Johan Hedbergccd556f2010-11-10 17:11:51 +02002515
2516 if (conn->state != BT_CONFIG)
2517 goto unlock;
2518
2519 if (!ev->status && lmp_ssp_capable(hdev) && lmp_ssp_capable(conn)) {
2520 struct hci_cp_read_remote_ext_features cp;
2521 cp.handle = ev->handle;
2522 cp.page = 0x01;
2523 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002524 sizeof(cp), &cp);
Johan Hedberg392599b2010-11-18 22:22:28 +02002525 goto unlock;
2526 }
2527
Johan Hedberg671267b2012-05-12 16:11:50 -03002528 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002529 struct hci_cp_remote_name_req cp;
2530 memset(&cp, 0, sizeof(cp));
2531 bacpy(&cp.bdaddr, &conn->dst);
2532 cp.pscan_rep_mode = 0x02;
2533 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002534 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
2535 mgmt_device_connected(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002536 conn->dst_type, 0, NULL, 0,
2537 conn->dev_class);
Johan Hedberg392599b2010-11-18 22:22:28 +02002538
Johan Hedberg127178d2010-11-18 22:22:29 +02002539 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02002540 conn->state = BT_CONNECTED;
2541 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002542 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02002543 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002544
Johan Hedbergccd556f2010-11-10 17:11:51 +02002545unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002546 hci_dev_unlock(hdev);
2547}
2548
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002549static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002550{
2551 struct hci_ev_cmd_complete *ev = (void *) skb->data;
Johan Hedberg9238f362013-03-05 20:37:48 +02002552 u8 status = skb->data[sizeof(*ev)];
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002553 __u16 opcode;
2554
2555 skb_pull(skb, sizeof(*ev));
2556
2557 opcode = __le16_to_cpu(ev->opcode);
2558
2559 switch (opcode) {
2560 case HCI_OP_INQUIRY_CANCEL:
2561 hci_cc_inquiry_cancel(hdev, skb);
2562 break;
2563
Andre Guedes4d934832012-03-21 00:03:35 -03002564 case HCI_OP_PERIODIC_INQ:
2565 hci_cc_periodic_inq(hdev, skb);
2566 break;
2567
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002568 case HCI_OP_EXIT_PERIODIC_INQ:
2569 hci_cc_exit_periodic_inq(hdev, skb);
2570 break;
2571
2572 case HCI_OP_REMOTE_NAME_REQ_CANCEL:
2573 hci_cc_remote_name_req_cancel(hdev, skb);
2574 break;
2575
2576 case HCI_OP_ROLE_DISCOVERY:
2577 hci_cc_role_discovery(hdev, skb);
2578 break;
2579
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002580 case HCI_OP_READ_LINK_POLICY:
2581 hci_cc_read_link_policy(hdev, skb);
2582 break;
2583
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002584 case HCI_OP_WRITE_LINK_POLICY:
2585 hci_cc_write_link_policy(hdev, skb);
2586 break;
2587
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002588 case HCI_OP_READ_DEF_LINK_POLICY:
2589 hci_cc_read_def_link_policy(hdev, skb);
2590 break;
2591
2592 case HCI_OP_WRITE_DEF_LINK_POLICY:
2593 hci_cc_write_def_link_policy(hdev, skb);
2594 break;
2595
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002596 case HCI_OP_RESET:
2597 hci_cc_reset(hdev, skb);
2598 break;
2599
2600 case HCI_OP_WRITE_LOCAL_NAME:
2601 hci_cc_write_local_name(hdev, skb);
2602 break;
2603
2604 case HCI_OP_READ_LOCAL_NAME:
2605 hci_cc_read_local_name(hdev, skb);
2606 break;
2607
2608 case HCI_OP_WRITE_AUTH_ENABLE:
2609 hci_cc_write_auth_enable(hdev, skb);
2610 break;
2611
2612 case HCI_OP_WRITE_ENCRYPT_MODE:
2613 hci_cc_write_encrypt_mode(hdev, skb);
2614 break;
2615
2616 case HCI_OP_WRITE_SCAN_ENABLE:
2617 hci_cc_write_scan_enable(hdev, skb);
2618 break;
2619
2620 case HCI_OP_READ_CLASS_OF_DEV:
2621 hci_cc_read_class_of_dev(hdev, skb);
2622 break;
2623
2624 case HCI_OP_WRITE_CLASS_OF_DEV:
2625 hci_cc_write_class_of_dev(hdev, skb);
2626 break;
2627
2628 case HCI_OP_READ_VOICE_SETTING:
2629 hci_cc_read_voice_setting(hdev, skb);
2630 break;
2631
2632 case HCI_OP_WRITE_VOICE_SETTING:
2633 hci_cc_write_voice_setting(hdev, skb);
2634 break;
2635
Marcel Holtmannb4cb9fb2013-10-14 13:56:16 -07002636 case HCI_OP_READ_NUM_SUPPORTED_IAC:
2637 hci_cc_read_num_supported_iac(hdev, skb);
2638 break;
2639
Marcel Holtmann333140b2008-07-14 20:13:48 +02002640 case HCI_OP_WRITE_SSP_MODE:
2641 hci_cc_write_ssp_mode(hdev, skb);
2642 break;
2643
Marcel Holtmanneac83dc2014-01-10 02:07:23 -08002644 case HCI_OP_WRITE_SC_SUPPORT:
2645 hci_cc_write_sc_support(hdev, skb);
2646 break;
2647
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002648 case HCI_OP_READ_LOCAL_VERSION:
2649 hci_cc_read_local_version(hdev, skb);
2650 break;
2651
2652 case HCI_OP_READ_LOCAL_COMMANDS:
2653 hci_cc_read_local_commands(hdev, skb);
2654 break;
2655
2656 case HCI_OP_READ_LOCAL_FEATURES:
2657 hci_cc_read_local_features(hdev, skb);
2658 break;
2659
Andre Guedes971e3a42011-06-30 19:20:52 -03002660 case HCI_OP_READ_LOCAL_EXT_FEATURES:
2661 hci_cc_read_local_ext_features(hdev, skb);
2662 break;
2663
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002664 case HCI_OP_READ_BUFFER_SIZE:
2665 hci_cc_read_buffer_size(hdev, skb);
2666 break;
2667
2668 case HCI_OP_READ_BD_ADDR:
2669 hci_cc_read_bd_addr(hdev, skb);
2670 break;
2671
Johan Hedbergf332ec62013-03-15 17:07:11 -05002672 case HCI_OP_READ_PAGE_SCAN_ACTIVITY:
2673 hci_cc_read_page_scan_activity(hdev, skb);
2674 break;
2675
Johan Hedberg4a3ee762013-03-15 17:07:12 -05002676 case HCI_OP_WRITE_PAGE_SCAN_ACTIVITY:
2677 hci_cc_write_page_scan_activity(hdev, skb);
2678 break;
2679
Johan Hedbergf332ec62013-03-15 17:07:11 -05002680 case HCI_OP_READ_PAGE_SCAN_TYPE:
2681 hci_cc_read_page_scan_type(hdev, skb);
2682 break;
2683
Johan Hedberg4a3ee762013-03-15 17:07:12 -05002684 case HCI_OP_WRITE_PAGE_SCAN_TYPE:
2685 hci_cc_write_page_scan_type(hdev, skb);
2686 break;
2687
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +02002688 case HCI_OP_READ_DATA_BLOCK_SIZE:
2689 hci_cc_read_data_block_size(hdev, skb);
2690 break;
2691
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +02002692 case HCI_OP_READ_FLOW_CONTROL_MODE:
2693 hci_cc_read_flow_control_mode(hdev, skb);
2694 break;
2695
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +03002696 case HCI_OP_READ_LOCAL_AMP_INFO:
2697 hci_cc_read_local_amp_info(hdev, skb);
2698 break;
2699
Johan Hedberg33f35722014-06-28 17:54:06 +03002700 case HCI_OP_READ_CLOCK:
2701 hci_cc_read_clock(hdev, skb);
2702 break;
2703
Andrei Emeltchenko903e4542012-09-27 17:26:09 +03002704 case HCI_OP_READ_LOCAL_AMP_ASSOC:
2705 hci_cc_read_local_amp_assoc(hdev, skb);
2706 break;
2707
Johan Hedbergd5859e22011-01-25 01:19:58 +02002708 case HCI_OP_READ_INQ_RSP_TX_POWER:
2709 hci_cc_read_inq_rsp_tx_power(hdev, skb);
2710 break;
2711
Johan Hedberg980e1a52011-01-22 06:10:07 +02002712 case HCI_OP_PIN_CODE_REPLY:
2713 hci_cc_pin_code_reply(hdev, skb);
2714 break;
2715
2716 case HCI_OP_PIN_CODE_NEG_REPLY:
2717 hci_cc_pin_code_neg_reply(hdev, skb);
2718 break;
2719
Szymon Jancc35938b2011-03-22 13:12:21 +01002720 case HCI_OP_READ_LOCAL_OOB_DATA:
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08002721 hci_cc_read_local_oob_data(hdev, skb);
2722 break;
2723
2724 case HCI_OP_READ_LOCAL_OOB_EXT_DATA:
2725 hci_cc_read_local_oob_ext_data(hdev, skb);
Szymon Jancc35938b2011-03-22 13:12:21 +01002726 break;
2727
Ville Tervo6ed58ec2011-02-10 22:38:48 -03002728 case HCI_OP_LE_READ_BUFFER_SIZE:
2729 hci_cc_le_read_buffer_size(hdev, skb);
2730 break;
2731
Johan Hedberg60e77322013-01-22 14:01:59 +02002732 case HCI_OP_LE_READ_LOCAL_FEATURES:
2733 hci_cc_le_read_local_features(hdev, skb);
2734 break;
2735
Johan Hedberg8fa19092012-10-19 20:57:49 +03002736 case HCI_OP_LE_READ_ADV_TX_POWER:
2737 hci_cc_le_read_adv_tx_power(hdev, skb);
2738 break;
2739
Johan Hedberga5c29682011-02-19 12:05:57 -03002740 case HCI_OP_USER_CONFIRM_REPLY:
2741 hci_cc_user_confirm_reply(hdev, skb);
2742 break;
2743
2744 case HCI_OP_USER_CONFIRM_NEG_REPLY:
2745 hci_cc_user_confirm_neg_reply(hdev, skb);
2746 break;
2747
Brian Gix1143d452011-11-23 08:28:34 -08002748 case HCI_OP_USER_PASSKEY_REPLY:
2749 hci_cc_user_passkey_reply(hdev, skb);
2750 break;
2751
2752 case HCI_OP_USER_PASSKEY_NEG_REPLY:
2753 hci_cc_user_passkey_neg_reply(hdev, skb);
Szymon Janc16cde992012-04-13 12:32:42 +02002754 break;
Andre Guedes07f7fa52011-12-02 21:13:31 +09002755
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08002756 case HCI_OP_LE_SET_RANDOM_ADDR:
2757 hci_cc_le_set_random_addr(hdev, skb);
2758 break;
2759
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01002760 case HCI_OP_LE_SET_ADV_ENABLE:
2761 hci_cc_le_set_adv_enable(hdev, skb);
2762 break;
2763
Marcel Holtmann533553f2014-03-21 12:18:10 -07002764 case HCI_OP_LE_SET_SCAN_PARAM:
2765 hci_cc_le_set_scan_param(hdev, skb);
2766 break;
2767
Andre Guedeseb9d91f2011-05-26 16:23:52 -03002768 case HCI_OP_LE_SET_SCAN_ENABLE:
2769 hci_cc_le_set_scan_enable(hdev, skb);
2770 break;
2771
Johan Hedbergcf1d0812013-01-22 14:02:00 +02002772 case HCI_OP_LE_READ_WHITE_LIST_SIZE:
2773 hci_cc_le_read_white_list_size(hdev, skb);
2774 break;
2775
Marcel Holtmann0f36b582014-02-27 20:37:31 -08002776 case HCI_OP_LE_CLEAR_WHITE_LIST:
2777 hci_cc_le_clear_white_list(hdev, skb);
2778 break;
2779
2780 case HCI_OP_LE_ADD_TO_WHITE_LIST:
2781 hci_cc_le_add_to_white_list(hdev, skb);
2782 break;
2783
2784 case HCI_OP_LE_DEL_FROM_WHITE_LIST:
2785 hci_cc_le_del_from_white_list(hdev, skb);
2786 break;
2787
Johan Hedberg9b008c02013-01-22 14:02:01 +02002788 case HCI_OP_LE_READ_SUPPORTED_STATES:
2789 hci_cc_le_read_supported_states(hdev, skb);
2790 break;
2791
Andre Guedesf9b49302011-06-30 19:20:53 -03002792 case HCI_OP_WRITE_LE_HOST_SUPPORTED:
2793 hci_cc_write_le_host_supported(hdev, skb);
2794 break;
2795
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02002796 case HCI_OP_LE_SET_ADV_PARAM:
2797 hci_cc_set_adv_param(hdev, skb);
2798 break;
2799
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03002800 case HCI_OP_WRITE_REMOTE_AMP_ASSOC:
2801 hci_cc_write_remote_amp_assoc(hdev, skb);
2802 break;
2803
Andrzej Kaczmarek5ae76a92014-05-08 15:32:08 +02002804 case HCI_OP_READ_RSSI:
2805 hci_cc_read_rssi(hdev, skb);
2806 break;
2807
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02002808 case HCI_OP_READ_TX_POWER:
2809 hci_cc_read_tx_power(hdev, skb);
2810 break;
2811
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002812 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002813 BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002814 break;
2815 }
2816
Johan Hedbergad82cdd2013-03-09 09:53:50 +02002817 if (opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02002818 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02002819
Johan Hedbergad82cdd2013-03-09 09:53:50 +02002820 hci_req_cmd_complete(hdev, opcode, status);
Johan Hedberg9238f362013-03-05 20:37:48 +02002821
Szymon Jancdbccd792012-12-11 08:51:19 +01002822 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags)) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002823 atomic_set(&hdev->cmd_cnt, 1);
2824 if (!skb_queue_empty(&hdev->cmd_q))
Gustavo F. Padovanc347b762011-12-14 23:53:47 -02002825 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002826 }
2827}
2828
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002829static void hci_cmd_status_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002830{
2831 struct hci_ev_cmd_status *ev = (void *) skb->data;
2832 __u16 opcode;
2833
2834 skb_pull(skb, sizeof(*ev));
2835
2836 opcode = __le16_to_cpu(ev->opcode);
2837
2838 switch (opcode) {
2839 case HCI_OP_INQUIRY:
2840 hci_cs_inquiry(hdev, ev->status);
2841 break;
2842
2843 case HCI_OP_CREATE_CONN:
2844 hci_cs_create_conn(hdev, ev->status);
2845 break;
2846
2847 case HCI_OP_ADD_SCO:
2848 hci_cs_add_sco(hdev, ev->status);
2849 break;
2850
Marcel Holtmannf8558552008-07-14 20:13:49 +02002851 case HCI_OP_AUTH_REQUESTED:
2852 hci_cs_auth_requested(hdev, ev->status);
2853 break;
2854
2855 case HCI_OP_SET_CONN_ENCRYPT:
2856 hci_cs_set_conn_encrypt(hdev, ev->status);
2857 break;
2858
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002859 case HCI_OP_REMOTE_NAME_REQ:
2860 hci_cs_remote_name_req(hdev, ev->status);
2861 break;
2862
Marcel Holtmann769be972008-07-14 20:13:49 +02002863 case HCI_OP_READ_REMOTE_FEATURES:
2864 hci_cs_read_remote_features(hdev, ev->status);
2865 break;
2866
2867 case HCI_OP_READ_REMOTE_EXT_FEATURES:
2868 hci_cs_read_remote_ext_features(hdev, ev->status);
2869 break;
2870
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002871 case HCI_OP_SETUP_SYNC_CONN:
2872 hci_cs_setup_sync_conn(hdev, ev->status);
2873 break;
2874
2875 case HCI_OP_SNIFF_MODE:
2876 hci_cs_sniff_mode(hdev, ev->status);
2877 break;
2878
2879 case HCI_OP_EXIT_SNIFF_MODE:
2880 hci_cs_exit_sniff_mode(hdev, ev->status);
2881 break;
2882
Johan Hedberg8962ee72011-01-20 12:40:27 +02002883 case HCI_OP_DISCONNECT:
Johan Hedberg88c3df12012-02-09 14:27:38 +02002884 hci_cs_disconnect(hdev, ev->status);
Johan Hedberg8962ee72011-01-20 12:40:27 +02002885 break;
2886
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03002887 case HCI_OP_CREATE_PHY_LINK:
2888 hci_cs_create_phylink(hdev, ev->status);
2889 break;
2890
Andrei Emeltchenko0b26ab92012-09-27 17:26:24 +03002891 case HCI_OP_ACCEPT_PHY_LINK:
2892 hci_cs_accept_phylink(hdev, ev->status);
2893 break;
2894
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02002895 case HCI_OP_LE_CREATE_CONN:
2896 hci_cs_le_create_conn(hdev, ev->status);
2897 break;
2898
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02002899 case HCI_OP_LE_START_ENC:
2900 hci_cs_le_start_enc(hdev, ev->status);
2901 break;
2902
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002903 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002904 BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002905 break;
2906 }
2907
Johan Hedbergad82cdd2013-03-09 09:53:50 +02002908 if (opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02002909 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02002910
Johan Hedberg02350a72013-04-03 21:50:29 +03002911 if (ev->status ||
2912 (hdev->sent_cmd && !bt_cb(hdev->sent_cmd)->req.event))
2913 hci_req_cmd_complete(hdev, opcode, ev->status);
Johan Hedberg9238f362013-03-05 20:37:48 +02002914
Gustavo F. Padovan10572132011-03-16 15:36:29 -03002915 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags)) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002916 atomic_set(&hdev->cmd_cnt, 1);
2917 if (!skb_queue_empty(&hdev->cmd_q))
Gustavo F. Padovanc347b762011-12-14 23:53:47 -02002918 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002919 }
2920}
2921
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002922static void hci_role_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002923{
2924 struct hci_ev_role_change *ev = (void *) skb->data;
2925 struct hci_conn *conn;
2926
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002927 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002928
2929 hci_dev_lock(hdev);
2930
2931 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
2932 if (conn) {
2933 if (!ev->status) {
2934 if (ev->role)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002935 clear_bit(HCI_CONN_MASTER, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002936 else
Johan Hedberg4dae2792014-06-24 17:03:50 +03002937 set_bit(HCI_CONN_MASTER, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002938 }
2939
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002940 clear_bit(HCI_CONN_RSWITCH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002941
2942 hci_role_switch_cfm(conn, ev->status, ev->role);
2943 }
2944
2945 hci_dev_unlock(hdev);
2946}
2947
Gustavo Padovan6039aa72012-05-23 04:04:18 -03002948static void hci_num_comp_pkts_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002949{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002950 struct hci_ev_num_comp_pkts *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002951 int i;
2952
Andrei Emeltchenko32ac5b92011-12-19 16:31:29 +02002953 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_PACKET_BASED) {
2954 BT_ERR("Wrong event for mode %d", hdev->flow_ctl_mode);
2955 return;
2956 }
2957
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02002958 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03002959 ev->num_hndl * sizeof(struct hci_comp_pkts_info)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002960 BT_DBG("%s bad parameters", hdev->name);
2961 return;
2962 }
2963
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02002964 BT_DBG("%s num_hndl %d", hdev->name, ev->num_hndl);
2965
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02002966 for (i = 0; i < ev->num_hndl; i++) {
2967 struct hci_comp_pkts_info *info = &ev->handles[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07002968 struct hci_conn *conn;
2969 __u16 handle, count;
2970
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02002971 handle = __le16_to_cpu(info->handle);
2972 count = __le16_to_cpu(info->count);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002973
2974 conn = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02002975 if (!conn)
2976 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002977
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02002978 conn->sent -= count;
2979
2980 switch (conn->type) {
2981 case ACL_LINK:
2982 hdev->acl_cnt += count;
2983 if (hdev->acl_cnt > hdev->acl_pkts)
2984 hdev->acl_cnt = hdev->acl_pkts;
2985 break;
2986
2987 case LE_LINK:
2988 if (hdev->le_pkts) {
2989 hdev->le_cnt += count;
2990 if (hdev->le_cnt > hdev->le_pkts)
2991 hdev->le_cnt = hdev->le_pkts;
2992 } else {
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02002993 hdev->acl_cnt += count;
2994 if (hdev->acl_cnt > hdev->acl_pkts)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002995 hdev->acl_cnt = hdev->acl_pkts;
2996 }
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02002997 break;
2998
2999 case SCO_LINK:
3000 hdev->sco_cnt += count;
3001 if (hdev->sco_cnt > hdev->sco_pkts)
3002 hdev->sco_cnt = hdev->sco_pkts;
3003 break;
3004
3005 default:
3006 BT_ERR("Unknown type %d conn %p", conn->type, conn);
3007 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003008 }
3009 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003010
Gustavo F. Padovan3eff45e2011-12-15 00:50:02 -02003011 queue_work(hdev->workqueue, &hdev->tx_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003012}
3013
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003014static struct hci_conn *__hci_conn_lookup_handle(struct hci_dev *hdev,
3015 __u16 handle)
3016{
3017 struct hci_chan *chan;
3018
3019 switch (hdev->dev_type) {
3020 case HCI_BREDR:
3021 return hci_conn_hash_lookup_handle(hdev, handle);
3022 case HCI_AMP:
3023 chan = hci_chan_lookup_handle(hdev, handle);
3024 if (chan)
3025 return chan->conn;
3026 break;
3027 default:
3028 BT_ERR("%s unknown dev_type %d", hdev->name, hdev->dev_type);
3029 break;
3030 }
3031
3032 return NULL;
3033}
3034
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003035static void hci_num_comp_blocks_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003036{
3037 struct hci_ev_num_comp_blocks *ev = (void *) skb->data;
3038 int i;
3039
3040 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_BLOCK_BASED) {
3041 BT_ERR("Wrong event for mode %d", hdev->flow_ctl_mode);
3042 return;
3043 }
3044
3045 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03003046 ev->num_hndl * sizeof(struct hci_comp_blocks_info)) {
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003047 BT_DBG("%s bad parameters", hdev->name);
3048 return;
3049 }
3050
3051 BT_DBG("%s num_blocks %d num_hndl %d", hdev->name, ev->num_blocks,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003052 ev->num_hndl);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003053
3054 for (i = 0; i < ev->num_hndl; i++) {
3055 struct hci_comp_blocks_info *info = &ev->handles[i];
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003056 struct hci_conn *conn = NULL;
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003057 __u16 handle, block_count;
3058
3059 handle = __le16_to_cpu(info->handle);
3060 block_count = __le16_to_cpu(info->blocks);
3061
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003062 conn = __hci_conn_lookup_handle(hdev, handle);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003063 if (!conn)
3064 continue;
3065
3066 conn->sent -= block_count;
3067
3068 switch (conn->type) {
3069 case ACL_LINK:
Andrei Emeltchenkobd1eb662012-10-10 17:38:30 +03003070 case AMP_LINK:
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003071 hdev->block_cnt += block_count;
3072 if (hdev->block_cnt > hdev->num_blocks)
3073 hdev->block_cnt = hdev->num_blocks;
3074 break;
3075
3076 default:
3077 BT_ERR("Unknown type %d conn %p", conn->type, conn);
3078 break;
3079 }
3080 }
3081
3082 queue_work(hdev->workqueue, &hdev->tx_work);
3083}
3084
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003085static void hci_mode_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003086{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003087 struct hci_ev_mode_change *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003088 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003089
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003090 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003091
3092 hci_dev_lock(hdev);
3093
Marcel Holtmann04837f62006-07-03 10:02:33 +02003094 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3095 if (conn) {
3096 conn->mode = ev->mode;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003097
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003098 if (!test_and_clear_bit(HCI_CONN_MODE_CHANGE_PEND,
3099 &conn->flags)) {
Marcel Holtmann04837f62006-07-03 10:02:33 +02003100 if (conn->mode == HCI_CM_ACTIVE)
Johan Hedberg58a681e2012-01-16 06:47:28 +02003101 set_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003102 else
Johan Hedberg58a681e2012-01-16 06:47:28 +02003103 clear_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003104 }
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003105
Johan Hedberg51a8efd2012-01-16 06:10:31 +02003106 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003107 hci_sco_setup(conn, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003108 }
3109
3110 hci_dev_unlock(hdev);
3111}
3112
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003113static void hci_pin_code_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003114{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003115 struct hci_ev_pin_code_req *ev = (void *) skb->data;
3116 struct hci_conn *conn;
3117
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003118 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003119
3120 hci_dev_lock(hdev);
3121
3122 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003123 if (!conn)
3124 goto unlock;
3125
3126 if (conn->state == BT_CONNECTED) {
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003127 hci_conn_hold(conn);
3128 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003129 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003130 }
3131
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003132 if (!test_bit(HCI_PAIRABLE, &hdev->dev_flags))
Johan Hedberg03b555e2011-01-04 15:40:05 +02003133 hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003134 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003135 else if (test_bit(HCI_MGMT, &hdev->dev_flags)) {
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003136 u8 secure;
3137
3138 if (conn->pending_sec_level == BT_SECURITY_HIGH)
3139 secure = 1;
3140 else
3141 secure = 0;
3142
Johan Hedberg744cf192011-11-08 20:40:14 +02003143 mgmt_pin_code_request(hdev, &ev->bdaddr, secure);
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003144 }
Johan Hedberg980e1a52011-01-22 06:10:07 +02003145
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003146unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003147 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003148}
3149
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003150static void hci_link_key_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003151{
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003152 struct hci_ev_link_key_req *ev = (void *) skb->data;
3153 struct hci_cp_link_key_reply cp;
3154 struct hci_conn *conn;
3155 struct link_key *key;
3156
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003157 BT_DBG("%s", hdev->name);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003158
Andrei Emeltchenko034cbea2013-05-14 11:44:16 +03003159 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003160 return;
3161
3162 hci_dev_lock(hdev);
3163
3164 key = hci_find_link_key(hdev, &ev->bdaddr);
3165 if (!key) {
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003166 BT_DBG("%s link key not found for %pMR", hdev->name,
3167 &ev->bdaddr);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003168 goto not_found;
3169 }
3170
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003171 BT_DBG("%s found key type %u for %pMR", hdev->name, key->type,
3172 &ev->bdaddr);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003173
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003174 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003175 if (conn) {
Marcel Holtmann66138ce2014-01-10 02:07:20 -08003176 if ((key->type == HCI_LK_UNAUTH_COMBINATION_P192 ||
3177 key->type == HCI_LK_UNAUTH_COMBINATION_P256) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03003178 conn->auth_type != 0xff && (conn->auth_type & 0x01)) {
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003179 BT_DBG("%s ignoring unauthenticated key", hdev->name);
3180 goto not_found;
3181 }
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003182
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003183 if (key->type == HCI_LK_COMBINATION && key->pin_len < 16 &&
Johan Hedbergf3fb0b52014-06-02 10:12:44 +03003184 (conn->pending_sec_level == BT_SECURITY_HIGH ||
3185 conn->pending_sec_level == BT_SECURITY_FIPS)) {
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003186 BT_DBG("%s ignoring key unauthenticated for high security",
3187 hdev->name);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003188 goto not_found;
3189 }
3190
3191 conn->key_type = key->type;
3192 conn->pin_length = key->pin_len;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003193 }
3194
3195 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9b3b4462012-05-23 11:31:20 +03003196 memcpy(cp.link_key, key->val, HCI_LINK_KEY_SIZE);
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003197
3198 hci_send_cmd(hdev, HCI_OP_LINK_KEY_REPLY, sizeof(cp), &cp);
3199
3200 hci_dev_unlock(hdev);
3201
3202 return;
3203
3204not_found:
3205 hci_send_cmd(hdev, HCI_OP_LINK_KEY_NEG_REPLY, 6, &ev->bdaddr);
3206 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003207}
3208
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003209static void hci_link_key_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003210{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003211 struct hci_ev_link_key_notify *ev = (void *) skb->data;
3212 struct hci_conn *conn;
Johan Hedberg7652ff62014-06-24 13:15:49 +03003213 struct link_key *key;
3214 bool persistent;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003215 u8 pin_len = 0;
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003216
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003217 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003218
3219 hci_dev_lock(hdev);
3220
3221 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3222 if (conn) {
3223 hci_conn_hold(conn);
3224 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
Johan Hedberg980e1a52011-01-22 06:10:07 +02003225 pin_len = conn->pin_length;
Waldemar Rymarkiewicz13d39312011-04-28 12:07:55 +02003226
3227 if (ev->key_type != HCI_LK_CHANGED_COMBINATION)
3228 conn->key_type = ev->key_type;
3229
David Herrmann76a68ba2013-04-06 20:28:37 +02003230 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003231 }
3232
Johan Hedberg7652ff62014-06-24 13:15:49 +03003233 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
3234 goto unlock;
Johan Hedberg55ed8ca12011-01-17 14:41:05 +02003235
Johan Hedberg7652ff62014-06-24 13:15:49 +03003236 key = hci_add_link_key(hdev, conn, &ev->bdaddr, ev->link_key,
3237 ev->key_type, pin_len, &persistent);
3238 if (!key)
3239 goto unlock;
3240
3241 mgmt_new_link_key(hdev, key, persistent);
3242
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003243 /* Keep debug keys around only if the HCI_KEEP_DEBUG_KEYS flag
3244 * is set. If it's not set simply remove the key from the kernel
3245 * list (we've still notified user space about it but with
3246 * store_hint being 0).
3247 */
3248 if (key->type == HCI_LK_DEBUG_COMBINATION &&
3249 !test_bit(HCI_KEEP_DEBUG_KEYS, &hdev->dev_flags)) {
3250 list_del(&key->list);
3251 kfree(key);
3252 } else if (conn) {
Johan Hedbergaf6a9c32014-06-24 13:15:53 +03003253 if (persistent)
3254 clear_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
3255 else
3256 set_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003257 }
Johan Hedberg7652ff62014-06-24 13:15:49 +03003258
3259unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003260 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003261}
3262
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003263static void hci_clock_offset_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04837f62006-07-03 10:02:33 +02003264{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003265 struct hci_ev_clock_offset *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003266 struct hci_conn *conn;
3267
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003268 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003269
3270 hci_dev_lock(hdev);
3271
3272 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003273 if (conn && !ev->status) {
3274 struct inquiry_entry *ie;
3275
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003276 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3277 if (ie) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003278 ie->data.clock_offset = ev->clock_offset;
3279 ie->timestamp = jiffies;
3280 }
3281 }
3282
3283 hci_dev_unlock(hdev);
3284}
3285
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003286static void hci_pkt_type_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna8746412008-07-14 20:13:46 +02003287{
3288 struct hci_ev_pkt_type_change *ev = (void *) skb->data;
3289 struct hci_conn *conn;
3290
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003291 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna8746412008-07-14 20:13:46 +02003292
3293 hci_dev_lock(hdev);
3294
3295 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3296 if (conn && !ev->status)
3297 conn->pkt_type = __le16_to_cpu(ev->pkt_type);
3298
3299 hci_dev_unlock(hdev);
3300}
3301
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003302static void hci_pscan_rep_mode_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003303{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003304 struct hci_ev_pscan_rep_mode *ev = (void *) skb->data;
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003305 struct inquiry_entry *ie;
3306
3307 BT_DBG("%s", hdev->name);
3308
3309 hci_dev_lock(hdev);
3310
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003311 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
3312 if (ie) {
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003313 ie->data.pscan_rep_mode = ev->pscan_rep_mode;
3314 ie->timestamp = jiffies;
3315 }
3316
3317 hci_dev_unlock(hdev);
3318}
3319
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003320static void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev,
3321 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003322{
3323 struct inquiry_data data;
3324 int num_rsp = *((__u8 *) skb->data);
3325
3326 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
3327
3328 if (!num_rsp)
3329 return;
3330
Andre Guedes1519cc12012-03-21 00:03:38 -03003331 if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags))
3332 return;
3333
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003334 hci_dev_lock(hdev);
3335
3336 if ((skb->len - 1) / num_rsp != sizeof(struct inquiry_info_with_rssi)) {
Szymon Janc138d22e2011-02-17 16:44:23 +01003337 struct inquiry_info_with_rssi_and_pscan_mode *info;
3338 info = (void *) (skb->data + 1);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003339
Johan Hedberge17acd42011-03-30 23:57:16 +03003340 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003341 u32 flags;
3342
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003343 bacpy(&data.bdaddr, &info->bdaddr);
3344 data.pscan_rep_mode = info->pscan_rep_mode;
3345 data.pscan_period_mode = info->pscan_period_mode;
3346 data.pscan_mode = info->pscan_mode;
3347 memcpy(data.dev_class, info->dev_class, 3);
3348 data.clock_offset = info->clock_offset;
3349 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003350 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02003351
Marcel Holtmannaf589252014-07-01 14:11:20 +02003352 flags = hci_inquiry_cache_update(hdev, &data, false);
3353
Johan Hedberg48264f02011-11-09 13:58:58 +02003354 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003355 info->dev_class, info->rssi,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003356 flags, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003357 }
3358 } else {
3359 struct inquiry_info_with_rssi *info = (void *) (skb->data + 1);
3360
Johan Hedberge17acd42011-03-30 23:57:16 +03003361 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003362 u32 flags;
3363
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003364 bacpy(&data.bdaddr, &info->bdaddr);
3365 data.pscan_rep_mode = info->pscan_rep_mode;
3366 data.pscan_period_mode = info->pscan_period_mode;
3367 data.pscan_mode = 0x00;
3368 memcpy(data.dev_class, info->dev_class, 3);
3369 data.clock_offset = info->clock_offset;
3370 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003371 data.ssp_mode = 0x00;
Marcel Holtmannaf589252014-07-01 14:11:20 +02003372
3373 flags = hci_inquiry_cache_update(hdev, &data, false);
3374
Johan Hedberg48264f02011-11-09 13:58:58 +02003375 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003376 info->dev_class, info->rssi,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003377 flags, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003378 }
3379 }
3380
3381 hci_dev_unlock(hdev);
3382}
3383
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003384static void hci_remote_ext_features_evt(struct hci_dev *hdev,
3385 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003386{
Marcel Holtmann41a96212008-07-14 20:13:48 +02003387 struct hci_ev_remote_ext_features *ev = (void *) skb->data;
3388 struct hci_conn *conn;
3389
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003390 BT_DBG("%s", hdev->name);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003391
Marcel Holtmann41a96212008-07-14 20:13:48 +02003392 hci_dev_lock(hdev);
3393
3394 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02003395 if (!conn)
3396 goto unlock;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003397
Johan Hedbergcad718e2013-04-17 15:00:51 +03003398 if (ev->page < HCI_MAX_PAGES)
3399 memcpy(conn->features[ev->page], ev->features, 8);
3400
Johan Hedbergccd556f2010-11-10 17:11:51 +02003401 if (!ev->status && ev->page == 0x01) {
3402 struct inquiry_entry *ie;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003403
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003404 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3405 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02003406 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann769be972008-07-14 20:13:49 +02003407
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303408 if (ev->features[0] & LMP_HOST_SSP) {
Johan Hedberg58a681e2012-01-16 06:47:28 +02003409 set_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303410 } else {
3411 /* It is mandatory by the Bluetooth specification that
3412 * Extended Inquiry Results are only used when Secure
3413 * Simple Pairing is enabled, but some devices violate
3414 * this.
3415 *
3416 * To make these devices work, the internal SSP
3417 * enabled flag needs to be cleared if the remote host
3418 * features do not indicate SSP support */
3419 clear_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
3420 }
Marcel Holtmanneb9a8f32014-01-15 22:37:38 -08003421
3422 if (ev->features[0] & LMP_HOST_SC)
3423 set_bit(HCI_CONN_SC_ENABLED, &conn->flags);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003424 }
3425
Johan Hedbergccd556f2010-11-10 17:11:51 +02003426 if (conn->state != BT_CONFIG)
3427 goto unlock;
3428
Johan Hedberg671267b2012-05-12 16:11:50 -03003429 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02003430 struct hci_cp_remote_name_req cp;
3431 memset(&cp, 0, sizeof(cp));
3432 bacpy(&cp.bdaddr, &conn->dst);
3433 cp.pscan_rep_mode = 0x02;
3434 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02003435 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
3436 mgmt_device_connected(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003437 conn->dst_type, 0, NULL, 0,
3438 conn->dev_class);
Johan Hedberg392599b2010-11-18 22:22:28 +02003439
Johan Hedberg127178d2010-11-18 22:22:29 +02003440 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02003441 conn->state = BT_CONNECTED;
3442 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02003443 hci_conn_drop(conn);
Johan Hedbergccd556f2010-11-10 17:11:51 +02003444 }
3445
3446unlock:
Marcel Holtmann41a96212008-07-14 20:13:48 +02003447 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003448}
3449
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003450static void hci_sync_conn_complete_evt(struct hci_dev *hdev,
3451 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003452{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003453 struct hci_ev_sync_conn_complete *ev = (void *) skb->data;
3454 struct hci_conn *conn;
3455
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003456 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003457
3458 hci_dev_lock(hdev);
3459
3460 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann9dc0a3a2008-07-14 20:13:46 +02003461 if (!conn) {
3462 if (ev->link_type == ESCO_LINK)
3463 goto unlock;
3464
3465 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
3466 if (!conn)
3467 goto unlock;
3468
3469 conn->type = SCO_LINK;
3470 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003471
Marcel Holtmann732547f2009-04-19 19:14:14 +02003472 switch (ev->status) {
3473 case 0x00:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003474 conn->handle = __le16_to_cpu(ev->handle);
3475 conn->state = BT_CONNECTED;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02003476
3477 hci_conn_add_sysfs(conn);
Marcel Holtmann732547f2009-04-19 19:14:14 +02003478 break;
3479
Nick Pelly81218d22014-06-30 11:25:01 +05303480 case 0x10: /* Connection Accept Timeout */
Frédéric Dalleau1a4c9582013-08-19 14:24:02 +02003481 case 0x0d: /* Connection Rejected due to Limited Resources */
Stephen Coe705e5712010-02-16 11:29:44 -05003482 case 0x11: /* Unsupported Feature or Parameter Value */
Marcel Holtmann732547f2009-04-19 19:14:14 +02003483 case 0x1c: /* SCO interval rejected */
Nick Pelly1038a002010-02-03 11:42:26 -08003484 case 0x1a: /* Unsupported Remote Feature */
Marcel Holtmann732547f2009-04-19 19:14:14 +02003485 case 0x1f: /* Unspecified error */
Andrew Earl27539bc2014-03-10 10:31:04 +00003486 case 0x20: /* Unsupported LMP Parameter value */
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02003487 if (conn->out) {
Marcel Holtmann732547f2009-04-19 19:14:14 +02003488 conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) |
3489 (hdev->esco_type & EDR_ESCO_MASK);
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02003490 if (hci_setup_sync(conn, conn->link->handle))
3491 goto unlock;
Marcel Holtmann732547f2009-04-19 19:14:14 +02003492 }
3493 /* fall through */
3494
3495 default:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003496 conn->state = BT_CLOSED;
Marcel Holtmann732547f2009-04-19 19:14:14 +02003497 break;
3498 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003499
3500 hci_proto_connect_cfm(conn, ev->status);
3501 if (ev->status)
3502 hci_conn_del(conn);
3503
3504unlock:
3505 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003506}
3507
Marcel Holtmannefdcf8e2013-10-15 10:31:12 -07003508static inline size_t eir_get_length(u8 *eir, size_t eir_len)
3509{
3510 size_t parsed = 0;
3511
3512 while (parsed < eir_len) {
3513 u8 field_len = eir[0];
3514
3515 if (field_len == 0)
3516 return parsed;
3517
3518 parsed += field_len + 1;
3519 eir += field_len + 1;
3520 }
3521
3522 return eir_len;
3523}
3524
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003525static void hci_extended_inquiry_result_evt(struct hci_dev *hdev,
3526 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003527{
3528 struct inquiry_data data;
3529 struct extended_inquiry_info *info = (void *) (skb->data + 1);
3530 int num_rsp = *((__u8 *) skb->data);
Vishal Agarwal9d939d92012-04-26 19:19:56 +05303531 size_t eir_len;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003532
3533 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
3534
3535 if (!num_rsp)
3536 return;
3537
Andre Guedes1519cc12012-03-21 00:03:38 -03003538 if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags))
3539 return;
3540
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003541 hci_dev_lock(hdev);
3542
Johan Hedberge17acd42011-03-30 23:57:16 +03003543 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003544 u32 flags;
3545 bool name_known;
Johan Hedberg561aafb2012-01-04 13:31:59 +02003546
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003547 bacpy(&data.bdaddr, &info->bdaddr);
Szymon Janc138d22e2011-02-17 16:44:23 +01003548 data.pscan_rep_mode = info->pscan_rep_mode;
3549 data.pscan_period_mode = info->pscan_period_mode;
3550 data.pscan_mode = 0x00;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003551 memcpy(data.dev_class, info->dev_class, 3);
Szymon Janc138d22e2011-02-17 16:44:23 +01003552 data.clock_offset = info->clock_offset;
3553 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003554 data.ssp_mode = 0x01;
Johan Hedberg561aafb2012-01-04 13:31:59 +02003555
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003556 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg4ddb1932012-01-15 20:04:43 +02003557 name_known = eir_has_data_type(info->data,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003558 sizeof(info->data),
3559 EIR_NAME_COMPLETE);
Johan Hedberg561aafb2012-01-04 13:31:59 +02003560 else
3561 name_known = true;
3562
Marcel Holtmannaf589252014-07-01 14:11:20 +02003563 flags = hci_inquiry_cache_update(hdev, &data, name_known);
3564
Vishal Agarwal9d939d92012-04-26 19:19:56 +05303565 eir_len = eir_get_length(info->data, sizeof(info->data));
Marcel Holtmannaf589252014-07-01 14:11:20 +02003566
Johan Hedberg48264f02011-11-09 13:58:58 +02003567 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003568 info->dev_class, info->rssi,
3569 flags, info->data, eir_len, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003570 }
3571
3572 hci_dev_unlock(hdev);
3573}
3574
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003575static void hci_key_refresh_complete_evt(struct hci_dev *hdev,
3576 struct sk_buff *skb)
3577{
3578 struct hci_ev_key_refresh_complete *ev = (void *) skb->data;
3579 struct hci_conn *conn;
3580
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003581 BT_DBG("%s status 0x%2.2x handle 0x%4.4x", hdev->name, ev->status,
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003582 __le16_to_cpu(ev->handle));
3583
3584 hci_dev_lock(hdev);
3585
3586 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3587 if (!conn)
3588 goto unlock;
3589
Johan Hedberg9eb1fbf2014-04-11 12:02:31 -07003590 /* For BR/EDR the necessary steps are taken through the
3591 * auth_complete event.
3592 */
3593 if (conn->type != LE_LINK)
3594 goto unlock;
3595
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003596 if (!ev->status)
3597 conn->sec_level = conn->pending_sec_level;
3598
3599 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
3600
3601 if (ev->status && conn->state == BT_CONNECTED) {
Andre Guedesbed71742013-01-30 11:50:56 -03003602 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
David Herrmann76a68ba2013-04-06 20:28:37 +02003603 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003604 goto unlock;
3605 }
3606
3607 if (conn->state == BT_CONFIG) {
3608 if (!ev->status)
3609 conn->state = BT_CONNECTED;
3610
3611 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02003612 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003613 } else {
3614 hci_auth_cfm(conn, ev->status);
3615
3616 hci_conn_hold(conn);
3617 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003618 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003619 }
3620
3621unlock:
3622 hci_dev_unlock(hdev);
3623}
3624
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003625static u8 hci_get_auth_req(struct hci_conn *conn)
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003626{
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003627 /* If remote requests no-bonding follow that lead */
Mikel Astizacabae92013-06-28 10:56:28 +02003628 if (conn->remote_auth == HCI_AT_NO_BONDING ||
3629 conn->remote_auth == HCI_AT_NO_BONDING_MITM)
Waldemar Rymarkiewicz58797bf2011-04-28 12:07:58 +02003630 return conn->remote_auth | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003631
Mikel Astizb7f94c82014-04-08 14:21:31 +02003632 /* If both remote and local have enough IO capabilities, require
3633 * MITM protection
3634 */
3635 if (conn->remote_cap != HCI_IO_NO_INPUT_OUTPUT &&
3636 conn->io_capability != HCI_IO_NO_INPUT_OUTPUT)
3637 return conn->remote_auth | 0x01;
3638
Timo Mueller7e741702014-04-08 14:21:33 +02003639 /* No MITM protection possible so ignore remote requirement */
3640 return (conn->remote_auth & ~0x01) | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003641}
3642
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003643static void hci_io_capa_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02003644{
3645 struct hci_ev_io_capa_request *ev = (void *) skb->data;
3646 struct hci_conn *conn;
3647
3648 BT_DBG("%s", hdev->name);
3649
3650 hci_dev_lock(hdev);
3651
3652 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003653 if (!conn)
3654 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02003655
Johan Hedberg03b555e2011-01-04 15:40:05 +02003656 hci_conn_hold(conn);
3657
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003658 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg03b555e2011-01-04 15:40:05 +02003659 goto unlock;
3660
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003661 if (test_bit(HCI_PAIRABLE, &hdev->dev_flags) ||
Gustavo Padovan807deac2012-05-17 00:36:24 -03003662 (conn->remote_auth & ~0x01) == HCI_AT_NO_BONDING) {
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003663 struct hci_cp_io_capability_reply cp;
3664
3665 bacpy(&cp.bdaddr, &ev->bdaddr);
Hemant Gupta7a7f1e72012-01-16 13:34:29 +05303666 /* Change the IO capability from KeyboardDisplay
3667 * to DisplayYesNo as it is not supported by BT spec. */
3668 cp.capability = (conn->io_capability == 0x04) ?
Mikel Astiza7676312013-06-28 10:56:29 +02003669 HCI_IO_DISPLAY_YESNO : conn->io_capability;
Mikel Astizb7f94c82014-04-08 14:21:31 +02003670
3671 /* If we are initiators, there is no remote information yet */
3672 if (conn->remote_auth == 0xff) {
3673 cp.authentication = conn->auth_type;
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003674
Mikel Astizb16c6602014-04-08 14:21:34 +02003675 /* Request MITM protection if our IO caps allow it
Johan Hedberg4ad51a72014-06-09 14:41:25 +03003676 * except for the no-bonding case.
3677 * conn->auth_type is not updated here since
3678 * that might cause the user confirmation to be
3679 * rejected in case the remote doesn't have the
3680 * IO capabilities for MITM.
Mikel Astizb16c6602014-04-08 14:21:34 +02003681 */
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003682 if (conn->io_capability != HCI_IO_NO_INPUT_OUTPUT &&
Mikel Astizb16c6602014-04-08 14:21:34 +02003683 cp.authentication != HCI_AT_NO_BONDING)
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003684 cp.authentication |= 0x01;
Mikel Astizb7f94c82014-04-08 14:21:31 +02003685 } else {
3686 conn->auth_type = hci_get_auth_req(conn);
3687 cp.authentication = conn->auth_type;
3688 }
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003689
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003690 if (hci_find_remote_oob_data(hdev, &conn->dst) &&
3691 (conn->out || test_bit(HCI_CONN_REMOTE_OOB, &conn->flags)))
Szymon Jancce85ee12011-03-22 13:12:23 +01003692 cp.oob_data = 0x01;
3693 else
3694 cp.oob_data = 0x00;
3695
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003696 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003697 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003698 } else {
3699 struct hci_cp_io_capability_neg_reply cp;
3700
3701 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02003702 cp.reason = HCI_ERROR_PAIRING_NOT_ALLOWED;
Johan Hedberg03b555e2011-01-04 15:40:05 +02003703
3704 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003705 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003706 }
3707
3708unlock:
3709 hci_dev_unlock(hdev);
3710}
3711
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003712static void hci_io_capa_reply_evt(struct hci_dev *hdev, struct sk_buff *skb)
Johan Hedberg03b555e2011-01-04 15:40:05 +02003713{
3714 struct hci_ev_io_capa_reply *ev = (void *) skb->data;
3715 struct hci_conn *conn;
3716
3717 BT_DBG("%s", hdev->name);
3718
3719 hci_dev_lock(hdev);
3720
3721 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3722 if (!conn)
3723 goto unlock;
3724
Johan Hedberg03b555e2011-01-04 15:40:05 +02003725 conn->remote_cap = ev->capability;
Johan Hedberg03b555e2011-01-04 15:40:05 +02003726 conn->remote_auth = ev->authentication;
Johan Hedberg58a681e2012-01-16 06:47:28 +02003727 if (ev->oob_data)
3728 set_bit(HCI_CONN_REMOTE_OOB, &conn->flags);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003729
3730unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02003731 hci_dev_unlock(hdev);
3732}
3733
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003734static void hci_user_confirm_request_evt(struct hci_dev *hdev,
3735 struct sk_buff *skb)
Johan Hedberga5c29682011-02-19 12:05:57 -03003736{
3737 struct hci_ev_user_confirm_req *ev = (void *) skb->data;
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003738 int loc_mitm, rem_mitm, confirm_hint = 0;
Johan Hedberg7a828902011-04-28 11:28:53 -07003739 struct hci_conn *conn;
Johan Hedberga5c29682011-02-19 12:05:57 -03003740
3741 BT_DBG("%s", hdev->name);
3742
3743 hci_dev_lock(hdev);
3744
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003745 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg7a828902011-04-28 11:28:53 -07003746 goto unlock;
Johan Hedberga5c29682011-02-19 12:05:57 -03003747
Johan Hedberg7a828902011-04-28 11:28:53 -07003748 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3749 if (!conn)
3750 goto unlock;
3751
3752 loc_mitm = (conn->auth_type & 0x01);
3753 rem_mitm = (conn->remote_auth & 0x01);
3754
3755 /* If we require MITM but the remote device can't provide that
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003756 * (it has NoInputNoOutput) then reject the confirmation request
3757 */
3758 if (loc_mitm && conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) {
Johan Hedberg7a828902011-04-28 11:28:53 -07003759 BT_DBG("Rejecting request: remote device can't provide MITM");
3760 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003761 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07003762 goto unlock;
3763 }
3764
3765 /* If no side requires MITM protection; auto-accept */
Mikel Astiza7676312013-06-28 10:56:29 +02003766 if ((!loc_mitm || conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) &&
3767 (!rem_mitm || conn->io_capability == HCI_IO_NO_INPUT_OUTPUT)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003768
3769 /* If we're not the initiators request authorization to
3770 * proceed from user space (mgmt_user_confirm with
Johan Hedbergba15a582014-06-09 13:58:14 +03003771 * confirm_hint set to 1). The exception is if neither
3772 * side had MITM in which case we do auto-accept.
3773 */
3774 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) &&
3775 (loc_mitm || rem_mitm)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003776 BT_DBG("Confirming auto-accept as acceptor");
3777 confirm_hint = 1;
3778 goto confirm;
3779 }
3780
Johan Hedberg9f616562011-04-28 11:28:54 -07003781 BT_DBG("Auto-accept of user confirmation with %ums delay",
Gustavo Padovan807deac2012-05-17 00:36:24 -03003782 hdev->auto_accept_delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07003783
3784 if (hdev->auto_accept_delay > 0) {
3785 int delay = msecs_to_jiffies(hdev->auto_accept_delay);
Johan Hedberg7bc18d92013-10-16 18:11:39 +03003786 queue_delayed_work(conn->hdev->workqueue,
3787 &conn->auto_accept_work, delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07003788 goto unlock;
3789 }
3790
Johan Hedberg7a828902011-04-28 11:28:53 -07003791 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003792 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07003793 goto unlock;
3794 }
3795
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003796confirm:
Johan Hedberg39adbff2014-03-20 08:18:14 +02003797 mgmt_user_confirm_request(hdev, &ev->bdaddr, ACL_LINK, 0,
3798 le32_to_cpu(ev->passkey), confirm_hint);
Johan Hedberg7a828902011-04-28 11:28:53 -07003799
3800unlock:
Johan Hedberga5c29682011-02-19 12:05:57 -03003801 hci_dev_unlock(hdev);
3802}
3803
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003804static void hci_user_passkey_request_evt(struct hci_dev *hdev,
3805 struct sk_buff *skb)
Brian Gix1143d452011-11-23 08:28:34 -08003806{
3807 struct hci_ev_user_passkey_req *ev = (void *) skb->data;
3808
3809 BT_DBG("%s", hdev->name);
3810
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003811 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg272d90d2012-02-09 15:26:12 +02003812 mgmt_user_passkey_request(hdev, &ev->bdaddr, ACL_LINK, 0);
Brian Gix1143d452011-11-23 08:28:34 -08003813}
3814
Johan Hedberg92a25252012-09-06 18:39:26 +03003815static void hci_user_passkey_notify_evt(struct hci_dev *hdev,
3816 struct sk_buff *skb)
3817{
3818 struct hci_ev_user_passkey_notify *ev = (void *) skb->data;
3819 struct hci_conn *conn;
3820
3821 BT_DBG("%s", hdev->name);
3822
3823 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3824 if (!conn)
3825 return;
3826
3827 conn->passkey_notify = __le32_to_cpu(ev->passkey);
3828 conn->passkey_entered = 0;
3829
3830 if (test_bit(HCI_MGMT, &hdev->dev_flags))
3831 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
3832 conn->dst_type, conn->passkey_notify,
3833 conn->passkey_entered);
3834}
3835
3836static void hci_keypress_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
3837{
3838 struct hci_ev_keypress_notify *ev = (void *) skb->data;
3839 struct hci_conn *conn;
3840
3841 BT_DBG("%s", hdev->name);
3842
3843 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3844 if (!conn)
3845 return;
3846
3847 switch (ev->type) {
3848 case HCI_KEYPRESS_STARTED:
3849 conn->passkey_entered = 0;
3850 return;
3851
3852 case HCI_KEYPRESS_ENTERED:
3853 conn->passkey_entered++;
3854 break;
3855
3856 case HCI_KEYPRESS_ERASED:
3857 conn->passkey_entered--;
3858 break;
3859
3860 case HCI_KEYPRESS_CLEARED:
3861 conn->passkey_entered = 0;
3862 break;
3863
3864 case HCI_KEYPRESS_COMPLETED:
3865 return;
3866 }
3867
3868 if (test_bit(HCI_MGMT, &hdev->dev_flags))
3869 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
3870 conn->dst_type, conn->passkey_notify,
3871 conn->passkey_entered);
3872}
3873
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003874static void hci_simple_pair_complete_evt(struct hci_dev *hdev,
3875 struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02003876{
3877 struct hci_ev_simple_pair_complete *ev = (void *) skb->data;
3878 struct hci_conn *conn;
3879
3880 BT_DBG("%s", hdev->name);
3881
3882 hci_dev_lock(hdev);
3883
3884 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg2a611692011-02-19 12:06:00 -03003885 if (!conn)
3886 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02003887
Johan Hedberg2a611692011-02-19 12:06:00 -03003888 /* To avoid duplicate auth_failed events to user space we check
3889 * the HCI_CONN_AUTH_PEND flag which will be set if we
3890 * initiated the authentication. A traditional auth_complete
3891 * event gets always produced as initiator and is also mapped to
3892 * the mgmt_auth_failed event */
Mikel Astizfa1bd912012-08-09 09:52:29 +02003893 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) && ev->status)
Johan Hedbergbab73cb2012-02-09 16:07:29 +02003894 mgmt_auth_failed(hdev, &conn->dst, conn->type, conn->dst_type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003895 ev->status);
Johan Hedberg2a611692011-02-19 12:06:00 -03003896
David Herrmann76a68ba2013-04-06 20:28:37 +02003897 hci_conn_drop(conn);
Johan Hedberg2a611692011-02-19 12:06:00 -03003898
3899unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02003900 hci_dev_unlock(hdev);
3901}
3902
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003903static void hci_remote_host_features_evt(struct hci_dev *hdev,
3904 struct sk_buff *skb)
Marcel Holtmann41a96212008-07-14 20:13:48 +02003905{
3906 struct hci_ev_remote_host_features *ev = (void *) skb->data;
3907 struct inquiry_entry *ie;
Johan Hedbergcad718e2013-04-17 15:00:51 +03003908 struct hci_conn *conn;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003909
3910 BT_DBG("%s", hdev->name);
3911
3912 hci_dev_lock(hdev);
3913
Johan Hedbergcad718e2013-04-17 15:00:51 +03003914 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3915 if (conn)
3916 memcpy(conn->features[1], ev->features, 8);
3917
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003918 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
3919 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02003920 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003921
3922 hci_dev_unlock(hdev);
3923}
3924
Gustavo Padovan6039aa72012-05-23 04:04:18 -03003925static void hci_remote_oob_data_request_evt(struct hci_dev *hdev,
3926 struct sk_buff *skb)
Szymon Janc2763eda2011-03-22 13:12:22 +01003927{
3928 struct hci_ev_remote_oob_data_request *ev = (void *) skb->data;
3929 struct oob_data *data;
3930
3931 BT_DBG("%s", hdev->name);
3932
3933 hci_dev_lock(hdev);
3934
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003935 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Szymon Jance1ba1f12011-04-06 13:01:59 +02003936 goto unlock;
3937
Szymon Janc2763eda2011-03-22 13:12:22 +01003938 data = hci_find_remote_oob_data(hdev, &ev->bdaddr);
3939 if (data) {
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08003940 if (test_bit(HCI_SC_ENABLED, &hdev->dev_flags)) {
3941 struct hci_cp_remote_oob_ext_data_reply cp;
Szymon Janc2763eda2011-03-22 13:12:22 +01003942
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08003943 bacpy(&cp.bdaddr, &ev->bdaddr);
3944 memcpy(cp.hash192, data->hash192, sizeof(cp.hash192));
3945 memcpy(cp.randomizer192, data->randomizer192,
3946 sizeof(cp.randomizer192));
3947 memcpy(cp.hash256, data->hash256, sizeof(cp.hash256));
3948 memcpy(cp.randomizer256, data->randomizer256,
3949 sizeof(cp.randomizer256));
Szymon Janc2763eda2011-03-22 13:12:22 +01003950
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08003951 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_EXT_DATA_REPLY,
3952 sizeof(cp), &cp);
3953 } else {
3954 struct hci_cp_remote_oob_data_reply cp;
3955
3956 bacpy(&cp.bdaddr, &ev->bdaddr);
3957 memcpy(cp.hash, data->hash192, sizeof(cp.hash));
3958 memcpy(cp.randomizer, data->randomizer192,
3959 sizeof(cp.randomizer));
3960
3961 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_REPLY,
3962 sizeof(cp), &cp);
3963 }
Szymon Janc2763eda2011-03-22 13:12:22 +01003964 } else {
3965 struct hci_cp_remote_oob_data_neg_reply cp;
3966
3967 bacpy(&cp.bdaddr, &ev->bdaddr);
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08003968 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_NEG_REPLY,
3969 sizeof(cp), &cp);
Szymon Janc2763eda2011-03-22 13:12:22 +01003970 }
3971
Szymon Jance1ba1f12011-04-06 13:01:59 +02003972unlock:
Szymon Janc2763eda2011-03-22 13:12:22 +01003973 hci_dev_unlock(hdev);
3974}
3975
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03003976static void hci_phy_link_complete_evt(struct hci_dev *hdev,
3977 struct sk_buff *skb)
3978{
3979 struct hci_ev_phy_link_complete *ev = (void *) skb->data;
3980 struct hci_conn *hcon, *bredr_hcon;
3981
3982 BT_DBG("%s handle 0x%2.2x status 0x%2.2x", hdev->name, ev->phy_handle,
3983 ev->status);
3984
3985 hci_dev_lock(hdev);
3986
3987 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
3988 if (!hcon) {
3989 hci_dev_unlock(hdev);
3990 return;
3991 }
3992
3993 if (ev->status) {
3994 hci_conn_del(hcon);
3995 hci_dev_unlock(hdev);
3996 return;
3997 }
3998
3999 bredr_hcon = hcon->amp_mgr->l2cap_conn->hcon;
4000
4001 hcon->state = BT_CONNECTED;
4002 bacpy(&hcon->dst, &bredr_hcon->dst);
4003
4004 hci_conn_hold(hcon);
4005 hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02004006 hci_conn_drop(hcon);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004007
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004008 hci_conn_add_sysfs(hcon);
4009
Andrei Emeltchenkocf70ff22012-10-31 15:46:36 +02004010 amp_physical_cfm(bredr_hcon, hcon);
4011
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004012 hci_dev_unlock(hdev);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004013}
4014
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004015static void hci_loglink_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
4016{
4017 struct hci_ev_logical_link_complete *ev = (void *) skb->data;
4018 struct hci_conn *hcon;
4019 struct hci_chan *hchan;
4020 struct amp_mgr *mgr;
4021
4022 BT_DBG("%s log_handle 0x%4.4x phy_handle 0x%2.2x status 0x%2.2x",
4023 hdev->name, le16_to_cpu(ev->handle), ev->phy_handle,
4024 ev->status);
4025
4026 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4027 if (!hcon)
4028 return;
4029
4030 /* Create AMP hchan */
4031 hchan = hci_chan_create(hcon);
4032 if (!hchan)
4033 return;
4034
4035 hchan->handle = le16_to_cpu(ev->handle);
4036
4037 BT_DBG("hcon %p mgr %p hchan %p", hcon, hcon->amp_mgr, hchan);
4038
4039 mgr = hcon->amp_mgr;
4040 if (mgr && mgr->bredr_chan) {
4041 struct l2cap_chan *bredr_chan = mgr->bredr_chan;
4042
4043 l2cap_chan_lock(bredr_chan);
4044
4045 bredr_chan->conn->mtu = hdev->block_mtu;
4046 l2cap_logical_cfm(bredr_chan, hchan, 0);
4047 hci_conn_hold(hcon);
4048
4049 l2cap_chan_unlock(bredr_chan);
4050 }
4051}
4052
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02004053static void hci_disconn_loglink_complete_evt(struct hci_dev *hdev,
4054 struct sk_buff *skb)
4055{
4056 struct hci_ev_disconn_logical_link_complete *ev = (void *) skb->data;
4057 struct hci_chan *hchan;
4058
4059 BT_DBG("%s log handle 0x%4.4x status 0x%2.2x", hdev->name,
4060 le16_to_cpu(ev->handle), ev->status);
4061
4062 if (ev->status)
4063 return;
4064
4065 hci_dev_lock(hdev);
4066
4067 hchan = hci_chan_lookup_handle(hdev, le16_to_cpu(ev->handle));
4068 if (!hchan)
4069 goto unlock;
4070
4071 amp_destroy_logical_link(hchan, ev->reason);
4072
4073unlock:
4074 hci_dev_unlock(hdev);
4075}
4076
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02004077static void hci_disconn_phylink_complete_evt(struct hci_dev *hdev,
4078 struct sk_buff *skb)
4079{
4080 struct hci_ev_disconn_phy_link_complete *ev = (void *) skb->data;
4081 struct hci_conn *hcon;
4082
4083 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4084
4085 if (ev->status)
4086 return;
4087
4088 hci_dev_lock(hdev);
4089
4090 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4091 if (hcon) {
4092 hcon->state = BT_CLOSED;
4093 hci_conn_del(hcon);
4094 }
4095
4096 hci_dev_unlock(hdev);
4097}
4098
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004099static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03004100{
4101 struct hci_ev_le_conn_complete *ev = (void *) skb->data;
Johan Hedberg912b42ef2014-07-03 19:33:49 +03004102 struct hci_conn_params *params;
Ville Tervofcd89c02011-02-10 22:38:47 -03004103 struct hci_conn *conn;
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004104 struct smp_irk *irk;
Johan Hedberg837d5022014-07-02 09:36:22 +03004105 u8 addr_type;
Ville Tervofcd89c02011-02-10 22:38:47 -03004106
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004107 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Ville Tervofcd89c02011-02-10 22:38:47 -03004108
4109 hci_dev_lock(hdev);
4110
Johan Hedbergfbd96c12014-07-08 17:21:51 +03004111 /* All controllers implicitly stop advertising in the event of a
4112 * connection, so ensure that the state bit is cleared.
4113 */
4114 clear_bit(HCI_LE_ADV, &hdev->dev_flags);
4115
Andre Guedesb47a09b2012-07-27 15:10:15 -03004116 conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
Ville Tervob62f3282011-02-10 22:38:50 -03004117 if (!conn) {
4118 conn = hci_conn_add(hdev, LE_LINK, &ev->bdaddr);
4119 if (!conn) {
4120 BT_ERR("No memory for new connection");
Andre Guedes230fd162012-07-27 15:10:10 -03004121 goto unlock;
Ville Tervob62f3282011-02-10 22:38:50 -03004122 }
Andre Guedes29b79882011-05-31 14:20:54 -03004123
4124 conn->dst_type = ev->bdaddr_type;
Andre Guedesb9b343d2012-07-27 15:10:11 -03004125
4126 if (ev->role == LE_CONN_ROLE_MASTER) {
4127 conn->out = true;
Johan Hedberg4dae2792014-06-24 17:03:50 +03004128 set_bit(HCI_CONN_MASTER, &conn->flags);
Andre Guedesb9b343d2012-07-27 15:10:11 -03004129 }
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004130
4131 /* If we didn't have a hci_conn object previously
4132 * but we're in master role this must be something
4133 * initiated using a white list. Since white list based
4134 * connections are not "first class citizens" we don't
4135 * have full tracking of them. Therefore, we go ahead
4136 * with a "best effort" approach of determining the
4137 * initiator address based on the HCI_PRIVACY flag.
4138 */
4139 if (conn->out) {
4140 conn->resp_addr_type = ev->bdaddr_type;
4141 bacpy(&conn->resp_addr, &ev->bdaddr);
4142 if (test_bit(HCI_PRIVACY, &hdev->dev_flags)) {
4143 conn->init_addr_type = ADDR_LE_DEV_RANDOM;
4144 bacpy(&conn->init_addr, &hdev->rpa);
4145 } else {
4146 hci_copy_identity_address(hdev,
4147 &conn->init_addr,
4148 &conn->init_addr_type);
4149 }
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004150 }
Johan Hedberg9489eca2014-02-28 17:45:46 +02004151 } else {
4152 cancel_delayed_work(&conn->le_conn_timeout);
Ville Tervob62f3282011-02-10 22:38:50 -03004153 }
Ville Tervofcd89c02011-02-10 22:38:47 -03004154
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004155 if (!conn->out) {
4156 /* Set the responder (our side) address type based on
4157 * the advertising address type.
4158 */
4159 conn->resp_addr_type = hdev->adv_addr_type;
4160 if (hdev->adv_addr_type == ADDR_LE_DEV_RANDOM)
4161 bacpy(&conn->resp_addr, &hdev->random_addr);
4162 else
4163 bacpy(&conn->resp_addr, &hdev->bdaddr);
4164
4165 conn->init_addr_type = ev->bdaddr_type;
4166 bacpy(&conn->init_addr, &ev->bdaddr);
Marcel Holtmanna720d732014-06-23 12:14:51 +02004167
4168 /* For incoming connections, set the default minimum
4169 * and maximum connection interval. They will be used
4170 * to check if the parameters are in range and if not
4171 * trigger the connection update procedure.
4172 */
4173 conn->le_conn_min_interval = hdev->le_conn_min_interval;
4174 conn->le_conn_max_interval = hdev->le_conn_max_interval;
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004175 }
Johan Hedberg7be2edb2014-02-23 19:42:17 +02004176
Marcel Holtmannedb4b462014-02-18 15:13:43 -08004177 /* Lookup the identity address from the stored connection
4178 * address and address type.
4179 *
4180 * When establishing connections to an identity address, the
4181 * connection procedure will store the resolvable random
4182 * address first. Now if it can be converted back into the
4183 * identity address, start using the identity address from
4184 * now on.
4185 */
4186 irk = hci_get_irk(hdev, &conn->dst, conn->dst_type);
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004187 if (irk) {
4188 bacpy(&conn->dst, &irk->bdaddr);
4189 conn->dst_type = irk->addr_type;
4190 }
4191
Johan Hedberg837d5022014-07-02 09:36:22 +03004192 if (conn->dst_type == ADDR_LE_DEV_PUBLIC)
4193 addr_type = BDADDR_LE_PUBLIC;
4194 else
4195 addr_type = BDADDR_LE_RANDOM;
4196
4197 /* Drop the connection if he device is blocked */
Johan Hedbergdcc36c12014-07-09 12:59:13 +03004198 if (hci_bdaddr_list_lookup(&hdev->blacklist, &conn->dst, addr_type)) {
Johan Hedberg837d5022014-07-02 09:36:22 +03004199 hci_conn_drop(conn);
4200 goto unlock;
4201 }
4202
Andre Guedescd17dec2012-07-27 15:10:16 -03004203 if (ev->status) {
Andre Guedes06c053f2014-02-26 20:21:41 -03004204 hci_le_conn_failed(conn, ev->status);
Andre Guedescd17dec2012-07-27 15:10:16 -03004205 goto unlock;
4206 }
4207
Johan Hedbergb644ba32012-01-17 21:48:47 +02004208 if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Marcel Holtmann01fdb0f2014-02-18 14:22:19 -08004209 mgmt_device_connected(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03004210 conn->dst_type, 0, NULL, 0, NULL);
Vinicius Costa Gomes83bc71b2011-05-06 18:41:43 -03004211
Vinicius Costa Gomes7b5c0d52011-06-09 18:50:50 -03004212 conn->sec_level = BT_SECURITY_LOW;
Ville Tervofcd89c02011-02-10 22:38:47 -03004213 conn->handle = __le16_to_cpu(ev->handle);
4214 conn->state = BT_CONNECTED;
4215
Marcel Holtmanne04fde62014-06-23 11:40:04 +02004216 conn->le_conn_interval = le16_to_cpu(ev->interval);
4217 conn->le_conn_latency = le16_to_cpu(ev->latency);
4218 conn->le_supv_timeout = le16_to_cpu(ev->supervision_timeout);
4219
Ville Tervofcd89c02011-02-10 22:38:47 -03004220 hci_conn_add_sysfs(conn);
4221
4222 hci_proto_connect_cfm(conn, ev->status);
4223
Johan Hedberg912b42ef2014-07-03 19:33:49 +03004224 params = hci_conn_params_lookup(hdev, &conn->dst, conn->dst_type);
Johan Hedberg223683a2014-07-06 15:44:23 +03004225 if (params)
Johan Hedberg95305ba2014-07-04 12:37:21 +03004226 list_del_init(&params->action);
Andre Guedesa4790db2014-02-26 20:21:47 -03004227
Ville Tervofcd89c02011-02-10 22:38:47 -03004228unlock:
Johan Hedberg223683a2014-07-06 15:44:23 +03004229 hci_update_background_scan(hdev);
Ville Tervofcd89c02011-02-10 22:38:47 -03004230 hci_dev_unlock(hdev);
4231}
4232
Marcel Holtmann1855d922014-06-23 11:40:05 +02004233static void hci_le_conn_update_complete_evt(struct hci_dev *hdev,
4234 struct sk_buff *skb)
4235{
4236 struct hci_ev_le_conn_update_complete *ev = (void *) skb->data;
4237 struct hci_conn *conn;
4238
4239 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4240
4241 if (ev->status)
4242 return;
4243
4244 hci_dev_lock(hdev);
4245
4246 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
4247 if (conn) {
4248 conn->le_conn_interval = le16_to_cpu(ev->interval);
4249 conn->le_conn_latency = le16_to_cpu(ev->latency);
4250 conn->le_supv_timeout = le16_to_cpu(ev->supervision_timeout);
4251 }
4252
4253 hci_dev_unlock(hdev);
4254}
4255
Andre Guedesa4790db2014-02-26 20:21:47 -03004256/* This function requires the caller holds hdev->lock */
Johan Hedberg7e899c92014-07-07 12:45:55 +03004257static void check_pending_le_conn(struct hci_dev *hdev, bdaddr_t *addr,
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004258 u8 addr_type, u8 adv_type)
Andre Guedesa4790db2014-02-26 20:21:47 -03004259{
4260 struct hci_conn *conn;
4261
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004262 /* If the event is not connectable don't proceed further */
4263 if (adv_type != LE_ADV_IND && adv_type != LE_ADV_DIRECT_IND)
Johan Hedberg7e899c92014-07-07 12:45:55 +03004264 return;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004265
4266 /* Ignore if the device is blocked */
Johan Hedbergdcc36c12014-07-09 12:59:13 +03004267 if (hci_bdaddr_list_lookup(&hdev->blacklist, addr, addr_type))
Johan Hedberg7e899c92014-07-07 12:45:55 +03004268 return;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004269
4270 /* If we're connectable, always connect any ADV_DIRECT_IND event */
4271 if (test_bit(HCI_CONNECTABLE, &hdev->dev_flags) &&
4272 adv_type == LE_ADV_DIRECT_IND)
4273 goto connect;
4274
4275 /* If we're not connectable only connect devices that we have in
4276 * our pend_le_conns list.
4277 */
Johan Hedberg501f8822014-07-04 12:37:26 +03004278 if (!hci_pend_le_action_lookup(&hdev->pend_le_conns, addr, addr_type))
Johan Hedberg7e899c92014-07-07 12:45:55 +03004279 return;
Andre Guedesa4790db2014-02-26 20:21:47 -03004280
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004281connect:
Johan Hedbergcdd62752014-07-07 15:02:28 +03004282 /* Request connection in master = true role */
Andre Guedesa4790db2014-02-26 20:21:47 -03004283 conn = hci_connect_le(hdev, addr, addr_type, BT_SECURITY_LOW,
Johan Hedbergcdd62752014-07-07 15:02:28 +03004284 HCI_LE_AUTOCONN_TIMEOUT, true);
Andre Guedesa4790db2014-02-26 20:21:47 -03004285 if (!IS_ERR(conn))
Johan Hedberg7e899c92014-07-07 12:45:55 +03004286 return;
Andre Guedesa4790db2014-02-26 20:21:47 -03004287
4288 switch (PTR_ERR(conn)) {
4289 case -EBUSY:
4290 /* If hci_connect() returns -EBUSY it means there is already
4291 * an LE connection attempt going on. Since controllers don't
4292 * support more than one connection attempt at the time, we
4293 * don't consider this an error case.
4294 */
4295 break;
4296 default:
4297 BT_DBG("Failed to connect: err %ld", PTR_ERR(conn));
4298 }
4299}
4300
Johan Hedberg4af605d2014-03-24 10:48:00 +02004301static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr,
4302 u8 bdaddr_type, s8 rssi, u8 *data, u8 len)
4303{
Johan Hedbergb9a63282014-03-25 10:51:52 +02004304 struct discovery_state *d = &hdev->discovery;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004305 struct smp_irk *irk;
Johan Hedberg474ee062014-03-25 14:34:59 +02004306 bool match;
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004307 u32 flags;
Johan Hedbergb9a63282014-03-25 10:51:52 +02004308
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004309 /* Check if we need to convert to identity address */
4310 irk = hci_get_irk(hdev, bdaddr, bdaddr_type);
4311 if (irk) {
4312 bdaddr = &irk->bdaddr;
4313 bdaddr_type = irk->addr_type;
4314 }
4315
4316 /* Check if we have been requested to connect to this device */
4317 check_pending_le_conn(hdev, bdaddr, bdaddr_type, type);
4318
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004319 /* Passive scanning shouldn't trigger any device found events,
4320 * except for devices marked as CONN_REPORT for which we do send
4321 * device found events.
4322 */
Johan Hedbergca5c4be2014-03-25 10:30:46 +02004323 if (hdev->le_scan_type == LE_SCAN_PASSIVE) {
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004324 struct hci_conn_params *param;
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004325
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004326 if (type == LE_ADV_DIRECT_IND)
4327 return;
4328
Johan Hedberga7545f22014-07-04 12:37:27 +03004329 param = hci_pend_le_action_lookup(&hdev->pend_le_reports,
4330 bdaddr, bdaddr_type);
4331 if (!param)
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004332 return;
4333
4334 if (type == LE_ADV_NONCONN_IND || type == LE_ADV_SCAN_IND)
4335 flags = MGMT_DEV_FOUND_NOT_CONNECTABLE;
4336 else
4337 flags = 0;
4338 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
4339 rssi, flags, data, len, NULL, 0);
Johan Hedberg97bf2e92014-07-04 12:37:16 +03004340 return;
Johan Hedbergca5c4be2014-03-25 10:30:46 +02004341 }
Johan Hedberg4af605d2014-03-24 10:48:00 +02004342
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004343 /* When receiving non-connectable or scannable undirected
4344 * advertising reports, this means that the remote device is
4345 * not connectable and then clearly indicate this in the
4346 * device found event.
4347 *
4348 * When receiving a scan response, then there is no way to
4349 * know if the remote device is connectable or not. However
4350 * since scan responses are merged with a previously seen
4351 * advertising report, the flags field from that report
4352 * will be used.
4353 *
4354 * In the really unlikely case that a controller get confused
4355 * and just sends a scan response event, then it is marked as
4356 * not connectable as well.
4357 */
4358 if (type == LE_ADV_NONCONN_IND || type == LE_ADV_SCAN_IND ||
4359 type == LE_ADV_SCAN_RSP)
4360 flags = MGMT_DEV_FOUND_NOT_CONNECTABLE;
4361 else
4362 flags = 0;
4363
Johan Hedbergb9a63282014-03-25 10:51:52 +02004364 /* If there's nothing pending either store the data from this
4365 * event or send an immediate device found event if the data
4366 * should not be stored for later.
4367 */
4368 if (!has_pending_adv_report(hdev)) {
4369 /* If the report will trigger a SCAN_REQ store it for
4370 * later merging.
4371 */
4372 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
4373 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004374 rssi, flags, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004375 return;
4376 }
4377
4378 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004379 rssi, flags, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004380 return;
4381 }
4382
Johan Hedberg474ee062014-03-25 14:34:59 +02004383 /* Check if the pending report is for the same device as the new one */
4384 match = (!bacmp(bdaddr, &d->last_adv_addr) &&
4385 bdaddr_type == d->last_adv_addr_type);
4386
Johan Hedbergb9a63282014-03-25 10:51:52 +02004387 /* If the pending data doesn't match this report or this isn't a
4388 * scan response (e.g. we got a duplicate ADV_IND) then force
4389 * sending of the pending data.
4390 */
Johan Hedberg474ee062014-03-25 14:34:59 +02004391 if (type != LE_ADV_SCAN_RSP || !match) {
4392 /* Send out whatever is in the cache, but skip duplicates */
4393 if (!match)
4394 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004395 d->last_adv_addr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004396 d->last_adv_rssi, d->last_adv_flags,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004397 d->last_adv_data,
Johan Hedberg474ee062014-03-25 14:34:59 +02004398 d->last_adv_data_len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004399
4400 /* If the new report will trigger a SCAN_REQ store it for
4401 * later merging.
4402 */
4403 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
4404 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004405 rssi, flags, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004406 return;
4407 }
4408
4409 /* The advertising reports cannot be merged, so clear
4410 * the pending report and send out a device found event.
4411 */
4412 clear_pending_adv_report(hdev);
Johan Hedberg5c5b93e2014-03-29 08:39:53 +02004413 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004414 rssi, flags, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004415 return;
4416 }
4417
4418 /* If we get here we've got a pending ADV_IND or ADV_SCAN_IND and
4419 * the new event is a SCAN_RSP. We can therefore proceed with
4420 * sending a merged device found event.
4421 */
4422 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004423 d->last_adv_addr_type, NULL, rssi, d->last_adv_flags,
Marcel Holtmann42bd6a52014-07-01 14:11:19 +02004424 d->last_adv_data, d->last_adv_data_len, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004425 clear_pending_adv_report(hdev);
Johan Hedberg4af605d2014-03-24 10:48:00 +02004426}
4427
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004428static void hci_le_adv_report_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andre Guedes9aa04c92011-05-26 16:23:51 -03004429{
Andre Guedese95beb42011-09-26 20:48:35 -03004430 u8 num_reports = skb->data[0];
4431 void *ptr = &skb->data[1];
Andre Guedes9aa04c92011-05-26 16:23:51 -03004432
Andre Guedesa4790db2014-02-26 20:21:47 -03004433 hci_dev_lock(hdev);
4434
Andre Guedese95beb42011-09-26 20:48:35 -03004435 while (num_reports--) {
4436 struct hci_ev_le_advertising_info *ev = ptr;
Johan Hedberg4af605d2014-03-24 10:48:00 +02004437 s8 rssi;
Andre Guedesa4790db2014-02-26 20:21:47 -03004438
Andre Guedes3c9e9192012-01-10 18:20:50 -03004439 rssi = ev->data[ev->length];
Johan Hedberg4af605d2014-03-24 10:48:00 +02004440 process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
4441 ev->bdaddr_type, rssi, ev->data, ev->length);
Andre Guedes3c9e9192012-01-10 18:20:50 -03004442
Andre Guedese95beb42011-09-26 20:48:35 -03004443 ptr += sizeof(*ev) + ev->length + 1;
Andre Guedes9aa04c92011-05-26 16:23:51 -03004444 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004445
4446 hci_dev_unlock(hdev);
Andre Guedes9aa04c92011-05-26 16:23:51 -03004447}
4448
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004449static void hci_le_ltk_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004450{
4451 struct hci_ev_le_ltk_req *ev = (void *) skb->data;
4452 struct hci_cp_le_ltk_reply cp;
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004453 struct hci_cp_le_ltk_neg_reply neg;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004454 struct hci_conn *conn;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004455 struct smp_ltk *ltk;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004456
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004457 BT_DBG("%s handle 0x%4.4x", hdev->name, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004458
4459 hci_dev_lock(hdev);
4460
4461 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004462 if (conn == NULL)
4463 goto not_found;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004464
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -08004465 ltk = hci_find_ltk(hdev, ev->ediv, ev->rand, conn->out);
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004466 if (ltk == NULL)
4467 goto not_found;
4468
4469 memcpy(cp.ltk, ltk->val, sizeof(ltk->val));
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004470 cp.handle = cpu_to_le16(conn->handle);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004471
4472 if (ltk->authenticated)
Andre Guedesf8776212013-07-31 16:25:28 -03004473 conn->pending_sec_level = BT_SECURITY_HIGH;
4474 else
4475 conn->pending_sec_level = BT_SECURITY_MEDIUM;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004476
Andre Guedes89cbb4d2013-07-31 16:25:29 -03004477 conn->enc_key_size = ltk->enc_size;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004478
4479 hci_send_cmd(hdev, HCI_OP_LE_LTK_REPLY, sizeof(cp), &cp);
4480
Claudio Takahasi5981a882013-07-25 16:34:24 -03004481 /* Ref. Bluetooth Core SPEC pages 1975 and 2004. STK is a
4482 * temporary key used to encrypt a connection following
4483 * pairing. It is used during the Encrypted Session Setup to
4484 * distribute the keys. Later, security can be re-established
4485 * using a distributed LTK.
4486 */
Johan Hedberg2ceba532014-06-16 19:25:16 +03004487 if (ltk->type == SMP_STK) {
Johan Hedbergfe59a052014-07-01 19:14:12 +03004488 set_bit(HCI_CONN_STK_ENCRYPT, &conn->flags);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004489 list_del(&ltk->list);
4490 kfree(ltk);
Johan Hedbergfe59a052014-07-01 19:14:12 +03004491 } else {
4492 clear_bit(HCI_CONN_STK_ENCRYPT, &conn->flags);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004493 }
4494
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004495 hci_dev_unlock(hdev);
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004496
4497 return;
4498
4499not_found:
4500 neg.handle = ev->handle;
4501 hci_send_cmd(hdev, HCI_OP_LE_LTK_NEG_REPLY, sizeof(neg), &neg);
4502 hci_dev_unlock(hdev);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004503}
4504
Andre Guedes8e75b462014-07-01 18:10:08 -03004505static void send_conn_param_neg_reply(struct hci_dev *hdev, u16 handle,
4506 u8 reason)
4507{
4508 struct hci_cp_le_conn_param_req_neg_reply cp;
4509
4510 cp.handle = cpu_to_le16(handle);
4511 cp.reason = reason;
4512
4513 hci_send_cmd(hdev, HCI_OP_LE_CONN_PARAM_REQ_NEG_REPLY, sizeof(cp),
4514 &cp);
4515}
4516
4517static void hci_le_remote_conn_param_req_evt(struct hci_dev *hdev,
4518 struct sk_buff *skb)
4519{
4520 struct hci_ev_le_remote_conn_param_req *ev = (void *) skb->data;
4521 struct hci_cp_le_conn_param_req_reply cp;
4522 struct hci_conn *hcon;
4523 u16 handle, min, max, latency, timeout;
4524
4525 handle = le16_to_cpu(ev->handle);
4526 min = le16_to_cpu(ev->interval_min);
4527 max = le16_to_cpu(ev->interval_max);
4528 latency = le16_to_cpu(ev->latency);
4529 timeout = le16_to_cpu(ev->timeout);
4530
4531 hcon = hci_conn_hash_lookup_handle(hdev, handle);
4532 if (!hcon || hcon->state != BT_CONNECTED)
4533 return send_conn_param_neg_reply(hdev, handle,
4534 HCI_ERROR_UNKNOWN_CONN_ID);
4535
4536 if (hci_check_conn_params(min, max, latency, timeout))
4537 return send_conn_param_neg_reply(hdev, handle,
4538 HCI_ERROR_INVALID_LL_PARAMS);
4539
Johan Hedberg348d50b2014-07-02 17:37:30 +03004540 if (test_bit(HCI_CONN_MASTER, &hcon->flags)) {
4541 struct hci_conn_params *params;
Johan Hedbergf4869e22014-07-02 17:37:32 +03004542 u8 store_hint;
Johan Hedberg348d50b2014-07-02 17:37:30 +03004543
4544 hci_dev_lock(hdev);
4545
4546 params = hci_conn_params_lookup(hdev, &hcon->dst,
4547 hcon->dst_type);
4548 if (params) {
4549 params->conn_min_interval = min;
4550 params->conn_max_interval = max;
4551 params->conn_latency = latency;
4552 params->supervision_timeout = timeout;
Johan Hedbergf4869e22014-07-02 17:37:32 +03004553 store_hint = 0x01;
4554 } else{
4555 store_hint = 0x00;
Johan Hedberg348d50b2014-07-02 17:37:30 +03004556 }
4557
4558 hci_dev_unlock(hdev);
4559
Johan Hedbergf4869e22014-07-02 17:37:32 +03004560 mgmt_new_conn_param(hdev, &hcon->dst, hcon->dst_type,
4561 store_hint, min, max, latency, timeout);
Johan Hedberg348d50b2014-07-02 17:37:30 +03004562 }
Andre Guedesffb5a8272014-07-01 18:10:11 -03004563
Andre Guedes8e75b462014-07-01 18:10:08 -03004564 cp.handle = ev->handle;
4565 cp.interval_min = ev->interval_min;
4566 cp.interval_max = ev->interval_max;
4567 cp.latency = ev->latency;
4568 cp.timeout = ev->timeout;
4569 cp.min_ce_len = 0;
4570 cp.max_ce_len = 0;
4571
4572 hci_send_cmd(hdev, HCI_OP_LE_CONN_PARAM_REQ_REPLY, sizeof(cp), &cp);
4573}
4574
Gustavo Padovan6039aa72012-05-23 04:04:18 -03004575static void hci_le_meta_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03004576{
4577 struct hci_ev_le_meta *le_ev = (void *) skb->data;
4578
4579 skb_pull(skb, sizeof(*le_ev));
4580
4581 switch (le_ev->subevent) {
4582 case HCI_EV_LE_CONN_COMPLETE:
4583 hci_le_conn_complete_evt(hdev, skb);
4584 break;
4585
Marcel Holtmann1855d922014-06-23 11:40:05 +02004586 case HCI_EV_LE_CONN_UPDATE_COMPLETE:
4587 hci_le_conn_update_complete_evt(hdev, skb);
4588 break;
4589
Andre Guedes9aa04c92011-05-26 16:23:51 -03004590 case HCI_EV_LE_ADVERTISING_REPORT:
4591 hci_le_adv_report_evt(hdev, skb);
4592 break;
4593
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004594 case HCI_EV_LE_LTK_REQ:
4595 hci_le_ltk_request_evt(hdev, skb);
4596 break;
4597
Andre Guedes8e75b462014-07-01 18:10:08 -03004598 case HCI_EV_LE_REMOTE_CONN_PARAM_REQ:
4599 hci_le_remote_conn_param_req_evt(hdev, skb);
4600 break;
4601
Ville Tervofcd89c02011-02-10 22:38:47 -03004602 default:
4603 break;
4604 }
4605}
4606
Andrei Emeltchenko9495b2e2012-09-27 17:26:22 +03004607static void hci_chan_selected_evt(struct hci_dev *hdev, struct sk_buff *skb)
4608{
4609 struct hci_ev_channel_selected *ev = (void *) skb->data;
4610 struct hci_conn *hcon;
4611
4612 BT_DBG("%s handle 0x%2.2x", hdev->name, ev->phy_handle);
4613
4614 skb_pull(skb, sizeof(*ev));
4615
4616 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4617 if (!hcon)
4618 return;
4619
4620 amp_read_loc_assoc_final_data(hdev, hcon);
4621}
4622
Linus Torvalds1da177e2005-04-16 15:20:36 -07004623void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)
4624{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004625 struct hci_event_hdr *hdr = (void *) skb->data;
4626 __u8 event = hdr->evt;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004627
Johan Hedbergb6ddb632013-04-02 13:34:31 +03004628 hci_dev_lock(hdev);
4629
4630 /* Received events are (currently) only needed when a request is
4631 * ongoing so avoid unnecessary memory allocation.
4632 */
4633 if (hdev->req_status == HCI_REQ_PEND) {
4634 kfree_skb(hdev->recv_evt);
4635 hdev->recv_evt = skb_clone(skb, GFP_KERNEL);
4636 }
4637
4638 hci_dev_unlock(hdev);
4639
Linus Torvalds1da177e2005-04-16 15:20:36 -07004640 skb_pull(skb, HCI_EVENT_HDR_SIZE);
4641
Johan Hedberg02350a72013-04-03 21:50:29 +03004642 if (hdev->sent_cmd && bt_cb(hdev->sent_cmd)->req.event == event) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02004643 struct hci_command_hdr *cmd_hdr = (void *) hdev->sent_cmd->data;
4644 u16 opcode = __le16_to_cpu(cmd_hdr->opcode);
Johan Hedberg02350a72013-04-03 21:50:29 +03004645
4646 hci_req_cmd_complete(hdev, opcode, 0);
4647 }
4648
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004649 switch (event) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004650 case HCI_EV_INQUIRY_COMPLETE:
4651 hci_inquiry_complete_evt(hdev, skb);
4652 break;
4653
4654 case HCI_EV_INQUIRY_RESULT:
4655 hci_inquiry_result_evt(hdev, skb);
4656 break;
4657
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004658 case HCI_EV_CONN_COMPLETE:
4659 hci_conn_complete_evt(hdev, skb);
Marcel Holtmann21d9e302005-09-13 01:32:25 +02004660 break;
4661
Linus Torvalds1da177e2005-04-16 15:20:36 -07004662 case HCI_EV_CONN_REQUEST:
4663 hci_conn_request_evt(hdev, skb);
4664 break;
4665
Linus Torvalds1da177e2005-04-16 15:20:36 -07004666 case HCI_EV_DISCONN_COMPLETE:
4667 hci_disconn_complete_evt(hdev, skb);
4668 break;
4669
Linus Torvalds1da177e2005-04-16 15:20:36 -07004670 case HCI_EV_AUTH_COMPLETE:
4671 hci_auth_complete_evt(hdev, skb);
4672 break;
4673
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004674 case HCI_EV_REMOTE_NAME:
4675 hci_remote_name_evt(hdev, skb);
4676 break;
4677
Linus Torvalds1da177e2005-04-16 15:20:36 -07004678 case HCI_EV_ENCRYPT_CHANGE:
4679 hci_encrypt_change_evt(hdev, skb);
4680 break;
4681
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004682 case HCI_EV_CHANGE_LINK_KEY_COMPLETE:
4683 hci_change_link_key_complete_evt(hdev, skb);
4684 break;
4685
4686 case HCI_EV_REMOTE_FEATURES:
4687 hci_remote_features_evt(hdev, skb);
4688 break;
4689
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004690 case HCI_EV_CMD_COMPLETE:
4691 hci_cmd_complete_evt(hdev, skb);
4692 break;
4693
4694 case HCI_EV_CMD_STATUS:
4695 hci_cmd_status_evt(hdev, skb);
4696 break;
4697
4698 case HCI_EV_ROLE_CHANGE:
4699 hci_role_change_evt(hdev, skb);
4700 break;
4701
4702 case HCI_EV_NUM_COMP_PKTS:
4703 hci_num_comp_pkts_evt(hdev, skb);
4704 break;
4705
4706 case HCI_EV_MODE_CHANGE:
4707 hci_mode_change_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004708 break;
4709
4710 case HCI_EV_PIN_CODE_REQ:
4711 hci_pin_code_request_evt(hdev, skb);
4712 break;
4713
4714 case HCI_EV_LINK_KEY_REQ:
4715 hci_link_key_request_evt(hdev, skb);
4716 break;
4717
4718 case HCI_EV_LINK_KEY_NOTIFY:
4719 hci_link_key_notify_evt(hdev, skb);
4720 break;
4721
4722 case HCI_EV_CLOCK_OFFSET:
4723 hci_clock_offset_evt(hdev, skb);
4724 break;
4725
Marcel Holtmanna8746412008-07-14 20:13:46 +02004726 case HCI_EV_PKT_TYPE_CHANGE:
4727 hci_pkt_type_change_evt(hdev, skb);
4728 break;
4729
Marcel Holtmann85a1e932005-08-09 20:28:02 -07004730 case HCI_EV_PSCAN_REP_MODE:
4731 hci_pscan_rep_mode_evt(hdev, skb);
4732 break;
4733
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004734 case HCI_EV_INQUIRY_RESULT_WITH_RSSI:
4735 hci_inquiry_result_with_rssi_evt(hdev, skb);
4736 break;
4737
4738 case HCI_EV_REMOTE_EXT_FEATURES:
4739 hci_remote_ext_features_evt(hdev, skb);
4740 break;
4741
4742 case HCI_EV_SYNC_CONN_COMPLETE:
4743 hci_sync_conn_complete_evt(hdev, skb);
4744 break;
4745
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004746 case HCI_EV_EXTENDED_INQUIRY_RESULT:
4747 hci_extended_inquiry_result_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004748 break;
4749
Johan Hedberg1c2e0042012-06-08 23:31:13 +08004750 case HCI_EV_KEY_REFRESH_COMPLETE:
4751 hci_key_refresh_complete_evt(hdev, skb);
4752 break;
4753
Marcel Holtmann04936842008-07-14 20:13:48 +02004754 case HCI_EV_IO_CAPA_REQUEST:
4755 hci_io_capa_request_evt(hdev, skb);
4756 break;
4757
Johan Hedberg03b555e2011-01-04 15:40:05 +02004758 case HCI_EV_IO_CAPA_REPLY:
4759 hci_io_capa_reply_evt(hdev, skb);
4760 break;
4761
Johan Hedberga5c29682011-02-19 12:05:57 -03004762 case HCI_EV_USER_CONFIRM_REQUEST:
4763 hci_user_confirm_request_evt(hdev, skb);
4764 break;
4765
Brian Gix1143d452011-11-23 08:28:34 -08004766 case HCI_EV_USER_PASSKEY_REQUEST:
4767 hci_user_passkey_request_evt(hdev, skb);
4768 break;
4769
Johan Hedberg92a25252012-09-06 18:39:26 +03004770 case HCI_EV_USER_PASSKEY_NOTIFY:
4771 hci_user_passkey_notify_evt(hdev, skb);
4772 break;
4773
4774 case HCI_EV_KEYPRESS_NOTIFY:
4775 hci_keypress_notify_evt(hdev, skb);
4776 break;
4777
Marcel Holtmann04936842008-07-14 20:13:48 +02004778 case HCI_EV_SIMPLE_PAIR_COMPLETE:
4779 hci_simple_pair_complete_evt(hdev, skb);
4780 break;
4781
Marcel Holtmann41a96212008-07-14 20:13:48 +02004782 case HCI_EV_REMOTE_HOST_FEATURES:
4783 hci_remote_host_features_evt(hdev, skb);
4784 break;
4785
Ville Tervofcd89c02011-02-10 22:38:47 -03004786 case HCI_EV_LE_META:
4787 hci_le_meta_evt(hdev, skb);
4788 break;
4789
Andrei Emeltchenko9495b2e2012-09-27 17:26:22 +03004790 case HCI_EV_CHANNEL_SELECTED:
4791 hci_chan_selected_evt(hdev, skb);
4792 break;
4793
Szymon Janc2763eda2011-03-22 13:12:22 +01004794 case HCI_EV_REMOTE_OOB_DATA_REQUEST:
4795 hci_remote_oob_data_request_evt(hdev, skb);
4796 break;
4797
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004798 case HCI_EV_PHY_LINK_COMPLETE:
4799 hci_phy_link_complete_evt(hdev, skb);
4800 break;
4801
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004802 case HCI_EV_LOGICAL_LINK_COMPLETE:
4803 hci_loglink_complete_evt(hdev, skb);
4804 break;
4805
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02004806 case HCI_EV_DISCONN_LOGICAL_LINK_COMPLETE:
4807 hci_disconn_loglink_complete_evt(hdev, skb);
4808 break;
4809
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02004810 case HCI_EV_DISCONN_PHY_LINK_COMPLETE:
4811 hci_disconn_phylink_complete_evt(hdev, skb);
4812 break;
4813
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02004814 case HCI_EV_NUM_COMP_BLOCKS:
4815 hci_num_comp_blocks_evt(hdev, skb);
4816 break;
4817
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004818 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004819 BT_DBG("%s event 0x%2.2x", hdev->name, event);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004820 break;
4821 }
4822
4823 kfree_skb(skb);
4824 hdev->stat.evt_rx++;
4825}