blob: c8ae9ee3cb12bfcd3f08c980283e2158db29eba0 [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 Padovan6039aa732012-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 Padovan6039aa732012-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 Padovan6039aa732012-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 Padovan6039aa732012-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 Padovan6039aa732012-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 Padovan6039aa732012-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 Padovan6039aa732012-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 Padovan6039aa732012-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 Dalleau20714bf2012-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 Dalleau20714bf2012-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
Johan Hedberga55bd292014-07-09 12:59:19 +03002152 if (test_bit(HCI_CONNECTABLE, &hdev->dev_flags)) {
2153 if (hci_bdaddr_list_lookup(&hdev->blacklist, &ev->bdaddr,
2154 BDADDR_BREDR)) {
2155 hci_reject_conn(hdev, &ev->bdaddr);
2156 return;
2157 }
2158 } else {
2159 if (!hci_bdaddr_list_lookup(&hdev->whitelist, &ev->bdaddr,
2160 BDADDR_BREDR)) {
2161 hci_reject_conn(hdev, &ev->bdaddr);
2162 return;
2163 }
Johan Hedberg70c46422014-07-09 12:59:17 +03002164 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002165
Johan Hedberg70c46422014-07-09 12:59:17 +03002166 /* Connection accepted */
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002167
Johan Hedberg70c46422014-07-09 12:59:17 +03002168 hci_dev_lock(hdev);
Marcel Holtmannc7bdd502008-07-14 20:13:47 +02002169
Johan Hedberg70c46422014-07-09 12:59:17 +03002170 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
2171 if (ie)
2172 memcpy(ie->data.dev_class, ev->dev_class, 3);
2173
2174 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type,
2175 &ev->bdaddr);
2176 if (!conn) {
2177 conn = hci_conn_add(hdev, ev->link_type, &ev->bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002178 if (!conn) {
Johan Hedberg70c46422014-07-09 12:59:17 +03002179 BT_ERR("No memory for new connection");
2180 hci_dev_unlock(hdev);
2181 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002182 }
Johan Hedberg70c46422014-07-09 12:59:17 +03002183 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002184
Johan Hedberg70c46422014-07-09 12:59:17 +03002185 memcpy(conn->dev_class, ev->dev_class, 3);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02002186
Johan Hedberg70c46422014-07-09 12:59:17 +03002187 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002188
Johan Hedberg70c46422014-07-09 12:59:17 +03002189 if (ev->link_type == ACL_LINK ||
2190 (!(flags & HCI_PROTO_DEFER) && !lmp_esco_capable(hdev))) {
2191 struct hci_cp_accept_conn_req cp;
2192 conn->state = BT_CONNECT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002193
2194 bacpy(&cp.bdaddr, &ev->bdaddr);
Johan Hedberg70c46422014-07-09 12:59:17 +03002195
2196 if (lmp_rswitch_capable(hdev) && (mask & HCI_LM_MASTER))
2197 cp.role = 0x00; /* Become master */
2198 else
2199 cp.role = 0x01; /* Remain slave */
2200
2201 hci_send_cmd(hdev, HCI_OP_ACCEPT_CONN_REQ, sizeof(cp), &cp);
2202 } else if (!(flags & HCI_PROTO_DEFER)) {
2203 struct hci_cp_accept_sync_conn_req cp;
2204 conn->state = BT_CONNECT;
2205
2206 bacpy(&cp.bdaddr, &ev->bdaddr);
2207 cp.pkt_type = cpu_to_le16(conn->pkt_type);
2208
2209 cp.tx_bandwidth = cpu_to_le32(0x00001f40);
2210 cp.rx_bandwidth = cpu_to_le32(0x00001f40);
2211 cp.max_latency = cpu_to_le16(0xffff);
2212 cp.content_format = cpu_to_le16(hdev->voice_setting);
2213 cp.retrans_effort = 0xff;
2214
2215 hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ, sizeof(cp),
2216 &cp);
2217 } else {
2218 conn->state = BT_CONNECT2;
2219 hci_proto_connect_cfm(conn, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002220 }
2221}
2222
Mikel Astizf0d6a0e2012-08-09 09:52:30 +02002223static u8 hci_to_mgmt_reason(u8 err)
2224{
2225 switch (err) {
2226 case HCI_ERROR_CONNECTION_TIMEOUT:
2227 return MGMT_DEV_DISCONN_TIMEOUT;
2228 case HCI_ERROR_REMOTE_USER_TERM:
2229 case HCI_ERROR_REMOTE_LOW_RESOURCES:
2230 case HCI_ERROR_REMOTE_POWER_OFF:
2231 return MGMT_DEV_DISCONN_REMOTE;
2232 case HCI_ERROR_LOCAL_HOST_TERM:
2233 return MGMT_DEV_DISCONN_LOCAL_HOST;
2234 default:
2235 return MGMT_DEV_DISCONN_UNKNOWN;
2236 }
2237}
2238
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002239static void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002240{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002241 struct hci_ev_disconn_complete *ev = (void *) skb->data;
Andre Guedesabf54a52013-11-07 17:36:09 -03002242 u8 reason = hci_to_mgmt_reason(ev->reason);
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002243 struct hci_conn_params *params;
Marcel Holtmann04837f62006-07-03 10:02:33 +02002244 struct hci_conn *conn;
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002245 bool mgmt_connected;
Andre Guedes38462202013-11-07 17:36:10 -03002246 u8 type;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002247
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002248 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002249
Linus Torvalds1da177e2005-04-16 15:20:36 -07002250 hci_dev_lock(hdev);
2251
Marcel Holtmann04837f62006-07-03 10:02:33 +02002252 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergf7520542011-01-20 12:34:39 +02002253 if (!conn)
2254 goto unlock;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02002255
Andre Guedesabf54a52013-11-07 17:36:09 -03002256 if (ev->status) {
2257 mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
2258 conn->dst_type, ev->status);
2259 goto unlock;
Johan Hedberg37d9ef72011-11-10 15:54:39 +02002260 }
Johan Hedbergf7520542011-01-20 12:34:39 +02002261
Andre Guedes38462202013-11-07 17:36:10 -03002262 conn->state = BT_CLOSED;
2263
Johan Hedberg12d4a3b2014-02-24 14:52:18 +02002264 mgmt_connected = test_and_clear_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags);
2265 mgmt_device_disconnected(hdev, &conn->dst, conn->type, conn->dst_type,
2266 reason, mgmt_connected);
Andre Guedesabf54a52013-11-07 17:36:09 -03002267
Johan Hedbergaf6a9c32014-06-24 13:15:53 +03002268 if (conn->type == ACL_LINK &&
2269 test_bit(HCI_CONN_FLUSH_KEY, &conn->flags))
Andre Guedes38462202013-11-07 17:36:10 -03002270 hci_remove_link_key(hdev, &conn->dst);
Johan Hedberg22102462013-10-05 12:01:06 +02002271
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002272 params = hci_conn_params_lookup(hdev, &conn->dst, conn->dst_type);
2273 if (params) {
2274 switch (params->auto_connect) {
2275 case HCI_AUTO_CONN_LINK_LOSS:
2276 if (ev->reason != HCI_ERROR_CONNECTION_TIMEOUT)
2277 break;
2278 /* Fall through */
2279
2280 case HCI_AUTO_CONN_ALWAYS:
Johan Hedberg418025d2014-07-04 12:37:24 +03002281 list_del_init(&params->action);
2282 list_add(&params->action, &hdev->pend_le_conns);
2283 hci_update_background_scan(hdev);
Andre Guedes9fcb18e2014-02-26 20:21:48 -03002284 break;
2285
2286 default:
2287 break;
2288 }
2289 }
2290
Andre Guedes38462202013-11-07 17:36:10 -03002291 type = conn->type;
Johan Hedberg22102462013-10-05 12:01:06 +02002292
Andre Guedes38462202013-11-07 17:36:10 -03002293 hci_proto_disconn_cfm(conn, ev->reason);
2294 hci_conn_del(conn);
2295
2296 /* Re-enable advertising if necessary, since it might
2297 * have been disabled by the connection. From the
2298 * HCI_LE_Set_Advertise_Enable command description in
2299 * the core specification (v4.0):
2300 * "The Controller shall continue advertising until the Host
2301 * issues an LE_Set_Advertise_Enable command with
2302 * Advertising_Enable set to 0x00 (Advertising is disabled)
2303 * or until a connection is created or until the Advertising
2304 * is timed out due to Directed Advertising."
2305 */
2306 if (type == LE_LINK)
2307 mgmt_reenable_advertising(hdev);
Johan Hedbergf7520542011-01-20 12:34:39 +02002308
2309unlock:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002310 hci_dev_unlock(hdev);
2311}
2312
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002313static void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002314{
2315 struct hci_ev_auth_complete *ev = (void *) skb->data;
2316 struct hci_conn *conn;
2317
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002318 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002319
2320 hci_dev_lock(hdev);
2321
2322 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002323 if (!conn)
2324 goto unlock;
2325
2326 if (!ev->status) {
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002327 if (!hci_conn_ssp_enabled(conn) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03002328 test_bit(HCI_CONN_REAUTH_PEND, &conn->flags)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002329 BT_INFO("re-auth of legacy device is not possible.");
Johan Hedberg2a611692011-02-19 12:06:00 -03002330 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002331 set_bit(HCI_CONN_AUTH, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002332 conn->sec_level = conn->pending_sec_level;
Johan Hedberg2a611692011-02-19 12:06:00 -03002333 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002334 } else {
Johan Hedbergbab73cb2012-02-09 16:07:29 +02002335 mgmt_auth_failed(hdev, &conn->dst, conn->type, conn->dst_type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002336 ev->status);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002337 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002338
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002339 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
2340 clear_bit(HCI_CONN_REAUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002341
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002342 if (conn->state == BT_CONFIG) {
Johan Hedbergaa64a8b2012-01-18 21:33:12 +02002343 if (!ev->status && hci_conn_ssp_enabled(conn)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002344 struct hci_cp_set_conn_encrypt cp;
2345 cp.handle = ev->handle;
2346 cp.encrypt = 0x01;
2347 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002348 &cp);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002349 } else {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002350 conn->state = BT_CONNECTED;
2351 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002352 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002353 }
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002354 } else {
2355 hci_auth_cfm(conn, ev->status);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02002356
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002357 hci_conn_hold(conn);
2358 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02002359 hci_conn_drop(conn);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002360 }
2361
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002362 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags)) {
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002363 if (!ev->status) {
2364 struct hci_cp_set_conn_encrypt cp;
2365 cp.handle = ev->handle;
2366 cp.encrypt = 0x01;
2367 hci_send_cmd(hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
Gustavo Padovan807deac2012-05-17 00:36:24 -03002368 &cp);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002369 } else {
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002370 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002371 hci_encrypt_cfm(conn, ev->status, 0x00);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002372 }
2373 }
2374
Waldemar Rymarkiewiczd7556e22011-05-31 15:49:26 +02002375unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002376 hci_dev_unlock(hdev);
2377}
2378
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002379static void hci_remote_name_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002380{
Johan Hedberg127178d2010-11-18 22:22:29 +02002381 struct hci_ev_remote_name *ev = (void *) skb->data;
2382 struct hci_conn *conn;
2383
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002384 BT_DBG("%s", hdev->name);
2385
2386 hci_conn_check_pending(hdev);
Johan Hedberg127178d2010-11-18 22:22:29 +02002387
2388 hci_dev_lock(hdev);
2389
2390 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002391
2392 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
2393 goto check_auth;
2394
2395 if (ev->status == 0)
2396 hci_check_pending_name(hdev, conn, &ev->bdaddr, ev->name,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002397 strnlen(ev->name, HCI_MAX_NAME_LENGTH));
Johan Hedbergb644ba32012-01-17 21:48:47 +02002398 else
2399 hci_check_pending_name(hdev, conn, &ev->bdaddr, NULL, 0);
2400
2401check_auth:
Johan Hedberg79c6c702011-04-28 11:28:55 -07002402 if (!conn)
2403 goto unlock;
2404
2405 if (!hci_outgoing_auth_needed(hdev, conn))
2406 goto unlock;
2407
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002408 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002409 struct hci_cp_auth_requested cp;
2410 cp.handle = __cpu_to_le16(conn->handle);
2411 hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED, sizeof(cp), &cp);
2412 }
2413
Johan Hedberg79c6c702011-04-28 11:28:55 -07002414unlock:
Johan Hedberg127178d2010-11-18 22:22:29 +02002415 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002416}
2417
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002418static void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002419{
2420 struct hci_ev_encrypt_change *ev = (void *) skb->data;
2421 struct hci_conn *conn;
2422
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002423 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002424
2425 hci_dev_lock(hdev);
2426
2427 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002428 if (!conn)
2429 goto unlock;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002430
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002431 if (!ev->status) {
2432 if (ev->encrypt) {
2433 /* Encryption implies authentication */
Johan Hedberg4dae2792014-06-24 17:03:50 +03002434 set_bit(HCI_CONN_AUTH, &conn->flags);
2435 set_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002436 conn->sec_level = conn->pending_sec_level;
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002437
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002438 /* P-256 authentication key implies FIPS */
2439 if (conn->key_type == HCI_LK_AUTH_COMBINATION_P256)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002440 set_bit(HCI_CONN_FIPS, &conn->flags);
Marcel Holtmann914a6ff2014-02-01 11:52:02 -08002441
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002442 if ((conn->type == ACL_LINK && ev->encrypt == 0x02) ||
2443 conn->type == LE_LINK)
2444 set_bit(HCI_CONN_AES_CCM, &conn->flags);
2445 } else {
Johan Hedberg4dae2792014-06-24 17:03:50 +03002446 clear_bit(HCI_CONN_ENCRYPT, &conn->flags);
Marcel Holtmannabf76ba2014-01-31 16:24:28 -08002447 clear_bit(HCI_CONN_AES_CCM, &conn->flags);
2448 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002449 }
2450
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002451 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
2452
2453 if (ev->status && conn->state == BT_CONNECTED) {
2454 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
2455 hci_conn_drop(conn);
2456 goto unlock;
2457 }
2458
2459 if (conn->state == BT_CONFIG) {
2460 if (!ev->status)
2461 conn->state = BT_CONNECTED;
2462
Marcel Holtmann40b552a2014-03-19 14:10:25 -07002463 /* In Secure Connections Only mode, do not allow any
2464 * connections that are not encrypted with AES-CCM
2465 * using a P-256 authenticated combination key.
2466 */
2467 if (test_bit(HCI_SC_ONLY, &hdev->dev_flags) &&
2468 (!test_bit(HCI_CONN_AES_CCM, &conn->flags) ||
2469 conn->key_type != HCI_LK_AUTH_COMBINATION_P256)) {
2470 hci_proto_connect_cfm(conn, HCI_ERROR_AUTH_FAILURE);
2471 hci_conn_drop(conn);
2472 goto unlock;
2473 }
2474
Marcel Holtmanndc8357c2014-01-31 16:24:27 -08002475 hci_proto_connect_cfm(conn, ev->status);
2476 hci_conn_drop(conn);
2477 } else
2478 hci_encrypt_cfm(conn, ev->status, ev->encrypt);
2479
Gustavo Padovana7d77232012-05-13 03:20:07 -03002480unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002481 hci_dev_unlock(hdev);
2482}
2483
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002484static void hci_change_link_key_complete_evt(struct hci_dev *hdev,
2485 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002486{
2487 struct hci_ev_change_link_key_complete *ev = (void *) skb->data;
2488 struct hci_conn *conn;
2489
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002490 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002491
2492 hci_dev_lock(hdev);
2493
2494 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
2495 if (conn) {
2496 if (!ev->status)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002497 set_bit(HCI_CONN_SECURE, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002498
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002499 clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002500
2501 hci_key_change_cfm(conn, ev->status);
2502 }
2503
2504 hci_dev_unlock(hdev);
2505}
2506
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002507static void hci_remote_features_evt(struct hci_dev *hdev,
2508 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002509{
2510 struct hci_ev_remote_features *ev = (void *) skb->data;
2511 struct hci_conn *conn;
2512
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002513 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002514
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002515 hci_dev_lock(hdev);
2516
2517 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02002518 if (!conn)
2519 goto unlock;
Marcel Holtmann769be972008-07-14 20:13:49 +02002520
Johan Hedbergccd556f2010-11-10 17:11:51 +02002521 if (!ev->status)
Johan Hedbergcad718e2013-04-17 15:00:51 +03002522 memcpy(conn->features[0], ev->features, 8);
Johan Hedbergccd556f2010-11-10 17:11:51 +02002523
2524 if (conn->state != BT_CONFIG)
2525 goto unlock;
2526
2527 if (!ev->status && lmp_ssp_capable(hdev) && lmp_ssp_capable(conn)) {
2528 struct hci_cp_read_remote_ext_features cp;
2529 cp.handle = ev->handle;
2530 cp.page = 0x01;
2531 hci_send_cmd(hdev, HCI_OP_READ_REMOTE_EXT_FEATURES,
Gustavo Padovan807deac2012-05-17 00:36:24 -03002532 sizeof(cp), &cp);
Johan Hedberg392599b2010-11-18 22:22:28 +02002533 goto unlock;
2534 }
2535
Johan Hedberg671267b2012-05-12 16:11:50 -03002536 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02002537 struct hci_cp_remote_name_req cp;
2538 memset(&cp, 0, sizeof(cp));
2539 bacpy(&cp.bdaddr, &conn->dst);
2540 cp.pscan_rep_mode = 0x02;
2541 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02002542 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
2543 mgmt_device_connected(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002544 conn->dst_type, 0, NULL, 0,
2545 conn->dev_class);
Johan Hedberg392599b2010-11-18 22:22:28 +02002546
Johan Hedberg127178d2010-11-18 22:22:29 +02002547 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02002548 conn->state = BT_CONNECTED;
2549 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02002550 hci_conn_drop(conn);
Marcel Holtmann769be972008-07-14 20:13:49 +02002551 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002552
Johan Hedbergccd556f2010-11-10 17:11:51 +02002553unlock:
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002554 hci_dev_unlock(hdev);
2555}
2556
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002557static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002558{
2559 struct hci_ev_cmd_complete *ev = (void *) skb->data;
Johan Hedberg9238f362013-03-05 20:37:48 +02002560 u8 status = skb->data[sizeof(*ev)];
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002561 __u16 opcode;
2562
2563 skb_pull(skb, sizeof(*ev));
2564
2565 opcode = __le16_to_cpu(ev->opcode);
2566
2567 switch (opcode) {
2568 case HCI_OP_INQUIRY_CANCEL:
2569 hci_cc_inquiry_cancel(hdev, skb);
2570 break;
2571
Andre Guedes4d934832012-03-21 00:03:35 -03002572 case HCI_OP_PERIODIC_INQ:
2573 hci_cc_periodic_inq(hdev, skb);
2574 break;
2575
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002576 case HCI_OP_EXIT_PERIODIC_INQ:
2577 hci_cc_exit_periodic_inq(hdev, skb);
2578 break;
2579
2580 case HCI_OP_REMOTE_NAME_REQ_CANCEL:
2581 hci_cc_remote_name_req_cancel(hdev, skb);
2582 break;
2583
2584 case HCI_OP_ROLE_DISCOVERY:
2585 hci_cc_role_discovery(hdev, skb);
2586 break;
2587
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002588 case HCI_OP_READ_LINK_POLICY:
2589 hci_cc_read_link_policy(hdev, skb);
2590 break;
2591
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002592 case HCI_OP_WRITE_LINK_POLICY:
2593 hci_cc_write_link_policy(hdev, skb);
2594 break;
2595
Marcel Holtmanne4e8e372008-07-14 20:13:47 +02002596 case HCI_OP_READ_DEF_LINK_POLICY:
2597 hci_cc_read_def_link_policy(hdev, skb);
2598 break;
2599
2600 case HCI_OP_WRITE_DEF_LINK_POLICY:
2601 hci_cc_write_def_link_policy(hdev, skb);
2602 break;
2603
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002604 case HCI_OP_RESET:
2605 hci_cc_reset(hdev, skb);
2606 break;
2607
2608 case HCI_OP_WRITE_LOCAL_NAME:
2609 hci_cc_write_local_name(hdev, skb);
2610 break;
2611
2612 case HCI_OP_READ_LOCAL_NAME:
2613 hci_cc_read_local_name(hdev, skb);
2614 break;
2615
2616 case HCI_OP_WRITE_AUTH_ENABLE:
2617 hci_cc_write_auth_enable(hdev, skb);
2618 break;
2619
2620 case HCI_OP_WRITE_ENCRYPT_MODE:
2621 hci_cc_write_encrypt_mode(hdev, skb);
2622 break;
2623
2624 case HCI_OP_WRITE_SCAN_ENABLE:
2625 hci_cc_write_scan_enable(hdev, skb);
2626 break;
2627
2628 case HCI_OP_READ_CLASS_OF_DEV:
2629 hci_cc_read_class_of_dev(hdev, skb);
2630 break;
2631
2632 case HCI_OP_WRITE_CLASS_OF_DEV:
2633 hci_cc_write_class_of_dev(hdev, skb);
2634 break;
2635
2636 case HCI_OP_READ_VOICE_SETTING:
2637 hci_cc_read_voice_setting(hdev, skb);
2638 break;
2639
2640 case HCI_OP_WRITE_VOICE_SETTING:
2641 hci_cc_write_voice_setting(hdev, skb);
2642 break;
2643
Marcel Holtmannb4cb9fb2013-10-14 13:56:16 -07002644 case HCI_OP_READ_NUM_SUPPORTED_IAC:
2645 hci_cc_read_num_supported_iac(hdev, skb);
2646 break;
2647
Marcel Holtmann333140b2008-07-14 20:13:48 +02002648 case HCI_OP_WRITE_SSP_MODE:
2649 hci_cc_write_ssp_mode(hdev, skb);
2650 break;
2651
Marcel Holtmanneac83dc2014-01-10 02:07:23 -08002652 case HCI_OP_WRITE_SC_SUPPORT:
2653 hci_cc_write_sc_support(hdev, skb);
2654 break;
2655
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002656 case HCI_OP_READ_LOCAL_VERSION:
2657 hci_cc_read_local_version(hdev, skb);
2658 break;
2659
2660 case HCI_OP_READ_LOCAL_COMMANDS:
2661 hci_cc_read_local_commands(hdev, skb);
2662 break;
2663
2664 case HCI_OP_READ_LOCAL_FEATURES:
2665 hci_cc_read_local_features(hdev, skb);
2666 break;
2667
Andre Guedes971e3a42011-06-30 19:20:52 -03002668 case HCI_OP_READ_LOCAL_EXT_FEATURES:
2669 hci_cc_read_local_ext_features(hdev, skb);
2670 break;
2671
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002672 case HCI_OP_READ_BUFFER_SIZE:
2673 hci_cc_read_buffer_size(hdev, skb);
2674 break;
2675
2676 case HCI_OP_READ_BD_ADDR:
2677 hci_cc_read_bd_addr(hdev, skb);
2678 break;
2679
Johan Hedbergf332ec62013-03-15 17:07:11 -05002680 case HCI_OP_READ_PAGE_SCAN_ACTIVITY:
2681 hci_cc_read_page_scan_activity(hdev, skb);
2682 break;
2683
Johan Hedberg4a3ee762013-03-15 17:07:12 -05002684 case HCI_OP_WRITE_PAGE_SCAN_ACTIVITY:
2685 hci_cc_write_page_scan_activity(hdev, skb);
2686 break;
2687
Johan Hedbergf332ec62013-03-15 17:07:11 -05002688 case HCI_OP_READ_PAGE_SCAN_TYPE:
2689 hci_cc_read_page_scan_type(hdev, skb);
2690 break;
2691
Johan Hedberg4a3ee762013-03-15 17:07:12 -05002692 case HCI_OP_WRITE_PAGE_SCAN_TYPE:
2693 hci_cc_write_page_scan_type(hdev, skb);
2694 break;
2695
Andrei Emeltchenko350ee4c2011-12-07 15:56:51 +02002696 case HCI_OP_READ_DATA_BLOCK_SIZE:
2697 hci_cc_read_data_block_size(hdev, skb);
2698 break;
2699
Andrei Emeltchenko1e89cff2011-11-24 14:52:02 +02002700 case HCI_OP_READ_FLOW_CONTROL_MODE:
2701 hci_cc_read_flow_control_mode(hdev, skb);
2702 break;
2703
Andrei Emeltchenko928abaa2011-10-12 10:53:57 +03002704 case HCI_OP_READ_LOCAL_AMP_INFO:
2705 hci_cc_read_local_amp_info(hdev, skb);
2706 break;
2707
Johan Hedberg33f35722014-06-28 17:54:06 +03002708 case HCI_OP_READ_CLOCK:
2709 hci_cc_read_clock(hdev, skb);
2710 break;
2711
Andrei Emeltchenko903e4542012-09-27 17:26:09 +03002712 case HCI_OP_READ_LOCAL_AMP_ASSOC:
2713 hci_cc_read_local_amp_assoc(hdev, skb);
2714 break;
2715
Johan Hedbergd5859e22011-01-25 01:19:58 +02002716 case HCI_OP_READ_INQ_RSP_TX_POWER:
2717 hci_cc_read_inq_rsp_tx_power(hdev, skb);
2718 break;
2719
Johan Hedberg980e1a52011-01-22 06:10:07 +02002720 case HCI_OP_PIN_CODE_REPLY:
2721 hci_cc_pin_code_reply(hdev, skb);
2722 break;
2723
2724 case HCI_OP_PIN_CODE_NEG_REPLY:
2725 hci_cc_pin_code_neg_reply(hdev, skb);
2726 break;
2727
Szymon Jancc35938b2011-03-22 13:12:21 +01002728 case HCI_OP_READ_LOCAL_OOB_DATA:
Marcel Holtmann4d2d2792014-01-10 02:07:26 -08002729 hci_cc_read_local_oob_data(hdev, skb);
2730 break;
2731
2732 case HCI_OP_READ_LOCAL_OOB_EXT_DATA:
2733 hci_cc_read_local_oob_ext_data(hdev, skb);
Szymon Jancc35938b2011-03-22 13:12:21 +01002734 break;
2735
Ville Tervo6ed58ec2011-02-10 22:38:48 -03002736 case HCI_OP_LE_READ_BUFFER_SIZE:
2737 hci_cc_le_read_buffer_size(hdev, skb);
2738 break;
2739
Johan Hedberg60e77322013-01-22 14:01:59 +02002740 case HCI_OP_LE_READ_LOCAL_FEATURES:
2741 hci_cc_le_read_local_features(hdev, skb);
2742 break;
2743
Johan Hedberg8fa19092012-10-19 20:57:49 +03002744 case HCI_OP_LE_READ_ADV_TX_POWER:
2745 hci_cc_le_read_adv_tx_power(hdev, skb);
2746 break;
2747
Johan Hedberga5c29682011-02-19 12:05:57 -03002748 case HCI_OP_USER_CONFIRM_REPLY:
2749 hci_cc_user_confirm_reply(hdev, skb);
2750 break;
2751
2752 case HCI_OP_USER_CONFIRM_NEG_REPLY:
2753 hci_cc_user_confirm_neg_reply(hdev, skb);
2754 break;
2755
Brian Gix1143d452011-11-23 08:28:34 -08002756 case HCI_OP_USER_PASSKEY_REPLY:
2757 hci_cc_user_passkey_reply(hdev, skb);
2758 break;
2759
2760 case HCI_OP_USER_PASSKEY_NEG_REPLY:
2761 hci_cc_user_passkey_neg_reply(hdev, skb);
Szymon Janc16cde992012-04-13 12:32:42 +02002762 break;
Andre Guedes07f7fa52011-12-02 21:13:31 +09002763
Marcel Holtmann7a4cd512014-02-19 19:52:13 -08002764 case HCI_OP_LE_SET_RANDOM_ADDR:
2765 hci_cc_le_set_random_addr(hdev, skb);
2766 break;
2767
Johan Hedbergc1d5dc42012-11-08 01:23:01 +01002768 case HCI_OP_LE_SET_ADV_ENABLE:
2769 hci_cc_le_set_adv_enable(hdev, skb);
2770 break;
2771
Marcel Holtmann533553f2014-03-21 12:18:10 -07002772 case HCI_OP_LE_SET_SCAN_PARAM:
2773 hci_cc_le_set_scan_param(hdev, skb);
2774 break;
2775
Andre Guedeseb9d91f2011-05-26 16:23:52 -03002776 case HCI_OP_LE_SET_SCAN_ENABLE:
2777 hci_cc_le_set_scan_enable(hdev, skb);
2778 break;
2779
Johan Hedbergcf1d0812013-01-22 14:02:00 +02002780 case HCI_OP_LE_READ_WHITE_LIST_SIZE:
2781 hci_cc_le_read_white_list_size(hdev, skb);
2782 break;
2783
Marcel Holtmann0f36b582014-02-27 20:37:31 -08002784 case HCI_OP_LE_CLEAR_WHITE_LIST:
2785 hci_cc_le_clear_white_list(hdev, skb);
2786 break;
2787
2788 case HCI_OP_LE_ADD_TO_WHITE_LIST:
2789 hci_cc_le_add_to_white_list(hdev, skb);
2790 break;
2791
2792 case HCI_OP_LE_DEL_FROM_WHITE_LIST:
2793 hci_cc_le_del_from_white_list(hdev, skb);
2794 break;
2795
Johan Hedberg9b008c02013-01-22 14:02:01 +02002796 case HCI_OP_LE_READ_SUPPORTED_STATES:
2797 hci_cc_le_read_supported_states(hdev, skb);
2798 break;
2799
Andre Guedesf9b49302011-06-30 19:20:53 -03002800 case HCI_OP_WRITE_LE_HOST_SUPPORTED:
2801 hci_cc_write_le_host_supported(hdev, skb);
2802 break;
2803
Johan Hedberg56ed2cb2014-02-27 14:05:40 +02002804 case HCI_OP_LE_SET_ADV_PARAM:
2805 hci_cc_set_adv_param(hdev, skb);
2806 break;
2807
Andrei Emeltchenko93c284e2012-09-27 17:26:20 +03002808 case HCI_OP_WRITE_REMOTE_AMP_ASSOC:
2809 hci_cc_write_remote_amp_assoc(hdev, skb);
2810 break;
2811
Andrzej Kaczmarek5ae76a92014-05-08 15:32:08 +02002812 case HCI_OP_READ_RSSI:
2813 hci_cc_read_rssi(hdev, skb);
2814 break;
2815
Andrzej Kaczmarek5a134fa2014-05-09 21:35:28 +02002816 case HCI_OP_READ_TX_POWER:
2817 hci_cc_read_tx_power(hdev, skb);
2818 break;
2819
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002820 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002821 BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002822 break;
2823 }
2824
Johan Hedbergad82cdd2013-03-09 09:53:50 +02002825 if (opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02002826 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02002827
Johan Hedbergad82cdd2013-03-09 09:53:50 +02002828 hci_req_cmd_complete(hdev, opcode, status);
Johan Hedberg9238f362013-03-05 20:37:48 +02002829
Szymon Jancdbccd792012-12-11 08:51:19 +01002830 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags)) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002831 atomic_set(&hdev->cmd_cnt, 1);
2832 if (!skb_queue_empty(&hdev->cmd_q))
Gustavo F. Padovanc347b762011-12-14 23:53:47 -02002833 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002834 }
2835}
2836
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002837static void hci_cmd_status_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002838{
2839 struct hci_ev_cmd_status *ev = (void *) skb->data;
2840 __u16 opcode;
2841
2842 skb_pull(skb, sizeof(*ev));
2843
2844 opcode = __le16_to_cpu(ev->opcode);
2845
2846 switch (opcode) {
2847 case HCI_OP_INQUIRY:
2848 hci_cs_inquiry(hdev, ev->status);
2849 break;
2850
2851 case HCI_OP_CREATE_CONN:
2852 hci_cs_create_conn(hdev, ev->status);
2853 break;
2854
2855 case HCI_OP_ADD_SCO:
2856 hci_cs_add_sco(hdev, ev->status);
2857 break;
2858
Marcel Holtmannf8558552008-07-14 20:13:49 +02002859 case HCI_OP_AUTH_REQUESTED:
2860 hci_cs_auth_requested(hdev, ev->status);
2861 break;
2862
2863 case HCI_OP_SET_CONN_ENCRYPT:
2864 hci_cs_set_conn_encrypt(hdev, ev->status);
2865 break;
2866
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002867 case HCI_OP_REMOTE_NAME_REQ:
2868 hci_cs_remote_name_req(hdev, ev->status);
2869 break;
2870
Marcel Holtmann769be972008-07-14 20:13:49 +02002871 case HCI_OP_READ_REMOTE_FEATURES:
2872 hci_cs_read_remote_features(hdev, ev->status);
2873 break;
2874
2875 case HCI_OP_READ_REMOTE_EXT_FEATURES:
2876 hci_cs_read_remote_ext_features(hdev, ev->status);
2877 break;
2878
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002879 case HCI_OP_SETUP_SYNC_CONN:
2880 hci_cs_setup_sync_conn(hdev, ev->status);
2881 break;
2882
2883 case HCI_OP_SNIFF_MODE:
2884 hci_cs_sniff_mode(hdev, ev->status);
2885 break;
2886
2887 case HCI_OP_EXIT_SNIFF_MODE:
2888 hci_cs_exit_sniff_mode(hdev, ev->status);
2889 break;
2890
Johan Hedberg8962ee72011-01-20 12:40:27 +02002891 case HCI_OP_DISCONNECT:
Johan Hedberg88c3df12012-02-09 14:27:38 +02002892 hci_cs_disconnect(hdev, ev->status);
Johan Hedberg8962ee72011-01-20 12:40:27 +02002893 break;
2894
Andrei Emeltchenkoa02226d2012-09-27 17:26:19 +03002895 case HCI_OP_CREATE_PHY_LINK:
2896 hci_cs_create_phylink(hdev, ev->status);
2897 break;
2898
Andrei Emeltchenko0b26ab92012-09-27 17:26:24 +03002899 case HCI_OP_ACCEPT_PHY_LINK:
2900 hci_cs_accept_phylink(hdev, ev->status);
2901 break;
2902
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02002903 case HCI_OP_LE_CREATE_CONN:
2904 hci_cs_le_create_conn(hdev, ev->status);
2905 break;
2906
Johan Hedberg81d0c8a2014-03-24 14:39:04 +02002907 case HCI_OP_LE_START_ENC:
2908 hci_cs_le_start_enc(hdev, ev->status);
2909 break;
2910
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002911 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002912 BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002913 break;
2914 }
2915
Johan Hedbergad82cdd2013-03-09 09:53:50 +02002916 if (opcode != HCI_OP_NOP)
Marcel Holtmann65cc2b42014-06-16 12:30:56 +02002917 cancel_delayed_work(&hdev->cmd_timer);
Ville Tervo6bd32322011-02-16 16:32:41 +02002918
Johan Hedberg02350a72013-04-03 21:50:29 +03002919 if (ev->status ||
2920 (hdev->sent_cmd && !bt_cb(hdev->sent_cmd)->req.event))
2921 hci_req_cmd_complete(hdev, opcode, ev->status);
Johan Hedberg9238f362013-03-05 20:37:48 +02002922
Gustavo F. Padovan10572132011-03-16 15:36:29 -03002923 if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags)) {
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002924 atomic_set(&hdev->cmd_cnt, 1);
2925 if (!skb_queue_empty(&hdev->cmd_q))
Gustavo F. Padovanc347b762011-12-14 23:53:47 -02002926 queue_work(hdev->workqueue, &hdev->cmd_work);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002927 }
2928}
2929
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002930static void hci_role_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002931{
2932 struct hci_ev_role_change *ev = (void *) skb->data;
2933 struct hci_conn *conn;
2934
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03002935 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002936
2937 hci_dev_lock(hdev);
2938
2939 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
2940 if (conn) {
2941 if (!ev->status) {
2942 if (ev->role)
Johan Hedberg4dae2792014-06-24 17:03:50 +03002943 clear_bit(HCI_CONN_MASTER, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002944 else
Johan Hedberg4dae2792014-06-24 17:03:50 +03002945 set_bit(HCI_CONN_MASTER, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002946 }
2947
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002948 clear_bit(HCI_CONN_RSWITCH_PEND, &conn->flags);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002949
2950 hci_role_switch_cfm(conn, ev->status, ev->role);
2951 }
2952
2953 hci_dev_unlock(hdev);
2954}
2955
Gustavo Padovan6039aa732012-05-23 04:04:18 -03002956static void hci_num_comp_pkts_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002957{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02002958 struct hci_ev_num_comp_pkts *ev = (void *) skb->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002959 int i;
2960
Andrei Emeltchenko32ac5b92011-12-19 16:31:29 +02002961 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_PACKET_BASED) {
2962 BT_ERR("Wrong event for mode %d", hdev->flow_ctl_mode);
2963 return;
2964 }
2965
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02002966 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03002967 ev->num_hndl * sizeof(struct hci_comp_pkts_info)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002968 BT_DBG("%s bad parameters", hdev->name);
2969 return;
2970 }
2971
Andrei Emeltchenkoc5993de2011-12-30 12:07:47 +02002972 BT_DBG("%s num_hndl %d", hdev->name, ev->num_hndl);
2973
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02002974 for (i = 0; i < ev->num_hndl; i++) {
2975 struct hci_comp_pkts_info *info = &ev->handles[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07002976 struct hci_conn *conn;
2977 __u16 handle, count;
2978
Andrei Emeltchenko613a1c02011-12-19 16:31:30 +02002979 handle = __le16_to_cpu(info->handle);
2980 count = __le16_to_cpu(info->count);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002981
2982 conn = hci_conn_hash_lookup_handle(hdev, handle);
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02002983 if (!conn)
2984 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002985
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02002986 conn->sent -= count;
2987
2988 switch (conn->type) {
2989 case ACL_LINK:
2990 hdev->acl_cnt += count;
2991 if (hdev->acl_cnt > hdev->acl_pkts)
2992 hdev->acl_cnt = hdev->acl_pkts;
2993 break;
2994
2995 case LE_LINK:
2996 if (hdev->le_pkts) {
2997 hdev->le_cnt += count;
2998 if (hdev->le_cnt > hdev->le_pkts)
2999 hdev->le_cnt = hdev->le_pkts;
3000 } else {
Andrei Emeltchenko70f230202010-12-01 16:58:25 +02003001 hdev->acl_cnt += count;
3002 if (hdev->acl_cnt > hdev->acl_pkts)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003003 hdev->acl_cnt = hdev->acl_pkts;
3004 }
Andrei Emeltchenkof4280912011-12-07 15:56:52 +02003005 break;
3006
3007 case SCO_LINK:
3008 hdev->sco_cnt += count;
3009 if (hdev->sco_cnt > hdev->sco_pkts)
3010 hdev->sco_cnt = hdev->sco_pkts;
3011 break;
3012
3013 default:
3014 BT_ERR("Unknown type %d conn %p", conn->type, conn);
3015 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003016 }
3017 }
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003018
Gustavo F. Padovan3eff45e2011-12-15 00:50:02 -02003019 queue_work(hdev->workqueue, &hdev->tx_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003020}
3021
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003022static struct hci_conn *__hci_conn_lookup_handle(struct hci_dev *hdev,
3023 __u16 handle)
3024{
3025 struct hci_chan *chan;
3026
3027 switch (hdev->dev_type) {
3028 case HCI_BREDR:
3029 return hci_conn_hash_lookup_handle(hdev, handle);
3030 case HCI_AMP:
3031 chan = hci_chan_lookup_handle(hdev, handle);
3032 if (chan)
3033 return chan->conn;
3034 break;
3035 default:
3036 BT_ERR("%s unknown dev_type %d", hdev->name, hdev->dev_type);
3037 break;
3038 }
3039
3040 return NULL;
3041}
3042
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003043static void hci_num_comp_blocks_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003044{
3045 struct hci_ev_num_comp_blocks *ev = (void *) skb->data;
3046 int i;
3047
3048 if (hdev->flow_ctl_mode != HCI_FLOW_CTL_MODE_BLOCK_BASED) {
3049 BT_ERR("Wrong event for mode %d", hdev->flow_ctl_mode);
3050 return;
3051 }
3052
3053 if (skb->len < sizeof(*ev) || skb->len < sizeof(*ev) +
Gustavo Padovan807deac2012-05-17 00:36:24 -03003054 ev->num_hndl * sizeof(struct hci_comp_blocks_info)) {
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003055 BT_DBG("%s bad parameters", hdev->name);
3056 return;
3057 }
3058
3059 BT_DBG("%s num_blocks %d num_hndl %d", hdev->name, ev->num_blocks,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003060 ev->num_hndl);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003061
3062 for (i = 0; i < ev->num_hndl; i++) {
3063 struct hci_comp_blocks_info *info = &ev->handles[i];
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003064 struct hci_conn *conn = NULL;
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003065 __u16 handle, block_count;
3066
3067 handle = __le16_to_cpu(info->handle);
3068 block_count = __le16_to_cpu(info->blocks);
3069
Andrei Emeltchenko76ef7cf2012-10-10 17:38:29 +03003070 conn = __hci_conn_lookup_handle(hdev, handle);
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003071 if (!conn)
3072 continue;
3073
3074 conn->sent -= block_count;
3075
3076 switch (conn->type) {
3077 case ACL_LINK:
Andrei Emeltchenkobd1eb662012-10-10 17:38:30 +03003078 case AMP_LINK:
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02003079 hdev->block_cnt += block_count;
3080 if (hdev->block_cnt > hdev->num_blocks)
3081 hdev->block_cnt = hdev->num_blocks;
3082 break;
3083
3084 default:
3085 BT_ERR("Unknown type %d conn %p", conn->type, conn);
3086 break;
3087 }
3088 }
3089
3090 queue_work(hdev->workqueue, &hdev->tx_work);
3091}
3092
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003093static void hci_mode_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003094{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003095 struct hci_ev_mode_change *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003096 struct hci_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003097
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003098 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003099
3100 hci_dev_lock(hdev);
3101
Marcel Holtmann04837f62006-07-03 10:02:33 +02003102 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3103 if (conn) {
3104 conn->mode = ev->mode;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003105
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003106 if (!test_and_clear_bit(HCI_CONN_MODE_CHANGE_PEND,
3107 &conn->flags)) {
Marcel Holtmann04837f62006-07-03 10:02:33 +02003108 if (conn->mode == HCI_CM_ACTIVE)
Johan Hedberg58a681e2012-01-16 06:47:28 +02003109 set_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003110 else
Johan Hedberg58a681e2012-01-16 06:47:28 +02003111 clear_bit(HCI_CONN_POWER_SAVE, &conn->flags);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003112 }
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003113
Johan Hedberg51a8efd2012-01-16 06:10:31 +02003114 if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->flags))
Marcel Holtmanne73439d2010-07-26 10:06:00 -04003115 hci_sco_setup(conn, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003116 }
3117
3118 hci_dev_unlock(hdev);
3119}
3120
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003121static void hci_pin_code_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003122{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003123 struct hci_ev_pin_code_req *ev = (void *) skb->data;
3124 struct hci_conn *conn;
3125
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003126 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003127
3128 hci_dev_lock(hdev);
3129
3130 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003131 if (!conn)
3132 goto unlock;
3133
3134 if (conn->state == BT_CONNECTED) {
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003135 hci_conn_hold(conn);
3136 conn->disc_timeout = HCI_PAIRING_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003137 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003138 }
3139
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003140 if (!test_bit(HCI_PAIRABLE, &hdev->dev_flags))
Johan Hedberg03b555e2011-01-04 15:40:05 +02003141 hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003142 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003143 else if (test_bit(HCI_MGMT, &hdev->dev_flags)) {
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003144 u8 secure;
3145
3146 if (conn->pending_sec_level == BT_SECURITY_HIGH)
3147 secure = 1;
3148 else
3149 secure = 0;
3150
Johan Hedberg744cf192011-11-08 20:40:14 +02003151 mgmt_pin_code_request(hdev, &ev->bdaddr, secure);
Waldemar Rymarkiewicza770bb52011-04-28 12:07:59 +02003152 }
Johan Hedberg980e1a52011-01-22 06:10:07 +02003153
Waldemar Rymarkiewiczb6f98042011-09-23 10:01:30 +02003154unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003155 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003156}
3157
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003158static void hci_link_key_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003159{
Johan Hedberg55ed8ca2011-01-17 14:41:05 +02003160 struct hci_ev_link_key_req *ev = (void *) skb->data;
3161 struct hci_cp_link_key_reply cp;
3162 struct hci_conn *conn;
3163 struct link_key *key;
3164
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003165 BT_DBG("%s", hdev->name);
Johan Hedberg55ed8ca2011-01-17 14:41:05 +02003166
Andrei Emeltchenko034cbea2013-05-14 11:44:16 +03003167 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg55ed8ca2011-01-17 14:41:05 +02003168 return;
3169
3170 hci_dev_lock(hdev);
3171
3172 key = hci_find_link_key(hdev, &ev->bdaddr);
3173 if (!key) {
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003174 BT_DBG("%s link key not found for %pMR", hdev->name,
3175 &ev->bdaddr);
Johan Hedberg55ed8ca2011-01-17 14:41:05 +02003176 goto not_found;
3177 }
3178
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03003179 BT_DBG("%s found key type %u for %pMR", hdev->name, key->type,
3180 &ev->bdaddr);
Johan Hedberg55ed8ca2011-01-17 14:41:05 +02003181
Johan Hedberg55ed8ca2011-01-17 14:41:05 +02003182 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003183 if (conn) {
Marcel Holtmann66138ce2014-01-10 02:07:20 -08003184 if ((key->type == HCI_LK_UNAUTH_COMBINATION_P192 ||
3185 key->type == HCI_LK_UNAUTH_COMBINATION_P256) &&
Gustavo Padovan807deac2012-05-17 00:36:24 -03003186 conn->auth_type != 0xff && (conn->auth_type & 0x01)) {
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003187 BT_DBG("%s ignoring unauthenticated key", hdev->name);
3188 goto not_found;
3189 }
Johan Hedberg55ed8ca2011-01-17 14:41:05 +02003190
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003191 if (key->type == HCI_LK_COMBINATION && key->pin_len < 16 &&
Johan Hedbergf3fb0b52014-06-02 10:12:44 +03003192 (conn->pending_sec_level == BT_SECURITY_HIGH ||
3193 conn->pending_sec_level == BT_SECURITY_FIPS)) {
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003194 BT_DBG("%s ignoring key unauthenticated for high security",
3195 hdev->name);
Waldemar Rymarkiewicz60b83f52011-04-28 12:07:56 +02003196 goto not_found;
3197 }
3198
3199 conn->key_type = key->type;
3200 conn->pin_length = key->pin_len;
Johan Hedberg55ed8ca2011-01-17 14:41:05 +02003201 }
3202
3203 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9b3b4462012-05-23 11:31:20 +03003204 memcpy(cp.link_key, key->val, HCI_LINK_KEY_SIZE);
Johan Hedberg55ed8ca2011-01-17 14:41:05 +02003205
3206 hci_send_cmd(hdev, HCI_OP_LINK_KEY_REPLY, sizeof(cp), &cp);
3207
3208 hci_dev_unlock(hdev);
3209
3210 return;
3211
3212not_found:
3213 hci_send_cmd(hdev, HCI_OP_LINK_KEY_NEG_REPLY, 6, &ev->bdaddr);
3214 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003215}
3216
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003217static void hci_link_key_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003218{
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003219 struct hci_ev_link_key_notify *ev = (void *) skb->data;
3220 struct hci_conn *conn;
Johan Hedberg7652ff62014-06-24 13:15:49 +03003221 struct link_key *key;
3222 bool persistent;
Johan Hedberg55ed8ca2011-01-17 14:41:05 +02003223 u8 pin_len = 0;
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003224
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003225 BT_DBG("%s", hdev->name);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003226
3227 hci_dev_lock(hdev);
3228
3229 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3230 if (conn) {
3231 hci_conn_hold(conn);
3232 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
Johan Hedberg980e1a52011-01-22 06:10:07 +02003233 pin_len = conn->pin_length;
Waldemar Rymarkiewicz13d39312011-04-28 12:07:55 +02003234
3235 if (ev->key_type != HCI_LK_CHANGED_COMBINATION)
3236 conn->key_type = ev->key_type;
3237
David Herrmann76a68ba2013-04-06 20:28:37 +02003238 hci_conn_drop(conn);
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003239 }
3240
Johan Hedberg7652ff62014-06-24 13:15:49 +03003241 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
3242 goto unlock;
Johan Hedberg55ed8ca2011-01-17 14:41:05 +02003243
Johan Hedberg7652ff62014-06-24 13:15:49 +03003244 key = hci_add_link_key(hdev, conn, &ev->bdaddr, ev->link_key,
3245 ev->key_type, pin_len, &persistent);
3246 if (!key)
3247 goto unlock;
3248
3249 mgmt_new_link_key(hdev, key, persistent);
3250
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003251 /* Keep debug keys around only if the HCI_KEEP_DEBUG_KEYS flag
3252 * is set. If it's not set simply remove the key from the kernel
3253 * list (we've still notified user space about it but with
3254 * store_hint being 0).
3255 */
3256 if (key->type == HCI_LK_DEBUG_COMBINATION &&
3257 !test_bit(HCI_KEEP_DEBUG_KEYS, &hdev->dev_flags)) {
3258 list_del(&key->list);
3259 kfree(key);
3260 } else if (conn) {
Johan Hedbergaf6a9c32014-06-24 13:15:53 +03003261 if (persistent)
3262 clear_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
3263 else
3264 set_bit(HCI_CONN_FLUSH_KEY, &conn->flags);
Johan Hedberg6d5650c2014-06-24 13:15:51 +03003265 }
Johan Hedberg7652ff62014-06-24 13:15:49 +03003266
3267unlock:
Marcel Holtmann052b30b2009-04-26 20:01:22 +02003268 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003269}
3270
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003271static void hci_clock_offset_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04837f62006-07-03 10:02:33 +02003272{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003273 struct hci_ev_clock_offset *ev = (void *) skb->data;
Marcel Holtmann04837f62006-07-03 10:02:33 +02003274 struct hci_conn *conn;
3275
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003276 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmann04837f62006-07-03 10:02:33 +02003277
3278 hci_dev_lock(hdev);
3279
3280 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003281 if (conn && !ev->status) {
3282 struct inquiry_entry *ie;
3283
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003284 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3285 if (ie) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003286 ie->data.clock_offset = ev->clock_offset;
3287 ie->timestamp = jiffies;
3288 }
3289 }
3290
3291 hci_dev_unlock(hdev);
3292}
3293
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003294static void hci_pkt_type_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmanna8746412008-07-14 20:13:46 +02003295{
3296 struct hci_ev_pkt_type_change *ev = (void *) skb->data;
3297 struct hci_conn *conn;
3298
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003299 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmanna8746412008-07-14 20:13:46 +02003300
3301 hci_dev_lock(hdev);
3302
3303 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3304 if (conn && !ev->status)
3305 conn->pkt_type = __le16_to_cpu(ev->pkt_type);
3306
3307 hci_dev_unlock(hdev);
3308}
3309
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003310static void hci_pscan_rep_mode_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003311{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003312 struct hci_ev_pscan_rep_mode *ev = (void *) skb->data;
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003313 struct inquiry_entry *ie;
3314
3315 BT_DBG("%s", hdev->name);
3316
3317 hci_dev_lock(hdev);
3318
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003319 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
3320 if (ie) {
Marcel Holtmann85a1e932005-08-09 20:28:02 -07003321 ie->data.pscan_rep_mode = ev->pscan_rep_mode;
3322 ie->timestamp = jiffies;
3323 }
3324
3325 hci_dev_unlock(hdev);
3326}
3327
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003328static void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev,
3329 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003330{
3331 struct inquiry_data data;
3332 int num_rsp = *((__u8 *) skb->data);
3333
3334 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
3335
3336 if (!num_rsp)
3337 return;
3338
Andre Guedes1519cc12012-03-21 00:03:38 -03003339 if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags))
3340 return;
3341
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003342 hci_dev_lock(hdev);
3343
3344 if ((skb->len - 1) / num_rsp != sizeof(struct inquiry_info_with_rssi)) {
Szymon Janc138d22e2011-02-17 16:44:23 +01003345 struct inquiry_info_with_rssi_and_pscan_mode *info;
3346 info = (void *) (skb->data + 1);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003347
Johan Hedberge17acd42011-03-30 23:57:16 +03003348 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003349 u32 flags;
3350
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003351 bacpy(&data.bdaddr, &info->bdaddr);
3352 data.pscan_rep_mode = info->pscan_rep_mode;
3353 data.pscan_period_mode = info->pscan_period_mode;
3354 data.pscan_mode = info->pscan_mode;
3355 memcpy(data.dev_class, info->dev_class, 3);
3356 data.clock_offset = info->clock_offset;
3357 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003358 data.ssp_mode = 0x00;
Johan Hedberg31754052012-01-04 13:39:52 +02003359
Marcel Holtmannaf589252014-07-01 14:11:20 +02003360 flags = hci_inquiry_cache_update(hdev, &data, false);
3361
Johan Hedberg48264f02011-11-09 13:58:58 +02003362 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003363 info->dev_class, info->rssi,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003364 flags, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003365 }
3366 } else {
3367 struct inquiry_info_with_rssi *info = (void *) (skb->data + 1);
3368
Johan Hedberge17acd42011-03-30 23:57:16 +03003369 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003370 u32 flags;
3371
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003372 bacpy(&data.bdaddr, &info->bdaddr);
3373 data.pscan_rep_mode = info->pscan_rep_mode;
3374 data.pscan_period_mode = info->pscan_period_mode;
3375 data.pscan_mode = 0x00;
3376 memcpy(data.dev_class, info->dev_class, 3);
3377 data.clock_offset = info->clock_offset;
3378 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003379 data.ssp_mode = 0x00;
Marcel Holtmannaf589252014-07-01 14:11:20 +02003380
3381 flags = hci_inquiry_cache_update(hdev, &data, false);
3382
Johan Hedberg48264f02011-11-09 13:58:58 +02003383 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003384 info->dev_class, info->rssi,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003385 flags, NULL, 0, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003386 }
3387 }
3388
3389 hci_dev_unlock(hdev);
3390}
3391
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003392static void hci_remote_ext_features_evt(struct hci_dev *hdev,
3393 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003394{
Marcel Holtmann41a96212008-07-14 20:13:48 +02003395 struct hci_ev_remote_ext_features *ev = (void *) skb->data;
3396 struct hci_conn *conn;
3397
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003398 BT_DBG("%s", hdev->name);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003399
Marcel Holtmann41a96212008-07-14 20:13:48 +02003400 hci_dev_lock(hdev);
3401
3402 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Johan Hedbergccd556f2010-11-10 17:11:51 +02003403 if (!conn)
3404 goto unlock;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003405
Johan Hedbergcad718e2013-04-17 15:00:51 +03003406 if (ev->page < HCI_MAX_PAGES)
3407 memcpy(conn->features[ev->page], ev->features, 8);
3408
Johan Hedbergccd556f2010-11-10 17:11:51 +02003409 if (!ev->status && ev->page == 0x01) {
3410 struct inquiry_entry *ie;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003411
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003412 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
3413 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02003414 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann769be972008-07-14 20:13:49 +02003415
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303416 if (ev->features[0] & LMP_HOST_SSP) {
Johan Hedberg58a681e2012-01-16 06:47:28 +02003417 set_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
Jaganath Kanakkasserybbb0ead2013-04-16 20:16:30 +05303418 } else {
3419 /* It is mandatory by the Bluetooth specification that
3420 * Extended Inquiry Results are only used when Secure
3421 * Simple Pairing is enabled, but some devices violate
3422 * this.
3423 *
3424 * To make these devices work, the internal SSP
3425 * enabled flag needs to be cleared if the remote host
3426 * features do not indicate SSP support */
3427 clear_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
3428 }
Marcel Holtmanneb9a8f32014-01-15 22:37:38 -08003429
3430 if (ev->features[0] & LMP_HOST_SC)
3431 set_bit(HCI_CONN_SC_ENABLED, &conn->flags);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003432 }
3433
Johan Hedbergccd556f2010-11-10 17:11:51 +02003434 if (conn->state != BT_CONFIG)
3435 goto unlock;
3436
Johan Hedberg671267b2012-05-12 16:11:50 -03003437 if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
Johan Hedberg127178d2010-11-18 22:22:29 +02003438 struct hci_cp_remote_name_req cp;
3439 memset(&cp, 0, sizeof(cp));
3440 bacpy(&cp.bdaddr, &conn->dst);
3441 cp.pscan_rep_mode = 0x02;
3442 hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ, sizeof(cp), &cp);
Johan Hedbergb644ba32012-01-17 21:48:47 +02003443 } else if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
3444 mgmt_device_connected(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003445 conn->dst_type, 0, NULL, 0,
3446 conn->dev_class);
Johan Hedberg392599b2010-11-18 22:22:28 +02003447
Johan Hedberg127178d2010-11-18 22:22:29 +02003448 if (!hci_outgoing_auth_needed(hdev, conn)) {
Johan Hedbergccd556f2010-11-10 17:11:51 +02003449 conn->state = BT_CONNECTED;
3450 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02003451 hci_conn_drop(conn);
Johan Hedbergccd556f2010-11-10 17:11:51 +02003452 }
3453
3454unlock:
Marcel Holtmann41a96212008-07-14 20:13:48 +02003455 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003456}
3457
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003458static void hci_sync_conn_complete_evt(struct hci_dev *hdev,
3459 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003460{
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003461 struct hci_ev_sync_conn_complete *ev = (void *) skb->data;
3462 struct hci_conn *conn;
3463
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003464 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003465
3466 hci_dev_lock(hdev);
3467
3468 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
Marcel Holtmann9dc0a3a2008-07-14 20:13:46 +02003469 if (!conn) {
3470 if (ev->link_type == ESCO_LINK)
3471 goto unlock;
3472
3473 conn = hci_conn_hash_lookup_ba(hdev, ESCO_LINK, &ev->bdaddr);
3474 if (!conn)
3475 goto unlock;
3476
3477 conn->type = SCO_LINK;
3478 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003479
Marcel Holtmann732547f2009-04-19 19:14:14 +02003480 switch (ev->status) {
3481 case 0x00:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003482 conn->handle = __le16_to_cpu(ev->handle);
3483 conn->state = BT_CONNECTED;
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +02003484
3485 hci_conn_add_sysfs(conn);
Marcel Holtmann732547f2009-04-19 19:14:14 +02003486 break;
3487
Nick Pelly81218d22014-06-30 11:25:01 +05303488 case 0x10: /* Connection Accept Timeout */
Frédéric Dalleau1a4c9582013-08-19 14:24:02 +02003489 case 0x0d: /* Connection Rejected due to Limited Resources */
Stephen Coe705e5712010-02-16 11:29:44 -05003490 case 0x11: /* Unsupported Feature or Parameter Value */
Marcel Holtmann732547f2009-04-19 19:14:14 +02003491 case 0x1c: /* SCO interval rejected */
Nick Pelly1038a002010-02-03 11:42:26 -08003492 case 0x1a: /* Unsupported Remote Feature */
Marcel Holtmann732547f2009-04-19 19:14:14 +02003493 case 0x1f: /* Unspecified error */
Andrew Earl27539bc2014-03-10 10:31:04 +00003494 case 0x20: /* Unsupported LMP Parameter value */
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02003495 if (conn->out) {
Marcel Holtmann732547f2009-04-19 19:14:14 +02003496 conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) |
3497 (hdev->esco_type & EDR_ESCO_MASK);
Frédéric Dalleau2dea6322013-08-19 14:24:03 +02003498 if (hci_setup_sync(conn, conn->link->handle))
3499 goto unlock;
Marcel Holtmann732547f2009-04-19 19:14:14 +02003500 }
3501 /* fall through */
3502
3503 default:
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003504 conn->state = BT_CLOSED;
Marcel Holtmann732547f2009-04-19 19:14:14 +02003505 break;
3506 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +02003507
3508 hci_proto_connect_cfm(conn, ev->status);
3509 if (ev->status)
3510 hci_conn_del(conn);
3511
3512unlock:
3513 hci_dev_unlock(hdev);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003514}
3515
Marcel Holtmannefdcf8e2013-10-15 10:31:12 -07003516static inline size_t eir_get_length(u8 *eir, size_t eir_len)
3517{
3518 size_t parsed = 0;
3519
3520 while (parsed < eir_len) {
3521 u8 field_len = eir[0];
3522
3523 if (field_len == 0)
3524 return parsed;
3525
3526 parsed += field_len + 1;
3527 eir += field_len + 1;
3528 }
3529
3530 return eir_len;
3531}
3532
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003533static void hci_extended_inquiry_result_evt(struct hci_dev *hdev,
3534 struct sk_buff *skb)
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003535{
3536 struct inquiry_data data;
3537 struct extended_inquiry_info *info = (void *) (skb->data + 1);
3538 int num_rsp = *((__u8 *) skb->data);
Vishal Agarwal9d939d92012-04-26 19:19:56 +05303539 size_t eir_len;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003540
3541 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
3542
3543 if (!num_rsp)
3544 return;
3545
Andre Guedes1519cc12012-03-21 00:03:38 -03003546 if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags))
3547 return;
3548
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003549 hci_dev_lock(hdev);
3550
Johan Hedberge17acd42011-03-30 23:57:16 +03003551 for (; num_rsp; num_rsp--, info++) {
Marcel Holtmannaf589252014-07-01 14:11:20 +02003552 u32 flags;
3553 bool name_known;
Johan Hedberg561aafb2012-01-04 13:31:59 +02003554
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003555 bacpy(&data.bdaddr, &info->bdaddr);
Szymon Janc138d22e2011-02-17 16:44:23 +01003556 data.pscan_rep_mode = info->pscan_rep_mode;
3557 data.pscan_period_mode = info->pscan_period_mode;
3558 data.pscan_mode = 0x00;
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003559 memcpy(data.dev_class, info->dev_class, 3);
Szymon Janc138d22e2011-02-17 16:44:23 +01003560 data.clock_offset = info->clock_offset;
3561 data.rssi = info->rssi;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003562 data.ssp_mode = 0x01;
Johan Hedberg561aafb2012-01-04 13:31:59 +02003563
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003564 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg4ddb1932012-01-15 20:04:43 +02003565 name_known = eir_has_data_type(info->data,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003566 sizeof(info->data),
3567 EIR_NAME_COMPLETE);
Johan Hedberg561aafb2012-01-04 13:31:59 +02003568 else
3569 name_known = true;
3570
Marcel Holtmannaf589252014-07-01 14:11:20 +02003571 flags = hci_inquiry_cache_update(hdev, &data, name_known);
3572
Vishal Agarwal9d939d92012-04-26 19:19:56 +05303573 eir_len = eir_get_length(info->data, sizeof(info->data));
Marcel Holtmannaf589252014-07-01 14:11:20 +02003574
Johan Hedberg48264f02011-11-09 13:58:58 +02003575 mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
Marcel Holtmannaf589252014-07-01 14:11:20 +02003576 info->dev_class, info->rssi,
3577 flags, info->data, eir_len, NULL, 0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +02003578 }
3579
3580 hci_dev_unlock(hdev);
3581}
3582
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003583static void hci_key_refresh_complete_evt(struct hci_dev *hdev,
3584 struct sk_buff *skb)
3585{
3586 struct hci_ev_key_refresh_complete *ev = (void *) skb->data;
3587 struct hci_conn *conn;
3588
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03003589 BT_DBG("%s status 0x%2.2x handle 0x%4.4x", hdev->name, ev->status,
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003590 __le16_to_cpu(ev->handle));
3591
3592 hci_dev_lock(hdev);
3593
3594 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
3595 if (!conn)
3596 goto unlock;
3597
Johan Hedberg9eb1fbf2014-04-11 12:02:31 -07003598 /* For BR/EDR the necessary steps are taken through the
3599 * auth_complete event.
3600 */
3601 if (conn->type != LE_LINK)
3602 goto unlock;
3603
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003604 if (!ev->status)
3605 conn->sec_level = conn->pending_sec_level;
3606
3607 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
3608
3609 if (ev->status && conn->state == BT_CONNECTED) {
Andre Guedesbed71742013-01-30 11:50:56 -03003610 hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
David Herrmann76a68ba2013-04-06 20:28:37 +02003611 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003612 goto unlock;
3613 }
3614
3615 if (conn->state == BT_CONFIG) {
3616 if (!ev->status)
3617 conn->state = BT_CONNECTED;
3618
3619 hci_proto_connect_cfm(conn, ev->status);
David Herrmann76a68ba2013-04-06 20:28:37 +02003620 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003621 } else {
3622 hci_auth_cfm(conn, ev->status);
3623
3624 hci_conn_hold(conn);
3625 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02003626 hci_conn_drop(conn);
Johan Hedberg1c2e0042012-06-08 23:31:13 +08003627 }
3628
3629unlock:
3630 hci_dev_unlock(hdev);
3631}
3632
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003633static u8 hci_get_auth_req(struct hci_conn *conn)
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003634{
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003635 /* If remote requests no-bonding follow that lead */
Mikel Astizacabae92013-06-28 10:56:28 +02003636 if (conn->remote_auth == HCI_AT_NO_BONDING ||
3637 conn->remote_auth == HCI_AT_NO_BONDING_MITM)
Waldemar Rymarkiewicz58797bf2011-04-28 12:07:58 +02003638 return conn->remote_auth | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003639
Mikel Astizb7f94c82014-04-08 14:21:31 +02003640 /* If both remote and local have enough IO capabilities, require
3641 * MITM protection
3642 */
3643 if (conn->remote_cap != HCI_IO_NO_INPUT_OUTPUT &&
3644 conn->io_capability != HCI_IO_NO_INPUT_OUTPUT)
3645 return conn->remote_auth | 0x01;
3646
Timo Mueller7e741702014-04-08 14:21:33 +02003647 /* No MITM protection possible so ignore remote requirement */
3648 return (conn->remote_auth & ~0x01) | (conn->auth_type & 0x01);
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003649}
3650
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003651static void hci_io_capa_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02003652{
3653 struct hci_ev_io_capa_request *ev = (void *) skb->data;
3654 struct hci_conn *conn;
3655
3656 BT_DBG("%s", hdev->name);
3657
3658 hci_dev_lock(hdev);
3659
3660 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003661 if (!conn)
3662 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02003663
Johan Hedberg03b555e2011-01-04 15:40:05 +02003664 hci_conn_hold(conn);
3665
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003666 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg03b555e2011-01-04 15:40:05 +02003667 goto unlock;
3668
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003669 if (test_bit(HCI_PAIRABLE, &hdev->dev_flags) ||
Gustavo Padovan807deac2012-05-17 00:36:24 -03003670 (conn->remote_auth & ~0x01) == HCI_AT_NO_BONDING) {
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003671 struct hci_cp_io_capability_reply cp;
3672
3673 bacpy(&cp.bdaddr, &ev->bdaddr);
Hemant Gupta7a7f1e72012-01-16 13:34:29 +05303674 /* Change the IO capability from KeyboardDisplay
3675 * to DisplayYesNo as it is not supported by BT spec. */
3676 cp.capability = (conn->io_capability == 0x04) ?
Mikel Astiza7676312013-06-28 10:56:29 +02003677 HCI_IO_DISPLAY_YESNO : conn->io_capability;
Mikel Astizb7f94c82014-04-08 14:21:31 +02003678
3679 /* If we are initiators, there is no remote information yet */
3680 if (conn->remote_auth == 0xff) {
3681 cp.authentication = conn->auth_type;
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003682
Mikel Astizb16c6602014-04-08 14:21:34 +02003683 /* Request MITM protection if our IO caps allow it
Johan Hedberg4ad51a72014-06-09 14:41:25 +03003684 * except for the no-bonding case.
3685 * conn->auth_type is not updated here since
3686 * that might cause the user confirmation to be
3687 * rejected in case the remote doesn't have the
3688 * IO capabilities for MITM.
Mikel Astizb16c6602014-04-08 14:21:34 +02003689 */
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003690 if (conn->io_capability != HCI_IO_NO_INPUT_OUTPUT &&
Mikel Astizb16c6602014-04-08 14:21:34 +02003691 cp.authentication != HCI_AT_NO_BONDING)
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003692 cp.authentication |= 0x01;
Mikel Astizb7f94c82014-04-08 14:21:31 +02003693 } else {
3694 conn->auth_type = hci_get_auth_req(conn);
3695 cp.authentication = conn->auth_type;
3696 }
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003697
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03003698 if (hci_find_remote_oob_data(hdev, &conn->dst) &&
3699 (conn->out || test_bit(HCI_CONN_REMOTE_OOB, &conn->flags)))
Szymon Jancce85ee12011-03-22 13:12:23 +01003700 cp.oob_data = 0x01;
3701 else
3702 cp.oob_data = 0x00;
3703
Johan Hedberg17fa4b92011-01-25 13:28:33 +02003704 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003705 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003706 } else {
3707 struct hci_cp_io_capability_neg_reply cp;
3708
3709 bacpy(&cp.bdaddr, &ev->bdaddr);
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02003710 cp.reason = HCI_ERROR_PAIRING_NOT_ALLOWED;
Johan Hedberg03b555e2011-01-04 15:40:05 +02003711
3712 hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003713 sizeof(cp), &cp);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003714 }
3715
3716unlock:
3717 hci_dev_unlock(hdev);
3718}
3719
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003720static void hci_io_capa_reply_evt(struct hci_dev *hdev, struct sk_buff *skb)
Johan Hedberg03b555e2011-01-04 15:40:05 +02003721{
3722 struct hci_ev_io_capa_reply *ev = (void *) skb->data;
3723 struct hci_conn *conn;
3724
3725 BT_DBG("%s", hdev->name);
3726
3727 hci_dev_lock(hdev);
3728
3729 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3730 if (!conn)
3731 goto unlock;
3732
Johan Hedberg03b555e2011-01-04 15:40:05 +02003733 conn->remote_cap = ev->capability;
Johan Hedberg03b555e2011-01-04 15:40:05 +02003734 conn->remote_auth = ev->authentication;
Johan Hedberg58a681e2012-01-16 06:47:28 +02003735 if (ev->oob_data)
3736 set_bit(HCI_CONN_REMOTE_OOB, &conn->flags);
Johan Hedberg03b555e2011-01-04 15:40:05 +02003737
3738unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02003739 hci_dev_unlock(hdev);
3740}
3741
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003742static void hci_user_confirm_request_evt(struct hci_dev *hdev,
3743 struct sk_buff *skb)
Johan Hedberga5c29682011-02-19 12:05:57 -03003744{
3745 struct hci_ev_user_confirm_req *ev = (void *) skb->data;
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003746 int loc_mitm, rem_mitm, confirm_hint = 0;
Johan Hedberg7a828902011-04-28 11:28:53 -07003747 struct hci_conn *conn;
Johan Hedberga5c29682011-02-19 12:05:57 -03003748
3749 BT_DBG("%s", hdev->name);
3750
3751 hci_dev_lock(hdev);
3752
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003753 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg7a828902011-04-28 11:28:53 -07003754 goto unlock;
Johan Hedberga5c29682011-02-19 12:05:57 -03003755
Johan Hedberg7a828902011-04-28 11:28:53 -07003756 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3757 if (!conn)
3758 goto unlock;
3759
3760 loc_mitm = (conn->auth_type & 0x01);
3761 rem_mitm = (conn->remote_auth & 0x01);
3762
3763 /* If we require MITM but the remote device can't provide that
Mikel Astiz6fd6b912014-04-08 14:21:32 +02003764 * (it has NoInputNoOutput) then reject the confirmation request
3765 */
3766 if (loc_mitm && conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) {
Johan Hedberg7a828902011-04-28 11:28:53 -07003767 BT_DBG("Rejecting request: remote device can't provide MITM");
3768 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_NEG_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003769 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07003770 goto unlock;
3771 }
3772
3773 /* If no side requires MITM protection; auto-accept */
Mikel Astiza7676312013-06-28 10:56:29 +02003774 if ((!loc_mitm || conn->remote_cap == HCI_IO_NO_INPUT_OUTPUT) &&
3775 (!rem_mitm || conn->io_capability == HCI_IO_NO_INPUT_OUTPUT)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003776
3777 /* If we're not the initiators request authorization to
3778 * proceed from user space (mgmt_user_confirm with
Johan Hedbergba15a582014-06-09 13:58:14 +03003779 * confirm_hint set to 1). The exception is if neither
3780 * side had MITM in which case we do auto-accept.
3781 */
3782 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) &&
3783 (loc_mitm || rem_mitm)) {
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003784 BT_DBG("Confirming auto-accept as acceptor");
3785 confirm_hint = 1;
3786 goto confirm;
3787 }
3788
Johan Hedberg9f616562011-04-28 11:28:54 -07003789 BT_DBG("Auto-accept of user confirmation with %ums delay",
Gustavo Padovan807deac2012-05-17 00:36:24 -03003790 hdev->auto_accept_delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07003791
3792 if (hdev->auto_accept_delay > 0) {
3793 int delay = msecs_to_jiffies(hdev->auto_accept_delay);
Johan Hedberg7bc18d92013-10-16 18:11:39 +03003794 queue_delayed_work(conn->hdev->workqueue,
3795 &conn->auto_accept_work, delay);
Johan Hedberg9f616562011-04-28 11:28:54 -07003796 goto unlock;
3797 }
3798
Johan Hedberg7a828902011-04-28 11:28:53 -07003799 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_REPLY,
Gustavo Padovan807deac2012-05-17 00:36:24 -03003800 sizeof(ev->bdaddr), &ev->bdaddr);
Johan Hedberg7a828902011-04-28 11:28:53 -07003801 goto unlock;
3802 }
3803
Johan Hedberg55bc1a32011-04-28 11:28:56 -07003804confirm:
Johan Hedberg39adbff2014-03-20 08:18:14 +02003805 mgmt_user_confirm_request(hdev, &ev->bdaddr, ACL_LINK, 0,
3806 le32_to_cpu(ev->passkey), confirm_hint);
Johan Hedberg7a828902011-04-28 11:28:53 -07003807
3808unlock:
Johan Hedberga5c29682011-02-19 12:05:57 -03003809 hci_dev_unlock(hdev);
3810}
3811
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003812static void hci_user_passkey_request_evt(struct hci_dev *hdev,
3813 struct sk_buff *skb)
Brian Gix1143d452011-11-23 08:28:34 -08003814{
3815 struct hci_ev_user_passkey_req *ev = (void *) skb->data;
3816
3817 BT_DBG("%s", hdev->name);
3818
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003819 if (test_bit(HCI_MGMT, &hdev->dev_flags))
Johan Hedberg272d90d2012-02-09 15:26:12 +02003820 mgmt_user_passkey_request(hdev, &ev->bdaddr, ACL_LINK, 0);
Brian Gix1143d452011-11-23 08:28:34 -08003821}
3822
Johan Hedberg92a25252012-09-06 18:39:26 +03003823static void hci_user_passkey_notify_evt(struct hci_dev *hdev,
3824 struct sk_buff *skb)
3825{
3826 struct hci_ev_user_passkey_notify *ev = (void *) skb->data;
3827 struct hci_conn *conn;
3828
3829 BT_DBG("%s", hdev->name);
3830
3831 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3832 if (!conn)
3833 return;
3834
3835 conn->passkey_notify = __le32_to_cpu(ev->passkey);
3836 conn->passkey_entered = 0;
3837
3838 if (test_bit(HCI_MGMT, &hdev->dev_flags))
3839 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
3840 conn->dst_type, conn->passkey_notify,
3841 conn->passkey_entered);
3842}
3843
3844static void hci_keypress_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
3845{
3846 struct hci_ev_keypress_notify *ev = (void *) skb->data;
3847 struct hci_conn *conn;
3848
3849 BT_DBG("%s", hdev->name);
3850
3851 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3852 if (!conn)
3853 return;
3854
3855 switch (ev->type) {
3856 case HCI_KEYPRESS_STARTED:
3857 conn->passkey_entered = 0;
3858 return;
3859
3860 case HCI_KEYPRESS_ENTERED:
3861 conn->passkey_entered++;
3862 break;
3863
3864 case HCI_KEYPRESS_ERASED:
3865 conn->passkey_entered--;
3866 break;
3867
3868 case HCI_KEYPRESS_CLEARED:
3869 conn->passkey_entered = 0;
3870 break;
3871
3872 case HCI_KEYPRESS_COMPLETED:
3873 return;
3874 }
3875
3876 if (test_bit(HCI_MGMT, &hdev->dev_flags))
3877 mgmt_user_passkey_notify(hdev, &conn->dst, conn->type,
3878 conn->dst_type, conn->passkey_notify,
3879 conn->passkey_entered);
3880}
3881
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003882static void hci_simple_pair_complete_evt(struct hci_dev *hdev,
3883 struct sk_buff *skb)
Marcel Holtmann04936842008-07-14 20:13:48 +02003884{
3885 struct hci_ev_simple_pair_complete *ev = (void *) skb->data;
3886 struct hci_conn *conn;
3887
3888 BT_DBG("%s", hdev->name);
3889
3890 hci_dev_lock(hdev);
3891
3892 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
Johan Hedberg2a611692011-02-19 12:06:00 -03003893 if (!conn)
3894 goto unlock;
Marcel Holtmann04936842008-07-14 20:13:48 +02003895
Johan Hedberg2a611692011-02-19 12:06:00 -03003896 /* To avoid duplicate auth_failed events to user space we check
3897 * the HCI_CONN_AUTH_PEND flag which will be set if we
3898 * initiated the authentication. A traditional auth_complete
3899 * event gets always produced as initiator and is also mapped to
3900 * the mgmt_auth_failed event */
Mikel Astizfa1bd912012-08-09 09:52:29 +02003901 if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) && ev->status)
Johan Hedbergbab73cb2012-02-09 16:07:29 +02003902 mgmt_auth_failed(hdev, &conn->dst, conn->type, conn->dst_type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03003903 ev->status);
Johan Hedberg2a611692011-02-19 12:06:00 -03003904
David Herrmann76a68ba2013-04-06 20:28:37 +02003905 hci_conn_drop(conn);
Johan Hedberg2a611692011-02-19 12:06:00 -03003906
3907unlock:
Marcel Holtmann04936842008-07-14 20:13:48 +02003908 hci_dev_unlock(hdev);
3909}
3910
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003911static void hci_remote_host_features_evt(struct hci_dev *hdev,
3912 struct sk_buff *skb)
Marcel Holtmann41a96212008-07-14 20:13:48 +02003913{
3914 struct hci_ev_remote_host_features *ev = (void *) skb->data;
3915 struct inquiry_entry *ie;
Johan Hedbergcad718e2013-04-17 15:00:51 +03003916 struct hci_conn *conn;
Marcel Holtmann41a96212008-07-14 20:13:48 +02003917
3918 BT_DBG("%s", hdev->name);
3919
3920 hci_dev_lock(hdev);
3921
Johan Hedbergcad718e2013-04-17 15:00:51 +03003922 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
3923 if (conn)
3924 memcpy(conn->features[1], ev->features, 8);
3925
Andrei Emeltchenkocc11b9c2010-11-22 13:21:37 +02003926 ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
3927 if (ie)
Johan Hedberg02b7cc62012-02-28 02:28:43 +02003928 ie->data.ssp_mode = (ev->features[0] & LMP_HOST_SSP);
Marcel Holtmann41a96212008-07-14 20:13:48 +02003929
3930 hci_dev_unlock(hdev);
3931}
3932
Gustavo Padovan6039aa732012-05-23 04:04:18 -03003933static void hci_remote_oob_data_request_evt(struct hci_dev *hdev,
3934 struct sk_buff *skb)
Szymon Janc2763eda2011-03-22 13:12:22 +01003935{
3936 struct hci_ev_remote_oob_data_request *ev = (void *) skb->data;
3937 struct oob_data *data;
3938
3939 BT_DBG("%s", hdev->name);
3940
3941 hci_dev_lock(hdev);
3942
Johan Hedberga8b2d5c2012-01-08 23:11:15 +02003943 if (!test_bit(HCI_MGMT, &hdev->dev_flags))
Szymon Jance1ba1f12011-04-06 13:01:59 +02003944 goto unlock;
3945
Szymon Janc2763eda2011-03-22 13:12:22 +01003946 data = hci_find_remote_oob_data(hdev, &ev->bdaddr);
3947 if (data) {
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08003948 if (test_bit(HCI_SC_ENABLED, &hdev->dev_flags)) {
3949 struct hci_cp_remote_oob_ext_data_reply cp;
Szymon Janc2763eda2011-03-22 13:12:22 +01003950
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08003951 bacpy(&cp.bdaddr, &ev->bdaddr);
3952 memcpy(cp.hash192, data->hash192, sizeof(cp.hash192));
3953 memcpy(cp.randomizer192, data->randomizer192,
3954 sizeof(cp.randomizer192));
3955 memcpy(cp.hash256, data->hash256, sizeof(cp.hash256));
3956 memcpy(cp.randomizer256, data->randomizer256,
3957 sizeof(cp.randomizer256));
Szymon Janc2763eda2011-03-22 13:12:22 +01003958
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08003959 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_EXT_DATA_REPLY,
3960 sizeof(cp), &cp);
3961 } else {
3962 struct hci_cp_remote_oob_data_reply cp;
3963
3964 bacpy(&cp.bdaddr, &ev->bdaddr);
3965 memcpy(cp.hash, data->hash192, sizeof(cp.hash));
3966 memcpy(cp.randomizer, data->randomizer192,
3967 sizeof(cp.randomizer));
3968
3969 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_REPLY,
3970 sizeof(cp), &cp);
3971 }
Szymon Janc2763eda2011-03-22 13:12:22 +01003972 } else {
3973 struct hci_cp_remote_oob_data_neg_reply cp;
3974
3975 bacpy(&cp.bdaddr, &ev->bdaddr);
Marcel Holtmann519ca9d2014-01-10 02:07:28 -08003976 hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_NEG_REPLY,
3977 sizeof(cp), &cp);
Szymon Janc2763eda2011-03-22 13:12:22 +01003978 }
3979
Szymon Jance1ba1f12011-04-06 13:01:59 +02003980unlock:
Szymon Janc2763eda2011-03-22 13:12:22 +01003981 hci_dev_unlock(hdev);
3982}
3983
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03003984static void hci_phy_link_complete_evt(struct hci_dev *hdev,
3985 struct sk_buff *skb)
3986{
3987 struct hci_ev_phy_link_complete *ev = (void *) skb->data;
3988 struct hci_conn *hcon, *bredr_hcon;
3989
3990 BT_DBG("%s handle 0x%2.2x status 0x%2.2x", hdev->name, ev->phy_handle,
3991 ev->status);
3992
3993 hci_dev_lock(hdev);
3994
3995 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
3996 if (!hcon) {
3997 hci_dev_unlock(hdev);
3998 return;
3999 }
4000
4001 if (ev->status) {
4002 hci_conn_del(hcon);
4003 hci_dev_unlock(hdev);
4004 return;
4005 }
4006
4007 bredr_hcon = hcon->amp_mgr->l2cap_conn->hcon;
4008
4009 hcon->state = BT_CONNECTED;
4010 bacpy(&hcon->dst, &bredr_hcon->dst);
4011
4012 hci_conn_hold(hcon);
4013 hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
David Herrmann76a68ba2013-04-06 20:28:37 +02004014 hci_conn_drop(hcon);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004015
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004016 hci_conn_add_sysfs(hcon);
4017
Andrei Emeltchenkocf70ff22012-10-31 15:46:36 +02004018 amp_physical_cfm(bredr_hcon, hcon);
4019
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004020 hci_dev_unlock(hdev);
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004021}
4022
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004023static void hci_loglink_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
4024{
4025 struct hci_ev_logical_link_complete *ev = (void *) skb->data;
4026 struct hci_conn *hcon;
4027 struct hci_chan *hchan;
4028 struct amp_mgr *mgr;
4029
4030 BT_DBG("%s log_handle 0x%4.4x phy_handle 0x%2.2x status 0x%2.2x",
4031 hdev->name, le16_to_cpu(ev->handle), ev->phy_handle,
4032 ev->status);
4033
4034 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4035 if (!hcon)
4036 return;
4037
4038 /* Create AMP hchan */
4039 hchan = hci_chan_create(hcon);
4040 if (!hchan)
4041 return;
4042
4043 hchan->handle = le16_to_cpu(ev->handle);
4044
4045 BT_DBG("hcon %p mgr %p hchan %p", hcon, hcon->amp_mgr, hchan);
4046
4047 mgr = hcon->amp_mgr;
4048 if (mgr && mgr->bredr_chan) {
4049 struct l2cap_chan *bredr_chan = mgr->bredr_chan;
4050
4051 l2cap_chan_lock(bredr_chan);
4052
4053 bredr_chan->conn->mtu = hdev->block_mtu;
4054 l2cap_logical_cfm(bredr_chan, hchan, 0);
4055 hci_conn_hold(hcon);
4056
4057 l2cap_chan_unlock(bredr_chan);
4058 }
4059}
4060
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02004061static void hci_disconn_loglink_complete_evt(struct hci_dev *hdev,
4062 struct sk_buff *skb)
4063{
4064 struct hci_ev_disconn_logical_link_complete *ev = (void *) skb->data;
4065 struct hci_chan *hchan;
4066
4067 BT_DBG("%s log handle 0x%4.4x status 0x%2.2x", hdev->name,
4068 le16_to_cpu(ev->handle), ev->status);
4069
4070 if (ev->status)
4071 return;
4072
4073 hci_dev_lock(hdev);
4074
4075 hchan = hci_chan_lookup_handle(hdev, le16_to_cpu(ev->handle));
4076 if (!hchan)
4077 goto unlock;
4078
4079 amp_destroy_logical_link(hchan, ev->reason);
4080
4081unlock:
4082 hci_dev_unlock(hdev);
4083}
4084
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02004085static void hci_disconn_phylink_complete_evt(struct hci_dev *hdev,
4086 struct sk_buff *skb)
4087{
4088 struct hci_ev_disconn_phy_link_complete *ev = (void *) skb->data;
4089 struct hci_conn *hcon;
4090
4091 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4092
4093 if (ev->status)
4094 return;
4095
4096 hci_dev_lock(hdev);
4097
4098 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4099 if (hcon) {
4100 hcon->state = BT_CLOSED;
4101 hci_conn_del(hcon);
4102 }
4103
4104 hci_dev_unlock(hdev);
4105}
4106
Gustavo Padovan6039aa732012-05-23 04:04:18 -03004107static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03004108{
4109 struct hci_ev_le_conn_complete *ev = (void *) skb->data;
Johan Hedberg912b42e2014-07-03 19:33:49 +03004110 struct hci_conn_params *params;
Ville Tervofcd89c02011-02-10 22:38:47 -03004111 struct hci_conn *conn;
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004112 struct smp_irk *irk;
Johan Hedberg837d5022014-07-02 09:36:22 +03004113 u8 addr_type;
Ville Tervofcd89c02011-02-10 22:38:47 -03004114
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004115 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
Ville Tervofcd89c02011-02-10 22:38:47 -03004116
4117 hci_dev_lock(hdev);
4118
Johan Hedbergfbd96c12014-07-08 17:21:51 +03004119 /* All controllers implicitly stop advertising in the event of a
4120 * connection, so ensure that the state bit is cleared.
4121 */
4122 clear_bit(HCI_LE_ADV, &hdev->dev_flags);
4123
Andre Guedesb47a09b2012-07-27 15:10:15 -03004124 conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
Ville Tervob62f3282011-02-10 22:38:50 -03004125 if (!conn) {
4126 conn = hci_conn_add(hdev, LE_LINK, &ev->bdaddr);
4127 if (!conn) {
4128 BT_ERR("No memory for new connection");
Andre Guedes230fd162012-07-27 15:10:10 -03004129 goto unlock;
Ville Tervob62f3282011-02-10 22:38:50 -03004130 }
Andre Guedes29b79882011-05-31 14:20:54 -03004131
4132 conn->dst_type = ev->bdaddr_type;
Andre Guedesb9b343d2012-07-27 15:10:11 -03004133
4134 if (ev->role == LE_CONN_ROLE_MASTER) {
4135 conn->out = true;
Johan Hedberg4dae2792014-06-24 17:03:50 +03004136 set_bit(HCI_CONN_MASTER, &conn->flags);
Andre Guedesb9b343d2012-07-27 15:10:11 -03004137 }
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004138
4139 /* If we didn't have a hci_conn object previously
4140 * but we're in master role this must be something
4141 * initiated using a white list. Since white list based
4142 * connections are not "first class citizens" we don't
4143 * have full tracking of them. Therefore, we go ahead
4144 * with a "best effort" approach of determining the
4145 * initiator address based on the HCI_PRIVACY flag.
4146 */
4147 if (conn->out) {
4148 conn->resp_addr_type = ev->bdaddr_type;
4149 bacpy(&conn->resp_addr, &ev->bdaddr);
4150 if (test_bit(HCI_PRIVACY, &hdev->dev_flags)) {
4151 conn->init_addr_type = ADDR_LE_DEV_RANDOM;
4152 bacpy(&conn->init_addr, &hdev->rpa);
4153 } else {
4154 hci_copy_identity_address(hdev,
4155 &conn->init_addr,
4156 &conn->init_addr_type);
4157 }
Johan Hedbergcb1d68f2014-02-28 12:54:16 +02004158 }
Johan Hedberg9489eca2014-02-28 17:45:46 +02004159 } else {
4160 cancel_delayed_work(&conn->le_conn_timeout);
Ville Tervob62f3282011-02-10 22:38:50 -03004161 }
Ville Tervofcd89c02011-02-10 22:38:47 -03004162
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004163 if (!conn->out) {
4164 /* Set the responder (our side) address type based on
4165 * the advertising address type.
4166 */
4167 conn->resp_addr_type = hdev->adv_addr_type;
4168 if (hdev->adv_addr_type == ADDR_LE_DEV_RANDOM)
4169 bacpy(&conn->resp_addr, &hdev->random_addr);
4170 else
4171 bacpy(&conn->resp_addr, &hdev->bdaddr);
4172
4173 conn->init_addr_type = ev->bdaddr_type;
4174 bacpy(&conn->init_addr, &ev->bdaddr);
Marcel Holtmanna720d732014-06-23 12:14:51 +02004175
4176 /* For incoming connections, set the default minimum
4177 * and maximum connection interval. They will be used
4178 * to check if the parameters are in range and if not
4179 * trigger the connection update procedure.
4180 */
4181 conn->le_conn_min_interval = hdev->le_conn_min_interval;
4182 conn->le_conn_max_interval = hdev->le_conn_max_interval;
Johan Hedberg80c24ab2014-03-24 20:21:51 +02004183 }
Johan Hedberg7be2edb2014-02-23 19:42:17 +02004184
Marcel Holtmannedb4b462014-02-18 15:13:43 -08004185 /* Lookup the identity address from the stored connection
4186 * address and address type.
4187 *
4188 * When establishing connections to an identity address, the
4189 * connection procedure will store the resolvable random
4190 * address first. Now if it can be converted back into the
4191 * identity address, start using the identity address from
4192 * now on.
4193 */
4194 irk = hci_get_irk(hdev, &conn->dst, conn->dst_type);
Johan Hedberg68d6f6d2014-02-18 21:41:32 +02004195 if (irk) {
4196 bacpy(&conn->dst, &irk->bdaddr);
4197 conn->dst_type = irk->addr_type;
4198 }
4199
Johan Hedberg837d5022014-07-02 09:36:22 +03004200 if (conn->dst_type == ADDR_LE_DEV_PUBLIC)
4201 addr_type = BDADDR_LE_PUBLIC;
4202 else
4203 addr_type = BDADDR_LE_RANDOM;
4204
4205 /* Drop the connection if he device is blocked */
Johan Hedbergdcc36c12014-07-09 12:59:13 +03004206 if (hci_bdaddr_list_lookup(&hdev->blacklist, &conn->dst, addr_type)) {
Johan Hedberg837d5022014-07-02 09:36:22 +03004207 hci_conn_drop(conn);
4208 goto unlock;
4209 }
4210
Andre Guedescd17dec2012-07-27 15:10:16 -03004211 if (ev->status) {
Andre Guedes06c053f2014-02-26 20:21:41 -03004212 hci_le_conn_failed(conn, ev->status);
Andre Guedescd17dec2012-07-27 15:10:16 -03004213 goto unlock;
4214 }
4215
Johan Hedbergb644ba32012-01-17 21:48:47 +02004216 if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
Marcel Holtmann01fdb0f2014-02-18 14:22:19 -08004217 mgmt_device_connected(hdev, &conn->dst, conn->type,
Gustavo F. Padovan04124682012-03-08 01:25:00 -03004218 conn->dst_type, 0, NULL, 0, NULL);
Vinicius Costa Gomes83bc71b2011-05-06 18:41:43 -03004219
Vinicius Costa Gomes7b5c0d52011-06-09 18:50:50 -03004220 conn->sec_level = BT_SECURITY_LOW;
Ville Tervofcd89c02011-02-10 22:38:47 -03004221 conn->handle = __le16_to_cpu(ev->handle);
4222 conn->state = BT_CONNECTED;
4223
Marcel Holtmanne04fde62014-06-23 11:40:04 +02004224 conn->le_conn_interval = le16_to_cpu(ev->interval);
4225 conn->le_conn_latency = le16_to_cpu(ev->latency);
4226 conn->le_supv_timeout = le16_to_cpu(ev->supervision_timeout);
4227
Ville Tervofcd89c02011-02-10 22:38:47 -03004228 hci_conn_add_sysfs(conn);
4229
4230 hci_proto_connect_cfm(conn, ev->status);
4231
Johan Hedberg912b42e2014-07-03 19:33:49 +03004232 params = hci_conn_params_lookup(hdev, &conn->dst, conn->dst_type);
Johan Hedberg223683a2014-07-06 15:44:23 +03004233 if (params)
Johan Hedberg95305ba2014-07-04 12:37:21 +03004234 list_del_init(&params->action);
Andre Guedesa4790db2014-02-26 20:21:47 -03004235
Ville Tervofcd89c02011-02-10 22:38:47 -03004236unlock:
Johan Hedberg223683a2014-07-06 15:44:23 +03004237 hci_update_background_scan(hdev);
Ville Tervofcd89c02011-02-10 22:38:47 -03004238 hci_dev_unlock(hdev);
4239}
4240
Marcel Holtmann1855d922014-06-23 11:40:05 +02004241static void hci_le_conn_update_complete_evt(struct hci_dev *hdev,
4242 struct sk_buff *skb)
4243{
4244 struct hci_ev_le_conn_update_complete *ev = (void *) skb->data;
4245 struct hci_conn *conn;
4246
4247 BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
4248
4249 if (ev->status)
4250 return;
4251
4252 hci_dev_lock(hdev);
4253
4254 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
4255 if (conn) {
4256 conn->le_conn_interval = le16_to_cpu(ev->interval);
4257 conn->le_conn_latency = le16_to_cpu(ev->latency);
4258 conn->le_supv_timeout = le16_to_cpu(ev->supervision_timeout);
4259 }
4260
4261 hci_dev_unlock(hdev);
4262}
4263
Andre Guedesa4790db2014-02-26 20:21:47 -03004264/* This function requires the caller holds hdev->lock */
Johan Hedberg7e899c92014-07-07 12:45:55 +03004265static void check_pending_le_conn(struct hci_dev *hdev, bdaddr_t *addr,
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004266 u8 addr_type, u8 adv_type)
Andre Guedesa4790db2014-02-26 20:21:47 -03004267{
4268 struct hci_conn *conn;
4269
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004270 /* If the event is not connectable don't proceed further */
4271 if (adv_type != LE_ADV_IND && adv_type != LE_ADV_DIRECT_IND)
Johan Hedberg7e899c92014-07-07 12:45:55 +03004272 return;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004273
4274 /* Ignore if the device is blocked */
Johan Hedbergdcc36c12014-07-09 12:59:13 +03004275 if (hci_bdaddr_list_lookup(&hdev->blacklist, addr, addr_type))
Johan Hedberg7e899c92014-07-07 12:45:55 +03004276 return;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004277
4278 /* If we're connectable, always connect any ADV_DIRECT_IND event */
4279 if (test_bit(HCI_CONNECTABLE, &hdev->dev_flags) &&
4280 adv_type == LE_ADV_DIRECT_IND)
4281 goto connect;
4282
4283 /* If we're not connectable only connect devices that we have in
4284 * our pend_le_conns list.
4285 */
Johan Hedberg501f8822014-07-04 12:37:26 +03004286 if (!hci_pend_le_action_lookup(&hdev->pend_le_conns, addr, addr_type))
Johan Hedberg7e899c92014-07-07 12:45:55 +03004287 return;
Andre Guedesa4790db2014-02-26 20:21:47 -03004288
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004289connect:
Johan Hedbergcdd62752014-07-07 15:02:28 +03004290 /* Request connection in master = true role */
Andre Guedesa4790db2014-02-26 20:21:47 -03004291 conn = hci_connect_le(hdev, addr, addr_type, BT_SECURITY_LOW,
Johan Hedbergcdd62752014-07-07 15:02:28 +03004292 HCI_LE_AUTOCONN_TIMEOUT, true);
Andre Guedesa4790db2014-02-26 20:21:47 -03004293 if (!IS_ERR(conn))
Johan Hedberg7e899c92014-07-07 12:45:55 +03004294 return;
Andre Guedesa4790db2014-02-26 20:21:47 -03004295
4296 switch (PTR_ERR(conn)) {
4297 case -EBUSY:
4298 /* If hci_connect() returns -EBUSY it means there is already
4299 * an LE connection attempt going on. Since controllers don't
4300 * support more than one connection attempt at the time, we
4301 * don't consider this an error case.
4302 */
4303 break;
4304 default:
4305 BT_DBG("Failed to connect: err %ld", PTR_ERR(conn));
4306 }
4307}
4308
Johan Hedberg4af605d2014-03-24 10:48:00 +02004309static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr,
4310 u8 bdaddr_type, s8 rssi, u8 *data, u8 len)
4311{
Johan Hedbergb9a63282014-03-25 10:51:52 +02004312 struct discovery_state *d = &hdev->discovery;
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004313 struct smp_irk *irk;
Johan Hedberg474ee062014-03-25 14:34:59 +02004314 bool match;
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004315 u32 flags;
Johan Hedbergb9a63282014-03-25 10:51:52 +02004316
Johan Hedberg1c1abca2014-07-07 12:45:53 +03004317 /* Check if we need to convert to identity address */
4318 irk = hci_get_irk(hdev, bdaddr, bdaddr_type);
4319 if (irk) {
4320 bdaddr = &irk->bdaddr;
4321 bdaddr_type = irk->addr_type;
4322 }
4323
4324 /* Check if we have been requested to connect to this device */
4325 check_pending_le_conn(hdev, bdaddr, bdaddr_type, type);
4326
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004327 /* Passive scanning shouldn't trigger any device found events,
4328 * except for devices marked as CONN_REPORT for which we do send
4329 * device found events.
4330 */
Johan Hedbergca5c4be2014-03-25 10:30:46 +02004331 if (hdev->le_scan_type == LE_SCAN_PASSIVE) {
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004332 struct hci_conn_params *param;
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004333
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004334 if (type == LE_ADV_DIRECT_IND)
4335 return;
4336
Johan Hedberga7545f22014-07-04 12:37:27 +03004337 param = hci_pend_le_action_lookup(&hdev->pend_le_reports,
4338 bdaddr, bdaddr_type);
4339 if (!param)
Johan Hedberg0d2bf132014-07-02 22:42:02 +03004340 return;
4341
4342 if (type == LE_ADV_NONCONN_IND || type == LE_ADV_SCAN_IND)
4343 flags = MGMT_DEV_FOUND_NOT_CONNECTABLE;
4344 else
4345 flags = 0;
4346 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
4347 rssi, flags, data, len, NULL, 0);
Johan Hedberg97bf2e92014-07-04 12:37:16 +03004348 return;
Johan Hedbergca5c4be2014-03-25 10:30:46 +02004349 }
Johan Hedberg4af605d2014-03-24 10:48:00 +02004350
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004351 /* When receiving non-connectable or scannable undirected
4352 * advertising reports, this means that the remote device is
4353 * not connectable and then clearly indicate this in the
4354 * device found event.
4355 *
4356 * When receiving a scan response, then there is no way to
4357 * know if the remote device is connectable or not. However
4358 * since scan responses are merged with a previously seen
4359 * advertising report, the flags field from that report
4360 * will be used.
4361 *
4362 * In the really unlikely case that a controller get confused
4363 * and just sends a scan response event, then it is marked as
4364 * not connectable as well.
4365 */
4366 if (type == LE_ADV_NONCONN_IND || type == LE_ADV_SCAN_IND ||
4367 type == LE_ADV_SCAN_RSP)
4368 flags = MGMT_DEV_FOUND_NOT_CONNECTABLE;
4369 else
4370 flags = 0;
4371
Johan Hedbergb9a63282014-03-25 10:51:52 +02004372 /* If there's nothing pending either store the data from this
4373 * event or send an immediate device found event if the data
4374 * should not be stored for later.
4375 */
4376 if (!has_pending_adv_report(hdev)) {
4377 /* If the report will trigger a SCAN_REQ store it for
4378 * later merging.
4379 */
4380 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
4381 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004382 rssi, flags, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004383 return;
4384 }
4385
4386 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004387 rssi, flags, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004388 return;
4389 }
4390
Johan Hedberg474ee062014-03-25 14:34:59 +02004391 /* Check if the pending report is for the same device as the new one */
4392 match = (!bacmp(bdaddr, &d->last_adv_addr) &&
4393 bdaddr_type == d->last_adv_addr_type);
4394
Johan Hedbergb9a63282014-03-25 10:51:52 +02004395 /* If the pending data doesn't match this report or this isn't a
4396 * scan response (e.g. we got a duplicate ADV_IND) then force
4397 * sending of the pending data.
4398 */
Johan Hedberg474ee062014-03-25 14:34:59 +02004399 if (type != LE_ADV_SCAN_RSP || !match) {
4400 /* Send out whatever is in the cache, but skip duplicates */
4401 if (!match)
4402 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004403 d->last_adv_addr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004404 d->last_adv_rssi, d->last_adv_flags,
Johan Hedbergff5cd292014-03-25 14:40:52 +02004405 d->last_adv_data,
Johan Hedberg474ee062014-03-25 14:34:59 +02004406 d->last_adv_data_len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004407
4408 /* If the new report will trigger a SCAN_REQ store it for
4409 * later merging.
4410 */
4411 if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
4412 store_pending_adv_report(hdev, bdaddr, bdaddr_type,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004413 rssi, flags, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004414 return;
4415 }
4416
4417 /* The advertising reports cannot be merged, so clear
4418 * the pending report and send out a device found event.
4419 */
4420 clear_pending_adv_report(hdev);
Johan Hedberg5c5b93e2014-03-29 08:39:53 +02004421 mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004422 rssi, flags, data, len, NULL, 0);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004423 return;
4424 }
4425
4426 /* If we get here we've got a pending ADV_IND or ADV_SCAN_IND and
4427 * the new event is a SCAN_RSP. We can therefore proceed with
4428 * sending a merged device found event.
4429 */
4430 mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
Marcel Holtmannc70a7e42014-07-01 14:11:21 +02004431 d->last_adv_addr_type, NULL, rssi, d->last_adv_flags,
Marcel Holtmann42bd6a52014-07-01 14:11:19 +02004432 d->last_adv_data, d->last_adv_data_len, data, len);
Johan Hedbergb9a63282014-03-25 10:51:52 +02004433 clear_pending_adv_report(hdev);
Johan Hedberg4af605d2014-03-24 10:48:00 +02004434}
4435
Gustavo Padovan6039aa732012-05-23 04:04:18 -03004436static void hci_le_adv_report_evt(struct hci_dev *hdev, struct sk_buff *skb)
Andre Guedes9aa04c92011-05-26 16:23:51 -03004437{
Andre Guedese95beb42011-09-26 20:48:35 -03004438 u8 num_reports = skb->data[0];
4439 void *ptr = &skb->data[1];
Andre Guedes9aa04c92011-05-26 16:23:51 -03004440
Andre Guedesa4790db2014-02-26 20:21:47 -03004441 hci_dev_lock(hdev);
4442
Andre Guedese95beb42011-09-26 20:48:35 -03004443 while (num_reports--) {
4444 struct hci_ev_le_advertising_info *ev = ptr;
Johan Hedberg4af605d2014-03-24 10:48:00 +02004445 s8 rssi;
Andre Guedesa4790db2014-02-26 20:21:47 -03004446
Andre Guedes3c9e9192012-01-10 18:20:50 -03004447 rssi = ev->data[ev->length];
Johan Hedberg4af605d2014-03-24 10:48:00 +02004448 process_adv_report(hdev, ev->evt_type, &ev->bdaddr,
4449 ev->bdaddr_type, rssi, ev->data, ev->length);
Andre Guedes3c9e9192012-01-10 18:20:50 -03004450
Andre Guedese95beb42011-09-26 20:48:35 -03004451 ptr += sizeof(*ev) + ev->length + 1;
Andre Guedes9aa04c92011-05-26 16:23:51 -03004452 }
Andre Guedesa4790db2014-02-26 20:21:47 -03004453
4454 hci_dev_unlock(hdev);
Andre Guedes9aa04c92011-05-26 16:23:51 -03004455}
4456
Gustavo Padovan6039aa732012-05-23 04:04:18 -03004457static void hci_le_ltk_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004458{
4459 struct hci_ev_le_ltk_req *ev = (void *) skb->data;
4460 struct hci_cp_le_ltk_reply cp;
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004461 struct hci_cp_le_ltk_neg_reply neg;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004462 struct hci_conn *conn;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004463 struct smp_ltk *ltk;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004464
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004465 BT_DBG("%s handle 0x%4.4x", hdev->name, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004466
4467 hci_dev_lock(hdev);
4468
4469 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004470 if (conn == NULL)
4471 goto not_found;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004472
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -08004473 ltk = hci_find_ltk(hdev, ev->ediv, ev->rand, conn->out);
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004474 if (ltk == NULL)
4475 goto not_found;
4476
4477 memcpy(cp.ltk, ltk->val, sizeof(ltk->val));
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004478 cp.handle = cpu_to_le16(conn->handle);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004479
4480 if (ltk->authenticated)
Andre Guedesf8776212013-07-31 16:25:28 -03004481 conn->pending_sec_level = BT_SECURITY_HIGH;
4482 else
4483 conn->pending_sec_level = BT_SECURITY_MEDIUM;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004484
Andre Guedes89cbb4d2013-07-31 16:25:29 -03004485 conn->enc_key_size = ltk->enc_size;
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004486
4487 hci_send_cmd(hdev, HCI_OP_LE_LTK_REPLY, sizeof(cp), &cp);
4488
Claudio Takahasi5981a882013-07-25 16:34:24 -03004489 /* Ref. Bluetooth Core SPEC pages 1975 and 2004. STK is a
4490 * temporary key used to encrypt a connection following
4491 * pairing. It is used during the Encrypted Session Setup to
4492 * distribute the keys. Later, security can be re-established
4493 * using a distributed LTK.
4494 */
Johan Hedberg2ceba532014-06-16 19:25:16 +03004495 if (ltk->type == SMP_STK) {
Johan Hedbergfe59a052014-07-01 19:14:12 +03004496 set_bit(HCI_CONN_STK_ENCRYPT, &conn->flags);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004497 list_del(&ltk->list);
4498 kfree(ltk);
Johan Hedbergfe59a052014-07-01 19:14:12 +03004499 } else {
4500 clear_bit(HCI_CONN_STK_ENCRYPT, &conn->flags);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03004501 }
4502
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004503 hci_dev_unlock(hdev);
Vinicius Costa Gomesbea710f2011-07-07 18:59:37 -03004504
4505 return;
4506
4507not_found:
4508 neg.handle = ev->handle;
4509 hci_send_cmd(hdev, HCI_OP_LE_LTK_NEG_REPLY, sizeof(neg), &neg);
4510 hci_dev_unlock(hdev);
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004511}
4512
Andre Guedes8e75b462014-07-01 18:10:08 -03004513static void send_conn_param_neg_reply(struct hci_dev *hdev, u16 handle,
4514 u8 reason)
4515{
4516 struct hci_cp_le_conn_param_req_neg_reply cp;
4517
4518 cp.handle = cpu_to_le16(handle);
4519 cp.reason = reason;
4520
4521 hci_send_cmd(hdev, HCI_OP_LE_CONN_PARAM_REQ_NEG_REPLY, sizeof(cp),
4522 &cp);
4523}
4524
4525static void hci_le_remote_conn_param_req_evt(struct hci_dev *hdev,
4526 struct sk_buff *skb)
4527{
4528 struct hci_ev_le_remote_conn_param_req *ev = (void *) skb->data;
4529 struct hci_cp_le_conn_param_req_reply cp;
4530 struct hci_conn *hcon;
4531 u16 handle, min, max, latency, timeout;
4532
4533 handle = le16_to_cpu(ev->handle);
4534 min = le16_to_cpu(ev->interval_min);
4535 max = le16_to_cpu(ev->interval_max);
4536 latency = le16_to_cpu(ev->latency);
4537 timeout = le16_to_cpu(ev->timeout);
4538
4539 hcon = hci_conn_hash_lookup_handle(hdev, handle);
4540 if (!hcon || hcon->state != BT_CONNECTED)
4541 return send_conn_param_neg_reply(hdev, handle,
4542 HCI_ERROR_UNKNOWN_CONN_ID);
4543
4544 if (hci_check_conn_params(min, max, latency, timeout))
4545 return send_conn_param_neg_reply(hdev, handle,
4546 HCI_ERROR_INVALID_LL_PARAMS);
4547
Johan Hedberg348d50b2014-07-02 17:37:30 +03004548 if (test_bit(HCI_CONN_MASTER, &hcon->flags)) {
4549 struct hci_conn_params *params;
Johan Hedbergf4869e22014-07-02 17:37:32 +03004550 u8 store_hint;
Johan Hedberg348d50b2014-07-02 17:37:30 +03004551
4552 hci_dev_lock(hdev);
4553
4554 params = hci_conn_params_lookup(hdev, &hcon->dst,
4555 hcon->dst_type);
4556 if (params) {
4557 params->conn_min_interval = min;
4558 params->conn_max_interval = max;
4559 params->conn_latency = latency;
4560 params->supervision_timeout = timeout;
Johan Hedbergf4869e22014-07-02 17:37:32 +03004561 store_hint = 0x01;
4562 } else{
4563 store_hint = 0x00;
Johan Hedberg348d50b2014-07-02 17:37:30 +03004564 }
4565
4566 hci_dev_unlock(hdev);
4567
Johan Hedbergf4869e22014-07-02 17:37:32 +03004568 mgmt_new_conn_param(hdev, &hcon->dst, hcon->dst_type,
4569 store_hint, min, max, latency, timeout);
Johan Hedberg348d50b2014-07-02 17:37:30 +03004570 }
Andre Guedesffb5a8272014-07-01 18:10:11 -03004571
Andre Guedes8e75b462014-07-01 18:10:08 -03004572 cp.handle = ev->handle;
4573 cp.interval_min = ev->interval_min;
4574 cp.interval_max = ev->interval_max;
4575 cp.latency = ev->latency;
4576 cp.timeout = ev->timeout;
4577 cp.min_ce_len = 0;
4578 cp.max_ce_len = 0;
4579
4580 hci_send_cmd(hdev, HCI_OP_LE_CONN_PARAM_REQ_REPLY, sizeof(cp), &cp);
4581}
4582
Gustavo Padovan6039aa732012-05-23 04:04:18 -03004583static void hci_le_meta_evt(struct hci_dev *hdev, struct sk_buff *skb)
Ville Tervofcd89c02011-02-10 22:38:47 -03004584{
4585 struct hci_ev_le_meta *le_ev = (void *) skb->data;
4586
4587 skb_pull(skb, sizeof(*le_ev));
4588
4589 switch (le_ev->subevent) {
4590 case HCI_EV_LE_CONN_COMPLETE:
4591 hci_le_conn_complete_evt(hdev, skb);
4592 break;
4593
Marcel Holtmann1855d922014-06-23 11:40:05 +02004594 case HCI_EV_LE_CONN_UPDATE_COMPLETE:
4595 hci_le_conn_update_complete_evt(hdev, skb);
4596 break;
4597
Andre Guedes9aa04c92011-05-26 16:23:51 -03004598 case HCI_EV_LE_ADVERTISING_REPORT:
4599 hci_le_adv_report_evt(hdev, skb);
4600 break;
4601
Vinicius Costa Gomesa7a595f2011-06-09 18:50:47 -03004602 case HCI_EV_LE_LTK_REQ:
4603 hci_le_ltk_request_evt(hdev, skb);
4604 break;
4605
Andre Guedes8e75b462014-07-01 18:10:08 -03004606 case HCI_EV_LE_REMOTE_CONN_PARAM_REQ:
4607 hci_le_remote_conn_param_req_evt(hdev, skb);
4608 break;
4609
Ville Tervofcd89c02011-02-10 22:38:47 -03004610 default:
4611 break;
4612 }
4613}
4614
Andrei Emeltchenko9495b2e2012-09-27 17:26:22 +03004615static void hci_chan_selected_evt(struct hci_dev *hdev, struct sk_buff *skb)
4616{
4617 struct hci_ev_channel_selected *ev = (void *) skb->data;
4618 struct hci_conn *hcon;
4619
4620 BT_DBG("%s handle 0x%2.2x", hdev->name, ev->phy_handle);
4621
4622 skb_pull(skb, sizeof(*ev));
4623
4624 hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle);
4625 if (!hcon)
4626 return;
4627
4628 amp_read_loc_assoc_final_data(hdev, hcon);
4629}
4630
Linus Torvalds1da177e2005-04-16 15:20:36 -07004631void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)
4632{
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004633 struct hci_event_hdr *hdr = (void *) skb->data;
4634 __u8 event = hdr->evt;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004635
Johan Hedbergb6ddb632013-04-02 13:34:31 +03004636 hci_dev_lock(hdev);
4637
4638 /* Received events are (currently) only needed when a request is
4639 * ongoing so avoid unnecessary memory allocation.
4640 */
4641 if (hdev->req_status == HCI_REQ_PEND) {
4642 kfree_skb(hdev->recv_evt);
4643 hdev->recv_evt = skb_clone(skb, GFP_KERNEL);
4644 }
4645
4646 hci_dev_unlock(hdev);
4647
Linus Torvalds1da177e2005-04-16 15:20:36 -07004648 skb_pull(skb, HCI_EVENT_HDR_SIZE);
4649
Johan Hedberg02350a72013-04-03 21:50:29 +03004650 if (hdev->sent_cmd && bt_cb(hdev->sent_cmd)->req.event == event) {
Johannes Bergc1f23a22013-10-07 18:19:16 +02004651 struct hci_command_hdr *cmd_hdr = (void *) hdev->sent_cmd->data;
4652 u16 opcode = __le16_to_cpu(cmd_hdr->opcode);
Johan Hedberg02350a72013-04-03 21:50:29 +03004653
4654 hci_req_cmd_complete(hdev, opcode, 0);
4655 }
4656
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004657 switch (event) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004658 case HCI_EV_INQUIRY_COMPLETE:
4659 hci_inquiry_complete_evt(hdev, skb);
4660 break;
4661
4662 case HCI_EV_INQUIRY_RESULT:
4663 hci_inquiry_result_evt(hdev, skb);
4664 break;
4665
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004666 case HCI_EV_CONN_COMPLETE:
4667 hci_conn_complete_evt(hdev, skb);
Marcel Holtmann21d9e302005-09-13 01:32:25 +02004668 break;
4669
Linus Torvalds1da177e2005-04-16 15:20:36 -07004670 case HCI_EV_CONN_REQUEST:
4671 hci_conn_request_evt(hdev, skb);
4672 break;
4673
Linus Torvalds1da177e2005-04-16 15:20:36 -07004674 case HCI_EV_DISCONN_COMPLETE:
4675 hci_disconn_complete_evt(hdev, skb);
4676 break;
4677
Linus Torvalds1da177e2005-04-16 15:20:36 -07004678 case HCI_EV_AUTH_COMPLETE:
4679 hci_auth_complete_evt(hdev, skb);
4680 break;
4681
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004682 case HCI_EV_REMOTE_NAME:
4683 hci_remote_name_evt(hdev, skb);
4684 break;
4685
Linus Torvalds1da177e2005-04-16 15:20:36 -07004686 case HCI_EV_ENCRYPT_CHANGE:
4687 hci_encrypt_change_evt(hdev, skb);
4688 break;
4689
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004690 case HCI_EV_CHANGE_LINK_KEY_COMPLETE:
4691 hci_change_link_key_complete_evt(hdev, skb);
4692 break;
4693
4694 case HCI_EV_REMOTE_FEATURES:
4695 hci_remote_features_evt(hdev, skb);
4696 break;
4697
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004698 case HCI_EV_CMD_COMPLETE:
4699 hci_cmd_complete_evt(hdev, skb);
4700 break;
4701
4702 case HCI_EV_CMD_STATUS:
4703 hci_cmd_status_evt(hdev, skb);
4704 break;
4705
4706 case HCI_EV_ROLE_CHANGE:
4707 hci_role_change_evt(hdev, skb);
4708 break;
4709
4710 case HCI_EV_NUM_COMP_PKTS:
4711 hci_num_comp_pkts_evt(hdev, skb);
4712 break;
4713
4714 case HCI_EV_MODE_CHANGE:
4715 hci_mode_change_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004716 break;
4717
4718 case HCI_EV_PIN_CODE_REQ:
4719 hci_pin_code_request_evt(hdev, skb);
4720 break;
4721
4722 case HCI_EV_LINK_KEY_REQ:
4723 hci_link_key_request_evt(hdev, skb);
4724 break;
4725
4726 case HCI_EV_LINK_KEY_NOTIFY:
4727 hci_link_key_notify_evt(hdev, skb);
4728 break;
4729
4730 case HCI_EV_CLOCK_OFFSET:
4731 hci_clock_offset_evt(hdev, skb);
4732 break;
4733
Marcel Holtmanna8746412008-07-14 20:13:46 +02004734 case HCI_EV_PKT_TYPE_CHANGE:
4735 hci_pkt_type_change_evt(hdev, skb);
4736 break;
4737
Marcel Holtmann85a1e932005-08-09 20:28:02 -07004738 case HCI_EV_PSCAN_REP_MODE:
4739 hci_pscan_rep_mode_evt(hdev, skb);
4740 break;
4741
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004742 case HCI_EV_INQUIRY_RESULT_WITH_RSSI:
4743 hci_inquiry_result_with_rssi_evt(hdev, skb);
4744 break;
4745
4746 case HCI_EV_REMOTE_EXT_FEATURES:
4747 hci_remote_ext_features_evt(hdev, skb);
4748 break;
4749
4750 case HCI_EV_SYNC_CONN_COMPLETE:
4751 hci_sync_conn_complete_evt(hdev, skb);
4752 break;
4753
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004754 case HCI_EV_EXTENDED_INQUIRY_RESULT:
4755 hci_extended_inquiry_result_evt(hdev, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004756 break;
4757
Johan Hedberg1c2e0042012-06-08 23:31:13 +08004758 case HCI_EV_KEY_REFRESH_COMPLETE:
4759 hci_key_refresh_complete_evt(hdev, skb);
4760 break;
4761
Marcel Holtmann04936842008-07-14 20:13:48 +02004762 case HCI_EV_IO_CAPA_REQUEST:
4763 hci_io_capa_request_evt(hdev, skb);
4764 break;
4765
Johan Hedberg03b555e2011-01-04 15:40:05 +02004766 case HCI_EV_IO_CAPA_REPLY:
4767 hci_io_capa_reply_evt(hdev, skb);
4768 break;
4769
Johan Hedberga5c29682011-02-19 12:05:57 -03004770 case HCI_EV_USER_CONFIRM_REQUEST:
4771 hci_user_confirm_request_evt(hdev, skb);
4772 break;
4773
Brian Gix1143d452011-11-23 08:28:34 -08004774 case HCI_EV_USER_PASSKEY_REQUEST:
4775 hci_user_passkey_request_evt(hdev, skb);
4776 break;
4777
Johan Hedberg92a25252012-09-06 18:39:26 +03004778 case HCI_EV_USER_PASSKEY_NOTIFY:
4779 hci_user_passkey_notify_evt(hdev, skb);
4780 break;
4781
4782 case HCI_EV_KEYPRESS_NOTIFY:
4783 hci_keypress_notify_evt(hdev, skb);
4784 break;
4785
Marcel Holtmann04936842008-07-14 20:13:48 +02004786 case HCI_EV_SIMPLE_PAIR_COMPLETE:
4787 hci_simple_pair_complete_evt(hdev, skb);
4788 break;
4789
Marcel Holtmann41a96212008-07-14 20:13:48 +02004790 case HCI_EV_REMOTE_HOST_FEATURES:
4791 hci_remote_host_features_evt(hdev, skb);
4792 break;
4793
Ville Tervofcd89c02011-02-10 22:38:47 -03004794 case HCI_EV_LE_META:
4795 hci_le_meta_evt(hdev, skb);
4796 break;
4797
Andrei Emeltchenko9495b2e2012-09-27 17:26:22 +03004798 case HCI_EV_CHANNEL_SELECTED:
4799 hci_chan_selected_evt(hdev, skb);
4800 break;
4801
Szymon Janc2763eda2011-03-22 13:12:22 +01004802 case HCI_EV_REMOTE_OOB_DATA_REQUEST:
4803 hci_remote_oob_data_request_evt(hdev, skb);
4804 break;
4805
Andrei Emeltchenkod5e91192012-10-25 15:20:44 +03004806 case HCI_EV_PHY_LINK_COMPLETE:
4807 hci_phy_link_complete_evt(hdev, skb);
4808 break;
4809
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004810 case HCI_EV_LOGICAL_LINK_COMPLETE:
4811 hci_loglink_complete_evt(hdev, skb);
4812 break;
4813
Andrei Emeltchenko606e2a12012-10-31 15:46:31 +02004814 case HCI_EV_DISCONN_LOGICAL_LINK_COMPLETE:
4815 hci_disconn_loglink_complete_evt(hdev, skb);
4816 break;
4817
Andrei Emeltchenko9eef6b32012-10-31 15:46:32 +02004818 case HCI_EV_DISCONN_PHY_LINK_COMPLETE:
4819 hci_disconn_phylink_complete_evt(hdev, skb);
4820 break;
4821
Andrei Emeltchenko25e89e92012-01-04 12:41:58 +02004822 case HCI_EV_NUM_COMP_BLOCKS:
4823 hci_num_comp_blocks_evt(hdev, skb);
4824 break;
4825
Marcel Holtmanna9de9242007-10-20 13:33:56 +02004826 default:
Andrei Emeltchenko9f1db002012-07-11 14:32:43 +03004827 BT_DBG("%s event 0x%2.2x", hdev->name, event);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004828 break;
4829 }
4830
4831 kfree_skb(skb);
4832 hdev->stat.evt_rx++;
4833}